diff --git a/conf/battle/client.conf b/conf/battle/client.conf index c810044814..6ff1133572 100644 --- a/conf/battle/client.conf +++ b/conf/battle/client.conf @@ -52,6 +52,12 @@ packet_ver_flag: 0x7FFFFFFF // 0x00000008: 2013-07-10 Ragexe (version 43) // 0x00000010: 2013-07-17 Ragexe (version 44) // 0x00000020: 2013-08-07 Ragexe (version 45) +// 0x00000040: 2013-12-23 Ragexe (version 46) +// 0x00000080: ???? +// 0x00000100: ???? +// 0x00000200: ???? +// 0x00000400: 2014-10-16 Ragexe (version 50) +// 0x00000800: 2014-10-22 Ragexe (version 51) // default value: 0x7FFFFFFF (all clients/versions [41;72]) packet_ver_flag2: 0x7FFFFFFF diff --git a/conf/battle/feature.conf b/conf/battle/feature.conf index 66908989b1..38f068ea60 100644 --- a/conf/battle/feature.conf +++ b/conf/battle/feature.conf @@ -57,3 +57,8 @@ feature.autotrade_sit: 1 // Delay in miliseconds to open vending/buyingsotre after player logged in. feature.autotrade_open_delay: 5000 + +// Roulette (Note 1) +// Requires: 2014-10-22bRagexe or later +// Off by default while test version is out; enable at your own risk. +feature.roulette: off diff --git a/conf/inter_athena.conf b/conf/inter_athena.conf index 44ed89d45e..2a8d642a17 100644 --- a/conf/inter_athena.conf +++ b/conf/inter_athena.conf @@ -145,6 +145,7 @@ mapreg_table: mapreg vending_db: vendings vending_items_db: vending_items market_table: market +db_roulette_table: db_roulette // Use SQL item_db, mob_db and mob_skill_db for the map server? (yes/no) use_sql_db: no diff --git a/conf/log_athena.conf b/conf/log_athena.conf index 6667c606af..c9476aa977 100644 --- a/conf/log_athena.conf +++ b/conf/log_athena.conf @@ -8,31 +8,32 @@ //-------------------------------------------------------------- // Enable Logs? (Note 3) -// 0x00000 - Don't log at all -// 0x00001 - (T) Log trades -// 0x00002 - (V) Log vending transactions -// 0x00004 - (P) Log items drop/picked by players -// 0x00008 - (L) Log items drop/looted by monsters -// 0x00010 - (S) Log NPC transactions (buy/sell) -// 0x00020 - (N) Log Script transactions (items deleted/acquired through quests) -// 0x00040 - (D) Log items stolen from mobs (Steal/Gank) -// 0x00080 - (C) Log player-used items (consumables/pet&hom&merc food/items used for skills&attacks) -// 0x00100 - (O) Log produced/ingredient items -// 0x00200 - (U) Log MVP prize items -// 0x00400 - (A) Log player created/deleted items (through @/# commands) -// 0x00800 - (R) Log items placed/retrieved from storage. -// 0x01000 - (G) Log items placed/retrieved from guild storage. -// 0x02000 - (E) Log mail system transactions. -// 0x04000 - (I) Log auction system transactions. -// 0x08000 - (B) Log buying store transactions -// 0x10000 - (X) Log all other transactions (rentals expiring/inserting cards/items removed by item_check/ +// 0x000000 - Don't log at all +// 0x000001 - (T) Log trades +// 0x000002 - (V) Log vending transactions +// 0x000004 - (P) Log items drop/picked by players +// 0x000008 - (L) Log items drop/looted by monsters +// 0x000010 - (S) Log NPC transactions (buy/sell) +// 0x000020 - (N) Log Script transactions (items deleted/acquired through quests) +// 0x000040 - (D) Log items stolen from mobs (Steal/Gank) +// 0x000080 - (C) Log player-used items (consumables/pet&hom&merc food/items used for skills&attacks) +// 0x000100 - (O) Log produced/ingredient items +// 0x000200 - (U) Log MVP prize items +// 0x000400 - (A) Log player created/deleted items (through @/# commands) +// 0x000800 - (R) Log items placed/retrieved from storage. +// 0x001000 - (G) Log items placed/retrieved from guild storage. +// 0x002000 - (E) Log mail system transactions. +// 0x004000 - (I) Log auction system transactions. +// 0x008000 - (B) Log buying store transactions +// 0x010000 - (X) Log all other transactions (rentals expiring/inserting cards/items removed by item_check/ // rings deleted by divorce/pet egg (un)hatching/pet armor (un)equipping/Weapon Refine skill/Remove Trap skill) -// 0x20000 - ($) Log cash transactions -// 0x40000 - (K) Log account bank transactions -// 0x80000 - (F) Removed bound items when guild/party is broken +// 0x020000 - ($) Log cash transactions +// 0x040000 - (K) Log account bank transactions +// 0x080000 - (F) Removed bound items when guild/party is broken +// 0x100000 - (Y) Roulette Lottery // Example: Log trades+vending+script items+created items: 1+2+32+1024 = 1059 // Please note that moving items from inventory to cart and back is not logged by design. -enable_logs: 0xFFFFF +enable_logs: 0xFFFFFF // Use MySQL Logs? [SQL Version Only] (Note 1) sql_logs: yes diff --git a/conf/msg_conf/map_msg.conf b/conf/msg_conf/map_msg.conf index 07501ee83d..48d2562fd0 100644 --- a/conf/msg_conf/map_msg.conf +++ b/conf/msg_conf/map_msg.conf @@ -1593,5 +1593,8 @@ 1495: You can't withdraw that much money 1496: Banking is disabled +// Roulette +1497: Roulette is disabled + //Custom translations //import: conf/msg_conf/import/map_msg_eng_conf.txt diff --git a/db/const.txt b/db/const.txt index 05e9901ff8..c094861213 100644 --- a/db/const.txt +++ b/db/const.txt @@ -432,6 +432,9 @@ CharMoves 124 1 CharRename 125 1 Font 126 1 BankVault 127 1 +RouletteBronze 128 1 +RouletteSilver 129 1 +RouletteGold 130 1 bMaxHP 6 bMaxSP 8 @@ -595,8 +598,8 @@ bMagicSPGainValue 2043 bMagicHPGainValue 2044 bAddMonsterIdDropItem 2045 bMatk 2046 -bSPGainRaceAttack 2047 -bHPGainRaceAttack 2048 +bComaClass 2047 +bComaRace 2048 bSkillUseSPrate 2049 bSkillCooldown 2050 @@ -628,16 +631,9 @@ bAddMaxWeight 2072 bAddItemGroupHealRate 2073 bHPVanishRaceRate 2074 bSPVanishRaceRate 2075 -bHPGainRaceAttackRate 2076 -bSPGainRaceAttackRate 2077 -bAbsorbDmgMaxHP 2078 - -bHPGainAttack 2079 -bSPGainAttack 2080 -bHPGainAttackRate 2081 -bSPGainAttackRate 2082 -bSubSkill 2083 -bSubDefEle 2084 +bAbsorbDmgMaxHP 2076 +bSubSkill 2077 +bSubDefEle 2078 EQI_HEAD_TOP 1 EQI_ARMOR 2 @@ -1174,6 +1170,7 @@ IG_Lucky_Silvervine_Fruit_Box_III110 421 IG_Old_Ore_Box 422 SC_ALL -1 +SC_NONE -1 SC_STONE 0 SC_FREEZE 1 SC_STUN 2 diff --git a/db/packet_db.txt b/db/packet_db.txt index 2d48a91b13..896a4bd7e5 100644 --- a/db/packet_db.txt +++ b/db/packet_db.txt @@ -2318,5 +2318,109 @@ packet_keys: 0x631C511C,0x111C111C,0x111C111C // [Shakto] 0x09D8,2,npcmarketclosed,0 0x09DF,7 +//2014-10-16Ragexe +packet_ver: 50 +packet_keys: 0x2DFF467C,0x444B37EE,0x2C1B634F // [YomRawr] +0x0369,7,actionrequest,2:6 +0x083C,10,useskilltoid,2:4:6 +0x0437,5,walktoxy,2 +0x035F,6,ticksend,2 +0x0967,5,changedir,2:4 +0x07E4,6,takeitem,2 +0x0362,6,dropitem,2:4 +0x07EC,8,movetokafra,2:4 +0x022D,8,movefromkafra,2:4 +0x0438,10,useskilltopos,2:4:6:8 +0x0366,90,useskilltoposinfo,2:4:6:8:10 +0x096A,6,getcharnamerequest,2 +0x0368,6,solvecharname,2 +0x0838,12,searchstoreinfolistitemclick,2:6:10 +0x0835,2,searchstoreinfonextpage,0 +0x0819,-1,searchstoreinfo,2:4:5:9:13:14:15 +0x0811,-1,reqtradebuyingstore,2:4:8:12 +0x0360,6,reqclickbuyingstore,2 +0x0817,2,reqclosebuyingstore,0 +0x0815,-1,reqopenbuyingstore,2:4:8:9:89 +0x0365,18,bookingregreq,2:4 +// 0x0363,8 // CZ_JOIN_BATTLE_FIELD +0x0281,-1,itemlistwindowselected,2:4:8 +0x086E,19,wanttoconnection,2:6:10:14:18 +0x0802,26,partyinvite,2 +// 0x0922,4 // CZ_GANGSI_RANK +0x094B,26,friendslistadd,2 +0x0364,5,hommenu,2:4 +0x0936,36,storagepassword,0 +0x09DF,7 +0x0a00,269 +// Roulette System [Yommy] +0x0A19,2,rouletteopen,0 // HEADER_CZ_REQ_OPEN_ROULETTE +0x0A1A,23 // HEADER_ZC_ACK_OPEN_ROULETTE +0x0A1B,2,rouletteinfo,0 // HEADER_CZ_REQ_ROULETTE_INFO +0x0A1C,-1 // HEADER_ZC_ACK_ROULETTE_INFO +0x0A1D,2,rouletteclose,0 // HEADER_CZ_REQ_CLOSE_ROULETTE +0x0A1E,3 // HEADER_ZC_ACK_CLOSE_ROULETTE +0x0A1F,2,roulettegenerate,0 // HEADER_CZ_REQ_GENERATE_ROULETTE +0x0A20,21 // HEADER_ZC_ACK_GENERATE_ROULETTE +0x0A21,3,rouletterecvitem,2 // HEADER_CZ_RECV_ROULETTE_ITEM +0x0A22,5 // HEADER_ZC_RECV_ROULETTE_ITEM + +//2014-10-22bRagexe +packet_ver: 51 +packet_keys: 0x290551EA,0x2B952C75,0x2D67669B // [YomRawr] +0x006d,149 +0x023b,10,useskilltopos,2:4:6:8 +0x0281,-1,itemlistwindowselected,2:4:8:12 +0x035f,6,ticksend,2 +0x0360,6,reqclickbuyingstore,2 +0x0366,90,useskilltoposinfo,2:4:6:8:10 +0x0368,6,solvecharname,2 +0x0369,7,actionrequest,2:6 +0x0437,5,walktoxy,2 +0x0438,36,storagepassword,2:4:20 +0x0811,-1,reqtradebuyingstore,2:4:8:12 +0x0815,-1,reqopenbuyingstore,2:4:8:9:89 +0x0817,2,reqclosebuyingstore,0 +0x0819,-1,searchstoreinfo,2:4:5:9:13:14:15 +0x0835,12,searchstoreinfolistitemclick,2:6:10 +0x083c,10,useskilltoid,2:4:6 +0x0878,8,movetokafra,2:4 +0x087d,6,dropitem,2:4 +0x0896,26,partyinvite2,2 +0x0899,5,hommenu,2:4 +0x08aa,8,movefromkafra,2:4 +//0x08ab,4 // CZ_GANGSI_RANK +0x08ad,5,changedir,2:4 +0x08e3,149 +0x091a,26,friendslistadd,2 +//0x092b,8 // CZ_JOIN_BATTLE_FIELD +0x093b,19,wanttoconnection,2:6:10:14:18 +0x0940,2,searchstoreinfonextpage,0 +0x094e,6,takeitem,2 +0x0955,18,bookingregreq,2:4:6 +0x096a,6,getcharnamerequest,2 +0x09e7,3 +0x09e8,11 +0x09ea,11 +0x09eb,-1 +0x09ed,3 +0x09ee,11 +0x09f1,11 +0x09f2,12 +0x09f3,11 +0x09f9,143 +0x0a03,2 +0x0a04,6 +0x0a05,49 +0x0a06,6 +0x0a07,9 +0x0a08,26 +0x0a09,45 +0x0a0a,47 +0x0a0b,47 +0x0a0c,56 +0x0a0d,-1 +0x0a13,26 +0x0a24,66 + //Add new packets here -//packet_ver: 47 +//packet_ver: 52 diff --git a/db/pre-re/item_combo_db.txt b/db/pre-re/item_combo_db.txt index ff176a5fd9..7f8e623ce4 100644 --- a/db/pre-re/item_combo_db.txt +++ b/db/pre-re/item_combo_db.txt @@ -136,12 +136,12 @@ 4127:4166,{ bonus2 bAddEffWhenHit,Eff_Curse,600; } 4153:4247:4273,{ bonus3 bAddMonsterDropItem,544,RC_Fish,3000; bonus2 bAddEle,Ele_Water,30; } 4168:4169,{ bonus bMaxHPrate,20; bonus bMaxSPrate,20; bonus bCastrate,-10; } -4172:4210:4230:4257:4272,{ bonus bAgi,5; bonus bStr,5; bonus bAspdRate,5; bonus bSpeedRate,25; bonus bSPGainAttack,1; if(BaseClass==Job_Thief) bonus bNoGemStone,0; } -4178:4199:4234:4252:4297,{ bonus bAgi,5; bonus bDex,3; bonus bLongAtkRate,20; bonus bPerfectHitAddRate,20; if(BaseClass==Job_Archer) { bonus2 bExpAddRace,RC_Brute,5; bonus2 bWeaponComaRace,RC_Brute,100; } } +4172:4210:4230:4257:4272,{ bonus bAgi,5; bonus bStr,5; bonus bAspdRate,5; bonus bSpeedRate,25; bonus bSPDrainValue,1; if(BaseClass==Job_Thief) bonus bNoGemStone,0; } +4178:4199:4234:4252:4297,{ bonus bAgi,5; bonus bDex,3; bonus bLongAtkRate,20; bonus bPerfectHitAddRate,20; if(BaseClass==Job_Archer) { bonus2 bExpAddRace,RC_Brute,5; bonus2 bComaRace,RC_Brute,100; } } 4178:4234:4252:4297:4381,{ bonus bDex,5; bonus2 bSkillAtk,"CG_ARROWVULCAN",5; bonus2 bSkillAtk,"DC_THROWARROW",10; bonus2 bSkillAtk,"BA_MUSICALSTRIKE",10; if(BaseJob==Job_Bard||BaseJob==Job_Dancer) bonus3 bAutoSpellWhenHit,"CG_TAROTCARD",2,50; } 4185:4217:4280:4293:4312,{ bonus bVit,10; bonus bCastrate,-10; bonus bUseSPRate,-10; if(BaseClass==Job_Acolyte) { bonus2 bExpAddRace,RC_Undead,5; bonus2 bExpAddRace,RC_Demon,5; bonus2 bSubRace,RC_Undead,30; bonus2 bSubRace,RC_Demon,30; } } 4185:4293:4312:4332,{ bonus bStr,3; bonus bMaxSP,80; bonus bBaseAtk,25; bonus3 bAutoSpell,"AL_CRUCIS",5,10; bonus2 bSkillAtk,"MO_EXTREMITYFIST",10; if(BaseJob==Job_Monk) { bonus bUseSPrate,-10; bonus bNoCastCancel,0; } } -4186:4206:4233:4281:4321,{ bonus bLuk,10; bonus bSPGainAttack,2; bonus2 bSkillAtk,42,20; if(BaseClass==Job_Merchant) { bonus2 bAddMonsterDropItem,617,5; bonus bMagicDamageReturn,20; } } +4186:4206:4233:4281:4321,{ bonus bLuk,10; bonus bSPDrainValue,2; bonus2 bSkillAtk,42,20; if(BaseClass==Job_Merchant) { bonus2 bAddMonsterDropItem,617,5; bonus bMagicDamageReturn,20; } } 4191:4208:4258:4309:4325:4327,{ bonus bMaxHP,500; bonus bDef,5; bonus bMdef,5; bonus2 bSkillAtk,14,10; bonus2 bSkillAtk,19,10; bonus2 bSkillAtk,20,10; if(BaseClass==Job_Mage) { bonus bMatkRate,3; bonus bCastrate,-15; } } 4193:4294,{ bonus bMaxHP,300; bonus bMaxSP,60; } 4208:4258:4325:4327:4382,{ bonus bInt,3; bonus2 bSkillAtk,"WZ_HEAVENDRIVE",10; bonus2 bSkillAtk,"MG_THUNDERSTORM",10; if(BaseJob==Job_Sage) { bonus bMagicDamageReturn,20; bonus2 bAddMonsterDropItem,716,100; bonus2 bAddMonsterDropItem,715,100; bonus bCastrate,-20; } } diff --git a/db/pre-re/item_db.txt b/db/pre-re/item_db.txt index b5cfae642d..ffc2c7831b 100644 --- a/db/pre-re/item_db.txt +++ b/db/pre-re/item_db.txt @@ -482,7 +482,7 @@ 1129,Flamberge,Flamberge,5,60000,,1500,150,,1,0,0x00004080,7,2,2,3,27,1,2,{},{},{} 1130,Nagan,Nagan,5,20,,500,120,,1,0,0x000654E2,7,2,2,4,40,1,2,{ skill "TF_DOUBLE",5; bonus bDoubleRate,25; bonus2 bAddRace,RC_DemiHuman,5; bonus2 bAddRace,RC_Player,5; },{},{} 1131,Ice_Falchon,Ice Falchion,5,20,,600,100,,1,0,0x000654E2,7,2,2,4,40,1,2,{ bonus bAtkEle,Ele_Water; bonus2 bAddEff,Eff_Freeze,500; bonus2 bAddEff2,Eff_Freeze,10; skill "MG_COLDBOLT",3; bonus3 bAutoSpell,"MG_COLDBOLT",3,100; },{},{} -1132,Edge,Edge,5,20,,700,115,,1,0,0x000654E2,7,2,2,4,40,1,2,{ bonus2 bAddEff,Eff_Curse,30; bonus2 bWeaponComaClass,Class_Normal,10; },{},{} +1132,Edge,Edge,5,20,,700,115,,1,0,0x000654E2,7,2,2,4,40,1,2,{ bonus2 bAddEff,Eff_Curse,30; bonus2 bComaClass,Class_Normal,10; },{},{} 1133,Fire_Brand,Fireblend,5,20,,500,100,,1,0,0x000654E2,7,2,2,4,40,1,2,{ bonus bAtkEle,Ele_Fire; skill "MG_FIREBOLT",3; bonus3 bAutoSpell,"MG_FIREBOLT",3,100; },{},{} 1134,Scissores_Sword,Caesar's Sword,5,20,,700,140,,1,0,0x000654E2,7,2,2,4,40,1,2,{ bonus2 bAddRace,RC_Plant,25; bonus bIgnoreDefRace,RC_Plant; },{},{} 1135,Cutlas,Cutlus,5,20,,900,150,,1,0,0x000654E2,7,2,2,4,40,1,2,{ skill "SM_BASH",5; bonus bStr,2; bonus bDef,1; },{},{} @@ -660,11 +660,11 @@ 1362,Two_Handed_Axe__,Two-Handed Axe,5,55000,,2500,185,,1,0,0x000444A2,7,2,34,3,30,1,7,{},{},{} 1363,Brood_Axe,Bloody Axe,5,20,,4000,170,,1,0,0x000444A2,7,2,34,4,44,1,7,{ bonus bStr,10; bonus bSpeedRate,25; },{},{} 1364,Great_Axe,Great Axe,5,20,,1800,187,,1,0,0x000444A2,7,2,34,4,44,1,7,{ bonus2 bAddSkillBlow,"MC_MAMMONITE",5; bonus2 bAddEff,Eff_Stun,1500; },{},{} -1365,Sabbath,Sabbath,5,20,,2300,120,,1,0,0x000444A2,7,2,34,4,44,1,7,{ bonus bAtkEle,Ele_Dark; bonus2 bWeaponComaRace,RC_Demon,50; bonus2 bCriticalAddRace,RC_Undead,50; },{},{} +1365,Sabbath,Sabbath,5,20,,2300,120,,1,0,0x000444A2,7,2,34,4,44,1,7,{ bonus bAtkEle,Ele_Dark; bonus2 bComaRace,RC_Demon,50; bonus2 bCriticalAddRace,RC_Undead,50; },{},{} 1366,Right_Epsilon,Light Epsilon,5,20,,2300,180,,1,0,0x000444A2,7,2,34,4,44,1,7,{ bonus bAtkEle,Ele_Holy; skill "AL_HEAL",3; bonus2 bAddRace,RC_Demon,3; },{},{} -1367,Slaughter,Slaughter,5,20,,2500,120,,1,0,0x000444A2,7,2,34,4,44,1,7,{ bonus bAtkEle,Ele_Earth; bonus bIgnoreDefRace,RC_Brute; bonus2 bWeaponComaRace,RC_Brute,40; },{},{} +1367,Slaughter,Slaughter,5,20,,2500,120,,1,0,0x000444A2,7,2,34,4,44,1,7,{ bonus bAtkEle,Ele_Earth; bonus bIgnoreDefRace,RC_Brute; bonus2 bComaRace,RC_Brute,40; },{},{} 1368,Tomahawk,Tomahawk,5,20,,2500,165,,1,0,0x000444A2,7,2,34,4,44,1,7,{ bonus bAtkEle,Ele_Wind; skill "ITM_TOMAHAWK",1; },{},{} -1369,Guillotine,Guillotine,5,20,,3000,215,,1,0,0x000444A2,7,2,34,4,44,1,7,{ bonus2 bWeaponComaRace,RC_DemiHuman,30; bonus2 bWeaponComaRace,RC_Player,30; bonus2 bSPGainRaceAttack,RC_DemiHuman,2; bonus2 bSPGainRaceAttack,RC_Player,2; bonus2 bSPGainRace,RC_DemiHuman,20; bonus2 bSPGainRace,RC_Player,20; },{},{} +1369,Guillotine,Guillotine,5,20,,3000,215,,1,0,0x000444A2,7,2,34,4,44,1,7,{ bonus2 bComaRace,RC_DemiHuman,30; bonus2 bComaRace,RC_Player,30; bonus2 bSPDrainValueRace,RC_DemiHuman,2; bonus2 bSPDrainValueRace,RC_Player,2; bonus2 bSPGainRace,RC_DemiHuman,20; bonus2 bSPGainRace,RC_Player,20; },{},{} 1370,Doom_Slayer,Doom Slayer,5,20,,6000,10,,1,0,0x000444A2,7,2,34,4,80,1,7,{ bonus bAspdRate,-40; bonus bUseSPrate,100; if(readparam(bStr)>=95){ bonus bBaseAtk,340; bonus2 bAddEff,Eff_Stun,3000; bonus bBreakArmorRate,500; } },{},{} 1371,Doom_Slayer_,Doom Slayer,5,20,,6000,10,,1,1,0x000444A2,7,2,34,4,80,1,7,{ bonus bAspdRate,-40; bonus bUseSPrate,100; if(readparam(bStr)>=95){ bonus bBaseAtk,340; bonus2 bAddEff,Eff_Stun,3000; bonus bBreakArmorRate,500; } },{},{} 1372,Right_Epsilon_C,Light Epsilon,5,1,,0,229,,1,0,0x000444A2,7,2,34,4,1,0,7,{ bonus bAtkEle,Ele_Holy; skill "AL_HEAL",3; bonus2 bAddRace,RC_Demon,3; bonus bStr,10; bonus bSpeedRate,25; },{},{} @@ -786,7 +786,7 @@ 1523,Spike,Spike,5,20,,700,85,,1,0,0x00008110,7,2,2,4,40,1,8,{ bonus bCritical,40; bonus bDefRate,-67; bonus bDef2Rate,-67; },{},{} 1524,Golden_Mace,Golden Mace,5,20,,800,110,,1,1,0x00008110,7,2,2,4,40,1,8,{ bonus2 bAddRace,RC_Undead,10; bonus bUnbreakableWeapon,0; },{},{} 1525,Long_Mace,Long Mace,5,20,,800,135,,3,0,0x00008110,7,2,2,4,40,1,8,{ bonus bLongAtkDef,10; },{},{} -1526,Slash,Slash,5,20,,1000,145,,1,0,0x00008110,7,2,2,4,40,1,8,{ bonus2 bAddRace,RC_Undead,15; bonus2 bWeaponComaRace,RC_Undead,10; bonus2 bExpAddRace,RC_Undead,5; },{},{} +1526,Slash,Slash,5,20,,1000,145,,1,0,0x00008110,7,2,2,4,40,1,8,{ bonus2 bAddRace,RC_Undead,15; bonus2 bComaRace,RC_Undead,10; bonus2 bExpAddRace,RC_Undead,5; },{},{} 1527,Quadrille,Quadrille,5,20,,900,165,,1,0,0x00008110,7,2,2,4,40,1,8,{ bonus2 bAddRace,RC_Undead,10; bonus2 bAddRace,RC_DemiHuman,10; bonus2 bAddRace,RC_Player,10; bonus2 bAddEle,Ele_Earth,10; },{},{} 1528,Grand_Cross,Grand Cross,5,20,,1500,140,,1,0,0x00008110,7,2,2,4,40,1,8,{ bonus bAtkEle,Ele_Holy; skill "PR_TURNUNDEAD",3; bonus3 bAutoSpell,"PR_TURNUNDEAD",3,100; bonus2 bSPDrainValueRace,RC_Undead,1; bonus2 bSPGainRace,RC_Undead,3; },{},{} 1529,Iron_Driver,Iron Driver,5,20,,3000,155,,2,0,0x00008100,7,2,2,3,78,1,8,{},{},{} @@ -825,7 +825,7 @@ 1562,Bible_Of_Battlefield,Battlefield Textbook,5,20,,700,110,,1,1,0x00410100,7,2,2,4,80,0,15,{ bonus bInt,3; bonus3 bAutoSpell,"AL_BLESSING",3+(getskilllv("AL_BLESSING")>3)*(getskilllv("AL_BLESSING")-3),20; },{},{} 1563,Diary_Of_Great_Sage_C,Sage's Diary,5,1,,0,135,,1,2,0x00410100,7,2,2,3,1,0,15,{ bonus bMatkRate,20; bonus bAspdRate,5; },{},{} 1564,Encyclopedia,Encyclopedia,5,20,,2000,110,,1,2,0x00410100,7,2,2,3,70,1,15,{ bonus bMatkRate,15; bonus bInt,3; bonus bDex,2; bonus bCritical,20+((readparam(bLuk)*2)/10); },{},{} -1565,Death_Note,Ledger of Death,5,20,,1000,137,,1,2,0x00410100,7,2,2,4,85,1,15,{ bonus bMatkRate,15; bonus bStr,3; bonus bInt,3; bonus bLuk,-20; bonus2 bWeaponComaRace,RC_DemiHuman,10; bonus2 bWeaponComaRace,RC_Player,10; bonus bAspdRate,getrefine(); if(BaseJob==Job_Sage) bonus3 bAutoSpell,"NPC_HELLJUDGEMENT",5,20; },{},{} +1565,Death_Note,Ledger of Death,5,20,,1000,137,,1,2,0x00410100,7,2,2,4,85,1,15,{ bonus bMatkRate,15; bonus bStr,3; bonus bInt,3; bonus bLuk,-20; bonus2 bComaRace,RC_DemiHuman,10; bonus2 bComaRace,RC_Player,10; bonus bAspdRate,getrefine(); if(BaseJob==Job_Sage) bonus3 bAutoSpell,"NPC_HELLJUDGEMENT",5,20; },{},{} 1566,Diary_Of_Great_Basil,Diary Of Great Basil,5,20,,0,120,,1,0,0x00410100,7,2,2,1,0,0,15,{ bonus2 bAddClass,Class_All,50; },{},{} 1567,Hardback_C,Refined Hardcover Book,5,1,,0,168,,1,0,0x00410100,7,2,2,4,0,0,15,{ bonus bStr,5; bonus bDex,2; bonus bMatkRate,20; },{},{} 1568,Book_Of_Billows_,Book of Billows,5,35000,,750,90,,1,3,0x00410100,7,2,2,3,27,1,15,{ bonus bAtkEle,Ele_Water; },{},{} @@ -839,7 +839,7 @@ 1576,Krieger_Book1,Glorious Tablet,5,20,,0,90,,1,0,0x00410100,7,2,2,4,80,1,15,{ bonus bMatkRate,15; bonus2 bAddRace,RC_DemiHuman,80; bonus2 bAddRace,RC_Player,80; bonus2 bIgnoreDefRaceRate,RC_DemiHuman,25; bonus2 bIgnoreDefRaceRate,RC_Player,25; bonus bUnbreakableWeapon,0; if(getrefine()>5) { bonus2 bAddRace,RC_DemiHuman,(getrefine()-4)*(getrefine()-4); bonus2 bAddRace,RC_Player,(getrefine()-4)*(getrefine()-4); bonus2 bIgnoreDefRaceRate,RC_DemiHuman,5; bonus2 bIgnoreDefRaceRate,RC_Player,5; } if(getrefine()>8) autobonus "{ bonus bBaseAtk,200; }",30,3000,BF_WEAPON,"{ specialeffect2 EF_BASH3D; }"; },{},{} 1577,Krieger_Book2,Glorious Apocalypse,5,20,,0,90,,1,0,0x00410100,7,2,2,4,80,1,15,{ bonus bMatkRate,15; bonus2 bAddRace,RC_DemiHuman,80; bonus2 bAddRace,RC_Player,80; bonus2 bIgnoreDefRaceRate,RC_DemiHuman,25; bonus2 bIgnoreDefRaceRate,RC_Player,25; bonus bUnbreakableWeapon,0; if(getrefine()>5) bonus2 bIgnoreDefRaceRate,RC_DemiHuman,5; bonus2 bIgnoreDefRaceRate,RC_Player,5; if(getrefine()>8) { bonus bMatkRate,5; bonus bCastrate,-5; bonus bDelayRate,-5; } },{},{} 1578,Book_Of_Prayer,Book Of Prayer,5,20,,0,140,,1,0,0x00410100,7,2,2,3,0,0,15,{ bonus bVit,2; bonus bMdef,2; bonus bMaxSPrate,10; },{},{} -1579,Death_Note_M,Book of the Dead,5,20,,1000,137,,1,2,0x00410100,7,2,2,4,85,1,15,{ bonus bMatkRate,15; bonus bStr,3; bonus bInt,3; bonus bLuk,-20; bonus2 bWeaponComaRace,RC_DemiHuman,10; bonus2 bWeaponComaRace,RC_Player,10; bonus bAspdRate,getrefine(); if(BaseJob==Job_Sage) bonus3 bAutoSpell,"NPC_HELLJUDGEMENT",5,20; },{},{} +1579,Death_Note_M,Book of the Dead,5,20,,1000,137,,1,2,0x00410100,7,2,2,4,85,1,15,{ bonus bMatkRate,15; bonus bStr,3; bonus bInt,3; bonus bLuk,-20; bonus2 bComaRace,RC_DemiHuman,10; bonus2 bComaRace,RC_Player,10; bonus bAspdRate,getrefine(); if(BaseJob==Job_Sage) bonus3 bAutoSpell,"NPC_HELLJUDGEMENT",5,20; },{},{} 1580,Encyclopedia_C,Giant Encyclopedia,5,0,,0,145,,1,0,0x00410100,7,2,2,3,0,0,15,{ bonus bMatkRate,15; bonus bInt,3; bonus bDex,2; bonus bCritical,20+((readparam(bLuk)*2)/10); bonus2 bAddSize,Size_All,40; },{},{} 1581,F_Diary_Of_Great_Sage_C,Diary Of Great Sage,5,1,,0,135,,1,2,0x00410100,7,2,2,3,1,0,15,{},{},{} 1582,E_Diary_Of_Great_Sage_C,Diary Of Great Sage,5,1,,0,135,,1,2,0x00410100,7,2,2,3,1,0,15,{},{},{} @@ -1417,7 +1417,7 @@ 2551,Rider_Insignia_M,Crest of the Rider,4,20,,500,,4,,1,0xFFFFFFFE,2,2,4,,55,1,0,{ bonus bAgi,2; },{},{} 2552,Mithril_Magic_Cape_M,Mithril Magic Manteau,4,20,,400,,3,,1,0x00098B1C,2,2,4,,70,1,0,{ bonus bMdef,3; bonus5 bAutoSpellWhenHit,"NPC_ANTIMAGIC",6,200,BF_MAGIC,0; },{},{} 2553,Dragon_Manteau,Dragon Manteau,4,20,,1000,,5,,1,0xFFFFFFFE,2,2,4,,0,1,0,{ bonus bAgi,1; bonus bMdef,5; },{},{} -2554,Piece_Of_Angent_Skin,Nydhorgg's Shadow Garb,4,20,,400,,5,,1,0xFFFFFFFE,2,2,4,,90,1,0,{ bonus2 bSubEle,Ele_Neutral,7; bonus2 bSubEle,Ele_Water,7; bonus2 bSubEle,Ele_Earth,7; bonus2 bSubEle,Ele_Fire,7; bonus2 bSubEle,Ele_Wind,7; bonus2 bSubEle,Ele_Poison,7; bonus2 bSubEle,Ele_Holy,7; bonus2 bSubEle,Ele_Dark,7; bonus2 bSubEle,Ele_Ghost,7; bonus2 bSubEle,Ele_Undead,7; bonus bMaxSP,(BaseLevel/3)+(getrefine()*10); bonus2 bSPGainAttackRate,100,1; bonus bMdef,3; },{},{} +2554,Piece_Of_Angent_Skin,Nydhorgg's Shadow Garb,4,20,,400,,5,,1,0xFFFFFFFE,2,2,4,,90,1,0,{ bonus2 bSubEle,Ele_Neutral,7; bonus2 bSubEle,Ele_Water,7; bonus2 bSubEle,Ele_Earth,7; bonus2 bSubEle,Ele_Fire,7; bonus2 bSubEle,Ele_Wind,7; bonus2 bSubEle,Ele_Poison,7; bonus2 bSubEle,Ele_Holy,7; bonus2 bSubEle,Ele_Dark,7; bonus2 bSubEle,Ele_Ghost,7; bonus2 bSubEle,Ele_Undead,7; bonus bMaxSP,(BaseLevel/3)+(getrefine()*10); bonus2 bSPDrainRate,10,1; bonus bMdef,3; },{},{} // Accessories //=================================================================== 2601,Ring,Ring,4,30000,,100,,0,,0,0xFFFFFFFE,7,2,136,,20,0,0,{ bonus bStr,2; },{},{} @@ -1797,7 +1797,7 @@ 4169,Dark_Illusion_Card,Dark Illusion Card,6,20,,10,,,,,,,,769,,,,,{ bonus bMaxHPrate,-10; bonus bMaxSPrate,-10; bonus bCastrate,-10; },{},{} 4170,Dark_Frame_Card,Dark Frame Card,6,20,,10,,,,,,,,16,,,,,{ bonus2 bAddEffWhenHit,Eff_Stone,600; },{},{} 4171,Dark_Priest_Card,Dark Priest Card,6,20,,10,,,,,,,,2,,,,,{ bonus2 bSPVanishRate,50,10; if(BaseJob==Job_Sage) bonus bSPDrainValue,1; },{},{} -4172,The_Paper_Card,The Paper Card,6,20,,10,,,,,,,,2,,,,,{ bonus bCritAtkRate,20; bonus bSPGainAttack,-1; },{},{} +4172,The_Paper_Card,The Paper Card,6,20,,10,,,,,,,,2,,,,,{ bonus bCritAtkRate,20; bonus bSPDrainValue,-1; },{},{} 4173,Demon_Pungus_Card,Demon Pungus Card,6,20,,10,,,,,,,,16,,,,,{ bonus2 bAddEffWhenHit,Eff_Sleep,600; },{},{} 4174,Deviling_Card,Deviling Card,6,20,,10,,,,,,,,4,,,,,{ bonus2 bSubEle,Ele_Neutral,50; bonus2 bSubEle,Ele_Water,-50; bonus2 bSubEle,Ele_Earth,-50; bonus2 bSubEle,Ele_Fire,-50; bonus2 bSubEle,Ele_Wind,-50; bonus2 bSubEle,Ele_Poison,-50; bonus2 bSubEle,Ele_Holy,-50; bonus2 bSubEle,Ele_Dark,-50; bonus2 bSubEle,Ele_Ghost,-50; bonus2 bSubEle,Ele_Undead,-50; },{},{} 4175,Poison_Toad_Card,Poisonous Toad Card,6,20,,10,,,,,,,,136,,,,,{ bonus3 bAutoSpell,"TF_POISON",1,20; bonus2 bAddSkillBlow,52,5; },{},{} @@ -1901,12 +1901,12 @@ 4273,Shellfish_Card,Shell Fish Card,6,20,,10,,,,,,,,2,,,,,{ bonus bBaseAtk,5; bonus2 bAddDamageClass,1073,30; },{},{} 4274,Zombie_Master_Card,Zombie Master Card,6,20,,10,,,,,,,,2,,,,,{ bonus2 bSPGainRace,RC_Undead,5; },{},{ heal 0,-5; } 4275,Zombie_Prisoner_Card,Zombie Prisoner Card,6,20,,10,,,,,,,,64,,,,,{ bonus2 bSubRace,RC_Undead,-20; bonus2 bExpAddRace,RC_Undead,10; },{},{} -4276,Lord_Of_Death_Card,Lord of The Dead Card,6,20,,10,,,,,,,,2,,,,,{ bonus3 bAddEff,Eff_Stun,500,ATF_SHORT; bonus3 bAddEff,Eff_Curse,500,ATF_SHORT; bonus3 bAddEff,Eff_Silence,500,ATF_SHORT; bonus3 bAddEff,Eff_Poison,500,ATF_SHORT; bonus3 bAddEff,Eff_Bleeding,500,ATF_SHORT; bonus2 bWeaponComaClass,Class_Normal,1; },{},{} +4276,Lord_Of_Death_Card,Lord of The Dead Card,6,20,,10,,,,,,,,2,,,,,{ bonus3 bAddEff,Eff_Stun,500,ATF_SHORT; bonus3 bAddEff,Eff_Curse,500,ATF_SHORT; bonus3 bAddEff,Eff_Silence,500,ATF_SHORT; bonus3 bAddEff,Eff_Poison,500,ATF_SHORT; bonus3 bAddEff,Eff_Bleeding,500,ATF_SHORT; bonus2 bComaClass,Class_Normal,1; },{},{} 4277,Zherlthsh_Card,Zealotus Card,6,20,,10,,,,,,,,32,,,,,{ bonus bLuk,2; bonus2 bSkillAtk,"BA_MUSICALSTRIKE",10; bonus2 bSkillAtk,"DC_THROWARROW",10; },{},{} 4278,Gibbet_Card,Gibbet Card,6,20,,10,,,,,,,,769,,,,,{ if(getrefine()<6) bonus bMdef,5; },{},{} 4279,Deleter_Card,Earth Deleter Card,6,20,,10,,,,,,,,16,,,,,{ bonus bSPrecovRate,-100; bonus bSPGainValue,10; },{},{ heal 0,-100; } 4280,Geographer_Card,Geographer Card,6,20,,10,,,,,,,,16,,,,,{ bonus3 bAutoSpellWhenHit,"AL_BLESSING",2+8*(getskilllv("AL_BLESSING")==10),30; },{},{} -4281,Zipper_Bear_Card,Zipper Bear Card,6,20,,10,,,,,,,,2,,,,,{ bonus bBaseAtk,30; bonus bSPGainAttack,-1; if(BaseClass==Job_Merchant) bonus bUnbreakableWeapon,0; },{},{} +4281,Zipper_Bear_Card,Zipper Bear Card,6,20,,10,,,,,,,,2,,,,,{ bonus bBaseAtk,30; bonus bSPDrainValue,-1; if(BaseClass==Job_Merchant) bonus bUnbreakableWeapon,0; },{},{} 4282,Tengu_Card,Tengu Card,6,20,,10,,,,,,,,136,,,,,{ bonus2 bAddMonsterDropItemGroup,IG_Recovery,600; },{},{} 4283,Greatest_General_Card,Greatest General Card,6,20,,10,,,,,,,,136,,,,,{ bonus3 bAutoSpell,"MO_CALLSPIRITS",5,2+18*(BaseClass==Job_Acolyte); },{},{} 4284,Chepet_Card,Chepet Card,6,20,,10,,,,,,,,2,,,,,{ bonus4 bAutoSpell,"AL_HEAL",5,50,1; },{},{} @@ -5472,7 +5472,7 @@ 13400,Cutlas_,Cutlus,5,20,,900,150,,1,1,0x000654E2,7,2,2,4,40,1,2,{ skill "SM_BASH",5; bonus bStr,2; bonus bDef,1; },{},{} 13401,Excalibur_C,Excalibur,5,1,,0,199,,1,0,0x000654E2,7,2,2,4,1,0,2,{ bonus bInt,10; bonus bLuk,10; bonus bAtkEle,Ele_Holy; },{},{} 13402,Cutlas_C,Cutlus,5,2,,0,185,,1,0,0x000654E2,7,2,2,4,0,0,2,{ skill "SM_BASH",5; bonus bStr,2; bonus bDef,1; },{},{} -13403,Solar_Sword_C,Solar Sword,5,2,,0,120,,1,0,0x000654E2,7,2,2,4,0,0,2,{ bonus bAtkEle,Ele_Fire; bonus bHPGainAttackRate,1; bonus2 bSPLossRate,15,10000; },{},{} +13403,Solar_Sword_C,Solar Sword,5,2,,0,120,,1,0,0x000654E2,7,2,2,4,0,0,2,{ bonus bAtkEle,Ele_Fire; bonus bHPDrainRate,1; bonus2 bSPLossRate,15,10000; },{},{} 13404,Platinum_Shotel,Platinum Shotel,5,20,,1500,130,,1,1,0x000654E2,7,2,2,4,55,1,2,{ bonus bCritical,50; },{},{} 13405,Curved_Sword,Curved Sword,5,20,,800,125,,1,2,0x000654E2,7,2,2,4,55,1,2,{ bonus bAspdRate,10; bonus2 bAddEff,Eff_Curse,300; },{},{} 13406,Edger,Edger,5,20,,0,120,,1,0,0x000654E2,7,2,2,1,0,0,2,{ bonus2 bAddClass,Class_All,50; },{},{} diff --git a/db/pre-re/skill_db.txt b/db/pre-re/skill_db.txt index 83c5706d88..9f47cae951 100644 --- a/db/pre-re/skill_db.txt +++ b/db/pre-re/skill_db.txt @@ -41,6 +41,7 @@ // 0x08000 - skill that ignore bg reduction // 0x10000 - skill that ignore gvg reduction // 0x20000 - makes 'self'/'place' skill cannot be casted/placed when near NPC (see 'db/skill_nonearnpc_db.txt' for more options) +// 0x40000 - skill that can hit trap-type skill (inf2 has 0x00080) // 13 maxcount: max amount of skill instances to place on the ground when // player_land_skill_limit/monster_land_skill_limit is enabled. For skills // that attack using a path, this is the path length to be used. @@ -76,7 +77,7 @@ 4,0,0,0,0,0,0,10,0,no,0,0,0,none,0,0x0, SM_RECOVERY,Increase HP Recovery 5,-1,6,1,-1,0,0,10,1,no,0,0,0,weapon,0,0x0, SM_BASH,Bash 6,9,6,1,0,1,0,10,1,no,0,0,0,none,0,0x0, SM_PROVOKE,Provoke -7,0,6,4,3,0x2,2,10,1,no,0,0,0,weapon,2,0x0, SM_MAGNUM,Magnum Break +7,0,6,4,3,0x2,2,10,1,no,0,0x40000,0,weapon,2,0x0, SM_MAGNUM,Magnum Break 8,0,6,4,0,0x1,0,10,1,no,0,0,0,weapon,0,0x0, SM_ENDURE,Endure //**** @@ -128,7 +129,7 @@ 44,0,0,0,0,0,0,10,0,no,0,0,0,none,0,0x0, AC_VULTURE,Vulture's Eye 45,0,6,4,0,0x3,3,10,1,no,0,0,0,weapon,0,0x0, AC_CONCENTRATION,Improve Concentration 46,-9,8,1,-1,0,0,10,2,no,0,0,0,weapon,0,0x80, AC_DOUBLE,Double Strafe -47,-9,6,2,-1,0x2,2,10,1,no,0,0x0,0,weapon,2,0x81, AC_SHOWER,Arrow Shower +47,-9,6,2,-1,0x2,2,10,1,no,0,0x40000,0,weapon,2,0x81, AC_SHOWER,Arrow Shower //**** // Thief @@ -175,7 +176,7 @@ //**** // Wizard 80,9,8,2,3,0x20,1:1:1:1:1:2:2:2:2:2:2,10,-3:-4:-5:-6:-7:-8:-9:-10:-11:-12:-12,yes,0,0x2080,5,magic,0,0x0, WZ_FIREPILLAR,Fire Pillar -81,0,6,4,3,0,7,10,1,yes,0,0x2000,0,magic,5,0x20, WZ_SIGHTRASHER,Sightrasher +81,0,6,4,3,0x2,7,10,1,yes,0,0x42000,0,magic,5,0x20, WZ_SIGHTRASHER,Sightrasher 83,9,8,2,3,0,3:3:3:3:3:3:3:3:3:3:14,10,1:1:2:2:3:3:4:4:5:5:15,yes,0,0x2000,0,magic,0,0x20, WZ_METEOR,Meteor Storm 84,9,8,1,4,0,0,10,3:4:5:6:7:8:9:10:11:12,yes,0,0x2000,0,magic,2:3:3:4:4:5:5:6:6:7,0x20, WZ_JUPITEL,Jupitel Thunder 85,9,8,2,4,0,0,10,-10,yes,0,0x2000,0,magic,0,0x20, WZ_VERMILION,Lord of Vermilion @@ -217,13 +218,13 @@ 115,3,6,2,0,0x1,0,5,1,no,0,0x80,0,misc,6:7:8:9:10,0x3000, HT_SKIDTRAP,Skid Trap 116,3,6,2,2,0x42,0,5,1,no,0,0x80,0,misc,0,0x3800, HT_LANDMINE,Land Mine 117,3,6,2,0,0x1,0,5,1,no,0,0x80,0,misc,0,0x3000, HT_ANKLESNARE,Ankle Snare -118,3,6,2,0,0x2,1,5,1,no,0,0x80,0,misc,0,0x3000, HT_SHOCKWAVE,Shockwave Trap +118,3,6,2,0,0x3,1,5,1,no,0,0x80,0,misc,0,0x3000, HT_SHOCKWAVE,Shockwave Trap 119,3,6,2,0,0x3,2,5,1,no,0,0x80,0,misc,0,0x3000, HT_SANDMAN,Sandman 120,3,6,2,0,0x3,1,5,1,no,0,0x80,0,misc,0,0x3000, HT_FLASHER,Flasher 121,3,6,2,1,0x42,1,5,1,no,0,0x80,0,weapon,0,0x3800, HT_FREEZINGTRAP,Freezing Trap 122,3,6,2,4,0x42,1,5,1,no,0,0x80,0,misc,0,0x3800, HT_BLASTMINE,Blast Mine 123,3,6,2,3,0x42,2,5,1,no,0,0x80,0,misc,0,0x3800, HT_CLAYMORETRAP,Claymore Trap -124,2,6,32,0,0x1,0,1,1,no,0,0,0,misc,0,0x0, HT_REMOVETRAP,Remove Trap +124,2,6,32,0,0x1,0,1,1,no,0,0x40000,0,misc,0,0x0, HT_REMOVETRAP,Remove Trap 125,3,6,2,0,0x1,0,1,1,no,0,0x80,0,misc,0,0x2000, HT_TALKIEBOX,Talkie Box 126,0,0,0,0,0,0,10,0,no,0,0,0,weapon,0,0x0, HT_BEASTBANE,Beast Bane 127,0,0,0,0,0,0,1,0,no,0,0,0,misc,0,0x0, HT_FALCON,Falconry Mastery @@ -369,7 +370,7 @@ 249,0,6,4,0,0x1,0,10,1,no,0,0,0,weapon,0,0x0, CR_AUTOGUARD,Guard 250,3,6,1,0,0,0,5,1,no,0,0,0,weapon,5:6:7:8:9,0x0, CR_SHIELDCHARGE,Smite 251,3:5:7:9:11,6,1,0,0,0,5,1,no,0,0,0,weapon,0,0x20000, CR_SHIELDBOOMERANG,Shield Boomerang -252,0,6,4,0,0,0,10,1,no,0,0,0,weapon,0,0x0, CR_REFLECTSHIELD,Shield Reflect +252,0,6,4,0,0x1,0,10,1,no,0,0,0,weapon,0,0x0, CR_REFLECTSHIELD,Shield Reflect 253,-2,8,1,6,0,0,10,-2,no,0,0,0,weapon,0,0x0, CR_HOLYCROSS,Holy Cross 254,5,6,4,6,0x48,0,10,1,no,33,0x100,0,magic,0,0x0, CR_GRANDCROSS,Grand Cross 255,7:8:9:10:11,6,16,0,0x1,0,5,1,yes,0,0x600,0,none,0,0x0, CR_DEVOTION,Sacrifice @@ -561,7 +562,7 @@ //**** // Stalker 389,0,6,4,0,0x1,0,5,1,no,0,0,0,none,0,0x60, ST_CHASEWALK,Stealth -390,0,0,4,0,0,0,5,1,yes,0,0,0,weapon,0,0x0, ST_REJECTSWORD,Counter Instinct +390,0,0,4,0,0x1,0,5,1,yes,0,0,0,weapon,0,0x0, ST_REJECTSWORD,Counter Instinct //391,0,0,4,0,1,0,1,1,yes,0,0,0,magic,0,0x0, ST_STEALBACKPACK,Steal Backpack //**** @@ -629,9 +630,9 @@ //**** // Star Gladiator 427,0,6,4,0,0x1,0,3,1,yes,0,0,0,magic,0,0x0, SG_FEEL,Feeling the Sun Moon and Stars -428,1,6,4,-1,0x2,1,3,1,yes,0,0,0,weapon,2,0x1, SG_SUN_WARM,Warmth of the Sun -429,1,6,4,-1,0x2,1,3,1,yes,0,0,0,weapon,2,0x1, SG_MOON_WARM,Warmth of the Moon -430,1,6,4,-1,0x2,1,3,1,yes,0,0,0,weapon,2,0x1, SG_STAR_WARM,Warmth of the Stars +428,1,6,4,-1,0x3,1,3,1,yes,0,0,0,weapon,2,0x1, SG_SUN_WARM,Warmth of the Sun +429,1,6,4,-1,0x3,1,3,1,yes,0,0,0,weapon,2,0x1, SG_MOON_WARM,Warmth of the Moon +430,1,6,4,-1,0x3,1,3,1,yes,0,0,0,weapon,2,0x1, SG_STAR_WARM,Warmth of the Stars 431,0,0,4,0,0x1,0,4,1,yes,0,0,0,magic,0,0x0, SG_SUN_COMFORT,Comfort of the Sun 432,0,0,4,0,0x1,0,4,1,yes,0,0,0,magic,0,0x0, SG_MOON_COMFORT,Comfort of the Moon 433,0,0,4,0,0x1,0,4,1,yes,0,0,0,magic,0,0x0, SG_STAR_COMFORT,Comfort of the Stars @@ -689,7 +690,7 @@ //**** // Other 2nd Skills -473,0,6,4,0,0,0,1,1,no,0,0,0,none,0,0x0, SM_SELFPROVOKE,Provoke Self +473,0,6,4,0,0x1,0,1,1,no,0,0,0,none,0,0x0, SM_SELFPROVOKE,Provoke Self 474,0,0,4,0,0x1,0,10,1,no,0,0x2,0,none,0,0x0, NPC_EMOTION_ON,Emotion ON 475,0,0,4,0,0x1,0,1,1,yes,0,0,0,none,0,0x0, ST_PRESERVE,Preserve 476,1,6,1,0,0x1,0,5,1,yes,0,0,0,weapon,0,0x20, ST_FULLSTRIP,Divest All @@ -719,7 +720,7 @@ //**** // Gunslinger -500,0,6,4,0,0x40,0,5,1,no,0,0,0,misc,0,0x0, GS_GLITTERING,Flip the Coin +500,0,6,4,0,0x41,0,5,1,no,0,0,0,misc,0,0x0, GS_GLITTERING,Flip the Coin 501,9,6,1,-1,0x50,0,1,1,no,0,0,0,misc,0,0x0, GS_FLING,Fling 502,-9,8,1,-1,0,0,1,3,no,0,0,0,weapon,0,0x0, GS_TRIPLEACTION,Triple Action 503,-9,6,1,-1,0x8,0,1,1,no,0,0,0,weapon,0,0x0, GS_BULLSEYE,Bulls Eye @@ -870,7 +871,7 @@ 1003,0,0,0,0,0,0,1,0,no,0,0x1,0,weapon,0,0x0, AS_SONICACCEL,Sonic Acceleration 1004,9,8,1,0,0x8,0,1,1,no,0,0x1,0,weapon,0,0x0, AS_VENOMKNIFE,Throw Venom Knife 1005,1,6,1,0,0x1,0,1,1,no,0,0x1,0,weapon,0,0x0, RG_CLOSECONFINE,Close Confine -1006,0,6,4,3,0,1,1,1,yes,0,0x1,0,magic,3,0x20, WZ_SIGHTBLASTER,Sight Blaster +1006,0,6,4,3,0,1,1,1,yes,0,0x40001,0,magic,3,0x20, WZ_SIGHTBLASTER,Sight Blaster 1007,0,6,4,0,0x1,0,1,0,no,0,0x1,0,none,0,0x0, SA_CREATECON,Create Elemental Converter 1008,9,6,1,1,0x1,0,1,1,yes,0,0x1,0,magic,0,0x0, SA_ELEMENTWATER,Elemental Change Water 1009,-9,6,1,0,0,0,1,1,no,0,0x1,0,weapon,3,0x0, HT_PHANTASMIC,Phantasmic Arrow @@ -894,7 +895,7 @@ 2005,1,6,2,4,0x2,2,5,1,no,0,0,0,weapon,3,0x0, RK_WINDCUTTER,Wind Cutter 2006,0,6,4,-1,0x2,5,5,1,no,0,0,0,weapon,0,0x0, RK_IGNITIONBREAK,Ignition Break 2007,0,0,0,0,0,0,5,0,no,0,0,0,none,0,0x0, RK_DRAGONTRAINING,Dragon Training -2008,9,6,2,3,0x42,1:1:1:2:2:2:3:3:4:4,10,1,no,0,0,0,weapon,0,0x0, RK_DRAGONBREATH,Dragon Breath +2008,9,6,2,3,0x42,1:1:1:2:2:2:3:3:4:4,10,1,no,0,0x40000,0,weapon,0,0x0, RK_DRAGONBREATH,Dragon Breath 2009,0,6,4,0,0x3,3:4:5:6:7,5,1,no,0,0,0,none,0,0x0, RK_DRAGONHOWLING,Dragon Howling 2010,0,0,0,0,0,0,10,0,no,0,0,0,none,0,0x0, RK_RUNEMASTERY,Rune Mastery 2011,0,6,4,0,0x1,0,1,1,no,0,0,0,none,0,0x0, RK_MILLENNIUMSHIELD,Millenium Shield @@ -903,7 +904,7 @@ 2014,0,6,4,0,0x1,0,1,1,yes,0,0,0,none,0,0x0, RK_GIANTGROWTH,Giant Growth 2015,0,6,4,0,0x1,0,1,1,yes,0,0,0,none,0,0x0, RK_STONEHARDSKIN,Stone Hard Skin 2016,0,6,4,0,0x1,0,1,1,yes,0,0,0,none,0,0x0, RK_VITALITYACTIVATION,Vitality Activation -2017,0,6,4,-1,0x2,3,1,1,no,0,0,0,weapon,7,0x0, RK_STORMBLAST,Storm Blast +2017,0,6,4,-1,0x2,3,1,1,no,0,0x40000,0,weapon,7,0x0, RK_STORMBLAST,Storm Blast 2018,0,6,4,0,0x3,-1,1,1,yes,0,0,0,none,0,0x0, RK_FIGHTINGSPIRIT,Fighting Spirit //CHECK Is this splash needed? 2019,9,6,4,6,0x1,0,1,1,yes,0,0,0,none,0,0x0, RK_ABUNDANCE,Abundance 2020,5:6:7:8:9,6,1,-1,0,0,5,1,no,0,0,0,weapon,0,0x0, RK_PHANTOMTHRUST,Phantom Thrust @@ -995,7 +996,7 @@ 2234,0,6,4,0,0,0,5,1,yes,0,0,0,none,0,0x0, RA_FEARBREEZE,Fear Breeze 2235,0,0,0,0,0,0,10,0,no,0,0,0,none,0,0x0, RA_RANGERMAIN,Ranger Main 2236,9,8,1,-1,0,0,10,1,yes,0,0,0,weapon,0,0x80, RA_AIMEDBOLT,Aimed Bolt -2237,9,6,2,0,0x3,3,1,1,no,0,0,0,none,0,0x2000, RA_DETONATOR,Detonator +2237,9,6,2,0,0x3,3,1,1,no,0,0x40000,0,none,0,0x2000, RA_DETONATOR,Detonator 2238,3,6,2,0,0x3,2,5,1,no,0,0x80,3,misc,0,0x2000, RA_ELECTRICSHOCKER,Electric Shocker 2239,3,6,2,0,0x42,3,5,1,no,0,0x80,3,misc,0,0x2800, RA_CLUSTERBOMB,Cluster Bomb 2240,0,6,4,0,0,0,1,1,no,0,0,0,none,0,0x0, RA_WUGMASTERY,Warg Mastery @@ -1004,7 +1005,7 @@ 2243,9,6,1,0,0x40,0,5,1,no,0,0,0,weapon,0,0x2000, RA_WUGSTRIKE,Warg Strike 2244,9,6,1,0,0x40,0,5,1,no,0,0,0,weapon,0,0x80, RA_WUGBITE,Warg Bite 2245,0,0,0,0,0,0,10,0,no,0,0,0,none,0,0x0, RA_TOOTHOFWUG,Tooth of Warg -2246,0,6,4,0,0x2,3:4:5:6:7,5,1,no,0,0,0,weapon,0,0x0, RA_SENSITIVEKEEN,Sensitive Keen +2246,0,6,4,0,0x2,3:4:5:6:7,5,1,no,0,0x40000,0,weapon,0,0x0, RA_SENSITIVEKEEN,Sensitive Keen 2247,0,6,4,0,0x1,0,5,1,no,0,0,0,none,0,0x42, RA_CAMOUFLAGE,Camouflage 2248,0,0,0,0,0,0,5,0,no,0,0,0,none,0,0x0, RA_RESEARCHTRAP,Research Trap 2249,3,6,2,3,0x43,2,1,1,no,0,0x80,1,misc,0,0x2000, RA_MAGENTATRAP,Magenta Trap @@ -1021,14 +1022,14 @@ 2257,3,6,1,-1,0,0,3,1,no,0,0,0,weapon,0,0x0, NC_PILEBUNKER,Pile Bunker 2258,13,6,1,-1,0x2,1,3,1,no,0,0,0,weapon,0,0x0, NC_VULCANARM,Vulcan Arm 2259,7,6,1,3,0,2,3,1,no,0,0,5,weapon,0,0x0, NC_FLAMELAUNCHER,Flame Launcher -2260,7,6,2,1,0x2,2:3:4,3,1,no,0,0,0,weapon,0,0x0, NC_COLDSLOWER,Cold Slower +2260,7,6,2,1,0x2,2:3:4,3,1,no,0,0x40000,0,weapon,0,0x0, NC_COLDSLOWER,Cold Slower 2261,9:11:13,6,2,-1,0x42,3:2:1,3,1,no,0,0,0,weapon,0,0x0, NC_ARMSCANNON,Arm Cannon 2262,0,6,4,0,0x1,0,3,1,no,0,0,0,none,0,0x0, NC_ACCELERATION,Acceleration 2263,0,6,4,0,0x1,0,1,1,no,0,0,0,none,0,0x0, NC_HOVERING,Hovering 2264,0,6,4,0,0x1,0,1,1,no,0,0,0,none,7,0x0, NC_F_SIDESLIDE,Front-Side Slide 2265,0,6,4,0,0x1,0,1,1,no,0,0,0,none,7,0x0, NC_B_SIDESLIDE,Back-Side Slide 2266,0,0,0,0,0,0,4,0,no,0,0,0,none,0,0x0, NC_MAINFRAME,Mainframe Restructure -2267,0,6,4,0,0xCA,2:3:4,3,1,no,0,0,0,weapon,5,0x0, NC_SELFDESTRUCTION,Self Destruction +2267,0,6,4,0,0xCA,2:3:4,3,1,no,0,0x40000,0,weapon,5,0x0, NC_SELFDESTRUCTION,Self Destruction 2268,0,6,4,0,0x1,0,4,1,yes,0,0,0,none,0,0x0, NC_SHAPESHIFT,Shape Shift 2269,0,6,4,0,0x1,0,1,1,no,0,0,0,none,0,0x0, NC_EMERGENCYCOOL,Emergency Cool 2270,0,6,4,0,0x3,7,1,1,yes,0,0,0,none,0,0x0, NC_INFRAREDSCAN,Infrared Scan @@ -1102,7 +1103,7 @@ 2329,-2,8,4,-1,0,0,5,-2,no,0,0x200,0,weapon,0,0x0, SR_FALLENEMPIRE,Fallen Empire 2330,-2,6,1,-1,0x42,1:1:1:1:1:2:2:2:2:2,10,1,yes,0,0,0,weapon,0,0x0, SR_TIGERCANNON,Tiger Cannon 2331,0,0,0,0,0,0,10,0,no,0,0,0,none,0,0x0, SR_HELLGATE,Hell Gate -2332,0,6,4,-1,0x2,3,5,1,no,0,0,0,weapon,0,0x0, SR_RAMPAGEBLASTER,Rampage Blaster +2332,0,6,4,-1,0x2,3,5,1,no,0,0x40000,0,weapon,0,0x0, SR_RAMPAGEBLASTER,Rampage Blaster 2333,0,6,4,0,0x1,0,5,1,no,0,0,0,none,0,0x0, SR_CRESCENTELBOW,Crescent Elbow 2334,0,6,4,0,0x3,1:1:2:2:3,5,1,no,0,0,0,none,0,0x0, SR_CURSEDCIRCLE,Cursed Circle 2335,0,6,4,0,0x1,0,5,1,no,0,0,0,none,0,0x0, SR_LIGHTNINGWALK,Lightning Walk @@ -1203,7 +1204,7 @@ 2481,11,6,1,-1,0x2,1:2:3:4:5,5,1,yes,0,0,0,weapon,0,0x0, GN_SPORE_EXPLOSION,Spore Explosion //CHECK Data says its element is set to neutral. Need to confirm. 2482,11,6,2,0,0x8,0,5,1,yes,0,0,1,weapon,2,0x0, GN_WALLOFTHORN,Wall of Thorns 2483,11,6,2,0,0x3,4,10,1,yes,0,0x0,0,weapon,0,0x1, GN_CRAZYWEED,Crazy Weed -2484,0,6,2,2,0x2,2,10,1,no,0,0x0,0,weapon,0,0x1, GN_CRAZYWEED_ATK,Crazy Weed Attack +2484,0,6,2,2,0x2,2,10,1,no,0,0x40000,0,weapon,0,0x1, GN_CRAZYWEED_ATK,Crazy Weed Attack 2485,9,6,2,3,0,0,5,1,yes,0,0,0,magic,0,0x0, GN_DEMONIC_FIRE,Demonic Fire 2486,9,6,2,0,0,0,5,1,yes,0,0,0,none,0,0x0, GN_FIRE_EXPANSION,Fire Expansion 2487,9,6,2,0,0,0,1,1,no,0,0,0,none,0,0x0, GN_FIRE_EXPANSION_SMOKE_POWDER,Fire Expansion Smoke Powder @@ -1310,7 +1311,7 @@ 5001,1,8,1,-1,0,0,5,3,no,0,0,0,weapon,0,0x0, GC_DARKCROW,Dark Claw 5002,0,6,4,0,0x1,0,5,1,no,0,0,0,none,0,0x0, RA_UNLIMIT,Unlimited 5003,7,6,1,-1,0x2,4:5:6:7:-1,5,1,no,0,0,0,weapon,0,0x0, GN_ILLUSIONDOPING,Illusion Doping -5004,9,6,2,1,0x42,1:1:1:2:2:2:3:3:4:4,10,1,no,0,0,0,weapon,0,0x0, RK_DRAGONBREATH_WATER,Dragon Breath - Water +5004,9,6,2,1,0x42,1:1:1:2:2:2:3:3:4:4,10,1,no,0,0x40000,0,weapon,0,0x0, RK_DRAGONBREATH_WATER,Dragon Breath - Water 5005,0,6,4,0,0x3,3,1,1,no,0,0,0,none,0,0x0, RK_LUXANIMA,Lux Anima 5006,1,6,2,3,0,0,5,1,no,0,0,3,misc,0,0x0, NC_MAGMA_ERUPTION,Magma Eruption 5007,0,6,4,0,0x3,5:6:7:8:9,5,1,no,0,0,0,none,0,0x0, WM_FRIGG_SONG,Frigg's Song @@ -1374,18 +1375,18 @@ //**** // Mercenary Skill Place holders 8201,-1,6,1,-1,0,0,10,1,no,0,0,0,weapon,0,0x0, MS_BASH,Bash -8202,0,6,4,3,0x2,2,10,1,no,0,0,0,weapon,2,0x0, MS_MAGNUM,Magnum_Break +8202,0,6,4,3,0x2,2,10,1,no,0,0x40000,0,weapon,2,0x0, MS_MAGNUM,Magnum_Break 8203,-2,6,1,-1,0x2,1,10,1,no,0,0,0,weapon,1,0x0, MS_BOWLINGBASH,Bowling_Bash 8204,0,6,4,0,0x1,0,10,1,no,0,0,0,weapon,0,0x0, MS_PARRYING,Parry 8205,0,6,4,0,0,0,10,1,no,0,0,0,weapon,0,0x0, MS_REFLECTSHIELD,Shield_Reflect 8206,0,6,4,0,0x1,0,1,1,no,0,0,0,weapon,0,0x0, MS_BERSERK,Frenzy 8207,-9,8,1,-1,0,0,10,2,no,0,0,0,weapon,0,0x80, MA_DOUBLE,Double_Strafe -8208,-9,6,2,-1,0x2,2,10,1,no,0,0x0,0,weapon,2,0x81, MA_SHOWER,Arrow_Shower +8208,-9,6,2,-1,0x2,2,10,1,no,0,0x40000,0,weapon,2,0x81, MA_SHOWER,Arrow_Shower 8209,3,6,2,0,0x1,0,5,1,no,0,0x80,0,misc,6:7:8:9:10,0x0, MA_SKIDTRAP,Skid_Trap 8210,3,6,2,2,0x40,0,5,1,no,0,0x80,0,misc,0,0x0, MA_LANDMINE,Land_Mine 8211,3,6,2,0,0x3,2,5,1,no,0,0x80,0,misc,0,0x0, MA_SANDMAN,Sandman 8212,3,6,2,1,0x42,1,5,1,no,0,0x80,0,weapon,0,0x0, MA_FREEZINGTRAP,Freezing_Trap -8213,2,6,32,0,0x1,0,1,1,no,0,0,0,misc,0,0x0, MA_REMOVETRAP,Remove_Trap +8213,2,6,32,0,0x1,0,1,1,no,0,0x40000,0,misc,0,0x0, MA_REMOVETRAP,Remove_Trap 8214,-9,6,1,-1,0x2,0,1,1,no,0,0x1,0,weapon,6,0x80, MA_CHARGEARROW,Arrow_Repel 8215,9,8,1,-1,0,2,5,1,yes,0,0,13,weapon,0,0x0, MA_SHARPSHOOTING,Focused_Arrow_Strike 8216,-2,8,1,-1,0,0,10,3,no,0,0,0,weapon,0,0x0, ML_PIERCE,Pierce diff --git a/db/re/item_combo_db.txt b/db/re/item_combo_db.txt index 8a6457c764..a714e2293d 100644 --- a/db/re/item_combo_db.txt +++ b/db/re/item_combo_db.txt @@ -269,12 +269,12 @@ 4168:4169,{ bonus bMaxHPrate,20; bonus bMaxSPrate,20; bonus bVariableCastrate,-10; } 4169:4488,{ if(getequiprefinerycnt(EQI_SHOES) >= 15) { bonus bMaxHPrate,15; bonus bMaxSPrate,15; } else { bonus bMaxHPrate,10; bonus bMaxSPrate,10; } } 4169:4488,{ if(getequiprefinerycnt(EQI_SHOES) >= 15) { bonus bMaxHPrate,15; bonus bMaxSPrate,15; } else { bonus bMaxHPrate,10; bonus bMaxSPrate,10; } } -4172:4210:4230:4257:4272,{ bonus bAgi,5; bonus bStr,5; bonus bAspdRate,5; bonus bSpeedRate,25; bonus bSPGainAttack,1; if(BaseClass==Job_Thief) bonus bNoGemStone,0; } -4178:4199:4234:4252:4297,{ bonus bAgi,5; bonus bDex,3; bonus bLongAtkRate,20; bonus bPerfectHitAddRate,20; if(BaseClass==Job_Archer) { bonus2 bExpAddRace,RC_Brute,5; bonus2 bWeaponComaRace,RC_Brute,100; } } +4172:4210:4230:4257:4272,{ bonus bAgi,5; bonus bStr,5; bonus bAspdRate,5; bonus bSpeedRate,25; bonus bSPDrainValue,1; if(BaseClass==Job_Thief) bonus bNoGemStone,0; } +4178:4199:4234:4252:4297,{ bonus bAgi,5; bonus bDex,3; bonus bLongAtkRate,20; bonus bPerfectHitAddRate,20; if(BaseClass==Job_Archer) { bonus2 bExpAddRace,RC_Brute,5; bonus2 bComaRace,RC_Brute,100; } } 4178:4234:4252:4297:4381,{ bonus bDex,5; bonus2 bSkillAtk,"CG_ARROWVULCAN",5; bonus2 bSkillAtk,"DC_THROWARROW",10; bonus2 bSkillAtk,"BA_MUSICALSTRIKE",10; if(BaseJob==Job_Bard||BaseJob==Job_Dancer) bonus3 bAutoSpellWhenHit,"CG_TAROTCARD",2,50; } 4185:4217:4280:4293:4312,{ bonus bVit,10; bonus bVariableCastrate,-10; bonus bUseSPRate,-10; if(BaseClass==Job_Acolyte) { bonus2 bExpAddRace,RC_Undead,5; bonus2 bExpAddRace,RC_Demon,5; bonus2 bSubRace,RC_Undead,30; bonus2 bSubRace,RC_Demon,30; } } 4185:4293:4312:4332,{ bonus bStr,3; bonus bMaxSP,80; bonus bBaseAtk,25; bonus3 bAutoSpell,"AL_CRUCIS",5,10; bonus2 bSkillAtk,"MO_EXTREMITYFIST",10; if(BaseJob==Job_Monk) { bonus bUseSPrate,-10; bonus bNoCastCancel,0; } } -4186:4206:4233:4281:4321,{ bonus bLuk,10; bonus bSPGainAttack,2; bonus2 bSkillAtk,42,20; if(BaseClass==Job_Merchant) { bonus2 bAddMonsterDropItem,617,5; bonus bMagicDamageReturn,20; } } +4186:4206:4233:4281:4321,{ bonus bLuk,10; bonus bSPDrainValue,2; bonus2 bSkillAtk,42,20; if(BaseClass==Job_Merchant) { bonus2 bAddMonsterDropItem,617,5; bonus bMagicDamageReturn,20; } } 4191:4208:4258:4309:4325:4327,{ bonus bMaxHP,500; bonus bDef,5; bonus bMdef,5; bonus2 bSkillAtk,14,10; bonus2 bSkillAtk,19,10; bonus2 bSkillAtk,20,10; if(BaseClass==Job_Mage) { bonus bMatkRate,3; bonus bVariableCastrate,-15; } } 4193:4294,{ bonus bMaxHP,300; bonus bMaxSP,60; } 4208:4258:4325:4327:4382,{ bonus bInt,3; bonus2 bSkillAtk,"WZ_HEAVENDRIVE",10; bonus2 bSkillAtk,"MG_THUNDERSTORM",10; if(BaseJob==Job_Sage) { bonus bMagicDamageReturn,20; bonus2 bAddMonsterDropItem,716,100; bonus2 bAddMonsterDropItem,715,100; bonus bVariableCastrate,-20; } } @@ -352,6 +352,7 @@ 19021:2160,{ bonus2 bSubSize,Size_Large,5+(getequiprefinerycnt(EQI_HAND_L)*2); } 19021:1387,{ bonus2 bSkillAtk,"WS_CARTTERMINATION",15+(getequiprefinerycnt(EQI_HAND_R))*5; } 19021:1490,{ bonus2 bSkillAtk,"LK_SPIRALPIERCE",getequiprefinerycnt(EQI_HAND_R)*5; .@lv = getskilllv("LK_SPIRALPIERCE"); bonus4 bAutoSpellOnSkill,"LK_JOINTBEAT","LK_SPIRALPIERCE",(.@lv ? .@lv : 1),50+(getskilllv("LK_JOINTBEAT")*10); /* Confirm: Success rate */ } +19024:5170,{ .@r = getequiprefinerycnt(EQI_HEAD_TOP); if (.@r >= 7) bonus bAspdRate,5; if (.@r >= 9) bonus bMaxHPRate,5; } 19026:15138,{ bonus2 bSubRace,RC_Fish,(10+getequiprefinerycnt(EQI_ARMOR)); bonus bUnbreakableArmor,1; } 19026:20756,{ .@r = getequiprefinerycnt(EQI_GARMENT); bonus2 bSPGainRace,RC_Fish,10; bonus3 bAddMonsterDropItem,551,RC_Fish,(5+.@r); bonus2 bAddItemHealRate,551,5; bonus bHPrecovRate,(5+.@r); } 19026:20756:22059:15138,{ bonus bMaxHP,1000; bonus bMaxSP,100; bonus2 bExpAddRace,RC_Fish,20; bonus2 bMagicAddRace,RC_Fish,50; bonus2 bSubEle,Ele_Water,50; } @@ -397,8 +398,8 @@ 24072:24075,{ bonus bMaxHPrate,1; bonus bMaxSPrate,1; } 24073:24076,{ bonus bMaxHPrate,1; bonus bMaxSPrate,1; } 24074:24077,{ bonus bMaxHPrate,1; bonus bMaxSPrate,1; } -24078:24079:24080,{ bonus2 bSPGainAttackRate,10,1+(getequiprefinerycnt(EQI_SHADOW_WEAPON)+getequiprefinerycnt(EQI_SHADOW_ACC_R)+getequiprefinerycnt(EQI_SHADOW_ACC_L)/10); } -24081:24082:24083,{ bonus2 bHPGainAttackRate,40,2+(getequiprefinerycnt(EQI_SHADOW_ARMOR)+getequiprefinerycnt(EQI_SHADOW_SHIELD)+getequiprefinerycnt(EQI_SHADOW_SHOES)/5); } +24078:24079:24080,{ bonus2 bSPDrainRate,10,1+(getequiprefinerycnt(EQI_SHADOW_WEAPON)+getequiprefinerycnt(EQI_SHADOW_ACC_R)+getequiprefinerycnt(EQI_SHADOW_ACC_L)/10); } +24081:24082:24083,{ bonus2 bHPDrainRate,40,2+(getequiprefinerycnt(EQI_SHADOW_ARMOR)+getequiprefinerycnt(EQI_SHADOW_SHIELD)+getequiprefinerycnt(EQI_SHADOW_SHOES)/5); } 24084:24085:24086:24087:24088:24089,{ bonus bAllStats,1; .@r = getequiprefinerycnt(EQI_SHADOW_ARMOR)+getequiprefinerycnt(EQI_SHADOW_WEAPON)+getequiprefinerycnt(EQI_SHADOW_SHIELD)+getequiprefinerycnt(EQI_SHADOW_SHOES)+getequiprefinerycnt(EQI_SHADOW_ACC_R)+getequiprefinerycnt(EQI_SHADOW_ACC_L); if (.@r >= 45) { bonus bNoGemStone,1; } bonus bUseSPrate,100-.@r; } 24090:24091:24092,{ bonus bDef,5; if (getequiprefinerycnt(EQI_SHADOW_SHIELD)+getequiprefinerycnt(EQI_SHADOW_ARMOR)+getequiprefinerycnt(EQI_SHADOW_SHOES) >= 20) bonus2 bResEff,Eff_Stone,100; } 24090:24093:24094,{ bonus bDef,5; if (getequiprefinerycnt(EQI_SHADOW_SHIELD)+getequiprefinerycnt(EQI_SHADOW_ARMOR)+getequiprefinerycnt(EQI_SHADOW_SHOES) >= 20) bonus2 bResEff,Eff_Sleep,100; } @@ -459,5 +460,7 @@ 24234:24235,{ bonus bBaseAtk,5; if (getequiprefinerycnt(EQI_SHADOW_ACC_R)+getequiprefinerycnt(EQI_SHADOW_ACC_L)>=15) { bonus2 bAddSize,Size_Large,2; bonus2 bMagicAddSize,Size_Large,2; } } 24236:24237,{ bonus bBaseAtk,5; if (getequiprefinerycnt(EQI_SHADOW_ACC_R)+getequiprefinerycnt(EQI_SHADOW_ACC_L)>=15) { bonus2 bAddSize,Size_Medium,2; bonus2 bMagicAddSize,Size_Medium,2; } } 24238:24239,{ bonus bBaseAtk,5; if (getequiprefinerycnt(EQI_SHADOW_ACC_R)+getequiprefinerycnt(EQI_SHADOW_ACC_L)>=15) { bonus2 bAddSize,Size_Small,2; bonus2 bMagicAddSize,Size_Small,2; } } +28315:28317,{ bonus2 bAddClass,Class_All,4; bonus bMatkRate,4; } +28316:28318,{ bonus2 bAddClass,Class_All,4; bonus bMatkRate,4; } 28326:28327,{ bonus bInt,8; bonus bStr,8; } 28602:2677,{ bonus2 bVariableCastrate,"PR_MAGNUS",-25; bonus bHealPower,10; bonus bAddItemHealRate,10; autobonus2 "{ bonus bIgnoreMDefRace,RC_All; }",getequiprefinerycnt(EQI_HAND_R)*20,2000,BF_SHORT|BF_NORMAL; /* Confirm: Success rate and duration */ } diff --git a/db/re/item_db.txt b/db/re/item_db.txt index 9bc3ad1576..20324f5b74 100644 --- a/db/re/item_db.txt +++ b/db/re/item_db.txt @@ -165,11 +165,11 @@ 668,Handsei,Red Envelope,2,0,,20,,,,,0xFFFFFFFF,63,2,,,,,,{ set Zeny,Zeny+rand(1000,10000); },{},{} 669,Rice_Cake_Soup,Tempting Rice-Cake Soup,0,500,,100,,,,,0xFFFFFFFF,63,2,,,,,,{ percentheal -100,-100; },{},{} 670,Gold_Coin_Moneybag,Bag of Gold Coins,3,100000,,400,,,,,0xFFFFFFFF,63,2,,,,,,{},{},{} -671,Gold_Coin,Gold Coin,3,10000,,0,,,,,0xFFFFFFFF,63,2,,,,,,{ /*goldpoint++; (For Roulette game)*/ },{},{} +671,Gold_Coin,Gold Coin,2,10000,,0,,,,,0xFFFFFFFF,63,2,,,,,,{ RouletteGold++; },{},{} 672,Copper_Coin_Moneybag,Bag of Bronze Coins,3,1000,,400,,,,,0xFFFFFFFF,63,2,,,,,,{},{},{} -673,Copper_Coin,Bronze Coin,3,100,,40,,,,,0xFFFFFFFF,63,2,,,,,,{},{},{} +673,Copper_Coin,Bronze Coin,2,100,,40,,,,,0xFFFFFFFF,63,2,,,,,,{ RouletteBronze++; },{},{} 674,Mithril_Coin,Mithril Coin,3,5000,,40,,,,,0xFFFFFFFF,63,2,,,,,,{},{},{} -675,Silver_Coin,Silver Coin,3,5000,,0,,,,,0xFFFFFFFF,63,2,,,,,,{ /*silverpoint++; (For Roulette game)*/ },{},{} +675,Silver_Coin,Silver Coin,2,5000,,0,,,,,0xFFFFFFFF,63,2,,,,,,{ RouletteSilver++; },{},{} 676,Silver_Coin_Moneybag,Bag of Silver Coins,3,50000,,400,,,,,0xFFFFFFFF,63,2,,,,,,{},{},{} 677,White_Gold_Coin,Platinum Coin,3,2000,,40,,,,,0xFFFFFFFF,63,2,,,,,,{},{},{} 678,Poison_Bottle,Poison Bottle,2,5000,,100,,,,,0xFFFFFFFF,63,2,,,,,,{ if(Class == Job_Assassin_Cross || Class == Job_Guillotine_Cross || Class == Job_Guillotine_Cross_T) { sc_start SC_DPOISON,60000,0; sc_start SC_ASPDPOTION3,60000,9; } else percentheal -100,-100; },{},{} @@ -483,7 +483,7 @@ 1129,Flamberge,Flamberge,5,60000,,1500,150,,1,0,0x00004080,63,2,2,3,27,1,2,{},{},{} 1130,Nagan,Nagan,5,20,,500,120,,1,0,0x000654E2,63,2,2,4,40,1,2,{ skill "TF_DOUBLE",5; bonus bDoubleRate,25; bonus2 bAddRace,RC_DemiHuman,5; bonus2 bAddRace,RC_Player,5; },{},{} 1131,Ice_Falchon,Ice Falchion,5,20,,600,100,,1,0,0x000654E2,63,2,2,4,40,1,2,{ bonus bAtkEle,Ele_Water; bonus2 bAddEff,Eff_Freeze,500; bonus2 bAddEff2,Eff_Freeze,10; skill "MG_COLDBOLT",3; bonus3 bAutoSpell,"MG_COLDBOLT",3,100; },{},{} -1132,Edge,Edge,5,20,,700,115,,1,0,0x000654E2,63,2,2,4,40,1,2,{ bonus2 bAddEff,Eff_Curse,30; bonus2 bWeaponComaClass,Class_Normal,10; },{},{} +1132,Edge,Edge,5,20,,700,115,,1,0,0x000654E2,63,2,2,4,40,1,2,{ bonus2 bAddEff,Eff_Curse,30; bonus2 bComaClass,Class_Normal,10; },{},{} 1133,Fire_Brand,Fireblend,5,20,,500,100,,1,0,0x000654E2,63,2,2,4,40,1,2,{ bonus bAtkEle,Ele_Fire; skill "MG_FIREBOLT",3; bonus3 bAutoSpell,"MG_FIREBOLT",3,100; },{},{} 1134,Scissores_Sword,Caesar's Sword,5,20,,700,140,,1,0,0x000654E2,63,2,2,4,40,1,2,{ bonus2 bAddRace,RC_Plant,25; bonus bIgnoreDefRace,RC_Plant; },{},{} 1135,Cutlas,Cutlus,5,20,,900,150,,1,0,0x000654E2,63,2,2,4,40,1,2,{ skill "SM_BASH",5; bonus bStr,2; bonus bDef,1; },{},{} @@ -687,11 +687,11 @@ 1362,Two_Handed_Axe__,Two-Handed Axe,5,55000,,2500,185,,1,0,0x000444A2,63,2,34,3,30,1,7,{},{},{} 1363,Brood_Axe,Bloody Axe,5,20,,4000,170,,1,0,0x000444A2,63,2,34,4,44,1,7,{ bonus bStr,10; bonus bSpeedRate,25; },{},{} 1364,Great_Axe,Great Axe,5,20,,1800,187,,1,0,0x000444A2,63,2,34,4,44,1,7,{ bonus2 bAddSkillBlow,"MC_MAMMONITE",5; bonus2 bAddEff,Eff_Stun,1500; },{},{} -1365,Sabbath,Sabbath,5,20,,2300,120,,1,0,0x000444A2,63,2,34,4,44,1,7,{ bonus bAtkEle,Ele_Dark; bonus2 bWeaponComaRace,RC_Demon,50; bonus2 bCriticalAddRace,RC_Undead,50; },{},{} +1365,Sabbath,Sabbath,5,20,,2300,120,,1,0,0x000444A2,63,2,34,4,44,1,7,{ bonus bAtkEle,Ele_Dark; bonus2 bComaRace,RC_Demon,50; bonus2 bCriticalAddRace,RC_Undead,50; },{},{} 1366,Right_Epsilon,Light Epsilon,5,20,,2300,180,,1,0,0x000444A2,63,2,34,4,44,1,7,{ bonus bAtkEle,Ele_Holy; skill "AL_HEAL",3; bonus2 bAddRace,RC_Demon,3; },{},{} -1367,Slaughter,Slaughter,5,20,,2500,120,,1,0,0x000444A2,63,2,34,4,44,1,7,{ bonus bAtkEle,Ele_Earth; bonus bIgnoreDefRace,RC_Brute; bonus2 bWeaponComaRace,RC_Brute,40; },{},{} +1367,Slaughter,Slaughter,5,20,,2500,120,,1,0,0x000444A2,63,2,34,4,44,1,7,{ bonus bAtkEle,Ele_Earth; bonus bIgnoreDefRace,RC_Brute; bonus2 bComaRace,RC_Brute,40; },{},{} 1368,Tomahawk,Tomahawk,5,20,,2500,165,,1,0,0x000444A2,63,2,34,4,44,1,7,{ bonus bAtkEle,Ele_Wind; skill "ITM_TOMAHAWK",1; },{},{} -1369,Guillotine,Guillotine,5,20,,3000,215,,1,0,0x000444A2,63,2,34,4,44,1,7,{ bonus2 bWeaponComaRace,RC_DemiHuman,30; bonus2 bWeaponComaRace,RC_Player,30; bonus2 bSPGainRaceAttack,RC_DemiHuman,2; bonus2 bSPGainRaceAttack,RC_Player,2; bonus2 bSPGainRace,RC_DemiHuman,20; bonus2 bSPGainRace,RC_Player,20; },{},{} +1369,Guillotine,Guillotine,5,20,,3000,215,,1,0,0x000444A2,63,2,34,4,44,1,7,{ bonus2 bComaRace,RC_DemiHuman,30; bonus2 bComaRace,RC_Player,30; bonus2 bSPDrainValueRace,RC_DemiHuman,2; bonus2 bSPDrainValueRace,RC_Player,2; bonus2 bSPGainRace,RC_DemiHuman,20; bonus2 bSPGainRace,RC_Player,20; },{},{} 1370,Doom_Slayer,Doom Slayer,5,20,,6000,10,,1,0,0x000444A2,63,2,34,4,80,1,7,{ bonus bAspdRate,-40; bonus bUseSPrate,100; if(readparam(bStr)>=95){ bonus bBaseAtk,340; bonus2 bAddEff,Eff_Stun,3000; bonus bBreakArmorRate,500; } },{},{} 1371,Doom_Slayer_,Doom Slayer,5,20,,6000,10,,1,1,0x000444A2,63,2,34,4,80,1,7,{ bonus bAspdRate,-40; bonus bUseSPrate,100; if(readparam(bStr)>=95){ bonus bBaseAtk,340; bonus2 bAddEff,Eff_Stun,3000; bonus bBreakArmorRate,500; } },{},{} 1372,Right_Epsilon_C,Light Epsilon,5,1,,0,229,,1,0,0x000444A2,63,2,34,4,1,0,7,{ bonus bAtkEle,Ele_Holy; skill "AL_HEAL",3; bonus2 bAddRace,RC_Demon,3; bonus bStr,10; bonus bSpeedRate,25; /*Gold PC Room: bonus bBaseAtk,10; bonus bMatk,10; */},{},{} @@ -836,7 +836,7 @@ 1523,Spike,Spike,5,20,,700,85,,1,0,0x00008110,63,2,2,4,40,1,8,{ bonus bCritical,40; bonus bDefRate,-67; bonus bDef2Rate,-67; },{},{} 1524,Golden_Mace,Golden Mace,5,20,,800,110,,1,1,0x00008110,63,2,2,4,40,1,8,{ bonus2 bAddRace,RC_Undead,10; bonus bUnbreakableWeapon,0; },{},{} 1525,Long_Mace,Long Mace,5,20,,800,135,,3,0,0x00008110,63,2,2,4,40,1,8,{ bonus bLongAtkDef,10; },{},{} -1526,Slash,Slash,5,20,,1000,145,,1,0,0x00008110,63,2,2,4,40,1,8,{ bonus2 bAddRace,RC_Undead,15; bonus2 bWeaponComaRace,RC_Undead,10; bonus2 bExpAddRace,RC_Undead,5; },{},{} +1526,Slash,Slash,5,20,,1000,145,,1,0,0x00008110,63,2,2,4,40,1,8,{ bonus2 bAddRace,RC_Undead,15; bonus2 bComaRace,RC_Undead,10; bonus2 bExpAddRace,RC_Undead,5; },{},{} 1527,Quadrille,Quadrille,5,20,,900,165,,1,0,0x00008110,63,2,2,4,40,1,8,{ bonus2 bAddRace,RC_Undead,10; bonus2 bAddRace,RC_DemiHuman,10; bonus2 bAddRace,RC_Player,10; bonus2 bAddEle,Ele_Earth,10; },{},{} 1528,Grand_Cross,Grand Cross,5,20,,1500,140,,1,0,0x00008110,63,2,2,4,40,1,8,{ bonus bAtkEle,Ele_Holy; skill "PR_TURNUNDEAD",3; bonus3 bAutoSpell,"PR_TURNUNDEAD",3,100; bonus2 bSPDrainValueRace,RC_Undead,1; bonus2 bSPGainRace,RC_Undead,3; },{},{} 1529,Iron_Driver,Iron Driver,5,20,,3000,155,,2,0,0x00008100,63,2,2,3,78,1,8,{},{},{} @@ -876,7 +876,7 @@ 1562,Bible_Of_Battlefield,Battlefield Textbook,5,20,,700,110,,1,1,0x00410100,63,2,2,4,80,0,15,{ bonus bInt,3; bonus3 bAutoSpell,"AL_BLESSING",3+(getskilllv("AL_BLESSING")>3)*(getskilllv("AL_BLESSING")-3),20; },{},{} 1563,Diary_Of_Great_Sage_C,Sage's Diary,5,1,,0,135,,1,0,0x00410100,63,2,2,3,1,0,15,{ bonus bMatk,140; bonus bAspdRate,5; /*Gold PC Room: bonus bBaseAtk,10; bonus bMatk,10;*/ },{},{} 1564,Encyclopedia,Encyclopedia,5,20,,2000,110:100,,1,2,0x00410100,63,2,2,3,70,1,15,{ bonus bInt,3; bonus bDex,2; bonus bCritical,20+((readparam(bLuk)*2)/10); },{},{} -1565,Death_Note,Ledger of Death,5,20,,1000,137:100,,1,2,0x00410100,63,2,2,4,85,1,15,{ bonus bStr,3; bonus bInt,3; bonus bLuk,-20; bonus2 bWeaponComaRace,RC_DemiHuman,10; bonus2 bWeaponComaRace,RC_Player,10; bonus bAspdRate,getrefine(); if(BaseJob==Job_Sage) bonus3 bAutoSpell,"NPC_HELLJUDGEMENT",5,20; },{},{} +1565,Death_Note,Ledger of Death,5,20,,1000,137:100,,1,2,0x00410100,63,2,2,4,85,1,15,{ bonus bStr,3; bonus bInt,3; bonus bLuk,-20; bonus2 bComaRace,RC_DemiHuman,10; bonus2 bComaRace,RC_Player,10; bonus bAspdRate,getrefine(); if(BaseJob==Job_Sage) bonus3 bAutoSpell,"NPC_HELLJUDGEMENT",5,20; },{},{} 1566,Diary_Of_Great_Basil,Diary Of Great Basil,5,20,,0,120:125,,1,0,0x00410100,63,2,2,1,0,0,15,{ bonus2 bAddClass,Class_All,50; },{},{} 1567,Hardback_C,Refined Hardcover Book,5,1,,0,168:100,,1,0,0x00410100,63,2,2,4,0,0,15,{ bonus bStr,5; bonus bDex,2; bonus bMatkRate,20; },{},{} 1568,Book_Of_Billows_,Book of Billows,5,35000,,750,90,,1,3,0x00410100,63,2,2,3,27,1,15,{ bonus bAtkEle,Ele_Water; },{},{} @@ -890,7 +890,7 @@ 1576,Krieger_Book1,Glorious Tablet,5,20,,0,90:115,,1,0,0x00410100,63,2,2,4,80,1,15,{ bonus bMatkRate,15; bonus2 bAddRace,RC_DemiHuman,80; bonus2 bAddRace,RC_Player,80; bonus2 bIgnoreDefRaceRate,RC_DemiHuman,25; bonus2 bIgnoreDefRaceRate,RC_Player,25; bonus bUnbreakableWeapon,0; .@r = getrefine(); if(.@r>5) { bonus2 bAddRace,RC_DemiHuman,pow(((.@r>14)?14:.@r)-4,2); bonus2 bAddRace,RC_Player,pow(((.@r>14)?14:.@r)-4,2); bonus2 bIgnoreDefRaceRate,RC_DemiHuman,5; bonus2 bIgnoreDefRaceRate,RC_Player,5; } if(.@r>8) autobonus "{ bonus bBaseAtk,200; }",30,3000,BF_WEAPON,"{ specialeffect2 EF_BASH3D; }"; },{},{} 1577,Krieger_Book2,Glorious Apocalypse,5,20,,0,90:115,,1,0,0x00410100,63,2,2,4,80,1,15,{ bonus2 bAddRace,RC_DemiHuman,80; bonus2 bAddRace,RC_Player,80; bonus2 bIgnoreDefRaceRate,RC_DemiHuman,25; bonus2 bIgnoreDefRaceRate,RC_Player,25; bonus bUnbreakableWeapon,0; .@r = getrefine(); if(.@r>5) bonus2 bIgnoreDefRaceRate,RC_DemiHuman,5; bonus2 bIgnoreDefRaceRate,RC_Player,5; if(.@r>8) { bonus bMatkRate,5; bonus bVariableCastrate,-5; bonus bDelayRate,-5; } },{},{} 1578,Book_Of_Prayer,Book Of Prayer,5,20,,0,140,,1,0,0x00410100,63,2,2,3,0,0,15,{ bonus bVit,2; bonus bMdef,2; bonus bMaxSPrate,10; },{},{} -1579,Death_Note_M,Book of the Dead,5,20,,1000,137,,1,2,0x00410100,63,2,2,4,85,1,15,{ bonus bMatkRate,15; bonus bStr,3; bonus bInt,3; bonus bLuk,-20; bonus2 bWeaponComaRace,RC_DemiHuman,10; bonus2 bWeaponComaRace,RC_Player,10; bonus bAspdRate,getrefine(); if(BaseJob==Job_Sage) bonus3 bAutoSpell,"NPC_HELLJUDGEMENT",5,20; },{},{} +1579,Death_Note_M,Book of the Dead,5,20,,1000,137,,1,2,0x00410100,63,2,2,4,85,1,15,{ bonus bMatkRate,15; bonus bStr,3; bonus bInt,3; bonus bLuk,-20; bonus2 bComaRace,RC_DemiHuman,10; bonus2 bComaRace,RC_Player,10; bonus bAspdRate,getrefine(); if(BaseJob==Job_Sage) bonus3 bAutoSpell,"NPC_HELLJUDGEMENT",5,20; },{},{} 1580,Encyclopedia_C,Giant Encyclopedia,5,0,,0,145:100,,1,0,0x00410100,63,2,2,3,0,0,15,{ bonus bMatkRate,15; bonus bInt,3; bonus bDex,2; bonus bCritical,20+((readparam(bLuk)*2)/10); bonus2 bAddSize,Size_All,40; },{},{} 1581,F_Diary_Of_Great_Sage_C,Diary Of Great Sage,5,1,,0,135,,1,2,0x00410100,63,2,2,3,1,0,15,{},{},{} 1582,E_Diary_Of_Great_Sage_C,Diary Of Great Sage,5,1,,0,135,,1,2,0x00410100,63,2,2,3,1,0,15,{},{},{} @@ -1640,7 +1640,7 @@ 2551,Rider_Insignia_M,Crest of the Rider,4,20,,500,,4,,1,0xFFFFFFFE,18,2,4,,55,1,0,{ bonus bAgi,2; },{},{} 2552,Mithril_Magic_Cape_M,Mithril Magic Manteau,4,20,,400,,3,,1,0x00098B1C,18,2,4,,70,1,0,{ bonus bMdef,3; bonus5 bAutoSpellWhenHit,"NPC_ANTIMAGIC",6,200,BF_MAGIC,0; },{},{} 2553,Dragon_Manteau,Dragon Manteau,4,20,,1000,,14,,1,0xFFFFFFFE,18,2,4,,0,1,0,{ bonus bAgi,1; bonus bMdef,5; },{},{} -2554,Piece_Of_Angent_Skin,Nydhorgg's Shadow Garb,4,20,,400,,25,,1,0xFFFFFFFE,18,2,4,,90,1,0,{ bonus2 bSubEle,Ele_Neutral,7; bonus2 bSubEle,Ele_Water,7; bonus2 bSubEle,Ele_Earth,7; bonus2 bSubEle,Ele_Fire,7; bonus2 bSubEle,Ele_Wind,7; bonus2 bSubEle,Ele_Poison,7; bonus2 bSubEle,Ele_Holy,7; bonus2 bSubEle,Ele_Dark,7; bonus2 bSubEle,Ele_Ghost,7; bonus2 bSubEle,Ele_Undead,7; bonus bMaxSP,(BaseLevel/3)+(getrefine()*10); bonus2 bSPGainAttackRate,100,1; bonus bMdef,3; },{},{} +2554,Piece_Of_Angent_Skin,Nydhorgg's Shadow Garb,4,20,,400,,25,,1,0xFFFFFFFE,18,2,4,,90,1,0,{ bonus2 bSubEle,Ele_Neutral,7; bonus2 bSubEle,Ele_Water,7; bonus2 bSubEle,Ele_Earth,7; bonus2 bSubEle,Ele_Fire,7; bonus2 bSubEle,Ele_Wind,7; bonus2 bSubEle,Ele_Poison,7; bonus2 bSubEle,Ele_Holy,7; bonus2 bSubEle,Ele_Dark,7; bonus2 bSubEle,Ele_Ghost,7; bonus2 bSubEle,Ele_Undead,7; bonus bMaxSP,(BaseLevel/3)+(getrefine()*10); bonus2 bSPDrainRate,10,1; bonus bMdef,3; },{},{} 2555,Freyja_SScarf7,Freyja Soul Scarf,4,20,,400,,4,,0,0xFFFFFFFF,63,2,4,,20,0,0,{ bonus bFlee,15; bonus2 bSubEle,Ele_Neutral,15; },{},{} 2556,Freyja_SScarf30,Freyja Soul Scarf,4,20,,400,,4,,0,0xFFFFFFFF,63,2,4,,20,0,0,{ bonus bFlee,15; bonus2 bSubEle,Ele_Neutral,15; },{},{} 2557,Freyja_SScarf60,Freyja Soul Scarf,4,20,,400,,4,,0,0xFFFFFFFF,63,2,4,,20,0,0,{ bonus bFlee,15; bonus2 bSubEle,Ele_Neutral,15; },{},{} @@ -2225,7 +2225,7 @@ 4169,Dark_Illusion_Card,Dark Illusion Card,6,20,,10,,,,,,,,769,,,,,{ bonus bMaxHPrate,-10; bonus bMaxSPrate,-10; bonus bVariableCastrate,-10; },{},{} 4170,Dark_Frame_Card,Dark Frame Card,6,20,,10,,,,,,,,16,,,,,{ bonus2 bAddEffWhenHit,Eff_Stone,600; },{},{} 4171,Dark_Priest_Card,Dark Priest Card,6,20,,10,,,,,,,,2,,,,,{ bonus2 bSPVanishRate,50,10; if(BaseJob==Job_Sage) bonus bSPDrainValue,1; },{},{} -4172,The_Paper_Card,The Paper Card,6,20,,10,,,,,,,,2,,,,,{ bonus bCritAtkRate,20; bonus bSPGainAttack,-1; },{},{} +4172,The_Paper_Card,The Paper Card,6,20,,10,,,,,,,,2,,,,,{ bonus bCritAtkRate,20; bonus bSPDrainValue,-1; },{},{} 4173,Demon_Pungus_Card,Demon Pungus Card,6,20,,10,,,,,,,,16,,,,,{ bonus2 bAddEffWhenHit,Eff_Sleep,600; },{},{} 4174,Deviling_Card,Deviling Card,6,20,,10,,,,,,,,4,,,,,{ bonus2 bSubEle,Ele_Neutral,50; bonus2 bSubEle,Ele_Water,-50; bonus2 bSubEle,Ele_Earth,-50; bonus2 bSubEle,Ele_Fire,-50; bonus2 bSubEle,Ele_Wind,-50; bonus2 bSubEle,Ele_Poison,-50; bonus2 bSubEle,Ele_Holy,-50; bonus2 bSubEle,Ele_Dark,-50; bonus2 bSubEle,Ele_Ghost,-50; bonus2 bSubEle,Ele_Undead,-50; },{},{} 4175,Poison_Toad_Card,Poisonous Toad Card,6,20,,10,,,,,,,,136,,,,,{ bonus3 bAutoSpell,"TF_POISON",1,20; bonus2 bAddSkillBlow,52,5; },{},{} @@ -2329,12 +2329,12 @@ 4273,Shellfish_Card,Shell Fish Card,6,20,,10,,,,,,,,2,,,,,{ bonus bBaseAtk,5; bonus2 bAddDamageClass,1073,30; },{},{} 4274,Zombie_Master_Card,Zombie Master Card,6,20,,10,,,,,,,,2,,,,,{ bonus2 bSPGainRace,RC_Undead,5; },{},{ heal 0,-5; } 4275,Zombie_Prisoner_Card,Zombie Prisoner Card,6,20,,10,,,,,,,,64,,,,,{ bonus2 bSubRace,RC_Undead,-20; bonus2 bExpAddRace,RC_Undead,10; },{},{} -4276,Lord_Of_Death_Card,Lord of The Dead Card,6,20,,10,,,,,,,,2,,,,,{ bonus3 bAddEff,Eff_Stun,500,ATF_SHORT; bonus3 bAddEff,Eff_Curse,500,ATF_SHORT; bonus3 bAddEff,Eff_Silence,500,ATF_SHORT; bonus3 bAddEff,Eff_Poison,500,ATF_SHORT; bonus3 bAddEff,Eff_Bleeding,500,ATF_SHORT; bonus2 bWeaponComaClass,Class_Normal,1; },{},{} +4276,Lord_Of_Death_Card,Lord of The Dead Card,6,20,,10,,,,,,,,2,,,,,{ bonus3 bAddEff,Eff_Stun,500,ATF_SHORT; bonus3 bAddEff,Eff_Curse,500,ATF_SHORT; bonus3 bAddEff,Eff_Silence,500,ATF_SHORT; bonus3 bAddEff,Eff_Poison,500,ATF_SHORT; bonus3 bAddEff,Eff_Bleeding,500,ATF_SHORT; bonus2 bComaClass,Class_Normal,1; },{},{} 4277,Zherlthsh_Card,Zealotus Card,6,20,,10,,,,,,,,32,,,,,{ bonus bLuk,2; bonus2 bSkillAtk,"BA_MUSICALSTRIKE",10; bonus2 bSkillAtk,"DC_THROWARROW",10; },{},{} 4278,Gibbet_Card,Gibbet Card,6,20,,10,,,,,,,,769,,,,,{ if(getrefine()<6) bonus bMdef,5; },{},{} 4279,Deleter_Card,Earth Deleter Card,6,20,,10,,,,,,,,16,,,,,{ bonus bSPrecovRate,-100; bonus bSPGainValue,10; },{},{ heal 0,-100; } 4280,Geographer_Card,Geographer Card,6,20,,10,,,,,,,,16,,,,,{ bonus3 bAutoSpellWhenHit,"AL_BLESSING",2+8*(getskilllv("AL_BLESSING")==10),30; },{},{} -4281,Zipper_Bear_Card,Zipper Bear Card,6,20,,10,,,,,,,,2,,,,,{ bonus bBaseAtk,30; bonus bSPGainAttack,-1; if(BaseClass==Job_Merchant) bonus bUnbreakableWeapon,0; },{},{} +4281,Zipper_Bear_Card,Zipper Bear Card,6,20,,10,,,,,,,,2,,,,,{ bonus bBaseAtk,30; bonus bSPDrainValue,-1; if(BaseClass==Job_Merchant) bonus bUnbreakableWeapon,0; },{},{} 4282,Tengu_Card,Tengu Card,6,20,,10,,,,,,,,136,,,,,{ bonus2 bAddMonsterDropItemGroup,IG_Recovery,600; },{},{} 4283,Greatest_General_Card,Greatest General Card,6,20,,10,,,,,,,,136,,,,,{ bonus3 bAutoSpell,"MO_CALLSPIRITS",5,2+18*(BaseClass==Job_Acolyte); },{},{} 4284,Chepet_Card,Chepet Card,6,20,,10,,,,,,,,2,,,,,{ bonus4 bAutoSpell,"AL_HEAL",5,50,1; },{},{} @@ -2592,7 +2592,7 @@ 4537,Sealed_Phreeoni_Card,Sealed Phreeoni Card,6,20,,10,,,,,,,,2,,,,,{ bonus bHit,((getrefine()>14)?75:50); },{},{} 4538,Sealed_Bacsojin_Card,Sealed White Lady Card,6,20,,10,,,,,,,,769,,,,,{ if (getrefine()>14) { bonus bHealPower,25; bonus bUseSPrate,20; } else { bonus bHealPower,15; bonus bUseSPrate,30; } },{},{} 4539,Sealed_F_Bishop_Card,Sealed Fallen Bishop Hibram Card,6,20,,10,,,,,,,,64,,,,,{ .@r = getrefine(); bonus bMatkRate,((.@r>14)?8:5); bonus bMaxSPrate,-50; set .@rate,((.@r>14)?33:25); bonus2 bMagicAddRace,RC_Angel,.@rate; bonus2 bMagicAddRace,RC_DemiHuman,.@rate; bonus2 bMagicAddRace,RC_Player,.@rate; },{},{} -4540,SLD_Lord_Of_Death_Card,Sealed Lord of The Dead Card,6,20,,10,,,,,,,,2,,,,,{ set .@rate, ((getrefine()>14)?350:250); bonus3 bAddEff,Eff_Stun,.@rate,ATF_SHORT; bonus3 bAddEff,Eff_Curse,.@rate,ATF_SHORT; bonus3 bAddEff,Eff_Silence,.@rate,ATF_SHORT; bonus3 bAddEff,Eff_Poison,.@rate,ATF_SHORT; bonus3 bAddEff,Eff_Bleeding,.@rate,ATF_SHORT; bonus2 bWeaponComaClass,Class_Normal,1; },{},{} +4540,SLD_Lord_Of_Death_Card,Sealed Lord of The Dead Card,6,20,,10,,,,,,,,2,,,,,{ set .@rate, ((getrefine()>14)?350:250); bonus3 bAddEff,Eff_Stun,.@rate,ATF_SHORT; bonus3 bAddEff,Eff_Curse,.@rate,ATF_SHORT; bonus3 bAddEff,Eff_Silence,.@rate,ATF_SHORT; bonus3 bAddEff,Eff_Poison,.@rate,ATF_SHORT; bonus3 bAddEff,Eff_Bleeding,.@rate,ATF_SHORT; bonus2 bComaClass,Class_Normal,1; },{},{} 4541,SLD_B_Katrinn_Card,Sealed High Wizard Card,6,20,,10,,,,,,,,769,,,,,{ bonus2 bIgnoreMdefClassRate,Class_Normal,100; .@r = getrefine(); if (.@r>14) { bonus bVariableCastrate,120; bonus bSPrecovRate,-120; } else { bonus bVariableCastrate,150; bonus bSPrecovRate,-150; } },{},{ heal 0,((.@r>14)?-2000:-3000); } 4542,SLD_Detale_Card,Sealed Detale Card,6,20,,10,,,,,,,,16,,,,,{},{},{} 4543,SLD_Garm_Card,Sealed Hatii Card,6,20,,10,,,,,,,,16,,,,,{ bonus2 bAddEffWhenHit,Eff_Freeze,((getrefine()>14)?4000:2500); },{},{} @@ -3411,7 +3411,7 @@ 5494,Spinx_Helm_I,Sphinx Hat,4,0,,0,,5,,0,0x00004082,63,2,257,,0,0,137,{ bonus bStr,5; },{},{} 5495,Power_Of_Thor,Power Of Thor,4,20,,100,,6,,1,0xFFFFFFFF,63,2,256,,0,1,493,{ bonus bInt,1; bonus bDex,1; bonus bMdef,3; bonus bFlee,5; },{},{} 5496,Dice_Hat,Dice Hat,4,20,,300,,3,,0,0xFFFFFFFF,63,2,256,,50,0,494,{ bonus bLuk,4; },{},{} -5497,King_Tiger_Doll_Hat,King Tiger Doll Hat,4,20,,400,,6,,1,0xFFFFFFFE,63,2,256,,1,1,495,{ bonus bStr,2; bonus bDex,2; bonus2 bAddRace,RC_Brute,10; bonus2 bMagicAddRace,RC_Brute,10; .@r = getrefine(); autobonus "{ bonus2 bSPLossRate,5,1000; bonus bBaseAtk,25*.@r; }",3*.@r,3000,BF_NORMAL,"{ transform 1115,3000; specialeffect2 EF_POTION_BERSERK; }"; autobonus2 "{ bonus2 bSPLossRate,5,1000; bonus bBaseAtk,25*.@r; }",.@r,3000,BF_NORMAL,"{ transform 1115,3000; specialeffect2 EF_POTION_BERSERK; }"; },{},{} +5497,King_Tiger_Doll_Hat,King Tiger Doll Hat,4,20,,400,,6,,1,0xFFFFFFFE,63,2,256,,1,1,495,{ bonus bStr,2; bonus bDex,2; bonus2 bAddRace,RC_Brute,10; bonus2 bMagicAddRace,RC_Brute,10; .@r = getrefine(); autobonus "{ bonus2 bSPLossRate,5,1000; bonus bBaseAtk,25*.@r; }",3*.@r,3000,BF_NORMAL,"{ transform 1115,3000; specialeffect2 EF_POTION_BERSERK; showscript \"Eddga Power !\"; }"; autobonus2 "{ bonus2 bSPLossRate,5,1000; bonus bBaseAtk,25*.@r; }",.@r,3000,BF_NORMAL,"{ transform 1115,3000; specialeffect2 EF_POTION_BERSERK; showscript \"Eddga Power !\"; }"; },{},{} 5498,Wondering_Wolf_Helm,Wandering Wolf Helm,4,20,,600,,5,,1,0xFFFFFFFE,63,2,768,,1,0,490,{ bonus bAgi,5; bonus bFlee,10; bonus2 bIgnoreDefRaceRate,RC_DemiHuman,10; bonus2 bIgnoreDefRaceRate,RC_Brute,10; if(getrefine()>=7){ bonus2 bAddEff,Eff_Bleeding,10; } if(getrefine()>=9){ bonus3 bAutoSpellWhenHit,"MC_LOUD",1,1; } },{},{} 5499,Pizza_Hat,Pizza Hat,4,20,,600,,0,,0,0xFFFFFFFF,63,2,256,,0,0,487,{ skill "SM_PROVOKE",1; },{},{} 5500,Icecream_Hat,Icecream Hat,4,0,,300,,6,,0,0xFFFFFFFF,63,2,256,,30,1,488,{ bonus bMdef,3; skill "MG_FROSTDIVER",3; },{},{} @@ -5276,6 +5276,7 @@ // 7674,Mysterious_Ingredient,Mysterious Ingredient,3,20,,0,,,,,,,,,,,,,{},{},{} 7675,Mysterious_Doll,Mysterious Doll,3,0,,0,,,,,,,,,,,,,{},{},{} +7676,Transmission_Coupon,Transmission Coupon,3,0,,0,,,,,,,,,,,,,{},{},{} 7679,Oneclick_Weapon_7UP,One Click Weapon 7UP,3,0,,0,,,,,,,,,,,,,{},{},{} 7680,Oneclick_Weapon_9UP,One Click Weapon 9UP,3,0,,0,,,,,,,,,,,,,{},{},{} 7681,Oneclick_Armor_7UP,One Click Armor 7UP,3,0,,0,,,,,,,,,,,,,{},{},{} @@ -6397,7 +6398,7 @@ 12536,NY_Rice_Cake_Soup,NY Rice Cake Soup,2,20,,100,,,,,0xFFFFFFFF,63,2,,,,,,{},{},{} 12537,Solo_Gift_Basket,Solo Gift Basket,2,1000,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ /*getgroupitem(IG_Solo_Gift_Basket);*/ getitem 597,5; getitem 596,3; getitem 561,3; getitem 573,4; getitem 559,10; getitem 560,10; },{},{} 12538,Couple_Event_Basket,Couple Event Basket,2,2000,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ /*getgroupitem(IG_Couple_Event_Basket);*/ getitem 14546,10; getitem 14547,10; getitem 14548,10; getitem 14549,10; getitem 14550,10; },{},{} -12539,Splendid_Box,Splendid Box,2,20,,100,,,,,0xFFFFFFFF,63,2,,,,,,{},{},{} +12539,Splendid_Box,Splendid Box,2,20,,100,,,,,0xFFFFFFFF,63,2,,,,,,{ getgroupitem(IG_Splendid_Box); },{},{} 12540,GM_Warp_Box,GM Warp Box,2,20,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ getgroupitem(IG_GM_Warp_Box); },{},{} 12541,Fortune_Cookie1,Fortune Cookie1,2,20,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ getrandgroupitem(IG_Fortune_Cookie1,1); },{},{} 12542,Fortune_Cookie2,Fortune Cookie2,2,20,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ getgroupitem(IG_Fortune_Cookie2); },{},{} @@ -6514,13 +6515,13 @@ 12655,Brain_Powder,Brain Powder,2,2000,,100,,,,,0xFFFFFFFF,63,2,,,,,,{},{},{} 12656,Magical_Powder,Magical Powder,2,3000,,200,,,,,0xFFFFFFFF,63,2,,,,,,{},{},{} 12657,Madness_Powder,Madness Powder,2,4000,,300,,,,,0xFFFFFFFF,63,2,,,,,,{},{},{} -12658,Trans_Scroll_Devi,Transformation Scroll(Deviruchi),2,20,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ transform 1109,1200000,SC_MTF_ASPD,10,5; },{},{} -12659,Trans_Scroll_Ray_Arch,Transformation Scroll(Raydric),2,20,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ transform 1276,1200000,SC_MTF_RANGEATK,25; },{},{} -12660,Trans_Scroll_Mavka,Transformation Scroll(Mavka),2,20,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ transform 1884,1200000,SC_MTF_RANGEATK,25; },{},{} -12661,Trans_Scroll_Marduk,Transformation Scroll(Marduk),2,20,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ transform 1140,1200000,SC_MTF_MATK,25; },{},{} -12662,Trans_Scroll_Banshee,Transformation Scroll(Banshee),2,20,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ transform 1867,1200000,SC_MTF_MATK,25; },{},{} -12663,Trans_Scroll_Poring,Transformation Scroll(Poring),2,20,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ transform 1002,1200000,SC_MTF_CRIDAMAGE,25; },{},{} -12664,Trans_Scroll_Golem,Transformation Scroll(Golem),2,20,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ transform 1040,1200000,SC_MTF_MLEATKED,5,20,2; },{},{} +12658,Trans_Scroll_Devi,Transformation Scroll(Deviruchi),2,20,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ transform 1109,1200000,SC_MTF_ASPD,10,5; showscript "Traaaansformation-!! Deviruchi form!!"; },{},{} +12659,Trans_Scroll_Ray_Arch,Transformation Scroll(Raydric),2,20,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ transform 1276,1200000,SC_MTF_RANGEATK,25; showscript "Traaaansformation-!! Raydric form!!"; },{},{} +12660,Trans_Scroll_Mavka,Transformation Scroll(Mavka),2,20,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ transform 1884,1200000,SC_MTF_RANGEATK,25; showscript "Traaaansformation-!! Mavka form!!"; },{},{} +12661,Trans_Scroll_Marduk,Transformation Scroll(Marduk),2,20,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ transform 1140,1200000,SC_MTF_MATK,25; showscript "Traaaansformation-!! Marduk form!!"; },{},{} +12662,Trans_Scroll_Banshee,Transformation Scroll(Banshee),2,20,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ transform 1867,1200000,SC_MTF_MATK,25; showscript "Traaaansformation-!! Banshee form!!"; },{},{} +12663,Trans_Scroll_Poring,Transformation Scroll(Poring),2,20,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ transform 1002,1200000,SC_MTF_CRIDAMAGE,25; showscript "Traaaansformation-!! Poring form!!"; },{},{} +12664,Trans_Scroll_Golem,Transformation Scroll(Golem),2,20,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ transform 1040,1200000,SC_MTF_MLEATKED,5,20,2; showscript "Traaaansformation-!! Golem form!!"; },{},{} 12665,Grovel_Buff,Grovel Buff,2,0,,0,,,,,0xFFFFFFFF,63,2,,,,,,{},{},{} 12666,Thai_Perfume_MATK,Thai Perfume MATK,2,20,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ specialeffect2 EF_MAGICALATTHIT; bonus_script "{ bonus bMatk,24; }",600,0,0,SI_SKF_MATK; },{},{} 12667,Thai_Perfume_ATK,Thai Perfume ATK,2,20,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ specialeffect2 EF_MAGICALATTHIT; bonus_script "{ bonus bBaseAtk,24; }",600,0,0,SI_SKF_ATK; },{},{} @@ -6653,12 +6654,12 @@ 12788,No100_Firecracker,No100 Firecracker,2,2,,20,,,,,0xFFFFFFFF,63,2,,,,,,{},{},{} 12789,Juicy_Fruit,Juicy Fruit,2,2,,100,,,,,0xFFFFFFFF,63,2,,,,,,{},{},{} 12790,Change_Name_Card,Character Name Change Coupon,2,0,,0,,,,,0xFFFFFFFF,63,2,,,,,,{ set CharRename, CharRename + 1; },{},{} -12791,Combat_Pill,Combat Pill,2,20,,150,,,,,0xFFFFFFFF,63,2,,,,,,{ specialeffect2 EF_POTION_BERSERK; bonus_script "{ bonus2 bAddDamageClass,Class_All,5; bonus bMatkRate,5; bonus bMaxHPrate,3; bonus bMaxSPrate,3; }",60,0,0,SI_GM_BATTLE; },{},{} +12791,Combat_Pill,Combat Pill,2,20,,150,,,,,0xFFFFFFFF,63,2,,,,,,{ specialeffect2 EF_POTION_BERSERK; bonus_script "{ bonus2 bAddDamageClass,Class_All,5; bonus bMatkRate,5; bonus bMaxHPrate,3; bonus bMaxSPrate,3; }",60,0,0,SI_GM_BATTLE; /* showscript */ },{},{} 12792,P_Combat_Pill,P Combat Pill,2,20,,150,,,,,0xFFFFFFFF,63,2,,,,,,{ specialeffect2 EF_POTION_BERSERK; bonus_script "{ bonus2 bAddDamageClass,Class_All,10; bonus bMatkRate,10; bonus bMaxHPrate,5; bonus bMaxSPrate,5; }",60,0,0,SI_GM_BATTLE2; },{},{} 12793,Combat_Pill_Box10,Combat Pill Box10,2,20,,0,,,,,0xFFFFFFFF,63,2,,,,,,{ getitem 12791,10; },{},{} 12794,P_Combat_Pill_Box10,P Combat Pill Box10,2,20,,0,,,,,0xFFFFFFFF,63,2,,,,,,{ getitem 12792,10; },{},{} 12795,2011_RWC_Scroll_Kr,2011 RWC Scroll Kr,2,20,,10,,,,,0xFFFFFFFF,63,2,,,,,,{},{},{} -12796,Red_Booster,Red Booster,2,20,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ itemskill "AC_CONCENTRATION",(getskilllv(45)<3?3:getskilllv(45)); },{},{} +12796,Red_Booster,Red Booster,2,20,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ itemskill "AC_CONCENTRATION",(getskilllv(45)<3?3:getskilllv(45)); specialeffect2 EF_POTION_BERSERK; showscript "Oh My GOODNESS!!! I FEEL AWESOMELY STRONG!!! WOWOW"; },{},{} 12797,Wish_Maiden_Scroll,Wish Maiden Scroll,2,20,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ mercenary_create 2344,1800000; },{},{} 12798,Zealotus_Scroll,Zealotus Scroll,2,20,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ mercenary_create 2345,1800000; },{},{} 12799,PCBang_Coupon_Box5,PCBang Coupon Box5,2,20,,10,,,,,0xFFFFFFFF,63,2,,,,,,{},{},{} @@ -7098,7 +7099,7 @@ 13400,Cutlas_,Cutlus,5,20,,900,150,,1,1,0x000654E2,63,2,2,4,40,1,2,{ skill "SM_BASH",5; bonus bStr,2; bonus bDef,1; },{},{} 13401,Excalibur_C,Excalibur,5,1,,0,199,,1,0,0x000654E2,63,2,2,4,1,0,2,{ bonus bInt,10; bonus bLuk,10; bonus bAtkEle,Ele_Holy; },{},{} 13402,Cutlas_C,Cutlus,5,2,,0,185,,1,0,0x000654E2,63,2,2,4,0,0,2,{ skill "SM_BASH",5; bonus bStr,2; bonus bDef,1; },{},{} -13403,Solar_Sword_C,Solar Sword,5,2,,0,120,,1,0,0x000654E2,63,2,2,4,0,0,2,{ bonus bAtkEle,Ele_Fire; bonus2 bSPLossRate,15,10; bonus bHPGainAttackRate,1; },{},{} +13403,Solar_Sword_C,Solar Sword,5,2,,0,120,,1,0,0x000654E2,63,2,2,4,0,0,2,{ bonus bAtkEle,Ele_Fire; bonus2 bSPLossRate,15,10; bonus2 bHPDrainRate,1000,1; },{},{} 13404,Platinum_Shotel,Platinum Shotel,5,20,,1500,130,,1,1,0x000654E2,63,2,2,4,55,1,2,{ bonus bCritical,50; },{},{} 13405,Curved_Sword,Curved Sword,5,20,,800,125,,1,2,0x000654E2,63,2,2,4,55,1,2,{ bonus bAspdRate,10; bonus2 bAddEff,Eff_Curse,300; },{},{} 13406,Edger,Edger,5,20,,0,120,,1,0,0x000654E2,63,2,2,1,0,0,2,{ bonus2 bAddClass,Class_All,50; },{},{} @@ -8302,7 +8303,7 @@ 15123,Whikebain_Suit,Whikebain Suit,4,0,,900,,56,,1,0x00001000,56,2,16,,105,1,,{ .@r = getrefine(); if (.@r > 7) { bonus bCritAtkRate,6; } else if (.@r > 5) { bonus bCritAtkRate,4; } bonus3 bAutoSpell,"DC_WINKCHARM",1,10; /* Confirm: Success rate */ },{},{} 15138,Aegir_Armor,Aegir Armor,4,10,,1600,,25,,0,0xFFFFFFFF,63,2,16,,40,1,,{ bonus bMaxHP,500; bonus bMaxSP,50; },{},{} 15141,Ancient_Armor_Of_The_Goddess,Ancient Armor Of The Goddess,4,10,,2000,,55,,0,0xFFFFFFFF,63,2,16,,100,1,,{},{},{} -15145,Evil_Dragon_Armor,Evil Dragon Armor,4,0,,4000,,60,,1,0xFFFFFFFF,63,2,16,,,1,,{ .@r = getrefine(); if (.@r >= 10 ) { bonus2 bHPGainAttackRate,100,3; bonus2 bSPGainAttackRate,100,5; } else if (.@r >= 9 ) { bonus2 bHPGainAttackRate,100,4; bonus2 bSPGainAttackRate,100,3; } else if (.@r >= 8 ) { bonus2 bHPGainAttackRate,100,6; bonus2 bSPGainAttackRate,100,2; } /* Confirm: Success rate and it says no effect if with Rideword, Vanargandr Helm, or Piece Of Angent Skin */ },{},{} +15145,Evil_Dragon_Armor,Evil Dragon Armor,4,0,,4000,,60,,1,0xFFFFFFFF,63,2,16,,,1,,{ .@r = getrefine(); if (.@r >= 10 ) { bonus2 bHPDrainRate,100,3; bonus2 bSPDrainRate,100,5; } else if (.@r >= 9 ) { bonus2 bHPDrainRate,100,4; bonus2 bSPDrainRate,100,3; } else if (.@r >= 8 ) { bonus2 bHPDrainRate,100,6; bonus2 bSPDrainRate,100,2; } /* Confirm: Success rate and it says no effect if with Rideword, Vanargandr Helm, or Piece Of Angent Skin */ },{},{} // More Maces 16000,Erde,Erde,5,20,,500,130,,1,2,0x0004C5B2,18,2,2,3,50,1,8,{ bonus2 bSkillAtk,"AM_ACIDTERROR",20; bonus2 bSkillAtk,"AM_DEMONSTRATION",20; bonus bMaxSP,50; bonus bHealPower,10; },{},{} 16001,Red_Square_Bag,Red Square Bag,5,20,,500,130,,1,2,0x0004C5B2,18,2,2,3,50,1,8,{ bonus bMaxHP,200; bonus2 bSkillAtk,"AM_ACIDTERROR",20; bonus2 bSkillAtk,"AM_DEMONSTRATION",20; bonus2 bAddMonsterDropItem,501,50; bonus2 bAddMonsterDropItem,502,20; bonus2 bAddMonsterDropItem,503,20; bonus2 bAddMonsterDropItem,504,20; bonus2 bAddMonsterDropItem,505,10; if(readparam(bStr)>=95) bonus2 bAddEff,Eff_Stun,500; },{},{} @@ -8998,6 +8999,7 @@ 17572,Erzulie_Lucky_Egg,Erzulie Lucky Egg,18,0,,10,,,,0,,,,,,,,,{/*TODO*/},{},{} 17584,Venus_Lucky_Egg,Venus Lucky Egg,18,0,,10,,,,0,,,,,,,,,{/*TODO*/},{},{} 17588,Amora_Lucky_Egg,Amora Lucky Egg,18,0,,10,,,,0,,,,,,,,,{/*TODO*/},{},{} +17598,Sograt_Lucky_Scroll,Sograt Lucky Scroll,18,0,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ getitem callfunc("F_Rand",20099,19024,2899,19910),1; /* and others. */ },{},{} // Mechanic/Genetic Cannonballs 18000,Cannon_Ball,Cannon Ball,10,100,,10,100,,,,0x00040400,56,2,32768,,99,,8,{},{},{} 18001,Holy_Cannon_Ball,Holy Cannon Ball,10,200,,10,120,,,,0x00040400,56,2,32768,,99,,8,{ bonus bAtkEle,Ele_Holy; },{},{} @@ -9126,15 +9128,15 @@ 18590,Gemma_Hairband,Gemma Hairband,4,20,,200,,3,,1,0xFFFFFFFF,63,2,256,,10,1,564,{ bonus bMdef,3; },{},{} 18591,Mini_Glasses_,Mini Glasses,4,20,,100,,2,,1,0xFFFFFFFE,63,2,512,,0,0,47,{},{},{} 18592,Nestea_Hat,Nestea Hat,4,20,,200,,5,,1,0xFFFFFFFF,63,2,256,,0,1,756,{ bonus bMdef,5; },{},{} -18593,Fancy_Mini_Crown,Fancy Mini Crown,4,20,,100,,2,,1,0xFFFFFFFF,63,2,256,,30,1,707,{ bonus bInt,1; bonus bMdef,5; },{},{} +18593,Fancy_Mini_Crown,Fancy Mini Crown,4,20,,100,,2,,1,0xFFFFFFFF,63,2,256,,30,1,707,{ bonus bInt,1; bonus bMdef,5; bonus bVariableCast,-3000; bonus bMatkRate,3; bonus bHealPower,4; bonus bSkillUseSP,-3; .@r = getrefine(); if (.@r > 6) bonus bMatkRate,3; else if (.@r > 4) bonus bMatkRate,1; },{},{} 18594,Magni_Cap_,Magni Cap,4,30000,,1000,,9,,1,0xFFFFFFFE,63,2,256,,0,1,250,{ bonus bStr,2; },{},{} -18595,Horn_Of_Ancient,Horn of Ancient,4,40,,200,,8,,1,0xFFFFFFFF,63,2,256,,50,1,757,{ autobonus "{ bonus bBaseAtk,100; }",5,10000,0,"{ specialeffect2 EF_POTION_BERSERK; }"; },{},{} +18595,Horn_Of_Ancient,Horn of Ancient,4,40,,200,,8,,1,0xFFFFFFFF,63,2,256,,50,1,757,{ bonus2 bSubClass,Class_Boss,10; bonus2 bAddClass,Class_Boss,10; .@r = getrefine(); if (.@r > 6) { autobonus "{ bonus bBaseAtk,100; }",10,10000,BF_WEAPON,"{ specialeffect2 EF_ENHANCE; }"; } if (.@r > 8) { bonus2 bSubClass,Class_Boss,10; bonus2 bAddClass,Class_Boss,10; } },{},{} 18596,Sprout_Hat,Sprout Hat,4,20,,200,,4,,0,0xFFFFFFFF,63,2,256,,70,1,758,{ skill "WZ_HEAVENDRIVE",3; },{},{} -18597,Mercury_Riser,Mercury Riser,4,40,,200,,10,,1,0xFFFFFFFF,63,2,256,,0,,759,{ bonus bAspdRate,3; bonus bCritical,3; .@r = getrefine(); if(.@r >= 7) { bonus bAspdRate,2; bonus bCritical,2; } if(.@r >= 9) { bonus bAspdRate,2; bonus bCritical,2; }},{},{} +18597,Mercury_Riser,Mercury Riser,4,40,,200,,10,,1,0xFFFFFFFF,63,2,256,,0,,759,{ bonus2 bSubRace,RC_DemiHuman,10; bonus2 bAddRace,RC_DemiHuman,10; bonus bAspdRate,3; bonus bDelayrate,-3; .@r = getrefine(); if(.@r >= 7) { bonus bAspdRate,2; bonus bDelayrate,-2; } if(.@r >= 9) { bonus bAspdRate,2; bonus bDelayrate,-2; }},{},{} 18598,Mini_Tree_J,Mini Tree J,4,20,,50,,0,,1,0xFFFFFFFF,63,2,256,,0,0,727,{ bonus bMdef,20; },{},{} 18599,Black_Devil_Mask,Black Devil Mask,4,20,,100,,0,,0,0xFFFFFFFF,63,2,512,,0,0,760,{ bonus bAllStats,2; },{},{} -18600,Cat_Ear_Beret,Cat Ear Beret,4,20,,100,,5,,1,0xFFFFFFFF,63,2,256,,0,1,761,{ bonus bAtkRate,5; .@r = getrefine(); if(.@r > 5 && .@r <= 12) { bonus2 bAddRace,RC_DemiHuman,(.@r - 5); bonus2 bSubRace,RC_DemiHuman,(.@r - 5); bonus2 bAddRace,RC_Player,(.@r - 5); bonus2 bSubRace,RC_Player,(.@r - 5); } if(.@r > 12) { bonus2 bAddRace,RC_DemiHuman,7; bonus2 bAddRace,RC_Player,7; bonus2 bSubRace,RC_DemiHuman,7; bonus2 bSubRace,RC_Player,7; } },{},{} -18601,Red_Bread_Hat,Red Bread Hat,4,20,,300,,0,,1,0xFFFFFFFF,63,2,256,,0,1,762,{ bonus bMdef,5; },{},{} +18600,Cat_Ear_Beret,Cat Ear Beret,4,20,,100,,5,,1,0xFFFFFFFF,63,2,256,,0,1,761,{ bonus bAtkRate,5; .@r = getrefine(); if(.@r < 5) .@r = 5; bonus2 bSubRace,RC_DemiHuman,(.@r - 5); bonus2 bAddRace,RC_DemiHuman,(.@r - 5); },{},{} +18601,Red_Bread_Hat,Red Bread Hat,4,20,,300,,0,,1,0xFFFFFFFF,63,2,256,,0,1,762,{ bonus bMdef,5; .@r = getrefine(); if (.@r < 5) .@r = 5; bonus2 bSubRace,RC_DemiHuman,(.@r - 5); bonus2 bMagicAddRace,RC_DemiHuman,(.@r - 5); },{},{} 18602,Watermelon_Bite,Watermelon Bite,4,20,,100,,4,,0,0xFFFFFFFF,63,2,1,,30,0,763,{ bonus bMdef,4; bonus2 bAddEle,Ele_Fire,4; },{},{} 18603,Black_Devil_Mask_,Black Devil Mask,4,20,,100,,0,,1,0xFFFFFFFF,63,2,512,,0,0,760,{ bonus bAllStats,1; },{},{} 18604,Falcon_Mask,Falcon Mask,4,10,,30,,0,,1,0xFFFFFFFF,63,2,513,,50,0,782,{},{},{} @@ -9163,14 +9165,14 @@ 18627,Dried_Leaf,Dried Leaf,4,20,,50,,0,,0,0xFFFFFFFF,63,2,1,,10,0,711,{ bonus bUnbreakableHelm,0; },{},{} 18628,Tare_Brownie,Tare Brownie,4,20,,500,,5,,1,0xFFFFFFFF,63,2,256,,50,0,781,{},{},{} 18629,B_Desert_Wolf_Hat,B Desert Wolf Hat,4,10,,300,,0,,1,0xFFFFFFFF,63,2,256,,1,1,783,{},{},{} -18630,Dep_Alice_Hat,Drooping Alicel,4,20,,500,,6,,0,0xFFFFFFFE,63,2,256,,70,1,784,{},{},{} -18631,Ribbon_Chef_Hat,Ribbon Chef Hat,4,20,,300,,5,,0,0xFFFFFFFF,63,2,256,,70,1,785,{ bonus bDex,3; bonus bLuk,1; },{},{} +18630,Dep_Alice_Hat,Drooping Alicel,4,20,,500,,6,,0,0xFFFFFFFE,63,2,256,,70,1,784,{ bonus2 bAddRace,RC_DemiHuman,10; bonus2 bAddRace,RC_Player,10; if (getrefine() > 10) { autobonus "{ bonus bAspdRate,100; }",10,7000,BF_WEAPON,"{ specialeffect2 EF_POTION_BERSERK; }"; } },{},{} +18631,Ribbon_Chef_Hat,Ribbon Chef Hat,4,20,,300,,5,,0,0xFFFFFFFF,63,2,256,,70,1,785,{ bonus bDex,3; bonus bLuk,1; if (getrefine() > 6) { bonus2 bAddMonsterDropItem,12125,500; bonus2 bAddMonsterDropItem,12126,500; bonus2 bAddMonsterDropItem,12127,400; bonus2 bAddMonsterDropItem,12128,300; bonus2 bAddMonsterDropItem,12129,200; } },{},{} 18632,Yellow_Poring_Hairpin,Yellow Poring Hairpin,4,20,,100,,3,,1,0xFFFFFFFF,63,2,256,,1,1,786,{},{},{} 18633,Pink_Poring_Hairpin,Pink Poring Hairpin,4,20,,100,,3,,1,0xFFFFFFFF,63,2,256,,1,1,787,{},{},{} 18634,Green_Poring_Hairpin,Green Poring Hairpin,4,20,,100,,3,,1,0xFFFFFFFF,63,2,256,,1,1,788,{},{},{} 18635,Blue_Poring_Hairpin,Blue Poring Hairpin,4,20,,100,,3,,1,0xFFFFFFFF,63,2,256,,1,1,789,{},{},{} -18636,Bridal_Ribbon,Bridal Ribbon,4,20,,200,,6,,0,0xFFFFFFFF,63,2,256,,30,1,790,{ bonus bDex,1; },{},{} -18637,Ancient_Admiral_Helm,Ancient Admiral Helm,4,20,,700,,4,,1,0xFFFFFFFF,63,2,768,,0,1,660,{ bonus bStr,2; bonus bVit,1; },{},{} +18636,Bridal_Ribbon,Bridal Ribbon,4,20,,200,,6,,0,0xFFFFFFFF,63,2,256,,30,1,790,{ bonus bDex,1; bonus3 bAutoSpellWhenHit,"DC_WINKCHARM",1,10; },{},{} +18637,Ancient_Admiral_Helm,Ancient Admiral Helm,4,20,,700,,4,,1,0xFFFFFFFF,63,2,768,,0,1,660,{ bonus bStr,2; bonus bVit,1; if (getrefine() > 7) bonus bSpeedRate,25; },{},{} 18638,Citron_Hat,Citron Hat,4,20,,400,,3,,0,0xFFFFFFFE,63,2,256,,1,1,791,{ bonus bLuk,3; bonus2 bSubRace,RC_Plant,10; },{},{} 18639,Naval_Officer_Hat,Naval Officer Hat,4,20,,200,,2,,0,0xFFFFFFFE,63,2,256,,1,1,792,{ bonus bLuk,3; bonus2 bAddEle,Ele_Water,5; },{},{} 18640,Starfish_Headband,Starfish Headband,4,20,,200,,2,,0,0xFFFFFFFE,63,2,256,,1,1,793,{},{},{} @@ -9183,15 +9185,15 @@ 18647,Star_Eyepatch,Star Eyepatch,4,20,,100,,0,,0,0xFFFFFFFF,63,2,256,,1,0,800,{ bonus2 bResEff,Eff_Stun,1500; },{},{} 18648,Tongue_Charm,Tongue Charm,4,20,,100,,0,,0,0xFFFFFFFF,63,2,1,,1,0,801,{ bonus2 bSubRace,RC_Demon,3; },{},{} 18649,Lude_Mask,Lude Mask,4,10,,100,,1,,0,0xFFFFFFFF,63,2,513,,0,1,802,{},{},{} -18650,RWC_Shouting_Mouth,RWC Shouting Mouth,4,20,,50,,0,,0,0xFFFFFFFF,63,2,1,,1,0,194,{},{},{} +18650,RWC_Shouting_Mouth,RWC Shouting Mouth,4,20,,50,,0,,0,0xFFFFFFFF,63,2,1,,1,0,194,{ bonus3 bAutoSpellWhenHit,"SM_ENDURE",1,10; bonus3 bAutoSpellWhenHit,"MO_CALLSPIRITS",5,10; bonus3 bAutoSpellWhenHit,"MO_EXPLOSIONSPIRITS",5,10; bonus3 bAutoSpell,"BS_MAXIMIZE",5,10; bonus3 bAutoSpell,"MC_LOUD",1,10; bonus3 bAutoSpell,"AC_CONCENTRATION",5,10; bonus3 bAutoSpell,"PR_GLORIA",3,10; autobonus "{ bonus bStr,3; bonus bAgi,3; }",10,5000,BF_WEAPON,"{ specialeffect2 EF_POTION_BERSERK; showscript \"RWC 2011 Fighting!!\"; }"; autobonus "{ bonus bInt,3; bonus bLuk,3; }",5,5000,BF_MAGIC,"{ specialeffect2 EF_ENERGYCOAT; showscript \"RWC 2011 Fighting!!\"; }"; },{},{} 18651,Ignis_Cap,Ignis Cap,4,20,,800,,8,,1,0xFFFFFFFF,63,2,256,,40,1,803,{},{},{} -18652,Vanargandr_Helm,Vanargandr Helm,4,20,,1500,,10,,1,0xFFFFFFFF,63,2,256,,80,1,804,{ bonus bMdef,5; .@r = getrefine(); if (.@r >= 9 ) { bonus2 bHPGainAttackRate,100,8; bonus2 bSPGainAttackRate,100,4; } else if (.@r >= 8 ) { bonus2 bHPGainAttackRate,100,5; bonus2 bSPGainAttackRate,100,2; } else if (.@r >= 7 ) { bonus2 bHPGainAttackRate,100,5; bonus2 bSPGainAttackRate,100,2; } else if (.@r >= 5 ) { bonus2 bHPGainAttackRate,100,3; bonus2 bSPGainAttackRate,100,1; } else { bonus2 bHPGainAttackRate,100,1; bonus2 bSPGainAttackRate,100,1; } /* Confirm: Success rate? */ },{},{} +18652,Vanargandr_Helm,Vanargandr Helm,4,20,,1500,,10,,1,0xFFFFFFFF,63,2,256,,80,1,804,{ bonus bMdef,5; .@r = getrefine(); if (.@r >= 9 ) { bonus2 bHPDrainRate,60,8; bonus2 bSPDrainRate,20,4; } else if (.@r >= 8 ) { bonus2 bHPDrainRate,50,5; bonus2 bSPDrainRate,10,2; } else if (.@r >= 7 ) { bonus2 bHPDrainRate,30,5; bonus2 bSPDrainRate,10,2; } else if (.@r >= 5 ) { bonus2 bHPDrainRate,10,3; bonus2 bSPDrainRate,10,1; } else { bonus2 bHPDrainRate,10,1; bonus2 bSPDrainRate,10,1; } },{},{} 18653,Deviruchi_Headphone,Deviruchi Headphone,4,20,,200,,8,,1,0xFFFFFFFF,63,2,256,,30,1,805,{ bonus bAgi,2; },{},{} 18655,Goedo_Monocle,Goedo Monocle,4,20,,100,,0,,0,0xFFFFFFFF,63,2,512,,50,0,23,{},{},{} -18656,Witch's_Pumpkin_Hat,Witch's Pumpkin Hat,4,20,,300,,10,,0,0xFFFFFFFF,63,2,256,,20,1,717,{ bonus bMdef,10; bonus bStr,2; bonus bInt,2; bonus2 bMagicAddRace,RC_Undead,15; bonus2 bMagicAddRace,RC_Demon,15; },{},{} +18656,Wit_Pumpkin_Hat,Witch's Pumpkin Hat,4,20,,300,,10,,0,0xFFFFFFFF,63,2,256,,20,1,717,{ bonus bMdef,10; bonus bStr,2; bonus bInt,2; bonus2 bMagicAddRace,RC_Undead,15; bonus2 bMagicAddRace,RC_Undead,15; bonus2 bMagicAddRace,RC_Demon,15; bonus2 bMagicAddRace,RC_Demon,15; },{},{} 18657,Pegasus_Wing_Ears,Pegasus Wing Ears,4,20,,500,,1,,0,0xFFFFFFFF,63,2,512,,80,0,568,{ bonus bUnbreakableHelm,0; if (BaseLevel >= 150) bonus bAspdRate,3; else if (BaseLevel >= 100) bonus bAspdRate,2; else if (BaseLevel >= 50) bonus bAspdRate,1; },{},{} 18658,Holy_Santa_Beard,Holy Santa Beard,4,20,,100,,0,,0,0xFFFFFFFF,63,2,1,,1,0,25,{},{},{} -18659,Boitata_Hat,Boitata Hat,4,20,,0,,5,,1,0xFFFFFFFF,63,2,768,,0,1,808,{},{},{} +18659,Boitata_Hat,Boitata Hat,4,20,,0,,5,,1,0xFFFFFFFF,63,2,768,,0,1,808,{ autobonus "{ bonus bAtkEle,Ele_Fire; }",10,180000,BF_WEAPON,"{ specialeffect2 EF_ENHANCE; }"; bonus3 bAutospell,"AS_SONICBLOW",5,10; },{},{} 18660,Indi_Feather_Band,Indian Feather Headband,4,20,,400,,3,,1,0xFFFFFFFE,63,2,256,,0,1,809,{ bonus bAgi,2; },{},{} 18661,Trident_Helm,Trident Helm,4,20,,400,,3,,1,0xFFFFFFFE,63,2,256,,20,1,810,{ bonus bStr,2; },{},{} 18662,Antler_Fedora,Antler Fedora,4,20,,400,,3,,0,0xFFFFFFFE,63,2,256,,1,1,811,{ bonus bInt,3; },{},{} @@ -9203,7 +9205,7 @@ 18668,Droopy_Turtle_Hat,Droopy Turtle Hat,4,20,,300,,1,,1,0xFFFFFFFE,63,2,256,,1,1,694,{ skill "AL_DECAGI",3; },{},{} 18669,Cowhide_Hat,Cowhide Hat,4,20,,200,,3,,1,0xFFFFFFFE,63,2,256,,1,1,819,{ bonus bDex,2; bonus bMaxHPrate,1; },{},{} 18670,Hankie_In_Mouth,Hankie In Mouth,4,20,,100,,1,,0,0xFFFFFFFF,63,2,1,,12,0,818,{ bonus2 bSubRace,RC_DemiHuman,3; bonus2 bSubRace,RC_Player,3; },{},{} -18671,Rudolf_Hairband,Rudolf Hairband,4,20,,200,,5,,0,0xFFFFFFFF,63,2,256,,30,1,836,{ bonus3 bAutoSpell,"AL_INCAGI",10,50; bonus3 bAutoSpellWhenHit,"AL_INCAGI",10,50; bonus2 bAddItemHealRate,515,2000; },{},{} +18671,Rudolf_Hairband,Rudolf Hairband,4,20,,200,,5,,0,0xFFFFFFFF,63,2,256,,30,1,836,{ bonus3 bAutoSpell,"AL_INCAGI",10,50; bonus3 bAutoSpellWhenHit,"AL_INCAGI",10,50; bonus2 bAddItemHealRate,515,2000; autobonus "{ bonus bLuk,20; }",10,50000,BF_WEAPON,"{ specialeffect2 EF_POTION_BERSERK; /* showscript */ }"; autobonus2 "{ bonus bStr,20; }",10,50000,BF_WEAPON,"{ specialeffect2 EF_POTION_BERSERK; /* showscript */ }"; },{},{} 18672,Tare_Pope,Tare Pope,4,20,,300,,0,,0,0xFFFFFFFF,63,2,256,,1,0,817,{ bonus bUnbreakableHelm,0; },{},{} 18673,Tare_Pope_,Tare Pope,4,20,,300,,0,,1,0xFFFFFFFF,63,2,256,,1,0,817,{ bonus bUnbreakableHelm,0; bonus bSPrecovRate,2; },{},{} 18674,Planewing_Hat,Planewing Hat,4,20,,200,,3,,1,0xFFFFFFFE,63,2,256,,1,1,820,{ bonus bAgi,3; },{},{} @@ -9306,7 +9308,7 @@ 18806,Black_Rabbit_Hat,Black Rabbit Hat,4,20,,300,,2,,1,0xFFFFFFFF,63,2,256,,0,1,923,{ bonus bDex,2; bonus bAgi,3; bonus3 bAutoSpellWhenHit,"AL_INCAGI",5,10; },{},{} 18807,Yellow_Yuzu_Hat,Yellow Yuzu Hat,4,20,,400,,3,,1,0xFFFFFFFE,63,2,256,,0,1,924,{ bonus bVit,2; bonus bLuk,3; bonus2 bSubRace,RC_Plant,10; },{},{} 18808,Wing_Form_Spectacle,Wing Form Spectacle,4,20,,100,,1,,0,0xFFFFFFFF,63,2,256,,0,1,925,{ bonus bAgi,1; },{},{} -18810,Hell_Pumpkin_Hat,Hell Pumpkin Hat,4,20,,500,,12,,0,0xFFFFFFFF,63,2,256,,0,1,717,{ bonus bMdef,12; bonus2 bSubRace,6,5; bonus2 bSubRace,RC_DemiHuman,5; bonus2 bSubRace,RC_Player,5; bonus2 bSubRace,RC_Undead,-5; },{},{} +18810,Hell_Pumpkin_Hat,Hell Pumpkin Hat,4,20,,500,,12,,0,0xFFFFFFFF,63,2,256,,0,1,717,{ bonus bMdef,12; bonus2 bSubRace,RC_Demon,5; bonus2 bSubRace,RC_Undead,5; bonus2 bSubRace,RC_DemiHuman,5; bonus2 bSubRace,RC_Player,5; },{},{} 18813,New_Wave_Sunglasses,New Wave Sunglasses,4,10,,100,,,,0,0xFFFFFFFF,63,2,512,,30,,856,{ bonus bDelayrate,-10; },{},{} 18814,Angel_School_Cap,Angel School Cap,4,20,,100,,4,,1,0xFFFFFFFE,63,2,256,,0,1,927,{ bonus bInt,2; bonus bVit,1; },{},{} 18815,Devil_School_Cap,Devil School Cap,4,20,,100,,4,,1,0xFFFFFFFE,63,2,256,,0,1,928,{ bonus bStr,2; bonus bVit,1; },{},{} @@ -9332,9 +9334,9 @@ 18848,Fresh_Roses,Fresh Roses,4,10,,200,0:20,0,,1,0xFFFFFFFF,63,2,256,,1,1,963,{ bonus bMagicHPGainValue,100; bonus bMagicSPGainValue,100; },{},{} 18849,Celine_Ribbon,Celine Ribbon,4,10,,200,,,,1,0xFFFFFFFF,63,2,256,,1,1,967,{ bonus bDex,3; bonus bMatk,40+getrefine(); bonus bMagicHPGainValue,200; bonus2 bHPLossRate,50,5000; },{},{} 18850,Polar_Bear_Cap,Polar Bear Cap,4,20,,300,,7,,0,0xFFFFFFFF,63,2,256,,1,0,966,{ bonus bUnbreakableHelm,0; bonus bDex,1; bonus bAgi,1; bonus bMdef,3; bonus bHPrecovRate,5; bonus bSPrecovRate,3; bonus2 bAddMonsterDropItem,12354,100; },{},{} -18851,C_Polar_Bear_Cap,Costume Polar Bear Cap,4,20,,0,,0,,0,0xFFFFFFFF,63,2,1024,,1,1,966,{},{},{} +18851,C_Polar_Bear_Cap,Costume Polar Bear Cap,4,20,,0,,0,,0,0xFFFFFFFF,63,2,1024,,1,1,966,{ /*Is this correct item?*/ },{},{} 18855,Aviator_Hat,Aviator Hat,4,10,,100,,10,,0,0xFFFFFFFF,63,2,256,,1,1,972,{ bonus bAgi,3; bonus bInt,3; autobonus "{ bonus bAtkEle,Ele_Wind; }",500,180,BF_NORMAL; },{},{} -18856,W_King_Tiger_Doll_Hat,W King Tiger Doll Hat,4,10,,0,,10,,0,0xFFFFFFFF,63,2,256,,1,1,973,{ bonus bStr,2; bonus bDex,2; bonus2 bAddRace,RC_Brute,10; .@r = getrefine(); autobonus "{ bonus2 bSPLossRate,5,1000; bonus bBaseAtk,25*.@r; }",3*.@r,3000,BF_NORMAL,"{ transform 1115,3000; specialeffect2 EF_POTION_BERSERK; }"; autobonus2 "{ bonus2 bSPLossRate,5,1000; bonus bBaseAtk,25*.@r; }",.@r,3000,BF_NORMAL,"{ transform 1115,3000; specialeffect2 EF_POTION_BERSERK; }"; },{},{} +18856,W_King_Tiger_Doll_Hat,W King Tiger Doll Hat,4,10,,0,,10,,0,0xFFFFFFFF,63,2,256,,1,1,973,{ bonus bStr,2; bonus bDex,2; bonus2 bAddRace,RC_Brute,10; .@r = getrefine(); autobonus "{ bonus2 bSPLossRate,5,1000; bonus bBaseAtk,25*.@r; }",3*.@r,3000,BF_NORMAL,"{ transform 1115,3000; specialeffect2 EF_POTION_BERSERK; showscript \"Traaaansformation-!! Eddga form!!\"; }"; autobonus2 "{ bonus2 bSPLossRate,5,1000; bonus bBaseAtk,25*.@r; }",.@r,3000,BF_NORMAL,"{ transform 1115,3000; specialeffect2 EF_POTION_BERSERK; showscript \"Traaaansformation-!! Eddga form!!\"; }"; },{},{} 18857,Curupira_Hat,Curupira Hat,4,10,,100,,20,,0,0xFFFFFFFF,63,2,256,,1,1,974,{ bonus bDex,3; bonus2 bAddEffWhenHit,Eff_Confusion,500; },{},{} 18859,Angeling_Bubble,Angeling Bubble,4,10,,50,,5,,0,0xFFFFFFFF,63,2,1,,1,,975,{ bonus bDex,1; bonus bMatkRate,2; bonus bMaxHP,100; },{},{} 18861,Zaha_Doll_J_Hat,Zaha Doll J Hat,4,10,,100,,,,0,0xFFFFFFFF,63,2,256,,50,1,461,{ bonus bHealPower,15; bonus bUseSPrate,15; },{},{} @@ -9402,6 +9404,7 @@ 19019,Elemental_Crown,Elemental Crown,4,0,,500,,10,,1,0xFFFFFFFF,63,2,256,,,1,1219,{ .@r = getrefine(); bonus bDex,(3 + (.@r/2)+ (readparam(bDex) > 130 ? .@r : 0)); bonus bLongAtkRate,4; },{},{} 19020,Survive_Circlet,Survive Circlet,4,0,,500,,10,,1,0xFFFFFFFF,63,2,256,,,1,1220,{ .@r = getrefine(); bonus bInt,(3 + (.@r/2)+ (BaseLevel > 130 ? .@r : 0)); bonus bMatkRate,4; },{},{} 19021,Gigant_Helm,Gigant Helm,4,0,,500,,10,,1,0xFFFFFFFF,63,2,256,,,1,1221,{ bonus bStr,3+((BaseLevel > 130) ? getrefine() : 0); bonus bAtkRate,4; },{},{} +19024,Protect_Feathers,Protect Feathers,4,0,,500,,,,0,0xFFFFFFFF,63,2,512,1,70,1,1232,{ bonus2 bSubRace,RC_DemiHuman,2; bonus2 bSubRace,RC_Player,2; bonus bAspdRate,-5; .@vit = readparam(bVit); if (.@vit >= 108) { bonus2 bSubRace,RC_DemiHuman,3; bonus2 bSubRace,RC_Player,3; bonus bAspdRate,-5; } if (.@vit >= 120) { bonus bMaxHPRate,3; bonus bMdef,3; } },{},{} 19026,Aegir_Helm,Aegir Helm,4,10,,800,,10,,0,0xFFFFFFFF,63,2,256,,40,1,870,{ bonus bVit,3; },{},{} 19030,Pretty_Rabbit_Hood,Pretty Rabbit Hood,4,10,,100,,20,,0,0xFFFFFFFF,63,2,1,,1,1,1085,{ bonus bMaxHP,(15*BaseLevel); },{},{} 19031,Fallen_Angel_Blessing,Fallen Angel Blessing,4,0,,200,,1,,0,0xFFFFFFFF,63,2,512,,,1,1250,{ bonus2 bAddRace,RC_Angel,5; bonus2 bSubRace,RC_Angel,5; },{},{} @@ -9445,12 +9448,12 @@ 19530,C_Wild_Rose,Costume Wild Rose,4,0,,0,,0,,0,0xFFFFFFFF,63,2,1024,,1,0,541,{ bonus bUnbreakableHelm,0; bonus bBaseAtk,2; bonus bMatk,2; },{},{} 19531,C_Cube_Mask,Costume Cube Mask,4,0,,0,,0,,0,0xFFFFFFFF,63,2,6144,,0,0,472,{ bonus bUnbreakableHelm,0; bonus bFlee,1; },{},{} 19532,C_Red_Bunny_Band,Red Bunny Band,4,0,,0,,0,,0,0xFFFFFFFF,63,2,1024,,1,0,640,{ bonus bUnbreakableHelm,0; bonus bDex,1; },{},{} -19533,C_Spore_Hat,Costume Spore Hat,4,0,,0,,0,,0,0xFFFFFFFF,63,2,1024,,1,0,114,{ bonus bUnbreakableHelm,0; bonus bVit,1; bonus2 bExpAddClass,Class_All,1; },{},{} -19534,C_Tha_Despero_Mask,Costume Thanatos Despero Mask,4,20,,0,,0,,0,0xFFFFFFFF,63,2,513,,1,0,693,{ bonus bAtkRate,1; bonus bMatkRate,1; bonus bHealPower,1; },{},{} -19535,C_Sinsuncho_Hat,Costume Sinsuncho Hat,4,0,,0,,0,,0,0xFFFFFFFF,63,2,1024,,1,0,730,{ bonus bUnbreakableHelm,0; bonus bStr,1; bonus2 bExpAddClass,Class_All,1; },{},{} +19533,C_Spore_Hat,Costume Spore Hat,4,0,,0,,0,,0,0xFFFFFFFF,63,2,1024,,1,0,114,{ bonus bUnbreakableHelm,0; bonus bVit,1; bonus2 bExpAddRace,RC_All,1; },{},{} +19534,C_Tha_Despero_Mask,Costume Thanatos Despero Mask,4,20,,0,,0,,0,0xFFFFFFFF,63,2,513,,1,0,693,{ bonus2 bAddClass,Class_All,1; bonus bMatkRate,1; bonus bHealPower,1; },{},{} +19535,C_Sinsuncho_Hat,Costume Sinsuncho Hat,4,0,,0,,0,,0,0xFFFFFFFF,63,2,1024,,1,0,730,{ bonus bUnbreakableHelm,0; bonus bStr,1; bonus2 bExpAddRace,RC_All,1; },{},{} 19536,C_Rose_Corsage,Costume Rose Corsage,4,0,,0,,0,,0,0xFFFFFFFF,63,2,1024,,1,0,533,{ bonus bUnbreakableHelm,0; bonus bInt,1; },{},{} 19537,C_Gryphon_Hat,Costume Gryphon Hat,4,0,,0,,0,,0,0xFFFFFFFF,63,2,1024,,1,0,591,{ bonus bUnbreakableHelm,0; },{},{} -19538,Full_Moon,Full Moon,4,0,,0,,0,,0,0xFFFFFFFF,63,2,1024,,1,0,780,{ autobonus "{ bonus bMatk,50; bonus bBaseAtk,50; }",10,5000; },{},{} +19538,Full_Moon,Full Moon,4,0,,0,,0,,0,0xFFFFFFFF,63,2,1024,,1,0,780,{ autobonus "{ bonus bBaseAtk,50; }",10,5000,BF_WEAPON,"{ specialeffect2 EF_POTION_BERSERK; /* showscript */ }"; autobonus "{ bonus bMatk,50; }",5,5000,BF_MAGIC,"{ specialeffect2 EF_ENERGYCOAT; /* showscript */ }"; },{},{} 19539,C_Reginleif_Hairband,Costume Hairband Of Reginleif,4,20,,0,,0,,0,0xFFFFFFFF,63,2,1024,,1,0,468,{ bonus bAllStats,1; },{},{} 19540,C_Rabbit_Earplug,Costume Rabbit Earplugs,4,20,,0,,0,,0,0xFFFFFFFF,63,2,7168,,1,0,515,{ bonus bAgi,1; bonus bFlee,2; },{},{} 19541,C_Romantic_White_Flower,Costume Romantic White Flower,4,20,,0,,0,,0,0xFFFFFFFF,63,2,4096,,1,0,259,{ bonus bUnbreakableHelm,0; },{},{} @@ -9720,7 +9723,8 @@ 20095,C_Red_Ribbon,Costume Red Ribbon,4,0,,0,,,,0,0xFFFFFFFF,63,2,1024,,1,1,440,{},{},{} 20096,C_Blue_Ribbon,Costume Blue Ribbon,4,0,,0,,,,0,0xFFFFFFFF,63,2,1024,,1,1,441,{},{},{} 20097,C_White_Ribbon,Costume White Ribbon,4,0,,0,,,,0,0xFFFFFFFF,63,2,1024,,1,1,442,{},{},{} -20110,C_Coiledup_Snake,Costume Coiledup Snake,4,0,,0,,,,0,0xFFFFFFFF,63,2,1024,,1,1,,{/*TODO: View ID*/},{},{} +20099,C_Flying_Ljosalfar,Flying Ljosalfar,4,0,,0,,,,0,0xFFFFFFFF,63,2,1024,1,1,1,1239,{},{},{} +20110,C_Coiledup_Snake,Costume Coiledup Snake,4,0,,0,,,,0,0xFFFFFFFF,63,2,1024,,1,1,1258,{},{},{} 20118,C_Cake_Hat,Costume Cake Hat,4,0,,0,,,,0,0xFFFFFFFF,63,2,1024,,1,1,109,{},{},{} 20119,C_Beanie,Costume Beanie,4,0,,0,,,,0,0xFFFFFFFF,63,2,1024,,1,1,160,{},{},{} 20120,C_Aerial,Costume Aerial,4,0,,0,,,,0,0xFFFFFFFF,63,2,1024,,1,1,97,{},{},{} @@ -9778,7 +9782,7 @@ // 20500,T_Archangel_Wing,Archangel Wing,4,0,,0,,0,,0,0xFFFFFFFF,63,2,8192,,1,0,1,{ bonus bUnbreakableHelm,0; },{},{} 20600,Fantastic_Aura,Fantastic Aura,4,0,,0,,0,,0,0xFFFFFFFF,63,2,8192,,1,0,0,{ /*View ID*/ bonus bUnbreakableHelm,0; },{},{} -20700,Egir_Manteau,Egir Manteau,4,200000,,300,,10,,1,0xFFFFFFFF,63,2,4,,110,1,0,{ bonus bUnbreakableHelm,0; },{},{} +20700,Egir_Manteau,Egir Manteau,4,200000,,300,,10,,1,0xFFFFFFFF,63,2,4,,110,1,0,{ bonus bUnbreakableGarment,0; .@r = getrefine(); if (.@r > 10) .@r = 10; if (BaseClass == Job_Mage || BaseClass == Job_Archer || BaseClass == Job_Acolyte) { bonus bFlee2,5+(.@r*2); } else if (BaseClass == Job_Swordman || BaseClass == Job_Merchant || BaseClass == Job_Thief) { bonus bShortWeaponDamageReturn,5+(.@r*2); } },{},{} 20706,Amistr_Bag,Amistr Bag,4,10,,500,,18,,0,0xFFFFFFFF,63,2,4,,1,,4,{ bonus bAllStats,1; bonus2 bSubEle,Ele_All,5; },{},{} 20707,Kirin_Wing,Kirin Wing,4,20,,0,,18,,0,0xFFFFFFFF,63,2,4,,0,1,6,{ bonus bAllStats,1; bonus2 bSubRace,RC_DemiHuman,5; bonus2 bSubRace,RC_Player,5; },{},{} 20710,Impr_Angel's_Warmth,Advanced Angelic Cardigan,4,10000,,400,,6,,1,0x00000001,63,2,4,,99,1,0,{ bonus bHPrecovRate,50; },{},{} @@ -9786,7 +9790,7 @@ 20717,Gigant_Snake_Skin,Gigant Snake Skin,4,10,,400,,38,,0,0xFFFFFFFF,63,2,4,,1,1,0,{ bonus bMdef,10; },{},{} 20718,Gigant_Snake_Skin,Gigant Snake Skin,4,10,,400,,38,,1,0xFFFFFFFF,63,2,4,,1,1,0,{ bonus bMdef,10; },{},{} 20721,Black_As_Night_Cloak,Black As Night Cloak,4,10,,600,,45,,1,0xFFFFFFFF,63,2,4,,120,1,0,{ bonus2 bSubEle,Ele_Holy,5+(getrefine()/2); },{},{} -20724,Love_Dad_Wings_2012,Love Dad Wings 2012,4,0,,100,,15,,1,0xFFFFFFFF,63,2,4,,1,1,5,{},{},{} +20724,Love_Dad_Wings_2012,Love Dad Wings 2012,4,0,,100,,15,,1,0xFFFFFFFF,63,2,4,,1,1,5,{ .@r = getrefine(); bonus bAllStats,1; if ((readparam(bStr)>89)) { bonus bStr,.@r; bonus bMaxHPRate,1; bonus bMaxSPRate,1; } if ((readparam(bAgi)>89)) { bonus bAgi,.@r; bonus bMaxHPRate,1; bonus bMaxSPRate,1; } if ((readparam(bVit)>89)) { bonus bVit,.@r; bonus bMaxHPRate,1; bonus bMaxSPRate,1; } if ((readparam(bInt)>89)) { bonus bInt,.@r; bonus bMaxHPRate,1; bonus bMaxSPRate,1; } if ((readparam(bDex)>89)) { bonus bDex,.@r; bonus bMaxHPRate,1; bonus bMaxSPRate,1; } if ((readparam(bLuk)>89)) { bonus bLuk,.@r; bonus bMaxHPRate,1; bonus bMaxSPRate,1; } },{},{} 20725,Ribbon_Piamat,Ribbon Piamat,4,10,,100,0:10,,,0,0xFFFFFFFF,63,2,4,,30,1,7,{ bonus bInt,1; bonus bDex,1; },{},{} 20727,Brilliant_Golden_Wings,Brilliant Golden Wings,4,10,,0,,,,0,0xFFFFFFFF,63,2,8192,,1,1,5,{},{},{} 20730,Loyalists_Hood,Loyalists Hood,4,10,,200,,30,,0,0xFFFFFFFF,63,2,8192,,80,,,{ bonus bStr,2; bonus bMaxHPrate,10; bonus bNoKnockback,1; bonus2 bSubEle,Ele_All,-20; },{},{} @@ -9905,15 +9909,15 @@ 22628,Green_Package,Green Package,18,0,,100,,,,,0xFFFFFFFF,63,2,,,,,,{ getitem 17162,1; getitem 14534,5; getitem 12323,20; getitem 12324,20; getitem 12325,10; getitem 14533,2; getitem 22629,1; },{},{} 22629,Green_Package40,Green Package 40,18,0,,100,,,,,0xFFFFFFFF,63,2,,,,,,{ getitem 14289,1; getitem 12215,10; getitem 12216,10; getitem 14534,10; getitem 14533,5; getitem 12766,5; getitem 22630,1; },{},{} 22630,Green_Package80,Green Package 80,18,0,,100,,,,,0xFFFFFFFF,63,2,,,,,,{ getitem 7621,5; getitem 12209,5; getitem 14527,10; getitem 14533,5; getitem 12766,5; getitem 22631,1; },{},{} -22631,Green_Package99,Green Package 99,18,0,,100,,,,,0xFFFFFFFF,63,2,,,,,,{ getitem 12213,1; /*getitem Transmission_Coupon,1;*/ getitem 5883,1; },{},{} +22631,Green_Package99,Green Package 99,18,0,,100,,,,,0xFFFFFFFF,63,2,,,,,,{ getitem 12213,1; getitem 7676,1; getitem 5883,1; },{},{} 22640,17173_Green_Package,Green Package,18,0,,100,,,,,0xFFFFFFFF,63,2,,,,,,{ getitem 17162,1; getitem 14534,5; getitem 12323,20; getitem 12324,20; getitem 12325,10; getitem 14533,2; getitem 22641,1; },{},{} 22641,17173_Green_Package40,Green Package 40,18,0,,100,,,,,0xFFFFFFFF,63,2,,,,,,{ getitem 14289,1; getitem 12215,10; getitem 12216,10; getitem 14534,10; getitem 14533,5; getitem 12766,5; getitem 22642,1; },{},{} 22642,17173_Green_Package80,Green Package 80,18,0,,100,,,,,0xFFFFFFFF,63,2,,,,,,{ getitem 7621,5; getitem 12209,5; getitem 14527,10; getitem 14533,5; getitem 12766,5; getitem 22643,1; },{},{} -22643,17173_Green_Package99,Green Package 99,18,0,,100,,,,,0xFFFFFFFF,63,2,,,,,,{ getitem 12213,1; /*getitem Transmission_Coupon,1;*/ getitem 5883,1; },{},{} +22643,17173_Green_Package99,Green Package 99,18,0,,100,,,,,0xFFFFFFFF,63,2,,,,,,{ getitem 12213,1; getitem 7676,1; getitem 5883,1; },{},{} 22644,S_Green_Package,Green Package,18,0,,100,,,,,0xFFFFFFFF,63,2,,,,,,{ getitem 17162,1; getitem 14534,5; getitem 12323,20; getitem 12324,20; getitem 12325,10; getitem 14533,2; getitem 22645,1; },{},{} 22645,S_Green_Package40,Green Package 40,18,0,,100,,,,,0xFFFFFFFF,63,2,,,,,,{ getitem 14289,1; getitem 12215,10; getitem 12216,10; getitem 14534,10; getitem 14533,5; getitem 12766,5; getitem 22646,1; },{},{} 22646,S_Green_Package80,Green Package 80,18,0,,100,,,,,0xFFFFFFFF,63,2,,,,,,{ getitem 7621,5; getitem 12209,5; getitem 14527,10; getitem 14533,5; getitem 12766,5; getitem 22647,1; },{},{} -22647,S_Green_Package99,Green Package 99,18,0,,100,,,,,0xFFFFFFFF,63,2,,,,,,{ getitem 12213,1; /*getitem Transmission_Coupon,1;*/ getitem 5883,1; },{},{} +22647,S_Green_Package99,Green Package 99,18,0,,100,,,,,0xFFFFFFFF,63,2,,,,,,{ getitem 12213,1; getitem 7676,1; getitem 5883,1; },{},{} 22648,Angeling_Package,Angel Ring Package,2,20,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ /* TODO */ },{},{} 22649,Deviling_Package,Devil Ring Package,2,20,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ /* TODO */ },{},{} 22652,Briliant_Hat_Box,Brilliant Hat Box,2,10,,200,,,,,0xFFFFFFFF,63,2,,,,,,{ /* TODO */ },{},{} @@ -10266,10 +10270,10 @@ 28203,Half_BF_Rifle1,Half BF Rifle1,5,0,,0,50,,9,0,0x41000000,63,2,34,3,80,1,18,{ bonus bDex,2; bonus bHit,8; bonus bCritical,8; bonus2 bAddRace,RC_DemiHuman,30; bonus2 bAddRace,RC_Player,30; bonus2 bVariableCastrate,"GS_TRACKING",-20; bonus2 bIgnoreDefRaceRate,RC_DemiHuman,10; bonus2 bIgnoreDefRaceRate,RC_Player,10; bonus bUnbreakableWeapon,0; },{},{} 28204,Half_BF_Shotgun1,Half BF Shotgun1,5,0,,0,100,,9,0,0x41000000,63,2,34,3,80,1,20,{ bonus bDex,2; bonus bSplashRange,1; bonus2 bAddRace,RC_DemiHuman,30; bonus2 bAddRace,RC_Player,30; bonus2 bIgnoreDefRaceRate,RC_DemiHuman,10; bonus2 bIgnoreDefRaceRate,RC_Player,10; autobonus "{ bonus bBaseAtk,80; bonus2 bHPLossRate,100,1000; }",30,6000,BF_WEAPON,"{ specialeffect2 EF_BASH3D; }"; bonus bUnbreakableWeapon,0; },{},{} // -//28315,RCC2013_ARMLET -//28316,RCC2013_ARMLET_ -//28317,RCC2013_RING -//28318,RCC2013_RING_ +28315,RCC2013_ARMLET,RCC2013_ARMLET,4,200,,200,,,,0,0xFFFFFFFF,63,2,136,,1,0,,{ bonus2 bAddClass,Class_All,1; },{},{} +28316,RCC2013_ARMLET_,RCC2013_ARMLET_,4,200,,200,,,,1,0xFFFFFFFF,63,2,136,,1,0,,{ bonus2 bAddClass,Class_All,1; },{},{} +28317,RCC2013_RING,RCC2013_RING,4,200,,200,,,,0,0xFFFFFFFF,63,2,136,,1,0,,{ bonus2 bAddClass,Class_All,1; },{},{} +28318,RCC2013_RING_,RCC2013_RING_,4,200,,200,,,,1,0xFFFFFFFF,63,2,136,,1,0,,{ bonus2 bAddClass,Class_All,1; },{},{} 28310,Sarah's_Left_Earring,Sarah's Left Earring,4,10,,100,,,,0,0xFFFFFFFF,63,2,128,,145,1,,{ skill "AL_HEAL",1; },{},{} 28311,Sarah's_Right_Earring,Sarah's Right Earring,4,10,,100,,,,0,0xFFFFFFFF,63,2,8,,145,1,,{ skill "AL_TELEPORT",1; },{},{} 28326,Broken_Chips_01,Broken Chips 01,4,10,,100,,,,1,0xFFFFFFFF,63,2,136,,100,1,,{ bonus bStr,4; },{},{} diff --git a/db/re/item_package.txt b/db/re/item_package.txt index 42b1da813a..6564b282cf 100644 --- a/db/re/item_package.txt +++ b/db/re/item_package.txt @@ -891,7 +891,7 @@ IG_Lucky_Scroll08,Bunny_Band_,3,0,0,0,0,1 IG_Lucky_Scroll08,Drooping_Kitty_,5,0,0,0,0,1 IG_Lucky_Scroll08,Tulip_Hairpin,65,0,0,0,0,1 IG_Lucky_Scroll08,Insurance_Package,60,0,0,0,0,1 -IG_Lucky_Scroll08,Leaf_Of_Yggdrasil,110,05,0,0,0,1 +IG_Lucky_Scroll08,Leaf_Of_Yggdrasil,110,15,0,0,0,1 IG_Br_SwordPackage,Plate_Armor_,0,1,0,0,0,1 IG_Br_SwordPackage,Shield_,0,1,0,0,0,1 diff --git a/db/re/pet_db.txt b/db/re/pet_db.txt index 63cc247809..49f5ae62dd 100644 --- a/db/re/pet_db.txt +++ b/db/re/pet_db.txt @@ -78,8 +78,8 @@ 1148,MEDUSA,Medusa,12368,9050,10032,6108,80,60,10,100,250,20,200,150,0,0,300,300,800,{},{ bonus bVit,1; bonus2 bResEff,Eff_Stone,500; } 1179,WHISPER,Whisper,12363,9045,10027,6100,80,60,20,100,250,20,500,150,0,0,300,300,800,{},{ bonus bFlee,7; bonus bDef,-3; } 1299,GOBLIN_LEADER,Goblin Leader,12364,9046,10028,6104,80,60,10,100,250,20,50,150,0,0,300,300,800,{},{ bonus2 bAddRace,RC_DemiHuman,3; } -1370,SUCCUBUS,Succubus,12373,9055,10037,6113,80,60,10,100,250,20,200,150,0,0,300,300,800,{ bonus2 bHPGainAttackRate,10,5; },{ bonus2 bHPGainAttackRate,30,5; bonus bMaxHPrate,1; } -1374,INCUBUS,Incubus,12370,9052,10034,6110,80,60,10,100,250,20,50,150,0,0,300,300,800,{ bonus bMaxSPRate,3; bonus2 bSPGainAttackRate,10,1; },{ bonus bMaxSPRate,5; bonus2 bSPGainAttackRate,30,1; } +1370,SUCCUBUS,Succubus,12373,9055,10037,6113,80,60,10,100,250,20,200,150,0,0,300,300,800,{ bonus2 bHPDrainRate,10,5; },{ bonus2 bHPDrainRate,30,5; bonus bMaxHPrate,1; } +1374,INCUBUS,Incubus,12370,9052,10034,6110,80,60,10,100,250,20,50,150,0,0,300,300,800,{ bonus bMaxSPRate,3; bonus2 bSPDrainRate,10,1; },{ bonus bMaxSPRate,5; bonus2 bSPDrainRate,30,1; } 1379,NIGHTMARE_TERROR,Nightmare Terror,12372,9054,10036,6112,80,60,10,100,250,20,200,150,0,0,300,300,800,{},{ bonus2 bResEff,Eff_Sleep,10000; } 1401,SHINOBI,Shinobi,12362,9044,10026,6099,80,60,20,100,250,20,500,150,0,0,300,300,800,{},{ bonus bAgi,2; } 1404,MIYABI_NINGYO,Miyabi Doll,12366,9048,10030,6106,80,60,15,100,250,20,200,150,0,0,300,300,800,{},{ bonus bInt,1; bonus bCastrate,-3; } diff --git a/db/re/skill_db.txt b/db/re/skill_db.txt index de882fdf65..fd1af94cb8 100644 --- a/db/re/skill_db.txt +++ b/db/re/skill_db.txt @@ -41,6 +41,7 @@ // 0x08000 - skill that ignore bg reduction // 0x10000 - skill that ignore gvg reduction // 0x20000 - makes 'self'/'place' skill cannot be casted/placed when near NPC (see 'db/skill_nonearnpc_db.txt' for more options) +// 0x40000 - skill that can hit trap-type skill (inf2 has 0x00080) // 13 maxcount: max amount of skill instances to place on the ground when // player_land_skill_limit/monster_land_skill_limit is enabled. For skills // that attack using a path, this is the path length to be used. @@ -76,7 +77,7 @@ 4,0,0,0,0,0,0,10,0,no,0,0,0,none,0,0x0, SM_RECOVERY,Increase HP Recovery 5,-1,6,1,-1,0,0,10,1,no,0,0,0,weapon,0,0x0, SM_BASH,Bash 6,9,6,1,0,1,0,10,1,no,0,0,0,none,0,0x0, SM_PROVOKE,Provoke -7,0,6,4,3,0x2,2,10,1,no,0,0,0,weapon,2,0x0, SM_MAGNUM,Magnum Break +7,0,6,4,3,0x2,2,10,1,no,0,0x40000,0,weapon,2,0x0, SM_MAGNUM,Magnum Break 8,0,6,4,0,0x1,0,10,1,no,0,0,0,weapon,0,0x0, SM_ENDURE,Endure //**** @@ -128,7 +129,7 @@ 44,0,0,0,0,0,0,10,0,no,0,0,0,none,0,0x0, AC_VULTURE,Vulture's Eye 45,0,6,4,0,0x3,3,10,1,no,0,0,0,weapon,0,0x0, AC_CONCENTRATION,Improve Concentration 46,-9,8,1,-1,0,0,10,2,no,0,0,0,weapon,0,0x80, AC_DOUBLE,Double Strafe -47,-9,6,2,-1,0x2,2,10,1,no,0,0x0,0,weapon,2,0x81, AC_SHOWER,Arrow Shower +47,-9,6,2,-1,0x2,2,10,1,no,0,0x40000,0,weapon,2,0x81, AC_SHOWER,Arrow Shower //**** // Thief @@ -146,11 +147,11 @@ 55,0,0,0,0,0,0,10,0,no,0,0,0,weapon,0,0x0, KN_SPEARMASTERY,Spear Mastery 56,-2,8,1,-1,0,0,10,3,no,0,0,0,weapon,0,0x0, KN_PIERCE,Pierce 57,-2,6,1,-1,0x1,0,10,1,no,0,0,0,weapon,3,0x20000, KN_BRANDISHSPEAR,Brandish Spear -58,-4,6,1,-1,0x2,0,10,1,no,0,0,0,weapon,6,0x0, KN_SPEARSTAB,Spear Stab +58,-4,6,1,-1,0x2,0,10,1,no,0,0x40000,0,weapon,6,0x0, KN_SPEARSTAB,Spear Stab 59,3:5:7:9:11,6,1,-1,0,0,5,1,no,0,0,0,weapon,0,0x0, KN_SPEARBOOMERANG,Spear Boomerang 60,0,6,4,0,0x1,0,10,1,no,0,0,0,weapon,0,0x0, KN_TWOHANDQUICKEN,Twohand Quicken 61,0,6,4,-1,0,0,5,1,no,0,0,0,weapon,0,0x0, KN_AUTOCOUNTER,Counter Attack -62,-2,6,1,-1,0x2,1,10,1,no,0,0,0,weapon,1,0x0, KN_BOWLINGBASH,Bowling Bash +62,-2,6,1,-1,0x2,1,10,1,no,0,0x40000,0,weapon,1,0x0, KN_BOWLINGBASH,Bowling Bash 63,0,0,0,0,0,0,1,0,no,0,0,0,weapon,0,0x0, KN_RIDING,Peco Peco Riding 64,0,0,0,0,0,0,5,0,no,0,0,0,weapon,0,0x0, KN_CAVALIERMASTERY,Cavalier Mastery @@ -175,7 +176,7 @@ //**** // Wizard 80,9,8,2,3,0x20,1:1:1:1:1:2:2:2:2:2:2,10,-3:-4:-5:-6:-7:-8:-9:-10:-11:-12:-12,yes,0,0x2000,5,magic,0,0x0, WZ_FIREPILLAR,Fire Pillar -81,0,6,4,3,0,7,10,1,yes,0,0x2000,0,magic,5,0x20, WZ_SIGHTRASHER,Sightrasher +81,0,6,4,3,0x2,7,10,1,yes,0,0x42000,0,magic,5,0x20, WZ_SIGHTRASHER,Sightrasher 83,9,8,2,3,0,3:3:3:3:3:3:3:3:3:3:14,10,1:1:2:2:3:3:4:4:5:5:15,yes,0,0x2000,0,magic,0,0x20, WZ_METEOR,Meteor Storm 84,9,8,1,4,0,0,10,3:4:5:6:7:8:9:10:11:12,yes,0,0x2000,0,magic,2:3:3:4:4:5:5:6:6:7,0x20, WZ_JUPITEL,Jupitel Thunder 85,9,8,2,4,0,0,10,-10,yes,0,0x2000,0,magic,0,0x20, WZ_VERMILION,Lord of Vermilion @@ -217,13 +218,13 @@ 115,3,6,2,0,0x1,0,5,1,no,0,0x80,0,misc,6:7:8:9:10,0x3000, HT_SKIDTRAP,Skid Trap 116,3,6,2,2,0x42,0,5,1,no,0,0x80,0,misc,0,0x3800, HT_LANDMINE,Land Mine 117,3,6,2,0,0x1,0,5,1,no,0,0x80,0,misc,0,0x3000, HT_ANKLESNARE,Ankle Snare -118,3,6,2,0,0x2,1,5,1,no,0,0x80,0,misc,0,0x3000, HT_SHOCKWAVE,Shockwave Trap +118,3,6,2,0,0x3,1,5,1,no,0,0x80,0,misc,0,0x3000, HT_SHOCKWAVE,Shockwave Trap 119,3,6,2,0,0x3,2,5,1,no,0,0x80,0,misc,0,0x3000, HT_SANDMAN,Sandman 120,3,6,2,0,0x3,1,5,1,no,0,0x80,0,misc,0,0x3000, HT_FLASHER,Flasher 121,3,6,2,1,0x42,1,5,1,no,0,0x80,0,weapon,0,0x3800, HT_FREEZINGTRAP,Freezing Trap 122,3,6,2,4,0x42,1,5,1,no,0,0x80,0,misc,0,0x3800, HT_BLASTMINE,Blast Mine -123,3,6,2,3,0x42,2,5,1,no,0,0x80,0,misc,0,0x3800, HT_CLAYMORETRAP,Claymore Trap -124,2,6,32,0,0x1,0,1,1,no,0,0,0,misc,0,0x0, HT_REMOVETRAP,Remove Trap +123,3,6,2,3,0x42,2,5,1,no,0,0x40080,0,misc,0,0x3800, HT_CLAYMORETRAP,Claymore Trap +124,2,6,32,0,0x1,0,1,1,no,0,0x40000,0,misc,0,0x0, HT_REMOVETRAP,Remove Trap 125,3,6,2,0,0x1,0,1,1,no,0,0x80,0,misc,0,0x2000, HT_TALKIEBOX,Talkie Box 126,0,0,0,0,0,0,10,0,no,0,0,0,weapon,0,0x0, HT_BEASTBANE,Beast Bane 127,0,0,0,0,0,0,1,0,no,0,0,0,misc,0,0x0, HT_FALCON,Falconry Mastery @@ -258,7 +259,7 @@ 150,0,6,4,0,0x1,0,1,1,no,0,0x1,0,weapon,5,0x40, TF_BACKSLIDING,Back Slide 151,0,6,4,0,0x1,0,1,1,no,0,0x1,0,none,0,0x0, TF_PICKSTONE,Find Stone 152,7,6,1,0,0x40,0,1,1,no,0,0x1,0,misc,0,0x0, TF_THROWSTONE,Stone Fling -153,1,6,1,-1,0x2,1,1,1,no,0,0x1,0,weapon,2,0x0, MC_CARTREVOLUTION,Cart Revolution +153,1,6,1,-1,0x2,1,1,1,no,0,0x40001,0,weapon,2,0x0, MC_CARTREVOLUTION,Cart Revolution 154,0,6,4,0,0x1,0,1,1,no,0,0x1,0,none,0,0x0, MC_CHANGECART,Change Cart 155,0,6,4,0,0x1,0,1,1,no,0,0x1,0,weapon,0,0x0, MC_LOUD,Crazy Uproar 156,9,6,1,6,0,0,1,1,yes,0,0x1,0,magic,0,0x20, AL_HOLYLIGHT,Holy Light @@ -325,7 +326,7 @@ 211,1,6,1,0,0x1,0,10,1,no,0,0,0,weapon,0,0x0, RG_STEALCOIN,Mug 212,-1,6,1,-1,0x40,0,10,1,no,0,0,0,weapon,0,0x4, RG_BACKSTAP,Back Stab 213,0,0,0,0,0,0,5,0,no,0,0,0,none,0,0x0, RG_TUNNELDRIVE,Stalk -214,0,6,4,-1,0x2,3,5,1,no,0,0,0,weapon,0,0x4, RG_RAID,Sightless Mind +214,0,6,4,-1,0x2,3,5,1,no,0,0x40000,0,weapon,0,0x4, RG_RAID,Sightless Mind 215,1,6,1,0,0x1,0,5,1,no,0,0,0,weapon,0,0x20, RG_STRIPWEAPON,Divest Weapon 216,1,6,1,0,0x1,0,5,1,no,0,0,0,weapon,0,0x20, RG_STRIPSHIELD,Divest Shield 217,1,6,1,0,0x1,0,5,1,no,0,0,0,weapon,0,0x20, RG_STRIPARMOR,Divest Armor @@ -369,8 +370,8 @@ 249,0,6,4,0,0x1,0,10,1,no,0,0,0,weapon,0,0x0, CR_AUTOGUARD,Guard 250,3,6,1,0,0,0,5,1,no,0,0,0,weapon,5:6:7:8:9,0x0, CR_SHIELDCHARGE,Smite 251,3:5:7:9:11,6,1,0,0,0,5,1,no,0,0,0,weapon,0,0x20000, CR_SHIELDBOOMERANG,Shield Boomerang -252,0,6,4,0,0,0,10,1,no,0,0,0,weapon,0,0x0, CR_REFLECTSHIELD,Shield Reflect -253,-2,8,1,6,0,0,10,-2,no,0,0,0,weapon,0,0x0, CR_HOLYCROSS,Holy Cross +252,0,6,4,0,0x1,0,10,1,no,0,0,0,weapon,0,0x0, CR_REFLECTSHIELD,Shield Reflect +253,-2,8,1,6,0,0,10,-2,no,0,0x40000,0,weapon,0,0x0, CR_HOLYCROSS,Holy Cross 254,5,6,4,6,0x48,0,10,1,no,33,0x100,0,magic,0,0x0, CR_GRANDCROSS,Grand Cross 255,7:8:9:10:11,6,16,0,0x1,0,5,1,yes,0,0x600,0,none,0,0x0, CR_DEVOTION,Sacrifice 256,9,6,16,0,0x1,0,5,1,yes,0,0x200,0,none,0,0x0, CR_PROVIDENCE,Resistant Souls @@ -383,15 +384,15 @@ 260,0,0,0,0,0,0,5,0,no,0,0,0,weapon,0,0x0, MO_SPIRITSRECOVERY,Spiritual Cadence 261,0,6,4,0,0x1,0,5,1,no,0,0,0,none,0,0x0, MO_CALLSPIRITS,Summon Spirit Sphere 262,9,6,16,0,0x1,0,1,1,yes,0,0,0,weapon,0,0x0, MO_ABSORBSPIRITS,Absorb Spirit Sphere -263,-1,8,0,-1,0,0,10,-3,no,0,0,0,weapon,0,0x0, MO_TRIPLEATTACK,Raging Trifecta Blow +263,-1,8,0,-1,0,0,10,-3,no,0,0x40000,0,weapon,0,0x0, MO_TRIPLEATTACK,Raging Trifecta Blow 264,18,6,2,0,0x1,0,1,1,no,0,0,0,none,0,0x0, MO_BODYRELOCATION,Snap 265,0,0,0,0,0,0,10,0,no,0,0,0,weapon,0,0x0, MO_DODGE,Dodge -266,2,6,1,-1,0x40,0,5,1,no,0,0,0,weapon,0,0x0, MO_INVESTIGATE,Occult Impaction -267,9,8,1,-1,0,0,5,1:2:3:4:5,no,0,0,0,weapon,0,0x0, MO_FINGEROFFENSIVE,Throw Spirit Sphere +266,2,6,1,-1,0x40,0,5,1,no,0,0x40000,0,weapon,0,0x0, MO_INVESTIGATE,Occult Impaction +267,9,8,1,-1,0,0,5,1:2:3:4:5,no,0,0x40000,0,weapon,0,0x0, MO_FINGEROFFENSIVE,Throw Spirit Sphere 268,0,6,4,0,0x1,0,5,1,no,0,0,0,weapon,0,0x0, MO_STEELBODY,Mental Strength 269,0,6,4,0,0x1,0,5,1,no,0,0,0,weapon,0,0x0, MO_BLADESTOP,Root 270,0,6,4,0,0x1,0,5,0,no,0,0,0,weapon,0,0x0, MO_EXPLOSIONSPIRITS,Fury -271,-2,6,1,0,0x60,0,5,1,yes,0,0,0,weapon,0,0x0, MO_EXTREMITYFIST,Asura Strike +271,-2,6,1,0,0x60,0,5,1,yes,0,0x40000,0,weapon,0,0x0, MO_EXTREMITYFIST,Asura Strike 272,-2,8,4,-1,0,0,5,-4,no,0,0x200,0,weapon,0,0x0, MO_CHAINCOMBO,Raging Quadruple Blow 273,-2,6,4,-1,0x2,2,5,1,no,0,0x200,0,weapon,0,0x0, MO_COMBOFINISH,Raging Thrust @@ -561,7 +562,7 @@ //**** // Stalker 389,0,6,4,0,0x1,0,5,1,no,0,0,0,none,0,0x60, ST_CHASEWALK,Stealth -390,0,0,4,0,0,0,5,1,yes,0,0,0,weapon,0,0x0, ST_REJECTSWORD,Counter Instinct +390,0,0,4,0,0x1,0,5,1,yes,0,0,0,weapon,0,0x0, ST_REJECTSWORD,Counter Instinct //391,0,0,4,0,1,0,1,1,yes,0,0,0,magic,0,0x0, ST_STEALBACKPACK,Steal Backpack //**** @@ -577,7 +578,7 @@ //**** // Lord Knight -397,5,8,1,-1,0,0,5,5,no,0,0,0,weapon,0,0x20000, LK_SPIRALPIERCE,Spiral Pierce +397,5,8,1,-1,0,0,5,5,no,0,0x40000,0,weapon,0,0x20000, LK_SPIRALPIERCE,Spiral Pierce 398,4,6,1,-1,0,0,5,1,no,0,0,0,weapon,0,0x0, LK_HEADCRUSH,Traumatic Blow 399,4,6,1,-1,0,0,10,1,no,0,0,0,weapon,0,0x0, LK_JOINTBEAT,Vital Strike @@ -598,7 +599,7 @@ //**** // Assassin Cross -406,0,6,4,-1,0xA,2,10,1,no,0,0,0,weapon,0,0x0, ASC_METEORASSAULT,Meteor Assault +406,0,6,4,-1,0xA,2,10,1,no,0,0x40000,0,weapon,0,0x0, ASC_METEORASSAULT,Meteor Assault 407,0,6,4,0,0x1,0,1,0,no,0,0,0,none,0,0x0, ASC_CDP,Create Deadly Poison //**** @@ -629,9 +630,9 @@ //**** // Star Gladiator 427,0,6,4,0,0x1,0,3,1,yes,0,0,0,magic,0,0x0, SG_FEEL,Feeling the Sun Moon and Stars -428,1,6,4,-1,0x2,1,3,1,yes,0,0,0,weapon,2,0x1, SG_SUN_WARM,Warmth of the Sun -429,1,6,4,-1,0x2,1,3,1,yes,0,0,0,weapon,2,0x1, SG_MOON_WARM,Warmth of the Moon -430,1,6,4,-1,0x2,1,3,1,yes,0,0,0,weapon,2,0x1, SG_STAR_WARM,Warmth of the Stars +428,1,6,4,-1,0x3,1,3,1,yes,0,0,0,weapon,2,0x1, SG_SUN_WARM,Warmth of the Sun +429,1,6,4,-1,0x3,1,3,1,yes,0,0,0,weapon,2,0x1, SG_MOON_WARM,Warmth of the Moon +430,1,6,4,-1,0x3,1,3,1,yes,0,0,0,weapon,2,0x1, SG_STAR_WARM,Warmth of the Stars 431,0,0,4,0,0x1,0,4,1,yes,0,0,0,magic,0,0x0, SG_SUN_COMFORT,Comfort of the Sun 432,0,0,4,0,0x1,0,4,1,yes,0,0,0,magic,0,0x0, SG_MOON_COMFORT,Comfort of the Moon 433,0,0,4,0,0x1,0,4,1,yes,0,0,0,magic,0,0x0, SG_STAR_COMFORT,Comfort of the Stars @@ -689,7 +690,7 @@ //**** // Other 2nd Skills -473,0,6,4,0,0,0,1,1,no,0,0,0,none,0,0x0, SM_SELFPROVOKE,Provoke Self +473,0,6,4,0,0x1,0,1,1,no,0,0,0,none,0,0x0, SM_SELFPROVOKE,Provoke Self 474,0,0,4,0,0x1,0,10,1,no,0,0x2,0,none,0,0x0, NPC_EMOTION_ON,Emotion ON 475,0,0,4,0,0x1,0,1,1,yes,0,0,0,none,0,0x0, ST_PRESERVE,Preserve 476,1,6,1,0,0x1,0,5,1,yes,0,0,0,weapon,0,0x20, ST_FULLSTRIP,Divest All @@ -719,14 +720,14 @@ //**** // Gunslinger -500,0,6,4,0,0x40,0,5,1,no,0,0,0,misc,0,0x0, GS_GLITTERING,Flip the Coin +500,0,6,4,0,0x41,0,5,1,no,0,0,0,misc,0,0x0, GS_GLITTERING,Flip the Coin 501,9,6,1,-1,0x50,0,1,1,no,0,0,0,misc,0,0x0, GS_FLING,Fling 502,-9,8,1,-1,0,0,1,3,no,0,0,0,weapon,0,0x0, GS_TRIPLEACTION,Triple Action 503,-9,6,1,-1,0x8,0,1,1,no,0,0,0,weapon,0,0x0, GS_BULLSEYE,Bulls Eye 504,0,6,4,0,0x1,0,1,1,no,0,0,0,weapon,0,0x0, GS_MADNESSCANCEL,Madness Canceller 505,0,6,4,0,0x1,0,1,1,no,0,0,0,weapon,0,0x0, GS_ADJUSTMENT,AdJustment 506,0,6,4,0,0x1,0,1,1,no,0,0,0,weapon,0,0x0, GS_INCREASING,Increasing Accuracy -507,-9,6,1,8,0,0,1,1,no,0,0,0,weapon,0,0x0, GS_MAGICALBULLET,Magical Bullet +507,-9,6,1,8,0x20,0,1,1,no,0,0,0,misc,0,0x0, GS_MAGICALBULLET,Magical Bullet 508,-9,6,1,-1,0x1,0,1,1,no,0,0,0,weapon,0,0x0, GS_CRACKER,Cracker 509,0,0,0,0,0,0,10,0,no,0,0,0,none,0,0x0, GS_SINGLEACTION,Single Action 510,0,0,0,0,0,0,10,0,no,0,0,0,none,0,0x0, GS_SNAKEEYE,Snake Eye @@ -870,7 +871,7 @@ 1003,0,0,0,0,0,0,1,0,no,0,0x1,0,weapon,0,0x0, AS_SONICACCEL,Sonic Acceleration 1004,9,8,1,0,0x8,0,1,1,no,0,0x1,0,weapon,0,0x0, AS_VENOMKNIFE,Throw Venom Knife 1005,1,6,1,0,0x1,0,1,1,no,0,0x1,0,weapon,0,0x0, RG_CLOSECONFINE,Close Confine -1006,0,6,4,3,0,1,1,1,yes,0,0x1,0,magic,3,0x20, WZ_SIGHTBLASTER,Sight Blaster +1006,0,6,4,3,0,1,1,1,yes,0,0x40001,0,magic,3,0x20, WZ_SIGHTBLASTER,Sight Blaster 1007,0,6,4,0,0x1,0,1,0,no,0,0x1,0,none,0,0x0, SA_CREATECON,Create Elemental Converter 1008,9,6,1,1,0x1,0,1,1,yes,0,0x1,0,magic,0,0x0, SA_ELEMENTWATER,Elemental Change Water 1009,-9,6,1,0,0,0,1,1,no,0,0x1,0,weapon,3,0x0, HT_PHANTASMIC,Phantasmic Arrow @@ -894,7 +895,7 @@ 2005,1,6,2,4,0x2,2,5,1,no,0,0,0,weapon,3,0x0, RK_WINDCUTTER,Wind Cutter 2006,0,6,4,-1,0x2,5,5,1,no,0,0,0,weapon,0,0x0, RK_IGNITIONBREAK,Ignition Break 2007,0,0,0,0,0,0,5,0,no,0,0,0,none,0,0x0, RK_DRAGONTRAINING,Dragon Training -2008,9,6,2,3,0x42,1:1:1:2:2:2:3:3:4:4,10,1,no,0,0,0,weapon,0,0x0, RK_DRAGONBREATH,Dragon Breath +2008,9,6,2,3,0x42,1:1:1:2:2:2:3:3:4:4,10,1,no,0,0x40000,0,weapon,0,0x0, RK_DRAGONBREATH,Dragon Breath 2009,0,6,4,0,0x3,3:4:5:6:7,5,1,no,0,0,0,none,0,0x0, RK_DRAGONHOWLING,Dragon Howling 2010,0,0,0,0,0,0,10,0,no,0,0,0,none,0,0x0, RK_RUNEMASTERY,Rune Mastery 2011,0,6,4,0,0x1,0,1,1,no,0,0,0,none,0,0x0, RK_MILLENNIUMSHIELD,Millenium Shield @@ -903,7 +904,7 @@ 2014,0,6,4,0,0x1,0,1,1,yes,0,0,0,none,0,0x0, RK_GIANTGROWTH,Giant Growth 2015,0,6,4,0,0x1,0,1,1,yes,0,0,0,none,0,0x0, RK_STONEHARDSKIN,Stone Hard Skin 2016,0,6,4,0,0x1,0,1,1,yes,0,0,0,none,0,0x0, RK_VITALITYACTIVATION,Vitality Activation -2017,0,6,4,-1,0x2,3,1,1,no,0,0,0,weapon,7,0x0, RK_STORMBLAST,Storm Blast +2017,0,6,4,-1,0x2,3,1,1,no,0,0x40000,0,weapon,7,0x0, RK_STORMBLAST,Storm Blast 2018,0,6,4,0,0x3,-1,1,1,yes,0,0,0,none,0,0x0, RK_FIGHTINGSPIRIT,Fighting Spirit //CHECK Is this splash needed? 2019,9,6,4,6,0x1,0,1,1,yes,0,0,0,none,0,0x0, RK_ABUNDANCE,Abundance 2020,5:6:7:8:9,6,1,-1,0,0,5,1,no,0,0,0,weapon,0,0x0, RK_PHANTOMTHRUST,Phantom Thrust @@ -995,7 +996,7 @@ 2234,0,6,4,0,0,0,5,1,yes,0,0,0,none,0,0x0, RA_FEARBREEZE,Fear Breeze 2235,0,0,0,0,0,0,10,0,no,0,0,0,none,0,0x0, RA_RANGERMAIN,Ranger Main 2236,9,8,1,-1,0,0,10,1,yes,0,0,0,weapon,0,0x80, RA_AIMEDBOLT,Aimed Bolt -2237,9,6,2,0,0x3,3,1,1,no,0,0,0,none,0,0x2000, RA_DETONATOR,Detonator +2237,9,6,2,0,0x3,3,1,1,no,0,0x40000,0,none,0,0x2000, RA_DETONATOR,Detonator 2238,3,6,2,0,0x3,2,5,1,no,0,0x80,3,misc,0,0x2000, RA_ELECTRICSHOCKER,Electric Shocker 2239,3,6,2,0,0x42,3,5,1,no,0,0x80,3,misc,0,0x2800, RA_CLUSTERBOMB,Cluster Bomb 2240,0,6,4,0,0,0,1,1,no,0,0,0,none,0,0x0, RA_WUGMASTERY,Warg Mastery @@ -1004,15 +1005,15 @@ 2243,9,6,1,0,0x40,0,5,1,no,0,0,0,weapon,0,0x2000, RA_WUGSTRIKE,Warg Strike 2244,9,6,1,0,0x40,0,5,1,no,0,0,0,weapon,0,0x80, RA_WUGBITE,Warg Bite 2245,0,0,0,0,0,0,10,0,no,0,0,0,none,0,0x0, RA_TOOTHOFWUG,Tooth of Warg -2246,0,6,4,0,0x2,3:4:5:6:7,5,1,no,0,0,0,weapon,0,0x0, RA_SENSITIVEKEEN,Sensitive Keen +2246,0,6,4,0,0x2,3:4:5:6:7,5,1,no,0,0x40000,0,weapon,0,0x0, RA_SENSITIVEKEEN,Sensitive Keen 2247,0,6,4,0,0x1,0,5,1,no,0,0,0,none,0,0x42, RA_CAMOUFLAGE,Camouflage 2248,0,0,0,0,0,0,5,0,no,0,0,0,none,0,0x0, RA_RESEARCHTRAP,Research Trap 2249,3,6,2,3,0x43,2,1,1,no,0,0x80,1,misc,0,0x2000, RA_MAGENTATRAP,Magenta Trap 2250,3,6,2,1,0x43,2,1,1,no,0,0x80,1,misc,0,0x2000, RA_COBALTTRAP,Cobalt Trap 2251,3,6,2,2,0x43,2,1,1,no,0,0x80,1,misc,0,0x2000, RA_MAIZETRAP,Maize Trap 2252,3,6,2,4,0x43,2,1,1,no,0,0x80,1,misc,0,0x2000, RA_VERDURETRAP,Verdure Trap -2253,3,6,2,3,0x42,2,5,1,no,0,0x80,2,misc,0,0x2800, RA_FIRINGTRAP,Firing Trap -2254,3,6,2,1,0x42,2,5,1,no,0,0x80,2,misc,0,0x2800, RA_ICEBOUNDTRAP,Icebound Trap +2253,3,6,2,3,0x42,2,5,1,no,0,0x40080,2,misc,0,0x2800, RA_FIRINGTRAP,Firing Trap +2254,3,6,2,1,0x42,2,5,1,no,0,0x40080,2,misc,0,0x2800, RA_ICEBOUNDTRAP,Icebound Trap //**** // NC Mechanic @@ -1021,14 +1022,14 @@ 2257,3,6,1,-1,0,0,3,1,no,0,0,0,weapon,0,0x0, NC_PILEBUNKER,Pile Bunker 2258,13,6,1,-1,0x2,1,3,1,no,0,0,0,weapon,0,0x0, NC_VULCANARM,Vulcan Arm 2259,7,6,1,3,0,2,3,1,no,0,0,5,weapon,0,0x0, NC_FLAMELAUNCHER,Flame Launcher -2260,7,6,2,1,0x2,2:3:4,3,1,no,0,0,0,weapon,0,0x0, NC_COLDSLOWER,Cold Slower +2260,7,6,2,1,0x2,2:3:4,3,1,no,0,0x40000,0,weapon,0,0x0, NC_COLDSLOWER,Cold Slower 2261,9:11:13,6,2,-1,0x42,3:2:1,3,1,no,0,0,0,weapon,0,0x0, NC_ARMSCANNON,Arm Cannon 2262,0,6,4,0,0x1,0,3,1,no,0,0,0,none,0,0x0, NC_ACCELERATION,Acceleration 2263,0,6,4,0,0x1,0,1,1,no,0,0,0,none,0,0x0, NC_HOVERING,Hovering 2264,0,6,4,0,0x1,0,1,1,no,0,0,0,none,7,0x0, NC_F_SIDESLIDE,Front-Side Slide 2265,0,6,4,0,0x1,0,1,1,no,0,0,0,none,7,0x0, NC_B_SIDESLIDE,Back-Side Slide 2266,0,0,0,0,0,0,4,0,no,0,0,0,none,0,0x0, NC_MAINFRAME,Mainframe Restructure -2267,0,6,4,0,0xCA,2:3:4,3,1,no,0,0,0,weapon,5,0x0, NC_SELFDESTRUCTION,Self Destruction +2267,0,6,4,0,0xCA,2:3:4,3,1,no,0,0x40000,0,weapon,5,0x0, NC_SELFDESTRUCTION,Self Destruction 2268,0,6,4,0,0x1,0,4,1,yes,0,0,0,none,0,0x0, NC_SHAPESHIFT,Shape Shift 2269,0,6,4,0,0x1,0,1,1,no,0,0,0,none,0,0x0, NC_EMERGENCYCOOL,Emergency Cool 2270,0,6,4,0,0x3,7,1,1,yes,0,0,0,none,0,0x0, NC_INFRAREDSCAN,Infrared Scan @@ -1102,7 +1103,7 @@ 2329,-2,8,4,-1,0,0,5,-2,no,0,0x200,0,weapon,0,0x0, SR_FALLENEMPIRE,Fallen Empire 2330,-2,6,1,-1,0x42,1:1:1:1:1:2:2:2:2:2,10,1,yes,0,0,0,weapon,0,0x0, SR_TIGERCANNON,Tiger Cannon 2331,0,0,0,0,0,0,10,0,no,0,0,0,none,0,0x0, SR_HELLGATE,Hell Gate -2332,0,6,4,-1,0x2,3,5,1,no,0,0,0,weapon,0,0x0, SR_RAMPAGEBLASTER,Rampage Blaster +2332,0,6,4,-1,0x2,3,5,1,no,0,0x40000,0,weapon,0,0x0, SR_RAMPAGEBLASTER,Rampage Blaster 2333,0,6,4,0,0x1,0,5,1,no,0,0,0,none,0,0x0, SR_CRESCENTELBOW,Crescent Elbow 2334,0,6,4,0,0x3,1:1:2:2:3,5,1,no,0,0,0,none,0,0x0, SR_CURSEDCIRCLE,Cursed Circle 2335,0,6,4,0,0x1,0,5,1,no,0,0,0,none,0,0x0, SR_LIGHTNINGWALK,Lightning Walk @@ -1203,7 +1204,7 @@ 2481,11,6,1,-1,0x2,1:2:3:4:5,5,1,yes,0,0,0,weapon,0,0x0, GN_SPORE_EXPLOSION,Spore Explosion //CHECK Data says its element is set to neutral. Need to confirm. 2482,11,6,2,0,0x8,0,5,1,yes,0,0,1,weapon,2,0x0, GN_WALLOFTHORN,Wall of Thorns 2483,11,6,2,0,0x3,4,10,1,yes,0,0x0,0,weapon,0,0x1, GN_CRAZYWEED,Crazy Weed -2484,0,6,2,2,0x2,2,10,1,no,0,0x0,0,weapon,0,0x1, GN_CRAZYWEED_ATK,Crazy Weed Attack +2484,0,6,2,2,0x2,2,10,1,no,0,0x40000,0,weapon,0,0x1, GN_CRAZYWEED_ATK,Crazy Weed Attack 2485,9,6,2,3,0,0,5,1,yes,0,0,0,magic,0,0x0, GN_DEMONIC_FIRE,Demonic Fire 2486,9,6,2,0,0,0,5,1,yes,0,0,0,none,0,0x0, GN_FIRE_EXPANSION,Fire Expansion 2487,9,6,2,0,0,0,1,1,no,0,0,0,none,0,0x0, GN_FIRE_EXPANSION_SMOKE_POWDER,Fire Expansion Smoke Powder @@ -1313,7 +1314,7 @@ 5001,1,8,1,-1,0,0,5,3,no,0,0,0,weapon,0,0x0, GC_DARKCROW,Dark Claw 5002,0,6,4,0,0x1,0,5,1,no,0,0,0,none,0,0x0, RA_UNLIMIT,Unlimited 5003,7,6,1,-1,0x2,4:5:6:7:-1,5,1,no,0,0,0,weapon,0,0x0, GN_ILLUSIONDOPING,Illusion Doping -5004,9,6,2,1,0x42,1:1:1:2:2:2:3:3:4:4,10,1,no,0,0,0,weapon,0,0x0, RK_DRAGONBREATH_WATER,Dragon Breath - Water +5004,9,6,2,1,0x42,1:1:1:2:2:2:3:3:4:4,10,1,no,0,0x40000,0,weapon,0,0x0, RK_DRAGONBREATH_WATER,Dragon Breath - Water 5005,0,6,4,0,0x3,3,1,1,no,0,0,0,none,0,0x0, RK_LUXANIMA,Lux Anima 5006,1,6,2,3,0x2,3,5,1,no,0,0,3,misc,0,0x0, NC_MAGMA_ERUPTION,Magma Eruption 5007,0,6,4,0,0x3,5:6:7:8:9,5,1,no,0,0,0,none,0,0x0, WM_FRIGG_SONG,Frigg's Song @@ -1324,10 +1325,10 @@ 5012,0,6,4,0,0x1,0,5,1,no,0,0,0,none,0,0x0, WL_TELEKINESIS_INTENSE,Intense Telekinesis 5013,0,6,4,0,0x3,0,5,1,no,0,0,0,none,0,0x0, LG_KINGS_GRACE,King's Grace 5014,0,6,4,0,0x1,0,5,1,no,0,0,0,none,0,0x0, ALL_FULL_THROTTLE,Full Throttle -5015,0,6,4,0,0x1,0,5,1,no,0,0,0,none,0,0x0, SR_FLASHCOMBO_ATK_STEP1,Flash Combo Attack Step 1 -5016,0,6,4,0,0x1,0,5,1,no,0,0,0,none,0,0x0, SR_FLASHCOMBO_ATK_STEP2,Flash Combo Attack Step 2 -5017,0,6,4,0,0x1,0,5,1,no,0,0,0,none,0,0x0, SR_FLASHCOMBO_ATK_STEP3,Flash Combo Attack Step 3 -5018,0,6,4,0,0x1,0,5,1,no,0,0,0,none,0,0x0, SR_FLASHCOMBO_ATK_STEP4,Flash Combo Attack Step 4 +5015,-2,8,1,-1,0,0,10,-2,no,0,0,0,weapon,0,0x0, SR_FLASHCOMBO_ATK_STEP1,Flash Combo Attack Step 1 +5016,-2,8,4,-1,0,0,5,-2,no,0,0x200,0,weapon,0,0x0, SR_FLASHCOMBO_ATK_STEP2,Flash Combo Attack Step 2 +5017,-2,6,1,-1,0x42,1:1:1:1:1:2:2:2:2:2,10,1,yes,0,0,0,weapon,0,0x0, SR_FLASHCOMBO_ATK_STEP3,Flash Combo Attack Step 3 +5018,0,8,4,-1,0x2,2,5,-3,no,0,0,0,weapon,3,0x0, SR_FLASHCOMBO_ATK_STEP4,Flash Combo Attack Step 4 //**** // Homunculus S @@ -1377,23 +1378,23 @@ //**** // Mercenary Skill Place holders 8201,-1,6,1,-1,0,0,10,1,no,0,0,0,weapon,0,0x0, MS_BASH,Bash -8202,0,6,4,3,0x2,2,10,1,no,0,0,0,weapon,2,0x0, MS_MAGNUM,Magnum_Break +8202,0,6,4,3,0x2,2,10,1,no,0,0x40000,0,weapon,2,0x0, MS_MAGNUM,Magnum_Break 8203,-2,6,1,-1,0x2,1,10,1,no,0,0,0,weapon,1,0x0, MS_BOWLINGBASH,Bowling_Bash 8204,0,6,4,0,0x1,0,10,1,no,0,0,0,weapon,0,0x0, MS_PARRYING,Parry 8205,0,6,4,0,0,0,10,1,no,0,0,0,weapon,0,0x0, MS_REFLECTSHIELD,Shield_Reflect 8206,0,6,4,0,0x1,0,1,1,no,0,0,0,weapon,0,0x0, MS_BERSERK,Frenzy 8207,-9,8,1,-1,0,0,10,2,no,0,0,0,weapon,0,0x80, MA_DOUBLE,Double_Strafe -8208,-9,6,2,-1,0x2,2,10,1,no,0,0x0,0,weapon,2,0x81, MA_SHOWER,Arrow_Shower +8208,-9,6,2,-1,0x2,2,10,1,no,0,0x40000,0,weapon,2,0x81, MA_SHOWER,Arrow_Shower 8209,3,6,2,0,0x1,0,5,1,no,0,0x80,0,misc,6:7:8:9:10,0x0, MA_SKIDTRAP,Skid_Trap 8210,3,6,2,2,0x40,0,5,1,no,0,0x80,0,misc,0,0x0, MA_LANDMINE,Land_Mine 8211,3,6,2,0,0x3,2,5,1,no,0,0x80,0,misc,0,0x0, MA_SANDMAN,Sandman 8212,3,6,2,1,0x42,1,5,1,no,0,0x80,0,weapon,0,0x0, MA_FREEZINGTRAP,Freezing_Trap -8213,2,6,32,0,0x1,0,1,1,no,0,0,0,misc,0,0x0, MA_REMOVETRAP,Remove_Trap +8213,2,6,32,0,0x1,0,1,1,no,0,0x40000,0,misc,0,0x0, MA_REMOVETRAP,Remove_Trap 8214,-9,6,1,-1,0x2,0,1,1,no,0,0x1,0,weapon,6,0x80, MA_CHARGEARROW,Arrow_Repel 8215,9,8,1,-1,0,2,5,1,yes,0,0,13,weapon,0,0x0, MA_SHARPSHOOTING,Focused_Arrow_Strike 8216,-2,8,1,-1,0,0,10,3,no,0,0,0,weapon,0,0x0, ML_PIERCE,Pierce 8217,-2,6,1,-1,0x1,0,10,1,no,0,0,0,weapon,3,0x0, ML_BRANDISH,Brandish_Spear -8218,5,8,1,-1,0x20,0,5,5,no,0,0,0,weapon,0,0x0, ML_SPIRALPIERCE,Spiral_Pierce +8218,5,8,1,-1,0x20,0,5,5,no,0,0x40000,0,weapon,0,0x0, ML_SPIRALPIERCE,Spiral_Pierce 8219,0,6,4,0,0x1,0,5,1,no,0,0,0,weapon,0,0x0, ML_DEFENDER,Defending_Aura 8220,0,6,4,0,0x1,0,10,1,no,0,0,0,weapon,0,0x0, ML_AUTOGUARD,Guard 8221,7:8:9:10:11,6,16,0,0x1,0,5,1,yes,0,0x600,0,none,0,0x0, ML_DEVOTION,Sacrifice diff --git a/db/re/skill_require_db.txt b/db/re/skill_require_db.txt index 7b962bdfbb..5ffe78dde2 100644 --- a/db/re/skill_require_db.txt +++ b/db/re/skill_require_db.txt @@ -759,7 +759,7 @@ 2327,0,0,8:9:10:11:12,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SR_SKYNETBLOW 2328,0,0,36:40:44:48:52,0,0,0,99,0,0,none,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SR_EARTHSHAKER 2329,0,0,20:30:40:50:60,0,0,0,99,0,0,none,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SR_FALLENEMPIRE -2330,0,0,1:2:3:4:5:6:7:8:9:10,0,0,0,99,0,0,none,SC_EXPLOSIONSPIRITS,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SR_TIGERCANNON +2330,0,0,1:2:3:4:5:6:7:8:9:10,-12:-14:-16:-18:-20:-22:-24:-26:-28:-30,-6:-7:-8:-9:-10:-11:-12:-13:-14:-15,0,99,0,0,none,SC_EXPLOSIONSPIRITS,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SR_TIGERCANNON 2331,0,0,1,0,-11:-12:-13:-14:-15:-16:-17:-18:-19:-20,0,99,0,0,none,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SR_HELLGATE 2332,0,0,150,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SR_RAMPAGEBLASTER 2333,0,0,80,0,0,0,99,0,0,none,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SR_CRESCENTELBOW @@ -971,10 +971,10 @@ 5012,0,0,100:150:200:250:300,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WL_TELEKINESIS_INTENSE 5013,0,0,200:180:160:140:120,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //LG_KINGS_GRACE 5014,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //ALL_FULL_THROTTLE -5015,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SR_FLASHCOMBO_ATK_STEP1 //All 4 steps are using temp req SP values for now. -5016,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SR_FLASHCOMBO_ATK_STEP2 -5017,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SR_FLASHCOMBO_ATK_STEP3 -5018,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SR_FLASHCOMBO_ATK_STEP4 +5015,0,0,0,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SR_FLASHCOMBO_ATK_STEP1 //All 4 steps are using temp req SP values for now. +5016,0,0,0,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SR_FLASHCOMBO_ATK_STEP2 +5017,0,0,0,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SR_FLASHCOMBO_ATK_STEP3 +5018,0,0,0,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SR_FLASHCOMBO_ATK_STEP4 8001,0,0,13:16:19:22:25,0,0,0,99,0,0,none,0,0,545,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HLIF_HEAL 8002,0,0,20:25:30:35:40,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //HLIF_AVOID diff --git a/doc/item_bonus.txt b/doc/item_bonus.txt index 979881c499..c0bfbc3419 100644 --- a/doc/item_bonus.txt +++ b/doc/item_bonus.txt @@ -288,6 +288,9 @@ bonus4 bAddEffOnSkill,sk,eff,n,y; Adds a n/100% chance to cause status eff when ATF_SELF = trigger effect on self ATF_TARGET = trigger effect on target +bonus2 bComaClass,c,n; Adds a n/100% chance to cause Coma when attacking a target of class c (regardless the type of attack) +bonus2 bComaRace,r,n; Adds a n/100% chance to cause Coma when attacking a target of race r (regardless the type of attack) + bonus2 bWeaponComaEle,e,n; Adds a n/100% chance to cause Coma when attacking a target of element e with a normal attack bonus2 bWeaponComaClass,c,n; Adds a n/100% chance to cause Coma when attacking a target of class c with a normal attack bonus2 bWeaponComaRace,r,n; Adds a n/100% chance to cause Coma when attacking a target of race r with a normal attack @@ -332,8 +335,8 @@ bonus bSPDrainValue,n; Heals +n SP with a normal attack bonus2 bSPDrainValueRace,r,n; Heals +n SP when attacking a monster of race r with normal attack bonus2 bSpDrainValueClass,c,n; Heals +n SP when attacking a monster of class c with normal attack -bonus2 bHPDrainRate,x,n; Adds a x/10% chance to drain n% HP when attacking -bonus2 bSPDrainRate,x,n; Adds a x/10% chance to drain n% SP when attacking +bonus2 bHPDrainRate,x,n; Adds a x/10% chance to drain n% HP from inflicted damage when attacking +bonus2 bSPDrainRate,x,n; Adds a x/10% chance to drain n% SP from inflicted damage when attacking HP/SP vanish ------------ @@ -345,19 +348,6 @@ bonus3 bSPVanishRaceRate,r,x,n; Add a x/100% chance of decreasing enemy's SP am HP/SP gain ------------ -bonus bHPGainAttack,n; Heals +n HP with a normal attack -bonus bSPGainAttack,n; Heals +n SP with a normal attack - -bonus bHPGainAttackRate,n; Heals +n% HP of inflicted damage on every hit when attacking an enemy -bonus bSPGainAttackRate,n; Heals +n% SP of inflicted damage on every hit when attacking an enemy -bonus2 bHPGainAttackRate,x,n; Has chance x/10% to heals +n% HP of inflicted damage on every hit when attacking an enemy -bonus2 bSPGainAttackRate,x,n; Has chance x/10% to heals +n% SP of inflicted damage on every hit when attacking an enemy - -bonus2 bHPGainRaceAttack,r,n; Heals +n HP on every hit when attacking an enemy of race r -bonus2 bSPGainRaceAttack,r,n; Heals +n SP on every hit when attacking an enemy of race r -bonus2 bHPGainRaceAttackRate,r,n; Heals +n% HP of inflicted damage on every hit when attacking an enemy of race r -bonus2 bSPGainRaceAttackRate,r,n; Heals +n% SP of inflicted damage on every hit when attacking an enemy of race r - bonus bHPGainValue,n; Heals +n HP when killing an enemy with a physical attack bonus bSPGainValue,n; Heals +n SP when killing an enemy with a physical attack bonus2 bSPGainRace,r,n; Heals +n SP when killing an enemy of race r with a physical attack diff --git a/doc/packet_interserv.txt b/doc/packet_interserv.txt index f73ee07370..fb6403748c 100644 --- a/doc/packet_interserv.txt +++ b/doc/packet_interserv.txt @@ -2632,7 +2632,7 @@ Currently the max packet size is 0xFFFF (see 'WFIFOSET()' in 'src/common/socket. - cmd : packet identification (0x2b0e) - aid - name - - operation_type + - operation_type: 1:block account, 2:ban account, 3:unblock account, 4:unban account, 5:changesex, 6:VIP, 7:changecharsex - timediff - val1 - val2 diff --git a/doc/script_commands.txt b/doc/script_commands.txt index d7ca908d5c..b26a1f0938 100644 --- a/doc/script_commands.txt +++ b/doc/script_commands.txt @@ -3784,6 +3784,13 @@ by default green --------------------------------------- +*showscript ""{,}; + +Makes attached player or GID says a message like shouting a skill name, the message +will be seen to everyone around but not in chat window. + +--------------------------------------- + *warp "",,; This command will take the invoking character to the specified map, and if @@ -4131,6 +4138,20 @@ they will also have their skills reset upon 'changesex'. --------------------------------------- +*changecharsex({}); + +This command will change the gender of the attached character. If it +was male, it will become female, if it was female, it will become male. The +change will be written to the character server, the player will receive the +message: "Need disconnection to perform change-sex request..." and the player +will be immediately kicked to the login screen. When they log back in, they will +be the opposite sex. + +If the character being changed is a Dancer/Gypsy or Bard/Clown class type, +the character will also have their skills reset upon 'changecharsex'. + +--------------------------------------- + *getexp ,{,}; This command will give the invoking character a specified number of base and job diff --git a/doc/status_change.txt b/doc/status_change.txt index b7c11b3fcb..70bcf6e362 100644 --- a/doc/status_change.txt +++ b/doc/status_change.txt @@ -751,8 +751,9 @@ SC_SPIRIT () val1: SC_COMA () - desc: - val1: + desc: Vanish HP to 1 and SP to 0 + val1: (meaningless) + val2: If 1 means do not remove SP SC_INTRAVISION () desc: diff --git a/npc/re/quests/quests_malangdo.txt b/npc/re/quests/quests_malangdo.txt index 086d9e78e7..c07cc3b35e 100644 --- a/npc/re/quests/quests_malangdo.txt +++ b/npc/re/quests/quests_malangdo.txt @@ -10699,16 +10699,16 @@ function script F_Cat_Hard_Biscuit { //11536 heal -100,0; break; case 2: - unittalk getcharid(3),"Huuph...! Yucky..! Wa, Water...!!"; + showscript "Huuph...! Yucky..! Wa, Water...!!"; sc_start SC_Stun,3000,0,5000,0; break; case 3: - unittalk getcharid(3),"Yeeyuck...!! This is rotten!!"; + showscript "Yeeyuck...!! This is rotten!!"; sc_start SC_POISON,50000,0; break; case 4: specialeffect2 EF_HIT4; - unittalk getcharid(3),"Arrrrrgggg...!! Bu, Bu, Bugggggg!!!!!"; + showscript "Arrrrrgggg...!! Bu, Bu, Bugggggg!!!!!"; getitem 11537,1; //Rice_Weevil_Bug break; } @@ -10719,32 +10719,32 @@ function script F_Rice_Weevil_Bug { //11537 switch (rand(1,6)) { case 1: specialeffect2 EF_POISONHIT; - unittalk getcharid(3),"Errrgg!!! This is so... bitter....!!"; + showscript "Errrgg!!! This is so... bitter....!!"; heal 0,-50; break; case 2: specialeffect2 EF_HEAL; - unittalk getcharid(3),"....well, at least this is good for my health."; + showscript "....well, at least this is good for my health."; percentheal 15,0; break; case 3: specialeffect2 EF_POISONHIT; - unittalk getcharid(3),"Phewphew!! Argh.... Is this poisoned or what?!"; + showscript "Phewphew!! Argh.... Is this poisoned or what?!"; heal 0,-100; break; case 4: specialeffect2 EF_POISONHIT; - unittalk getcharid(3),"Whasdfhwkljhrtklwert....!!"; + showscript "Whasdfhwkljhrtklwert....!!"; heal 0,-200; break; case 5: specialeffect2 EF_HEAL; - unittalk getcharid(3),"It's ok, no one saw me yet..."; + showscript "It's ok, no one saw me yet..."; percentheal 10,0; break; case 6: specialeffect2 EF_HEAL; - unittalk getcharid(3),"I really need something to eat... ?? Sorry, little buggy."; + showscript "I really need something to eat... ?? Sorry, little buggy."; percentheal 5,0; break; } diff --git a/sql-files/item_db.sql b/sql-files/item_db.sql index 924a852263..22b883d206 100644 --- a/sql-files/item_db.sql +++ b/sql-files/item_db.sql @@ -513,7 +513,7 @@ REPLACE INTO `item_db` VALUES (1128,'Hae_Dong_Gum_','Haedonggum',5,50000,NULL,90 REPLACE INTO `item_db` VALUES (1129,'Flamberge','Flamberge',5,60000,NULL,1500,150,NULL,1,0,0x00004080,7,2,2,3,27,1,2,NULL,NULL,NULL); REPLACE INTO `item_db` VALUES (1130,'Nagan','Nagan',5,20,NULL,500,120,NULL,1,0,0x000654E2,7,2,2,4,40,1,2,'skill "TF_DOUBLE",5; bonus bDoubleRate,25; bonus2 bAddRace,RC_DemiHuman,5; bonus2 bAddRace,RC_Player,5;',NULL,NULL); REPLACE INTO `item_db` VALUES (1131,'Ice_Falchon','Ice Falchion',5,20,NULL,600,100,NULL,1,0,0x000654E2,7,2,2,4,40,1,2,'bonus bAtkEle,Ele_Water; bonus2 bAddEff,Eff_Freeze,500; bonus2 bAddEff2,Eff_Freeze,10; skill "MG_COLDBOLT",3; bonus3 bAutoSpell,"MG_COLDBOLT",3,100;',NULL,NULL); -REPLACE INTO `item_db` VALUES (1132,'Edge','Edge',5,20,NULL,700,115,NULL,1,0,0x000654E2,7,2,2,4,40,1,2,'bonus2 bAddEff,Eff_Curse,30; bonus2 bWeaponComaClass,Class_Normal,10;',NULL,NULL); +REPLACE INTO `item_db` VALUES (1132,'Edge','Edge',5,20,NULL,700,115,NULL,1,0,0x000654E2,7,2,2,4,40,1,2,'bonus2 bAddEff,Eff_Curse,30; bonus2 bComaClass,Class_Normal,10;',NULL,NULL); REPLACE INTO `item_db` VALUES (1133,'Fire_Brand','Fireblend',5,20,NULL,500,100,NULL,1,0,0x000654E2,7,2,2,4,40,1,2,'bonus bAtkEle,Ele_Fire; skill "MG_FIREBOLT",3; bonus3 bAutoSpell,"MG_FIREBOLT",3,100;',NULL,NULL); REPLACE INTO `item_db` VALUES (1134,'Scissores_Sword','Caesar\'s Sword',5,20,NULL,700,140,NULL,1,0,0x000654E2,7,2,2,4,40,1,2,'bonus2 bAddRace,RC_Plant,25; bonus bIgnoreDefRace,RC_Plant;',NULL,NULL); REPLACE INTO `item_db` VALUES (1135,'Cutlas','Cutlus',5,20,NULL,900,150,NULL,1,0,0x000654E2,7,2,2,4,40,1,2,'skill "SM_BASH",5; bonus bStr,2; bonus bDef,1;',NULL,NULL); @@ -691,11 +691,11 @@ REPLACE INTO `item_db` VALUES (1361,'Two_Handed_Axe_','Two-Handed Axe',5,55000,N REPLACE INTO `item_db` VALUES (1362,'Two_Handed_Axe__','Two-Handed Axe',5,55000,NULL,2500,185,NULL,1,0,0x000444A2,7,2,34,3,30,1,7,NULL,NULL,NULL); REPLACE INTO `item_db` VALUES (1363,'Brood_Axe','Bloody Axe',5,20,NULL,4000,170,NULL,1,0,0x000444A2,7,2,34,4,44,1,7,'bonus bStr,10; bonus bSpeedRate,25;',NULL,NULL); REPLACE INTO `item_db` VALUES (1364,'Great_Axe','Great Axe',5,20,NULL,1800,187,NULL,1,0,0x000444A2,7,2,34,4,44,1,7,'bonus2 bAddSkillBlow,"MC_MAMMONITE",5; bonus2 bAddEff,Eff_Stun,1500;',NULL,NULL); -REPLACE INTO `item_db` VALUES (1365,'Sabbath','Sabbath',5,20,NULL,2300,120,NULL,1,0,0x000444A2,7,2,34,4,44,1,7,'bonus bAtkEle,Ele_Dark; bonus2 bWeaponComaRace,RC_Demon,50; bonus2 bCriticalAddRace,RC_Undead,50;',NULL,NULL); +REPLACE INTO `item_db` VALUES (1365,'Sabbath','Sabbath',5,20,NULL,2300,120,NULL,1,0,0x000444A2,7,2,34,4,44,1,7,'bonus bAtkEle,Ele_Dark; bonus2 bComaRace,RC_Demon,50; bonus2 bCriticalAddRace,RC_Undead,50;',NULL,NULL); REPLACE INTO `item_db` VALUES (1366,'Right_Epsilon','Light Epsilon',5,20,NULL,2300,180,NULL,1,0,0x000444A2,7,2,34,4,44,1,7,'bonus bAtkEle,Ele_Holy; skill "AL_HEAL",3; bonus2 bAddRace,RC_Demon,3;',NULL,NULL); -REPLACE INTO `item_db` VALUES (1367,'Slaughter','Slaughter',5,20,NULL,2500,120,NULL,1,0,0x000444A2,7,2,34,4,44,1,7,'bonus bAtkEle,Ele_Earth; bonus bIgnoreDefRace,RC_Brute; bonus2 bWeaponComaRace,RC_Brute,40;',NULL,NULL); +REPLACE INTO `item_db` VALUES (1367,'Slaughter','Slaughter',5,20,NULL,2500,120,NULL,1,0,0x000444A2,7,2,34,4,44,1,7,'bonus bAtkEle,Ele_Earth; bonus bIgnoreDefRace,RC_Brute; bonus2 bComaRace,RC_Brute,40;',NULL,NULL); REPLACE INTO `item_db` VALUES (1368,'Tomahawk','Tomahawk',5,20,NULL,2500,165,NULL,1,0,0x000444A2,7,2,34,4,44,1,7,'bonus bAtkEle,Ele_Wind; skill "ITM_TOMAHAWK",1;',NULL,NULL); -REPLACE INTO `item_db` VALUES (1369,'Guillotine','Guillotine',5,20,NULL,3000,215,NULL,1,0,0x000444A2,7,2,34,4,44,1,7,'bonus2 bWeaponComaRace,RC_DemiHuman,30; bonus2 bWeaponComaRace,RC_Player,30; bonus2 bSPGainRaceAttack,RC_DemiHuman,2; bonus2 bSPGainRaceAttack,RC_Player,2; bonus2 bSPGainRace,RC_DemiHuman,20; bonus2 bSPGainRace,RC_Player,20;',NULL,NULL); +REPLACE INTO `item_db` VALUES (1369,'Guillotine','Guillotine',5,20,NULL,3000,215,NULL,1,0,0x000444A2,7,2,34,4,44,1,7,'bonus2 bComaRace,RC_DemiHuman,30; bonus2 bComaRace,RC_Player,30; bonus2 bSPDrainValueRace,RC_DemiHuman,2; bonus2 bSPDrainValueRace,RC_Player,2; bonus2 bSPGainRace,RC_DemiHuman,20; bonus2 bSPGainRace,RC_Player,20;',NULL,NULL); REPLACE INTO `item_db` VALUES (1370,'Doom_Slayer','Doom Slayer',5,20,NULL,6000,10,NULL,1,0,0x000444A2,7,2,34,4,80,1,7,'bonus bAspdRate,-40; bonus bUseSPrate,100; if(readparam(bStr)>=95){ bonus bBaseAtk,340; bonus2 bAddEff,Eff_Stun,3000; bonus bBreakArmorRate,500; }',NULL,NULL); REPLACE INTO `item_db` VALUES (1371,'Doom_Slayer_','Doom Slayer',5,20,NULL,6000,10,NULL,1,1,0x000444A2,7,2,34,4,80,1,7,'bonus bAspdRate,-40; bonus bUseSPrate,100; if(readparam(bStr)>=95){ bonus bBaseAtk,340; bonus2 bAddEff,Eff_Stun,3000; bonus bBreakArmorRate,500; }',NULL,NULL); REPLACE INTO `item_db` VALUES (1372,'Right_Epsilon_C','Light Epsilon',5,1,NULL,0,229,NULL,1,0,0x000444A2,7,2,34,4,1,0,7,'bonus bAtkEle,Ele_Holy; skill "AL_HEAL",3; bonus2 bAddRace,RC_Demon,3; bonus bStr,10; bonus bSpeedRate,25;',NULL,NULL); @@ -817,7 +817,7 @@ REPLACE INTO `item_db` VALUES (1522,'Stunner','Stunner',5,60000,NULL,2000,140,NU REPLACE INTO `item_db` VALUES (1523,'Spike','Spike',5,20,NULL,700,85,NULL,1,0,0x00008110,7,2,2,4,40,1,8,'bonus bCritical,40; bonus bDefRate,-67; bonus bDef2Rate,-67;',NULL,NULL); REPLACE INTO `item_db` VALUES (1524,'Golden_Mace','Golden Mace',5,20,NULL,800,110,NULL,1,1,0x00008110,7,2,2,4,40,1,8,'bonus2 bAddRace,RC_Undead,10; bonus bUnbreakableWeapon,0;',NULL,NULL); REPLACE INTO `item_db` VALUES (1525,'Long_Mace','Long Mace',5,20,NULL,800,135,NULL,3,0,0x00008110,7,2,2,4,40,1,8,'bonus bLongAtkDef,10;',NULL,NULL); -REPLACE INTO `item_db` VALUES (1526,'Slash','Slash',5,20,NULL,1000,145,NULL,1,0,0x00008110,7,2,2,4,40,1,8,'bonus2 bAddRace,RC_Undead,15; bonus2 bWeaponComaRace,RC_Undead,10; bonus2 bExpAddRace,RC_Undead,5;',NULL,NULL); +REPLACE INTO `item_db` VALUES (1526,'Slash','Slash',5,20,NULL,1000,145,NULL,1,0,0x00008110,7,2,2,4,40,1,8,'bonus2 bAddRace,RC_Undead,15; bonus2 bComaRace,RC_Undead,10; bonus2 bExpAddRace,RC_Undead,5;',NULL,NULL); REPLACE INTO `item_db` VALUES (1527,'Quadrille','Quadrille',5,20,NULL,900,165,NULL,1,0,0x00008110,7,2,2,4,40,1,8,'bonus2 bAddRace,RC_Undead,10; bonus2 bAddRace,RC_DemiHuman,10; bonus2 bAddRace,RC_Player,10; bonus2 bAddEle,Ele_Earth,10;',NULL,NULL); REPLACE INTO `item_db` VALUES (1528,'Grand_Cross','Grand Cross',5,20,NULL,1500,140,NULL,1,0,0x00008110,7,2,2,4,40,1,8,'bonus bAtkEle,Ele_Holy; skill "PR_TURNUNDEAD",3; bonus3 bAutoSpell,"PR_TURNUNDEAD",3,100; bonus2 bSPDrainValueRace,RC_Undead,1; bonus2 bSPGainRace,RC_Undead,3;',NULL,NULL); REPLACE INTO `item_db` VALUES (1529,'Iron_Driver','Iron Driver',5,20,NULL,3000,155,NULL,2,0,0x00008100,7,2,2,3,78,1,8,NULL,NULL,NULL); @@ -856,7 +856,7 @@ REPLACE INTO `item_db` VALUES (1561,'Hardback','Hardcover Book',5,20,NULL,1500,1 REPLACE INTO `item_db` VALUES (1562,'Bible_Of_Battlefield','Battlefield Textbook',5,20,NULL,700,110,NULL,1,1,0x00410100,7,2,2,4,80,0,15,'bonus bInt,3; bonus3 bAutoSpell,"AL_BLESSING",3+(getskilllv("AL_BLESSING")>3)*(getskilllv("AL_BLESSING")-3),20;',NULL,NULL); REPLACE INTO `item_db` VALUES (1563,'Diary_Of_Great_Sage_C','Sage\'s Diary',5,1,NULL,0,135,NULL,1,2,0x00410100,7,2,2,3,1,0,15,'bonus bMatkRate,20; bonus bAspdRate,5;',NULL,NULL); REPLACE INTO `item_db` VALUES (1564,'Encyclopedia','Encyclopedia',5,20,NULL,2000,110,NULL,1,2,0x00410100,7,2,2,3,70,1,15,'bonus bMatkRate,15; bonus bInt,3; bonus bDex,2; bonus bCritical,20+((readparam(bLuk)*2)/10);',NULL,NULL); -REPLACE INTO `item_db` VALUES (1565,'Death_Note','Ledger of Death',5,20,NULL,1000,137,NULL,1,2,0x00410100,7,2,2,4,85,1,15,'bonus bMatkRate,15; bonus bStr,3; bonus bInt,3; bonus bLuk,-20; bonus2 bWeaponComaRace,RC_DemiHuman,10; bonus2 bWeaponComaRace,RC_Player,10; bonus bAspdRate,getrefine(); if(BaseJob==Job_Sage) bonus3 bAutoSpell,"NPC_HELLJUDGEMENT",5,20;',NULL,NULL); +REPLACE INTO `item_db` VALUES (1565,'Death_Note','Ledger of Death',5,20,NULL,1000,137,NULL,1,2,0x00410100,7,2,2,4,85,1,15,'bonus bMatkRate,15; bonus bStr,3; bonus bInt,3; bonus bLuk,-20; bonus2 bComaRace,RC_DemiHuman,10; bonus2 bComaRace,RC_Player,10; bonus bAspdRate,getrefine(); if(BaseJob==Job_Sage) bonus3 bAutoSpell,"NPC_HELLJUDGEMENT",5,20;',NULL,NULL); REPLACE INTO `item_db` VALUES (1566,'Diary_Of_Great_Basil','Diary Of Great Basil',5,20,NULL,0,120,NULL,1,0,0x00410100,7,2,2,1,0,0,15,'bonus2 bAddClass,Class_All,50;',NULL,NULL); REPLACE INTO `item_db` VALUES (1567,'Hardback_C','Refined Hardcover Book',5,1,NULL,0,168,NULL,1,0,0x00410100,7,2,2,4,0,0,15,'bonus bStr,5; bonus bDex,2; bonus bMatkRate,20;',NULL,NULL); REPLACE INTO `item_db` VALUES (1568,'Book_Of_Billows_','Book of Billows',5,35000,NULL,750,90,NULL,1,3,0x00410100,7,2,2,3,27,1,15,'bonus bAtkEle,Ele_Water;',NULL,NULL); @@ -870,7 +870,7 @@ REPLACE INTO `item_db` VALUES (1575,'BF_Book2','Valorous Battle Strategy Book',5 REPLACE INTO `item_db` VALUES (1576,'Krieger_Book1','Glorious Tablet',5,20,NULL,0,90,NULL,1,0,0x00410100,7,2,2,4,80,1,15,'bonus bMatkRate,15; bonus2 bAddRace,RC_DemiHuman,80; bonus2 bAddRace,RC_Player,80; bonus2 bIgnoreDefRaceRate,RC_DemiHuman,25; bonus2 bIgnoreDefRaceRate,RC_Player,25; bonus bUnbreakableWeapon,0; if(getrefine()>5) { bonus2 bAddRace,RC_DemiHuman,(getrefine()-4)*(getrefine()-4); bonus2 bAddRace,RC_Player,(getrefine()-4)*(getrefine()-4); bonus2 bIgnoreDefRaceRate,RC_DemiHuman,5; bonus2 bIgnoreDefRaceRate,RC_Player,5; } if(getrefine()>8) autobonus "{ bonus bBaseAtk,200; }",30,3000,BF_WEAPON,"{ specialeffect2 EF_BASH3D; }";',NULL,NULL); REPLACE INTO `item_db` VALUES (1577,'Krieger_Book2','Glorious Apocalypse',5,20,NULL,0,90,NULL,1,0,0x00410100,7,2,2,4,80,1,15,'bonus bMatkRate,15; bonus2 bAddRace,RC_DemiHuman,80; bonus2 bAddRace,RC_Player,80; bonus2 bIgnoreDefRaceRate,RC_DemiHuman,25; bonus2 bIgnoreDefRaceRate,RC_Player,25; bonus bUnbreakableWeapon,0; if(getrefine()>5) bonus2 bIgnoreDefRaceRate,RC_DemiHuman,5; bonus2 bIgnoreDefRaceRate,RC_Player,5; if(getrefine()>8) { bonus bMatkRate,5; bonus bCastrate,-5; bonus bDelayRate,-5; }',NULL,NULL); REPLACE INTO `item_db` VALUES (1578,'Book_Of_Prayer','Book Of Prayer',5,20,NULL,0,140,NULL,1,0,0x00410100,7,2,2,3,0,0,15,'bonus bVit,2; bonus bMdef,2; bonus bMaxSPrate,10;',NULL,NULL); -REPLACE INTO `item_db` VALUES (1579,'Death_Note_M','Book of the Dead',5,20,NULL,1000,137,NULL,1,2,0x00410100,7,2,2,4,85,1,15,'bonus bMatkRate,15; bonus bStr,3; bonus bInt,3; bonus bLuk,-20; bonus2 bWeaponComaRace,RC_DemiHuman,10; bonus2 bWeaponComaRace,RC_Player,10; bonus bAspdRate,getrefine(); if(BaseJob==Job_Sage) bonus3 bAutoSpell,"NPC_HELLJUDGEMENT",5,20;',NULL,NULL); +REPLACE INTO `item_db` VALUES (1579,'Death_Note_M','Book of the Dead',5,20,NULL,1000,137,NULL,1,2,0x00410100,7,2,2,4,85,1,15,'bonus bMatkRate,15; bonus bStr,3; bonus bInt,3; bonus bLuk,-20; bonus2 bComaRace,RC_DemiHuman,10; bonus2 bComaRace,RC_Player,10; bonus bAspdRate,getrefine(); if(BaseJob==Job_Sage) bonus3 bAutoSpell,"NPC_HELLJUDGEMENT",5,20;',NULL,NULL); REPLACE INTO `item_db` VALUES (1580,'Encyclopedia_C','Giant Encyclopedia',5,0,NULL,0,145,NULL,1,0,0x00410100,7,2,2,3,0,0,15,'bonus bMatkRate,15; bonus bInt,3; bonus bDex,2; bonus bCritical,20+((readparam(bLuk)*2)/10); bonus2 bAddSize,Size_All,40;',NULL,NULL); REPLACE INTO `item_db` VALUES (1581,'F_Diary_Of_Great_Sage_C','Diary Of Great Sage',5,1,NULL,0,135,NULL,1,2,0x00410100,7,2,2,3,1,0,15,NULL,NULL,NULL); REPLACE INTO `item_db` VALUES (1582,'E_Diary_Of_Great_Sage_C','Diary Of Great Sage',5,1,NULL,0,135,NULL,1,2,0x00410100,7,2,2,3,1,0,15,NULL,NULL,NULL); @@ -1448,7 +1448,7 @@ REPLACE INTO `item_db` VALUES (2550,'Fisher\'s_Muffler','Fisher\'s Muffler',4,20 REPLACE INTO `item_db` VALUES (2551,'Rider_Insignia_M','Crest of the Rider',4,20,NULL,500,NULL,4,NULL,1,0xFFFFFFFE,2,2,4,NULL,55,1,0,'bonus bAgi,2;',NULL,NULL); REPLACE INTO `item_db` VALUES (2552,'Mithril_Magic_Cape_M','Mithril Magic Manteau',4,20,NULL,400,NULL,3,NULL,1,0x00098B1C,2,2,4,NULL,70,1,0,'bonus bMdef,3; bonus5 bAutoSpellWhenHit,"NPC_ANTIMAGIC",6,200,BF_MAGIC,0;',NULL,NULL); REPLACE INTO `item_db` VALUES (2553,'Dragon_Manteau','Dragon Manteau',4,20,NULL,1000,NULL,5,NULL,1,0xFFFFFFFE,2,2,4,NULL,0,1,0,'bonus bAgi,1; bonus bMdef,5;',NULL,NULL); -REPLACE INTO `item_db` VALUES (2554,'Piece_Of_Angent_Skin','Nydhorgg\'s Shadow Garb',4,20,NULL,400,NULL,5,NULL,1,0xFFFFFFFE,2,2,4,NULL,90,1,0,'bonus2 bSubEle,Ele_Neutral,7; bonus2 bSubEle,Ele_Water,7; bonus2 bSubEle,Ele_Earth,7; bonus2 bSubEle,Ele_Fire,7; bonus2 bSubEle,Ele_Wind,7; bonus2 bSubEle,Ele_Poison,7; bonus2 bSubEle,Ele_Holy,7; bonus2 bSubEle,Ele_Dark,7; bonus2 bSubEle,Ele_Ghost,7; bonus2 bSubEle,Ele_Undead,7; bonus bMaxSP,(BaseLevel/3)+(getrefine()*10); bonus2 bSPGainAttackRate,100,1; bonus bMdef,3;',NULL,NULL); +REPLACE INTO `item_db` VALUES (2554,'Piece_Of_Angent_Skin','Nydhorgg\'s Shadow Garb',4,20,NULL,400,NULL,5,NULL,1,0xFFFFFFFE,2,2,4,NULL,90,1,0,'bonus2 bSubEle,Ele_Neutral,7; bonus2 bSubEle,Ele_Water,7; bonus2 bSubEle,Ele_Earth,7; bonus2 bSubEle,Ele_Fire,7; bonus2 bSubEle,Ele_Wind,7; bonus2 bSubEle,Ele_Poison,7; bonus2 bSubEle,Ele_Holy,7; bonus2 bSubEle,Ele_Dark,7; bonus2 bSubEle,Ele_Ghost,7; bonus2 bSubEle,Ele_Undead,7; bonus bMaxSP,(BaseLevel/3)+(getrefine()*10); bonus2 bSPDrainRate,10,1; bonus bMdef,3;',NULL,NULL); # Accessories #=================================================================== REPLACE INTO `item_db` VALUES (2601,'Ring','Ring',4,30000,NULL,100,NULL,0,NULL,0,0xFFFFFFFE,7,2,136,NULL,20,0,0,'bonus bStr,2;',NULL,NULL); @@ -1828,7 +1828,7 @@ REPLACE INTO `item_db` VALUES (4168,'Dark_Lord_Card','Dark Lord Card',6,20,NULL, REPLACE INTO `item_db` VALUES (4169,'Dark_Illusion_Card','Dark Illusion Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,769,NULL,NULL,NULL,NULL,'bonus bMaxHPrate,-10; bonus bMaxSPrate,-10; bonus bCastrate,-10;',NULL,NULL); REPLACE INTO `item_db` VALUES (4170,'Dark_Frame_Card','Dark Frame Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,16,NULL,NULL,NULL,NULL,'bonus2 bAddEffWhenHit,Eff_Stone,600;',NULL,NULL); REPLACE INTO `item_db` VALUES (4171,'Dark_Priest_Card','Dark Priest Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,NULL,NULL,'bonus2 bSPVanishRate,50,10; if(BaseJob==Job_Sage) bonus bSPDrainValue,1;',NULL,NULL); -REPLACE INTO `item_db` VALUES (4172,'The_Paper_Card','The Paper Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,NULL,NULL,'bonus bCritAtkRate,20; bonus bSPGainAttack,-1;',NULL,NULL); +REPLACE INTO `item_db` VALUES (4172,'The_Paper_Card','The Paper Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,NULL,NULL,'bonus bCritAtkRate,20; bonus bSPDrainValue,-1;',NULL,NULL); REPLACE INTO `item_db` VALUES (4173,'Demon_Pungus_Card','Demon Pungus Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,16,NULL,NULL,NULL,NULL,'bonus2 bAddEffWhenHit,Eff_Sleep,600;',NULL,NULL); REPLACE INTO `item_db` VALUES (4174,'Deviling_Card','Deviling Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,4,NULL,NULL,NULL,NULL,'bonus2 bSubEle,Ele_Neutral,50; bonus2 bSubEle,Ele_Water,-50; bonus2 bSubEle,Ele_Earth,-50; bonus2 bSubEle,Ele_Fire,-50; bonus2 bSubEle,Ele_Wind,-50; bonus2 bSubEle,Ele_Poison,-50; bonus2 bSubEle,Ele_Holy,-50; bonus2 bSubEle,Ele_Dark,-50; bonus2 bSubEle,Ele_Ghost,-50; bonus2 bSubEle,Ele_Undead,-50;',NULL,NULL); REPLACE INTO `item_db` VALUES (4175,'Poison_Toad_Card','Poisonous Toad Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,136,NULL,NULL,NULL,NULL,'bonus3 bAutoSpell,"TF_POISON",1,20; bonus2 bAddSkillBlow,52,5;',NULL,NULL); @@ -1932,12 +1932,12 @@ REPLACE INTO `item_db` VALUES (4272,'Dancing_Dragon_Card','Zhu Po Long Card',6,2 REPLACE INTO `item_db` VALUES (4273,'Shellfish_Card','Shell Fish Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,NULL,NULL,'bonus bBaseAtk,5; bonus2 bAddDamageClass,1073,30;',NULL,NULL); REPLACE INTO `item_db` VALUES (4274,'Zombie_Master_Card','Zombie Master Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,NULL,NULL,'bonus2 bSPGainRace,RC_Undead,5;',NULL,'heal 0,-5;'); REPLACE INTO `item_db` VALUES (4275,'Zombie_Prisoner_Card','Zombie Prisoner Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,64,NULL,NULL,NULL,NULL,'bonus2 bSubRace,RC_Undead,-20; bonus2 bExpAddRace,RC_Undead,10;',NULL,NULL); -REPLACE INTO `item_db` VALUES (4276,'Lord_Of_Death_Card','Lord of The Dead Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,NULL,NULL,'bonus3 bAddEff,Eff_Stun,500,ATF_SHORT; bonus3 bAddEff,Eff_Curse,500,ATF_SHORT; bonus3 bAddEff,Eff_Silence,500,ATF_SHORT; bonus3 bAddEff,Eff_Poison,500,ATF_SHORT; bonus3 bAddEff,Eff_Bleeding,500,ATF_SHORT; bonus2 bWeaponComaClass,Class_Normal,1;',NULL,NULL); +REPLACE INTO `item_db` VALUES (4276,'Lord_Of_Death_Card','Lord of The Dead Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,NULL,NULL,'bonus3 bAddEff,Eff_Stun,500,ATF_SHORT; bonus3 bAddEff,Eff_Curse,500,ATF_SHORT; bonus3 bAddEff,Eff_Silence,500,ATF_SHORT; bonus3 bAddEff,Eff_Poison,500,ATF_SHORT; bonus3 bAddEff,Eff_Bleeding,500,ATF_SHORT; bonus2 bComaClass,Class_Normal,1;',NULL,NULL); REPLACE INTO `item_db` VALUES (4277,'Zherlthsh_Card','Zealotus Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,32,NULL,NULL,NULL,NULL,'bonus bLuk,2; bonus2 bSkillAtk,"BA_MUSICALSTRIKE",10; bonus2 bSkillAtk,"DC_THROWARROW",10;',NULL,NULL); REPLACE INTO `item_db` VALUES (4278,'Gibbet_Card','Gibbet Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,769,NULL,NULL,NULL,NULL,'if(getrefine()<6) bonus bMdef,5;',NULL,NULL); REPLACE INTO `item_db` VALUES (4279,'Deleter_Card','Earth Deleter Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,16,NULL,NULL,NULL,NULL,'bonus bSPrecovRate,-100; bonus bSPGainValue,10;',NULL,'heal 0,-100;'); REPLACE INTO `item_db` VALUES (4280,'Geographer_Card','Geographer Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,16,NULL,NULL,NULL,NULL,'bonus3 bAutoSpellWhenHit,"AL_BLESSING",2+8*(getskilllv("AL_BLESSING")==10),30;',NULL,NULL); -REPLACE INTO `item_db` VALUES (4281,'Zipper_Bear_Card','Zipper Bear Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,NULL,NULL,'bonus bBaseAtk,30; bonus bSPGainAttack,-1; if(BaseClass==Job_Merchant) bonus bUnbreakableWeapon,0;',NULL,NULL); +REPLACE INTO `item_db` VALUES (4281,'Zipper_Bear_Card','Zipper Bear Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,NULL,NULL,'bonus bBaseAtk,30; bonus bSPDrainValue,-1; if(BaseClass==Job_Merchant) bonus bUnbreakableWeapon,0;',NULL,NULL); REPLACE INTO `item_db` VALUES (4282,'Tengu_Card','Tengu Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,136,NULL,NULL,NULL,NULL,'bonus2 bAddMonsterDropItemGroup,IG_Recovery,600;',NULL,NULL); REPLACE INTO `item_db` VALUES (4283,'Greatest_General_Card','Greatest General Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,136,NULL,NULL,NULL,NULL,'bonus3 bAutoSpell,"MO_CALLSPIRITS",5,2+18*(BaseClass==Job_Acolyte);',NULL,NULL); REPLACE INTO `item_db` VALUES (4284,'Chepet_Card','Chepet Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,NULL,NULL,'bonus4 bAutoSpell,"AL_HEAL",5,50,1;',NULL,NULL); @@ -5503,7 +5503,7 @@ REPLACE INTO `item_db` VALUES (13309,'Huuma_Giant_Wheel_C','Huuma Giant Wheel Sh REPLACE INTO `item_db` VALUES (13400,'Cutlas_','Cutlus',5,20,NULL,900,150,NULL,1,1,0x000654E2,7,2,2,4,40,1,2,'skill "SM_BASH",5; bonus bStr,2; bonus bDef,1;',NULL,NULL); REPLACE INTO `item_db` VALUES (13401,'Excalibur_C','Excalibur',5,1,NULL,0,199,NULL,1,0,0x000654E2,7,2,2,4,1,0,2,'bonus bInt,10; bonus bLuk,10; bonus bAtkEle,Ele_Holy;',NULL,NULL); REPLACE INTO `item_db` VALUES (13402,'Cutlas_C','Cutlus',5,2,NULL,0,185,NULL,1,0,0x000654E2,7,2,2,4,0,0,2,'skill "SM_BASH",5; bonus bStr,2; bonus bDef,1;',NULL,NULL); -REPLACE INTO `item_db` VALUES (13403,'Solar_Sword_C','Solar Sword',5,2,NULL,0,120,NULL,1,0,0x000654E2,7,2,2,4,0,0,2,'bonus bAtkEle,Ele_Fire; bonus bHPGainAttackRate,1; bonus2 bSPLossRate,15,10000;',NULL,NULL); +REPLACE INTO `item_db` VALUES (13403,'Solar_Sword_C','Solar Sword',5,2,NULL,0,120,NULL,1,0,0x000654E2,7,2,2,4,0,0,2,'bonus bAtkEle,Ele_Fire; bonus bHPDrainRate,1; bonus2 bSPLossRate,15,10000;',NULL,NULL); REPLACE INTO `item_db` VALUES (13404,'Platinum_Shotel','Platinum Shotel',5,20,NULL,1500,130,NULL,1,1,0x000654E2,7,2,2,4,55,1,2,'bonus bCritical,50;',NULL,NULL); REPLACE INTO `item_db` VALUES (13405,'Curved_Sword','Curved Sword',5,20,NULL,800,125,NULL,1,2,0x000654E2,7,2,2,4,55,1,2,'bonus bAspdRate,10; bonus2 bAddEff,Eff_Curse,300;',NULL,NULL); REPLACE INTO `item_db` VALUES (13406,'Edger','Edger',5,20,NULL,0,120,NULL,1,0,0x000654E2,7,2,2,1,0,0,2,'bonus2 bAddClass,Class_All,50;',NULL,NULL); diff --git a/sql-files/item_db_re.sql b/sql-files/item_db_re.sql index e1b3b8c2ea..d1ab3b4d74 100644 --- a/sql-files/item_db_re.sql +++ b/sql-files/item_db_re.sql @@ -196,11 +196,11 @@ REPLACE INTO `item_db_re` VALUES (667,'Gift_Box_4','Gift Box',2,1000,NULL,200,NU REPLACE INTO `item_db_re` VALUES (668,'Handsei','Red Envelope',2,0,NULL,20,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'set Zeny,Zeny+rand(1000,10000);',NULL,NULL); REPLACE INTO `item_db_re` VALUES (669,'Rice_Cake_Soup','Tempting Rice-Cake Soup',0,500,NULL,100,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'percentheal -100,-100;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (670,'Gold_Coin_Moneybag','Bag of Gold Coins',3,100000,NULL,400,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); -REPLACE INTO `item_db_re` VALUES (671,'Gold_Coin','Gold Coin',3,10000,NULL,0,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'/*goldpoint++; (For Roulette game)*/',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (671,'Gold_Coin','Gold Coin',2,10000,NULL,0,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'RouletteGold++;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (672,'Copper_Coin_Moneybag','Bag of Bronze Coins',3,1000,NULL,400,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); -REPLACE INTO `item_db_re` VALUES (673,'Copper_Coin','Bronze Coin',3,100,NULL,40,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); +REPLACE INTO `item_db_re` VALUES (673,'Copper_Coin','Bronze Coin',2,100,NULL,40,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'RouletteBronze++;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (674,'Mithril_Coin','Mithril Coin',3,5000,NULL,40,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); -REPLACE INTO `item_db_re` VALUES (675,'Silver_Coin','Silver Coin',3,5000,NULL,0,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'/*silverpoint++; (For Roulette game)*/',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (675,'Silver_Coin','Silver Coin',2,5000,NULL,0,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'RouletteSilver++;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (676,'Silver_Coin_Moneybag','Bag of Silver Coins',3,50000,NULL,400,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (677,'White_Gold_Coin','Platinum Coin',3,2000,NULL,40,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (678,'Poison_Bottle','Poison Bottle',2,5000,NULL,100,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'if(Class == Job_Assassin_Cross || Class == Job_Guillotine_Cross || Class == Job_Guillotine_Cross_T) { sc_start SC_DPOISON,60000,0; sc_start SC_ASPDPOTION3,60000,9; } else percentheal -100,-100;',NULL,NULL); @@ -514,7 +514,7 @@ REPLACE INTO `item_db_re` VALUES (1128,'Hae_Dong_Gum_','Haedonggum',5,50000,NULL REPLACE INTO `item_db_re` VALUES (1129,'Flamberge','Flamberge',5,60000,NULL,1500,'150',NULL,1,0,0x00004080,63,2,2,3,'27',1,2,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (1130,'Nagan','Nagan',5,20,NULL,500,'120',NULL,1,0,0x000654E2,63,2,2,4,'40',1,2,'skill "TF_DOUBLE",5; bonus bDoubleRate,25; bonus2 bAddRace,RC_DemiHuman,5; bonus2 bAddRace,RC_Player,5;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1131,'Ice_Falchon','Ice Falchion',5,20,NULL,600,'100',NULL,1,0,0x000654E2,63,2,2,4,'40',1,2,'bonus bAtkEle,Ele_Water; bonus2 bAddEff,Eff_Freeze,500; bonus2 bAddEff2,Eff_Freeze,10; skill "MG_COLDBOLT",3; bonus3 bAutoSpell,"MG_COLDBOLT",3,100;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (1132,'Edge','Edge',5,20,NULL,700,'115',NULL,1,0,0x000654E2,63,2,2,4,'40',1,2,'bonus2 bAddEff,Eff_Curse,30; bonus2 bWeaponComaClass,Class_Normal,10;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (1132,'Edge','Edge',5,20,NULL,700,'115',NULL,1,0,0x000654E2,63,2,2,4,'40',1,2,'bonus2 bAddEff,Eff_Curse,30; bonus2 bComaClass,Class_Normal,10;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1133,'Fire_Brand','Fireblend',5,20,NULL,500,'100',NULL,1,0,0x000654E2,63,2,2,4,'40',1,2,'bonus bAtkEle,Ele_Fire; skill "MG_FIREBOLT",3; bonus3 bAutoSpell,"MG_FIREBOLT",3,100;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1134,'Scissores_Sword','Caesar\'s Sword',5,20,NULL,700,'140',NULL,1,0,0x000654E2,63,2,2,4,'40',1,2,'bonus2 bAddRace,RC_Plant,25; bonus bIgnoreDefRace,RC_Plant;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1135,'Cutlas','Cutlus',5,20,NULL,900,'150',NULL,1,0,0x000654E2,63,2,2,4,'40',1,2,'skill "SM_BASH",5; bonus bStr,2; bonus bDef,1;',NULL,NULL); @@ -718,11 +718,11 @@ REPLACE INTO `item_db_re` VALUES (1361,'Two_Handed_Axe_','Two-Handed Axe',5,5500 REPLACE INTO `item_db_re` VALUES (1362,'Two_Handed_Axe__','Two-Handed Axe',5,55000,NULL,2500,'185',NULL,1,0,0x000444A2,63,2,34,3,'30',1,7,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (1363,'Brood_Axe','Bloody Axe',5,20,NULL,4000,'170',NULL,1,0,0x000444A2,63,2,34,4,'44',1,7,'bonus bStr,10; bonus bSpeedRate,25;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1364,'Great_Axe','Great Axe',5,20,NULL,1800,'187',NULL,1,0,0x000444A2,63,2,34,4,'44',1,7,'bonus2 bAddSkillBlow,"MC_MAMMONITE",5; bonus2 bAddEff,Eff_Stun,1500;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (1365,'Sabbath','Sabbath',5,20,NULL,2300,'120',NULL,1,0,0x000444A2,63,2,34,4,'44',1,7,'bonus bAtkEle,Ele_Dark; bonus2 bWeaponComaRace,RC_Demon,50; bonus2 bCriticalAddRace,RC_Undead,50;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (1365,'Sabbath','Sabbath',5,20,NULL,2300,'120',NULL,1,0,0x000444A2,63,2,34,4,'44',1,7,'bonus bAtkEle,Ele_Dark; bonus2 bComaRace,RC_Demon,50; bonus2 bCriticalAddRace,RC_Undead,50;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1366,'Right_Epsilon','Light Epsilon',5,20,NULL,2300,'180',NULL,1,0,0x000444A2,63,2,34,4,'44',1,7,'bonus bAtkEle,Ele_Holy; skill "AL_HEAL",3; bonus2 bAddRace,RC_Demon,3;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (1367,'Slaughter','Slaughter',5,20,NULL,2500,'120',NULL,1,0,0x000444A2,63,2,34,4,'44',1,7,'bonus bAtkEle,Ele_Earth; bonus bIgnoreDefRace,RC_Brute; bonus2 bWeaponComaRace,RC_Brute,40;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (1367,'Slaughter','Slaughter',5,20,NULL,2500,'120',NULL,1,0,0x000444A2,63,2,34,4,'44',1,7,'bonus bAtkEle,Ele_Earth; bonus bIgnoreDefRace,RC_Brute; bonus2 bComaRace,RC_Brute,40;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1368,'Tomahawk','Tomahawk',5,20,NULL,2500,'165',NULL,1,0,0x000444A2,63,2,34,4,'44',1,7,'bonus bAtkEle,Ele_Wind; skill "ITM_TOMAHAWK",1;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (1369,'Guillotine','Guillotine',5,20,NULL,3000,'215',NULL,1,0,0x000444A2,63,2,34,4,'44',1,7,'bonus2 bWeaponComaRace,RC_DemiHuman,30; bonus2 bWeaponComaRace,RC_Player,30; bonus2 bSPGainRaceAttack,RC_DemiHuman,2; bonus2 bSPGainRaceAttack,RC_Player,2; bonus2 bSPGainRace,RC_DemiHuman,20; bonus2 bSPGainRace,RC_Player,20;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (1369,'Guillotine','Guillotine',5,20,NULL,3000,'215',NULL,1,0,0x000444A2,63,2,34,4,'44',1,7,'bonus2 bComaRace,RC_DemiHuman,30; bonus2 bComaRace,RC_Player,30; bonus2 bSPDrainValueRace,RC_DemiHuman,2; bonus2 bSPDrainValueRace,RC_Player,2; bonus2 bSPGainRace,RC_DemiHuman,20; bonus2 bSPGainRace,RC_Player,20;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1370,'Doom_Slayer','Doom Slayer',5,20,NULL,6000,'10',NULL,1,0,0x000444A2,63,2,34,4,'80',1,7,'bonus bAspdRate,-40; bonus bUseSPrate,100; if(readparam(bStr)>=95){ bonus bBaseAtk,340; bonus2 bAddEff,Eff_Stun,3000; bonus bBreakArmorRate,500; }',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1371,'Doom_Slayer_','Doom Slayer',5,20,NULL,6000,'10',NULL,1,1,0x000444A2,63,2,34,4,'80',1,7,'bonus bAspdRate,-40; bonus bUseSPrate,100; if(readparam(bStr)>=95){ bonus bBaseAtk,340; bonus2 bAddEff,Eff_Stun,3000; bonus bBreakArmorRate,500; }',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1372,'Right_Epsilon_C','Light Epsilon',5,1,NULL,0,'229',NULL,1,0,0x000444A2,63,2,34,4,'1',0,7,'bonus bAtkEle,Ele_Holy; skill "AL_HEAL",3; bonus2 bAddRace,RC_Demon,3; bonus bStr,10; bonus bSpeedRate,25; /*Gold PC Room: bonus bBaseAtk,10; bonus bMatk,10; */',NULL,NULL); @@ -867,7 +867,7 @@ REPLACE INTO `item_db_re` VALUES (1522,'Stunner','Stunner',5,60000,NULL,2000,'14 REPLACE INTO `item_db_re` VALUES (1523,'Spike','Spike',5,20,NULL,700,'85',NULL,1,0,0x00008110,63,2,2,4,'40',1,8,'bonus bCritical,40; bonus bDefRate,-67; bonus bDef2Rate,-67;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1524,'Golden_Mace','Golden Mace',5,20,NULL,800,'110',NULL,1,1,0x00008110,63,2,2,4,'40',1,8,'bonus2 bAddRace,RC_Undead,10; bonus bUnbreakableWeapon,0;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1525,'Long_Mace','Long Mace',5,20,NULL,800,'135',NULL,3,0,0x00008110,63,2,2,4,'40',1,8,'bonus bLongAtkDef,10;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (1526,'Slash','Slash',5,20,NULL,1000,'145',NULL,1,0,0x00008110,63,2,2,4,'40',1,8,'bonus2 bAddRace,RC_Undead,15; bonus2 bWeaponComaRace,RC_Undead,10; bonus2 bExpAddRace,RC_Undead,5;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (1526,'Slash','Slash',5,20,NULL,1000,'145',NULL,1,0,0x00008110,63,2,2,4,'40',1,8,'bonus2 bAddRace,RC_Undead,15; bonus2 bComaRace,RC_Undead,10; bonus2 bExpAddRace,RC_Undead,5;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1527,'Quadrille','Quadrille',5,20,NULL,900,'165',NULL,1,0,0x00008110,63,2,2,4,'40',1,8,'bonus2 bAddRace,RC_Undead,10; bonus2 bAddRace,RC_DemiHuman,10; bonus2 bAddRace,RC_Player,10; bonus2 bAddEle,Ele_Earth,10;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1528,'Grand_Cross','Grand Cross',5,20,NULL,1500,'140',NULL,1,0,0x00008110,63,2,2,4,'40',1,8,'bonus bAtkEle,Ele_Holy; skill "PR_TURNUNDEAD",3; bonus3 bAutoSpell,"PR_TURNUNDEAD",3,100; bonus2 bSPDrainValueRace,RC_Undead,1; bonus2 bSPGainRace,RC_Undead,3;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1529,'Iron_Driver','Iron Driver',5,20,NULL,3000,'155',NULL,2,0,0x00008100,63,2,2,3,'78',1,8,NULL,NULL,NULL); @@ -907,7 +907,7 @@ REPLACE INTO `item_db_re` VALUES (1561,'Hardback','Hardcover Book',5,20,NULL,150 REPLACE INTO `item_db_re` VALUES (1562,'Bible_Of_Battlefield','Battlefield Textbook',5,20,NULL,700,'110',NULL,1,1,0x00410100,63,2,2,4,'80',0,15,'bonus bInt,3; bonus3 bAutoSpell,"AL_BLESSING",3+(getskilllv("AL_BLESSING")>3)*(getskilllv("AL_BLESSING")-3),20;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1563,'Diary_Of_Great_Sage_C','Sage\'s Diary',5,1,NULL,0,'135',NULL,1,0,0x00410100,63,2,2,3,'1',0,15,'bonus bMatk,140; bonus bAspdRate,5; /*Gold PC Room: bonus bBaseAtk,10; bonus bMatk,10;*/',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1564,'Encyclopedia','Encyclopedia',5,20,NULL,2000,'110:100',NULL,1,2,0x00410100,63,2,2,3,'70',1,15,'bonus bInt,3; bonus bDex,2; bonus bCritical,20+((readparam(bLuk)*2)/10);',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (1565,'Death_Note','Ledger of Death',5,20,NULL,1000,'137:100',NULL,1,2,0x00410100,63,2,2,4,'85',1,15,'bonus bStr,3; bonus bInt,3; bonus bLuk,-20; bonus2 bWeaponComaRace,RC_DemiHuman,10; bonus2 bWeaponComaRace,RC_Player,10; bonus bAspdRate,getrefine(); if(BaseJob==Job_Sage) bonus3 bAutoSpell,"NPC_HELLJUDGEMENT",5,20;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (1565,'Death_Note','Ledger of Death',5,20,NULL,1000,'137:100',NULL,1,2,0x00410100,63,2,2,4,'85',1,15,'bonus bStr,3; bonus bInt,3; bonus bLuk,-20; bonus2 bComaRace,RC_DemiHuman,10; bonus2 bComaRace,RC_Player,10; bonus bAspdRate,getrefine(); if(BaseJob==Job_Sage) bonus3 bAutoSpell,"NPC_HELLJUDGEMENT",5,20;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1566,'Diary_Of_Great_Basil','Diary Of Great Basil',5,20,NULL,0,'120:125',NULL,1,0,0x00410100,63,2,2,1,'0',0,15,'bonus2 bAddClass,Class_All,50;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1567,'Hardback_C','Refined Hardcover Book',5,1,NULL,0,'168:100',NULL,1,0,0x00410100,63,2,2,4,'0',0,15,'bonus bStr,5; bonus bDex,2; bonus bMatkRate,20;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1568,'Book_Of_Billows_','Book of Billows',5,35000,NULL,750,'90',NULL,1,3,0x00410100,63,2,2,3,'27',1,15,'bonus bAtkEle,Ele_Water;',NULL,NULL); @@ -921,7 +921,7 @@ REPLACE INTO `item_db_re` VALUES (1575,'BF_Book2','Valorous Battle Strategy Book REPLACE INTO `item_db_re` VALUES (1576,'Krieger_Book1','Glorious Tablet',5,20,NULL,0,'90:115',NULL,1,0,0x00410100,63,2,2,4,'80',1,15,'bonus bMatkRate,15; bonus2 bAddRace,RC_DemiHuman,80; bonus2 bAddRace,RC_Player,80; bonus2 bIgnoreDefRaceRate,RC_DemiHuman,25; bonus2 bIgnoreDefRaceRate,RC_Player,25; bonus bUnbreakableWeapon,0; .@r = getrefine(); if(.@r>5) { bonus2 bAddRace,RC_DemiHuman,pow(((.@r>14)?14:.@r)-4,2); bonus2 bAddRace,RC_Player,pow(((.@r>14)?14:.@r)-4,2); bonus2 bIgnoreDefRaceRate,RC_DemiHuman,5; bonus2 bIgnoreDefRaceRate,RC_Player,5; } if(.@r>8) autobonus "{ bonus bBaseAtk,200; }",30,3000,BF_WEAPON,"{ specialeffect2 EF_BASH3D; }";',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1577,'Krieger_Book2','Glorious Apocalypse',5,20,NULL,0,'90:115',NULL,1,0,0x00410100,63,2,2,4,'80',1,15,'bonus2 bAddRace,RC_DemiHuman,80; bonus2 bAddRace,RC_Player,80; bonus2 bIgnoreDefRaceRate,RC_DemiHuman,25; bonus2 bIgnoreDefRaceRate,RC_Player,25; bonus bUnbreakableWeapon,0; .@r = getrefine(); if(.@r>5) bonus2 bIgnoreDefRaceRate,RC_DemiHuman,5; bonus2 bIgnoreDefRaceRate,RC_Player,5; if(.@r>8) { bonus bMatkRate,5; bonus bVariableCastrate,-5; bonus bDelayRate,-5; }',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1578,'Book_Of_Prayer','Book Of Prayer',5,20,NULL,0,'140',NULL,1,0,0x00410100,63,2,2,3,'0',0,15,'bonus bVit,2; bonus bMdef,2; bonus bMaxSPrate,10;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (1579,'Death_Note_M','Book of the Dead',5,20,NULL,1000,'137',NULL,1,2,0x00410100,63,2,2,4,'85',1,15,'bonus bMatkRate,15; bonus bStr,3; bonus bInt,3; bonus bLuk,-20; bonus2 bWeaponComaRace,RC_DemiHuman,10; bonus2 bWeaponComaRace,RC_Player,10; bonus bAspdRate,getrefine(); if(BaseJob==Job_Sage) bonus3 bAutoSpell,"NPC_HELLJUDGEMENT",5,20;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (1579,'Death_Note_M','Book of the Dead',5,20,NULL,1000,'137',NULL,1,2,0x00410100,63,2,2,4,'85',1,15,'bonus bMatkRate,15; bonus bStr,3; bonus bInt,3; bonus bLuk,-20; bonus2 bComaRace,RC_DemiHuman,10; bonus2 bComaRace,RC_Player,10; bonus bAspdRate,getrefine(); if(BaseJob==Job_Sage) bonus3 bAutoSpell,"NPC_HELLJUDGEMENT",5,20;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1580,'Encyclopedia_C','Giant Encyclopedia',5,0,NULL,0,'145:100',NULL,1,0,0x00410100,63,2,2,3,'0',0,15,'bonus bMatkRate,15; bonus bInt,3; bonus bDex,2; bonus bCritical,20+((readparam(bLuk)*2)/10); bonus2 bAddSize,Size_All,40;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (1581,'F_Diary_Of_Great_Sage_C','Diary Of Great Sage',5,1,NULL,0,'135',NULL,1,2,0x00410100,63,2,2,3,'1',0,15,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (1582,'E_Diary_Of_Great_Sage_C','Diary Of Great Sage',5,1,NULL,0,'135',NULL,1,2,0x00410100,63,2,2,3,'1',0,15,NULL,NULL,NULL); @@ -1671,7 +1671,7 @@ REPLACE INTO `item_db_re` VALUES (2550,'Fisher\'s_Muffler','Fisher\'s Muffler',4 REPLACE INTO `item_db_re` VALUES (2551,'Rider_Insignia_M','Crest of the Rider',4,20,NULL,500,NULL,4,NULL,1,0xFFFFFFFE,18,2,4,NULL,'55',1,0,'bonus bAgi,2;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (2552,'Mithril_Magic_Cape_M','Mithril Magic Manteau',4,20,NULL,400,NULL,3,NULL,1,0x00098B1C,18,2,4,NULL,'70',1,0,'bonus bMdef,3; bonus5 bAutoSpellWhenHit,"NPC_ANTIMAGIC",6,200,BF_MAGIC,0;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (2553,'Dragon_Manteau','Dragon Manteau',4,20,NULL,1000,NULL,14,NULL,1,0xFFFFFFFE,18,2,4,NULL,'0',1,0,'bonus bAgi,1; bonus bMdef,5;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (2554,'Piece_Of_Angent_Skin','Nydhorgg\'s Shadow Garb',4,20,NULL,400,NULL,25,NULL,1,0xFFFFFFFE,18,2,4,NULL,'90',1,0,'bonus2 bSubEle,Ele_Neutral,7; bonus2 bSubEle,Ele_Water,7; bonus2 bSubEle,Ele_Earth,7; bonus2 bSubEle,Ele_Fire,7; bonus2 bSubEle,Ele_Wind,7; bonus2 bSubEle,Ele_Poison,7; bonus2 bSubEle,Ele_Holy,7; bonus2 bSubEle,Ele_Dark,7; bonus2 bSubEle,Ele_Ghost,7; bonus2 bSubEle,Ele_Undead,7; bonus bMaxSP,(BaseLevel/3)+(getrefine()*10); bonus2 bSPGainAttackRate,100,1; bonus bMdef,3;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (2554,'Piece_Of_Angent_Skin','Nydhorgg\'s Shadow Garb',4,20,NULL,400,NULL,25,NULL,1,0xFFFFFFFE,18,2,4,NULL,'90',1,0,'bonus2 bSubEle,Ele_Neutral,7; bonus2 bSubEle,Ele_Water,7; bonus2 bSubEle,Ele_Earth,7; bonus2 bSubEle,Ele_Fire,7; bonus2 bSubEle,Ele_Wind,7; bonus2 bSubEle,Ele_Poison,7; bonus2 bSubEle,Ele_Holy,7; bonus2 bSubEle,Ele_Dark,7; bonus2 bSubEle,Ele_Ghost,7; bonus2 bSubEle,Ele_Undead,7; bonus bMaxSP,(BaseLevel/3)+(getrefine()*10); bonus2 bSPDrainRate,10,1; bonus bMdef,3;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (2555,'Freyja_SScarf7','Freyja Soul Scarf',4,20,NULL,400,NULL,4,NULL,0,0xFFFFFFFF,63,2,4,NULL,'20',0,0,'bonus bFlee,15; bonus2 bSubEle,Ele_Neutral,15;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (2556,'Freyja_SScarf30','Freyja Soul Scarf',4,20,NULL,400,NULL,4,NULL,0,0xFFFFFFFF,63,2,4,NULL,'20',0,0,'bonus bFlee,15; bonus2 bSubEle,Ele_Neutral,15;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (2557,'Freyja_SScarf60','Freyja Soul Scarf',4,20,NULL,400,NULL,4,NULL,0,0xFFFFFFFF,63,2,4,NULL,'20',0,0,'bonus bFlee,15; bonus2 bSubEle,Ele_Neutral,15;',NULL,NULL); @@ -2256,7 +2256,7 @@ REPLACE INTO `item_db_re` VALUES (4168,'Dark_Lord_Card','Dark Lord Card',6,20,NU REPLACE INTO `item_db_re` VALUES (4169,'Dark_Illusion_Card','Dark Illusion Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,769,NULL,NULL,NULL,NULL,'bonus bMaxHPrate,-10; bonus bMaxSPrate,-10; bonus bVariableCastrate,-10;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (4170,'Dark_Frame_Card','Dark Frame Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,16,NULL,NULL,NULL,NULL,'bonus2 bAddEffWhenHit,Eff_Stone,600;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (4171,'Dark_Priest_Card','Dark Priest Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,NULL,NULL,'bonus2 bSPVanishRate,50,10; if(BaseJob==Job_Sage) bonus bSPDrainValue,1;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (4172,'The_Paper_Card','The Paper Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,NULL,NULL,'bonus bCritAtkRate,20; bonus bSPGainAttack,-1;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (4172,'The_Paper_Card','The Paper Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,NULL,NULL,'bonus bCritAtkRate,20; bonus bSPDrainValue,-1;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (4173,'Demon_Pungus_Card','Demon Pungus Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,16,NULL,NULL,NULL,NULL,'bonus2 bAddEffWhenHit,Eff_Sleep,600;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (4174,'Deviling_Card','Deviling Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,4,NULL,NULL,NULL,NULL,'bonus2 bSubEle,Ele_Neutral,50; bonus2 bSubEle,Ele_Water,-50; bonus2 bSubEle,Ele_Earth,-50; bonus2 bSubEle,Ele_Fire,-50; bonus2 bSubEle,Ele_Wind,-50; bonus2 bSubEle,Ele_Poison,-50; bonus2 bSubEle,Ele_Holy,-50; bonus2 bSubEle,Ele_Dark,-50; bonus2 bSubEle,Ele_Ghost,-50; bonus2 bSubEle,Ele_Undead,-50;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (4175,'Poison_Toad_Card','Poisonous Toad Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,136,NULL,NULL,NULL,NULL,'bonus3 bAutoSpell,"TF_POISON",1,20; bonus2 bAddSkillBlow,52,5;',NULL,NULL); @@ -2360,12 +2360,12 @@ REPLACE INTO `item_db_re` VALUES (4272,'Dancing_Dragon_Card','Zhu Po Long Card', REPLACE INTO `item_db_re` VALUES (4273,'Shellfish_Card','Shell Fish Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,NULL,NULL,'bonus bBaseAtk,5; bonus2 bAddDamageClass,1073,30;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (4274,'Zombie_Master_Card','Zombie Master Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,NULL,NULL,'bonus2 bSPGainRace,RC_Undead,5;',NULL,'heal 0,-5;'); REPLACE INTO `item_db_re` VALUES (4275,'Zombie_Prisoner_Card','Zombie Prisoner Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,64,NULL,NULL,NULL,NULL,'bonus2 bSubRace,RC_Undead,-20; bonus2 bExpAddRace,RC_Undead,10;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (4276,'Lord_Of_Death_Card','Lord of The Dead Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,NULL,NULL,'bonus3 bAddEff,Eff_Stun,500,ATF_SHORT; bonus3 bAddEff,Eff_Curse,500,ATF_SHORT; bonus3 bAddEff,Eff_Silence,500,ATF_SHORT; bonus3 bAddEff,Eff_Poison,500,ATF_SHORT; bonus3 bAddEff,Eff_Bleeding,500,ATF_SHORT; bonus2 bWeaponComaClass,Class_Normal,1;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (4276,'Lord_Of_Death_Card','Lord of The Dead Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,NULL,NULL,'bonus3 bAddEff,Eff_Stun,500,ATF_SHORT; bonus3 bAddEff,Eff_Curse,500,ATF_SHORT; bonus3 bAddEff,Eff_Silence,500,ATF_SHORT; bonus3 bAddEff,Eff_Poison,500,ATF_SHORT; bonus3 bAddEff,Eff_Bleeding,500,ATF_SHORT; bonus2 bComaClass,Class_Normal,1;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (4277,'Zherlthsh_Card','Zealotus Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,32,NULL,NULL,NULL,NULL,'bonus bLuk,2; bonus2 bSkillAtk,"BA_MUSICALSTRIKE",10; bonus2 bSkillAtk,"DC_THROWARROW",10;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (4278,'Gibbet_Card','Gibbet Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,769,NULL,NULL,NULL,NULL,'if(getrefine()<6) bonus bMdef,5;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (4279,'Deleter_Card','Earth Deleter Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,16,NULL,NULL,NULL,NULL,'bonus bSPrecovRate,-100; bonus bSPGainValue,10;',NULL,'heal 0,-100;'); REPLACE INTO `item_db_re` VALUES (4280,'Geographer_Card','Geographer Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,16,NULL,NULL,NULL,NULL,'bonus3 bAutoSpellWhenHit,"AL_BLESSING",2+8*(getskilllv("AL_BLESSING")==10),30;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (4281,'Zipper_Bear_Card','Zipper Bear Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,NULL,NULL,'bonus bBaseAtk,30; bonus bSPGainAttack,-1; if(BaseClass==Job_Merchant) bonus bUnbreakableWeapon,0;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (4281,'Zipper_Bear_Card','Zipper Bear Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,NULL,NULL,'bonus bBaseAtk,30; bonus bSPDrainValue,-1; if(BaseClass==Job_Merchant) bonus bUnbreakableWeapon,0;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (4282,'Tengu_Card','Tengu Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,136,NULL,NULL,NULL,NULL,'bonus2 bAddMonsterDropItemGroup,IG_Recovery,600;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (4283,'Greatest_General_Card','Greatest General Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,136,NULL,NULL,NULL,NULL,'bonus3 bAutoSpell,"MO_CALLSPIRITS",5,2+18*(BaseClass==Job_Acolyte);',NULL,NULL); REPLACE INTO `item_db_re` VALUES (4284,'Chepet_Card','Chepet Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,NULL,NULL,'bonus4 bAutoSpell,"AL_HEAL",5,50,1;',NULL,NULL); @@ -2623,7 +2623,7 @@ REPLACE INTO `item_db_re` VALUES (4536,'Sealed_Atroce_Card','Sealed Atroce Card' REPLACE INTO `item_db_re` VALUES (4537,'Sealed_Phreeoni_Card','Sealed Phreeoni Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,NULL,NULL,'bonus bHit,((getrefine()>14)?75:50);',NULL,NULL); REPLACE INTO `item_db_re` VALUES (4538,'Sealed_Bacsojin_Card','Sealed White Lady Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,769,NULL,NULL,NULL,NULL,'if (getrefine()>14) { bonus bHealPower,25; bonus bUseSPrate,20; } else { bonus bHealPower,15; bonus bUseSPrate,30; }',NULL,NULL); REPLACE INTO `item_db_re` VALUES (4539,'Sealed_F_Bishop_Card','Sealed Fallen Bishop Hibram Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,64,NULL,NULL,NULL,NULL,'.@r = getrefine(); bonus bMatkRate,((.@r>14)?8:5); bonus bMaxSPrate,-50; set .@rate,((.@r>14)?33:25); bonus2 bMagicAddRace,RC_Angel,.@rate; bonus2 bMagicAddRace,RC_DemiHuman,.@rate; bonus2 bMagicAddRace,RC_Player,.@rate;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (4540,'SLD_Lord_Of_Death_Card','Sealed Lord of The Dead Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,NULL,NULL,'set .@rate, ((getrefine()>14)?350:250); bonus3 bAddEff,Eff_Stun,.@rate,ATF_SHORT; bonus3 bAddEff,Eff_Curse,.@rate,ATF_SHORT; bonus3 bAddEff,Eff_Silence,.@rate,ATF_SHORT; bonus3 bAddEff,Eff_Poison,.@rate,ATF_SHORT; bonus3 bAddEff,Eff_Bleeding,.@rate,ATF_SHORT; bonus2 bWeaponComaClass,Class_Normal,1;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (4540,'SLD_Lord_Of_Death_Card','Sealed Lord of The Dead Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,NULL,NULL,'set .@rate, ((getrefine()>14)?350:250); bonus3 bAddEff,Eff_Stun,.@rate,ATF_SHORT; bonus3 bAddEff,Eff_Curse,.@rate,ATF_SHORT; bonus3 bAddEff,Eff_Silence,.@rate,ATF_SHORT; bonus3 bAddEff,Eff_Poison,.@rate,ATF_SHORT; bonus3 bAddEff,Eff_Bleeding,.@rate,ATF_SHORT; bonus2 bComaClass,Class_Normal,1;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (4541,'SLD_B_Katrinn_Card','Sealed High Wizard Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,769,NULL,NULL,NULL,NULL,'bonus2 bIgnoreMdefClassRate,Class_Normal,100; .@r = getrefine(); if (.@r>14) { bonus bVariableCastrate,120; bonus bSPrecovRate,-120; } else { bonus bVariableCastrate,150; bonus bSPrecovRate,-150; }',NULL,'heal 0,((.@r>14)?-2000:-3000);'); REPLACE INTO `item_db_re` VALUES (4542,'SLD_Detale_Card','Sealed Detale Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,16,NULL,NULL,NULL,NULL,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (4543,'SLD_Garm_Card','Sealed Hatii Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,16,NULL,NULL,NULL,NULL,'bonus2 bAddEffWhenHit,Eff_Freeze,((getrefine()>14)?4000:2500);',NULL,NULL); @@ -3442,7 +3442,7 @@ REPLACE INTO `item_db_re` VALUES (5493,'Ulle_Cap_I','Ulle\'s Cap',4,0,NULL,0,NUL REPLACE INTO `item_db_re` VALUES (5494,'Spinx_Helm_I','Sphinx Hat',4,0,NULL,0,NULL,5,NULL,0,0x00004082,63,2,257,NULL,'0',0,137,'bonus bStr,5;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (5495,'Power_Of_Thor','Power Of Thor',4,20,NULL,100,NULL,6,NULL,1,0xFFFFFFFF,63,2,256,NULL,'0',1,493,'bonus bInt,1; bonus bDex,1; bonus bMdef,3; bonus bFlee,5;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (5496,'Dice_Hat','Dice Hat',4,20,NULL,300,NULL,3,NULL,0,0xFFFFFFFF,63,2,256,NULL,'50',0,494,'bonus bLuk,4;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (5497,'King_Tiger_Doll_Hat','King Tiger Doll Hat',4,20,NULL,400,NULL,6,NULL,1,0xFFFFFFFE,63,2,256,NULL,'1',1,495,'bonus bStr,2; bonus bDex,2; bonus2 bAddRace,RC_Brute,10; bonus2 bMagicAddRace,RC_Brute,10; .@r = getrefine(); autobonus "{ bonus2 bSPLossRate,5,1000; bonus bBaseAtk,25*.@r; }",3*.@r,3000,BF_NORMAL,"{ transform 1115,3000; specialeffect2 EF_POTION_BERSERK; }"; autobonus2 "{ bonus2 bSPLossRate,5,1000; bonus bBaseAtk,25*.@r; }",.@r,3000,BF_NORMAL,"{ transform 1115,3000; specialeffect2 EF_POTION_BERSERK; }";',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (5497,'King_Tiger_Doll_Hat','King Tiger Doll Hat',4,20,NULL,400,NULL,6,NULL,1,0xFFFFFFFE,63,2,256,NULL,'1',1,495,'bonus bStr,2; bonus bDex,2; bonus2 bAddRace,RC_Brute,10; bonus2 bMagicAddRace,RC_Brute,10; .@r = getrefine(); autobonus "{ bonus2 bSPLossRate,5,1000; bonus bBaseAtk,25*.@r; }",3*.@r,3000,BF_NORMAL,"{ transform 1115,3000; specialeffect2 EF_POTION_BERSERK; showscript \\\"Eddga Power !\\\"; }"; autobonus2 "{ bonus2 bSPLossRate,5,1000; bonus bBaseAtk,25*.@r; }",.@r,3000,BF_NORMAL,"{ transform 1115,3000; specialeffect2 EF_POTION_BERSERK; showscript \\\"Eddga Power !\\\"; }";',NULL,NULL); REPLACE INTO `item_db_re` VALUES (5498,'Wondering_Wolf_Helm','Wandering Wolf Helm',4,20,NULL,600,NULL,5,NULL,1,0xFFFFFFFE,63,2,768,NULL,'1',0,490,'bonus bAgi,5; bonus bFlee,10; bonus2 bIgnoreDefRaceRate,RC_DemiHuman,10; bonus2 bIgnoreDefRaceRate,RC_Brute,10; if(getrefine()>=7){ bonus2 bAddEff,Eff_Bleeding,10; } if(getrefine()>=9){ bonus3 bAutoSpellWhenHit,"MC_LOUD",1,1; }',NULL,NULL); REPLACE INTO `item_db_re` VALUES (5499,'Pizza_Hat','Pizza Hat',4,20,NULL,600,NULL,0,NULL,0,0xFFFFFFFF,63,2,256,NULL,'0',0,487,'skill "SM_PROVOKE",1;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (5500,'Icecream_Hat','Icecream Hat',4,0,NULL,300,NULL,6,NULL,0,0xFFFFFFFF,63,2,256,NULL,'30',1,488,'bonus bMdef,3; skill "MG_FROSTDIVER",3;',NULL,NULL); @@ -5307,6 +5307,7 @@ REPLACE INTO `item_db_re` VALUES (7672,'Relief_Food','Relief Food',3,20,NULL,0,N # REPLACE INTO `item_db_re` VALUES (7674,'Mysterious_Ingredient','Mysterious Ingredient',3,20,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (7675,'Mysterious_Doll','Mysterious Doll',3,0,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); +REPLACE INTO `item_db_re` VALUES (7676,'Transmission_Coupon','Transmission Coupon',3,0,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (7679,'Oneclick_Weapon_7UP','One Click Weapon 7UP',3,0,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (7680,'Oneclick_Weapon_9UP','One Click Weapon 9UP',3,0,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (7681,'Oneclick_Armor_7UP','One Click Armor 7UP',3,0,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); @@ -6428,7 +6429,7 @@ REPLACE INTO `item_db_re` VALUES (12535,'Iggdrasilberry_Box','Iggdrasilberry Box REPLACE INTO `item_db_re` VALUES (12536,'NY_Rice_Cake_Soup','NY Rice Cake Soup',2,20,NULL,100,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (12537,'Solo_Gift_Basket','Solo Gift Basket',2,1000,NULL,10,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'/*getgroupitem(IG_Solo_Gift_Basket);*/ getitem 597,5; getitem 596,3; getitem 561,3; getitem 573,4; getitem 559,10; getitem 560,10;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (12538,'Couple_Event_Basket','Couple Event Basket',2,2000,NULL,10,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'/*getgroupitem(IG_Couple_Event_Basket);*/ getitem 14546,10; getitem 14547,10; getitem 14548,10; getitem 14549,10; getitem 14550,10;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (12539,'Splendid_Box','Splendid Box',2,20,NULL,100,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); +REPLACE INTO `item_db_re` VALUES (12539,'Splendid_Box','Splendid Box',2,20,NULL,100,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'getgroupitem(IG_Splendid_Box);',NULL,NULL); REPLACE INTO `item_db_re` VALUES (12540,'GM_Warp_Box','GM Warp Box',2,20,NULL,10,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'getgroupitem(IG_GM_Warp_Box);',NULL,NULL); REPLACE INTO `item_db_re` VALUES (12541,'Fortune_Cookie1','Fortune Cookie1',2,20,NULL,10,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'getrandgroupitem(IG_Fortune_Cookie1,1);',NULL,NULL); REPLACE INTO `item_db_re` VALUES (12542,'Fortune_Cookie2','Fortune Cookie2',2,20,NULL,10,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'getgroupitem(IG_Fortune_Cookie2);',NULL,NULL); @@ -6545,13 +6546,13 @@ REPLACE INTO `item_db_re` VALUES (12654,'Lucky_Egg_C9','Lucky Egg C9',2,20,NULL, REPLACE INTO `item_db_re` VALUES (12655,'Brain_Powder','Brain Powder',2,2000,NULL,100,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (12656,'Magical_Powder','Magical Powder',2,3000,NULL,200,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (12657,'Madness_Powder','Madness Powder',2,4000,NULL,300,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); -REPLACE INTO `item_db_re` VALUES (12658,'Trans_Scroll_Devi','Transformation Scroll(Deviruchi)',2,20,NULL,10,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'transform 1109,1200000,SC_MTF_ASPD,10,5;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (12659,'Trans_Scroll_Ray_Arch','Transformation Scroll(Raydric)',2,20,NULL,10,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'transform 1276,1200000,SC_MTF_RANGEATK,25;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (12660,'Trans_Scroll_Mavka','Transformation Scroll(Mavka)',2,20,NULL,10,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'transform 1884,1200000,SC_MTF_RANGEATK,25;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (12661,'Trans_Scroll_Marduk','Transformation Scroll(Marduk)',2,20,NULL,10,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'transform 1140,1200000,SC_MTF_MATK,25;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (12662,'Trans_Scroll_Banshee','Transformation Scroll(Banshee)',2,20,NULL,10,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'transform 1867,1200000,SC_MTF_MATK,25;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (12663,'Trans_Scroll_Poring','Transformation Scroll(Poring)',2,20,NULL,10,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'transform 1002,1200000,SC_MTF_CRIDAMAGE,25;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (12664,'Trans_Scroll_Golem','Transformation Scroll(Golem)',2,20,NULL,10,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'transform 1040,1200000,SC_MTF_MLEATKED,5,20,2;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (12658,'Trans_Scroll_Devi','Transformation Scroll(Deviruchi)',2,20,NULL,10,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'transform 1109,1200000,SC_MTF_ASPD,10,5; showscript "Traaaansformation-!! Deviruchi form!!";',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (12659,'Trans_Scroll_Ray_Arch','Transformation Scroll(Raydric)',2,20,NULL,10,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'transform 1276,1200000,SC_MTF_RANGEATK,25; showscript "Traaaansformation-!! Raydric form!!";',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (12660,'Trans_Scroll_Mavka','Transformation Scroll(Mavka)',2,20,NULL,10,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'transform 1884,1200000,SC_MTF_RANGEATK,25; showscript "Traaaansformation-!! Mavka form!!";',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (12661,'Trans_Scroll_Marduk','Transformation Scroll(Marduk)',2,20,NULL,10,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'transform 1140,1200000,SC_MTF_MATK,25; showscript "Traaaansformation-!! Marduk form!!";',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (12662,'Trans_Scroll_Banshee','Transformation Scroll(Banshee)',2,20,NULL,10,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'transform 1867,1200000,SC_MTF_MATK,25; showscript "Traaaansformation-!! Banshee form!!";',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (12663,'Trans_Scroll_Poring','Transformation Scroll(Poring)',2,20,NULL,10,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'transform 1002,1200000,SC_MTF_CRIDAMAGE,25; showscript "Traaaansformation-!! Poring form!!";',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (12664,'Trans_Scroll_Golem','Transformation Scroll(Golem)',2,20,NULL,10,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'transform 1040,1200000,SC_MTF_MLEATKED,5,20,2; showscript "Traaaansformation-!! Golem form!!";',NULL,NULL); REPLACE INTO `item_db_re` VALUES (12665,'Grovel_Buff','Grovel Buff',2,0,NULL,0,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (12666,'Thai_Perfume_MATK','Thai Perfume MATK',2,20,NULL,10,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'specialeffect2 EF_MAGICALATTHIT; bonus_script "{ bonus bMatk,24; }",600,0,0,SI_SKF_MATK;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (12667,'Thai_Perfume_ATK','Thai Perfume ATK',2,20,NULL,10,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'specialeffect2 EF_MAGICALATTHIT; bonus_script "{ bonus bBaseAtk,24; }",600,0,0,SI_SKF_ATK;',NULL,NULL); @@ -6684,12 +6685,12 @@ REPLACE INTO `item_db_re` VALUES (12787,'Diabolic_Scroll','Diabolic Scroll',2,20 REPLACE INTO `item_db_re` VALUES (12788,'No100_Firecracker','No100 Firecracker',2,2,NULL,20,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (12789,'Juicy_Fruit','Juicy Fruit',2,2,NULL,100,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (12790,'Change_Name_Card','Character Name Change Coupon',2,0,NULL,0,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'set CharRename, CharRename + 1;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (12791,'Combat_Pill','Combat Pill',2,20,NULL,150,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'specialeffect2 EF_POTION_BERSERK; bonus_script "{ bonus2 bAddDamageClass,Class_All,5; bonus bMatkRate,5; bonus bMaxHPrate,3; bonus bMaxSPrate,3; }",60,0,0,SI_GM_BATTLE;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (12791,'Combat_Pill','Combat Pill',2,20,NULL,150,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'specialeffect2 EF_POTION_BERSERK; bonus_script "{ bonus2 bAddDamageClass,Class_All,5; bonus bMatkRate,5; bonus bMaxHPrate,3; bonus bMaxSPrate,3; }",60,0,0,SI_GM_BATTLE; /* showscript */',NULL,NULL); REPLACE INTO `item_db_re` VALUES (12792,'P_Combat_Pill','P Combat Pill',2,20,NULL,150,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'specialeffect2 EF_POTION_BERSERK; bonus_script "{ bonus2 bAddDamageClass,Class_All,10; bonus bMatkRate,10; bonus bMaxHPrate,5; bonus bMaxSPrate,5; }",60,0,0,SI_GM_BATTLE2;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (12793,'Combat_Pill_Box10','Combat Pill Box10',2,20,NULL,0,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'getitem 12791,10;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (12794,'P_Combat_Pill_Box10','P Combat Pill Box10',2,20,NULL,0,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'getitem 12792,10;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (12795,'2011_RWC_Scroll_Kr','2011 RWC Scroll Kr',2,20,NULL,10,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); -REPLACE INTO `item_db_re` VALUES (12796,'Red_Booster','Red Booster',2,20,NULL,10,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'itemskill "AC_CONCENTRATION",(getskilllv(45)<3?3:getskilllv(45));',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (12796,'Red_Booster','Red Booster',2,20,NULL,10,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'itemskill "AC_CONCENTRATION",(getskilllv(45)<3?3:getskilllv(45)); specialeffect2 EF_POTION_BERSERK; showscript "Oh My GOODNESS!!! I FEEL AWESOMELY STRONG!!! WOWOW";',NULL,NULL); REPLACE INTO `item_db_re` VALUES (12797,'Wish_Maiden_Scroll','Wish Maiden Scroll',2,20,NULL,10,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'mercenary_create 2344,1800000;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (12798,'Zealotus_Scroll','Zealotus Scroll',2,20,NULL,10,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'mercenary_create 2345,1800000;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (12799,'PCBang_Coupon_Box5','PCBang Coupon Box5',2,20,NULL,10,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); @@ -7129,7 +7130,7 @@ REPLACE INTO `item_db_re` VALUES (13323,'Infinity_Shuriken','Infinity Shuriken', REPLACE INTO `item_db_re` VALUES (13400,'Cutlas_','Cutlus',5,20,NULL,900,'150',NULL,1,1,0x000654E2,63,2,2,4,'40',1,2,'skill "SM_BASH",5; bonus bStr,2; bonus bDef,1;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (13401,'Excalibur_C','Excalibur',5,1,NULL,0,'199',NULL,1,0,0x000654E2,63,2,2,4,'1',0,2,'bonus bInt,10; bonus bLuk,10; bonus bAtkEle,Ele_Holy;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (13402,'Cutlas_C','Cutlus',5,2,NULL,0,'185',NULL,1,0,0x000654E2,63,2,2,4,'0',0,2,'skill "SM_BASH",5; bonus bStr,2; bonus bDef,1;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (13403,'Solar_Sword_C','Solar Sword',5,2,NULL,0,'120',NULL,1,0,0x000654E2,63,2,2,4,'0',0,2,'bonus bAtkEle,Ele_Fire; bonus2 bSPLossRate,15,10; bonus bHPGainAttackRate,1;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (13403,'Solar_Sword_C','Solar Sword',5,2,NULL,0,'120',NULL,1,0,0x000654E2,63,2,2,4,'0',0,2,'bonus bAtkEle,Ele_Fire; bonus2 bSPLossRate,15,10; bonus2 bHPDrainRate,1000,1;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (13404,'Platinum_Shotel','Platinum Shotel',5,20,NULL,1500,'130',NULL,1,1,0x000654E2,63,2,2,4,'55',1,2,'bonus bCritical,50;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (13405,'Curved_Sword','Curved Sword',5,20,NULL,800,'125',NULL,1,2,0x000654E2,63,2,2,4,'55',1,2,'bonus bAspdRate,10; bonus2 bAddEff,Eff_Curse,300;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (13406,'Edger','Edger',5,20,NULL,0,'120',NULL,1,0,0x000654E2,63,2,2,1,'0',0,2,'bonus2 bAddClass,Class_All,50;',NULL,NULL); @@ -8333,7 +8334,7 @@ REPLACE INTO `item_db_re` VALUES (15121,'Sarah_Combat_Robe','Sarah Combat Robe', REPLACE INTO `item_db_re` VALUES (15123,'Whikebain_Suit','Whikebain Suit',4,0,NULL,900,NULL,56,NULL,1,0x00001000,56,2,16,NULL,'105',1,NULL,'.@r = getrefine(); if (.@r > 7) { bonus bCritAtkRate,6; } else if (.@r > 5) { bonus bCritAtkRate,4; } bonus3 bAutoSpell,"DC_WINKCHARM",1,10; /* Confirm: Success rate */',NULL,NULL); REPLACE INTO `item_db_re` VALUES (15138,'Aegir_Armor','Aegir Armor',4,10,NULL,1600,NULL,25,NULL,0,0xFFFFFFFF,63,2,16,NULL,'40',1,NULL,'bonus bMaxHP,500; bonus bMaxSP,50;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (15141,'Ancient_Armor_Of_The_Goddess','Ancient Armor Of The Goddess',4,10,NULL,2000,NULL,55,NULL,0,0xFFFFFFFF,63,2,16,NULL,'100',1,NULL,NULL,NULL,NULL); -REPLACE INTO `item_db_re` VALUES (15145,'Evil_Dragon_Armor','Evil Dragon Armor',4,0,NULL,4000,NULL,60,NULL,1,0xFFFFFFFF,63,2,16,NULL,NULL,1,NULL,'.@r = getrefine(); if (.@r >= 10 ) { bonus2 bHPGainAttackRate,100,3; bonus2 bSPGainAttackRate,100,5; } else if (.@r >= 9 ) { bonus2 bHPGainAttackRate,100,4; bonus2 bSPGainAttackRate,100,3; } else if (.@r >= 8 ) { bonus2 bHPGainAttackRate,100,6; bonus2 bSPGainAttackRate,100,2; } /* Confirm: Success rate and it says no effect if with Rideword, Vanargandr Helm, or Piece Of Angent Skin */',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (15145,'Evil_Dragon_Armor','Evil Dragon Armor',4,0,NULL,4000,NULL,60,NULL,1,0xFFFFFFFF,63,2,16,NULL,NULL,1,NULL,'.@r = getrefine(); if (.@r >= 10 ) { bonus2 bHPDrainRate,100,3; bonus2 bSPDrainRate,100,5; } else if (.@r >= 9 ) { bonus2 bHPDrainRate,100,4; bonus2 bSPDrainRate,100,3; } else if (.@r >= 8 ) { bonus2 bHPDrainRate,100,6; bonus2 bSPDrainRate,100,2; } /* Confirm: Success rate and it says no effect if with Rideword, Vanargandr Helm, or Piece Of Angent Skin */',NULL,NULL); # More Maces REPLACE INTO `item_db_re` VALUES (16000,'Erde','Erde',5,20,NULL,500,'130',NULL,1,2,0x0004C5B2,18,2,2,3,'50',1,8,'bonus2 bSkillAtk,"AM_ACIDTERROR",20; bonus2 bSkillAtk,"AM_DEMONSTRATION",20; bonus bMaxSP,50; bonus bHealPower,10;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (16001,'Red_Square_Bag','Red Square Bag',5,20,NULL,500,'130',NULL,1,2,0x0004C5B2,18,2,2,3,'50',1,8,'bonus bMaxHP,200; bonus2 bSkillAtk,"AM_ACIDTERROR",20; bonus2 bSkillAtk,"AM_DEMONSTRATION",20; bonus2 bAddMonsterDropItem,501,50; bonus2 bAddMonsterDropItem,502,20; bonus2 bAddMonsterDropItem,503,20; bonus2 bAddMonsterDropItem,504,20; bonus2 bAddMonsterDropItem,505,10; if(readparam(bStr)>=95) bonus2 bAddEff,Eff_Stun,500;',NULL,NULL); @@ -9029,6 +9030,7 @@ REPLACE INTO `item_db_re` VALUES (17552,'Garnet Lucky Egg','Garnet Lucky Egg',18 REPLACE INTO `item_db_re` VALUES (17572,'Erzulie_Lucky_Egg','Erzulie Lucky Egg',18,0,NULL,10,NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'/*TODO*/',NULL,NULL); REPLACE INTO `item_db_re` VALUES (17584,'Venus_Lucky_Egg','Venus Lucky Egg',18,0,NULL,10,NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'/*TODO*/',NULL,NULL); REPLACE INTO `item_db_re` VALUES (17588,'Amora_Lucky_Egg','Amora Lucky Egg',18,0,NULL,10,NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'/*TODO*/',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (17598,'Sograt_Lucky_Scroll','Sograt Lucky Scroll',18,0,NULL,10,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'getitem callfunc("F_Rand",20099,19024,2899,19910),1; /* and others. */',NULL,NULL); # Mechanic/Genetic Cannonballs REPLACE INTO `item_db_re` VALUES (18000,'Cannon_Ball','Cannon Ball',10,100,NULL,10,'100',NULL,NULL,NULL,0x00040400,56,2,32768,NULL,'99',NULL,8,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (18001,'Holy_Cannon_Ball','Holy Cannon Ball',10,200,NULL,10,'120',NULL,NULL,NULL,0x00040400,56,2,32768,NULL,'99',NULL,8,'bonus bAtkEle,Ele_Holy;',NULL,NULL); @@ -9157,15 +9159,15 @@ REPLACE INTO `item_db_re` VALUES (18589,'Strawberry_Hat','Strawberry Hat',4,20,N REPLACE INTO `item_db_re` VALUES (18590,'Gemma_Hairband','Gemma Hairband',4,20,NULL,200,NULL,3,NULL,1,0xFFFFFFFF,63,2,256,NULL,'10',1,564,'bonus bMdef,3;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (18591,'Mini_Glasses_','Mini Glasses',4,20,NULL,100,NULL,2,NULL,1,0xFFFFFFFE,63,2,512,NULL,'0',0,47,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (18592,'Nestea_Hat','Nestea Hat',4,20,NULL,200,NULL,5,NULL,1,0xFFFFFFFF,63,2,256,NULL,'0',1,756,'bonus bMdef,5;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (18593,'Fancy_Mini_Crown','Fancy Mini Crown',4,20,NULL,100,NULL,2,NULL,1,0xFFFFFFFF,63,2,256,NULL,'30',1,707,'bonus bInt,1; bonus bMdef,5;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (18593,'Fancy_Mini_Crown','Fancy Mini Crown',4,20,NULL,100,NULL,2,NULL,1,0xFFFFFFFF,63,2,256,NULL,'30',1,707,'bonus bInt,1; bonus bMdef,5; bonus bVariableCast,-3000; bonus bMatkRate,3; bonus bHealPower,4; bonus bSkillUseSP,-3; .@r = getrefine(); if (.@r > 6) bonus bMatkRate,3; else if (.@r > 4) bonus bMatkRate,1;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (18594,'Magni_Cap_','Magni Cap',4,30000,NULL,1000,NULL,9,NULL,1,0xFFFFFFFE,63,2,256,NULL,'0',1,250,'bonus bStr,2;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (18595,'Horn_Of_Ancient','Horn of Ancient',4,40,NULL,200,NULL,8,NULL,1,0xFFFFFFFF,63,2,256,NULL,'50',1,757,'autobonus "{ bonus bBaseAtk,100; }",5,10000,0,"{ specialeffect2 EF_POTION_BERSERK; }";',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (18595,'Horn_Of_Ancient','Horn of Ancient',4,40,NULL,200,NULL,8,NULL,1,0xFFFFFFFF,63,2,256,NULL,'50',1,757,'bonus2 bSubClass,Class_Boss,10; bonus2 bAddClass,Class_Boss,10; .@r = getrefine(); if (.@r > 6) { autobonus "{ bonus bBaseAtk,100; }",10,10000,BF_WEAPON,"{ specialeffect2 EF_ENHANCE; }"; } if (.@r > 8) { bonus2 bSubClass,Class_Boss,10; bonus2 bAddClass,Class_Boss,10; }',NULL,NULL); REPLACE INTO `item_db_re` VALUES (18596,'Sprout_Hat','Sprout Hat',4,20,NULL,200,NULL,4,NULL,0,0xFFFFFFFF,63,2,256,NULL,'70',1,758,'skill "WZ_HEAVENDRIVE",3;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (18597,'Mercury_Riser','Mercury Riser',4,40,NULL,200,NULL,10,NULL,1,0xFFFFFFFF,63,2,256,NULL,'0',NULL,759,'bonus bAspdRate,3; bonus bCritical,3; .@r = getrefine(); if(.@r >= 7) { bonus bAspdRate,2; bonus bCritical,2; } if(.@r >= 9) { bonus bAspdRate,2; bonus bCritical,2; }',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (18597,'Mercury_Riser','Mercury Riser',4,40,NULL,200,NULL,10,NULL,1,0xFFFFFFFF,63,2,256,NULL,'0',NULL,759,'bonus2 bSubRace,RC_DemiHuman,10; bonus2 bAddRace,RC_DemiHuman,10; bonus bAspdRate,3; bonus bDelayrate,-3; .@r = getrefine(); if(.@r >= 7) { bonus bAspdRate,2; bonus bDelayrate,-2; } if(.@r >= 9) { bonus bAspdRate,2; bonus bDelayrate,-2; }',NULL,NULL); REPLACE INTO `item_db_re` VALUES (18598,'Mini_Tree_J','Mini Tree J',4,20,NULL,50,NULL,0,NULL,1,0xFFFFFFFF,63,2,256,NULL,'0',0,727,'bonus bMdef,20;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (18599,'Black_Devil_Mask','Black Devil Mask',4,20,NULL,100,NULL,0,NULL,0,0xFFFFFFFF,63,2,512,NULL,'0',0,760,'bonus bAllStats,2;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (18600,'Cat_Ear_Beret','Cat Ear Beret',4,20,NULL,100,NULL,5,NULL,1,0xFFFFFFFF,63,2,256,NULL,'0',1,761,'bonus bAtkRate,5; .@r = getrefine(); if(.@r > 5 && .@r <= 12) { bonus2 bAddRace,RC_DemiHuman,(.@r - 5); bonus2 bSubRace,RC_DemiHuman,(.@r - 5); bonus2 bAddRace,RC_Player,(.@r - 5); bonus2 bSubRace,RC_Player,(.@r - 5); } if(.@r > 12) { bonus2 bAddRace,RC_DemiHuman,7; bonus2 bAddRace,RC_Player,7; bonus2 bSubRace,RC_DemiHuman,7; bonus2 bSubRace,RC_Player,7; }',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (18601,'Red_Bread_Hat','Red Bread Hat',4,20,NULL,300,NULL,0,NULL,1,0xFFFFFFFF,63,2,256,NULL,'0',1,762,'bonus bMdef,5;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (18600,'Cat_Ear_Beret','Cat Ear Beret',4,20,NULL,100,NULL,5,NULL,1,0xFFFFFFFF,63,2,256,NULL,'0',1,761,'bonus bAtkRate,5; .@r = getrefine(); if(.@r < 5) .@r = 5; bonus2 bSubRace,RC_DemiHuman,(.@r - 5); bonus2 bAddRace,RC_DemiHuman,(.@r - 5);',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (18601,'Red_Bread_Hat','Red Bread Hat',4,20,NULL,300,NULL,0,NULL,1,0xFFFFFFFF,63,2,256,NULL,'0',1,762,'bonus bMdef,5; .@r = getrefine(); if (.@r < 5) .@r = 5; bonus2 bSubRace,RC_DemiHuman,(.@r - 5); bonus2 bMagicAddRace,RC_DemiHuman,(.@r - 5);',NULL,NULL); REPLACE INTO `item_db_re` VALUES (18602,'Watermelon_Bite','Watermelon Bite',4,20,NULL,100,NULL,4,NULL,0,0xFFFFFFFF,63,2,1,NULL,'30',0,763,'bonus bMdef,4; bonus2 bAddEle,Ele_Fire,4;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (18603,'Black_Devil_Mask_','Black Devil Mask',4,20,NULL,100,NULL,0,NULL,1,0xFFFFFFFF,63,2,512,NULL,'0',0,760,'bonus bAllStats,1;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (18604,'Falcon_Mask','Falcon Mask',4,10,NULL,30,NULL,0,NULL,1,0xFFFFFFFF,63,2,513,NULL,'50',0,782,NULL,NULL,NULL); @@ -9194,14 +9196,14 @@ REPLACE INTO `item_db_re` VALUES (18626,'Gelato_Hat','Gelato Hat',4,20,NULL,200, REPLACE INTO `item_db_re` VALUES (18627,'Dried_Leaf','Dried Leaf',4,20,NULL,50,NULL,0,NULL,0,0xFFFFFFFF,63,2,1,NULL,'10',0,711,'bonus bUnbreakableHelm,0;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (18628,'Tare_Brownie','Tare Brownie',4,20,NULL,500,NULL,5,NULL,1,0xFFFFFFFF,63,2,256,NULL,'50',0,781,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (18629,'B_Desert_Wolf_Hat','B Desert Wolf Hat',4,10,NULL,300,NULL,0,NULL,1,0xFFFFFFFF,63,2,256,NULL,'1',1,783,NULL,NULL,NULL); -REPLACE INTO `item_db_re` VALUES (18630,'Dep_Alice_Hat','Drooping Alicel',4,20,NULL,500,NULL,6,NULL,0,0xFFFFFFFE,63,2,256,NULL,'70',1,784,NULL,NULL,NULL); -REPLACE INTO `item_db_re` VALUES (18631,'Ribbon_Chef_Hat','Ribbon Chef Hat',4,20,NULL,300,NULL,5,NULL,0,0xFFFFFFFF,63,2,256,NULL,'70',1,785,'bonus bDex,3; bonus bLuk,1;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (18630,'Dep_Alice_Hat','Drooping Alicel',4,20,NULL,500,NULL,6,NULL,0,0xFFFFFFFE,63,2,256,NULL,'70',1,784,'bonus2 bAddRace,RC_DemiHuman,10; bonus2 bAddRace,RC_Player,10; if (getrefine() > 10) { autobonus "{ bonus bAspdRate,100; }",10,7000,BF_WEAPON,"{ specialeffect2 EF_POTION_BERSERK; }"; }',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (18631,'Ribbon_Chef_Hat','Ribbon Chef Hat',4,20,NULL,300,NULL,5,NULL,0,0xFFFFFFFF,63,2,256,NULL,'70',1,785,'bonus bDex,3; bonus bLuk,1; if (getrefine() > 6) { bonus2 bAddMonsterDropItem,12125,500; bonus2 bAddMonsterDropItem,12126,500; bonus2 bAddMonsterDropItem,12127,400; bonus2 bAddMonsterDropItem,12128,300; bonus2 bAddMonsterDropItem,12129,200; }',NULL,NULL); REPLACE INTO `item_db_re` VALUES (18632,'Yellow_Poring_Hairpin','Yellow Poring Hairpin',4,20,NULL,100,NULL,3,NULL,1,0xFFFFFFFF,63,2,256,NULL,'1',1,786,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (18633,'Pink_Poring_Hairpin','Pink Poring Hairpin',4,20,NULL,100,NULL,3,NULL,1,0xFFFFFFFF,63,2,256,NULL,'1',1,787,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (18634,'Green_Poring_Hairpin','Green Poring Hairpin',4,20,NULL,100,NULL,3,NULL,1,0xFFFFFFFF,63,2,256,NULL,'1',1,788,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (18635,'Blue_Poring_Hairpin','Blue Poring Hairpin',4,20,NULL,100,NULL,3,NULL,1,0xFFFFFFFF,63,2,256,NULL,'1',1,789,NULL,NULL,NULL); -REPLACE INTO `item_db_re` VALUES (18636,'Bridal_Ribbon','Bridal Ribbon',4,20,NULL,200,NULL,6,NULL,0,0xFFFFFFFF,63,2,256,NULL,'30',1,790,'bonus bDex,1;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (18637,'Ancient_Admiral_Helm','Ancient Admiral Helm',4,20,NULL,700,NULL,4,NULL,1,0xFFFFFFFF,63,2,768,NULL,'0',1,660,'bonus bStr,2; bonus bVit,1;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (18636,'Bridal_Ribbon','Bridal Ribbon',4,20,NULL,200,NULL,6,NULL,0,0xFFFFFFFF,63,2,256,NULL,'30',1,790,'bonus bDex,1; bonus3 bAutoSpellWhenHit,"DC_WINKCHARM",1,10;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (18637,'Ancient_Admiral_Helm','Ancient Admiral Helm',4,20,NULL,700,NULL,4,NULL,1,0xFFFFFFFF,63,2,768,NULL,'0',1,660,'bonus bStr,2; bonus bVit,1; if (getrefine() > 7) bonus bSpeedRate,25;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (18638,'Citron_Hat','Citron Hat',4,20,NULL,400,NULL,3,NULL,0,0xFFFFFFFE,63,2,256,NULL,'1',1,791,'bonus bLuk,3; bonus2 bSubRace,RC_Plant,10;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (18639,'Naval_Officer_Hat','Naval Officer Hat',4,20,NULL,200,NULL,2,NULL,0,0xFFFFFFFE,63,2,256,NULL,'1',1,792,'bonus bLuk,3; bonus2 bAddEle,Ele_Water,5;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (18640,'Starfish_Headband','Starfish Headband',4,20,NULL,200,NULL,2,NULL,0,0xFFFFFFFE,63,2,256,NULL,'1',1,793,NULL,NULL,NULL); @@ -9214,15 +9216,15 @@ REPLACE INTO `item_db_re` VALUES (18646,'Cow_Hat','Cow Hat',4,20,NULL,300,NULL,4 REPLACE INTO `item_db_re` VALUES (18647,'Star_Eyepatch','Star Eyepatch',4,20,NULL,100,NULL,0,NULL,0,0xFFFFFFFF,63,2,256,NULL,'1',0,800,'bonus2 bResEff,Eff_Stun,1500;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (18648,'Tongue_Charm','Tongue Charm',4,20,NULL,100,NULL,0,NULL,0,0xFFFFFFFF,63,2,1,NULL,'1',0,801,'bonus2 bSubRace,RC_Demon,3;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (18649,'Lude_Mask','Lude Mask',4,10,NULL,100,NULL,1,NULL,0,0xFFFFFFFF,63,2,513,NULL,'0',1,802,NULL,NULL,NULL); -REPLACE INTO `item_db_re` VALUES (18650,'RWC_Shouting_Mouth','RWC Shouting Mouth',4,20,NULL,50,NULL,0,NULL,0,0xFFFFFFFF,63,2,1,NULL,'1',0,194,NULL,NULL,NULL); +REPLACE INTO `item_db_re` VALUES (18650,'RWC_Shouting_Mouth','RWC Shouting Mouth',4,20,NULL,50,NULL,0,NULL,0,0xFFFFFFFF,63,2,1,NULL,'1',0,194,'bonus3 bAutoSpellWhenHit,"SM_ENDURE",1,10; bonus3 bAutoSpellWhenHit,"MO_CALLSPIRITS",5,10; bonus3 bAutoSpellWhenHit,"MO_EXPLOSIONSPIRITS",5,10; bonus3 bAutoSpell,"BS_MAXIMIZE",5,10; bonus3 bAutoSpell,"MC_LOUD",1,10; bonus3 bAutoSpell,"AC_CONCENTRATION",5,10; bonus3 bAutoSpell,"PR_GLORIA",3,10; autobonus "{ bonus bStr,3; bonus bAgi,3; }",10,5000,BF_WEAPON,"{ specialeffect2 EF_POTION_BERSERK; showscript \\\"RWC 2011 Fighting!!\\\"; }"; autobonus "{ bonus bInt,3; bonus bLuk,3; }",5,5000,BF_MAGIC,"{ specialeffect2 EF_ENERGYCOAT; showscript \\\"RWC 2011 Fighting!!\\\"; }";',NULL,NULL); REPLACE INTO `item_db_re` VALUES (18651,'Ignis_Cap','Ignis Cap',4,20,NULL,800,NULL,8,NULL,1,0xFFFFFFFF,63,2,256,NULL,'40',1,803,NULL,NULL,NULL); -REPLACE INTO `item_db_re` VALUES (18652,'Vanargandr_Helm','Vanargandr Helm',4,20,NULL,1500,NULL,10,NULL,1,0xFFFFFFFF,63,2,256,NULL,'80',1,804,'bonus bMdef,5; .@r = getrefine(); if (.@r >= 9 ) { bonus2 bHPGainAttackRate,100,8; bonus2 bSPGainAttackRate,100,4; } else if (.@r >= 8 ) { bonus2 bHPGainAttackRate,100,5; bonus2 bSPGainAttackRate,100,2; } else if (.@r >= 7 ) { bonus2 bHPGainAttackRate,100,5; bonus2 bSPGainAttackRate,100,2; } else if (.@r >= 5 ) { bonus2 bHPGainAttackRate,100,3; bonus2 bSPGainAttackRate,100,1; } else { bonus2 bHPGainAttackRate,100,1; bonus2 bSPGainAttackRate,100,1; } /* Confirm: Success rate? */',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (18652,'Vanargandr_Helm','Vanargandr Helm',4,20,NULL,1500,NULL,10,NULL,1,0xFFFFFFFF,63,2,256,NULL,'80',1,804,'bonus bMdef,5; .@r = getrefine(); if (.@r >= 9 ) { bonus2 bHPDrainRate,60,8; bonus2 bSPDrainRate,20,4; } else if (.@r >= 8 ) { bonus2 bHPDrainRate,50,5; bonus2 bSPDrainRate,10,2; } else if (.@r >= 7 ) { bonus2 bHPDrainRate,30,5; bonus2 bSPDrainRate,10,2; } else if (.@r >= 5 ) { bonus2 bHPDrainRate,10,3; bonus2 bSPDrainRate,10,1; } else { bonus2 bHPDrainRate,10,1; bonus2 bSPDrainRate,10,1; }',NULL,NULL); REPLACE INTO `item_db_re` VALUES (18653,'Deviruchi_Headphone','Deviruchi Headphone',4,20,NULL,200,NULL,8,NULL,1,0xFFFFFFFF,63,2,256,NULL,'30',1,805,'bonus bAgi,2;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (18655,'Goedo_Monocle','Goedo Monocle',4,20,NULL,100,NULL,0,NULL,0,0xFFFFFFFF,63,2,512,NULL,'50',0,23,NULL,NULL,NULL); -REPLACE INTO `item_db_re` VALUES (18656,'Witch\'s_Pumpkin_Hat','Witch\'s Pumpkin Hat',4,20,NULL,300,NULL,10,NULL,0,0xFFFFFFFF,63,2,256,NULL,'20',1,717,'bonus bMdef,10; bonus bStr,2; bonus bInt,2; bonus2 bMagicAddRace,RC_Undead,15; bonus2 bMagicAddRace,RC_Demon,15;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (18656,'Wit_Pumpkin_Hat','Witch\'s Pumpkin Hat',4,20,NULL,300,NULL,10,NULL,0,0xFFFFFFFF,63,2,256,NULL,'20',1,717,'bonus bMdef,10; bonus bStr,2; bonus bInt,2; bonus2 bMagicAddRace,RC_Undead,15; bonus2 bMagicAddRace,RC_Undead,15; bonus2 bMagicAddRace,RC_Demon,15; bonus2 bMagicAddRace,RC_Demon,15;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (18657,'Pegasus_Wing_Ears','Pegasus Wing Ears',4,20,NULL,500,NULL,1,NULL,0,0xFFFFFFFF,63,2,512,NULL,'80',0,568,'bonus bUnbreakableHelm,0; if (BaseLevel >= 150) bonus bAspdRate,3; else if (BaseLevel >= 100) bonus bAspdRate,2; else if (BaseLevel >= 50) bonus bAspdRate,1;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (18658,'Holy_Santa_Beard','Holy Santa Beard',4,20,NULL,100,NULL,0,NULL,0,0xFFFFFFFF,63,2,1,NULL,'1',0,25,NULL,NULL,NULL); -REPLACE INTO `item_db_re` VALUES (18659,'Boitata_Hat','Boitata Hat',4,20,NULL,0,NULL,5,NULL,1,0xFFFFFFFF,63,2,768,NULL,'0',1,808,NULL,NULL,NULL); +REPLACE INTO `item_db_re` VALUES (18659,'Boitata_Hat','Boitata Hat',4,20,NULL,0,NULL,5,NULL,1,0xFFFFFFFF,63,2,768,NULL,'0',1,808,'autobonus "{ bonus bAtkEle,Ele_Fire; }",10,180000,BF_WEAPON,"{ specialeffect2 EF_ENHANCE; }"; bonus3 bAutospell,"AS_SONICBLOW",5,10;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (18660,'Indi_Feather_Band','Indian Feather Headband',4,20,NULL,400,NULL,3,NULL,1,0xFFFFFFFE,63,2,256,NULL,'0',1,809,'bonus bAgi,2;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (18661,'Trident_Helm','Trident Helm',4,20,NULL,400,NULL,3,NULL,1,0xFFFFFFFE,63,2,256,NULL,'20',1,810,'bonus bStr,2;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (18662,'Antler_Fedora','Antler Fedora',4,20,NULL,400,NULL,3,NULL,0,0xFFFFFFFE,63,2,256,NULL,'1',1,811,'bonus bInt,3;',NULL,NULL); @@ -9234,7 +9236,7 @@ REPLACE INTO `item_db_re` VALUES (18667,'Cat_Lace_Hairband','Cat Lace Hairband', REPLACE INTO `item_db_re` VALUES (18668,'Droopy_Turtle_Hat','Droopy Turtle Hat',4,20,NULL,300,NULL,1,NULL,1,0xFFFFFFFE,63,2,256,NULL,'1',1,694,'skill "AL_DECAGI",3;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (18669,'Cowhide_Hat','Cowhide Hat',4,20,NULL,200,NULL,3,NULL,1,0xFFFFFFFE,63,2,256,NULL,'1',1,819,'bonus bDex,2; bonus bMaxHPrate,1;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (18670,'Hankie_In_Mouth','Hankie In Mouth',4,20,NULL,100,NULL,1,NULL,0,0xFFFFFFFF,63,2,1,NULL,'12',0,818,'bonus2 bSubRace,RC_DemiHuman,3; bonus2 bSubRace,RC_Player,3;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (18671,'Rudolf_Hairband','Rudolf Hairband',4,20,NULL,200,NULL,5,NULL,0,0xFFFFFFFF,63,2,256,NULL,'30',1,836,'bonus3 bAutoSpell,"AL_INCAGI",10,50; bonus3 bAutoSpellWhenHit,"AL_INCAGI",10,50; bonus2 bAddItemHealRate,515,2000;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (18671,'Rudolf_Hairband','Rudolf Hairband',4,20,NULL,200,NULL,5,NULL,0,0xFFFFFFFF,63,2,256,NULL,'30',1,836,'bonus3 bAutoSpell,"AL_INCAGI",10,50; bonus3 bAutoSpellWhenHit,"AL_INCAGI",10,50; bonus2 bAddItemHealRate,515,2000; autobonus "{ bonus bLuk,20; }",10,50000,BF_WEAPON,"{ specialeffect2 EF_POTION_BERSERK; /* showscript */ }"; autobonus2 "{ bonus bStr,20; }",10,50000,BF_WEAPON,"{ specialeffect2 EF_POTION_BERSERK; /* showscript */ }";',NULL,NULL); REPLACE INTO `item_db_re` VALUES (18672,'Tare_Pope','Tare Pope',4,20,NULL,300,NULL,0,NULL,0,0xFFFFFFFF,63,2,256,NULL,'1',0,817,'bonus bUnbreakableHelm,0;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (18673,'Tare_Pope_','Tare Pope',4,20,NULL,300,NULL,0,NULL,1,0xFFFFFFFF,63,2,256,NULL,'1',0,817,'bonus bUnbreakableHelm,0; bonus bSPrecovRate,2;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (18674,'Planewing_Hat','Planewing Hat',4,20,NULL,200,NULL,3,NULL,1,0xFFFFFFFE,63,2,256,NULL,'1',1,820,'bonus bAgi,3;',NULL,NULL); @@ -9337,7 +9339,7 @@ REPLACE INTO `item_db_re` VALUES (18805,'Eclipse_Hat','Eclipse Hat',4,20,NULL,30 REPLACE INTO `item_db_re` VALUES (18806,'Black_Rabbit_Hat','Black Rabbit Hat',4,20,NULL,300,NULL,2,NULL,1,0xFFFFFFFF,63,2,256,NULL,'0',1,923,'bonus bDex,2; bonus bAgi,3; bonus3 bAutoSpellWhenHit,"AL_INCAGI",5,10;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (18807,'Yellow_Yuzu_Hat','Yellow Yuzu Hat',4,20,NULL,400,NULL,3,NULL,1,0xFFFFFFFE,63,2,256,NULL,'0',1,924,'bonus bVit,2; bonus bLuk,3; bonus2 bSubRace,RC_Plant,10;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (18808,'Wing_Form_Spectacle','Wing Form Spectacle',4,20,NULL,100,NULL,1,NULL,0,0xFFFFFFFF,63,2,256,NULL,'0',1,925,'bonus bAgi,1;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (18810,'Hell_Pumpkin_Hat','Hell Pumpkin Hat',4,20,NULL,500,NULL,12,NULL,0,0xFFFFFFFF,63,2,256,NULL,'0',1,717,'bonus bMdef,12; bonus2 bSubRace,6,5; bonus2 bSubRace,RC_DemiHuman,5; bonus2 bSubRace,RC_Player,5; bonus2 bSubRace,RC_Undead,-5;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (18810,'Hell_Pumpkin_Hat','Hell Pumpkin Hat',4,20,NULL,500,NULL,12,NULL,0,0xFFFFFFFF,63,2,256,NULL,'0',1,717,'bonus bMdef,12; bonus2 bSubRace,RC_Demon,5; bonus2 bSubRace,RC_Undead,5; bonus2 bSubRace,RC_DemiHuman,5; bonus2 bSubRace,RC_Player,5;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (18813,'New_Wave_Sunglasses','New Wave Sunglasses',4,10,NULL,100,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,512,NULL,'30',NULL,856,'bonus bDelayrate,-10;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (18814,'Angel_School_Cap','Angel School Cap',4,20,NULL,100,NULL,4,NULL,1,0xFFFFFFFE,63,2,256,NULL,'0',1,927,'bonus bInt,2; bonus bVit,1;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (18815,'Devil_School_Cap','Devil School Cap',4,20,NULL,100,NULL,4,NULL,1,0xFFFFFFFE,63,2,256,NULL,'0',1,928,'bonus bStr,2; bonus bVit,1;',NULL,NULL); @@ -9363,9 +9365,9 @@ REPLACE INTO `item_db_re` VALUES (18845,'Banshee_Master_Kiss','Banshee Master Ki REPLACE INTO `item_db_re` VALUES (18848,'Fresh_Roses','Fresh Roses',4,10,NULL,200,'0:20',0,NULL,1,0xFFFFFFFF,63,2,256,NULL,'1',1,963,'bonus bMagicHPGainValue,100; bonus bMagicSPGainValue,100;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (18849,'Celine_Ribbon','Celine Ribbon',4,10,NULL,200,NULL,NULL,NULL,1,0xFFFFFFFF,63,2,256,NULL,'1',1,967,'bonus bDex,3; bonus bMatk,40+getrefine(); bonus bMagicHPGainValue,200; bonus2 bHPLossRate,50,5000;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (18850,'Polar_Bear_Cap','Polar Bear Cap',4,20,NULL,300,NULL,7,NULL,0,0xFFFFFFFF,63,2,256,NULL,'1',0,966,'bonus bUnbreakableHelm,0; bonus bDex,1; bonus bAgi,1; bonus bMdef,3; bonus bHPrecovRate,5; bonus bSPrecovRate,3; bonus2 bAddMonsterDropItem,12354,100;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (18851,'C_Polar_Bear_Cap','Costume Polar Bear Cap',4,20,NULL,0,NULL,0,NULL,0,0xFFFFFFFF,63,2,1024,NULL,'1',1,966,NULL,NULL,NULL); +REPLACE INTO `item_db_re` VALUES (18851,'C_Polar_Bear_Cap','Costume Polar Bear Cap',4,20,NULL,0,NULL,0,NULL,0,0xFFFFFFFF,63,2,1024,NULL,'1',1,966,'/*Is this correct item?*/',NULL,NULL); REPLACE INTO `item_db_re` VALUES (18855,'Aviator_Hat','Aviator Hat',4,10,NULL,100,NULL,10,NULL,0,0xFFFFFFFF,63,2,256,NULL,'1',1,972,'bonus bAgi,3; bonus bInt,3; autobonus "{ bonus bAtkEle,Ele_Wind; }",500,180,BF_NORMAL;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (18856,'W_King_Tiger_Doll_Hat','W King Tiger Doll Hat',4,10,NULL,0,NULL,10,NULL,0,0xFFFFFFFF,63,2,256,NULL,'1',1,973,'bonus bStr,2; bonus bDex,2; bonus2 bAddRace,RC_Brute,10; .@r = getrefine(); autobonus "{ bonus2 bSPLossRate,5,1000; bonus bBaseAtk,25*.@r; }",3*.@r,3000,BF_NORMAL,"{ transform 1115,3000; specialeffect2 EF_POTION_BERSERK; }"; autobonus2 "{ bonus2 bSPLossRate,5,1000; bonus bBaseAtk,25*.@r; }",.@r,3000,BF_NORMAL,"{ transform 1115,3000; specialeffect2 EF_POTION_BERSERK; }";',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (18856,'W_King_Tiger_Doll_Hat','W King Tiger Doll Hat',4,10,NULL,0,NULL,10,NULL,0,0xFFFFFFFF,63,2,256,NULL,'1',1,973,'bonus bStr,2; bonus bDex,2; bonus2 bAddRace,RC_Brute,10; .@r = getrefine(); autobonus "{ bonus2 bSPLossRate,5,1000; bonus bBaseAtk,25*.@r; }",3*.@r,3000,BF_NORMAL,"{ transform 1115,3000; specialeffect2 EF_POTION_BERSERK; showscript \\\"Traaaansformation-!! Eddga form!!\\\"; }"; autobonus2 "{ bonus2 bSPLossRate,5,1000; bonus bBaseAtk,25*.@r; }",.@r,3000,BF_NORMAL,"{ transform 1115,3000; specialeffect2 EF_POTION_BERSERK; showscript \\\"Traaaansformation-!! Eddga form!!\\\"; }";',NULL,NULL); REPLACE INTO `item_db_re` VALUES (18857,'Curupira_Hat','Curupira Hat',4,10,NULL,100,NULL,20,NULL,0,0xFFFFFFFF,63,2,256,NULL,'1',1,974,'bonus bDex,3; bonus2 bAddEffWhenHit,Eff_Confusion,500;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (18859,'Angeling_Bubble','Angeling Bubble',4,10,NULL,50,NULL,5,NULL,0,0xFFFFFFFF,63,2,1,NULL,'1',NULL,975,'bonus bDex,1; bonus bMatkRate,2; bonus bMaxHP,100;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (18861,'Zaha_Doll_J_Hat','Zaha Doll J Hat',4,10,NULL,100,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,256,NULL,'50',1,461,'bonus bHealPower,15; bonus bUseSPrate,15;',NULL,NULL); @@ -9433,6 +9435,7 @@ REPLACE INTO `item_db_re` VALUES (18997,'Reckless_Chip','Reckless Chip',4,10,NUL REPLACE INTO `item_db_re` VALUES (19019,'Elemental_Crown','Elemental Crown',4,0,NULL,500,NULL,10,NULL,1,0xFFFFFFFF,63,2,256,NULL,NULL,1,1219,'.@r = getrefine(); bonus bDex,(3 + (.@r/2)+ (readparam(bDex) > 130 ? .@r : 0)); bonus bLongAtkRate,4;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (19020,'Survive_Circlet','Survive Circlet',4,0,NULL,500,NULL,10,NULL,1,0xFFFFFFFF,63,2,256,NULL,NULL,1,1220,'.@r = getrefine(); bonus bInt,(3 + (.@r/2)+ (BaseLevel > 130 ? .@r : 0)); bonus bMatkRate,4;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (19021,'Gigant_Helm','Gigant Helm',4,0,NULL,500,NULL,10,NULL,1,0xFFFFFFFF,63,2,256,NULL,NULL,1,1221,'bonus bStr,3+((BaseLevel > 130) ? getrefine() : 0); bonus bAtkRate,4;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (19024,'Protect_Feathers','Protect Feathers',4,0,NULL,500,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,512,1,'70',1,1232,'bonus2 bSubRace,RC_DemiHuman,2; bonus2 bSubRace,RC_Player,2; bonus bAspdRate,-5; .@vit = readparam(bVit); if (.@vit >= 108) { bonus2 bSubRace,RC_DemiHuman,3; bonus2 bSubRace,RC_Player,3; bonus bAspdRate,-5; } if (.@vit >= 120) { bonus bMaxHPRate,3; bonus bMdef,3; }',NULL,NULL); REPLACE INTO `item_db_re` VALUES (19026,'Aegir_Helm','Aegir Helm',4,10,NULL,800,NULL,10,NULL,0,0xFFFFFFFF,63,2,256,NULL,'40',1,870,'bonus bVit,3;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (19030,'Pretty_Rabbit_Hood','Pretty Rabbit Hood',4,10,NULL,100,NULL,20,NULL,0,0xFFFFFFFF,63,2,1,NULL,'1',1,1085,'bonus bMaxHP,(15*BaseLevel);',NULL,NULL); REPLACE INTO `item_db_re` VALUES (19031,'Fallen_Angel_Blessing','Fallen Angel Blessing',4,0,NULL,200,NULL,1,NULL,0,0xFFFFFFFF,63,2,512,NULL,NULL,1,1250,'bonus2 bAddRace,RC_Angel,5; bonus2 bSubRace,RC_Angel,5;',NULL,NULL); @@ -9476,12 +9479,12 @@ REPLACE INTO `item_db_re` VALUES (19529,'C_Angelic_Chain','Costume Angel Wing',4 REPLACE INTO `item_db_re` VALUES (19530,'C_Wild_Rose','Costume Wild Rose',4,0,NULL,0,NULL,0,NULL,0,0xFFFFFFFF,63,2,1024,NULL,'1',0,541,'bonus bUnbreakableHelm,0; bonus bBaseAtk,2; bonus bMatk,2;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (19531,'C_Cube_Mask','Costume Cube Mask',4,0,NULL,0,NULL,0,NULL,0,0xFFFFFFFF,63,2,6144,NULL,'0',0,472,'bonus bUnbreakableHelm,0; bonus bFlee,1;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (19532,'C_Red_Bunny_Band','Red Bunny Band',4,0,NULL,0,NULL,0,NULL,0,0xFFFFFFFF,63,2,1024,NULL,'1',0,640,'bonus bUnbreakableHelm,0; bonus bDex,1;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (19533,'C_Spore_Hat','Costume Spore Hat',4,0,NULL,0,NULL,0,NULL,0,0xFFFFFFFF,63,2,1024,NULL,'1',0,114,'bonus bUnbreakableHelm,0; bonus bVit,1; bonus2 bExpAddClass,Class_All,1;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (19534,'C_Tha_Despero_Mask','Costume Thanatos Despero Mask',4,20,NULL,0,NULL,0,NULL,0,0xFFFFFFFF,63,2,513,NULL,'1',0,693,'bonus bAtkRate,1; bonus bMatkRate,1; bonus bHealPower,1;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (19535,'C_Sinsuncho_Hat','Costume Sinsuncho Hat',4,0,NULL,0,NULL,0,NULL,0,0xFFFFFFFF,63,2,1024,NULL,'1',0,730,'bonus bUnbreakableHelm,0; bonus bStr,1; bonus2 bExpAddClass,Class_All,1;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (19533,'C_Spore_Hat','Costume Spore Hat',4,0,NULL,0,NULL,0,NULL,0,0xFFFFFFFF,63,2,1024,NULL,'1',0,114,'bonus bUnbreakableHelm,0; bonus bVit,1; bonus2 bExpAddRace,RC_All,1;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (19534,'C_Tha_Despero_Mask','Costume Thanatos Despero Mask',4,20,NULL,0,NULL,0,NULL,0,0xFFFFFFFF,63,2,513,NULL,'1',0,693,'bonus2 bAddClass,Class_All,1; bonus bMatkRate,1; bonus bHealPower,1;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (19535,'C_Sinsuncho_Hat','Costume Sinsuncho Hat',4,0,NULL,0,NULL,0,NULL,0,0xFFFFFFFF,63,2,1024,NULL,'1',0,730,'bonus bUnbreakableHelm,0; bonus bStr,1; bonus2 bExpAddRace,RC_All,1;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (19536,'C_Rose_Corsage','Costume Rose Corsage',4,0,NULL,0,NULL,0,NULL,0,0xFFFFFFFF,63,2,1024,NULL,'1',0,533,'bonus bUnbreakableHelm,0; bonus bInt,1;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (19537,'C_Gryphon_Hat','Costume Gryphon Hat',4,0,NULL,0,NULL,0,NULL,0,0xFFFFFFFF,63,2,1024,NULL,'1',0,591,'bonus bUnbreakableHelm,0;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (19538,'Full_Moon','Full Moon',4,0,NULL,0,NULL,0,NULL,0,0xFFFFFFFF,63,2,1024,NULL,'1',0,780,'autobonus "{ bonus bMatk,50; bonus bBaseAtk,50; }",10,5000;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (19538,'Full_Moon','Full Moon',4,0,NULL,0,NULL,0,NULL,0,0xFFFFFFFF,63,2,1024,NULL,'1',0,780,'autobonus "{ bonus bBaseAtk,50; }",10,5000,BF_WEAPON,"{ specialeffect2 EF_POTION_BERSERK; /* showscript */ }"; autobonus "{ bonus bMatk,50; }",5,5000,BF_MAGIC,"{ specialeffect2 EF_ENERGYCOAT; /* showscript */ }";',NULL,NULL); REPLACE INTO `item_db_re` VALUES (19539,'C_Reginleif_Hairband','Costume Hairband Of Reginleif',4,20,NULL,0,NULL,0,NULL,0,0xFFFFFFFF,63,2,1024,NULL,'1',0,468,'bonus bAllStats,1;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (19540,'C_Rabbit_Earplug','Costume Rabbit Earplugs',4,20,NULL,0,NULL,0,NULL,0,0xFFFFFFFF,63,2,7168,NULL,'1',0,515,'bonus bAgi,1; bonus bFlee,2;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (19541,'C_Romantic_White_Flower','Costume Romantic White Flower',4,20,NULL,0,NULL,0,NULL,0,0xFFFFFFFF,63,2,4096,NULL,'1',0,259,'bonus bUnbreakableHelm,0;',NULL,NULL); @@ -9751,7 +9754,8 @@ REPLACE INTO `item_db_re` VALUES (20094,'C_Green_Ribbon','Costume Green Ribbon', REPLACE INTO `item_db_re` VALUES (20095,'C_Red_Ribbon','Costume Red Ribbon',4,0,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,1024,NULL,'1',1,440,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (20096,'C_Blue_Ribbon','Costume Blue Ribbon',4,0,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,1024,NULL,'1',1,441,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (20097,'C_White_Ribbon','Costume White Ribbon',4,0,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,1024,NULL,'1',1,442,NULL,NULL,NULL); -REPLACE INTO `item_db_re` VALUES (20110,'C_Coiledup_Snake','Costume Coiledup Snake',4,0,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,1024,NULL,'1',1,NULL,'/*TODO: View ID*/',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (20099,'C_Flying_Ljosalfar','Flying Ljosalfar',4,0,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,1024,1,'1',1,1239,NULL,NULL,NULL); +REPLACE INTO `item_db_re` VALUES (20110,'C_Coiledup_Snake','Costume Coiledup Snake',4,0,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,1024,NULL,'1',1,1258,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (20118,'C_Cake_Hat','Costume Cake Hat',4,0,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,1024,NULL,'1',1,109,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (20119,'C_Beanie','Costume Beanie',4,0,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,1024,NULL,'1',1,160,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (20120,'C_Aerial','Costume Aerial',4,0,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,1024,NULL,'1',1,97,NULL,NULL,NULL); @@ -9809,7 +9813,7 @@ REPLACE INTO `item_db_re` VALUES (20233,'C_Golden_Angel','Costume Golden Angel', # REPLACE INTO `item_db_re` VALUES (20500,'T_Archangel_Wing','Archangel Wing',4,0,NULL,0,NULL,0,NULL,0,0xFFFFFFFF,63,2,8192,NULL,'1',0,1,'bonus bUnbreakableHelm,0;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (20600,'Fantastic_Aura','Fantastic Aura',4,0,NULL,0,NULL,0,NULL,0,0xFFFFFFFF,63,2,8192,NULL,'1',0,0,'/*View ID*/ bonus bUnbreakableHelm,0;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (20700,'Egir_Manteau','Egir Manteau',4,200000,NULL,300,NULL,10,NULL,1,0xFFFFFFFF,63,2,4,NULL,'110',1,0,'bonus bUnbreakableHelm,0;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (20700,'Egir_Manteau','Egir Manteau',4,200000,NULL,300,NULL,10,NULL,1,0xFFFFFFFF,63,2,4,NULL,'110',1,0,'bonus bUnbreakableGarment,0; .@r = getrefine(); if (.@r > 10) .@r = 10; if (BaseClass == Job_Mage || BaseClass == Job_Archer || BaseClass == Job_Acolyte) { bonus bFlee2,5+(.@r*2); } else if (BaseClass == Job_Swordman || BaseClass == Job_Merchant || BaseClass == Job_Thief) { bonus bShortWeaponDamageReturn,5+(.@r*2); }',NULL,NULL); REPLACE INTO `item_db_re` VALUES (20706,'Amistr_Bag','Amistr Bag',4,10,NULL,500,NULL,18,NULL,0,0xFFFFFFFF,63,2,4,NULL,'1',NULL,4,'bonus bAllStats,1; bonus2 bSubEle,Ele_All,5;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (20707,'Kirin_Wing','Kirin Wing',4,20,NULL,0,NULL,18,NULL,0,0xFFFFFFFF,63,2,4,NULL,'0',1,6,'bonus bAllStats,1; bonus2 bSubRace,RC_DemiHuman,5; bonus2 bSubRace,RC_Player,5;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (20710,'Impr_Angel\'s_Warmth','Advanced Angelic Cardigan',4,10000,NULL,400,NULL,6,NULL,1,0x00000001,63,2,4,NULL,'99',1,0,'bonus bHPrecovRate,50;',NULL,NULL); @@ -9817,7 +9821,7 @@ REPLACE INTO `item_db_re` VALUES (20711,'Manteau_Of_Diego','Manteau Of Diego',4, REPLACE INTO `item_db_re` VALUES (20717,'Gigant_Snake_Skin','Gigant Snake Skin',4,10,NULL,400,NULL,38,NULL,0,0xFFFFFFFF,63,2,4,NULL,'1',1,0,'bonus bMdef,10;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (20718,'Gigant_Snake_Skin','Gigant Snake Skin',4,10,NULL,400,NULL,38,NULL,1,0xFFFFFFFF,63,2,4,NULL,'1',1,0,'bonus bMdef,10;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (20721,'Black_As_Night_Cloak','Black As Night Cloak',4,10,NULL,600,NULL,45,NULL,1,0xFFFFFFFF,63,2,4,NULL,'120',1,0,'bonus2 bSubEle,Ele_Holy,5+(getrefine()/2);',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (20724,'Love_Dad_Wings_2012','Love Dad Wings 2012',4,0,NULL,100,NULL,15,NULL,1,0xFFFFFFFF,63,2,4,NULL,'1',1,5,NULL,NULL,NULL); +REPLACE INTO `item_db_re` VALUES (20724,'Love_Dad_Wings_2012','Love Dad Wings 2012',4,0,NULL,100,NULL,15,NULL,1,0xFFFFFFFF,63,2,4,NULL,'1',1,5,'.@r = getrefine(); bonus bAllStats,1; if ((readparam(bStr)>89)) { bonus bStr,.@r; bonus bMaxHPRate,1; bonus bMaxSPRate,1; } if ((readparam(bAgi)>89)) { bonus bAgi,.@r; bonus bMaxHPRate,1; bonus bMaxSPRate,1; } if ((readparam(bVit)>89)) { bonus bVit,.@r; bonus bMaxHPRate,1; bonus bMaxSPRate,1; } if ((readparam(bInt)>89)) { bonus bInt,.@r; bonus bMaxHPRate,1; bonus bMaxSPRate,1; } if ((readparam(bDex)>89)) { bonus bDex,.@r; bonus bMaxHPRate,1; bonus bMaxSPRate,1; } if ((readparam(bLuk)>89)) { bonus bLuk,.@r; bonus bMaxHPRate,1; bonus bMaxSPRate,1; }',NULL,NULL); REPLACE INTO `item_db_re` VALUES (20725,'Ribbon_Piamat','Ribbon Piamat',4,10,NULL,100,'0:10',NULL,NULL,0,0xFFFFFFFF,63,2,4,NULL,'30',1,7,'bonus bInt,1; bonus bDex,1;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (20727,'Brilliant_Golden_Wings','Brilliant Golden Wings',4,10,NULL,0,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,8192,NULL,'1',1,5,NULL,NULL,NULL); REPLACE INTO `item_db_re` VALUES (20730,'Loyalists_Hood','Loyalists Hood',4,10,NULL,200,NULL,30,NULL,0,0xFFFFFFFF,63,2,8192,NULL,'80',NULL,NULL,'bonus bStr,2; bonus bMaxHPrate,10; bonus bNoKnockback,1; bonus2 bSubEle,Ele_All,-20;',NULL,NULL); @@ -9936,15 +9940,15 @@ REPLACE INTO `item_db_re` VALUES (22625,'Oktoberfest_Bag','Oktoberfest Bag',2,0, REPLACE INTO `item_db_re` VALUES (22628,'Green_Package','Green Package',18,0,NULL,100,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'getitem 17162,1; getitem 14534,5; getitem 12323,20; getitem 12324,20; getitem 12325,10; getitem 14533,2; getitem 22629,1;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (22629,'Green_Package40','Green Package 40',18,0,NULL,100,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'getitem 14289,1; getitem 12215,10; getitem 12216,10; getitem 14534,10; getitem 14533,5; getitem 12766,5; getitem 22630,1;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (22630,'Green_Package80','Green Package 80',18,0,NULL,100,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'getitem 7621,5; getitem 12209,5; getitem 14527,10; getitem 14533,5; getitem 12766,5; getitem 22631,1;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (22631,'Green_Package99','Green Package 99',18,0,NULL,100,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'getitem 12213,1; /*getitem Transmission_Coupon,1;*/ getitem 5883,1;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (22631,'Green_Package99','Green Package 99',18,0,NULL,100,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'getitem 12213,1; getitem 7676,1; getitem 5883,1;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (22640,'17173_Green_Package','Green Package',18,0,NULL,100,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'getitem 17162,1; getitem 14534,5; getitem 12323,20; getitem 12324,20; getitem 12325,10; getitem 14533,2; getitem 22641,1;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (22641,'17173_Green_Package40','Green Package 40',18,0,NULL,100,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'getitem 14289,1; getitem 12215,10; getitem 12216,10; getitem 14534,10; getitem 14533,5; getitem 12766,5; getitem 22642,1;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (22642,'17173_Green_Package80','Green Package 80',18,0,NULL,100,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'getitem 7621,5; getitem 12209,5; getitem 14527,10; getitem 14533,5; getitem 12766,5; getitem 22643,1;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (22643,'17173_Green_Package99','Green Package 99',18,0,NULL,100,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'getitem 12213,1; /*getitem Transmission_Coupon,1;*/ getitem 5883,1;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (22643,'17173_Green_Package99','Green Package 99',18,0,NULL,100,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'getitem 12213,1; getitem 7676,1; getitem 5883,1;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (22644,'S_Green_Package','Green Package',18,0,NULL,100,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'getitem 17162,1; getitem 14534,5; getitem 12323,20; getitem 12324,20; getitem 12325,10; getitem 14533,2; getitem 22645,1;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (22645,'S_Green_Package40','Green Package 40',18,0,NULL,100,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'getitem 14289,1; getitem 12215,10; getitem 12216,10; getitem 14534,10; getitem 14533,5; getitem 12766,5; getitem 22646,1;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (22646,'S_Green_Package80','Green Package 80',18,0,NULL,100,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'getitem 7621,5; getitem 12209,5; getitem 14527,10; getitem 14533,5; getitem 12766,5; getitem 22647,1;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (22647,'S_Green_Package99','Green Package 99',18,0,NULL,100,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'getitem 12213,1; /*getitem Transmission_Coupon,1;*/ getitem 5883,1;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (22647,'S_Green_Package99','Green Package 99',18,0,NULL,100,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'getitem 12213,1; getitem 7676,1; getitem 5883,1;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (22648,'Angeling_Package','Angel Ring Package',2,20,NULL,10,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'/* TODO */',NULL,NULL); REPLACE INTO `item_db_re` VALUES (22649,'Deviling_Package','Devil Ring Package',2,20,NULL,10,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'/* TODO */',NULL,NULL); REPLACE INTO `item_db_re` VALUES (22652,'Briliant_Hat_Box','Brilliant Hat Box',2,10,NULL,200,NULL,NULL,NULL,NULL,0xFFFFFFFF,63,2,NULL,NULL,NULL,NULL,NULL,'/* TODO */',NULL,NULL); @@ -10297,10 +10301,10 @@ REPLACE INTO `item_db_re` VALUES (28202,'Southern_Cross_','Southern Cross',5,280 REPLACE INTO `item_db_re` VALUES (28203,'Half_BF_Rifle1','Half BF Rifle1',5,0,NULL,0,'50',NULL,9,0,0x41000000,63,2,34,3,'80',1,18,'bonus bDex,2; bonus bHit,8; bonus bCritical,8; bonus2 bAddRace,RC_DemiHuman,30; bonus2 bAddRace,RC_Player,30; bonus2 bVariableCastrate,"GS_TRACKING",-20; bonus2 bIgnoreDefRaceRate,RC_DemiHuman,10; bonus2 bIgnoreDefRaceRate,RC_Player,10; bonus bUnbreakableWeapon,0;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (28204,'Half_BF_Shotgun1','Half BF Shotgun1',5,0,NULL,0,'100',NULL,9,0,0x41000000,63,2,34,3,'80',1,20,'bonus bDex,2; bonus bSplashRange,1; bonus2 bAddRace,RC_DemiHuman,30; bonus2 bAddRace,RC_Player,30; bonus2 bIgnoreDefRaceRate,RC_DemiHuman,10; bonus2 bIgnoreDefRaceRate,RC_Player,10; autobonus "{ bonus bBaseAtk,80; bonus2 bHPLossRate,100,1000; }",30,6000,BF_WEAPON,"{ specialeffect2 EF_BASH3D; }"; bonus bUnbreakableWeapon,0;',NULL,NULL); # -#28315,RCC2013_ARMLET -#28316,RCC2013_ARMLET_ -#28317,RCC2013_RING -#28318,RCC2013_RING_ +REPLACE INTO `item_db_re` VALUES (28315,'RCC2013_ARMLET','RCC2013_ARMLET',4,200,NULL,200,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,136,NULL,'1',0,NULL,'bonus2 bAddClass,Class_All,1;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (28316,'RCC2013_ARMLET_','RCC2013_ARMLET_',4,200,NULL,200,NULL,NULL,NULL,1,0xFFFFFFFF,63,2,136,NULL,'1',0,NULL,'bonus2 bAddClass,Class_All,1;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (28317,'RCC2013_RING','RCC2013_RING',4,200,NULL,200,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,136,NULL,'1',0,NULL,'bonus2 bAddClass,Class_All,1;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (28318,'RCC2013_RING_','RCC2013_RING_',4,200,NULL,200,NULL,NULL,NULL,1,0xFFFFFFFF,63,2,136,NULL,'1',0,NULL,'bonus2 bAddClass,Class_All,1;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (28310,'Sarah\'s_Left_Earring','Sarah\'s Left Earring',4,10,NULL,100,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,128,NULL,'145',1,NULL,'skill "AL_HEAL",1;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (28311,'Sarah\'s_Right_Earring','Sarah\'s Right Earring',4,10,NULL,100,NULL,NULL,NULL,0,0xFFFFFFFF,63,2,8,NULL,'145',1,NULL,'skill "AL_TELEPORT",1;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (28326,'Broken_Chips_01','Broken Chips 01',4,10,NULL,100,NULL,NULL,NULL,1,0xFFFFFFFF,63,2,136,NULL,'100',1,NULL,'bonus bStr,4;',NULL,NULL); diff --git a/sql-files/main.sql b/sql-files/main.sql index f3b4e35a3f..d0eb805836 100644 --- a/sql-files/main.sql +++ b/sql-files/main.sql @@ -150,6 +150,7 @@ CREATE TABLE IF NOT EXISTS `char` ( `unban_time` int(11) unsigned NOT NULL default '0', `font` tinyint(3) unsigned NOT NULL default '0', `uniqueitem_counter` int(11) unsigned NOT NULL default '0', + `sex` ENUM('M','F','U') NOT NULL default 'U', PRIMARY KEY (`char_id`), UNIQUE KEY `name_key` (`name`), KEY `account_id` (`account_id`), @@ -699,6 +700,72 @@ CREATE TABLE IF NOT EXISTS `ragsrvinfo` ( `drop` int(11) unsigned NOT NULL default '0' ) ENGINE=MyISAM; +-- +-- Table structure for `db_roulette` +-- +CREATE TABLE `db_roulette` ( + `index` int(11) NOT NULL default '0', + `level` smallint(5) unsigned NOT NULL, + `item_id` smallint(5) unsigned NOT NULL, + `amount` smallint(5) unsigned NOT NULL DEFAULT '1', + `flag` smallint(5) unsigned NOT NULL DEFAULT '1', + PRIMARY KEY (`index`) +) ENGINE=MyISAM; + +-- ---------------------------- +-- Records of db_roulette +-- ---------------------------- +-- Info: http://ro.gnjoy.com/news/update/View.asp?seq=157&curpage=1 + +INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 0, 1, 675, 1, 1 ); -- Silver_Coin +INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 1, 1, 671, 1, 0 ); -- Gold_Coin +INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 2, 1, 678, 1, 0 ); -- Poison_Bottle +INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 3, 1, 604, 1, 0 ); -- Branch_Of_Dead_Tree +INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 4, 1, 522, 1, 0 ); -- Fruit_Of_Mastela +INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 5, 1, 671, 1, 0 ); -- Old_Ore_Box +INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 6, 1, 12523, 1, 0 ); -- E_Inc_Agi_10_Scroll +INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 7, 1, 985, 1, 0 ); -- Elunium +INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 8, 1, 984, 1, 0 ); -- Oridecon + +INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 9, 2, 675, 1, 1 ); -- Silver_Coin +INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 10, 2, 671, 1, 0 ); -- Gold_Coin +INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 11, 2, 603, 1, 0 ); -- Old_Blue_Box +INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 12, 2, 608, 1, 0 ); -- Seed_Of_Yggdrasil +INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 13, 2, 607, 1, 0 ); -- Yggdrasilberry +INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 14, 2, 12522, 1, 0 ); -- E_Blessing_10_Scroll +INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 15, 2, 6223, 1, 0 ); -- Carnium +INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 16, 2, 6224, 1, 0 ); -- Bradium + +INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 17, 3, 675, 1, 1 ); -- Silver_Coin +INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 18, 3, 671, 1, 0 ); -- Gold_Coin +INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 19, 3, 12108, 1, 0 ); -- Bundle_Of_Magic_Scroll +INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 20, 3, 617, 1, 0 ); -- Old_Violet_Box +INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 21, 3, 12514, 1, 0 ); -- E_Abrasive +INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 22, 3, 7444, 1, 0 ); -- Treasure_Box +INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 23, 3, 969, 1, 0 ); -- Gold + +INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 24, 4, 675, 1, 1 ); -- Silver_Coin +INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 25, 4, 671, 1, 0 ); -- Gold_Coin +INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 26, 4, 616, 1, 0 ); -- Old_Card_Album +INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 27, 4, 12516, 1, 0 ); -- E_Small_Life_Potion +INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 28, 4, 22777, 1, 0 ); -- Gift_Buff_Set +INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 29, 4, 6231, 1, 0 ); -- Guarantee_Weapon_6Up + +INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 30, 5, 671, 1, 1 ); -- Gold_Coin +INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 31, 5, 12246, 1, 0 ); -- Magic_Card_Album +INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 32, 5, 12263, 1, 0 ); -- Comp_Battle_Manual +INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 33, 5, 671, 1, 0 ); -- Potion_Box +INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 34, 5, 6235, 1, 0 ); -- Guarantee_Armor_6Up + +INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 35, 6, 671, 1, 1 ); -- Gold_Coin +INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 36, 6, 12766, 1, 0 ); -- Reward_Job_BM25 +INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 37, 6, 6234, 1, 0 ); -- Guarantee_Armor_7Up +INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 38, 6, 6233, 1, 0 ); -- Guarantee_Armor_8Up + +INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 39, 7, 671, 1, 1 ); -- Gold_Coin +INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 40, 7, 6233, 1, 0 ); -- Guarantee_Armor_8Up +INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 41, 7, 6233, 1, 0 ); -- Guarantee_Armor_8Up // KRO lists this twice + -- -- Table structure for table `skill` -- diff --git a/sql-files/upgrades/upgrade_20150619.sql b/sql-files/upgrades/upgrade_20150619.sql new file mode 100644 index 0000000000..d0026169fb --- /dev/null +++ b/sql-files/upgrades/upgrade_20150619.sql @@ -0,0 +1,67 @@ +ALTER TABLE `char` ADD COLUMN `sex` ENUM('M','F','U') NOT NULL default 'U'; + +-- +-- Table structure for `db_roulette` +-- +CREATE TABLE `db_roulette` ( + `index` int(11) NOT NULL default '0', + `level` smallint(5) unsigned NOT NULL, + `item_id` smallint(5) unsigned NOT NULL, + `amount` smallint(5) unsigned NOT NULL DEFAULT '1', + `flag` smallint(5) unsigned NOT NULL DEFAULT '1', + PRIMARY KEY (`index`) +) ENGINE=MyISAM; + +-- ---------------------------- +-- Records of db_roulette +-- ---------------------------- +-- Info: http://ro.gnjoy.com/news/update/View.asp?seq=157&curpage=1 + +INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 0, 1, 675, 1, 1 ); -- Silver_Coin +INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 1, 1, 671, 1, 0 ); -- Gold_Coin +INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 2, 1, 678, 1, 0 ); -- Poison_Bottle +INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 3, 1, 604, 1, 0 ); -- Branch_Of_Dead_Tree +INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 4, 1, 522, 1, 0 ); -- Fruit_Of_Mastela +INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 5, 1, 671, 1, 0 ); -- Old_Ore_Box +INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 6, 1, 12523, 1, 0 ); -- E_Inc_Agi_10_Scroll +INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 7, 1, 985, 1, 0 ); -- Elunium +INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 8, 1, 984, 1, 0 ); -- Oridecon + +INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 9, 2, 675, 1, 1 ); -- Silver_Coin +INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 10, 2, 671, 1, 0 ); -- Gold_Coin +INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 11, 2, 603, 1, 0 ); -- Old_Blue_Box +INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 12, 2, 608, 1, 0 ); -- Seed_Of_Yggdrasil +INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 13, 2, 607, 1, 0 ); -- Yggdrasilberry +INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 14, 2, 12522, 1, 0 ); -- E_Blessing_10_Scroll +INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 15, 2, 6223, 1, 0 ); -- Carnium +INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 16, 2, 6224, 1, 0 ); -- Bradium + +INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 17, 3, 675, 1, 1 ); -- Silver_Coin +INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 18, 3, 671, 1, 0 ); -- Gold_Coin +INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 19, 3, 12108, 1, 0 ); -- Bundle_Of_Magic_Scroll +INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 20, 3, 617, 1, 0 ); -- Old_Violet_Box +INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 21, 3, 12514, 1, 0 ); -- E_Abrasive +INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 22, 3, 7444, 1, 0 ); -- Treasure_Box +INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 23, 3, 969, 1, 0 ); -- Gold + +INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 24, 4, 675, 1, 1 ); -- Silver_Coin +INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 25, 4, 671, 1, 0 ); -- Gold_Coin +INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 26, 4, 616, 1, 0 ); -- Old_Card_Album +INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 27, 4, 12516, 1, 0 ); -- E_Small_Life_Potion +INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 28, 4, 22777, 1, 0 ); -- Gift_Buff_Set +INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 29, 4, 6231, 1, 0 ); -- Guarantee_Weapon_6Up + +INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 30, 5, 671, 1, 1 ); -- Gold_Coin +INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 31, 5, 12246, 1, 0 ); -- Magic_Card_Album +INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 32, 5, 12263, 1, 0 ); -- Comp_Battle_Manual +INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 33, 5, 671, 1, 0 ); -- Potion_Box +INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 34, 5, 6235, 1, 0 ); -- Guarantee_Armor_6Up + +INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 35, 6, 671, 1, 1 ); -- Gold_Coin +INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 36, 6, 12766, 1, 0 ); -- Reward_Job_BM25 +INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 37, 6, 6234, 1, 0 ); -- Guarantee_Armor_7Up +INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 38, 6, 6233, 1, 0 ); -- Guarantee_Armor_8Up + +INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 39, 7, 671, 1, 1 ); -- Gold_Coin +INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 40, 7, 6233, 1, 0 ); -- Guarantee_Armor_8Up +INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 41, 7, 6233, 1, 0 ); -- Guarantee_Armor_8Up // KRO lists this twice diff --git a/sql-files/upgrades/upgrade_20150619_log.sql b/sql-files/upgrades/upgrade_20150619_log.sql new file mode 100644 index 0000000000..c89434c2af --- /dev/null +++ b/sql-files/upgrades/upgrade_20150619_log.sql @@ -0,0 +1 @@ +ALTER TABLE `picklog` MODIFY `type` enum('M','P','L','T','V','S','N','C','A','R','G','E','B','O','I','X','D','U','$','F','Y') NOT NULL default 'P'; diff --git a/src/char/char.c b/src/char/char.c index 5ab55d6b0e..c7cec5ff40 100644 --- a/src/char/char.c +++ b/src/char/char.c @@ -837,6 +837,54 @@ int char_inventory_to_sql(const struct item items[], int max, int id) { return errors; } +/** + * Returns the correct gender ID for the given character and enum value. + * + * If the per-character sex is defined but not supported by the current packetver, the database entries are corrected. + * + * @param sd Character data, if available. + * @param p Character status. + * @param sex Character sex (database enum) + * + * @retval SEX_MALE if the per-character sex is male + * @retval SEX_FEMALE if the per-character sex is female + * @retval 99 if the per-character sex is not defined or the current PACKETVER doesn't support it. + */ +int char_mmo_gender(const struct char_session_data *sd, const struct mmo_charstatus *p, char sex) +{ +#if PACKETVER >= 20141016 + (void)sd; (void)p; // Unused + switch (sex) { + case 'M': + return SEX_MALE; + case 'F': + return SEX_FEMALE; + case 'U': + default: + return 99; + } +#else + if (sex == 'M' || sex == 'F') { + if (!sd) { + // sd is not available, there isn't much we can do. Just return and print a warning. + ShowWarning("Character '%s' (CID: %d, AID: %d) has sex '%c', but PACKETVER does not support per-character sex. Defaulting to 'U'.\n", + p->name, p->char_id, p->account_id, sex); + return 99; + } + if ((sex == 'M' && sd->sex == SEX_FEMALE) + || (sex == 'F' && sd->sex == SEX_MALE)) { + ShowWarning("Changing sex of character '%s' (CID: %d, AID: %d) to 'U' due to incompatible PACKETVER.\n", p->name, p->char_id, p->account_id); + chlogif_parse_ackchangecharsex(p->char_id, sd->sex); + } else { + ShowInfo("Resetting sex of character '%s' (CID: %d, AID: %d) to 'U' due to incompatible PACKETVER.\n", p->name, p->char_id, p->account_id); + } + if (SQL_ERROR == Sql_Query(sql_handle, "UPDATE `%s` SET `sex` = 'U' WHERE `char_id` = '%d'", schema_config.char_db, p->char_id)) { + Sql_ShowDebug(sql_handle); + } + } + return 99; +#endif +} int char_mmo_char_tobuf(uint8* buf, struct mmo_charstatus* p); @@ -847,16 +895,16 @@ int char_mmo_chars_fromsql(struct char_session_data* sd, uint8* buf) { struct mmo_charstatus p; int j = 0, i; char last_map[MAP_NAME_LENGTH_EXT]; + char sex[2]; stmt = SqlStmt_Malloc(sql_handle); - if( stmt == NULL ) - { + if( stmt == NULL ) { SqlStmt_ShowDebug(stmt); return 0; } memset(&p, 0, sizeof(p)); - for( i = 0; i < MAX_CHARS; i++ ){ + for( i = 0; i < MAX_CHARS; i++ ) { sd->found_char[i] = -1; sd->unban_time[i] = 0; } @@ -867,7 +915,7 @@ int char_mmo_chars_fromsql(struct char_session_data* sd, uint8* buf) { "`str`,`agi`,`vit`,`int`,`dex`,`luk`,`max_hp`,`hp`,`max_sp`,`sp`," "`status_point`,`skill_point`,`option`,`karma`,`manner`,`hair`,`hair_color`," "`clothes_color`,`weapon`,`shield`,`head_top`,`head_mid`,`head_bottom`,`last_map`,`rename`,`delete_date`," - "`robe`,`moves`,`unban_time`,`font`,`uniqueitem_counter`" + "`robe`,`moves`,`unban_time`,`font`,`uniqueitem_counter`,`sex`" " FROM `%s` WHERE `account_id`='%d' AND `char_num` < '%d'", schema_config.char_db, sd->account_id, MAX_CHARS) || SQL_ERROR == SqlStmt_Execute(stmt) || SQL_ERROR == SqlStmt_BindColumn(stmt, 0, SQLDT_INT, &p.char_id, 0, NULL, NULL) @@ -910,6 +958,7 @@ int char_mmo_chars_fromsql(struct char_session_data* sd, uint8* buf) { || SQL_ERROR == SqlStmt_BindColumn(stmt, 37, SQLDT_LONG, &p.unban_time, 0, NULL, NULL) || SQL_ERROR == SqlStmt_BindColumn(stmt, 38, SQLDT_UCHAR, &p.font, 0, NULL, NULL) || SQL_ERROR == SqlStmt_BindColumn(stmt, 39, SQLDT_UINT, &p.uniqueitem_counter, 0, NULL, NULL) + || SQL_ERROR == SqlStmt_BindColumn(stmt, 40, SQLDT_ENUM, &sex, sizeof(sex), NULL, NULL) ) { SqlStmt_ShowDebug(stmt); @@ -922,6 +971,7 @@ int char_mmo_chars_fromsql(struct char_session_data* sd, uint8* buf) { p.last_point.map = mapindex_name2id(last_map); sd->found_char[p.slot] = p.char_id; sd->unban_time[p.slot] = p.unban_time; + p.sex = char_mmo_gender(sd, &p, sex[0]); j += char_mmo_char_tobuf(WBUFP(buf, j), &p); // Addon System @@ -954,6 +1004,7 @@ int char_mmo_char_fromsql(uint32 char_id, struct mmo_charstatus* p, bool load_ev int hotkey_num; #endif StringBuf msg_buf; + char sex[2]; memset(p, 0, sizeof(struct mmo_charstatus)); @@ -973,7 +1024,7 @@ int char_mmo_char_fromsql(uint32 char_id, struct mmo_charstatus* p, bool load_ev "`status_point`,`skill_point`,`option`,`karma`,`manner`,`party_id`,`guild_id`,`pet_id`,`homun_id`,`elemental_id`,`hair`," "`hair_color`,`clothes_color`,`weapon`,`shield`,`head_top`,`head_mid`,`head_bottom`,`last_map`,`last_x`,`last_y`," "`save_map`,`save_x`,`save_y`,`partner_id`,`father`,`mother`,`child`,`fame`,`rename`,`delete_date`,`robe`, `moves`," - "`unban_time`,`font`,`uniqueitem_counter`" + "`unban_time`,`font`,`uniqueitem_counter`,`sex`" " FROM `%s` WHERE `char_id`=? LIMIT 1", schema_config.char_db) || SQL_ERROR == SqlStmt_BindParam(stmt, 0, SQLDT_INT, &char_id, 0) || SQL_ERROR == SqlStmt_Execute(stmt) @@ -1033,6 +1084,7 @@ int char_mmo_char_fromsql(uint32 char_id, struct mmo_charstatus* p, bool load_ev || SQL_ERROR == SqlStmt_BindColumn(stmt, 53, SQLDT_LONG, &p->unban_time, 0, NULL, NULL) || SQL_ERROR == SqlStmt_BindColumn(stmt, 54, SQLDT_UCHAR, &p->font, 0, NULL, NULL) || SQL_ERROR == SqlStmt_BindColumn(stmt, 55, SQLDT_UINT, &p->uniqueitem_counter, 0, NULL, NULL) + || SQL_ERROR == SqlStmt_BindColumn(stmt, 56, SQLDT_ENUM, &sex, sizeof(sex), NULL, NULL) ) { SqlStmt_ShowDebug(stmt); @@ -1045,6 +1097,7 @@ int char_mmo_char_fromsql(uint32 char_id, struct mmo_charstatus* p, bool load_ev SqlStmt_Free(stmt); return 0; } + p->sex = char_mmo_gender(NULL, p, sex[0]); p->last_point.map = mapindex_name2id(last_map); p->save_point.map = mapindex_name2id(save_map); @@ -1671,7 +1724,13 @@ int char_mmo_char_tobuf(uint8* buffer, struct mmo_charstatus* p) WBUFW(buf,48) = min(p->max_sp, INT16_MAX); WBUFW(buf,50) = DEFAULT_WALK_SPEED; // p->speed; WBUFW(buf,52) = p->class_; +#if PACKETVER >= 20141022 + WBUFL(buf,54) = p->hair; + offset+=2; + buf = WBUFP(buffer,offset); +#else WBUFW(buf,54) = p->hair; +#endif //When the weapon is sent and your option is riding, the client crashes on login!? WBUFW(buf,56) = p->option&(0x20|0x80000|0x100000|0x200000|0x400000|0x800000|0x1000000|0x2000000|0x4000000|0x8000000) ? 0 : p->weapon; @@ -1725,6 +1784,10 @@ int char_mmo_char_tobuf(uint8* buffer, struct mmo_charstatus* p) WBUFL(buf,136) = ( p->rename > 0 ) ? 1 : 0; // (0 = disabled, otherwise displays "Add-Ons" sidebar) offset += 4; #endif + #if PACKETVER >= 20141016 + WBUFB(buf,140) = p->sex;// sex - (0 = female, 1 = male, 99 = logindefined) + offset += 1; + #endif #endif return 106+offset; @@ -2154,6 +2217,9 @@ bool char_checkdb(void){ "`shield`,`head_top`,`head_mid`,`head_bottom`,`robe`,`last_map`,`last_x`,`last_y`,`save_map`," "`save_x`,`save_y`,`partner_id`,`online`,`father`,`mother`,`child`,`fame`,`rename`,`delete_date`," "`moves`,`unban_time`,`font`" +#if PACKETVER >= 20141016 + ",`sex`" +#endif " FROM `%s` LIMIT 1;", schema_config.char_db) ){ Sql_ShowDebug(sql_handle); return false; @@ -2916,7 +2982,7 @@ int do_init(int argc, char **argv) add_timer_func_list(char_online_data_cleanup, "online_data_cleanup"); add_timer_interval(gettick() + 1000, char_online_data_cleanup, 0, 0, 600 * 1000); - //chek db tables + //check db tables if(charserv_config.char_check_db && char_checkdb() == 0){ ShowFatalError("char : A tables is missing in sql-server, please fix it, see (sql-files main.sql for structure) \n"); exit(EXIT_FAILURE); diff --git a/src/char/char.h b/src/char/char.h index 7b00157b2b..3cb7cc441f 100644 --- a/src/char/char.h +++ b/src/char/char.h @@ -222,7 +222,7 @@ extern struct fame_list chemist_fame_list[MAX_FAME_LIST]; extern struct fame_list taekwon_fame_list[MAX_FAME_LIST]; #define DEFAULT_AUTOSAVE_INTERVAL 300*1000 -#define MAX_CHAR_BUF 144 //Max size (for WFIFOHEAD calls) +#define MAX_CHAR_BUF 150 //Max size (for WFIFOHEAD calls) int char_search_mapserver(unsigned short map, uint32 ip, uint16 port); int char_lan_subnetcheck(uint32 ip); @@ -236,6 +236,7 @@ void char_set_all_offline(int id); void char_disconnect_player(uint32 account_id); int char_chardb_waiting_disconnect(int tid, unsigned int tick, int id, intptr_t data); +int char_mmo_gender(const struct char_session_data *sd, const struct mmo_charstatus *p, char sex); int char_mmo_char_tobuf(uint8* buffer, struct mmo_charstatus* p); int char_mmo_char_tosql(uint32 char_id, struct mmo_charstatus* p); int char_mmo_char_fromsql(uint32 char_id, struct mmo_charstatus* p, bool load_everything); diff --git a/src/char/char_clif.c b/src/char/char_clif.c index 4d09da2de7..cd63dda63a 100644 --- a/src/char/char_clif.c +++ b/src/char/char_clif.c @@ -711,7 +711,8 @@ int chclif_parse_charselect(int fd, struct char_session_data* sd,uint32 ipl){ //Have to switch over to the DB instance otherwise data won't propagate [Kevin] cd = (struct mmo_charstatus *)idb_get(char_db_, char_id); - cd->sex = sd->sex; + if (cd->sex == 99) + cd->sex = sd->sex; if (charserv_config.log_char) { char esc_name[NAME_LENGTH*2+1]; diff --git a/src/char/char_logif.c b/src/char/char_logif.c index ddb6b7e7f3..bb51e4f0c6 100644 --- a/src/char/char_logif.c +++ b/src/char/char_logif.c @@ -390,76 +390,79 @@ int chlogif_parse_keepalive(int fd, struct char_session_data* sd){ return 1; } -int chlogif_parse_ackchangesex(int fd, struct char_session_data* sd){ +/** + * Performs the necessary operations when changing a character's sex, such as + * correcting the job class and unequipping items, and propagating the + * information to the guild data. + * + * @param sex The new sex (SEX_MALE or SEX_FEMALE). + * @param acc The character's account ID. + * @param char_id The character ID. + * @param class_ The character's current job class. + * @param guild_id The character's guild ID. + */ +void chlogif_parse_change_sex_sub(int sex, int acc, int char_id, int class_, int guild_id) +{ + // job modification + if (class_ == JOB_BARD || class_ == JOB_DANCER) + class_ = (sex == SEX_MALE ? JOB_BARD : JOB_DANCER); + else if (class_ == JOB_CLOWN || class_ == JOB_GYPSY) + class_ = (sex == SEX_MALE ? JOB_CLOWN : JOB_GYPSY); + else if (class_ == JOB_BABY_BARD || class_ == JOB_BABY_DANCER) + class_ = (sex == SEX_MALE ? JOB_BABY_BARD : JOB_BABY_DANCER); + else if (class_ == JOB_MINSTREL || class_ == JOB_WANDERER) + class_ = (sex == SEX_MALE ? JOB_MINSTREL : JOB_WANDERER); + else if (class_ == JOB_MINSTREL_T || class_ == JOB_WANDERER_T) + class_ = (sex == SEX_MALE ? JOB_MINSTREL_T : JOB_WANDERER_T); + else if (class_ == JOB_BABY_MINSTREL || class_ == JOB_BABY_WANDERER) + class_ = (sex == SEX_MALE ? JOB_BABY_MINSTREL : JOB_BABY_WANDERER); + else if (class_ == JOB_KAGEROU || class_ == JOB_OBORO) + class_ = (sex == SEX_MALE ? JOB_KAGEROU : JOB_OBORO); + + if (SQL_ERROR == Sql_Query(sql_handle, "UPDATE `%s` SET `equip` = '0' WHERE `char_id` = '%d'", schema_config.inventory_db, char_id)) + Sql_ShowDebug(sql_handle); + + if (SQL_ERROR == Sql_Query(sql_handle, "UPDATE `%s` SET `class` = '%d', `weapon` = '0', `shield` = '0', `head_top` = '0', `head_mid` = '0', `head_bottom` = '0' WHERE `char_id` = '%d'", schema_config.char_db, class_, char_id)) + Sql_ShowDebug(sql_handle); + if (guild_id) // If there is a guild, update the guild_member data [Skotlex] + inter_guild_sex_changed(guild_id, acc, char_id, sex); +} + +int chlogif_parse_ackchangesex(int fd, struct char_session_data* sd) +{ if (RFIFOREST(fd) < 7) return 0; { unsigned char buf[7]; - int acc = RFIFOL(fd,2); int sex = RFIFOB(fd,6); RFIFOSKIP(fd,7); - if( acc > 0 ) - {// TODO: Is this even possible? - uint32 char_id[MAX_CHARS]; - int class_[MAX_CHARS]; - int guild_id[MAX_CHARS]; - unsigned char num, i; - char* data; - DBMap* auth_db = char_get_authdb(); - + if (acc > 0) { // TODO: Is this even possible? + unsigned char i; + int char_id = 0, class_ = 0, guild_id = 0; + DBMap* auth_db = char_get_authdb(); struct auth_node* node = (struct auth_node*)idb_get(auth_db, acc); - if( node != NULL ) + SqlStmt *stmt; + + if (node != NULL) node->sex = sex; // get characters - if( SQL_ERROR == Sql_Query(sql_handle, "SELECT `char_id`,`class`,`guild_id` FROM `%s` WHERE `account_id` = '%d'", schema_config.char_db, acc) ) - Sql_ShowDebug(sql_handle); - for( i = 0; i < MAX_CHARS && SQL_SUCCESS == Sql_NextRow(sql_handle); ++i ) - { - Sql_GetData(sql_handle, 0, &data, NULL); char_id[i] = atoi(data); - Sql_GetData(sql_handle, 1, &data, NULL); class_[i] = atoi(data); - Sql_GetData(sql_handle, 2, &data, NULL); guild_id[i] = atoi(data); + stmt = SqlStmt_Malloc(sql_handle); + if (SQL_ERROR == SqlStmt_Prepare(stmt, "SELECT `char_id`, `class`, `guild_id` FROM `%s` WHERE `account_id` = '%d'", schema_config.char_db, acc) || SqlStmt_Execute(stmt)) { + SqlStmt_ShowDebug(stmt); + SqlStmt_Free(stmt); } - num = i; - for( i = 0; i < num; ++i ) - { - if( class_[i] == JOB_BARD || class_[i] == JOB_DANCER || - class_[i] == JOB_CLOWN || class_[i] == JOB_GYPSY || - class_[i] == JOB_BABY_BARD || class_[i] == JOB_BABY_DANCER || - class_[i] == JOB_MINSTREL || class_[i] == JOB_WANDERER || - class_[i] == JOB_MINSTREL_T || class_[i] == JOB_WANDERER_T || - class_[i] == JOB_BABY_MINSTREL || class_[i] == JOB_BABY_WANDERER || - class_[i] == JOB_KAGEROU || class_[i] == JOB_OBORO ) - { - // job modification - if( class_[i] == JOB_BARD || class_[i] == JOB_DANCER ) - class_[i] = (sex ? JOB_BARD : JOB_DANCER); - else if( class_[i] == JOB_CLOWN || class_[i] == JOB_GYPSY ) - class_[i] = (sex ? JOB_CLOWN : JOB_GYPSY); - else if( class_[i] == JOB_BABY_BARD || class_[i] == JOB_BABY_DANCER ) - class_[i] = (sex ? JOB_BABY_BARD : JOB_BABY_DANCER); - else if( class_[i] == JOB_MINSTREL || class_[i] == JOB_WANDERER ) - class_[i] = (sex ? JOB_MINSTREL : JOB_WANDERER); - else if( class_[i] == JOB_MINSTREL_T || class_[i] == JOB_WANDERER_T ) - class_[i] = (sex ? JOB_MINSTREL_T : JOB_WANDERER_T); - else if( class_[i] == JOB_BABY_MINSTREL || class_[i] == JOB_BABY_WANDERER ) - class_[i] = (sex ? JOB_BABY_MINSTREL : JOB_BABY_WANDERER); - else if( class_[i] == JOB_KAGEROU || class_[i] == JOB_OBORO ) - class_[i] = (sex ? JOB_KAGEROU : JOB_OBORO); - } - if( SQL_ERROR == Sql_Query(sql_handle, "UPDATE `%s` SET `class`='%d', `weapon`='0', `shield`='0', `head_top`='0', `head_mid`='0', `head_bottom`='0' WHERE `char_id`='%d'", schema_config.char_db, class_[i], char_id[i]) ) - Sql_ShowDebug(sql_handle); + SqlStmt_BindColumn(stmt, 0, SQLDT_INT, &char_id, 0, NULL, NULL); + SqlStmt_BindColumn(stmt, 1, SQLDT_SHORT, &class_, 0, NULL, NULL); + SqlStmt_BindColumn(stmt, 2, SQLDT_INT, &guild_id, 0, NULL, NULL); - if( guild_id[i] )// If there is a guild, update the guild_member data [Skotlex] - inter_guild_sex_changed(guild_id[i], acc, char_id[i], sex); + for (i = 0; i < MAX_CHARS && SQL_SUCCESS == SqlStmt_NextRow(stmt); ++i) { + chlogif_parse_change_sex_sub(sex, acc, char_id, class_, guild_id); } - Sql_FreeResult(sql_handle); - - // disconnect player if online on char-server - char_disconnect_player(acc); + SqlStmt_Free(stmt); } // notify all mapservers about this change @@ -471,6 +474,54 @@ int chlogif_parse_ackchangesex(int fd, struct char_session_data* sd){ return 1; } +/** + * Changes a character's sex. + * The information is updated on database, and the character is kicked if it + * currently is online. + * + * @param char_id The character's ID. + * @param sex The new sex. + * @retval 0 in case of success. + * @retval 1 in case of failure. + */ +int chlogif_parse_ackchangecharsex(int char_id, int sex) +{ + int class_ = 0, guild_id = 0, account_id = 0; + unsigned char buf[7]; + char *data; + + // get character data + if (SQL_ERROR == Sql_Query(sql_handle, "SELECT `account_id`,`class`,`guild_id` FROM `%s` WHERE `char_id` = '%d'", schema_config.char_db, char_id)) { + Sql_ShowDebug(sql_handle); + return 1; + } + if (Sql_NumRows(sql_handle) != 1 || SQL_ERROR == Sql_NextRow(sql_handle)) { + Sql_FreeResult(sql_handle); + return 1; + } + + Sql_GetData(sql_handle, 0, &data, NULL); account_id = atoi(data); + Sql_GetData(sql_handle, 1, &data, NULL); class_ = atoi(data); + Sql_GetData(sql_handle, 2, &data, NULL); guild_id = atoi(data); + Sql_FreeResult(sql_handle); + + if (SQL_ERROR == Sql_Query(sql_handle, "UPDATE `%s` SET `sex` = '%c' WHERE `char_id` = '%d'", schema_config.char_db, sex == SEX_MALE ? 'M' : 'F', char_id)) { + Sql_ShowDebug(sql_handle); + return 1; + } + chlogif_parse_change_sex_sub(sex, account_id, char_id, class_, guild_id); + + // disconnect player if online on char-server + char_disconnect_player(account_id); + + // notify all mapservers about this change + WBUFW(buf,0) = 0x2b0d; + WBUFL(buf,2) = account_id; + WBUFB(buf,6) = sex; + chmapif_sendall(buf, 7); + return 0; +} + int chlogif_parse_ackacc2req(int fd, struct char_session_data* sd){ if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2)) return 0; diff --git a/src/char/char_logif.h b/src/char/char_logif.h index 2f15072795..aa8072c4ac 100644 --- a/src/char/char_logif.h +++ b/src/char/char_logif.h @@ -32,7 +32,9 @@ int chlogif_parse_ackconnect(int fd, struct char_session_data* sd); int chlogif_parse_ackaccreq(int fd, struct char_session_data* sd); int chlogif_parse_reqaccdata(int fd, struct char_session_data* sd); int chlogif_parse_keepalive(int fd, struct char_session_data* sd); +void chlogif_parse_change_sex_sub(int sex, int acc, int char_id, int class_, int guild_id); int chlogif_parse_ackchangesex(int fd, struct char_session_data* sd); +int chlogif_parse_ackchangecharsex(int char_id, int sex); int chlogif_parse_ackacc2req(int fd, struct char_session_data* sd); int chlogif_parse_accbannotification(int fd, struct char_session_data* sd); int chlogif_parse_askkick(int fd, struct char_session_data* sd); diff --git a/src/char/char_mapif.c b/src/char/char_mapif.c index 5757b80f61..a1c7804c3c 100644 --- a/src/char/char_mapif.c +++ b/src/char/char_mapif.c @@ -717,7 +717,7 @@ int chmapif_parse_reqnewemail(int fd){ /** * Forward a change of status for account to login-serv - * @param fd: wich fd to parse from + * @param fd: which fd to parse from * @return : 0 not enough data received, 1 success */ int chmapif_parse_fwlog_changestatus(int fd){ @@ -730,14 +730,19 @@ int chmapif_parse_fwlog_changestatus(int fd){ int aid = RFIFOL(fd,2); // account_id of who ask (-1 if server itself made this request) const char* name = (char*)RFIFOP(fd,6); // name of the target character - int operation = RFIFOW(fd,30); // type of operation: 1-block, 2-ban, 3-unblock, 4-unban, 5-changesex, 6-vip - int32 timediff = RFIFOL(fd,32); - int val1 = RFIFOL(fd,36); - //int val2 = RFIFOL(fd,40); // Since BankVault is moved out, this value is unused for now + int operation = RFIFOW(fd,30); // type of operation: 1-block, 2-ban, 3-unblock, 4-unban, 5-changesex, 6-vip, 7-changecharsex + int32 timediff = 0; + int val1 = 0, sex = SEX_MALE; + + if (operation == 2) { + timediff = RFIFOL(fd, 32); + val1 = RFIFOL(fd, 36); + } else if (operation == 7) + sex = RFIFOB(fd, 32); RFIFOSKIP(fd,44); Sql_EscapeStringLen(sql_handle, esc_name, name, strnlen(name, NAME_LENGTH)); - if( SQL_ERROR == Sql_Query(sql_handle, "SELECT `account_id` FROM `%s` WHERE `name` = '%s'", schema_config.char_db, esc_name) ) + if( SQL_ERROR == Sql_Query(sql_handle, "SELECT `account_id`, `char_id` FROM `%s` WHERE `name` = '%s'", schema_config.char_db, esc_name) ) Sql_ShowDebug(sql_handle); else if( Sql_NumRows(sql_handle) == 0 ) { result = 1; // 1-player not found @@ -746,10 +751,12 @@ int chmapif_parse_fwlog_changestatus(int fd){ Sql_ShowDebug(sql_handle); result = 1; } else { - int t_aid; //targit account id + int t_aid; // target account id + int t_cid; // target char id char* data; Sql_GetData(sql_handle, 0, &data, NULL); t_aid = atoi(data); + Sql_GetData(sql_handle, 1, &data, NULL); t_cid = atoi(data); Sql_FreeResult(sql_handle); if(!chlogif_isconnected()) @@ -794,16 +801,20 @@ int chmapif_parse_fwlog_changestatus(int fd){ WFIFOL(login_fd,2) = t_aid; WFIFOSET(login_fd,6); break; - case 6: + case 6: // vip answer = (val1&4); // vip_req val1=type, &1 login send return, &2 update timestamp, &4 map send answer chlogif_reqvipdata(t_aid, val1, timediff, fd); break; + case 7: // changecharsex + answer = false; + chlogif_parse_ackchangecharsex(t_cid, sex); + break; } //end switch operation } //login is connected } // send answer if a player asks, not if the server asks - if( aid != -1 && answer) { // Don't send answer for changesex + if( aid != -1 && answer) { // Don't send answer for changesex/changecharsex WFIFOHEAD(fd,34); WFIFOW(fd, 0) = 0x2b0f; WFIFOL(fd, 2) = aid; @@ -817,7 +828,7 @@ int chmapif_parse_fwlog_changestatus(int fd){ } /** - * Transmit the acknolegement of divorce of partner_id1 and partner_id2 + * Transmit the acknowledgement of divorce of partner_id1 and partner_id2 * Update the list associated and transmit the new ranking * @param partner_id1: char id1 divorced * @param partner_id2: char id2 divorced @@ -1022,7 +1033,8 @@ int chmapif_parse_reqauth(int fd, int id){ } if( runflag == CHARSERVER_ST_RUNNING && autotrade && cd ){ uint16 mmo_charstatus_len = sizeof(struct mmo_charstatus) + 25; - cd->sex = sex; + if (cd->sex == 99) + cd->sex = sex; WFIFOHEAD(fd,mmo_charstatus_len); WFIFOW(fd,0) = 0x2afd; @@ -1042,12 +1054,16 @@ int chmapif_parse_reqauth(int fd, int id){ node != NULL && node->account_id == account_id && node->char_id == char_id && - node->login_id1 == login_id1 && - node->sex == sex /*&& - node->ip == ip*/ ) + node->login_id1 == login_id1 + //&& node->ip == ip +#if PACKETVER < 20141016 + && node->sex == sex +#endif + ) {// auth ok uint16 mmo_charstatus_len = sizeof(struct mmo_charstatus) + 25; - cd->sex = sex; + if (cd->sex == 99) + cd->sex = sex; WFIFOHEAD(fd,mmo_charstatus_len); WFIFOW(fd,0) = 0x2afd; diff --git a/src/common/utils.c b/src/common/utils.c index df64cd8984..0df7855f74 100644 --- a/src/common/utils.c +++ b/src/common/utils.c @@ -378,7 +378,11 @@ uint32 date2version(int date) { else if(date < 20130717) return 43; else if(date < 20130807) return 44; else if(date < 20131223) return 45; - else if(date >= 20131223) return 46; + else if(date < 20140212) return 46; + //else if(date < 20140613) return 47; + //else if(date < 20141016) return 48; + else if(date < 20141022) return 50; + else if(date >= 20141022) return 51; else return 30; //default } diff --git a/src/map/atcommand.c b/src/map/atcommand.c index 9f6795f820..9341d07f3d 100644 --- a/src/map/atcommand.c +++ b/src/map/atcommand.c @@ -6770,17 +6770,43 @@ ACMD_FUNC(uptime) /*========================================== * @changesex - * => Changes one's sex. Argument sex can be 0 or 1, m or f, male or female. + * => Changes one's account sex. Argument sex can be 0 or 1, m or f, male or female. *------------------------------------------*/ ACMD_FUNC(changesex) { int i; + nullpo_retr(-1, sd); + pc_resetskill(sd,4); // to avoid any problem with equipment and invalid sex, equipment is unequiped. - for( i=0; iequip_index[i] >= 0 ) pc_unequipitem(sd, sd->equip_index[i], 3); - chrif_changesex(sd); + for (i = 0; i < EQI_MAX; i++) { + if (sd->equip_index[i] >= 0) + pc_unequipitem(sd, sd->equip_index[i], 3); + } + + chrif_changesex(sd, true); + return 0; +} + +/*========================================== + * @changecharsex + * => Changes one's character sex. Argument sex can be 0 or 1, m or f, male or female. + *------------------------------------------*/ +ACMD_FUNC(changecharsex) +{ + int i; + + nullpo_retr(-1, sd); + + pc_resetskill(sd,4); + // to avoid any problem with equipment and invalid sex, equipment is unequiped. + for (i = 0; i < EQI_MAX; i++) { + if (sd->equip_index[i] >= 0) + pc_unequipitem(sd, sd->equip_index[i], 3); + } + + chrif_changesex(sd, false); return 0; } @@ -8370,7 +8396,7 @@ ACMD_FUNC(auction) nullpo_ret(sd); if (!battle_config.feature_auction) { - clif_colormes(sd, color_table[COLOR_RED], msg_txt(sd, 517)); + clif_colormes(sd->fd, color_table[COLOR_RED], msg_txt(sd, 517)); return 0; } @@ -9886,6 +9912,7 @@ void atcommand_basecommands(void) { ACMD_DEF(clearweather), ACMD_DEF(uptime), ACMD_DEF(changesex), + ACMD_DEF(changecharsex), ACMD_DEF(mute), ACMD_DEF(refresh), ACMD_DEF(refreshall), diff --git a/src/map/battle.c b/src/map/battle.c index 1cac4c6f82..082540d086 100644 --- a/src/map/battle.c +++ b/src/map/battle.c @@ -31,10 +31,6 @@ int attr_fix_table[4][ELE_MAX][ELE_MAX]; struct Battle_Config battle_config; static struct eri *delay_damage_ers; //For battle delay damage structures. -#define DAMAGE_RATE(a) { damage = (int64)damage * (a) / 100; } -#define DAMAGE_SUBRATE(a) { damage -= (int64)damage * (a) / 100; } -#define DAMAGE_ADDRATE(a) { damage += (int64)damage * (a) / 100; } - /** * Returns the current/list skill used by the bl * @param bl @@ -363,7 +359,8 @@ int battle_delay_damage(unsigned int tick, int amotion, struct block_list *src, * @param def_type Defense element enum e_element * @param def_lv Element level 1 ~ MAX_ELE_LEVEL */ -int battle_attr_ratio(int atk_elem,int def_type, int def_lv) { +int battle_attr_ratio(int atk_elem, int def_type, int def_lv) +{ if (!CHK_ELEMENT(atk_elem) || !CHK_ELEMENT(def_type) || !CHK_ELEMENT_LEVEL(def_lv)) return 100; @@ -402,16 +399,20 @@ int64 battle_attr_fix(struct block_list *src, struct block_list *target, int64 d if (sc && sc->count) { //increase dmg by src status switch(atk_elem){ case ELE_FIRE: - if (sc->data[SC_VOLCANO]) ratio += sc->data[SC_VOLCANO]->val3; + if (sc->data[SC_VOLCANO]) + ratio += sc->data[SC_VOLCANO]->val3; break; case ELE_WIND: - if (sc->data[SC_VIOLENTGALE]) ratio += sc->data[SC_VIOLENTGALE]->val3; + if (sc->data[SC_VIOLENTGALE]) + ratio += sc->data[SC_VIOLENTGALE]->val3; break; case ELE_WATER: - if (sc->data[SC_DELUGE]) ratio += sc->data[SC_DELUGE]->val3; + if (sc->data[SC_DELUGE]) + ratio += sc->data[SC_DELUGE]->val3; break; case ELE_GHOST: - if (sc->data[SC_TELEKINESIS_INTENSE]) ratio += (sc->data[SC_TELEKINESIS_INTENSE]->val3); + if (sc->data[SC_TELEKINESIS_INTENSE]) + ratio += sc->data[SC_TELEKINESIS_INTENSE]->val3; break; } } @@ -437,46 +438,61 @@ int64 battle_attr_fix(struct block_list *src, struct block_list *target, int64 d } } - if( tsc && tsc->count ) { //increase dmg by target status + if (tsc && tsc->count) { //increase dmg by target status switch(atk_elem) { - case ELE_FIRE: - if( tsc->data[SC_SPIDERWEB]) { - tsc->data[SC_SPIDERWEB]->val1 = 0; // free to move now - if( tsc->data[SC_SPIDERWEB]->val2-- > 0 ) - ratio += 200; // double damage - if( tsc->data[SC_SPIDERWEB]->val2 == 0 ) - status_change_end(target, SC_SPIDERWEB, INVALID_TIMER); - } - if( tsc->data[SC_THORNSTRAP]) - status_change_end(target, SC_THORNSTRAP, INVALID_TIMER); - if( tsc->data[SC_CRYSTALIZE] && target->type != BL_MOB) - status_change_end(target, SC_CRYSTALIZE, INVALID_TIMER); - if( tsc->data[SC_EARTH_INSIGNIA]) ratio += 150; - if( tsc->data[SC_ASH]) ratio += 150; //150% - break; - case ELE_HOLY: - if( tsc->data[SC_ORATIO]) ratio += tsc->data[SC_ORATIO]->val1 * 2; - break; - case ELE_POISON: - if( tsc->data[SC_VENOMIMPRESS]) ratio += tsc->data[SC_VENOMIMPRESS]->val2; - break; - case ELE_WIND: - if( tsc->data[SC_CRYSTALIZE] && target->type != BL_MOB) ratio += 150; - if( tsc->data[SC_WATER_INSIGNIA]) ratio += 150; - break; - case ELE_WATER: - if( tsc->data[SC_FIRE_INSIGNIA]) ratio += 150; - break; - case ELE_EARTH: - if( tsc->data[SC_WIND_INSIGNIA]) ratio += 150; - status_change_end(target, SC_MAGNETICFIELD, INVALID_TIMER); //freed if received earth dmg - break; - case ELE_NEUTRAL: - if( tsc->data[SC_ANTI_M_BLAST] ) ratio += tsc->data[SC_ANTI_M_BLAST]->val2; - break; + case ELE_FIRE: + if (tsc->data[SC_SPIDERWEB]) { + tsc->data[SC_SPIDERWEB]->val1 = 0; // free to move now + if (tsc->data[SC_SPIDERWEB]->val2-- > 0) + ratio += 100; // double damage + if (tsc->data[SC_SPIDERWEB]->val2 == 0) + status_change_end(target, SC_SPIDERWEB, INVALID_TIMER); + } + if (tsc->data[SC_THORNSTRAP]) + status_change_end(target, SC_THORNSTRAP, INVALID_TIMER); + if (tsc->data[SC_CRYSTALIZE] && target->type != BL_MOB) + status_change_end(target, SC_CRYSTALIZE, INVALID_TIMER); + if (tsc->data[SC_EARTH_INSIGNIA]) + ratio += 50; + if (tsc->data[SC_ASH]) + ratio += 50; + break; + case ELE_HOLY: + if (tsc->data[SC_ORATIO]) + ratio += tsc->data[SC_ORATIO]->val1 * 2; + break; + case ELE_POISON: + if (tsc->data[SC_VENOMIMPRESS]) + ratio += tsc->data[SC_VENOMIMPRESS]->val2; + break; + case ELE_WIND: + if (tsc->data[SC_CRYSTALIZE] && target->type != BL_MOB) + ratio += 50; + if (tsc->data[SC_WATER_INSIGNIA]) + ratio += 50; + break; + case ELE_WATER: + if (tsc->data[SC_FIRE_INSIGNIA]) + ratio += 50; + break; + case ELE_EARTH: + if (tsc->data[SC_WIND_INSIGNIA]) + ratio += 50; + status_change_end(target, SC_MAGNETICFIELD, INVALID_TIMER); //freed if received earth dmg + break; + case ELE_NEUTRAL: + if (tsc->data[SC_ANTI_M_BLAST]) + ratio += tsc->data[SC_ANTI_M_BLAST]->val2; + break; } - } //end tsc check - return (int64)damage*ratio/100; + } + + if (ratio < 100) + damage = damage - (damage * (100 - ratio) / 100); + else + damage = damage + (damage * (ratio - 100) / 100); + + return max(damage,0); } /** @@ -817,7 +833,7 @@ int battle_calc_cardfix(int attack_type, struct block_list *src, struct block_li break; } - return (int)(damage - original_damage); + return (int)cap_value(damage - original_damage, INT_MIN, INT_MAX); } /** @@ -956,15 +972,16 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam sd=(struct map_session_data *)bl; //Special no damage states if(flag&BF_WEAPON && sd->special_state.no_weapon_damage) - DAMAGE_SUBRATE(sd->special_state.no_weapon_damage) + damage -= damage * sd->special_state.no_weapon_damage / 100; if(flag&BF_MAGIC && sd->special_state.no_magic_damage) - DAMAGE_SUBRATE(sd->special_state.no_magic_damage) + damage -= damage * sd->special_state.no_magic_damage / 100; if(flag&BF_MISC && sd->special_state.no_misc_damage) - DAMAGE_SUBRATE(sd->special_state.no_misc_damage) + damage -= damage * sd->special_state.no_misc_damage / 100; - if(!damage) return 0; + if(!damage) + return 0; } sc = status_get_sc(bl); //check target status @@ -1067,16 +1084,14 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam } // attack blocked by Parrying - if( (sce=sc->data[SC_PARRYING]) && flag&BF_WEAPON && skill_id != WS_CARTTERMINATION && rnd()%100 < sce->val2 ) { + if( (sce = sc->data[SC_PARRYING]) && flag&BF_WEAPON && skill_id != WS_CARTTERMINATION && rnd()%100 < sce->val2 ) { clif_skill_nodamage(bl, bl, LK_PARRYING, sce->val1,1); return 0; } - if(sc->data[SC_DODGE] && ( !sc->opt1 || sc->opt1 == OPT1_BURNING ) && - (flag&BF_LONG || sc->data[SC_SPURT]) - && rnd()%100 < 20) - { - if (sd && pc_issit(sd)) pc_setstand(sd, true); //Stand it to dodge. + if(sc->data[SC_DODGE] && ( !sc->opt1 || sc->opt1 == OPT1_BURNING ) && (flag&BF_LONG || sc->data[SC_SPURT]) && rnd()%100 < 20) { + if (sd && pc_issit(sd)) + pc_setstand(sd, true); //Stand it to dodge. clif_skill_nodamage(bl,bl,TK_DODGE,1,1); if (!sc->data[SC_COMBO]) sc_start4(src,bl, SC_COMBO, 100, TK_JUMPKICK, src->id, 1, 0, 2000); @@ -1095,7 +1110,7 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam } //Kaupe blocks damage (skill or otherwise) from players, mobs, homuns, mercenaries. - if((sce=sc->data[SC_KAUPE]) && rnd()%100 < sce->val2) { + if ((sce = sc->data[SC_KAUPE]) && rnd()%100 < sce->val2) { clif_specialeffect(bl, 462, AREA); //Shouldn't end until Breaker's non-weapon part connects. #ifndef RENEWAL @@ -1116,11 +1131,9 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam return 0; } - if (((sce=sc->data[SC_UTSUSEMI]) || sc->data[SC_BUNSINJYUTSU]) - && flag&BF_WEAPON && !(skill_get_nk(skill_id)&NK_NO_CARDFIX_ATK)) - { + if (((sce = sc->data[SC_UTSUSEMI]) || sc->data[SC_BUNSINJYUTSU]) && flag&BF_WEAPON && !(skill_get_nk(skill_id)&NK_NO_CARDFIX_ATK)) { skill_additional_effect (src, bl, skill_id, skill_lv, flag, ATK_BLOCK, gettick() ); - if( !status_isdead(src) ) + if (!status_isdead(src)) skill_counter_additional_effect( src, bl, skill_id, skill_lv, flag, gettick() ); if (sce) { clif_specialeffect(bl, 462, AREA); @@ -1129,15 +1142,15 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam //Both need to be consumed if they are active. if (sce && --(sce->val2) <= 0) status_change_end(bl, SC_UTSUSEMI, INVALID_TIMER); - if ((sce=sc->data[SC_BUNSINJYUTSU]) && --(sce->val2) <= 0) + if ((sce = sc->data[SC_BUNSINJYUTSU]) && --(sce->val2) <= 0) status_change_end(bl, SC_BUNSINJYUTSU, INVALID_TIMER); return 0; } //Now damage increasing effects - if( sc->data[SC_AETERNA] && skill_id != PF_SOULBURN ) { - if( src->type != BL_MER || skill_id == 0 ) + if (sc->data[SC_AETERNA] && skill_id != PF_SOULBURN) { + if (src->type != BL_MER || !skill_id) damage <<= 1; // Lex Aeterna only doubles damage of regular attacks from mercenaries #ifndef RENEWAL @@ -1148,7 +1161,7 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam #ifdef RENEWAL if( sc->data[SC_RAID] ) { - DAMAGE_ADDRATE(20) + damage += damage * 20 / 100; if (--sc->data[SC_RAID]->val1 == 0) status_change_end(bl, SC_RAID, INVALID_TIMER); @@ -1167,7 +1180,7 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam case W_2HMACE: case W_1HAXE: case W_2HAXE: - DAMAGE_RATE(150) + damage += damage / 2; break; case W_MUSICAL: case W_WHIP: @@ -1182,7 +1195,7 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam case W_DAGGER: case W_1HSWORD: case W_2HSWORD: - DAMAGE_RATE(50) + damage -= damage / 2; break; } } @@ -1217,17 +1230,15 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam } #endif - if(sc->data[SC_DEFENDER] && - (flag&(BF_LONG|BF_WEAPON)) == (BF_LONG|BF_WEAPON)) - DAMAGE_RATE(100-sc->data[SC_DEFENDER]->val2) + if (sc->data[SC_DEFENDER] && (flag&(BF_LONG|BF_WEAPON)) == (BF_LONG|BF_WEAPON)) + damage -= damage * sc->data[SC_DEFENDER]->val2 / 100; - if(sc->data[SC_ADJUSTMENT] && - (flag&(BF_LONG|BF_WEAPON)) == (BF_LONG|BF_WEAPON)) - DAMAGE_SUBRATE(20) + if(sc->data[SC_ADJUSTMENT] && (flag&(BF_LONG|BF_WEAPON)) == (BF_LONG|BF_WEAPON)) + damage -= damage * 20 / 100; if(sc->data[SC_FOGWALL] && skill_id != RK_DRAGONBREATH && skill_id != RK_DRAGONBREATH_WATER) { if(flag&BF_SKILL) //25% reduction - DAMAGE_SUBRATE(25) + damage -= damage * 25 / 100; else if ((flag&(BF_LONG|BF_WEAPON)) == (BF_LONG|BF_WEAPON)) damage >>= 2; //75% reduction } @@ -1235,16 +1246,16 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam if(sc->data[SC_ARMORCHANGE]) { //On official servers, SC_ARMORCHANGE does not change DEF/MDEF but rather increases/decreases the damage if(flag&BF_WEAPON) - DAMAGE_SUBRATE(sc->data[SC_ARMORCHANGE]->val2) + damage -= damage * sc->data[SC_ARMORCHANGE]->val2 / 100; else if(flag&BF_MAGIC) - DAMAGE_SUBRATE(sc->data[SC_ARMORCHANGE]->val3) + damage -= damage * sc->data[SC_ARMORCHANGE]->val3 / 100; } if(sc->data[SC_SMOKEPOWDER]) { if( (flag&(BF_SHORT|BF_WEAPON)) == (BF_SHORT|BF_WEAPON) ) - DAMAGE_SUBRATE(15) // 15% reduction to physical melee attacks + damage -= damage * 15 / 100; // 15% reduction to physical melee attacks else if( (flag&(BF_LONG|BF_WEAPON)) == (BF_LONG|BF_WEAPON) ) - DAMAGE_SUBRATE(50) // 50% reduction to physical ranged attacks + damage -= damage * 50 / 100; // 50% reduction to physical ranged attacks } if (sc->data[SC_WATER_BARRIER]) @@ -1253,23 +1264,28 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam // Compressed code, fixed by map.h [Epoque] if (src->type == BL_MOB) { int i; - if (sc->data[SC_MANU_DEF]) - for (i=0;ARRAYLENGTH(mob_manuk)>i;i++) + + if (sc->data[SC_MANU_DEF]) { + for (i=0;ARRAYLENGTH(mob_manuk)>i;i++) { if (mob_manuk[i]==((TBL_MOB*)src)->mob_id) { - DAMAGE_SUBRATE(sc->data[SC_MANU_DEF]->val1) + damage -= damage * sc->data[SC_MANU_DEF]->val1 / 100; break; } - if (sc->data[SC_SPL_DEF]) - for (i=0;ARRAYLENGTH(mob_splendide)>i;i++) + } + } + if (sc->data[SC_SPL_DEF]) { + for (i=0;ARRAYLENGTH(mob_splendide)>i;i++) { if (mob_splendide[i]==((TBL_MOB*)src)->mob_id) { - DAMAGE_SUBRATE(sc->data[SC_SPL_DEF]->val1) + damage -= damage * sc->data[SC_SPL_DEF]->val1 / 100; break; } + } + } } if((sce=sc->data[SC_ARMOR]) && //NPC_DEFENDER sce->val3&flag && sce->val4&flag) - DAMAGE_SUBRATE(sc->data[SC_ARMOR]->val2) + damage -= damage * sc->data[SC_ARMOR]->val2 / 100; if( sc->data[SC_ENERGYCOAT] && (skill_id == GN_HELLS_PLANT_ATK || #ifdef RENEWAL @@ -1285,24 +1301,23 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam //SP Cost: 1% + 0.5% per every 20% SP if (!status_charge(bl, 0, (10+5*per)*status->max_sp/1000)) status_change_end(bl, SC_ENERGYCOAT, INVALID_TIMER); - //Reduction: 6% + 6% every 20% - DAMAGE_SUBRATE(6 * (1+per)) + damage -= damage * 6 * (1 + per) / 100; //Reduction: 6% + 6% every 20% } if(sc->data[SC_GRANITIC_ARMOR]) - DAMAGE_SUBRATE(sc->data[SC_GRANITIC_ARMOR]->val2) + damage -= damage * sc->data[SC_GRANITIC_ARMOR]->val2 / 100; if(sc->data[SC_PAIN_KILLER]) damage -= sc->data[SC_PAIN_KILLER]->val3; if( sc->data[SC_DARKCROW] && (flag&(BF_SHORT|BF_MAGIC)) == BF_SHORT ) - DAMAGE_ADDRATE(sc->data[SC_DARKCROW]->val2); + damage += damage * sc->data[SC_DARKCROW]->val2 / 100; if( (sce=sc->data[SC_MAGMA_FLOW]) && (rnd()%100 <= sce->val2) ) skill_castend_damage_id(bl,src,MH_MAGMA_FLOW,sce->val1,gettick(),0); - if( damage > 0 && ((flag&(BF_WEAPON|BF_SHORT))==(BF_WEAPON|BF_SHORT)) && (sce = sc->data[SC_STONEHARDSKIN]) ) { - sce->val2 -= (int)cap_value(damage,INT_MIN,INT_MAX);; + if( damage > 0 && ((flag&(BF_WEAPON|BF_SHORT)) == (BF_WEAPON|BF_SHORT)) && (sce = sc->data[SC_STONEHARDSKIN]) ) { + sce->val2 -= (int)cap_value(damage,INT_MIN,INT_MAX); if( src->type == BL_MOB ) //using explicit call instead break_equip for duration sc_start(src,src, SC_STRIPWEAPON, 30, 0, skill_get_time2(RK_STONEHARDSKIN, sce->val1)); else @@ -1326,7 +1341,7 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam //Finally Kyrie because it may, or not, reduce damage to 0. if((sce = sc->data[SC_KYRIE]) && damage > 0){ - sce->val2 -= (int)cap_value(damage,INT_MIN,INT_MAX);; + sce->val2 -= (int)cap_value(damage,INT_MIN,INT_MAX); if(flag&BF_WEAPON || skill_id == TF_THROWSTONE){ if(sce->val2>=0) damage=0; @@ -1387,7 +1402,7 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam if (sc && sc->count) { if( sc->data[SC_INVINCIBLE] && !sc->data[SC_INVINCIBLEOFF] ) - DAMAGE_ADDRATE(75) + damage += damage * 75 / 100; if ((sce = sc->data[SC_BLOODLUST]) && flag&BF_WEAPON && damage > 0 && rnd()%100 < sce->val3) status_heal(src, damage * sce->val4 / 100, 0, 3); @@ -1398,20 +1413,24 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam if ( ((sce=sc->data[SC_MANU_ATK]) && (flag&BF_WEAPON)) || ((sce=sc->data[SC_MANU_MATK]) && (flag&BF_MAGIC)) - ) - for (i=0;ARRAYLENGTH(mob_manuk)>i;i++) + ) { + for (i=0;ARRAYLENGTH(mob_manuk)>i;i++) { if (((TBL_MOB*)bl)->mob_id==mob_manuk[i]) { - DAMAGE_ADDRATE(sce->val1) + damage += damage * sce->val1 / 100; break; } + } + } if ( ((sce=sc->data[SC_SPL_ATK]) && (flag&BF_WEAPON)) || ((sce=sc->data[SC_SPL_MATK]) && (flag&BF_MAGIC)) - ) - for (i=0;ARRAYLENGTH(mob_splendide)>i;i++) + ) { + for (i=0;ARRAYLENGTH(mob_splendide)>i;i++) { if (((TBL_MOB*)bl)->mob_id==mob_splendide[i]) { - DAMAGE_ADDRATE(sce->val1) + damage += damage * sce->val1 / 100; break; + } } + } } /* Self Buff that destroys the armor of any target hit with melee or ranged physical attacks */ if( sc->data[SC_SHIELDSPELL_REF] && sc->data[SC_SHIELDSPELL_REF]->val1 == 1 && flag&BF_WEAPON ) { @@ -1438,18 +1457,18 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam if (battle_config.pk_mode && sd && bl->type == BL_PC && damage && map[bl->m].flag.pvp) { if (flag & BF_SKILL) { //Skills get a different reduction than non-skills. [Skotlex] if (flag&BF_WEAPON) - DAMAGE_RATE(battle_config.pk_weapon_damage_rate) + damage = damage * battle_config.pk_weapon_damage_rate / 100; if (flag&BF_MAGIC) - DAMAGE_RATE(battle_config.pk_magic_damage_rate) + damage = damage * battle_config.pk_magic_damage_rate / 100; if (flag&BF_MISC) - DAMAGE_RATE(battle_config.pk_misc_damage_rate) + damage = damage * battle_config.pk_misc_damage_rate / 100; } else { //Normal attacks get reductions based on range. if (flag & BF_SHORT) - DAMAGE_RATE(battle_config.pk_short_damage_rate) + damage = damage * battle_config.pk_short_damage_rate / 100; if (flag & BF_LONG) - DAMAGE_RATE(battle_config.pk_long_damage_rate) + damage = damage * battle_config.pk_long_damage_rate / 100; } - if(!damage) damage = 1; + damage = max(damage,1); } if(battle_config.skill_min_damage && damage > 0 && damage < div_) { @@ -1517,16 +1536,16 @@ int64 battle_calc_bg_damage(struct block_list *src, struct block_list *bl, int64 if( flag&BF_SKILL ) { //Skills get a different reduction than non-skills. [Skotlex] if( flag&BF_WEAPON ) - DAMAGE_RATE(battle_config.bg_weapon_damage_rate) + damage = damage * battle_config.bg_weapon_damage_rate / 100; if( flag&BF_MAGIC ) - DAMAGE_RATE(battle_config.bg_magic_damage_rate) + damage = damage * battle_config.bg_magic_damage_rate / 100; if( flag&BF_MISC ) - DAMAGE_RATE(battle_config.bg_misc_damage_rate) + damage = damage * battle_config.bg_misc_damage_rate / 100; } else { //Normal attacks get reductions based on range. if( flag&BF_SHORT ) - DAMAGE_RATE(battle_config.bg_short_damage_rate) + damage = damage * battle_config.bg_short_damage_rate / 100; if( flag&BF_LONG ) - DAMAGE_RATE(battle_config.bg_long_damage_rate) + damage = damage * battle_config.bg_long_damage_rate / 100; } damage = max(damage,1); //min 1 damage @@ -1587,16 +1606,16 @@ int64 battle_calc_gvg_damage(struct block_list *src,struct block_list *bl,int64 */ if (flag & BF_SKILL) { //Skills get a different reduction than non-skills. [Skotlex] if (flag&BF_WEAPON) - DAMAGE_RATE(battle_config.gvg_weapon_damage_rate) + damage = damage * battle_config.gvg_weapon_damage_rate / 100; if (flag&BF_MAGIC) - DAMAGE_RATE(battle_config.gvg_magic_damage_rate) + damage = damage * battle_config.gvg_magic_damage_rate / 100; if (flag&BF_MISC) - DAMAGE_RATE(battle_config.gvg_misc_damage_rate) + damage = damage * battle_config.gvg_misc_damage_rate / 100; } else { //Normal attacks get reductions based on range. if (flag & BF_SHORT) - DAMAGE_RATE(battle_config.gvg_short_damage_rate) + damage = damage * battle_config.gvg_short_damage_rate / 100; if (flag & BF_LONG) - DAMAGE_RATE(battle_config.gvg_long_damage_rate) + damage = damage * battle_config.gvg_long_damage_rate / 100; } damage = max(damage,1); return damage; @@ -1622,7 +1641,7 @@ static int battle_calc_drain(int64 damage, int rate, int per) diff = -1; } } - return (int)diff; + return (int)cap_value(diff, INT_MIN, INT_MAX); } /** @@ -1751,16 +1770,12 @@ int64 battle_addmastery(struct map_session_data *sd,struct block_list *target,in } #ifdef RENEWAL -static int64 battle_calc_sizefix(int64 damage, struct map_session_data *sd, unsigned char t_size, unsigned char weapon_type, short flag) +static int battle_calc_sizefix(int64 damage, struct map_session_data *sd, unsigned char t_size, unsigned char weapon_type, short flag) { - if (sd) { - //SizeFix only for players - if (!(sd->special_state.no_sizefix) && !flag) - DAMAGE_RATE(weapon_type==EQI_HAND_L? - sd->left_weapon.atkmods[t_size]: - sd->right_weapon.atkmods[t_size]) - } - return damage; + if (sd && !sd->special_state.no_sizefix && !flag) // Size fix only for players + damage = damage * (weapon_type == EQI_HAND_L ? sd->left_weapon.atkmods[t_size] : sd->right_weapon.atkmods[t_size]) / 100; + + return (int)cap_value(damage, INT_MIN, INT_MAX); } static int battle_calc_status_attack(struct status_data *status, short hand) @@ -1778,15 +1793,15 @@ static int battle_calc_base_weapon_attack(struct block_list *src, struct status_ uint8 type = (wa == &status->lhw)?EQI_HAND_L:EQI_HAND_R; uint16 atkmin = (type == EQI_HAND_L)?status->watk2:status->watk; uint16 atkmax = atkmin; - int damage = atkmin; + int64 damage = atkmin; uint16 weapon_perfection = 0; struct status_change *sc = status_get_sc(src); if (sd->equip_index[type] >= 0 && sd->inventory_data[sd->equip_index[type]]) { int variance = wa->atk * (sd->inventory_data[sd->equip_index[type]]->wlv*5)/100; - atkmin = max(0, atkmin - variance); - atkmax = min(UINT16_MAX, atkmax + variance); + atkmin = max(0, (int)(atkmin - variance)); + atkmax = min(UINT16_MAX, (int)(atkmax + variance)); if (sc && sc->data[SC_MAXIMIZEPOWER]) damage = atkmax; @@ -1797,9 +1812,9 @@ static int battle_calc_base_weapon_attack(struct block_list *src, struct status_ if (sc && sc->data[SC_WEAPONPERFECTION]) weapon_perfection = 1; - damage = (int)battle_calc_sizefix(damage, sd, tstatus->size, type, weapon_perfection); + damage = battle_calc_sizefix(damage, sd, tstatus->size, type, weapon_perfection); - return damage; + return (int)cap_value(damage, INT_MIN, INT_MAX); } #endif @@ -1823,7 +1838,7 @@ static int battle_calc_base_weapon_attack(struct block_list *src, struct status_ */ static int64 battle_calc_base_damage(struct status_data *status, struct weapon_atk *wa, struct status_change *sc, unsigned short t_size, struct map_session_data *sd, int flag) { - unsigned int atkmin=0, atkmax=0; + unsigned int atkmin = 0, atkmax = 0; short type = 0; int64 damage = 0; @@ -1872,11 +1887,9 @@ static int64 battle_calc_base_damage(struct status_data *status, struct weapon_a if (flag&2 && sd->bonus.arrow_atk) damage += ( (flag&1) ? sd->bonus.arrow_atk : rnd()%sd->bonus.arrow_atk ); - //SizeFix only for players + // Size fix only for players if (!(sd->special_state.no_sizefix || (flag&8))) - DAMAGE_RATE(type==EQI_HAND_L? - sd->left_weapon.atkmods[t_size]: - sd->right_weapon.atkmods[t_size]) + damage = damage * (type == EQI_HAND_L ? sd->left_weapon.atkmods[t_size] : sd->right_weapon.atkmods[t_size]) / 100; } //Finally, add baseatk @@ -1892,12 +1905,12 @@ static int64 battle_calc_base_damage(struct status_data *status, struct weapon_a if(sd->left_weapon.overrefine) damage += rnd()%sd->left_weapon.overrefine+1; if (sd->weapon_atk_rate[sd->weapontype2]) - DAMAGE_ADDRATE(sd->weapon_atk_rate[sd->weapontype2]) + damage += damage * sd->weapon_atk_rate[sd->weapontype2] / 100; } else { //Right hand if(sd->right_weapon.overrefine) damage += rnd()%sd->right_weapon.overrefine+1; if (sd->weapon_atk_rate[sd->weapontype1]) - DAMAGE_ADDRATE(sd->weapon_atk_rate[sd->weapontype1]) + damage += damage * sd->weapon_atk_rate[sd->weapontype1] / 100; } } @@ -2638,7 +2651,6 @@ static int battle_get_weapon_element(struct Damage wd, struct block_list *src, s struct map_session_data *sd = BL_CAST(BL_PC, src); struct status_change *sc = status_get_sc(src); struct status_data *sstatus = status_get_status_data(src); - uint8 i; int element = skill_get_ele(skill_id, skill_lv); //Take weapon's element @@ -2649,16 +2661,11 @@ static int battle_get_weapon_element(struct Damage wd, struct block_list *src, s element = sstatus->lhw.ele; if(is_skill_using_arrow(src, skill_id) && sd && sd->bonus.arrow_ele && weapon_position == EQI_HAND_R) element = sd->bonus.arrow_ele; + if(sd && sd->spiritcharm_type != CHARM_TYPE_NONE && sd->spiritcharm >= MAX_SPIRITCHARM) + element = sd->spiritcharm_type; // Summoning 10 spiritcharm will endow your weapon // on official endows override all other elements [helvetica] - if (sd) { //Summoning 10 talisman will endow your weapon. - ARR_FIND(1, 6, i, sd->talisman[i] >= 10); - if (i < 5) - element = i; - if (sc) { // check for endows - if(sc->data[SC_ENCHANTARMS]) - element = sc->data[SC_ENCHANTARMS]->val2; - } - } + if(sc && sc->data[SC_ENCHANTARMS]) // Check for endows + element = sc->data[SC_ENCHANTARMS]->val2; } else if( element == -2 ) //Use enchantment's element element = status_get_attack_sc_element(src,sc); else if( element == -3 ) //Use random element @@ -2763,21 +2770,21 @@ static struct Damage battle_calc_element_damage(struct Damage wd, struct block_l return wd; } -#define ATK_RATE(damage, damage2, a) { damage = damage * (a) / 100; if(is_attack_left_handed(src, skill_id)) damage2 = damage2 * (a) / 100; } -#define ATK_RATE2(damage, damage2, a , b) { damage = damage *(a) / 100; if(is_attack_left_handed(src, skill_id)) damage2 = damage2 * (b) / 100; } -#define ATK_RATER(damage, a) { damage = damage * (a) / 100; } -#define ATK_RATEL(damage2, a) { damage2 = damage2 * (a) / 100; } +#define ATK_RATE(damage, damage2, a) do { int64 rate_ = (a); (damage) = (damage) * rate_ / 100; if(is_attack_left_handed(src, skill_id)) (damage2) = (damage2) * rate_ / 100; } while(0); +#define ATK_RATE2(damage, damage2, a , b) do { int64 rate_ = (a), rate2_ = (b); (damage) = (damage) *rate_ / 100; if(is_attack_left_handed(src, skill_id)) (damage2) = (damage2) * rate2_ / 100; } while(0); +#define ATK_RATER(damage, a) { (damage) = (damage) * (a) / 100; } +#define ATK_RATEL(damage2, a) { (damage2) = (damage2) * (a) / 100; } //Adds dmg%. 100 = +100% (double) damage. 10 = +10% damage -#define ATK_ADDRATE(damage, damage2, a) { damage += damage * (a) / 100; if(is_attack_left_handed(src, skill_id)) damage2 += damage2 *(a) / 100; } -#define ATK_ADDRATE2(damage, damage2, a , b) { damage += damage * (a) / 100; if(is_attack_left_handed(src, skill_id)) damage2 += damage2 * (b) / 100; } +#define ATK_ADDRATE(damage, damage2, a) do { int64 rate_ = (a); (damage) += (damage) * rate_ / 100; if(is_attack_left_handed(src, skill_id)) (damage2) += (damage2) *rate_ / 100; } while(0); +#define ATK_ADDRATE2(damage, damage2, a , b) do { int64 rate_ = (a), rate2_ = (b); (damage) += (damage) * rate_ / 100; if(is_attack_left_handed(src, skill_id)) (damage2) += (damage2) * rate2_ / 100; } while(0); //Adds an absolute value to damage. 100 = +100 damage -#define ATK_ADD(damage, damage2, a) { damage += a; if(is_attack_left_handed(src, skill_id)) damage2 += a; } -#define ATK_ADD2(damage, damage2, a , b) { damage += a; if(is_attack_left_handed(src, skill_id)) damage2 += b; } +#define ATK_ADD(damage, damage2, a) do { int64 rate_ = (a); (damage) += rate_; if(is_attack_left_handed(src, skill_id)) (damage2) += rate_; } while(0); +#define ATK_ADD2(damage, damage2, a , b) do { int64 rate_ = (a), rate2_ = (b); (damage) += rate_; if(is_attack_left_handed(src, skill_id)) (damage2) += rate2_; } while(0); #ifdef RENEWAL - #define RE_ALLATK_ADD(wd, a) { ATK_ADD(wd.statusAtk, wd.statusAtk2, a); ATK_ADD(wd.weaponAtk, wd.weaponAtk2, a); ATK_ADD(wd.equipAtk, wd.equipAtk2, a); ATK_ADD(wd.masteryAtk, wd.masteryAtk2, a); } - #define RE_ALLATK_RATE(wd, a) { ATK_RATE(wd.statusAtk, wd.statusAtk2, a); ATK_RATE(wd.weaponAtk, wd.weaponAtk2, a); ATK_RATE(wd.equipAtk, wd.equipAtk2, a); ATK_RATE(wd.masteryAtk, wd.masteryAtk2, a); } - #define RE_ALLATK_ADDRATE(wd, a) { ATK_ADDRATE(wd.statusAtk, wd.statusAtk2, a); ATK_ADDRATE(wd.weaponAtk, wd.weaponAtk2, a); ATK_ADDRATE(wd.equipAtk, wd.equipAtk2, a); ATK_ADDRATE(wd.masteryAtk, wd.masteryAtk2, a); } + #define RE_ALLATK_ADD(wd, a) do { int64 a_ = (a); ATK_ADD((wd).statusAtk, (wd).statusAtk2, a_); ATK_ADD((wd).weaponAtk, (wd).weaponAtk2, a_); ATK_ADD((wd).equipAtk, (wd).equipAtk2, a_); ATK_ADD((wd).masteryAtk, (wd).masteryAtk2, a_); } while(0); + #define RE_ALLATK_RATE(wd, a) do { int64 a_ = (a); ATK_RATE((wd).statusAtk, (wd).statusAtk2, a_); ATK_RATE((wd).weaponAtk, (wd).weaponAtk2, a_); ATK_RATE((wd).equipAtk, (wd).equipAtk2, a_); ATK_RATE((wd).masteryAtk, (wd).masteryAtk2, a_); } while(0); + #define RE_ALLATK_ADDRATE(wd, a) do { int64 a_ = (a); ATK_ADDRATE((wd).statusAtk, (wd).statusAtk2, a_); ATK_ADDRATE((wd).weaponAtk, (wd).weaponAtk2, a_); ATK_ADDRATE((wd).equipAtk, (wd).equipAtk2, a_); ATK_ADDRATE((wd).masteryAtk, (wd).masteryAtk2, a_); } while(0); #else #define RE_ALLATK_ADD(wd, a) {;} #define RE_ALLATK_RATE(wd, a) {;} @@ -2804,16 +2811,16 @@ static struct Damage battle_calc_attack_masteries(struct Damage wd, struct block skill_id != MO_EXTREMITYFIST && skill_id != CR_GRANDCROSS) { //Add mastery damage - int skill; + uint16 skill; wd.damage = battle_addmastery(sd,target,wd.damage,0); #ifdef RENEWAL - wd.masteryAtk = (int)battle_addmastery(sd,target,wd.weaponAtk,0); + wd.masteryAtk = battle_addmastery(sd,target,wd.weaponAtk,0); #endif if (is_attack_left_handed(src, skill_id)) { wd.damage2 = battle_addmastery(sd,target,wd.damage2,1); #ifdef RENEWAL - wd.masteryAtk2 = (int)battle_addmastery(sd,target,wd.weaponAtk2,1); + wd.masteryAtk2 = battle_addmastery(sd,target,wd.weaponAtk2,1); #endif } @@ -2904,24 +2911,24 @@ struct Damage battle_calc_damage_parts(struct Damage wd, struct block_list *src, wd.statusAtk2 += battle_calc_status_attack(sstatus, EQI_HAND_L); if (skill_id || (sd && sd->sc.data[SC_SEVENWIND])) { // Mild Wind applies element to status ATK as well as weapon ATK [helvetica] - wd.statusAtk = (int)battle_attr_fix(src, target, wd.statusAtk, right_element, tstatus->def_ele, tstatus->ele_lv); - wd.statusAtk2 = (int)battle_attr_fix(src, target, wd.statusAtk, left_element, tstatus->def_ele, tstatus->ele_lv); + wd.statusAtk = battle_attr_fix(src, target, wd.statusAtk, right_element, tstatus->def_ele, tstatus->ele_lv); + wd.statusAtk2 = battle_attr_fix(src, target, wd.statusAtk, left_element, tstatus->def_ele, tstatus->ele_lv); } else { // status atk is considered neutral on normal attacks [helvetica] - wd.statusAtk = (int)battle_attr_fix(src, target, wd.statusAtk, ELE_NEUTRAL, tstatus->def_ele, tstatus->ele_lv); - wd.statusAtk2 = (int)battle_attr_fix(src, target, wd.statusAtk, ELE_NEUTRAL, tstatus->def_ele, tstatus->ele_lv); + wd.statusAtk = battle_attr_fix(src, target, wd.statusAtk, ELE_NEUTRAL, tstatus->def_ele, tstatus->ele_lv); + wd.statusAtk2 = battle_attr_fix(src, target, wd.statusAtk, ELE_NEUTRAL, tstatus->def_ele, tstatus->ele_lv); } wd.weaponAtk += battle_calc_base_weapon_attack(src, tstatus, &sstatus->rhw, sd); - wd.weaponAtk = (int)battle_attr_fix(src, target, wd.weaponAtk, right_element, tstatus->def_ele, tstatus->ele_lv); + wd.weaponAtk = battle_attr_fix(src, target, wd.weaponAtk, right_element, tstatus->def_ele, tstatus->ele_lv); wd.weaponAtk2 += battle_calc_base_weapon_attack(src, tstatus, &sstatus->lhw, sd); - wd.weaponAtk2 = (int)battle_attr_fix(src, target, wd.weaponAtk2, left_element, tstatus->def_ele, tstatus->ele_lv); + wd.weaponAtk2 = battle_attr_fix(src, target, wd.weaponAtk2, left_element, tstatus->def_ele, tstatus->ele_lv); wd.equipAtk += battle_calc_equip_attack(src, skill_id); - wd.equipAtk = (int)battle_attr_fix(src, target, wd.equipAtk, right_element, tstatus->def_ele, tstatus->ele_lv); + wd.equipAtk = battle_attr_fix(src, target, wd.equipAtk, right_element, tstatus->def_ele, tstatus->ele_lv); wd.equipAtk2 += battle_calc_equip_attack(src, skill_id); - wd.equipAtk2 = (int)battle_attr_fix(src, target, wd.equipAtk2, left_element, tstatus->def_ele, tstatus->ele_lv); + wd.equipAtk2 = battle_attr_fix(src, target, wd.equipAtk2, left_element, tstatus->def_ele, tstatus->ele_lv); //Mastery ATK is a special kind of ATK that has no elemental properties //Because masteries are not elemental, they are unaffected by Ghost armors or Raydric Card @@ -2953,11 +2960,11 @@ struct Damage battle_calc_skill_base_damage(struct Damage wd, struct block_list switch (skill_id) { //Calc base damage according to skill case PA_SACRIFICE: - wd.damage = (int64)sstatus->max_hp* 9/100; + wd.damage = sstatus->max_hp* 9/100; wd.damage2 = 0; #ifdef RENEWAL - wd.weaponAtk = (int)wd.damage; - wd.weaponAtk2 = (int)wd.damage2; + wd.weaponAtk = wd.damage; + wd.weaponAtk2 = wd.damage2; #endif break; #ifdef RENEWAL @@ -3028,14 +3035,14 @@ struct Damage battle_calc_skill_base_damage(struct Damage wd, struct block_list if (sd) { short index = sd->equip_index[EQI_HAND_L]; - if (index >= 0 && sd->inventory_data[index] && sd->inventory_data[index]->type == IT_ARMOR) - ATK_ADD(wd.damage, wd.damage2, sd->inventory_data[index]->weight/10); + if (index >= 0 && sd->inventory_data[index] && sd->inventory_data[index]->type == IT_ARMOR) { + ATK_ADD(wd.damage, wd.damage2, sd->inventory_data[index]->weight / 10); +#ifdef RENEWAL + ATK_ADD(wd.weaponAtk, wd.weaponAtk2, sd->inventory_data[index]->weight / 10); +#endif + } } else ATK_ADD(wd.damage, wd.damage2, sstatus->rhw.atk2); //Else use Atk2 -#ifdef RENEWAL - wd.weaponAtk = (int)wd.damage; - wd.weaponAtk2 = (int)wd.damage2; -#endif break; case RK_DRAGONBREATH: case RK_DRAGONBREATH_WATER: @@ -3161,9 +3168,9 @@ struct Damage battle_calc_skill_base_damage(struct Damage wd, struct block_list } //For quick div adjustment. -#define DAMAGE_DIV_FIX(dmg, div) { if (div < 0) { (div)*=-1; (dmg)/=div; } (dmg)*=div; } -#define DAMAGE_DIV_FIX2(dmg, div) { if (div > 1) (dmg)*=div; } -#define DAMAGE_DIV_FIX_RENEWAL(wd, div) { DAMAGE_DIV_FIX2(wd.statusAtk, div); DAMAGE_DIV_FIX2(wd.weaponAtk, div); DAMAGE_DIV_FIX2(wd.equipAtk, div); DAMAGE_DIV_FIX2(wd.masteryAtk, div); } +#define DAMAGE_DIV_FIX(dmg, div) { if ((div) < 0) { (div) *= -1; (dmg) /= (div); } (dmg) *= (div); } +#define DAMAGE_DIV_FIX2(dmg, div) { if ((div) > 1) (dmg) *= div; } +#define DAMAGE_DIV_FIX_RENEWAL(wd, div) do { int div_ = (div); DAMAGE_DIV_FIX2((wd).statusAtk, div_); DAMAGE_DIV_FIX2((wd).weaponAtk, div_); DAMAGE_DIV_FIX2((wd).equipAtk, div_); DAMAGE_DIV_FIX2((wd).masteryAtk, div_); } while(0); /*================================================= [Playtester] * Applies DAMAGE_DIV_FIX and checks for min damage * @param d: Damage struct to apply DAMAGE_DIV_FIX to @@ -3280,7 +3287,7 @@ static int battle_calc_attack_skill_ratio(struct Damage wd, struct block_list *s #else skillratio += 200; if (sc && sc->data[SC_TRUESIGHT]) - skillratio += 2*sc->data[SC_TRUESIGHT]->val1; + skillratio += 2 * sc->data[SC_TRUESIGHT]->val1; if (sc->data[SC_CONCENTRATION]) skillratio += sc->data[SC_CONCENTRATION]->val2; #endif @@ -3306,34 +3313,34 @@ static int battle_calc_attack_skill_ratio(struct Damage wd, struct block_list *s skillratio += sc->data[SC_P_ALTER]->val2; } - switch( skill_id ) { + switch(skill_id) { case SM_BASH: case MS_BASH: - skillratio += 30*skill_lv; + skillratio += 30 * skill_lv; break; case SM_MAGNUM: case MS_MAGNUM: if(wd.miscflag == 1) - skillratio += 20*skill_lv; //Inner 3x3 circle takes 100%+20%*level damage [Playtester] + skillratio += 20 * skill_lv; //Inner 3x3 circle takes 100%+20%*level damage [Playtester] else - skillratio += 10*skill_lv; //Outer 5x5 circle takes 100%+10%*level damage [Playtester] + skillratio += 10 * skill_lv; //Outer 5x5 circle takes 100%+10%*level damage [Playtester] break; case MC_MAMMONITE: - skillratio += 50*skill_lv; + skillratio += 50 * skill_lv; break; case HT_POWER: - skillratio += -50+8*sstatus->str; + skillratio += -50 + 8 * sstatus->str; break; case AC_DOUBLE: case MA_DOUBLE: - skillratio += 10*(skill_lv-1); + skillratio += 10 * (skill_lv - 1); break; case AC_SHOWER: case MA_SHOWER: #ifdef RENEWAL - skillratio += 50+10*skill_lv; + skillratio += 50 + 10 * skill_lv; #else - skillratio += -25+5*skill_lv; + skillratio += -25 + 5 * skill_lv; #endif break; case AC_CHARGEARROW: @@ -3343,47 +3350,53 @@ static int battle_calc_attack_skill_ratio(struct Damage wd, struct block_list *s #ifndef RENEWAL case HT_FREEZINGTRAP: case MA_FREEZINGTRAP: - skillratio += -50+10*skill_lv; + skillratio += -50 + 10 * skill_lv; break; #endif case KN_PIERCE: case ML_PIERCE: - skillratio += 10*skill_lv; + skillratio += 10 * skill_lv; break; case MER_CRASH: - skillratio += 10*skill_lv; + skillratio += 10 * skill_lv; break; case KN_SPEARSTAB: - skillratio += 15*skill_lv; + skillratio += 15 * skill_lv; break; case KN_SPEARBOOMERANG: - skillratio += 50*skill_lv; + skillratio += 50 * skill_lv; break; case KN_BRANDISHSPEAR: - case ML_BRANDISH: - { - int ratio = 100+20*skill_lv; - skillratio += ratio-100; - if(skill_lv>3 && wd.miscflag==1) skillratio += ratio/2; - if(skill_lv>6 && wd.miscflag==1) skillratio += ratio/4; - if(skill_lv>9 && wd.miscflag==1) skillratio += ratio/8; - if(skill_lv>6 && wd.miscflag==2) skillratio += ratio/2; - if(skill_lv>9 && wd.miscflag==2) skillratio += ratio/4; - if(skill_lv>9 && wd.miscflag==3) skillratio += ratio/2; - break; - } + case ML_BRANDISH: { + int ratio = 100 + 20 * skill_lv; + + skillratio += -100 + ratio; + if(skill_lv > 3 && wd.miscflag == 1) + skillratio += ratio / 2; + if(skill_lv > 6 && wd.miscflag == 1) + skillratio += ratio / 4; + if(skill_lv > 9 && wd.miscflag == 1) + skillratio += ratio / 8; + if(skill_lv > 6 && wd.miscflag == 2) + skillratio += ratio / 2; + if(skill_lv > 9 && wd.miscflag == 2) + skillratio += ratio / 4; + if(skill_lv > 9 && wd.miscflag == 3) + skillratio += ratio / 2; + break; + } case KN_BOWLINGBASH: case MS_BOWLINGBASH: - skillratio+= 40*skill_lv; + skillratio+= 40 * skill_lv; break; case AS_GRIMTOOTH: - skillratio += 20*skill_lv; + skillratio += 20 * skill_lv; break; case AS_POISONREACT: - skillratio += 30*skill_lv; + skillratio += 30 * skill_lv; break; case AS_SONICBLOW: - skillratio += 300+40*skill_lv; + skillratio += 300 + 40 * skill_lv; break; case TF_SPRINKLESAND: skillratio += 30; @@ -3391,7 +3404,7 @@ static int battle_calc_attack_skill_ratio(struct Damage wd, struct block_list *s case MC_CARTREVOLUTION: skillratio += 50; if(sd && sd->cart_weight) - skillratio += 100*sd->cart_weight/sd->cart_weight_max; // +1% every 1% weight + skillratio += 100 * sd->cart_weight / sd->cart_weight_max; // +1% every 1% weight else if (!sd) skillratio += 100; //Max damage for non players. break; @@ -3399,7 +3412,7 @@ static int battle_calc_attack_skill_ratio(struct Damage wd, struct block_list *s skillratio += -25; //75% base damage break; case NPC_COMBOATTACK: - skillratio += 25*skill_lv; + skillratio += 25 * skill_lv; break; case NPC_RANDOMATTACK: case NPC_WATERATTACK: @@ -3419,40 +3432,40 @@ static int battle_calc_attack_skill_ratio(struct Damage wd, struct block_list *s case NPC_THUNDERBREATH: case NPC_HELLJUDGEMENT: case NPC_PULSESTRIKE: - skillratio += 100*(skill_lv-1); + skillratio += 100 * (skill_lv - 1); break; case RG_BACKSTAP: if(sd && sd->status.weapon == W_BOW && battle_config.backstab_bow_penalty) - skillratio += (200+40*skill_lv)/2; + skillratio += (200 + 40 * skill_lv) / 2; else - skillratio += 200+40*skill_lv; + skillratio += 200 + 40 * skill_lv; break; case RG_RAID: - skillratio += 40*skill_lv; + skillratio += 40 * skill_lv; break; case RG_INTIMIDATE: - skillratio += 30*skill_lv; + skillratio += 30 * skill_lv; break; case CR_SHIELDCHARGE: - skillratio += 20*skill_lv; + skillratio += 20 * skill_lv; break; case CR_SHIELDBOOMERANG: - skillratio += 30*skill_lv; + skillratio += 30 * skill_lv; break; case NPC_DARKCROSS: case CR_HOLYCROSS: #ifdef RENEWAL if(sd && sd->status.weapon == W_2HSPEAR) - skillratio += 2*(35*skill_lv); + skillratio += 70 * skill_lv; else #endif - skillratio += 35*skill_lv; + skillratio += 35 * skill_lv; break; case AM_DEMONSTRATION: - skillratio += 20*skill_lv; + skillratio += 20 * skill_lv; break; case AM_ACIDTERROR: - skillratio += 40*skill_lv; + skillratio += 40 * skill_lv; break; case MO_FINGEROFFENSIVE: skillratio += 50 * skill_lv; @@ -3461,117 +3474,112 @@ static int battle_calc_attack_skill_ratio(struct Damage wd, struct block_list *s skillratio += 100 + 150 * skill_lv; break; case MO_EXTREMITYFIST: - skillratio += 100*(7 + sstatus->sp/10); + skillratio += 100 * (7 + sstatus->sp / 10); skillratio = min(500000,skillratio); //We stop at roughly 50k SP for overflow protection break; case MO_TRIPLEATTACK: - skillratio += 20*skill_lv; + skillratio += 20 * skill_lv; break; case MO_CHAINCOMBO: - skillratio += 50+50*skill_lv; + skillratio += 50 + 50 * skill_lv; break; case MO_COMBOFINISH: - skillratio += 140+60*skill_lv; + skillratio += 140 + 60 * skill_lv; break; case BA_MUSICALSTRIKE: case DC_THROWARROW: - skillratio += 25+25*skill_lv; + skillratio += 25 + 25 * skill_lv; break; case CH_TIGERFIST: - skillratio += 100*skill_lv-60; + skillratio += -60 + 100 * skill_lv; break; case CH_CHAINCRUSH: - skillratio += 300+100*skill_lv; + skillratio += 300 + 100 * skill_lv; break; case CH_PALMSTRIKE: - skillratio += 100+100*skill_lv; + skillratio += 100 + 100 * skill_lv; break; case LK_HEADCRUSH: - skillratio += 40*skill_lv; + skillratio += 40 * skill_lv; break; case LK_JOINTBEAT: - i = 10*skill_lv-50; + i = 10 * skill_lv - 50; // Although not clear, it's being assumed that the 2x damage is only for the break neck ailment. - if (wd.miscflag&BREAK_NECK) i*=2; + if (wd.miscflag&BREAK_NECK) + i *= 2; skillratio += i; break; #ifdef RENEWAL // Renewal: skill ratio applies to entire damage [helvetica] case LK_SPIRALPIERCE: case ML_SPIRALPIERCE: - skillratio += 50*skill_lv; + skillratio += 50 * skill_lv; break; #endif case ASC_METEORASSAULT: - skillratio += 40*skill_lv-60; + skillratio += -60 + 40 * skill_lv; break; case SN_SHARPSHOOTING: case MA_SHARPSHOOTING: - skillratio += 100+50*skill_lv; + skillratio += 100 + 50 * skill_lv; break; case CG_ARROWVULCAN: - skillratio += 100+100*skill_lv; + skillratio += 100 + 100 * skill_lv; break; case AS_SPLASHER: - skillratio += 400+50*skill_lv; + skillratio += 400 + 50 * skill_lv; if(sd) skillratio += 20 * pc_checkskill(sd,AS_POISONREACT); break; #ifndef RENEWAL // Pre-Renewal: skill ratio for weapon part of damage [helvetica] case ASC_BREAKER: - skillratio += 100*skill_lv-100; + skillratio += -100 + 100 * skill_lv; break; #endif case PA_SACRIFICE: - skillratio += 10*skill_lv-10; + skillratio += -10 + 10 * skill_lv; break; case PA_SHIELDCHAIN: - skillratio += 30*skill_lv; + skillratio += 30 * skill_lv; break; case WS_CARTTERMINATION: i = 10 * (16 - skill_lv); if (i < 1) i = 1; //Preserve damage ratio when max cart weight is changed. - if(sd && sd->cart_weight) - skillratio += sd->cart_weight/i * 80000/battle_config.max_cart_weight - 100; + if (sd && sd->cart_weight) + skillratio += sd->cart_weight / i * 80000 / battle_config.max_cart_weight - 100; else if (!sd) skillratio += 80000 / i - 100; break; case TK_DOWNKICK: - skillratio += 60 + 20*skill_lv; - break; case TK_STORMKICK: - skillratio += 60 + 20*skill_lv; + skillratio += 60 + 20 * skill_lv + 10 * pc_checkskill(sd,TK_RUN); //+Dmg (to Kick skills, %) break; case TK_TURNKICK: - skillratio += 90 + 30*skill_lv; - break; case TK_COUNTER: - skillratio += 90 + 30*skill_lv; + skillratio += 90 + 30 * skill_lv + 10 * pc_checkskill(sd,TK_RUN); break; case TK_JUMPKICK: - skillratio += -70 + 10*skill_lv; + skillratio += -70 + 10 * skill_lv + 10 * pc_checkskill(sd,TK_RUN); if (sc && sc->data[SC_COMBO] && sc->data[SC_COMBO]->val1 == skill_id) - skillratio += 10*status_get_lv(src)/3; //Tumble bonus - if (wd.miscflag) - { - skillratio += 10*status_get_lv(src)/3; //Running bonus (TODO: What is the real bonus?) - if( sc && sc->data[SC_SPURT] ) // Spurt bonus + skillratio += 10 * status_get_lv(src) / 3; //Tumble bonus + if (wd.miscflag) { + skillratio += 10 * status_get_lv(src) / 3; //Running bonus (TODO: What is the real bonus?) + if (sc && sc->data[SC_SPURT]) // Spurt bonus skillratio *= 2; } break; case GS_TRIPLEACTION: - skillratio += 50*skill_lv; + skillratio += 50 * skill_lv; break; case GS_BULLSEYE: //Only works well against brute/demihumans non bosses. - if((tstatus->race == RC_BRUTE || tstatus->race == RC_DEMIHUMAN || tstatus->race == RC_PLAYER) - && !(tstatus->mode&MD_BOSS)) + if((tstatus->race == RC_BRUTE || tstatus->race == RC_DEMIHUMAN || tstatus->race == RC_PLAYER) && !(tstatus->mode&MD_BOSS)) skillratio += 400; break; case GS_TRACKING: - skillratio += 100 *(skill_lv+1); + skillratio += 100 * (skill_lv + 1); break; case GS_PIERCINGSHOT: #ifdef RENEWAL @@ -3579,41 +3587,41 @@ static int battle_calc_attack_skill_ratio(struct Damage wd, struct block_list *s skillratio += 50 + 30 * skill_lv; else #endif - skillratio += 20*skill_lv; + skillratio += 20 * skill_lv; break; case GS_RAPIDSHOWER: - skillratio += 400+50*skill_lv; + skillratio += 400 + 50 * skill_lv; break; case GS_DESPERADO: - skillratio += 50*(skill_lv-1); + skillratio += 50 * (skill_lv - 1); break; case GS_DUST: - skillratio += 50*skill_lv; + skillratio += 50 * skill_lv; break; case GS_FULLBUSTER: - skillratio += 100*(skill_lv+2); + skillratio += 100 * (skill_lv + 2); break; case GS_SPREADATTACK: #ifdef RENEWAL - skillratio += 20*(skill_lv); + skillratio += 20 * skill_lv; #else - skillratio += 20*(skill_lv-1); + skillratio += 20 * (skill_lv - 1); #endif break; case NJ_HUUMA: - skillratio += 50 + 150*skill_lv; + skillratio += 50 + 150 * skill_lv; break; case NJ_TATAMIGAESHI: skillratio += 10 * skill_lv; #ifdef RENEWAL - skillratio += 200; + skillratio *= 2; #endif break; case NJ_KASUMIKIRI: - skillratio += 10*skill_lv; + skillratio += 10 * skill_lv; break; case NJ_KIRIKAGE: - skillratio += 100*(skill_lv-1); + skillratio += 100 * (skill_lv - 1); break; case NJ_KUNAI: skillratio += 200; @@ -3640,70 +3648,74 @@ static int battle_calc_attack_skill_ratio(struct Damage wd, struct block_list *s case MO_BALKYOUNG: skillratio += 200; break; - case HFLI_MOON: //[orn] - skillratio += 10+110*skill_lv; + case HFLI_MOON: //[orn] + skillratio += 10 + 110 * skill_lv; break; - case HFLI_SBR44: //[orn] - skillratio += 100 *(skill_lv-1); + case HFLI_SBR44: //[orn] + skillratio += 100 * (skill_lv - 1); break; case NPC_VAMPIRE_GIFT: - skillratio += ((skill_lv-1)%5+1)*100; + skillratio += ((skill_lv - 1) % 5 + 1) * 100; break; case RK_SONICWAVE: - skillratio = (skill_lv + 5) * 100; // ATK = {((Skill Level + 5) x 100) x (1 + [(Caster's Base Level - 100) / 200])} % + skillratio += -100 + (skill_lv + 5) * 100; // ATK = {((Skill Level + 5) x 100) x (1 + [(Caster's Base Level - 100) / 200])} % skillratio = skillratio * (100 + (status_get_lv(src) - 100) / 2) / 100; break; case RK_HUNDREDSPEAR: skillratio += 500 + (80 * skill_lv); - if( sd ) { + if (sd) { short index = sd->equip_index[EQI_HAND_R]; - if( index >= 0 && sd->inventory_data[index] - && sd->inventory_data[index]->type == IT_WEAPON ) + + if (index >= 0 && sd->inventory_data[index] && sd->inventory_data[index]->type == IT_WEAPON) skillratio += max(10000 - sd->inventory_data[index]->weight, 0) / 10; skillratio += 50 * pc_checkskill(sd,LK_SPIRALPIERCE); } // (1 + [(Casters Base Level - 100) / 200]) skillratio = skillratio * (100 + (status_get_lv(src) - 100) / 2) / 100; break; case RK_WINDCUTTER: - skillratio = (skill_lv + 2) * 50; + skillratio += -100 + (skill_lv + 2) * 50; RE_LVL_DMOD(100); break; case RK_IGNITIONBREAK: { // 3x3 cell Damage = ATK [{(Skill Level x 300) x (1 + [(Caster's Base Level - 100) / 100])}] % // 7x7 cell Damage = ATK [{(Skill Level x 250) x (1 + [(Caster's Base Level - 100) / 100])}] % // 11x11 cell Damage = ATK [{(Skill Level x 200) x (1 + [(Caster's Base Level - 100) / 100])}] % + int celldamage = 300; // Maximum base damage of 3x3 cell. + i = distance_bl(src,target); - if( i < 2 ) - skillratio = 300 * skill_lv; - else if( i < 4 ) - skillratio = 250 * skill_lv; - else - skillratio = 200 * skill_lv; - skillratio = skillratio * status_get_lv(src) / 100; + if (i > 1 && i <= 3) + celldamage -= 50; // 7x7 cell + else if (i > 3 && i <= 5) + celldamage -= 100; // 11x11 cell + celldamage = (skill_lv * celldamage) * (1 + (status_get_lv(src) - 100) / 100); // Elemental check, 1.5x damage if your element is fire. - if( sstatus->rhw.ele == ELE_FIRE ) - skillratio += 100 * skill_lv; + if (sstatus->rhw.ele == ELE_FIRE) + celldamage += 100 * skill_lv; + skillratio += -100 + celldamage; } break; case RK_STORMBLAST: - skillratio = (((sd) ? pc_checkskill(sd,RK_RUNEMASTERY) : skill_get_max(RK_RUNEMASTERY)) + (status_get_int(src) / 8)) * 100; // ATK = [{Rune Mastery Skill Level + (Caster's INT / 8)} x 100] % + skillratio += -100 + (((sd) ? pc_checkskill(sd,RK_RUNEMASTERY) : 0) + (status_get_int(src) / 8)) * 100; // ATK = [{Rune Mastery Skill Level + (Caster's INT / 8)} x 100] % break; case RK_PHANTOMTHRUST: // ATK = [{(Skill Level x 50) + (Spear Master Level x 10)} x Caster's Base Level / 150] % - skillratio = 50 * skill_lv + 10 * (sd ? pc_checkskill(sd,KN_SPEARMASTERY) : 5); + skillratio += -100 + 50 * skill_lv + 10 * (sd ? pc_checkskill(sd,KN_SPEARMASTERY) : 5); RE_LVL_DMOD(150); // Base level bonus. break; case GC_CROSSIMPACT: skillratio += 900 + 100 * skill_lv; RE_LVL_DMOD(120); break; - case GC_PHANTOMMENACE: - skillratio += 200; - break; case GC_COUNTERSLASH: //ATK [{(Skill Level x 100) + 300} x Caster's Base Level / 120]% + ATK [(AGI x 2) + (Caster's Job Level x 4)]% skillratio += 200 + (100 * skill_lv); RE_LVL_DMOD(120); break; + case GC_VENOMPRESSURE: + skillratio += 900; + break; + case GC_PHANTOMMENACE: + skillratio += 200; + break; case GC_ROLLINGCUTTER: skillratio += -50 + 50 * skill_lv; RE_LVL_DMOD(100); @@ -3711,7 +3723,7 @@ static int battle_calc_attack_skill_ratio(struct Damage wd, struct block_list *s case GC_CROSSRIPPERSLASHER: skillratio += 300 + 80 * skill_lv; RE_LVL_DMOD(100); - if( sc && sc->data[SC_ROLLINGCUTTER] ) + if (sc && sc->data[SC_ROLLINGCUTTER]) skillratio += sc->data[SC_ROLLINGCUTTER]->val1 * status_get_agi(src); break; case GC_DARKCROW: @@ -3743,7 +3755,8 @@ static int battle_calc_attack_skill_ratio(struct Damage wd, struct block_list *s break; case RA_WUGBITE: skillratio += 300 + 200 * skill_lv; - if ( skill_lv == 5 ) skillratio += 100; + if (skill_lv == 5) + skillratio += 100; break; case RA_SENSITIVEKEEN: skillratio += 50 * skill_lv; @@ -3757,7 +3770,7 @@ static int battle_calc_attack_skill_ratio(struct Damage wd, struct block_list *s RE_LVL_DMOD(100); break; case NC_VULCANARM: - skillratio = 70 * skill_lv + status_get_dex(src); + skillratio += -100 + 70 * skill_lv + status_get_dex(src); RE_LVL_DMOD(120); break; case NC_FLAMELAUNCHER: @@ -3772,21 +3785,21 @@ static int battle_calc_attack_skill_ratio(struct Damage wd, struct block_list *s case SZ_BIG: skillratio += 200 + 300 * skill_lv; break;// Large } RE_LVL_DMOD(120); - //NOTE: There are some other factors that affect damage, but not sure how exactly. Will recheck one day. [Rytech] break; case NC_AXEBOOMERANG: - skillratio += (skill_lv * 50) + 150; - if( sd ) { + skillratio += 150 + 50 * skill_lv; + if (sd) { short index = sd->equip_index[EQI_HAND_R]; - if( index >= 0 && sd->inventory_data[index] && sd->inventory_data[index]->type == IT_WEAPON ) + + if (index >= 0 && sd->inventory_data[index] && sd->inventory_data[index]->type == IT_WEAPON) skillratio += sd->inventory_data[index]->weight / 10;// Weight is divided by 10 since 10 weight in coding make 1 whole actual weight. [Rytech] } RE_LVL_DMOD(100); break; case NC_POWERSWING: // According to current sources, only the str + dex gets modified by level [Akinari] - skillratio = status_get_str(src) + status_get_dex(src); + skillratio += -100 + status_get_str(src) + status_get_dex(src); RE_LVL_DMOD(100); - skillratio += 200 + 100 * skill_lv; + skillratio += 300 + 100 * skill_lv; break; case NC_MAGMA_ERUPTION: // 'Slam' damage skillratio += 450 + 50 * skill_lv; @@ -3795,7 +3808,7 @@ static int battle_calc_attack_skill_ratio(struct Damage wd, struct block_list *s case NC_AXETORNADO: skillratio += 100 + 100 * skill_lv + status_get_vit(src); RE_LVL_DMOD(100); - if ( distance_bl(src, target) > 2 ) // Will deal 75% damage outside of 5x5 area. + if (distance_bl(src, target) > 2) // Will deal 75% damage outside of 5x5 area. skillratio = skillratio * 75 / 100; break; case SC_FATALMENACE: @@ -3803,23 +3816,23 @@ static int battle_calc_attack_skill_ratio(struct Damage wd, struct block_list *s RE_LVL_DMOD(100); break; case SC_TRIANGLESHOT: - skillratio += ((skill_lv - 1) * (status_get_agi(src) / 2)) + 200; + skillratio += 200 + (skill_lv - 1) * status_get_agi(src) / 2; RE_LVL_DMOD(120); break; case SC_FEINTBOMB: - skillratio = (skill_lv + 1) * (status_get_dex(src) / 2) * ((sd) ? sd->status.job_level : 1) / 10; + skillratio += -100 + (skill_lv + 1) * status_get_dex(src) / 2 * ((sd) ? sd->status.job_level / 10 : 1); RE_LVL_DMOD(120); break; case LG_CANNONSPEAR: - skillratio = (50 * skill_lv) + (status_get_str(src) * skill_lv); + skillratio += -100 + skill_lv * (50 + status_get_str(src)); RE_LVL_DMOD(100); break; case LG_BANISHINGPOINT: - skillratio = (50 * skill_lv) + (30 * ((sd) ? pc_checkskill(sd,SM_BASH) : skill_get_max(SM_BASH))); + skillratio += -100 + (50 * skill_lv) + ((sd) ? pc_checkskill(sd,SM_BASH) * 30 : 0); RE_LVL_DMOD(100); break; case LG_SHIELDPRESS: - skillratio = 150 * skill_lv + status_get_str(src); + skillratio += -100 + 150 * skill_lv + status_get_str(src); if (sd) { short index = sd->equip_index[EQI_HAND_L]; @@ -3829,43 +3842,43 @@ static int battle_calc_attack_skill_ratio(struct Damage wd, struct block_list *s RE_LVL_DMOD(100); break; case LG_PINPOINTATTACK: - skillratio = (100 * skill_lv) + (5 * status_get_agi(src)); + skillratio += -100 + 100 * skill_lv + 5 * status_get_agi(src); RE_LVL_DMOD(120); break; case LG_RAGEBURST: - if( sd && sd->spiritball_old ) - skillratio = sd->spiritball_old * 200 + (status_get_max_hp(src) - status_get_hp(src)) / 100; + if (sd && sd->spiritball_old) + skillratio += -100 + 200 * sd->spiritball_old + (status_get_max_hp(src) - status_get_hp(src)) / 100; else - skillratio = 15 * 200; + skillratio += 2900 + (status_get_max_hp(src) - status_get_hp(src)); RE_LVL_DMOD(100); break; - case LG_SHIELDSPELL:// [(Casters Base Level x 4) + (Shield DEF x 10) + (Casters VIT x 2)] % - if (sd && skill_lv == 1) { + case LG_SHIELDSPELL: + if (sd && skill_lv == 1) { // [(Casters Base Level x 4) + (Shield DEF x 10) + (Casters VIT x 2)] % short index = sd->equip_index[EQI_HAND_L]; + skillratio += -100 + status_get_lv(src) * 4 + status_get_vit(src) * 2; if (index >= 0 && sd->inventory_data[index] && sd->inventory_data[index]->type == IT_ARMOR) skillratio += sd->inventory_data[index]->def * 10; - skillratio = status_get_lv(src) * 4 + status_get_vit(src) * 2; } else skillratio = 0; // Prevent damage since level 2 is MATK. [Aleos] break; case LG_MOONSLASHER: - skillratio = 120 * skill_lv + ((sd) ? pc_checkskill(sd,LG_OVERBRAND) : skill_get_max(LG_OVERBRAND)) * 80; + skillratio += -100 + 120 * skill_lv + ((sd) ? pc_checkskill(sd,LG_OVERBRAND) * 80 : 0); RE_LVL_DMOD(100); break; case LG_OVERBRAND: - skillratio = 200 * skill_lv + ((sd) ? pc_checkskill(sd,CR_SPEARQUICKEN) : skill_get_max(CR_SPEARQUICKEN)) * 50; + skillratio += -100 + 400 * skill_lv + ((sd) ? pc_checkskill(sd,CR_SPEARQUICKEN) * 50 : 0); RE_LVL_DMOD(100); break; case LG_OVERBRAND_BRANDISH: - skillratio = 100 * skill_lv + status_get_str(src) + status_get_dex(src); + skillratio += -100 + 300 * skill_lv + status_get_str(src) + status_get_dex(src); RE_LVL_DMOD(100); break; case LG_OVERBRAND_PLUSATK: // Only Piercing and Swing damage get RE_LVL_DMOD bonus damage - skillratio = 100 * skill_lv + rnd()%90 + 10; + skillratio += -100 + 200 * skill_lv + rnd()%90 + 10; break; case LG_RAYOFGENESIS: - skillratio = 300 + 300 * skill_lv; + skillratio += 200 + 300 * skill_lv; RE_LVL_DMOD(100); break; case LG_EARTHDRIVE: @@ -3878,101 +3891,116 @@ static int battle_calc_attack_skill_ratio(struct Damage wd, struct block_list *s RE_LVL_DMOD(100); break; case LG_HESPERUSLIT: - skillratio = 120 * skill_lv; - if( sc && sc->data[SC_BANDING] ) - skillratio += 200 * sc->data[SC_BANDING]->val2; - RE_LVL_DMOD(100); - if( sc && sc->data[SC_BANDING] && sc->data[SC_BANDING]->val2 > 5 ) - skillratio = skillratio * 150 / 100; - if( sc && sc->data[SC_INSPIRATION] ) - skillratio += 600; - break; - case SR_DRAGONCOMBO: - skillratio += 40 * skill_lv; - RE_LVL_DMOD(100); - break; - case SR_SKYNETBLOW: - //ATK [{(Skill Level x 80) + (Caster AGI)} x Caster Base Level / 100] % - skillratio = 80 * skill_lv + status_get_agi(src); - if( sc && sc->data[SC_COMBO] && sc->data[SC_COMBO]->val1 == SR_DRAGONCOMBO )//ATK [{(Skill Level x 100) + (Caster AGI) + 150} x Caster Base Level / 100] % - skillratio = 100 * skill_lv + status_get_agi(src) + 150; - RE_LVL_DMOD(100); + if (sc) { + if (sc->data[SC_INSPIRATION]) + skillratio += 1100; + if (sc->data[SC_BANDING]) { + skillratio += -100 + 120 * skill_lv + 200 * sc->data[SC_BANDING]->val2; + if (sc->data[SC_BANDING]->val2 > 5) + skillratio = skillratio * 150 / 100; + } + RE_LVL_DMOD(100); + } break; case SR_EARTHSHAKER: - if( tsc && (tsc->data[SC_HIDING] || tsc->data[SC_CLOAKING] || // [(Skill Level x 150) x (Caster Base Level / 100) + (Caster INT x 3)] % - tsc->data[SC_CHASEWALK] || tsc->data[SC_CLOAKINGEXCEED] || tsc->data[SC__INVISIBILITY]) ){ - skillratio = 150 * skill_lv; + if( tsc && (tsc->data[SC_HIDING] || tsc->data[SC_CLOAKING] || + tsc->data[SC_CHASEWALK] || tsc->data[SC_CLOAKINGEXCEED] || + tsc->data[SC__INVISIBILITY]) ) + { //[(Skill Level x 150) x (Caster Base Level / 100) + (Caster INT x 3)] % + skillratio += -100 + 150 * skill_lv; RE_LVL_DMOD(100); skillratio += status_get_int(src) * 3; - }else{ //[(Skill Level x 50) x (Caster Base Level / 100) + (Caster INT x 2)] % - skillratio = 50 * skill_lv; + } else { //[(Skill Level x 50) x (Caster Base Level / 100) + (Caster INT x 2)] % + skillratio += -100 + 50 * skill_lv; RE_LVL_DMOD(100); skillratio += status_get_int(src) * 2; } break; - case SR_FALLENEMPIRE:// ATK [(Skill Level x 150 + 100) x Caster Base Level / 150] % - skillratio += 150 *skill_lv; + + case SR_DRAGONCOMBO: + case SR_FLASHCOMBO_ATK_STEP1: + skillratio += 40 * skill_lv; + RE_LVL_DMOD(100); + break; + case SR_FALLENEMPIRE: + case SR_FLASHCOMBO_ATK_STEP2: + // ATK [(Skill Level x 150 + 100) x Caster Base Level / 150] % + skillratio += 150 * skill_lv; RE_LVL_DMOD(150); break; - case SR_TIGERCANNON:// ATK [((Caster consumed HP + SP) / 4) x Caster Base Level / 100] % + case SR_TIGERCANNON: + case SR_FLASHCOMBO_ATK_STEP3: { - int hp = (int64)status_get_max_hp(src) * (10 + 2 * skill_lv) / 100, - sp = (int64)status_get_max_sp(src) * (5 + 1 * skill_lv) / 100; - if( sc && sc->data[SC_COMBO] && sc->data[SC_COMBO]->val1 == SR_FALLENEMPIRE ) // ATK [((Caster consumed HP + SP) / 2) x Caster Base Level / 100] % - skillratio = ((int64)hp+sp) / 2; + int hp = sstatus->max_hp * (10 + 2 * skill_lv) / 100, // skill_get_hp_rate(SR_TIGERCANNON, skill_lv) + sp = sstatus->max_sp * (5 + 1 * skill_lv) / 100; // skill_get_sp_rate(SR_TIGERCANNON, skill_lv) + if( sc && sc->data[SC_COMBO] && sc->data[SC_COMBO]->val1 == SR_FALLENEMPIRE ) + // Base_Damage = [((Caster consumed HP + SP) / 2) x Caster Base Level / 100] % + skillratio += ((hp+sp) / 2); else - skillratio = ((int64)hp+sp) / 4; + // Base_Damage = [((Caster consumed HP + SP) / 4) x Caster Base Level / 100] % + skillratio += ((hp+sp) / 4); RE_LVL_DMOD(100); } break; + case SR_SKYNETBLOW: + case SR_FLASHCOMBO_ATK_STEP4: + if( sc && sc->data[SC_COMBO] && sc->data[SC_COMBO]->val1 == SR_DRAGONCOMBO ) + //ATK [{(Skill Level x 100) + (Caster AGI) + 150} x Caster Base Level / 100] % + skillratio += (100 * skill_lv + sstatus->agi + 150); + else + //ATK [{(Skill Level x 80) + (Caster AGI)} x Caster Base Level / 100] % + skillratio += (80 * skill_lv + sstatus->agi); + RE_LVL_DMOD(100); + break; + case SR_RAMPAGEBLASTER: - skillratio = 20 * skill_lv * ((sd) ? sd->spiritball_old : 5); - if( sc && sc->data[SC_EXPLOSIONSPIRITS] ) { - skillratio += sc->data[SC_EXPLOSIONSPIRITS]->val1 * 20; + if (sc && sc->data[SC_EXPLOSIONSPIRITS]) { + skillratio += -100 + (20 * sc->data[SC_EXPLOSIONSPIRITS]->val1 + 20 * skill_lv) * ((sd) ? sd->spiritball_old : 1); RE_LVL_DMOD(120); } else { + skillratio += -100 + (20 * skill_lv) * ((sd) ? sd->spiritball_old : 1); RE_LVL_DMOD(150); } break; case SR_KNUCKLEARROW: - if( wd.miscflag&4 ){ // ATK [(Skill Level x 150) + (1000 x Target current weight / Maximum weight) + (Target Base Level x 5) x (Caster Base Level / 150)] % - skillratio = 150 * skill_lv + status_get_lv(target) * 5; - if( tsd && tsd->weight ) - skillratio += 100 * (tsd->weight / tsd->max_weight); + if (wd.miscflag&4) { // ATK [(Skill Level x 150) + (1000 x Target current weight / Maximum weight) + (Target Base Level x 5) x (Caster Base Level / 150)] % + skillratio += -100 + 150 * skill_lv + status_get_lv(target) * 5; + if (tsd && tsd->weight) + skillratio += 100 * tsd->weight / tsd->max_weight; RE_LVL_DMOD(150); } else { // ATK [(Skill Level x 100 + 500) x Caster Base Level / 100] % - skillratio += 400 + (100 * skill_lv); + skillratio += 400 + 100 * skill_lv; RE_LVL_DMOD(100); } break; case SR_WINDMILL: // ATK [(Caster Base Level + Caster DEX) x Caster Base Level / 100] % - skillratio = status_get_lv(src) + status_get_dex(src); + skillratio += -100 + status_get_lv(src) + status_get_dex(src); RE_LVL_DMOD(100); break; case SR_GATEOFHELL: - if( sc && sc->data[SC_COMBO] && sc->data[SC_COMBO]->val1 == SR_FALLENEMPIRE ) - skillratio += 700 * skill_lv; + if (sc && sc->data[SC_COMBO] && sc->data[SC_COMBO]->val1 == SR_FALLENEMPIRE) + skillratio += -100 + 800 * skill_lv; else - skillratio += 400 * skill_lv; + skillratio += -100 + 500 * skill_lv; RE_LVL_DMOD(100); break; case SR_GENTLETOUCH_QUIET: - skillratio = 100 * skill_lv + status_get_dex(src); + skillratio += -100 + 100 * skill_lv + status_get_dex(src); RE_LVL_DMOD(100); break; case SR_HOWLINGOFLION: - skillratio = 300 * skill_lv; + skillratio += -100 + 300 * skill_lv; RE_LVL_DMOD(150); break; case SR_RIDEINLIGHTNING: // ATK [{(Skill Level x 200) + Additional Damage} x Caster Base Level / 100] % - if( (sstatus->rhw.ele) == ELE_WIND || (sstatus->lhw.ele) == ELE_WIND ) - skillratio = skill_lv * 50; - skillratio = 200 * skill_lv; + skillratio += -100 + 200 * skill_lv; + if ((sstatus->rhw.ele) == ELE_WIND || (sstatus->lhw.ele) == ELE_WIND) + skillratio += skill_lv * 50; RE_LVL_DMOD(100); break; case WM_REVERBERATION_MELEE: // ATK [{(Skill Level x 100) + 300} x Caster Base Level / 100] - skillratio += 200 + 100 * ((sd) ? pc_checkskill(sd, WM_REVERBERATION) : skill_get_max(WM_REVERBERATION)); + skillratio += 200 + 100 * ((sd) ? pc_checkskill(sd, WM_REVERBERATION) : 1); RE_LVL_DMOD(100); break; case WM_SEVERE_RAINSTORM_MELEE: @@ -3982,32 +4010,29 @@ static int battle_calc_attack_skill_ratio(struct Damage wd, struct block_list *s break; case WM_GREAT_ECHO: skillratio += 300 + 200 * skill_lv; - if( sd ) { - uint16 lv = skill_lv; - skillratio += 100 * skill_check_pc_partner(sd,skill_id,&lv,skill_get_splash(skill_id,skill_lv),0); + if (sd) { + int chorusbonus = battle_calc_chorusbonus(sd); + + // Chorus bonus don't count the first 2 Minstrels/Wanderers and only increases when their are 3 or more. [Rytech] + if (chorusbonus >= 1 && chorusbonus <= 5) + skillratio += 100<<(chorusbonus-1); // 1->100; 2->200; 3->400; 4->800; 5->1600 } RE_LVL_DMOD(100); break; - case WM_SOUND_OF_DESTRUCTION: - skillratio = (1000 * skill_lv) + (((sd) ? pc_checkskill(sd, WM_LESSON) : skill_get_max(WM_LESSON)) * status_get_int(src)); - break; case GN_CART_TORNADO: { // ATK [( Skill Level x 50 ) + ( Cart Weight / ( 150 - Caster Base STR ))] + ( Cart Remodeling Skill Level x 50 )] % - int strbonus = status_get_base_status(src)->str; // Only use base STR - - if(strbonus > 130) - strbonus = 130; - skillratio = 50 * skill_lv; - if(sd && sd->cart_weight) - skillratio += (int)(sd->cart_weight / 10. / (150. - strbonus)) + pc_checkskill(sd,GN_REMODELING_CART) * 50; + skillratio += -100 + 50 * skill_lv; + if(sd && sd->cart_weight) { + int strbonus = status_get_base_status(src)->str; // Only use base STR + skillratio += sd->cart_weight / 10 / (150 - min(strbonus,120)) + pc_checkskill(sd,GN_REMODELING_CART) * 50; + } } break; case GN_CARTCANNON: // ATK [{( Cart Remodeling Skill Level x 50 ) x ( INT / 40 )} + ( Cart Cannon Skill Level x 60 )] % - skillratio = 60 * skill_lv; - if( sd ) skillratio += pc_checkskill(sd, GN_REMODELING_CART) * 50 * status_get_int(src) / 40; + skillratio += -100 + 60 * skill_lv + ((sd) ? pc_checkskill(sd, GN_REMODELING_CART) : 1) * 50 * status_get_int(src) / 40; break; case GN_SPORE_EXPLOSION: - skillratio = (100 * skill_lv) + (200 + status_get_int(src)); + skillratio += 100 + status_get_int(src) + 100 * skill_lv; RE_LVL_DMOD(100); break; case GN_WALLOFTHORN: @@ -4020,35 +4045,38 @@ static int battle_calc_attack_skill_ratio(struct Damage wd, struct block_list *s if( sd ) { switch( sd->itemid ) { case ITEMID_APPLE_BOMB: - skillratio = status_get_str(src) + status_get_dex(src) + 300; + skillratio += 200 + status_get_str(src) + status_get_dex(src); break; - case ITEMID_MELON_BOMB: - skillratio = status_get_str(src) + status_get_dex(src) + 500; case ITEMID_COCONUT_BOMB: case ITEMID_PINEAPPLE_BOMB: + skillratio += 700 + status_get_str(src) + status_get_dex(src); + break; + case ITEMID_MELON_BOMB: + skillratio += 400 + status_get_str(src) + status_get_dex(src); + break; case ITEMID_BANANA_BOMB: - skillratio = status_get_str(src) + status_get_dex(src) + 800; + skillratio += 777 + status_get_str(src) + status_get_dex(src); break; case ITEMID_BLACK_LUMP: - skillratio = (status_get_str(src) + status_get_agi(src) + status_get_dex(src)) / 3; - break; + skillratio += -100 + (status_get_str(src) + status_get_agi(src) + status_get_dex(src)) / 3; + break; case ITEMID_BLACK_HARD_LUMP: - skillratio = (status_get_str(src) + status_get_agi(src) + status_get_dex(src)) / 2; - break; + skillratio += -100 + (status_get_str(src) + status_get_agi(src) + status_get_dex(src)) / 2; + break; case ITEMID_VERY_HARD_LUMP: - skillratio = status_get_str(src) + status_get_agi(src) + status_get_dex(src); - break; + skillratio += -100 + status_get_str(src) + status_get_agi(src) + status_get_dex(src); + break; } - } else - skillratio += 300; // Bombs + RE_LVL_DMOD(100); + } break; case SO_VARETYR_SPEAR://ATK [{( Striking Level x 50 ) + ( Varetyr Spear Skill Level x 50 )} x Caster Base Level / 100 ] % - skillratio = 50 * skill_lv + ((sd) ? pc_checkskill(sd, SO_STRIKING) * 50 : skill_get_max(SO_STRIKING)); + skillratio += -100 + 50 * skill_lv + ((sd) ? pc_checkskill(sd, SO_STRIKING) * 50 : 0); RE_LVL_DMOD(100); - if( sc && sc->data[SC_BLAST_OPTION] ) + if (sc && sc->data[SC_BLAST_OPTION]) skillratio += (sd ? sd->status.job_level * 5 : 0); break; - // Physical Elemantal Spirits Attack Skills + // Physical Elemantal Spirits Attack Skills case EL_CIRCLE_OF_FIRE: case EL_FIRE_BOMB_ATK: case EL_STONE_RAIN: @@ -4077,27 +4105,27 @@ static int battle_calc_attack_skill_ratio(struct Damage wd, struct block_list *s skillratio += 700; break; case KO_JYUMONJIKIRI: - skillratio = 150 * skill_lv; + skillratio += -100 + 150 * skill_lv; RE_LVL_DMOD(120); if(tsc && tsc->data[SC_JYUMONJIKIRI]) skillratio += skill_lv * status_get_lv(src); break; case KO_HUUMARANKA: - skillratio = 150 * skill_lv + sstatus->agi + sstatus->dex + (sd ? pc_checkskill(sd,NJ_HUUMA) * 100 : 0); + skillratio += -100 + 150 * skill_lv + sstatus->agi + sstatus->dex + (sd ? pc_checkskill(sd,NJ_HUUMA) * 100 : 0); break; case KO_SETSUDAN: - skillratio += 100 * (skill_lv-1); + skillratio += 100 * (skill_lv - 1); RE_LVL_DMOD(100); if(tsc && tsc->data[SC_SPIRIT]) skillratio += 200 * tsc->data[SC_SPIRIT]->val1; break; case KO_BAKURETSU: - skillratio = (sd ? pc_checkskill(sd,NJ_TOBIDOUGU) : 1) * (50 + sstatus->dex / 4) * skill_lv * 4 / 10; + skillratio += -100 + (sd ? pc_checkskill(sd,NJ_TOBIDOUGU) : 1) * (50 + sstatus->dex / 4) * skill_lv * 4 / 10; RE_LVL_DMOD(120); skillratio += 10 * (sd ? sd->status.job_level : 1); break; case KO_MAKIBISHI: - skillratio = 20 * skill_lv; + skillratio += -100 + 20 * skill_lv; break; case MH_NEEDLE_OF_PARALYZE: skillratio += 600 + 100 * skill_lv; @@ -4106,34 +4134,31 @@ static int battle_calc_attack_skill_ratio(struct Damage wd, struct block_list *s skillratio += 400 + 100 * skill_lv * status_get_lv(src) / 150; break; case MH_LAVA_SLIDE: - skillratio = 70 * skill_lv; + skillratio += -100 + 70 * skill_lv; break; case MH_SONIC_CRAW: - skillratio = 40 * skill_lv; + skillratio += -100 + 40 * skill_lv * status_get_lv(src) / 150; break; case MH_SILVERVEIN_RUSH: - skillratio = 150 * skill_lv; + skillratio += -100 + 150 * skill_lv * status_get_lv(src) / 100; break; case MH_MIDNIGHT_FRENZY: - skillratio = 300 * skill_lv; + skillratio += -100 + 300 * skill_lv * status_get_lv(src) / 150; break; case MH_TINDER_BREAKER: - skillratio = 100 * skill_lv; + skillratio += -100 + (100 * skill_lv + 3 * status_get_str(src)) * status_get_lv(src) / 120; break; case MH_CBC: - skillratio = 400 * skill_lv; //! TODO: This doesn't seem to be a ratio, but straight damage? + skillratio += 300 * skill_lv + 4 * status_get_lv(src); break; case MH_MAGMA_FLOW: - skillratio += -100 + 100 * skill_lv + 3 * status_get_lv(src); - skillratio = (skillratio * status_get_lv(src)) / 120; + skillratio += -100 + (100 * skill_lv + 3 * status_get_lv(src)) * status_get_lv(src) / 120; break; case RL_MASS_SPIRAL: - // 200%:400%:600%:800%:1000% - skillratio += -100 + (200 * skill_lv); + skillratio += -100 + 200 * skill_lv; break; case RL_FIREDANCE: - // 100%:200%:300%:400%:500% (+Level ??) - skillratio += -100 + (100 * skill_lv); + skillratio += -100 + 100 * skill_lv; skillratio += (skillratio * status_get_lv(src)) / 300; //(custom) break; case RL_BANISHING_BUSTER: @@ -4142,47 +4167,44 @@ static int battle_calc_attack_skill_ratio(struct Damage wd, struct block_list *s case RL_S_STORM: skillratio += -100 + (200 * skill_lv); //(custom) break; - case RL_SLUGSHOT: - { + case RL_SLUGSHOT: { uint16 w = 50; int16 idx = -1; + if (sd && (idx = sd->equip_index[EQI_AMMO]) >= 0 && sd->inventory_data[idx]) - w = sd->inventory_data[idx]->weight; - w /= 10; + w = sd->inventory_data[idx]->weight / 10; skillratio += -100 + (max(w,1) * skill_lv * 30); //(custom) } break; case RL_D_TAIL: - // 3000%:3500%:4000%:4500%:5000% - skillratio += -100 + (2500 + 500 * skill_lv ); + skillratio += -100 + (2500 + 500 * skill_lv); break; case RL_R_TRIP: - skillratio += -100 + (150 * skill_lv); //(custom) + skillratio += -100 + 150 * skill_lv; //(custom) break; case RL_R_TRIP_PLUSATK: - skillratio += -100 + (50 * skill_lv); //(custom) + skillratio += -100 + 100 * skill_lv + rnd()%10 + 100; //(custom) break; case RL_H_MINE: - // 400%:600%:800%:1000%:1200% - skillratio += -100 + (200 + 200 * skill_lv); + skillratio += 100 + 200 * skill_lv; //If damaged by Flicker, explosion damage (800%:1100%:1400%:1700%:2000%) if (sd && sd->flicker) - skillratio += 300 + (100 * skill_lv); + skillratio += 800 + (skill_lv - 1) * 300; break; case RL_HAMMER_OF_GOD: //! TODO: Please check the right formula. [Cydh] //kRO Update 2013-07-24. Ratio: 1600+lv*800 //kRO Update 2014-02-12. Coins increase the damage - skillratio += -100 + (1600 + skill_lv * 800) + ((sd) ? sd->spiritball_old : 10) * 20; //(custom) + skillratio += -100 + (2400 + (skill_lv - 1) * 800) + 10 *((sd) ? sd->spiritball_old : 1); //(custom) break; case RL_QD_SHOT: skillratio += -100 + (max(pc_checkskill(sd,GS_CHAINACTION),1) * status_get_dex(src) / 5); //(custom) break; case RL_FIRE_RAIN: - skillratio += -100 + 2000 + status_get_dex(src); //(custom) //kRO Update 2013-07-24. 2,000% + caster's DEX (?) [Cydh] + skillratio += -100 + 2000 + (200 * (skill_lv - 1)) + status_get_dex(src); //(custom) //kRO Update 2013-07-24. 2,000% + caster's DEX (?) [Cydh] break; case RL_AM_BLAST: - skillratio += -100 + (skill_lv * status_get_dex(src) / 2); //(custom) + skillratio += -100 + 300 * skill_lv + status_get_dex(src) / 5; //(custom) break; } return skillratio; @@ -4196,37 +4218,39 @@ static int battle_calc_attack_skill_ratio(struct Damage wd, struct block_list *s * Initial refactoring by Baalberith * Refined and optimized by helvetica */ -static int battle_calc_skill_constant_addition(struct Damage wd, struct block_list *src,struct block_list *target,uint16 skill_id,uint16 skill_lv) +static int64 battle_calc_skill_constant_addition(struct Damage wd, struct block_list *src,struct block_list *target,uint16 skill_id,uint16 skill_lv) { struct map_session_data *sd = BL_CAST(BL_PC, src); struct map_session_data *tsd = BL_CAST(BL_PC, target); struct status_change *sc = status_get_sc(src); struct status_data *sstatus = status_get_status_data(src); struct status_data *tstatus = status_get_status_data(target); - int atk = 0; + int64 atk = 0; //Constant/misc additions from skills switch (skill_id) { case MO_EXTREMITYFIST: atk = 250 + 150 * skill_lv; break; +#ifndef RENEWAL case GS_MAGICALBULLET: - if(sstatus->matk_max>sstatus->matk_min) - atk = sstatus->matk_min+rnd()%(sstatus->matk_max-sstatus->matk_min); + if (sstatus->matk_max > sstatus->matk_min) + atk = sstatus->matk_min + rnd()%(sstatus->matk_max - sstatus->matk_min); else atk = sstatus->matk_min; break; +#endif case NJ_SYURIKEN: - atk = 4*skill_lv; + atk = 4 * skill_lv; break; #ifdef RENEWAL case HT_FREEZINGTRAP: if(sd) - atk = ( 40 * pc_checkskill(sd, RA_RESEARCHTRAP) ); + atk = 40 * pc_checkskill(sd, RA_RESEARCHTRAP); break; #endif case RA_WUGDASH: - if( sd && sd->weight ) + if (sd && sd->weight) atk = (sd->weight / 8) + (30 * pc_checkskill(sd,RA_TOOTHOFWUG)); if (sc && sc->data[SC_DANCEWITHWUG]) atk += 10 * sc->data[SC_DANCEWITHWUG]->val1 * (2 + battle_calc_chorusbonus(sd)); @@ -4234,7 +4258,7 @@ static int battle_calc_skill_constant_addition(struct Damage wd, struct block_li case RA_WUGSTRIKE: case RA_WUGBITE: if(sd) - atk = (30 * pc_checkskill(sd, RA_TOOTHOFWUG)); + atk = 30 * pc_checkskill(sd, RA_TOOTHOFWUG); if (sc && sc->data[SC_DANCEWITHWUG]) atk += 10 * sc->data[SC_DANCEWITHWUG]->val1 * (2 + battle_calc_chorusbonus(sd)); break; @@ -4251,16 +4275,20 @@ static int battle_calc_skill_constant_addition(struct Damage wd, struct block_li atk = damagevalue; } break; - case SR_TIGERCANNON: // (Tiger Cannon skill level x 240) + (Target Base Level x 40) - if( sc && sc->data[SC_COMBO] && sc->data[SC_COMBO]->val1 == SR_FALLENEMPIRE ) // (Tiger Cannon skill level x 500) + (Target Base Level x 40) + case SR_TIGERCANNON: + case SR_FLASHCOMBO_ATK_STEP3: + // (Tiger Cannon skill level x 240) + (Target Base Level x 40) + if( skill_id == SR_FLASHCOMBO_ATK_STEP3 || (sc && sc->data[SC_COMBO] && sc->data[SC_COMBO]->val1 == SR_FALLENEMPIRE) ) atk = ( skill_lv * 500 + status_get_lv(target) * 40 ); else atk = ( skill_lv * 240 + status_get_lv(target) * 40 ); break; - case SR_FALLENEMPIRE:// [(Target Size value + Skill Level - 1) x Caster STR] + [(Target current weight x Caster DEX / 120)] - atk = ( ((tstatus->size+1)*2 + skill_lv - 1) * status_get_str(src)); + case SR_FALLENEMPIRE: + case SR_FLASHCOMBO_ATK_STEP2: + // [(Target Size value + Skill Level - 1) x Caster STR] + [(Target current weight x Caster DEX / 120)] + atk = ( ((tstatus->size+1)*2 + skill_lv - 1) * sstatus->str); if( tsd && tsd->weight ) - atk += ( (tsd->weight/10) * status_get_dex(src) / 120 ); + atk += ( (tsd->weight/10) * sstatus->dex / 120 ); else atk += ( status_get_lv(target) * 50 ); //mobs break; @@ -4286,17 +4314,12 @@ struct Damage battle_attack_sc_bonus(struct Damage wd, struct block_list *src, s #endif int inf3 = skill_get_inf3(skill_id); - if (sd) { - int type; - - // Kagerou/Oboro Earth Charm effect +15% wATK - ARR_FIND(1, 6, type, sd->talisman[type] > 0); - if (type == 2) { //KO Earth Charm effect +15% wATK - ATK_ADDRATE(wd.damage, wd.damage2, 15 * sd->talisman[type]); + // Kagerou/Oboro Earth Charm effect +15% wATK + if(sd && sd->spiritcharm_type == CHARM_TYPE_LAND && sd->spiritcharm > 0) { + ATK_ADDRATE(wd.damage, wd.damage2, 15 * sd->spiritcharm); #ifdef RENEWAL - ATK_ADDRATE(wd.weaponAtk, wd.weaponAtk2, 15 * sd->talisman[type]); + ATK_ADDRATE(wd.weaponAtk, wd.weaponAtk2, 15 * sd->spiritcharm); #endif - } } //The following are applied on top of current damage and are stackable. @@ -4410,6 +4433,14 @@ struct Damage battle_attack_sc_bonus(struct Damage wd, struct block_list *src, s break; } } + + if (sc->data[SC_FLASHCOMBO]) { + ATK_ADD(wd.damage, wd.damage2, sc->data[SC_FLASHCOMBO]->val2); +#ifdef RENEWAL + ATK_ADD(wd.equipAtk, wd.equipAtk2, sc->data[SC_FLASHCOMBO]->val2); +#endif + } + if((wd.flag&(BF_LONG|BF_MAGIC)) == BF_LONG) { // Monster Transformation bonus if (sc->data[SC_MTF_RANGEATK]) { ATK_ADDRATE(wd.damage, wd.damage2, sc->data[SC_MTF_RANGEATK]->val1); @@ -4453,7 +4484,6 @@ struct Damage battle_calc_defense_reduction(struct Damage wd, struct block_list #endif if (sd) { - int type; int i = sd->ignore_def_by_race[tstatus->race] + sd->ignore_def_by_race[RC_ALL]; if (i) { @@ -4462,11 +4492,11 @@ struct Damage battle_calc_defense_reduction(struct Damage wd, struct block_list def2 -= def2 * i / 100; } - //Kagerou/Oboro Earth Charm effect +5% eDEF - ARR_FIND(1, 6, type, sd->talisman[type] > 0); - if (type == 2) { - short j = 5 * sd->talisman[type]; - def1 = (def1 * (100 + j)) / 100; + //Kagerou/Oboro Earth Charm effect +10% eDEF + if(sd->spiritcharm_type == CHARM_TYPE_LAND && sd->spiritcharm > 0) { + short i = 10 * sd->spiritcharm; + + def1 = (def1 * (100 + i)) / 100; } } @@ -4822,7 +4852,7 @@ struct Damage battle_calc_attack_gvg_bg(struct Damage wd, struct block_list *src rdelay = clif_damage(src, (!d_bl) ? src : d_bl, tick, wd.amotion, sstatus->dmotion, rdamage, 1, DMG_ENDURE, 0); if( tsd ) - battle_drain(tsd, src, rdamage, rdamage, sstatus->race, sstatus->class_); + battle_drain(tsd, src, rdamage, rdamage, sstatus->race, sstatus->class_, is_infinite_defense(src,wd.flag)); //Use Reflect Shield to signal this kind of skill trigger [Skotlex] battle_delay_damage(tick, wd.amotion, target, (!d_bl) ? src : d_bl, 0, CR_REFLECTSHIELD, 0, rdamage, ATK_DEF, rdelay, true); skill_additional_effect(target, (!d_bl) ? src : d_bl, CR_REFLECTSHIELD, 1, BF_WEAPON|BF_SHORT|BF_NORMAL, ATK_DEF, tick); @@ -5083,11 +5113,11 @@ void battle_do_reflect(int attack_type, struct Damage *wd, struct block_list* sr struct block_list *d_bl = battle_check_devotion(src); if( attack_type == BF_WEAPON && tsc->data[SC_REFLECTDAMAGE] ) // Don't reflect your own damage (Grand Cross) - map_foreachinshootrange(battle_damage_area,target,skill_get_splash(LG_REFLECTDAMAGE,1),BL_CHAR,tick,target,wd->amotion,sstatus->dmotion,rdamage,status_get_race(target)); + map_foreachinshootrange(battle_damage_area,target,skill_get_splash(LG_REFLECTDAMAGE,1),BL_CHAR,tick,target,wd->amotion,sstatus->dmotion,rdamage,wd->flag); else if( attack_type == BF_WEAPON || attack_type == BF_MISC) { rdelay = clif_damage(src, (!d_bl) ? src : d_bl, tick, wd->amotion, sstatus->dmotion, rdamage, 1, DMG_ENDURE, 0); if( tsd ) - battle_drain(tsd, src, rdamage, rdamage, sstatus->race, sstatus->class_); + battle_drain(tsd, src, rdamage, rdamage, sstatus->race, sstatus->class_, is_infinite_defense(src,wd->flag)); // It appears that official servers give skill reflect damage a longer delay battle_delay_damage(tick, wd->amotion, target, (!d_bl) ? src : d_bl, 0, CR_REFLECTSHIELD, 0, rdamage, ATK_DEF, rdelay ,true); skill_additional_effect(target, (!d_bl) ? src : d_bl, CR_REFLECTSHIELD, 1, BF_WEAPON|BF_SHORT|BF_NORMAL, ATK_DEF, tick); @@ -5112,6 +5142,7 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src, struct bl struct status_change *tsc = status_get_sc(target); struct status_data *tstatus = status_get_status_data(target); int right_element, left_element; + bool infdef = false; memset(&wd,0,sizeof(wd)); @@ -5152,8 +5183,9 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src, struct bl // check if we're landing a hit if(!is_attack_hitting(wd, src, target, skill_id, skill_lv, true)) wd.dmg_lv = ATK_FLEE; - else if(!is_infinite_defense(target, wd.flag)) { //no need for math against plants - int ratio, i = 0; + else if(wd.miscflag&8 || !(infdef = is_infinite_defense(target, wd.flag))) { //no need for math against plants + int64 ratio = 0; + int i = 0; wd = battle_calc_skill_base_damage(wd, src, target, skill_id, skill_lv); // base skill damage ratio = battle_calc_attack_skill_ratio(wd, src, target, skill_id, skill_lv); // skill level ratios @@ -5326,6 +5358,7 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src, struct bl switch(skill_id) { #ifdef RENEWAL case NJ_ISSEN: + case GS_MAGICALBULLET: case ASC_BREAKER: case CR_ACIDDEMONSTRATION: case GN_FIRE_EXPANSION_ACID: @@ -5394,7 +5427,7 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src, struct bl DAMAGE_DIV_FIX_RENEWAL(wd, wd.div_); #endif // only do 1 dmg to plant, no need to calculate rest - if(is_infinite_defense(target, wd.flag)) + if(!(wd.miscflag&8) && infdef) return battle_calc_attack_plant(wd, src, target, skill_id, skill_lv); //Apply DAMAGE_DIV_FIX and check for min damage @@ -5405,6 +5438,7 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src, struct bl switch (skill_id) { #ifdef RENEWAL case NJ_ISSEN: + case GS_MAGICALBULLET: case ASC_BREAKER: case CR_ACIDDEMONSTRATION: case GN_FIRE_EXPANSION_ACID: @@ -5449,26 +5483,25 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list struct { unsigned imdef : 1; unsigned infdef : 1; - } flag; + } flag; memset(&ad,0,sizeof(ad)); memset(&flag,0,sizeof(flag)); - if(src==NULL || target==NULL) - { + if (src == NULL || target == NULL) { nullpo_info(NLP_MARK); return ad; } //Initial Values ad.damage = 1; - ad.div_=skill_get_num(skill_id,skill_lv); - ad.amotion=skill_get_inf(skill_id)&INF_GROUND_SKILL?0:sstatus->amotion; //Amotion should be 0 for ground skills. - ad.dmotion=tstatus->dmotion; - ad.blewcount = skill_get_blewcount(skill_id,skill_lv); - ad.flag=BF_MAGIC|BF_SKILL; - ad.dmg_lv=ATK_DEF; + ad.div_ = skill_get_num(skill_id,skill_lv); + ad.amotion = (skill_get_inf(skill_id)&INF_GROUND_SKILL ? 0 : sstatus->amotion); //Amotion should be 0 for ground skills. + ad.dmotion = tstatus->dmotion; + ad.blewcount = skill_get_blewcount(skill_id, skill_lv); + ad.flag = BF_MAGIC|BF_SKILL; + ad.dmg_lv = ATK_DEF; nk = skill_get_nk(skill_id); - flag.imdef = nk&NK_IGNORE_DEF?1:0; + flag.imdef = (nk&NK_IGNORE_DEF ? 1 : 0); sd = BL_CAST(BL_PC, src); tsd = BL_CAST(BL_PC, target); @@ -5478,36 +5511,35 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list //Initialize variables that will be used afterwards s_ele = skill_get_ele(skill_id, skill_lv); - if (s_ele == -1){ // pl=-1 : the skill takes the weapon's element + if (s_ele == -1) { // pl=-1 : the skill takes the weapon's element s_ele = sstatus->rhw.ele; - if( sd ){ //Summoning 10 talisman will endow your weapon - ARR_FIND(1, 6, i, sd->talisman[i] >= 10); - if( i < 5 ) s_ele = i; - } - }else if (s_ele == -2) //Use status element + if(sd && sd->spiritcharm_type != CHARM_TYPE_NONE && sd->spiritcharm >= MAX_SPIRITCHARM) + s_ele = sd->spiritcharm_type; // Summoning 10 spiritcharm will endow your weapon + } else if (s_ele == -2) //Use status element s_ele = status_get_attack_sc_element(src,status_get_sc(src)); - else if( s_ele == -3 ) //Use random element + else if (s_ele == -3) //Use random element s_ele = rnd()%ELE_ALL; - switch( skill_id ) { + switch(skill_id) { case LG_SHIELDSPELL: if (skill_lv == 2) s_ele = ELE_HOLY; break; case SO_PSYCHIC_WAVE: if( sc && sc->count ) { - if( sc->data[SC_HEATER_OPTION] ) s_ele = sc->data[SC_HEATER_OPTION]->val3; - else if( sc->data[SC_COOLER_OPTION] ) s_ele = sc->data[SC_COOLER_OPTION]->val3; - else if( sc->data[SC_BLAST_OPTION] ) s_ele = sc->data[SC_BLAST_OPTION]->val3; - else if( sc->data[SC_CURSED_SOIL_OPTION] ) s_ele = sc->data[SC_CURSED_SOIL_OPTION]->val3; + if( sc->data[SC_HEATER_OPTION] ) + s_ele = sc->data[SC_HEATER_OPTION]->val3; + else if( sc->data[SC_COOLER_OPTION] ) + s_ele = sc->data[SC_COOLER_OPTION]->val3; + else if( sc->data[SC_BLAST_OPTION] ) + s_ele = sc->data[SC_BLAST_OPTION]->val3; + else if( sc->data[SC_CURSED_SOIL_OPTION] ) + s_ele = sc->data[SC_CURSED_SOIL_OPTION]->val3; } break; case KO_KAIHOU: - if(sd) { - ARR_FIND(1, 6, i, sd->talisman[i] > 0); - if(i < 5) - s_ele = i; - } + if(sd && sd->spiritcharm_type != CHARM_TYPE_NONE && sd->spiritcharm > 0) + s_ele = sd->spiritcharm_type; break; } @@ -5523,8 +5555,7 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list //Infinite defense (plant mode) flag.infdef = is_infinite_defense(target, ad.flag)?1:0; - switch(skill_id) - { + switch(skill_id) { case MG_FIREWALL: if ( tstatus->def_ele == ELE_FIRE || battle_check_undead(tstatus->race, tstatus->def_ele) ) ad.blewcount = 0; //No knockback @@ -5535,21 +5566,20 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list break; } - if (!flag.infdef) //No need to do the math for plants - { - unsigned int skillratio = 100; //Skill dmg modifiers. + if (!flag.infdef) { //No need to do the math for plants + unsigned int skillratio = 100; //Skill dmg modifiers. #ifdef RENEWAL ad.damage = 0; //reinitialize.. #endif //MATK_RATE scales the damage. 100 = no change. 50 is halved, 200 is doubled, etc -#define MATK_RATE( a ) { ad.damage= ad.damage*(a)/100; } +#define MATK_RATE(a) { ad.damage = ad.damage * (a) / 100; } //Adds dmg%. 100 = +100% (double) damage. 10 = +10% damage -#define MATK_ADDRATE( a ) { ad.damage+= ad.damage*(a)/100; } +#define MATK_ADDRATE(a) { ad.damage += ad.damage * (a) / 100; } //Adds an absolute value to damage. 100 = +100 damage -#define MATK_ADD( a ) { ad.damage+= a; } +#define MATK_ADD(a) { ad.damage += a; } - switch (skill_id) - { //Calc base damage according to skill + //Calc base damage according to skill + switch (skill_id) { case AL_HEAL: case PR_BENEDICTIO: case PR_SANCTUARY: @@ -5563,13 +5593,14 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list case PR_TURNUNDEAD: //Undead check is on skill_castend_damageid code. #ifdef RENEWAL - i = 10*skill_lv + sstatus->luk + sstatus->int_ + status_get_lv(src) - + 300 - 300*tstatus->hp/tstatus->max_hp; + i = 10 * skill_lv + sstatus->luk + sstatus->int_ + status_get_lv(src) + + 300 - 300 * tstatus->hp / tstatus->max_hp; #else - i = 20*skill_lv + sstatus->luk + sstatus->int_ + status_get_lv(src) - + 200 - 200*tstatus->hp/tstatus->max_hp; + i = 20 * skill_lv + sstatus->luk + sstatus->int_ + status_get_lv(src) + + 200 - 200 * tstatus->hp / tstatus->max_hp; #endif - if(i > 700) i = 700; + if(i > 700) + i = 700; if(rnd()%1000 < i && !(tstatus->mode&MD_BOSS)) ad.damage = tstatus->hp; else { @@ -5615,26 +5646,28 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list } if (nk&NK_SPLASHSPLIT) { // Divide MATK in case of multiple targets skill - if(mflag>0) - ad.damage/= mflag; + if (mflag>0) + ad.damage /= mflag; else ShowError("0 enemies targeted by %d:%s, divide per 0 avoided!\n", skill_id, skill_get_name(skill_id)); } - switch(skill_id){ + switch(skill_id) { case MG_NAPALMBEAT: - skillratio += skill_lv*10-30; + skillratio += -30 + 10 * skill_lv; break; case MG_FIREBALL: #ifdef RENEWAL - skillratio += 20*skill_lv; + skillratio += 40 + 20 * skill_lv; + if(ad.miscflag == 2) //Enemies at the edge of the area will take 75% of the damage + skillratio = skillratio * 3 / 4; #else - skillratio += skill_lv*10-30; + skillratio += -30 + 10 * skill_lv; #endif break; case MG_SOULSTRIKE: if (battle_check_undead(tstatus->race,tstatus->def_ele)) - skillratio += 5*skill_lv; + skillratio += 5 * skill_lv; break; case MG_FIREWALL: skillratio -= 50; @@ -5642,9 +5675,9 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list case MG_FIREBOLT: case MG_COLDBOLT: case MG_LIGHTNINGBOLT: - if ( sc && sc->data[SC_SPELLFIST] && mflag&BF_SHORT ) { + if (sc && sc->data[SC_SPELLFIST] && mflag&BF_SHORT) { skillratio += (sc->data[SC_SPELLFIST]->val4 * 100) + (sc->data[SC_SPELLFIST]->val1 * 50) - 100;// val4 = used bolt level, val2 = used spellfist level. [Rytech] - ad.div_ = 1;// ad mods, to make it work similar to regular hits [Xazax] + ad.div_ = 1; // ad mods, to make it work similar to regular hits [Xazax] ad.flag = BF_WEAPON|BF_SHORT; ad.type = DMG_NORMAL; } @@ -5652,11 +5685,11 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list case MG_THUNDERSTORM: // in Renewal Thunder Storm boost is 100% (in pre-re, 80%) #ifndef RENEWAL - skillratio -= 20; + skillratio -= 20; #endif break; case MG_FROSTDIVER: - skillratio += 10*skill_lv; + skillratio += 10 * skill_lv; break; case AL_HOLYLIGHT: skillratio += 25; @@ -5667,80 +5700,106 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list skillratio += 45; break; case WZ_FROSTNOVA: - skillratio += (100+skill_lv*10)*2/3-100; + skillratio += -100 + (100 + skill_lv * 10) * 2 / 3; break; case WZ_FIREPILLAR: if (skill_lv > 10) skillratio += 2300; //200% MATK each hit else - skillratio += -60 + 20*skill_lv; //20% MATK each hit + skillratio += -60 + 20 * skill_lv; //20% MATK each hit break; case WZ_SIGHTRASHER: - skillratio += 20*skill_lv; + skillratio += 20 * skill_lv; break; case WZ_WATERBALL: - skillratio += 30*skill_lv; + skillratio += 30 * skill_lv; break; case WZ_STORMGUST: - skillratio += 40*skill_lv; + skillratio += 40 * skill_lv; break; case HW_NAPALMVULCAN: skillratio += 25; break; - case SL_STIN: - skillratio += (tstatus->size!=SZ_SMALL?-99:10*skill_lv); //target size must be small (0) for full damage. + case SL_STIN: //Target size must be small (0) for full damage + skillratio += (tstatus->size != SZ_SMALL ? -99 : 10 * skill_lv); break; - case SL_STUN: - skillratio += (tstatus->size!=SZ_BIG?5*skill_lv:-99); //Full damage is dealt on small/medium targets + case SL_STUN: //Full damage is dealt on small/medium targets + skillratio += (tstatus->size != SZ_BIG ? 5 * skill_lv : -99); break; - case SL_SMA: - skillratio += -60 + status_get_lv(src); //Base damage is 40% + lv% + case SL_SMA: //Base damage is 40% + lv% + skillratio += -60 + status_get_lv(src); break; case NJ_KOUENKA: skillratio -= 10; + if(sd && sd->spiritcharm_type == CHARM_TYPE_FIRE && sd->spiritcharm > 0) + skillratio += 20 * sd->spiritcharm; break; case NJ_KAENSIN: skillratio -= 50; + if(sd && sd->spiritcharm_type == CHARM_TYPE_FIRE && sd->spiritcharm > 0) + skillratio += 10 * sd->spiritcharm; break; case NJ_BAKUENRYU: - skillratio += 50*(skill_lv-1); + skillratio += 50 * (skill_lv - 1); + if(sd && sd->spiritcharm_type == CHARM_TYPE_FIRE && sd->spiritcharm > 0) + skillratio += 15 * sd->spiritcharm; + break; + case NJ_HYOUSENSOU: +#ifdef RENEWAL + skillratio -= 30; +#endif + if(sd && sd->spiritcharm_type == CHARM_TYPE_WATER && sd->spiritcharm > 0) + skillratio += 5 * sd->spiritcharm; break; case NJ_HYOUSYOURAKU: - skillratio += 50*skill_lv; + skillratio += 50 * skill_lv; + if(sd && sd->spiritcharm_type == CHARM_TYPE_WATER && sd->spiritcharm > 0) + skillratio += 25 * sd->spiritcharm; break; case NJ_RAIGEKISAI: - skillratio += 60 + 40*skill_lv; + skillratio += 60 + 40 * skill_lv; + if(sd && sd->spiritcharm_type == CHARM_TYPE_WIND && sd->spiritcharm > 0) + skillratio += 15 * sd->spiritcharm; break; case NJ_KAMAITACHI: + skillratio += 100 * skill_lv; + if(sd && sd->spiritcharm_type == CHARM_TYPE_WIND && sd->spiritcharm > 0) + skillratio += 10 * sd->spiritcharm; + break; + case NJ_HUUJIN: +#ifdef RENEWAL + skillratio += 50; +#endif + if(sd && sd->spiritcharm_type == CHARM_TYPE_WIND && sd->spiritcharm > 0) + skillratio += 20 * sd->spiritcharm; + break; case NPC_ENERGYDRAIN: - skillratio += 100*skill_lv; + skillratio += 100 * skill_lv; break; case NPC_EARTHQUAKE: - skillratio += 100 +100*skill_lv +100*(skill_lv/2); + skillratio += 100 + 100 * skill_lv + 100 * (skill_lv / 2); break; #ifdef RENEWAL case WZ_HEAVENDRIVE: case WZ_METEOR: skillratio += 25; break; - case WZ_VERMILION: - { + case WZ_VERMILION: { int interval = 0, per = interval, ratio = per; - while( (per++) < skill_lv ){ + + while((per++) < skill_lv) { ratio += interval; - if(per%3==0) interval += 20; + if(per%3 == 0) + interval += 20; } - if( skill_lv > 9 ) + if (skill_lv > 9) ratio -= 10; skillratio += ratio; } break; - case NJ_HUUJIN: - skillratio += 50; - break; #else case WZ_VERMILION: - skillratio += 20*skill_lv-20; + skillratio += 20 * skill_lv - 20; break; #endif case AB_JUDEX: @@ -5755,7 +5814,7 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list skillratio += 100 + 20 * skill_lv; break; case WL_SOULEXPANSION: - skillratio += 300 + 100 * skill_lv + status_get_int(src); + skillratio += -100 + (skill_lv + 4) * 100 + status_get_int(src); RE_LVL_DMOD(100); break; case WL_FROSTMISTY: @@ -5763,16 +5822,16 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list RE_LVL_DMOD(100); break; case WL_JACKFROST: - if( tsc && tsc->data[SC_FREEZING] ){ + if (tsc && tsc->data[SC_FREEZING]) { skillratio += 900 + 300 * skill_lv; RE_LVL_DMOD(100); - }else{ + } else { skillratio += 400 + 100 * skill_lv; RE_LVL_DMOD(150); } break; case WL_DRAINLIFE: - skillratio = 200 * skill_lv + status_get_int(src); + skillratio += -100 + 200 * skill_lv + status_get_int(src); RE_LVL_DMOD(100); break; case WL_CRIMSONROCK: @@ -5780,32 +5839,33 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list RE_LVL_DMOD(100); break; case WL_HELLINFERNO: - skillratio = 300 * skill_lv; + skillratio += -100 + 300 * skill_lv; RE_LVL_DMOD(100); // Shadow: MATK [{( Skill Level x 300 ) x ( Caster Base Level / 100 ) x 4/5 }] % // Fire : MATK [{( Skill Level x 300 ) x ( Caster Base Level / 100 ) /5 }] % - if( mflag&ELE_DARK ){ skillratio *= 4; s_ele = ELE_DARK; } + if (mflag&ELE_DARK) + skillratio *= 4; skillratio /= 5; break; case WL_COMET: - i = ( sc ? distance_xy(target->x, target->y, sc->comet_x, sc->comet_y) : 8 ); - if( i <= 3 ) + i = (sc ? distance_xy(target->x, target->y, sc->comet_x, sc->comet_y) : 8); + if (i <= 3) skillratio += 2400 + 500 * skill_lv; // 7 x 7 cell - else if( i <= 5 ) + else if (i <= 5) skillratio += 1900 + 500 * skill_lv; // 11 x 11 cell - else if( i <= 7 ) + else if (i <= 7) skillratio += 1400 + 500 * skill_lv; // 15 x 15 cell else skillratio += 900 + 500 * skill_lv; // 19 x 19 cell - if( sd && sd->status.party_id ){ + if (sd && sd->status.party_id) { struct map_session_data* psd; int p_sd[5] = {0, 0, 0, 0, 0}, c; // just limit it to 5 c = 0; - memset (p_sd, 0, sizeof(p_sd)); + memset(p_sd, 0, sizeof(p_sd)); party_foreachsamemap(skill_check_condition_char_sub, sd, 3, &sd->bl, &c, &p_sd, skill_id); - c = ( c > 1 ? rnd()%c : 0 ); + c = (c > 1 ? rnd()%c : 0); if( (psd = map_id2sd(p_sd[c])) && pc_checkskill(psd,WL_COMET) > 0 ){ skillratio = skill_lv * 400; //MATK [{( Skill Level x 400 ) x ( Caster's Base Level / 120 )} + 2500 ] % @@ -5814,12 +5874,12 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list status_zap(&psd->bl, 0, skill_get_sp(skill_id, skill_lv) / 2); } } - break; + break; case WL_CHAINLIGHTNING_ATK: skillratio += 400 + 100 * skill_lv; RE_LVL_DMOD(100); if (mflag > 0) - skillratio += 100 * mflag; + skillratio += 100 * (9 - mflag); break; case WL_EARTHSTRAIN: skillratio += 1900 + 100 * skill_lv; @@ -5835,53 +5895,53 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list case WL_SUMMON_ATK_WATER: case WL_SUMMON_ATK_WIND: case WL_SUMMON_ATK_GROUND: - skillratio = skill_lv * (status_get_lv(src) + ( sd ? sd->status.job_level : 50 ));// This is close to official, but lacking a little info to finalize. [Rytech] + skillratio += -100 + (1 + skill_lv) / 2 * (status_get_lv(src) + (sd ? sd->status.job_level : 0)); RE_LVL_DMOD(100); break; case LG_RAYOFGENESIS: - { - uint16 lv = skill_lv; - int bandingBonus = 0; - if( sc && sc->data[SC_BANDING] ) - bandingBonus = 200 * (sd ? skill_check_pc_partner(sd,skill_id,&lv,skill_get_splash(skill_id,skill_lv),0) : 1); - skillratio = ((300 * skill_lv) + bandingBonus) * (sd ? sd->status.job_level : 1) / 25; - } - break; - case LG_SHIELDSPELL:// [(Casters Base Level x 4) + (Shield MDEF x 100) + (Casters INT x 2)] % - if (sd && skill_lv == 2) { - skillratio = status_get_lv(src) * 4 + sd->bonus.shieldmdef * 100 + status_get_int(src) * 2; - } else + if(sc) { + if(sc->data[SC_INSPIRATION]) + skillratio += 1400; + if(sc->data[SC_BANDING]) + skillratio += -100 + 300 * skill_lv + 200 * sc->data[SC_BANDING]->val2; + skillratio = skillratio * ((sd) ? sd->status.job_level / 25 : 1); + } + break; + case LG_SHIELDSPELL: // [(Casters Base Level x 4) + (Shield MDEF x 100) + (Casters INT x 2)] % + if (sd && skill_lv == 2) + skillratio += -100 + status_get_lv(src) * 4 + sd->bonus.shieldmdef * 100 + status_get_int(src) * 2; + else skillratio = 0; break; case WM_METALICSOUND: - skillratio = 120 * skill_lv + 60 * ((sd) ? pc_checkskill(sd, WM_LESSON) : skill_get_max(WM_LESSON)); + skillratio += -100 + 120 * skill_lv + 60 * ((sd) ? pc_checkskill(sd, WM_LESSON) : 1); RE_LVL_DMOD(100); break; case WM_REVERBERATION_MAGIC: // MATK [{(Skill Level x 100) + 100} x Casters Base Level / 100] % - skillratio += 100 * ((sd) ? pc_checkskill(sd, WM_REVERBERATION) : skill_get_max(WM_REVERBERATION)); + skillratio += 100 * skill_lv; RE_LVL_DMOD(100); break; case SO_FIREWALK: - skillratio = 60 * skill_lv; + skillratio += -100 + 60 * skill_lv; RE_LVL_DMOD(100); if( sc && sc->data[SC_HEATER_OPTION] ) skillratio += (sd ? sd->status.job_level / 2 : 0); break; case SO_ELECTRICWALK: - skillratio = 60 * skill_lv; + skillratio += -100 + 60 * skill_lv; RE_LVL_DMOD(100); if( sc && sc->data[SC_BLAST_OPTION] ) skillratio += (sd ? sd->status.job_level / 2 : 0); break; case SO_EARTHGRAVE: - skillratio = ( 200 * ((sd) ? pc_checkskill(sd, SA_SEISMICWEAPON) : skill_get_max(SA_SEISMICWEAPON)) + sstatus->int_ * skill_lv ); + skillratio += -100 + sstatus->int_ * skill_lv + ((sd) ? pc_checkskill(sd, SA_SEISMICWEAPON) * 200 : 0); RE_LVL_DMOD(100); if( sc && sc->data[SC_CURSED_SOIL_OPTION] ) skillratio += (sd ? sd->status.job_level * 5 : 0); break; case SO_DIAMONDDUST: - skillratio = ( 200 * ((sd) ? pc_checkskill(sd, SA_FROSTWEAPON) : skill_get_max(SA_FROSTWEAPON)) + sstatus->int_ * skill_lv ); + skillratio = ( 200 * ((sd) ? pc_checkskill(sd, SA_FROSTWEAPON) : 0) + sstatus->int_ * skill_lv ); RE_LVL_DMOD(100); if( sc && sc->data[SC_COOLER_OPTION] ) skillratio += (sd ? sd->status.job_level * 5 : 0); @@ -5893,46 +5953,41 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list skillratio += (sd ? sd->status.job_level * 5 : 0); break; case SO_PSYCHIC_WAVE: - skillratio = skill_lv * 70 + (sstatus->int_ * 3); + skillratio += -100 + 70 * skill_lv + 3 * sstatus->int_; RE_LVL_DMOD(100); if (sc && (sc->data[SC_HEATER_OPTION] || sc->data[SC_COOLER_OPTION] || sc->data[SC_BLAST_OPTION] || sc->data[SC_CURSED_SOIL_OPTION])) skillratio += 20; break; - case SO_VARETYR_SPEAR: //MATK [{( Endow Tornado skill level x 50 ) + ( Caster INT x Varetyr Spear Skill level )} x Caster Base Level / 100 ] % - skillratio = status_get_int(src) * skill_lv + ((sd) ? pc_checkskill(sd, SA_LIGHTNINGLOADER) * 50 : skill_get_max(SA_LIGHTNINGLOADER)); - RE_LVL_DMOD(100); - if( sc && sc->data[SC_BLAST_OPTION] ) - skillratio += (sd ? sd->status.job_level * 5 : 0); - break; case SO_CLOUD_KILL: - skillratio = skill_lv * 40; + skillratio += -100 + 40 * skill_lv; RE_LVL_DMOD(100); - if( sc && sc->data[SC_CURSED_SOIL_OPTION] ) + if (sc && sc->data[SC_CURSED_SOIL_OPTION]) skillratio += (sd ? sd->status.job_level : 0); break; + case SO_VARETYR_SPEAR: //MATK [{( Endow Tornado skill level x 50 ) + ( Caster INT x Varetyr Spear Skill level )} x Caster Base Level / 100 ] % + skillratio += -100 + status_get_int(src) * skill_lv + ((sd) ? pc_checkskill(sd, SA_LIGHTNINGLOADER) * 50 : 0); + RE_LVL_DMOD(100); + if (sc && sc->data[SC_BLAST_OPTION]) + skillratio += (sd ? sd->status.job_level * 5 : 0); + break; case GN_DEMONIC_FIRE: - if( skill_lv > 20) // Fire expansion Lv.2 + if (skill_lv > 20) // Fire expansion Lv.2 skillratio += 10 + 20 * (skill_lv - 20) + status_get_int(src) * 10; - else if( skill_lv > 10 ) { // Fire expansion Lv.1 + else if (skill_lv > 10) { // Fire expansion Lv.1 skillratio += 10 + 20 * (skill_lv - 10) + status_get_int(src) + ((sd) ? sd->status.job_level : 50); RE_LVL_DMOD(100); } else skillratio += 10 + 20 * skill_lv; break; case KO_KAIHOU: - if(sd) { - int ttype; - - ARR_FIND(1, 6, ttype, sd->talisman[ttype] > 0); - if(ttype < 5) { - skillratio += -100 + 200 * sd->talisman[ttype]; - RE_LVL_DMOD(100); - pc_del_talisman(sd, sd->talisman[ttype], ttype); - } + if(sd && sd->spiritcharm_type != CHARM_TYPE_NONE && sd->spiritcharm > 0) { + skillratio += -100 + 200 * sd->spiritcharm; + RE_LVL_DMOD(100); + pc_delspiritcharm(sd, sd->spiritcharm, sd->spiritcharm_type); } break; - // Magical Elemental Spirits Attack Skills + // Magical Elemental Spirits Attack Skills case EL_FIRE_MANTLE: case EL_WATER_SCREW: skillratio += 900; @@ -5961,74 +6016,19 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list break; case MH_HEILIGE_STANGE: skillratio += 400 + 250 * skill_lv; - skillratio = (skillratio * status_get_lv(src))/150; + skillratio = (skillratio * status_get_lv(src)) / 150; break; case MH_POISON_MIST: skillratio += -100 + 40 * skill_lv * status_get_lv(src) / 100; break; } - if (sd) { - int sd_charm; - - ARR_FIND(1, 6, sd_charm, sd->talisman[sd_charm] > 0); - if(sd_charm < 5 && s_ele == sd_charm) { - switch(skill_id) { - case NJ_HYOUSYOURAKU: - skillratio += 25 * sd->talisman[sd_charm]; - break; - case NJ_KOUENKA: - case NJ_HUUJIN: - skillratio += 20 * sd->talisman[sd_charm]; - break; - case NJ_BAKUENRYU: - case NJ_RAIGEKISAI: - skillratio += 15 * sd->talisman[sd_charm]; - break; - case NJ_KAMAITACHI: - skillratio += 10 * sd->talisman[sd_charm]; - break; - case NJ_KAENSIN: - case NJ_HYOUSENSOU: - skillratio += 5 * sd->talisman[sd_charm]; - break; - } - } - } - - if (tsd) { - int tsd_charm; - - ARR_FIND(1, 6, tsd_charm, tsd->talisman[tsd_charm] > 0); - if(tsd_charm < 5 && s_ele == tsd_charm) { - switch(skill_id) { - case NJ_HYOUSYOURAKU: - skillratio -= 25 * tsd->talisman[tsd_charm]; - break; - case NJ_KOUENKA: - case NJ_HUUJIN: - skillratio -= 20 * tsd->talisman[tsd_charm]; - break; - case NJ_BAKUENRYU: - case NJ_RAIGEKISAI: - skillratio -= 15 * tsd->talisman[tsd_charm]; - break; - case NJ_KAMAITACHI: - skillratio -= 10 * tsd->talisman[tsd_charm]; - break; - case NJ_KAENSIN: - case NJ_HYOUSENSOU: - skillratio -= 5 * tsd->talisman[tsd_charm]; - break; - } - } - } - MATK_RATE(skillratio); //Constant/misc additions from skills if (skill_id == WZ_FIREPILLAR) - MATK_ADD(100+50*skill_lv); + MATK_ADD(100 + 50 * skill_lv); + break; } } #ifdef RENEWAL @@ -6038,8 +6038,10 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list break; default: ad.damage += battle_calc_cardfix(BF_MAGIC, src, target, nk, s_ele, 0, ad.damage, 0, ad.flag); + break; } #endif + if(sd) { //Damage bonuses if ((i = pc_skillatk_bonus(sd, skill_id))) @@ -6091,8 +6093,8 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list #endif } - if (skill_id == NPC_EARTHQUAKE) - { //Adds atk2 to the damage, should be influenced by number of hits and skill-ratio, but not mdef reductions. [Skotlex] + if (skill_id == NPC_EARTHQUAKE) { + //Adds atk2 to the damage, should be influenced by number of hits and skill-ratio, but not mdef reductions. [Skotlex] //Also divide the extra bonuses from atk2 based on the number in range [Kevin] if(mflag>0) ad.damage+= (sstatus->rhw.atk2*skillratio/100)/mflag; @@ -6128,13 +6130,12 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list } if (!(nk&NK_NO_ELEFIX)) - ad.damage=battle_attr_fix(src, target, ad.damage, s_ele, tstatus->def_ele, tstatus->ele_lv); + ad.damage = battle_attr_fix(src, target, ad.damage, s_ele, tstatus->def_ele, tstatus->ele_lv); //Apply the physical part of the skill's damage. [Skotlex] switch(skill_id) { case CR_GRANDCROSS: - case NPC_GRANDDARKNESS: - { + case NPC_GRANDDARKNESS: { struct Damage wd = battle_calc_weapon_attack(src,target,skill_id,skill_lv,mflag); ad.damage = battle_attr_fix(src, target, wd.damage + ad.damage, s_ele, tstatus->def_ele, tstatus->ele_lv) * (100 + 40 * skill_lv) / 100; @@ -6169,11 +6170,11 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list return ad; //These skills will do a GVG fix later #endif default: - ad.damage=battle_calc_damage(src,target,&ad,ad.damage,skill_id,skill_lv); - if( map_flag_gvg2(target->m) ) - ad.damage=battle_calc_gvg_damage(src,target,ad.damage,skill_id,ad.flag); - else if( map[target->m].flag.battleground ) - ad.damage=battle_calc_bg_damage(src,target,ad.damage,skill_id,ad.flag); + ad.damage = battle_calc_damage(src,target,&ad,ad.damage,skill_id,skill_lv); + if (map_flag_gvg2(target->m)) + ad.damage = battle_calc_gvg_damage(src,target,ad.damage,skill_id,ad.flag); + else if (map[target->m].flag.battleground) + ad.damage = battle_calc_bg_damage(src,target,ad.damage,skill_id,ad.flag); break; } @@ -6217,12 +6218,12 @@ struct Damage battle_calc_misc_attack(struct block_list *src,struct block_list * } //Some initial values - md.amotion=skill_get_inf(skill_id)&INF_GROUND_SKILL?0:sstatus->amotion; - md.dmotion=tstatus->dmotion; - md.div_=skill_get_num( skill_id,skill_lv ); - md.blewcount=skill_get_blewcount(skill_id,skill_lv); - md.dmg_lv=ATK_DEF; - md.flag=BF_MISC|BF_SKILL; + md.amotion = (skill_get_inf(skill_id)&INF_GROUND_SKILL ? 0 : sstatus->amotion); + md.dmotion = tstatus->dmotion; + md.div_ = skill_get_num(skill_id,skill_lv); + md.blewcount = skill_get_blewcount(skill_id,skill_lv); + md.dmg_lv = ATK_DEF; + md.flag = BF_MISC|BF_SKILL; nk = skill_get_nk(skill_id); @@ -6251,218 +6252,244 @@ struct Damage battle_calc_misc_attack(struct block_list *src,struct block_list * md.flag |= battle_range_type(src, target, skill_id, skill_lv); switch (skill_id) { - case NC_MAGMA_ERUPTION: // 'Eruption' damage - md.damage = 800 + 200 * skill_lv; - break; + case NC_MAGMA_ERUPTION: // 'Eruption' damage + md.damage = 800 + 200 * skill_lv; + break; + case TF_THROWSTONE: + md.damage = 50; + md.flag |= BF_WEAPON; + break; #ifdef RENEWAL - case HT_LANDMINE: - case MA_LANDMINE: - case HT_BLASTMINE: - case HT_CLAYMORETRAP: - md.damage = skill_lv * sstatus->dex * (3+status_get_lv(src)/100) * (1+sstatus->int_/35); - md.damage += md.damage * (rnd()%20-10) / 100; - md.damage += 40 * ((sd) ? pc_checkskill(sd,RA_RESEARCHTRAP) : skill_get_max(RA_RESEARCHTRAP)); - break; + case HT_LANDMINE: + case MA_LANDMINE: + case HT_BLASTMINE: + case HT_CLAYMORETRAP: + md.damage = skill_lv * sstatus->dex * (3 + status_get_lv(src) / 100) * (1 + sstatus->int_ / 35); + md.damage += md.damage * (rnd()%20 - 10) / 100; + md.damage += (sd ? pc_checkskill(sd,RA_RESEARCHTRAP) * 40 : 0); + break; #else - case HT_LANDMINE: - case MA_LANDMINE: - md.damage=skill_lv*(sstatus->dex+75)*(100+sstatus->int_)/100; - break; - case HT_BLASTMINE: - md.damage=skill_lv*(sstatus->dex/2+50)*(100+sstatus->int_)/100; - break; - case HT_CLAYMORETRAP: - md.damage=skill_lv*(sstatus->dex/2+75)*(100+sstatus->int_)/100; - break; + case HT_LANDMINE: + case MA_LANDMINE: + md.damage = skill_lv * (sstatus->dex + 75) * (100 + sstatus->int_) / 100; + break; + case HT_BLASTMINE: + md.damage = skill_lv * (sstatus->dex / 2 + 50) * (100 + sstatus->int_) / 100; + break; + case HT_CLAYMORETRAP: + md.damage = skill_lv * (sstatus->dex / 2 + 75) * (100 + sstatus->int_) / 100; + break; #endif - case HT_BLITZBEAT: - case SN_FALCONASSAULT: - { - uint8 skill; - //Blitz-beat Damage. - if(!sd || (skill = pc_checkskill(sd,HT_STEELCROW)) <= 0) - skill=0; - md.damage=(sstatus->dex/10 + sstatus->int_/2 + skill*3+40)*2; - if(mflag > 1) //Autocasted Blitz. - nk|=NK_SPLASHSPLIT; + case HT_BLITZBEAT: + case SN_FALCONASSAULT: + { + uint16 skill; - if (skill_id == SN_FALCONASSAULT) { - //Div fix of Blitzbeat - DAMAGE_DIV_FIX2(md.damage, skill_get_num(HT_BLITZBEAT, 5)); - - //Falcon Assault Modifier - md.damage=(int64)md.damage*(150+70*skill_lv)/100; - } - } - break; - case TF_THROWSTONE: - md.damage=50; - break; - case BA_DISSONANCE: - md.damage=30+skill_lv*10; - if (sd) - md.damage+= 3*pc_checkskill(sd,BA_MUSICALLESSON); - break; - case NPC_SELFDESTRUCTION: - md.damage = sstatus->hp; - break; - case NPC_SMOKING: - md.damage=3; - break; - case NPC_DARKBREATH: - md.damage = tstatus->max_hp * (skill_lv * 10) / 100; - break; - case PA_PRESSURE: - md.damage=500+300*skill_lv; - break; - case PA_GOSPEL: - md.damage = 1+rnd()%9999; - break; - case CR_ACIDDEMONSTRATION: -#ifdef RENEWAL - // Official Renewal formula [helvetica] - // damage = 7 * ((atk + matk)/skill level) * (target vit/100) - // skill is a "forced neutral" type skill, it benefits from weapon element but final damage - // is considered "neutral" for purposes of resistances - { - struct Damage atk = battle_calc_weapon_attack(src, target, skill_id, skill_lv, 0); - struct Damage matk = battle_calc_magic_attack(src, target, skill_id, skill_lv, 0); - md.damage = 7 * ((atk.damage/skill_lv + matk.damage/skill_lv) * tstatus->vit / 100 ); - - // AD benefits from endow/element but damage is forced back to neutral - md.damage = battle_attr_fix(src, target, md.damage, ELE_NEUTRAL, tstatus->def_ele, tstatus->ele_lv); - } -#else - if(tstatus->vit+sstatus->int_) //crash fix - md.damage = (int)((int64)7*tstatus->vit*sstatus->int_*sstatus->int_ / (10*(tstatus->vit+sstatus->int_))); - else - md.damage = 0; - if (tsd) md.damage>>=1; -#endif - break; - case NJ_ZENYNAGE: - case KO_MUCHANAGE: - md.damage = skill_get_zeny(skill_id, skill_lv); - if (!md.damage) md.damage = (skill_id == NJ_ZENYNAGE ? 2 : 10); - md.damage = (skill_id == NJ_ZENYNAGE ? rnd()%md.damage + md.damage : md.damage * rnd_value(50,100)) / (skill_id == NJ_ZENYNAGE ? 1 : 100); - if (is_boss(target)) - md.damage = md.damage / (skill_id == NJ_ZENYNAGE ? 3 : 2); - if (sd && skill_id == KO_MUCHANAGE && !pc_checkskill(sd, NJ_TOBIDOUGU)) - md.damage = md.damage / 2; - else if (tsd && skill_id == NJ_ZENYNAGE) - md.damage = md.damage / 2; - break; -#ifdef RENEWAL - case NJ_ISSEN: - // Official Renewal formula [helvetica] - // base damage = currenthp + ((atk * currenthp * skill level) / maxhp) - // final damage = base damage + ((mirror image count + 1) / 5 * base damage) - (edef + sdef) - // modified def formula - { - short totaldef; - struct Damage atk = battle_calc_weapon_attack(src, target, skill_id, skill_lv, 0); - struct status_change *sc = status_get_sc(src); - - md.damage = (int64)sstatus->hp + (atk.damage * (int64)sstatus->hp * skill_lv) / (int64)sstatus->max_hp; - - if (sc && sc->data[SC_BUNSINJYUTSU] && (i=sc->data[SC_BUNSINJYUTSU]->val2) > 0) { // mirror image bonus only occurs if active - md.div_ = -( i + 2 ); // mirror image count + 2 - md.damage += (md.damage * (((i + 1) * 10) / 5)) / 10; + //Blitz-beat Damage + if(!sd || !(skill = pc_checkskill(sd,HT_STEELCROW))) + skill = 0; + md.damage = (sstatus->dex / 10 + sstatus->int_ / 2 + skill * 3 + 40) * 2; + if(mflag > 1) //Autocasted Blitz + nk |= NK_SPLASHSPLIT; + if (skill_id == SN_FALCONASSAULT) { + //Div fix of Blitzbeat + DAMAGE_DIV_FIX2(md.damage, skill_get_num(HT_BLITZBEAT, 5)); + //Falcon Assault Modifier + md.damage = md.damage * (150 + 70 * skill_lv) / 100; + } } - // modified def reduction, final damage = base damage - (edef + sdef) - totaldef = tstatus->def2 + (short)status_get_def(target); - md.damage -= totaldef; - } - break; -#endif - case GS_FLING: - md.damage = sd?sd->status.job_level:status_get_lv(src); - break; - case GS_GROUNDDRIFT: - // Official formula [helvetica] - // damage = 50 * skill level - // fixed damage, ignores DEF and benefits from weapon +%ATK cards - md.damage = 50*skill_lv; - md.damage += battle_calc_cardfix(BF_WEAPON, src, target, nk, s_ele, 0, md.damage, 0, md.flag|NK_NO_CARDFIX_DEF); // ground drift benefits from weapon atk cards, ignore DEF cards so we don't apply twice - break; - case HVAN_EXPLOSION: //[orn] - md.damage = (int64)sstatus->max_hp * (50 + 50 * skill_lv) / 100; - break; - case ASC_BREAKER: + break; #ifdef RENEWAL - // Official Renewal formula [helvetica] - // damage = ((atk + matk) * (3 + (.5 * skill level))) - (edef + sdef + emdef + smdef) - // atk part takes weapon element, matk part is non-elemental - // modified def formula - { - short totaldef, totalmdef; - struct Damage atk, matk; + case GS_MAGICALBULLET: + { + //Official renewal formula [exneval] + //Damage = (Final ATK + Final MATK) * Skill modifiers - (eDEF + sDEF + eMDEF + sMDEF) + short totaldef, totalmdef; + struct Damage atk, matk; - atk = battle_calc_weapon_attack(src, target, skill_id, skill_lv, 0); - nk|=NK_NO_ELEFIX; // atk part takes on weapon element, matk part is non-elemental - matk = battle_calc_magic_attack(src, target, skill_id, skill_lv, 0); - - // (atk + matk) * (3 + (.5 * skill level)) - md.damage = ((30 + (5 * skill_lv)) * (atk.damage + matk.damage)) / 10; - - // modified def reduction, final damage = base damage - (edef + sdef + emdef + smdef) - totaldef = tstatus->def2 + (short)status_get_def(target); - totalmdef = tstatus->mdef + tstatus->mdef2; - md.damage -= totaldef + totalmdef; - } -#else - md.damage = 500+rnd()%500 + 5*skill_lv * sstatus->int_; - nk|=NK_IGNORE_FLEE|NK_NO_ELEFIX; //These two are not properties of the weapon based part. + atk = battle_calc_weapon_attack(src,target,skill_id,skill_lv,md.miscflag); + matk = battle_calc_magic_attack(src,target,skill_id,skill_lv,md.miscflag); + md.damage = atk.damage + matk.damage; + totaldef = (short)status_get_def(target) + tstatus->def2; + totalmdef = tstatus->mdef + tstatus->mdef2; + md.damage -= totaldef + totalmdef; + md.flag |= BF_WEAPON; + nk |= NK_IGNORE_FLEE; // Flee already checked in battle_calc_weapon_attack, so don't do it again here [exneval] + } + break; #endif - break; - case HW_GRAVITATION: + case BA_DISSONANCE: + md.damage = 30 + skill_lv * 10; + if (sd) + md.damage += 3 * pc_checkskill(sd,BA_MUSICALLESSON); + break; + case NPC_SELFDESTRUCTION: + md.damage = sstatus->hp; + break; + case NPC_SMOKING: + md.damage = 3; + break; + case NPC_DARKBREATH: + md.damage = tstatus->max_hp * skill_lv * 10 / 100; + break; + case NPC_EVILLAND: + md.damage = skill_calc_heal(src,target,skill_id,skill_lv,false); + break; + case ASC_BREAKER: #ifdef RENEWAL - md.damage = 500+100*skill_lv; + // Official Renewal formula [helvetica] + // damage = ((atk + matk) * (3 + (.5 * skill level))) - (edef + sdef + emdef + smdef) + // atk part takes weapon element, matk part is non-elemental + // modified def formula + { + short totaldef, totalmdef; + struct Damage atk, matk; + + atk = battle_calc_weapon_attack(src, target, skill_id, skill_lv, 0); + nk |= NK_NO_ELEFIX; // atk part takes on weapon element, matk part is non-elemental + matk = battle_calc_magic_attack(src, target, skill_id, skill_lv, 0); + + // (atk + matk) * (3 + (.5 * skill level)) + md.damage = ((30 + (5 * skill_lv)) * (atk.damage + matk.damage)) / 10; + + // modified def reduction, final damage = base damage - (edef + sdef + emdef + smdef) + totaldef = tstatus->def2 + (short)status_get_def(target); + totalmdef = tstatus->mdef + tstatus->mdef2; + md.damage -= totaldef + totalmdef; + } #else - md.damage = 200+200*skill_lv; + md.damage = 500 + rnd()%500 + 5 * skill_lv * sstatus->int_; + nk |= NK_IGNORE_FLEE|NK_NO_ELEFIX; //These two are not properties of the weapon based part. #endif - md.dmotion = 0; //No flinch animation. - break; - case NPC_EVILLAND: - md.damage = skill_calc_heal(src,target,skill_id,skill_lv,false); - break; - case RA_CLUSTERBOMB: - case RA_FIRINGTRAP: - case RA_ICEBOUNDTRAP: - md.damage = skill_lv * status_get_dex(src) + status_get_int(src) * 5 ; - RE_LVL_TMDMOD(); - if(sd) { - int researchskill_lv = pc_checkskill(sd,RA_RESEARCHTRAP); - if(researchskill_lv) - md.damage = (int64)md.damage * 20 * researchskill_lv / (skill_id == RA_CLUSTERBOMB?50:100); + break; + case HW_GRAVITATION: +#ifdef RENEWAL + md.damage = 500 + 100 * skill_lv; +#else + md.damage = 200 + 200 * skill_lv; +#endif + md.dmotion = 0; //No flinch animation + break; + case PA_PRESSURE: + md.damage = 500 + 300 * skill_lv; + break; + case PA_GOSPEL: + md.damage = 1 + rnd()%9999; + break; + case CR_ACIDDEMONSTRATION: +#ifdef RENEWAL + // Official Renewal formula [helvetica] + // damage = 7 * ((atk + matk)/skill level) * (target vit/100) + // skill is a "forced neutral" type skill, it benefits from weapon element but final damage + // is considered "neutral" for purposes of resistances + { + struct Damage atk = battle_calc_weapon_attack(src, target, skill_id, skill_lv, 0); + struct Damage matk = battle_calc_magic_attack(src, target, skill_id, skill_lv, 0); + md.damage = 7 * ((atk.damage/skill_lv + matk.damage/skill_lv) * tstatus->vit / 100 ); + + // AD benefits from endow/element but damage is forced back to neutral + md.damage = battle_attr_fix(src, target, md.damage, ELE_NEUTRAL, tstatus->def_ele, tstatus->ele_lv); + } +#else + if(tstatus->vit+sstatus->int_) //crash fix + md.damage = (int)((int64)7*tstatus->vit*sstatus->int_*sstatus->int_ / (10*(tstatus->vit+sstatus->int_))); else md.damage = 0; - } else - md.damage = (int64)md.damage * 200 / (skill_id == RA_CLUSTERBOMB?50:100); - break; - case GN_THORNS_TRAP: - md.damage = 100 + 200 * skill_lv + status_get_int(src); - break; - case GN_HELLS_PLANT_ATK: - //[{( Hell Plant Skill Level x Casters Base Level ) x 10 } + {( Casters INT x 7 ) / 2 } x { 18 + ( Casters Job Level / 4 )] x ( 5 / ( 10 - Summon Flora Skill Level )) - md.damage = ( skill_lv * status_get_lv(src) * 10 ) + ( status_get_int(src) * 7 / 2 ) * ( 18 + (sd?sd->status.job_level:0) / 4 ) * ( 5 / (10 - ((sd) ? pc_checkskill(sd,AM_CANNIBALIZE) : skill_get_max(AM_CANNIBALIZE))) ); - break; - case RL_B_TRAP: - // kRO 2014-02-12: Damage: Caster's DEX, Target's current HP, Skill Level - md.damage = ((200 + status_get_dex(src)) * skill_lv * 10) + sstatus->hp; // (custom) - break; + if (tsd) md.damage>>=1; +#endif + break; + case NJ_ZENYNAGE: + case KO_MUCHANAGE: + md.damage = skill_get_zeny(skill_id, skill_lv); + if (!md.damage) + md.damage = (skill_id == NJ_ZENYNAGE ? 2 : 10); + md.damage = (skill_id == NJ_ZENYNAGE ? rnd()%md.damage + md.damage : md.damage * rnd_value(50,100)) / (skill_id == NJ_ZENYNAGE ? 1 : 100); + if (sd && skill_id == KO_MUCHANAGE && !pc_checkskill(sd, NJ_TOBIDOUGU)) + md.damage = md.damage / 2; + if (is_boss(target)) + md.damage = md.damage / (skill_id == NJ_ZENYNAGE ? 3 : 2); + else if (tsd && skill_id == NJ_ZENYNAGE) + md.damage = md.damage / 2; + break; +#ifdef RENEWAL + case NJ_ISSEN: + // Official Renewal formula [helvetica] + // base damage = currenthp + ((atk * currenthp * skill level) / maxhp) + // final damage = base damage + ((mirror image count + 1) / 5 * base damage) - (edef + sdef) + // modified def formula + { + short totaldef; + struct Damage atk = battle_calc_weapon_attack(src, target, skill_id, skill_lv, 0); + struct status_change *sc = status_get_sc(src); + + md.damage = (int64)sstatus->hp + (atk.damage * (int64)sstatus->hp * skill_lv) / (int64)sstatus->max_hp; + + if (sc && sc->data[SC_BUNSINJYUTSU] && (i = sc->data[SC_BUNSINJYUTSU]->val2) > 0) { // mirror image bonus only occurs if active + md.div_ = -(i + 2); // mirror image count + 2 + md.damage += (md.damage * (((i + 1) * 10) / 5)) / 10; + } + // modified def reduction, final damage = base damage - (edef + sdef) + totaldef = tstatus->def2 + (short)status_get_def(target); + md.damage -= totaldef; + md.flag |= BF_WEAPON; + } + break; +#endif + case GS_FLING: + md.damage = (sd ? sd->status.job_level : status_get_lv(src)); + break; + case GS_GROUNDDRIFT: + // Official formula [helvetica] + // damage = 50 * skill level + // fixed damage, ignores DEF and benefits from weapon +%ATK cards + md.damage = 50 * skill_lv; + md.damage += battle_calc_cardfix(BF_WEAPON, src, target, nk, s_ele, 0, md.damage, 0, md.flag|NK_NO_CARDFIX_DEF); // ground drift benefits from weapon atk cards, ignore DEF cards so we don't apply twice + break; + case HVAN_EXPLOSION: //[orn] + md.damage = (int64)sstatus->max_hp * (50 + 50 * skill_lv) / 100; + break; + case RA_CLUSTERBOMB: + case RA_FIRINGTRAP: + case RA_ICEBOUNDTRAP: + md.damage = skill_lv * status_get_dex(src) + status_get_int(src) * 5 ; + RE_LVL_TMDMOD(); + if(sd) { + int researchskill_lv = pc_checkskill(sd,RA_RESEARCHTRAP); + if(researchskill_lv) + md.damage = md.damage * 20 * researchskill_lv / (skill_id == RA_CLUSTERBOMB ? 50 : 100); + else + md.damage = 0; + } else + md.damage = md.damage * 200 / (skill_id == RA_CLUSTERBOMB ? 50 : 100); + nk |= NK_NO_ELEFIX|NK_IGNORE_FLEE|NK_NO_CARDFIX_DEF; + break; + case WM_SOUND_OF_DESTRUCTION: + md.damage = 1000 * skill_lv + sstatus->int_ * ((sd) ? pc_checkskill(sd,WM_LESSON) : 1); + md.damage += md.damage * 10 * ((sd) ? battle_calc_chorusbonus(sd) / 100 : 0); + break; + case GN_THORNS_TRAP: + md.damage = 100 + 200 * skill_lv + status_get_int(src); + break; + case GN_HELLS_PLANT_ATK: + //[{( Hell Plant Skill Level x Casters Base Level ) x 10 } + {( Casters INT x 7 ) / 2 } x { 18 + ( Casters Job Level / 4 )] x ( 5 / ( 10 - Summon Flora Skill Level )) + md.damage = ( skill_lv * status_get_lv(src) * 10 ) + ( status_get_int(src) * 7 / 2 ) * ( 18 + (sd?sd->status.job_level:0) / 4 ) * ( 5 / (10 - ((sd) ? pc_checkskill(sd,AM_CANNIBALIZE) : 0)) ); + break; + case RL_B_TRAP: + // kRO 2014-02-12: Damage: Caster's DEX, Target's current HP, Skill Level + md.damage = ((200 + status_get_dex(src)) * skill_lv * 10) + sstatus->hp; // (custom) + break; } - if (nk&NK_SPLASHSPLIT){ // Divide ATK among targets - if(mflag>0) - md.damage/= mflag; + if (nk&NK_SPLASHSPLIT) { // Divide ATK among targets + if(mflag > 0) + md.damage /= mflag; else ShowError("0 enemies targeted by %d:%s, divide per 0 avoided!\n", skill_id, skill_get_name(skill_id)); } - if (!(nk&NK_IGNORE_FLEE)) - { + if (!(nk&NK_IGNORE_FLEE)) { struct status_change *sc = status_get_sc(target); + i = 0; //Temp for "hit or no hit" if(sc && sc->opt1 && sc->opt1 != OPT1_STONEWAIT && sc->opt1 != OPT1_BURNING) i = 1; @@ -6476,19 +6503,19 @@ struct Damage battle_calc_misc_attack(struct block_list *src,struct block_list * #endif if(battle_config.agi_penalty_type && battle_config.agi_penalty_target&target->type) { - unsigned char attacker_count; //256 max targets should be a sane max - attacker_count = unit_counttargeted(target); - if(attacker_count >= battle_config.agi_penalty_count) - { + unsigned char attacker_count = unit_counttargeted(target); //256 max targets should be a sane max + + if(attacker_count >= battle_config.agi_penalty_count) { if (battle_config.agi_penalty_type == 1) flee = (flee * (100 - (attacker_count - (battle_config.agi_penalty_count - 1))*battle_config.agi_penalty_num))/100; else //assume type 2: absolute reduction flee -= (attacker_count - (battle_config.agi_penalty_count - 1))*battle_config.agi_penalty_num; - if(flee < 1) flee = 1; + if(flee < 1) + flee = 1; } } - hitrate+= sstatus->hit - flee; + hitrate += sstatus->hit - flee; #ifdef RENEWAL if( sd ) //in Renewal hit bonus from Vultures Eye is not shown anymore in status window hitrate += pc_checkskill(sd,AC_VULTURE); @@ -6500,11 +6527,19 @@ struct Damage battle_calc_misc_attack(struct block_list *src,struct block_list * } if (!i) { md.damage = 0; - md.dmg_lv=ATK_FLEE; + md.dmg_lv = ATK_FLEE; } } - md.damage += battle_calc_cardfix(BF_MISC, src, target, nk, s_ele, 0, md.damage, 0, md.flag); + switch(skill_id) { +#ifdef RENEWAL + case GS_MAGICALBULLET: + break; // Card fix already done +#endif + default: + md.damage += battle_calc_cardfix(BF_MISC, src, target, nk, s_ele, 0, md.damage, 0, md.flag); + break; + } if (sd && (i = pc_skillatk_bonus(sd, skill_id))) md.damage += (int64)md.damage*i/100; @@ -6525,32 +6560,41 @@ struct Damage battle_calc_misc_attack(struct block_list *src,struct block_list * //Apply DAMAGE_DIV_FIX and check for min damage md = battle_apply_div_fix(md); - md.damage=battle_calc_damage(src,target,&md,md.damage,skill_id,skill_lv); - if( map_flag_gvg2(target->m) ) - md.damage=battle_calc_gvg_damage(src,target,md.damage,skill_id,md.flag); - else if( map[target->m].flag.battleground ) - md.damage=battle_calc_bg_damage(src,target,md.damage,skill_id,md.flag); - - switch( skill_id ) { + switch(skill_id) { case RA_FIRINGTRAP: case RA_ICEBOUNDTRAP: - if( md.damage == 1 ) break; + if (md.damage == 1) + break; case RA_CLUSTERBOMB: { - struct Damage wd; - wd = battle_calc_weapon_attack(src,target,skill_id,skill_lv,mflag); + struct Damage wd = battle_calc_weapon_attack(src,target,skill_id,skill_lv,mflag); + md.damage += wd.damage; } break; case NJ_ZENYNAGE: - if( sd ) { - if ( md.damage > sd->status.zeny ) + if (sd) { + if (md.damage > sd->status.zeny) md.damage = sd->status.zeny; - pc_payzeny(sd, (int)md.damage,LOG_TYPE_STEAL,NULL); + pc_payzeny(sd,(int)cap_value(md.damage, INT_MIN, INT_MAX),LOG_TYPE_STEAL,NULL); } break; } + switch(skill_id) { +#ifdef RENEWAL + case GS_MAGICALBULLET: + break; // GVG fix already done +#endif + default: + md.damage = battle_calc_damage(src,target,&md,md.damage,skill_id,skill_lv); + if(map_flag_gvg2(target->m)) + md.damage = battle_calc_gvg_damage(src,target,md.damage,skill_id,md.flag); + else if(map[target->m].flag.battleground) + md.damage = battle_calc_bg_damage(src,target,md.damage,skill_id,md.flag); + break; + } + // Skill damage adjustment #ifdef ADJUST_SKILL_DAMAGE if ((skill_damage = battle_skill_damage(src,target,skill_id)) != 0) @@ -6563,6 +6607,7 @@ struct Damage battle_calc_misc_attack(struct block_list *src,struct block_list * return md; } + /*========================================== * Battle main entry, from skill_attack *------------------------------------------ @@ -6696,14 +6741,14 @@ int64 battle_calc_return_damage(struct block_list* bl, struct block_list *src, i /*=========================================== * Perform battle drain effects (HP/SP loss) *-------------------------------------------*/ -void battle_drain(TBL_PC *sd, struct block_list *tbl, int64 rdamage, int64 ldamage, int race, int class_) +void battle_drain(struct map_session_data *sd, struct block_list *tbl, int64 rdamage, int64 ldamage, int race, int class_, bool infdef) { struct weapon_data *wd; int64 *damage; - int thp = 0, // HP gained by attacked - tsp = 0, // SP gained by attacked - rhp = 0, // HP reduced from target - rsp = 0, // SP reduced from target + int thp = 0, // HP gained + tsp = 0, // SP gained + //rhp = 0, // HP reduced from target + //rsp = 0, // SP reduced from target hp = 0, sp = 0; uint8 i = 0; short vrate_hp = 0, vrate_sp = 0, v_hp = 0, v_sp = 0; @@ -6715,7 +6760,7 @@ void battle_drain(TBL_PC *sd, struct block_list *tbl, int64 rdamage, int64 ldama hp = (sd->bonus.hp_vanish_rate*10) + sd->hp_vanish_race[race].rate + sd->hp_vanish_race[RC_ALL].rate; vrate_hp = cap_value(hp, 0, SHRT_MAX); hp = sd->bonus.hp_vanish_per + sd->hp_vanish_race[race].per + sd->hp_vanish_race[RC_ALL].per; - v_hp = cap_value(hp, INT8_MIN, INT8_MAX); + v_hp = cap_value(hp, SHRT_MIN, SHRT_MAX); sp = (sd->bonus.sp_vanish_rate*10) + sd->sp_vanish_race[race].rate + sd->sp_vanish_race[RC_ALL].rate; vrate_sp = cap_value(sp, 0, SHRT_MAX); @@ -6726,17 +6771,28 @@ void battle_drain(TBL_PC *sd, struct block_list *tbl, int64 rdamage, int64 ldama i |= 1; if (v_sp > 0 && vrate_sp > 0 && (vrate_sp >= 10000 || rnd()%10000 < vrate_sp)) i |= 2; - if (i) - status_percent_damage(&sd->bl, tbl, (i&1 ? (int8)v_hp: 0), (i&2 ? (int8)v_sp : 0), false); + if (i) { + if (infdef) + status_zap(tbl, v_hp ? v_hp/100 : 0, v_sp ? v_sp/100 : 0); + else + status_percent_damage(&sd->bl, tbl, (i&1 ? (int8)(-v_hp): 0), (i&2 ? (int8)(-v_sp) : 0), false); + } // Check for drain HP/SP hp = sp = i = 0; for (i = 0; i < 4; i++) { //First two iterations: Right hand - if (i < 2) { wd = &sd->right_weapon; damage = &rdamage; } - else { wd = &sd->left_weapon; damage = &ldamage; } + if (i < 2) { + wd = &sd->right_weapon; + damage = &rdamage; + } + else { + wd = &sd->left_weapon; + damage = &ldamage; + } - if (*damage <= 0) continue; + if (*damage <= 0) + continue; if( i == 1 || i == 3 ) { hp = wd->hp_drain_class[class_] + wd->hp_drain_class[CLASS_ALL]; @@ -6746,12 +6802,12 @@ void battle_drain(TBL_PC *sd, struct block_list *tbl, int64 rdamage, int64 ldama sp += battle_calc_drain(*damage, wd->sp_drain_rate.rate, wd->sp_drain_rate.per); if( hp ) { - rhp += hp; + //rhp += hp; thp += hp; } if( sp ) { - rsp += sp; + //rsp += sp; tsp += sp; } } else { @@ -6759,86 +6815,52 @@ void battle_drain(TBL_PC *sd, struct block_list *tbl, int64 rdamage, int64 ldama sp = wd->sp_drain_race[race] + wd->sp_drain_race[RC_ALL]; if( hp ) { - rhp += hp; + //rhp += hp; thp += hp; } if( sp ) { - rsp += sp; + //rsp += sp; tsp += sp; } } } - // Check for gain HP/SP - if (sd->bonus.hp_gain_attack) - thp += sd->bonus.hp_gain_attack; - if (sd->bonus.sp_gain_attack) - tsp += sd->bonus.sp_gain_attack; - - if (sd->bonus.hp_gain_attack_rate) - thp += (int)((rdamage+ldamage) * sd->bonus.hp_gain_attack_rate / 100); - if (sd->bonus.sp_gain_attack_rate) - tsp += (int)((rdamage+ldamage) * sd->bonus.sp_gain_attack_rate / 100); - - if (sd->hp_gain_attack.rate) - thp += battle_calc_drain(rdamage+ldamage, sd->hp_gain_attack.rate, sd->hp_gain_attack.per); - if (sd->sp_gain_attack.rate) - tsp += battle_calc_drain(rdamage+ldamage, sd->sp_gain_attack.rate, sd->sp_gain_attack.per); - - if( sd->sp_gain_race_attack[race] ) - tsp += sd->sp_gain_race_attack[race]; - if( sd->sp_gain_race_attack[RC_ALL] ) - tsp += sd->sp_gain_race_attack[RC_ALL]; - - if( sd->hp_gain_race_attack[race] ) - thp += sd->hp_gain_race_attack[race]; - if( sd->hp_gain_race_attack[RC_ALL] ) - thp += sd->hp_gain_race_attack[RC_ALL]; - - if (sd->hp_gain_race_attack_rate[race]) - thp += (int)((rdamage+ldamage) * sd->hp_gain_race_attack_rate[race] / 100); - if (sd->hp_gain_race_attack_rate[RC_ALL]) - thp += (int)((rdamage+ldamage) * sd->hp_gain_race_attack_rate[RC_ALL] / 100); - - if (sd->sp_gain_race_attack_rate[race]) - tsp += (int)((rdamage+ldamage) * sd->sp_gain_race_attack_rate[race] / 100); - if (sd->sp_gain_race_attack_rate[RC_ALL]) - tsp += (int)((rdamage+ldamage) * sd->sp_gain_race_attack_rate[RC_ALL] / 100); - if (!thp && !tsp) return; status_heal(&sd->bl, thp, tsp, battle_config.show_hp_sp_drain?3:1); - if (rhp || rsp) - status_zap(tbl, rhp, rsp); + //if (rhp || rsp) + // status_zap(tbl, rhp, rsp); } /*=========================================== * Deals the same damage to targets in area. *------------------------------------------- * Credits: * Original coder pakpil -*/ -int battle_damage_area( struct block_list *bl, va_list ap) { + */ +int battle_damage_area(struct block_list *bl, va_list ap) { unsigned int tick; int64 damage; - int amotion, dmotion; + int amotion, dmotion, flag; struct block_list *src; nullpo_ret(bl); - tick=va_arg(ap, unsigned int); - src=va_arg(ap,struct block_list *); - amotion=va_arg(ap,int); - dmotion=va_arg(ap,int); - damage=va_arg(ap,int); + tick = va_arg(ap, unsigned int); + src = va_arg(ap,struct block_list *); + amotion = va_arg(ap,int); + dmotion = va_arg(ap,int); + damage = va_arg(ap,int); + flag = va_arg(ap,int); + if( bl->type == BL_MOB && ((TBL_MOB*)bl)->mob_id == MOBID_EMPERIUM ) return 0; if( bl != src && battle_check_target(src,bl,BCT_ENEMY) > 0 ) { map_freeblock_lock(); if( src->type == BL_PC ) - battle_drain((TBL_PC*)src, bl, damage, damage, status_get_race(bl), status_get_class_(bl)); + battle_drain((TBL_PC*)src, bl, damage, damage, status_get_race(bl), status_get_class_(bl), is_infinite_defense(bl,flag)); if( amotion ) battle_delay_damage(tick, amotion,src,bl,0,CR_REFLECTSHIELD,0,damage,ATK_DEF,0,true); else @@ -7222,9 +7244,9 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t if (wd.flag & BF_WEAPON && src != target && damage > 0) { if (battle_config.left_cardfix_to_right) - battle_drain(sd, target, wd.damage, wd.damage, tstatus->race, tstatus->class_); + battle_drain(sd, target, wd.damage, wd.damage, tstatus->race, tstatus->class_, is_infinite_defense(target,wd.flag)); else - battle_drain(sd, target, wd.damage, wd.damage2, tstatus->race, tstatus->class_); + battle_drain(sd, target, wd.damage, wd.damage2, tstatus->race, tstatus->class_, is_infinite_defense(target,wd.flag)); } } @@ -7399,55 +7421,25 @@ int battle_check_target( struct block_list *src, struct block_list *target,int f TBL_SKILL *su = (TBL_SKILL*)target; if( !su || !su->group) return 0; - if( skill_get_inf2(su->group->skill_id)&INF2_TRAP && su->group->unit_id != UNT_USED_TRAPS) { //Only a few skills can target traps... - switch( battle_getcurrentskill(src) ) { - case RK_DRAGONBREATH:// it can only hit traps in pvp/gvg maps - case RK_DRAGONBREATH_WATER: - if( !map[m].flag.pvp && !map[m].flag.gvg ) - break; - case 0://you can hit them without skills - case MA_REMOVETRAP: - case HT_REMOVETRAP: - case AC_SHOWER: - case MA_SHOWER: - case WZ_SIGHTRASHER: - case WZ_SIGHTBLASTER: - case SM_MAGNUM: - case MS_MAGNUM: - case RA_DETONATOR: - case RA_SENSITIVEKEEN: - case GN_CRAZYWEED_ATK: - case RK_STORMBLAST: - case SR_RAMPAGEBLASTER: - case NC_COLDSLOWER: - case NC_SELFDESTRUCTION: -#ifdef RENEWAL - case KN_BOWLINGBASH: - case KN_SPEARSTAB: - case LK_SPIRALPIERCE: - case ML_SPIRALPIERCE: - case MO_FINGEROFFENSIVE: - case MO_INVESTIGATE: - case MO_TRIPLEATTACK: - case MO_EXTREMITYFIST: - case CR_HOLYCROSS: - case ASC_METEORASSAULT: - case RG_RAID: - case MC_CARTREVOLUTION: - case HT_CLAYMORETRAP: - case RA_ICEBOUNDTRAP: - case RA_FIRINGTRAP: -#endif - state |= BCT_ENEMY; - strip_enemy = 0; - break; - default: - if(su->group->skill_id == WM_REVERBERATION || su->group->skill_id == WM_POEMOFNETHERWORLD){ - state |= BCT_ENEMY; - strip_enemy = 0; - }else - return 0; + if( skill_get_inf2(su->group->skill_id)&INF2_TRAP && su->group->unit_id != UNT_USED_TRAPS) { + uint16 skill_id = battle_getcurrentskill(src); + + if (!skill_id || su->group->skill_id == WM_REVERBERATION || su->group->skill_id == WM_POEMOFNETHERWORLD) { + ; } + else if (skill_get_inf2(skill_id)&INF2_HIT_TRAP) { // Only a few skills can target traps + switch (skill_id) { + case RK_DRAGONBREATH: + case RK_DRAGONBREATH_WATER: + // Can only hit traps in PVP/GVG maps + if( !map[m].flag.pvp && !map[m].flag.gvg ) + return 0; + } + } + else + return 0; + state |= BCT_ENEMY; + strip_enemy = 0; } else if (su->group->skill_id == WZ_ICEWALL || su->group->skill_id == GN_WALLOFTHORN) { state |= BCT_ENEMY; strip_enemy = 0; @@ -8176,6 +8168,7 @@ static const struct _battle_data { { "homunculus_evo_intimacy_need", &battle_config.homunculus_evo_intimacy_need, 91100, 0, INT_MAX, }, { "homunculus_evo_intimacy_reset", &battle_config.homunculus_evo_intimacy_reset, 1000, 0, INT_MAX, }, { "monster_loot_search_type", &battle_config.monster_loot_search_type, 1, 0, 1, }, + { "feature.roulette", &battle_config.feature_roulette, 1, 0, 1, }, }; #ifndef STATS_OPT_OUT @@ -8404,6 +8397,13 @@ void battle_adjust_conf() } #endif +#if PACKETVER < 20141022 + if (battle_config.feature_roulette) { + ShowWarning("conf/battle/feature.conf roulette is enabled but it requires PACKETVER 2014-10-22 or newer, disabling...\n"); + battle_config.feature_roulette = 0; + } +#endif + #ifndef CELL_NOSTACK if (battle_config.custom_cell_stack_limit != 1) ShowWarning("Battle setting 'custom_cell_stack_limit' takes no effect as this server was compiled without Cell Stack Limit support.\n"); diff --git a/src/map/battle.h b/src/map/battle.h index a8806613b3..e246079a18 100644 --- a/src/map/battle.h +++ b/src/map/battle.h @@ -57,7 +57,7 @@ enum e_battle_check_target { /// Damage structure struct Damage { #ifdef RENEWAL - int statusAtk, statusAtk2, weaponAtk, weaponAtk2, equipAtk, equipAtk2, masteryAtk, masteryAtk2; + int64 statusAtk, statusAtk2, weaponAtk, weaponAtk2, equipAtk, equipAtk2, masteryAtk, masteryAtk2; #endif int64 damage, /// Right hand damage damage2; /// Left hand damage @@ -81,10 +81,11 @@ struct block_list; // Damage Calculation struct Damage battle_calc_attack(int attack_type,struct block_list *bl,struct block_list *target,uint16 skill_id,uint16 skill_lv,int flag); +struct Damage battle_calc_attack_plant(struct Damage wd, struct block_list *src,struct block_list *target, uint16 skill_id, uint16 skill_lv); int64 battle_calc_return_damage(struct block_list *bl, struct block_list *src, int64 *, int flag, uint16 skill_id, bool status_reflect); -void battle_drain(struct map_session_data *sd, struct block_list *tbl, int64 rdamage, int64 ldamage, int race, int boss); +void battle_drain(struct map_session_data *sd, struct block_list *tbl, int64 rdamage, int64 ldamage, int race, int class_, bool infdef); int battle_attr_ratio(int atk_elem,int def_type, int def_lv); int64 battle_attr_fix(struct block_list *src, struct block_list *target, int64 damage,int atk_elem,int def_type, int def_lv); @@ -589,6 +590,7 @@ extern struct Battle_Config int homunculus_evo_intimacy_need; int homunculus_evo_intimacy_reset; int monster_loot_search_type; + int feature_roulette; } battle_config; void do_init_battle(void); diff --git a/src/map/channel.c b/src/map/channel.c index 307282a026..cd1f834ed7 100644 --- a/src/map/channel.c +++ b/src/map/channel.c @@ -339,7 +339,7 @@ int channel_send(struct Channel *channel, struct map_session_data *sd, const cha return -1; if(!pc_has_permission(sd, PC_PERM_CHANNEL_ADMIN) && channel->msg_delay != 0 && DIFF_TICK(sd->channel_tick + ( channel->msg_delay * 1000 ), gettick()) > 0) { - clif_colormes(sd,color_table[COLOR_RED],msg_txt(sd,1455)); //You're talking too fast! + clif_colormes(sd->fd,color_table[COLOR_RED],msg_txt(sd,1455)); //You're talking too fast! return -2; } else { @@ -483,7 +483,7 @@ int channel_display_list(struct map_session_data *sd, char *options){ for( k = 0; k < channel_config.colors_count; k++ ) { if (channel_config.colors[k]) { sprintf(msg, msg_txt(sd,1445),channel_config.colors_name[k]);// - '%s' - clif_colormes(sd,channel_config.colors[k],msg); + clif_colormes(sd->fd,channel_config.colors[k],msg); } } } diff --git a/src/map/chrif.c b/src/map/chrif.c index e1c56a7407..dd4c4696a1 100644 --- a/src/map/chrif.c +++ b/src/map/chrif.c @@ -63,7 +63,7 @@ static const int packet_len_table[0x3d] = { // U - used, F - free //2b0a: Outgoing, chrif_skillcooldown_request -> requesting the list of skillcooldown for char //2b0b: Incoming, chrif_skillcooldown_load -> received the list of cooldown for char //2b0c: Outgoing, chrif_changeemail -> 'change mail address ...' -//2b0d: Incoming, chrif_changedsex -> 'Change sex of acc XY' +//2b0d: Incoming, chrif_changedsex -> 'Change sex of acc XY' (or char) //2b0e: Outgoing, chrif_req_login_operation -> 'Do some operations (change sex, ban / unban etc)' //2b0f: Incoming, chrif_ack_login_req -> 'answer of the 2b0e' //2b10: Outgoing, chrif_updatefamelist -> 'Update the fame ranking lists and send them' @@ -867,17 +867,19 @@ int chrif_req_login_operation(int aid, const char* character_name, unsigned shor /** * S 2b0e .l .24B .w L L L - * Send an account modification (changesex) request to the login server (via char server). + * Send a sex change (for account or character) request to the login server (via char server). * @sd : Player requesting operation */ -int chrif_changesex(struct map_session_data *sd) { +int chrif_changesex(struct map_session_data *sd, bool change_account) { chrif_check(-1); WFIFOHEAD(char_fd,44); WFIFOW(char_fd,0) = 0x2b0e; WFIFOL(char_fd,2) = sd->status.account_id; safestrncpy((char*)WFIFOP(char_fd,6), sd->status.name, NAME_LENGTH); - WFIFOW(char_fd,30) = CHRIF_OP_LOGIN_CHANGESEX; + WFIFOW(char_fd,30) = (change_account ? CHRIF_OP_LOGIN_CHANGESEX : CHRIF_OP_LOGIN_CHANGECHARSEX); + if (!change_account) + WFIFOB(char_fd,32) = sd->status.sex == SEX_MALE ? SEX_FEMALE : SEX_MALE; WFIFOSET(char_fd,44); clif_displaymessage(sd->fd, msg_txt(sd,408)); //"Need disconnection to perform change-sex request..." @@ -920,6 +922,9 @@ static void chrif_ack_login_req(int aid, const char* player_name, uint16 type, u case CHRIF_OP_LOGIN_UNBLOCK: case CHRIF_OP_LOGIN_UNBAN: case CHRIF_OP_LOGIN_CHANGESEX: + case CHRIF_OP_LOGIN_CHANGECHARSEX: + if (type == CHRIF_OP_LOGIN_CHANGECHARSEX) + type--; // So we don't have to create a new msgstring. snprintf(action,25,"%s",msg_txt(sd,427+type)); //block|ban|unblock|unban|change the sex of break; case CHRIF_OP_LOGIN_VIP: @@ -932,7 +937,7 @@ static void chrif_ack_login_req(int aid, const char* player_name, uint16 type, u break; } - switch( answer ) { + switch (answer) { case 0: sprintf(output, msg_txt(sd,424), action, NAME_LENGTH, player_name); break; //Login-serv has been asked to %s '%.*s'. case 1: sprintf(output, msg_txt(sd,425), NAME_LENGTH, player_name); break; case 2: sprintf(output, msg_txt(sd,426), action, NAME_LENGTH, player_name); break; diff --git a/src/map/chrif.h b/src/map/chrif.h index fbbaddcb3b..1b05a54bb5 100644 --- a/src/map/chrif.h +++ b/src/map/chrif.h @@ -27,6 +27,7 @@ enum chrif_req_op { CHRIF_OP_LOGIN_UNBAN, CHRIF_OP_LOGIN_CHANGESEX, CHRIF_OP_LOGIN_VIP, + CHRIF_OP_LOGIN_CHANGECHARSEX, // Char-server operation CHRIF_OP_BAN, @@ -73,7 +74,7 @@ int chrif_char_offline_nsd(uint32 account_id, uint32 char_id); int chrif_char_reset_offline(void); int send_users_tochar(void); int chrif_char_online(struct map_session_data *sd); -int chrif_changesex(struct map_session_data *sd); +int chrif_changesex(struct map_session_data *sd, bool change_account); int chrif_chardisconnect(struct map_session_data *sd); int chrif_divorce(int partner_id1, int partner_id2); diff --git a/src/map/clif.c b/src/map/clif.c index 849661c84a..67d6159a6b 100644 --- a/src/map/clif.c +++ b/src/map/clif.c @@ -70,6 +70,7 @@ static struct s_packet_keys *packet_keys[MAX_PACKET_VER + 1]; static unsigned int clif_cryptKey[3]; // Used keys #endif static unsigned short clif_parse_cmd(int fd, struct map_session_data *sd); +static bool clif_session_isValid(struct map_session_data *sd); /** Converts item type to display it on client if necessary. * @param nameid: Item ID @@ -284,6 +285,12 @@ static inline unsigned char clif_bl_type(struct block_list *bl) { } #endif +static bool clif_session_isValid(struct map_session_data *sd) { + if (sd != NULL && sd->packet_ver <= MAX_PACKET_VER && session_isActive(sd->fd)) + return true; + return false; +} + /*========================================== * sub process of clif_send * Called from a map_foreachinarea (grabs all players in specific area and subjects them to this function) @@ -655,6 +662,9 @@ void clif_authok(struct map_session_data *sd) WFIFOB(fd,10) = 5; // ignored #if PACKETVER >= 20080102 WFIFOW(fd,11) = sd->status.font; +#endif +#if PACKETVER >= 20141016 + WFIFOB(fd,13) = sd->status.sex; #endif WFIFOSET(fd,packet_len(cmd)); } @@ -1250,13 +1260,13 @@ static void clif_spiritball_single(int fd, struct map_session_data *sd) /*========================================== * Kagerou/Oboro amulet spirit *------------------------------------------*/ -static void clif_talisman_single(int fd, struct map_session_data *sd, short type) +static void clif_spiritcharm_single(int fd, struct map_session_data *sd) { WFIFOHEAD(fd, packet_len(0x08cf)); WFIFOW(fd,0)=0x08cf; WFIFOL(fd,2)=sd->bl.id; - WFIFOW(fd,6)=type; - WFIFOW(fd,8)=sd->talisman[type]; + WFIFOW(fd,6)=sd->spiritcharm_type; + WFIFOW(fd,8)=sd->spiritcharm; WFIFOSET(fd, packet_len(0x08cf)); } @@ -1354,10 +1364,8 @@ int clif_spawn(struct block_list *bl) clif_specialeffect(bl,421,AREA); if( sd->bg_id && map[sd->bl.m].flag.battleground ) clif_sendbgemblem_area(sd); - for(i = 1; i < 5; i++){ - if( sd->talisman[i] > 0 ) - clif_talisman(sd, i); - } + if (sd->spiritcharm_type != CHARM_TYPE_NONE && sd->spiritcharm > 0) + clif_spiritcharm(sd); for (i = 0; i < sd->sc_display_count; i++) { if (sc && (sc->option&(OPTION_HIDE|OPTION_CLOAK|OPTION_INVISIBLE|OPTION_CHASEWALK))) clif_status_change2(&sd->bl,sd->bl.id,AREA,SI_BLANK,0,0,0); @@ -1403,7 +1411,7 @@ void clif_hominfo(struct map_session_data *sd, struct homun_data *hd, int flag) int htype; nullpo_retv(hd); - if (!sd) + if (!clif_session_isValid(sd)) return; status = &hd->battle_status; @@ -1503,6 +1511,9 @@ int clif_homskillinfoblock(struct map_session_data *sd) struct homun_data *hd; int fd = sd->fd; int i, len=4; + + nullpo_ret(sd); + WFIFOHEAD(fd, 4+37*MAX_HOMUNSKILL); hd = sd->hd; @@ -4310,10 +4321,8 @@ static void clif_getareachar_pc(struct map_session_data* sd,struct map_session_d if(dstsd->spiritball > 0) clif_spiritball_single(sd->fd, dstsd); - for(i = 1; i < 5; i++){ - if( dstsd->talisman[i] > 0 ) - clif_talisman_single(sd->fd, dstsd, i); - } + if (dstsd->spiritcharm_type != CHARM_TYPE_NONE && dstsd->spiritcharm > 0) + clif_spiritcharm_single(sd->fd, dstsd); for( i = 0; i < dstsd->sc_display_count; i++ ) { if (dstsd->sc.option&(OPTION_HIDE|OPTION_CLOAK|OPTION_INVISIBLE|OPTION_CHASEWALK)) clif_status_change2(&sd->bl, dstsd->bl.id, SELF, SI_BLANK, 0, 0, 0); @@ -5748,6 +5757,24 @@ void clif_displaymessage(const int fd, const char* mes) if (fd == 0) ; else { +#if PACKETVER == 20141022 + /** for some reason game client crashes depending on message pattern (only for this packet) **/ + /** so we redirect to ZC_NPC_CHAT **/ + //clif_colormes(fd, color_table[COLOR_DEFAULT], mes); + unsigned long color = (color_table[COLOR_DEFAULT] & 0x0000FF) << 16 | (color_table[COLOR_DEFAULT] & 0x00FF00) | (color_table[COLOR_DEFAULT] & 0xFF0000) >> 16; // RGB to BGR + + int len = strnlen(mes, 255); + + if (len > 0) { + WFIFOHEAD(fd, 13 + len); + WFIFOW(fd, 0) = 0x2C1; + WFIFOW(fd, 2) = 13 + len; + WFIFOL(fd, 4) = 0; + WFIFOL(fd, 8) = color; + safestrncpy((char*)WFIFOP(fd, 12), mes, len + 1); + WFIFOSET(fd, WFIFOW(fd, 2)); + } +#else char *message, *line; message = aStrdup(mes); @@ -5766,6 +5793,7 @@ void clif_displaymessage(const int fd, const char* mes) line = strtok(NULL, "\n"); } aFree(message); +#endif } } @@ -6459,7 +6487,7 @@ void clif_parse_BankOpen(int fd, struct map_session_data* sd) { //also mark something in case char ain't available for saving, should we check now ? nullpo_retv(sd); if( !battle_config.feature_banking ) { - clif_colormes(sd,color_table[COLOR_RED],msg_txt(sd,1496)); //Banking is disabled + clif_colormes(sd->fd,color_table[COLOR_RED],msg_txt(sd,1496)); //Banking is disabled return; } else { @@ -6499,7 +6527,7 @@ void clif_parse_BankClose(int fd, struct map_session_data* sd) { nullpo_retv(sd); if( !battle_config.feature_banking ) { - clif_colormes(sd,color_table[COLOR_RED],msg_txt(sd,1496)); //Banking is disabled + clif_colormes(sd->fd,color_table[COLOR_RED],msg_txt(sd,1496)); //Banking is disabled //still allow to go trough to not stuck player if we have disable it while they was in } if(sd->status.account_id == aid){ @@ -6541,7 +6569,7 @@ void clif_parse_BankCheck(int fd, struct map_session_data* sd) { nullpo_retv(sd); if( !battle_config.feature_banking ) { - clif_colormes(sd,color_table[COLOR_RED],msg_txt(sd,1496)); //Banking is disabled + clif_colormes(sd->fd,color_table[COLOR_RED],msg_txt(sd,1496)); //Banking is disabled return; } else { @@ -6585,7 +6613,7 @@ void clif_bank_deposit(struct map_session_data *sd, enum e_BANKING_DEPOSIT_ACK r void clif_parse_BankDeposit(int fd, struct map_session_data* sd) { nullpo_retv(sd); if( !battle_config.feature_banking ) { - clif_colormes(sd,color_table[COLOR_RED],msg_txt(sd,1496)); //Banking is disabled + clif_colormes(sd->fd,color_table[COLOR_RED],msg_txt(sd,1496)); //Banking is disabled return; } else { @@ -6633,7 +6661,7 @@ void clif_bank_withdraw(struct map_session_data *sd,enum e_BANKING_WITHDRAW_ACK void clif_parse_BankWithdraw(int fd, struct map_session_data* sd) { nullpo_retv(sd); if( !battle_config.feature_banking ) { - clif_colormes(sd,color_table[COLOR_RED],msg_txt(sd,1496)); //Banking is disabled + clif_colormes(sd->fd,color_table[COLOR_RED],msg_txt(sd,1496)); //Banking is disabled return; } else { @@ -6830,6 +6858,14 @@ void clif_openvending(struct map_session_data* sd, int id, struct s_vending* ven clif_addcards(WFIFOP(fd,22+i*22), &sd->status.cart[index]); } WFIFOSET(fd,WFIFOW(fd,2)); + +#if PACKETVER >= 20141022 + // Should go elsewhere perhaps? It has to be bundled with this however. + WFIFOHEAD(fd, 3); + WFIFOW(fd, 0) = 0xa28; + WFIFOB(fd, 2) = 0; // 1 is failure. Our current responses to failure are working so not yet implemented. + WFIFOSET(fd, 3); +#endif } @@ -8781,16 +8817,16 @@ void clif_specialeffect_value(struct block_list* bl, int effect_id, int num, sen } // Modification of clif_messagecolor to send colored messages to players to chat log only (doesn't display overhead) /// 02c1 .W .L .L .?B -int clif_colormes(struct map_session_data * sd, unsigned long color, const char* msg) { +int clif_colormes(int fd, unsigned long color, const char* msg) { unsigned short msg_len = strlen(msg) + 1; - WFIFOHEAD(sd->fd,msg_len + 12); - WFIFOW(sd->fd,0) = 0x2C1; - WFIFOW(sd->fd,2) = msg_len + 12; - WFIFOL(sd->fd,4) = 0; - WFIFOL(sd->fd,8) = color; //either color_table or channel_table - safestrncpy((char*)WFIFOP(sd->fd,12), msg, msg_len); - WFIFOSET(sd->fd, msg_len + 12); + WFIFOHEAD(fd,msg_len + 12); + WFIFOW(fd,0) = 0x2C1; + WFIFOW(fd,2) = msg_len + 12; + WFIFOL(fd,4) = 0; + WFIFOL(fd,8) = color; //either color_table or channel_table + safestrncpy((char*)WFIFOP(fd,12), msg, msg_len); + WFIFOSET(fd, msg_len + 12); return 0; } @@ -8870,7 +8906,6 @@ void clif_refresh_storagewindow(struct map_session_data *sd) { // refresh the client's screen, getting rid of any effects void clif_refresh(struct map_session_data *sd) { - int i; nullpo_retv(sd); clif_changemap(sd,sd->bl.m,sd->bl.x,sd->bl.y); @@ -8889,10 +8924,8 @@ void clif_refresh(struct map_session_data *sd) clif_updatestatus(sd,SP_LUK); if (sd->spiritball) clif_spiritball_single(sd->fd, sd); - for(i = 1; i < 5; i++){ - if( sd->talisman[i] > 0 ) - clif_talisman_single(sd->fd, sd, i); - } + if (sd->spiritcharm_type != CHARM_TYPE_NONE && sd->spiritcharm > 0) + clif_spiritcharm_single(sd->fd, sd); if (sd->vd.cloth_color) clif_refreshlook(&sd->bl,sd->bl.id,LOOK_CLOTHES_COLOR,sd->vd.cloth_color,SELF); if(hom_is_active(sd->hd)) @@ -10114,18 +10147,22 @@ void clif_hotkeys_send(struct map_session_data *sd) { #ifdef HOTKEY_SAVING const int fd = sd->fd; int i; + int offset = 2; #if PACKETVER < 20090603 const int cmd = 0x2b9; -#else +#elif PACKETVER < 20141022 const int cmd = 0x7d9; +#else + const int cmd = 0xa00; + offset = 3; #endif if (!fd) return; - WFIFOHEAD(fd, 2+MAX_HOTKEYS*7); + WFIFOHEAD(fd, offset + MAX_HOTKEYS * 7); WFIFOW(fd, 0) = cmd; for(i = 0; i < MAX_HOTKEYS; i++) { - WFIFOB(fd, 2 + 0 + i * 7) = sd->status.hotkeys[i].type; // type: 0: item, 1: skill - WFIFOL(fd, 2 + 1 + i * 7) = sd->status.hotkeys[i].id; // item or skill ID - WFIFOW(fd, 2 + 5 + i * 7) = sd->status.hotkeys[i].lv; // skill level + WFIFOB(fd, offset + 0 + i * 7) = sd->status.hotkeys[i].type; // type: 0: item, 1: skill + WFIFOL(fd, offset + 1 + i * 7) = sd->status.hotkeys[i].id; // item or skill ID + WFIFOW(fd, offset + 5 + i * 7) = sd->status.hotkeys[i].lv; // item qty or skill level } WFIFOSET(fd, packet_len(cmd)); #endif @@ -11504,7 +11541,8 @@ static void clif_parse_UseSkillToPos_mercenary(struct mercenary_data *md, struct return; if( DIFF_TICK(tick, md->ud.canact_tick) < 0 ) { - clif_skill_fail(md->master, skill_id, USESKILL_FAIL_SKILLINTERVAL, 0); + if (md->master) + clif_skill_fail(md->master, skill_id, USESKILL_FAIL_SKILLINTERVAL, 0); return; } @@ -12871,18 +12909,18 @@ void clif_parse_GuildChangeEmblem(int fd,struct map_session_data *sd){ return; if(!(battle_config.emblem_woe_change) && (agit_flag || agit2_flag) ){ - clif_colormes(sd,color_table[COLOR_RED],msg_txt(sd,385)); //"You not allowed to change emblem during woe" + clif_colormes(sd->fd,color_table[COLOR_RED],msg_txt(sd,385)); //"You not allowed to change emblem during woe" return; } emb_val = clif_validate_emblem(emblem, emblem_len); if(emb_val ==-1 ){ ShowWarning("clif_parse_GuildChangeEmblem: Rejected malformed guild emblem (size=%lu, accound_id=%d, char_id=%d, guild_id=%d).\n", emblem_len, sd->status.account_id, sd->status.char_id, sd->status.guild_id); - clif_colormes(sd,color_table[COLOR_RED],msg_txt(sd,386)); //"The chosen emblem was detected invalid\n" + clif_colormes(sd->fd,color_table[COLOR_RED],msg_txt(sd,386)); //"The chosen emblem was detected invalid\n" return; } else if(emb_val == -2){ char output[128]; safesnprintf(output,sizeof(output),msg_txt(sd,387),battle_config.emblem_transparency_limit); - clif_colormes(sd,color_table[COLOR_RED],output); //"The chosen emblem was detected invalid as it contain too much transparency (limit=%d)\n" + clif_colormes(sd->fd,color_table[COLOR_RED],output); //"The chosen emblem was detected invalid as it contain too much transparency (limit=%d)\n" return; } @@ -15737,7 +15775,7 @@ void clif_mercenary_updatestatus(struct map_session_data *sd, int type) struct mercenary_data *md; struct status_data *status; int fd; - if( sd == NULL || (md = sd->md) == NULL ) + if( !clif_session_isValid(sd) || (md = sd->md) == NULL ) return; fd = sd->fd; @@ -15807,7 +15845,7 @@ void clif_mercenary_info(struct map_session_data *sd) struct status_data *status; int atk; - if( sd == NULL || (md = sd->md) == NULL ) + if( !clif_session_isValid(sd) || (md = sd->md) == NULL ) return; fd = sd->fd; @@ -16335,7 +16373,7 @@ void clif_elemental_updatestatus(struct map_session_data *sd, int type) { struct status_data *status; int fd; - if( sd == NULL || (ed = sd->ed) == NULL ) + if( !clif_session_isValid(sd) || (ed = sd->ed) == NULL ) return; fd = sd->fd; @@ -16365,7 +16403,7 @@ void clif_elemental_info(struct map_session_data *sd) { struct elemental_data *ed; struct status_data *status; - if( sd == NULL || (ed = sd->ed) == NULL ) + if( !clif_session_isValid(sd) || (ed = sd->ed) == NULL ) return; fd = sd->fd; @@ -17166,7 +17204,7 @@ void clif_parse_SkillSelectMenu(int fd, struct map_session_data *sd) { /*========================================== * Kagerou/Oboro amulet spirit *------------------------------------------*/ -void clif_talisman(struct map_session_data *sd,short type) +void clif_spiritcharm(struct map_session_data *sd) { unsigned char buf[10]; @@ -17174,8 +17212,8 @@ void clif_talisman(struct map_session_data *sd,short type) WBUFW(buf,0)=0x08cf; WBUFL(buf,2)=sd->bl.id; - WBUFW(buf,6)=type; - WBUFW(buf,8)=sd->talisman[type]; + WBUFW(buf,6)=sd->spiritcharm_type; + WBUFW(buf,8)=sd->spiritcharm; clif_send(buf,packet_len(0x08cf),&sd->bl,AREA); } /// Move Item from or to Personal Tab (CZ_WHATSOEVER) [FE] @@ -17729,6 +17767,264 @@ void DumpUnknown(int fd,TBL_PC *sd,int cmd,int packet_len) } #endif +/// Roulette System +/// Author: Yommy + +/** + * Opens Roulette window + * @param fd + * @param sd + */ +void clif_parse_RouletteOpen(int fd, struct map_session_data* sd) +{ + nullpo_retv(sd); + + if (!battle_config.feature_roulette) { + clif_colormes(sd->fd,color_table[COLOR_RED],msg_txt(sd,1497)); //Roulette is disabled + return; + } + + WFIFOHEAD(fd,packet_len(0xa1a)); + WFIFOW(fd,0) = 0xa1a; + WFIFOB(fd,2) = 0; // result + WFIFOL(fd,3) = 0; // serial + WFIFOB(fd,7) = (sd->roulette.claimPrize) ? sd->roulette.stage - 1 : 0; + WFIFOB(fd,8) = (sd->roulette.claimPrize) ? sd->roulette.prizeIdx : -1; + WFIFOW(fd,9) = -1; //! TODO: Display bonus item + WFIFOL(fd,11) = sd->roulette_point.gold; + WFIFOL(fd,15) = sd->roulette_point.silver; + WFIFOL(fd,19) = sd->roulette_point.bronze; + WFIFOSET(fd,packet_len(0xa1a)); +} + +/** + * Generates information to be displayed + * @param fd + * @param sd + */ +void clif_parse_RouletteInfo(int fd, struct map_session_data* sd) +{ + unsigned short i, j, count = 0; + int len = 8 + (42 * 8); + + nullpo_retv(sd); + + if (!battle_config.feature_roulette) { + clif_colormes(sd->fd,color_table[COLOR_RED],msg_txt(sd,1497)); //Roulette is disabled + return; + } + + WFIFOHEAD(fd,len); + WFIFOW(fd,0) = 0xa1c; + WFIFOW(fd,2) = len; + WFIFOL(fd,4) = 1; // serial + + for(i = 0; i < MAX_ROULETTE_LEVEL; i++) { + for(j = 0; j < MAX_ROULETTE_COLUMNS - i; j++) { + WFIFOW(fd,8 * count + 8) = i; + WFIFOW(fd,8 * count + 10) = j; + WFIFOW(fd,8 * count + 12) = rd.nameid[i][j]; + WFIFOW(fd,8 * count + 14) = rd.qty[i][j]; + count++; + } + } + + WFIFOSET(fd,len); + return; +} + +/** + * Closes Roulette window + * @param fd + * @param sd + */ +void clif_parse_RouletteClose(int fd, struct map_session_data* sd) +{ + nullpo_retv(sd); + + if (!battle_config.feature_roulette) { + clif_colormes(sd->fd,color_table[COLOR_RED],msg_txt(sd,1497)); //Roulette is disabled + return; + } + + /** What do we need this for? (other than state tracking), game client closes the window without our response. **/ + return; +} + +/** + * + **/ +static void clif_roulette_recvitem_ack(struct map_session_data *sd, enum RECV_ROULETTE_ITEM_REQ type) { +#if PACKETVER >= 20141016 + uint16 cmd = 0xa22; + unsigned char buf[5]; + + nullpo_retv(sd); + + if (packet_db[sd->packet_ver][cmd].len == 0) + return; + + WBUFW(buf,0) = cmd; + WBUFB(buf,2) = type; + WBUFW(buf,3) = 0; //! TODO: Additional item + clif_send(buf, sizeof(buf), &sd->bl, SELF); +#endif +} + +/** + * Claim roulette reward + * @param sd Player + * @return 0:Success + **/ +static uint8 clif_roulette_getitem(struct map_session_data *sd) { + struct item it; + uint8 res = 1; + + nullpo_retr(1, sd); + + if (sd->roulette.prizeIdx < 0) + return RECV_ITEM_FAILED; + + memset(&it, 0, sizeof(it)); + + it.nameid = rd.nameid[sd->roulette.prizeStage][sd->roulette.prizeIdx]; + it.identify = 1; + + if ((res = pc_additem(sd, &it, rd.qty[sd->roulette.prizeStage][sd->roulette.prizeIdx], LOG_TYPE_ROULETTE)) == 0) { + ; // onSuccess + } + + sd->roulette.claimPrize = false; + sd->roulette.prizeStage = 0; + sd->roulette.prizeIdx = -1; + sd->roulette.stage = 0; + return res; +} + +/** + * Process the stage and attempt to give a prize + * @param fd + * @param sd + */ +void clif_parse_RouletteGenerate(int fd, struct map_session_data* sd) +{ + enum GENERATE_ROULETTE_ACK result = GENERATE_ROULETTE_SUCCESS; + short stage = sd->roulette.stage; + + nullpo_retv(sd); + + if (!battle_config.feature_roulette) { + clif_colormes(sd->fd,color_table[COLOR_RED],msg_txt(sd,1497)); //Roulette is disabled + return; + } + + if (sd->roulette.stage >= MAX_ROULETTE_LEVEL) + stage = sd->roulette.stage = 0; + + if (!stage) { + if (sd->roulette_point.bronze <= 0 && sd->roulette_point.silver < 10 && sd->roulette_point.gold < 10) + result = GENERATE_ROULETTE_NO_ENOUGH_POINT; + } + + if (result == GENERATE_ROULETTE_SUCCESS) { + if (!stage) { + if (sd->roulette_point.bronze > 0) { + sd->roulette_point.bronze -= 1; + pc_setreg2(sd, ROULETTE_BRONZE_VAR, sd->roulette_point.bronze); + } else if (sd->roulette_point.silver > 9) { + sd->roulette_point.silver -= 10; + stage = sd->roulette.stage = 2; + pc_setreg2(sd, ROULETTE_SILVER_VAR, sd->roulette_point.silver); + } else if (sd->roulette_point.gold > 9) { + sd->roulette_point.gold -= 10; + stage = sd->roulette.stage = 4; + pc_setreg2(sd, ROULETTE_GOLD_VAR, sd->roulette_point.gold); + } + } + + sd->roulette.prizeStage = stage; + sd->roulette.prizeIdx = rnd()%rd.items[stage]; + + if (rd.flag[stage][sd->roulette.prizeIdx]&1) { + clif_roulette_generate_ack(sd,GENERATE_ROULETTE_LOSING,stage,sd->roulette.prizeIdx,0); + clif_roulette_getitem(sd); + clif_roulette_recvitem_ack(sd, RECV_ITEM_SUCCESS); + return; + } + else { + sd->roulette.claimPrize = true; + sd->roulette.stage++; + } + } + + clif_roulette_generate_ack(sd,result,stage,(sd->roulette.prizeIdx == -1 ? 0 : sd->roulette.prizeIdx),0); +} + +/** + * Request to cash in prize + * @param fd + * @param sd + */ +void clif_parse_RouletteRecvItem(int fd, struct map_session_data* sd) +{ + enum RECV_ROULETTE_ITEM_REQ type = RECV_ITEM_FAILED; + nullpo_retv(sd); + + if (!battle_config.feature_roulette) { + clif_colormes(sd->fd,color_table[COLOR_RED],msg_txt(sd,1497)); //Roulette is disabled + return; + } + + if (sd->roulette.claimPrize && sd->roulette.prizeIdx != -1) { + switch (clif_roulette_getitem(sd)) { + case 0: + type = RECV_ITEM_SUCCESS; + break; + case 1: + case 4: + case 5: + type = RECV_ITEM_OVERCOUNT; + break; + case 2: + type = RECV_ITEM_OVERWEIGHT; + break; + case 7: + default: + type = RECV_ITEM_FAILED; + break; + } + } + + clif_roulette_recvitem_ack(sd,type); + return; +} + +/** + * Update Roulette window with current stats + * @param sd + * @param result + * @param stage + * @param prizeIdx + * @param bonusItemID + */ +void clif_roulette_generate_ack(struct map_session_data *sd, unsigned char result, short stage, short prizeIdx, short bonusItemID) +{ + int fd = sd->fd; + + nullpo_retv(sd); + + WFIFOHEAD(fd,packet_len(0xa20)); + WFIFOW(fd,0) = 0xa20; + WFIFOB(fd,2) = result; + WFIFOW(fd,3) = stage; + WFIFOW(fd,5) = prizeIdx; + WFIFOW(fd,7) = bonusItemID; + WFIFOL(fd,9) = sd->roulette_point.gold; + WFIFOL(fd,13) = sd->roulette_point.silver; + WFIFOL(fd,17) = sd->roulette_point.bronze; + WFIFOSET(fd,packet_len(0xa20)); +} + /*========================================== * Main client packet processing function *------------------------------------------*/ @@ -18120,8 +18416,17 @@ void packetdb_readdb(bool reload) //#0x09C0 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 0, 0,102, 0, 0, 0, 0, 0, 2, 0, -1, -1, 2, 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, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3, 11, 0, 11, -1, 0, 3, 11, 0, + 0, 11, 12, 11, 0, 0, 0, 0, 0,143, 0, 0, 0, 0, 0, 0, + //#0x0a00 +#if PACKETVER >= 20141022 + 269, 0, 0, 2, 6, 49, 6, 9, 26, 45, 47, 47, 56, -1, 0, 0, +#else + 269, 0, 0, 2, 6, 48, 6, 9, 26, 45, 47, 47, 56, -1, 0, 0, +#endif + 0, 0, 0, 26, 0, 0, 0, 0, 0, 2, 23, 2, -1, 2, 3, 2, + 21, 3, 5, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; struct { void (*func)(int, struct map_session_data *); @@ -18344,9 +18649,15 @@ void packetdb_readdb(bool reload) { clif_parse_client_version, "clientversion"}, { clif_parse_blocking_playcancel, "booking_playcancel"}, { clif_parse_ranklist, "ranklist"}, - /* Market NPC */ + // Market NPC { clif_parse_NPCMarketClosed, "npcmarketclosed" }, { clif_parse_NPCMarketPurchase, "npcmarketpurchase" }, + // Roulette + { clif_parse_RouletteOpen, "rouletteopen" }, + { clif_parse_RouletteInfo, "rouletteinfo" }, + { clif_parse_RouletteClose, "rouletteclose" }, + { clif_parse_RouletteGenerate, "roulettegenerate" }, + { clif_parse_RouletteRecvItem, "rouletterecvitem" }, {NULL,NULL} }; struct { @@ -18591,6 +18902,7 @@ void packetdb_readdb(bool reload) *------------------------------------------*/ void do_init_clif(void) { const char* colors[COLOR_MAX] = { + "0x00FF00", "0xFF0000", "0xFFFFFF", "0xFFFF00", diff --git a/src/map/clif.h b/src/map/clif.h index 2b0a0ef6bb..aaf0c03e42 100644 --- a/src/map/clif.h +++ b/src/map/clif.h @@ -33,9 +33,9 @@ struct party_booking_ad_info; #include enum { // packet DB - MIN_PACKET_DB = 0x0064, - MAX_PACKET_DB = 0xf00, - MAX_PACKET_VER = 46, + MIN_PACKET_DB = 0x064, + MAX_PACKET_DB = 0xAFF, + MAX_PACKET_VER = 51, MAX_PACKET_POS = 20, }; @@ -73,13 +73,42 @@ enum e_BANKING_DEPOSIT_ACK { BDA_NO_MONEY = 0x2, BDA_OVERFLOW = 0x3, }; - + enum e_BANKING_WITHDRAW_ACK { BWA_SUCCESS = 0x0, BWA_NO_MONEY = 0x1, BWA_UNKNOWN_ERROR = 0x2, }; +enum RECV_ROULETTE_ITEM_REQ { + RECV_ITEM_SUCCESS = 0x0, + RECV_ITEM_FAILED = 0x1, + RECV_ITEM_OVERCOUNT = 0x2, + RECV_ITEM_OVERWEIGHT = 0x3, +}; + +enum RECV_ROULETTE_ITEM_ACK { + RECV_ITEM_NORMAL = 0x0, + RECV_ITEM_LOSING = 0x1, +}; + +enum GENERATE_ROULETTE_ACK { + GENERATE_ROULETTE_SUCCESS = 0x0, + GENERATE_ROULETTE_FAILED = 0x1, + GENERATE_ROULETTE_NO_ENOUGH_POINT = 0x2, + GENERATE_ROULETTE_LOSING = 0x3, +}; + +enum OPEN_ROULETTE_ACK { + OPEN_ROULETTE_SUCCESS = 0x0, + OPEN_ROULETTE_FAILED = 0x1, +}; + +enum CLOSE_ROULETTE_ACK { + CLOSE_ROULETTE_SUCCESS = 0x0, + CLOSE_ROULETTE_FAILED = 0x1, +}; + // packet_db[SERVER] is reserved for server use #define SERVER 0 #define packet_len(cmd) packet_db[SERVER][cmd].len @@ -861,6 +890,14 @@ void clif_cashshop_open( struct map_session_data* sd ); void clif_display_pinfo(struct map_session_data *sd, int type); +/// Roulette +void clif_roulette_generate_ack(struct map_session_data *sd, unsigned char result, short stage, short prizeIdx, short bonusItemID); +void clif_parse_RouletteOpen(int fd, struct map_session_data *sd); +void clif_parse_RouletteInfo(int fd, struct map_session_data *sd); +void clif_parse_RouletteClose(int fd, struct map_session_data *sd); +void clif_parse_RouletteGenerate(int fd, struct map_session_data *sd); +void clif_parse_RouletteRecvItem(int fd, struct map_session_data *sd); + /** * 3CeAM **/ @@ -883,7 +920,7 @@ int clif_skill_itemlistwindow( struct map_session_data *sd, uint16 skill_id, uin void clif_elemental_info(struct map_session_data *sd); void clif_elemental_updatestatus(struct map_session_data *sd, int type); -void clif_talisman(struct map_session_data *sd, short type); +void clif_spiritcharm(struct map_session_data *sd); void clif_snap( struct block_list *bl, short x, short y ); void clif_monster_hp_bar( struct mob_data* md, int fd ); @@ -892,13 +929,14 @@ void clif_monster_hp_bar( struct mob_data* md, int fd ); * Color Table **/ enum clif_colors { + COLOR_DEFAULT, COLOR_RED, COLOR_WHITE, COLOR_YELLOW, COLOR_MAX }; unsigned long color_table[COLOR_MAX]; -int clif_colormes(struct map_session_data * sd, unsigned long color, const char* msg); +int clif_colormes(int fd, unsigned long color, const char* msg); void clif_channel_msg(struct Channel *channel, struct map_session_data *sd, char *msg, short color); diff --git a/src/map/elemental.c b/src/map/elemental.c index a1c44a9254..b9e4b056a0 100644 --- a/src/map/elemental.c +++ b/src/map/elemental.c @@ -526,6 +526,8 @@ int elemental_change_mode(struct elemental_data *ed, int mode) { } void elemental_heal(struct elemental_data *ed, int hp, int sp) { + if (ed->master == NULL) + return; if( hp ) clif_elemental_updatestatus(ed->master, SP_HP); if( sp ) diff --git a/src/map/homunculus.c b/src/map/homunculus.c index 3b78cc6c44..3bb4608ee1 100644 --- a/src/map/homunculus.c +++ b/src/map/homunculus.c @@ -184,7 +184,8 @@ void hom_delspiritball(TBL_HOM *hd, int count, int type) { * @param hd */ void hom_damage(struct homun_data *hd) { - clif_hominfo(hd->master,hd,0); + if (hd->master) + clif_hominfo(hd->master,hd,0); } /** @@ -513,7 +514,7 @@ int hom_levelup(struct homun_data *hd) APPLY_HOMUN_LEVEL_STATWEIGHT(); - if ( battle_config.homunculus_show_growth ) { + if ( hd->master && battle_config.homunculus_show_growth ) { char output[256] ; sprintf(output, "Growth: hp:%d sp:%d str(%.2f) agi(%.2f) vit(%.2f) int(%.2f) dex(%.2f) luk(%.2f) ", @@ -683,7 +684,7 @@ void hom_gainexp(struct homun_data *hd,int exp) hd->homunculus.exp += exp; - if (hd->homunculus.exp < hd->exp_next) { + if (hd->master && hd->homunculus.exp < hd->exp_next) { clif_hominfo(hd->master,hd,0); return; } @@ -745,7 +746,8 @@ int hom_decrease_intimacy(struct homun_data * hd, unsigned int value) * @param hd */ void hom_heal(struct homun_data *hd) { - clif_hominfo(hd->master,hd,0); + if (hd->master) + clif_hominfo(hd->master,hd,0); } /** diff --git a/src/map/itemdb.c b/src/map/itemdb.c index b769c7362b..d40c4f7299 100644 --- a/src/map/itemdb.c +++ b/src/map/itemdb.c @@ -929,6 +929,7 @@ static int itemdb_combo_split_atoi (char *str, int *val) { return i; } + /** * ,<{ script }> **/ @@ -1056,7 +1057,119 @@ static void itemdb_read_combos(const char* basedir, bool silent) { return; } +/** + * Process Roulette items + */ +bool itemdb_parse_roulette_db(void) +{ + int i, j; + uint32 count = 0; + // retrieve all rows from the item database + if (SQL_ERROR == Sql_Query(mmysql_handle, "SELECT * FROM `%s`", db_roulette_table)) { + Sql_ShowDebug(mmysql_handle); + return false; + } + + for (i = 0; i < MAX_ROULETTE_LEVEL; i++) + rd.items[i] = 0; + + for (i = 0; i < MAX_ROULETTE_LEVEL; i++) { + int k, limit = MAX_ROULETTE_COLUMNS - i; + + for (k = 0; k < limit && SQL_SUCCESS == Sql_NextRow(mmysql_handle); k++) { + char* data; + unsigned short item_id, amount; + int level, flag; + + Sql_GetData(mmysql_handle, 1, &data, NULL); level = atoi(data); + Sql_GetData(mmysql_handle, 2, &data, NULL); item_id = atoi(data); + Sql_GetData(mmysql_handle, 3, &data, NULL); amount = atoi(data); + Sql_GetData(mmysql_handle, 4, &data, NULL); flag = atoi(data); + + if (!itemdb_exists(item_id)) { + ShowWarning("itemdb_parse_roulette_db: Unknown item ID '%hu' in level '%d'\n", item_id, level); + continue; + } + if (amount < 1) { + ShowWarning("itemdb_parse_roulette_db: Unsupported amount '%hu' for item ID '%hu' in level '%d'\n", amount, item_id, level); + continue; + } + if (flag < 0 || flag > 1) { + ShowWarning("itemdb_parse_roulette_db: Unsupported flag '%d' for item ID '%hu' in level '%d'\n", flag, item_id, level); + continue; + } + + j = rd.items[i]; + RECREATE(rd.nameid[i], unsigned short, ++rd.items[i]); + RECREATE(rd.qty[i], unsigned short, rd.items[i]); + RECREATE(rd.flag[i], int, rd.items[i]); + + rd.nameid[i][j] = item_id; + rd.qty[i][j] = amount; + rd.flag[i][j] = flag; + + ++count; + } + } + + // free the query result + Sql_FreeResult(mmysql_handle); + + for (i = 0; i < MAX_ROULETTE_LEVEL; i++) { + int limit = MAX_ROULETTE_COLUMNS - i; + + if (rd.items[i] == limit) + continue; + + if (rd.items[i] > limit) { + ShowWarning("itemdb_parse_roulette_db: level %d has %d items, only %d supported, capping...\n", i + 1, rd.items[i], limit); + rd.items[i] = limit; + continue; + } + + /** this scenario = rd.items[i] < limit **/ + ShowWarning("itemdb_parse_roulette_db: Level %d has %d items, %d are required. Filling with Apples...\n", i + 1, rd.items[i], limit); + + rd.items[i] = limit; + RECREATE(rd.nameid[i], unsigned short, rd.items[i]); + RECREATE(rd.qty[i], unsigned short, rd.items[i]); + RECREATE(rd.flag[i], int, rd.items[i]); + + for (j = 0; j < MAX_ROULETTE_COLUMNS - i; j++) { + if (rd.qty[i][j]) + continue; + + rd.nameid[i][j] = ITEMID_APPLE; + rd.qty[i][j] = 1; + rd.flag[i][j] = 0; + } + } + + ShowStatus("Done reading '"CL_WHITE"%lu"CL_RESET"' entries in '"CL_WHITE"%s"CL_RESET"'.\n", count, db_roulette_table); + + return true; +} + +/** + * Free Roulette items + */ +static void itemdb_roulette_free(void) { + int i; + + for (i = 0; i < MAX_ROULETTE_LEVEL; i++) { + if (rd.nameid[i]) + aFree(rd.nameid[i]); + if (rd.qty[i]) + aFree(rd.qty[i]); + if (rd.flag[i]) + aFree(rd.flag[i]); + rd.nameid[i] = NULL; + rd.qty[i] = NULL; + rd.flag[i] = NULL; + rd.items[i] = 0; + } +} /*====================================== * Applies gender restrictions according to settings. [Skotlex] @@ -1074,6 +1187,7 @@ static char itemdb_gendercheck(struct item_data *id) return (battle_config.ignore_items_gender) ? 2 : id->sex; } + /** * [RRInd] * For backwards compatibility, in Renewal mode, MATK from weapons comes from the atk slot @@ -1574,11 +1688,15 @@ void itemdb_reload(void) { itemdb_group->clear(itemdb_group, itemdb_group_free); itemdb->clear(itemdb, itemdb_final_sub); db_clear(itemdb_combo); + itemdb_roulette_free(); // read new data itemdb_read(); cashshop_reloaddb(); + if (!itemdb_parse_roulette_db()) + battle_config.feature_roulette = 0; + //Epoque's awesome @reloaditemdb fix - thanks! [Ind] //- Fixes the need of a @reloadmobdb after a @reloaditemdb to re-link monster drop data for( i = 0; i < MAX_MOB_DB; i++ ) { @@ -1638,6 +1756,7 @@ void do_final_itemdb(void) { itemdb_group->destroy(itemdb_group, itemdb_group_free); itemdb->destroy(itemdb, itemdb_final_sub); destroy_item_data(dummy_item); + itemdb_roulette_free(); } /** @@ -1649,4 +1768,7 @@ void do_init_itemdb(void) { itemdb_group = uidb_alloc(DB_OPT_BASE); itemdb_create_dummy(); itemdb_read(); + + if (!itemdb_parse_roulette_db()) + battle_config.feature_roulette = 0; } diff --git a/src/map/itemdb.h b/src/map/itemdb.h index 7dfec962a4..34e8e56137 100644 --- a/src/map/itemdb.h +++ b/src/map/itemdb.h @@ -25,6 +25,9 @@ #define MAX_ITEMGROUP_RANDGROUP 4 ///Max group for random item (increase this when needed). TODO: Remove this limit and use dynamic size if needed +#define MAX_ROULETTE_LEVEL 7 /** client-defined value **/ +#define MAX_ROULETTE_COLUMNS 9 /** client-defined value **/ + #define CARD0_FORGE 0x00FF #define CARD0_CREATE 0x00FE #define CARD0_PET 0x0100 @@ -39,6 +42,7 @@ enum item_itemid ITEMID_YELLOW_POTION = 503, ITEMID_WHITE_POTION = 504, ITEMID_BLUE_POTION = 505, + ITEMID_APPLE = 512, ITEMID_HOLY_WATER = 523, ITEMID_PUMPKIN = 535, ITEMID_RED_SLIM_POTION = 545, @@ -371,6 +375,14 @@ struct s_item_group_db struct s_item_group_random random[MAX_ITEMGROUP_RANDGROUP]; //! TODO: Move this fixed array to dynamic size if needed. }; +/// Struct of Roulette db +struct s_roulette_db { + unsigned short *nameid[MAX_ROULETTE_LEVEL], /// Item ID + *qty[MAX_ROULETTE_LEVEL]; /// Amount of Item ID + int *flag[MAX_ROULETTE_LEVEL]; /// Whether the item is for loss or win + int items[MAX_ROULETTE_LEVEL]; /// Number of items in the list for each +} rd; + ///Main item data struct struct item_data { @@ -513,6 +525,8 @@ struct s_item_group_db *itemdb_group_exists(unsigned short group_id); char itemdb_pc_get_itemgroup(uint16 group_id, struct map_session_data *sd); uint16 itemdb_get_randgroupitem_count(uint16 group_id, uint8 sub_group, unsigned short nameid); +bool itemdb_parse_roulette_db(void); + void itemdb_reload(void); void do_final_itemdb(void); diff --git a/src/map/log.c b/src/map/log.c index debf48faed..40d0fb2b25 100644 --- a/src/map/log.c +++ b/src/map/log.c @@ -56,7 +56,7 @@ static char log_picktype2char(e_log_pick_type type) { case LOG_TYPE_TRADE: return 'T'; // (T)rade case LOG_TYPE_VENDING: return 'V'; // (V)ending - case LOG_TYPE_PICKDROP_PLAYER: return 'P'; // (P)player + case LOG_TYPE_PICKDROP_PLAYER: return 'P'; // (P)layer case LOG_TYPE_PICKDROP_MONSTER: return 'M'; // (M)onster case LOG_TYPE_NPC: return 'S'; // NPC (S)hop case LOG_TYPE_SCRIPT: return 'N'; // (N)PC Script @@ -75,6 +75,7 @@ static char log_picktype2char(e_log_pick_type type) case LOG_TYPE_OTHER: return 'X'; // Other case LOG_TYPE_CASH: return '$'; // Cash case LOG_TYPE_BOUND_REMOVAL: return 'F'; // Removed bound items when guild/party is broken + case LOG_TYPE_ROULETTE: return 'Y'; // Roulette Lotter(Y) } // should not get here, fallback diff --git a/src/map/log.h b/src/map/log.h index ebfc706274..c4a602349e 100644 --- a/src/map/log.h +++ b/src/map/log.h @@ -24,30 +24,31 @@ typedef enum e_log_chat_type typedef enum e_log_pick_type { LOG_TYPE_NONE = 0, - LOG_TYPE_TRADE = 0x00001, - LOG_TYPE_VENDING = 0x00002, - LOG_TYPE_PICKDROP_PLAYER = 0x00004, - LOG_TYPE_PICKDROP_MONSTER = 0x00008, - LOG_TYPE_NPC = 0x00010, - LOG_TYPE_SCRIPT = 0x00020, - LOG_TYPE_STEAL = 0x00040, - LOG_TYPE_CONSUME = 0x00080, - LOG_TYPE_PRODUCE = 0x00100, - LOG_TYPE_MVP = 0x00200, - LOG_TYPE_COMMAND = 0x00400, - LOG_TYPE_STORAGE = 0x00800, - LOG_TYPE_GSTORAGE = 0x01000, - LOG_TYPE_MAIL = 0x02000, - LOG_TYPE_AUCTION = 0x04000, - LOG_TYPE_BUYING_STORE = 0x08000, - LOG_TYPE_OTHER = 0x10000, - LOG_TYPE_CASH = 0x20000, - LOG_TYPE_BANK = 0x40000, - LOG_TYPE_BOUND_REMOVAL = 0x80000, + LOG_TYPE_TRADE = 0x000001, + LOG_TYPE_VENDING = 0x000002, + LOG_TYPE_PICKDROP_PLAYER = 0x000004, + LOG_TYPE_PICKDROP_MONSTER = 0x000008, + LOG_TYPE_NPC = 0x000010, + LOG_TYPE_SCRIPT = 0x000020, + LOG_TYPE_STEAL = 0x000040, + LOG_TYPE_CONSUME = 0x000080, + LOG_TYPE_PRODUCE = 0x000100, + LOG_TYPE_MVP = 0x000200, + LOG_TYPE_COMMAND = 0x000400, + LOG_TYPE_STORAGE = 0x000800, + LOG_TYPE_GSTORAGE = 0x001000, + LOG_TYPE_MAIL = 0x002000, + LOG_TYPE_AUCTION = 0x004000, + LOG_TYPE_BUYING_STORE = 0x008000, + LOG_TYPE_OTHER = 0x010000, + LOG_TYPE_CASH = 0x020000, + LOG_TYPE_BANK = 0x040000, + LOG_TYPE_BOUND_REMOVAL = 0x080000, + LOG_TYPE_ROULETTE = 0x100000, // combinations LOG_TYPE_LOOT = LOG_TYPE_PICKDROP_MONSTER|LOG_TYPE_CONSUME, // all - LOG_TYPE_ALL = 0xFFFFF, + LOG_TYPE_ALL = 0xFFFFFF, } e_log_pick_type; typedef enum e_log_cash_type diff --git a/src/map/map.c b/src/map/map.c index d9c0b0bf32..88aa384828 100644 --- a/src/map/map.c +++ b/src/map/map.c @@ -70,6 +70,7 @@ char mob_skill_db2_db[32] = "mob_skill_db2"; char vendings_db[32] = "vendings"; char vending_items_db[32] = "vending_items"; char market_table[32] = "market"; +char db_roulette_table[32] = "db_roulette"; // log database char log_db_ip[32] = "127.0.0.1"; @@ -3759,7 +3760,9 @@ int inter_config_read(char *cfgName) else if( strcmpi( w1, "vending_db" ) == 0 ) strcpy( vendings_db, w2 ); else if( strcmpi( w1, "vending_items_db" ) == 0 ) - strcpy( vending_items_db, w2 ); + strcpy(vending_items_db, w2); + else if( strcmpi(w1, "db_roulette_table") == 0) + strcpy(db_roulette_table, w2); else if (strcmpi(w1, "market_table") == 0) strcpy(market_table, w2); else diff --git a/src/map/map.h b/src/map/map.h index 04169f59f4..f2b5f0941f 100644 --- a/src/map/map.h +++ b/src/map/map.h @@ -370,6 +370,18 @@ enum e_element { #define MAX_ELE_LEVEL 4 /// Maximum Element level +/** + * Types of spirit charms + * NOTE: Code assumes that this matches the first entries in enum elements + */ +enum spirit_charm_types { + CHARM_TYPE_NONE = 0, + CHARM_TYPE_WATER, + CHARM_TYPE_LAND, + CHARM_TYPE_FIRE, + CHARM_TYPE_WIND +}; + enum mob_ai { AI_NONE = 0, AI_ATTACK, @@ -447,6 +459,9 @@ enum _sp { SP_CHARRENAME=125, SP_CHARFONT=126, SP_BANK_VAULT = 127, + SP_ROULETTE_BRONZE = 128, + SP_ROULETTE_SILVER = 129, + SP_ROULETTE_GOLD = 130, // Mercenaries SP_MERCFLEE=165, SP_MERCKILLS=189, SP_MERCFAITH=190, @@ -491,7 +506,7 @@ enum _sp { SP_UNSTRIPABLE_WEAPON,SP_UNSTRIPABLE_ARMOR,SP_UNSTRIPABLE_HELM,SP_UNSTRIPABLE_SHIELD, // 2034-2037 SP_INTRAVISION, SP_ADD_MONSTER_DROP_ITEMGROUP, SP_SP_LOSS_RATE, // 2038-2040 SP_ADD_SKILL_BLOW, SP_SP_VANISH_RATE, SP_MAGIC_SP_GAIN_VALUE, SP_MAGIC_HP_GAIN_VALUE, SP_ADD_MONSTER_ID_DROP_ITEM, //2041-2045 - SP_EMATK, SP_SP_GAIN_RACE_ATTACK, SP_HP_GAIN_RACE_ATTACK, SP_SKILL_USE_SP_RATE, //2046-2049 + SP_EMATK, SP_COMA_CLASS, SP_COMA_RACE, SP_SKILL_USE_SP_RATE, //2046-2049 SP_SKILL_COOLDOWN,SP_SKILL_FIXEDCAST, SP_SKILL_VARIABLECAST, SP_FIXCASTRATE, SP_VARCASTRATE, //2050-2054 SP_SKILL_USE_SP,SP_MAGIC_ATK_ELE, SP_ADD_FIXEDCAST, SP_ADD_VARIABLECAST, //2055-2058 SP_SET_DEF_RACE,SP_SET_MDEF_RACE,SP_HP_VANISH_RATE, //2059-2061 @@ -499,9 +514,7 @@ enum _sp { SP_IGNORE_DEF_CLASS, SP_DEF_RATIO_ATK_CLASS, SP_ADDCLASS, SP_SUBCLASS, SP_MAGIC_ADDCLASS, //2062-2066 SP_WEAPON_COMA_CLASS, SP_IGNORE_MDEF_CLASS_RATE, SP_EXP_ADDCLASS, SP_ADD_CLASS_DROP_ITEM, //2067-2070 SP_ADD_CLASS_DROP_ITEMGROUP, SP_ADDMAXWEIGHT, SP_ADD_ITEMGROUP_HEAL_RATE, // 2071-2073 - SP_HP_VANISH_RACE_RATE, SP_SP_VANISH_RACE_RATE, SP_HP_GAIN_RACE_ATTACK_RATE, SP_SP_GAIN_RACE_ATTACK_RATE, // 2074-2077 - SP_ABSORB_DMG_MAXHP, SP_HP_GAIN_ATTACK, SP_SP_GAIN_ATTACK, SP_HP_GAIN_ATTACK_RATE, SP_SP_GAIN_ATTACK_RATE, SP_SUB_SKILL, // 2078-2083 - SP_SUBDEF_ELE, // 2084 + SP_HP_VANISH_RACE_RATE, SP_SP_VANISH_RACE_RATE, SP_ABSORB_DMG_MAXHP, SP_SUB_SKILL, SP_SUBDEF_ELE, // 2074-2078 }; enum _look { @@ -996,6 +1009,7 @@ extern char mob_skill_db2_db[32]; extern char vendings_db[32]; extern char vending_items_db[32]; extern char market_table[32]; +extern char db_roulette_table[32]; void do_shutdown(void); diff --git a/src/map/mercenary.c b/src/map/mercenary.c index c69d7ae420..652d9f127a 100644 --- a/src/map/mercenary.c +++ b/src/map/mercenary.c @@ -408,6 +408,8 @@ bool mercenary_recv_data(struct s_mercenary *merc, bool flag) * @param sp SP amount **/ void mercenary_heal(struct mercenary_data *md, int hp, int sp) { + if (md->master == NULL) + return; if( hp ) clif_mercenary_updatestatus(md->master, SP_HP); if( sp ) diff --git a/src/map/npc.c b/src/map/npc.c index 43484403f6..3ff9c8e2b9 100644 --- a/src/map/npc.c +++ b/src/map/npc.c @@ -1253,7 +1253,7 @@ int npc_click(struct map_session_data* sd, struct npc_data* nd) } if (i == nd->u.shop.count) { - clif_colormes(sd, color_table[COLOR_RED], msg_txt(sd, 534)); + clif_colormes(sd->fd, color_table[COLOR_RED], msg_txt(sd, 534)); return false; } @@ -1670,7 +1670,7 @@ uint8 npc_buylist(struct map_session_data* sd, uint16 n, struct s_npc_buy_list * struct item_data *id = itemdb_exists(nd->u.shop.itemshop_nameid); sprintf(output,msg_txt(sd,712),id->jname,id->nameid); // You do not have enough %s %d. - clif_colormes(sd,color_table[COLOR_RED],output); + clif_colormes(sd->fd,color_table[COLOR_RED],output); return 1; } break; @@ -1678,7 +1678,7 @@ uint8 npc_buylist(struct map_session_data* sd, uint16 n, struct s_npc_buy_list * count = pc_readreg2(sd, nd->u.shop.pointshop_str); if (z > (double)count) { sprintf(output,msg_txt(sd,713),nd->u.shop.pointshop_str); // You do not have enough '%s'. - clif_colormes(sd,color_table[COLOR_RED],output); + clif_colormes(sd->fd,color_table[COLOR_RED],output); return 1; } break; diff --git a/src/map/npc.h b/src/map/npc.h index 238d7d01d6..89b159e819 100644 --- a/src/map/npc.h +++ b/src/map/npc.h @@ -53,6 +53,9 @@ struct npc_data { struct status_data status; unsigned int level,stat_point; + struct s_npc_params { + unsigned short str, agi, vit, int_, dex, luk; + } params; void* chatdb; // pointer to a npc_parse struct (see npc_chat.c) char* path;/* path dir */ diff --git a/src/map/pc.c b/src/map/pc.c index d8f1fc90a1..db999a1860 100755 --- a/src/map/pc.c +++ b/src/map/pc.c @@ -1353,6 +1353,13 @@ void pc_reg_received(struct map_session_data *sd) if (battle_config.feature_banking) sd->bank_vault = pc_readreg2(sd, BANK_VAULT_VAR); + if (battle_config.feature_roulette) { + sd->roulette_point.bronze = pc_readreg2(sd, ROULETTE_BRONZE_VAR); + sd->roulette_point.silver = pc_readreg2(sd, ROULETTE_SILVER_VAR); + sd->roulette_point.gold = pc_readreg2(sd, ROULETTE_GOLD_VAR); + } + sd->roulette.prizeIdx = -1; + //SG map and mob read [Komurka] for(i=0;ibonus.absorb_dmg_maxhp = max(sd->bonus.absorb_dmg_maxhp, val); break; - case SP_HP_GAIN_ATTACK: // bonus bHPGainAttack,n; - sd->bonus.hp_gain_attack += val; - break; - case SP_SP_GAIN_ATTACK: // bonus bSPGainAttack,n; - sd->bonus.sp_gain_attack += val; - break; - case SP_HP_GAIN_ATTACK_RATE: // bonus bHPGainAttackRate,n; - sd->bonus.hp_gain_attack_rate += val; - break; - case SP_SP_GAIN_ATTACK_RATE: // bonus bSPGainAttackRate,n; - sd->bonus.sp_gain_attack_rate += val; - break; default: ShowWarning("pc_bonus: unknown type %d %d !\n",type,val); break; @@ -3483,16 +3478,6 @@ void pc_bonus2(struct map_session_data *sd,int type,int type2,int val) if(sd->state.lr_flag != 2) sd->ignore_def_by_race[type2] += val; break; - case SP_SP_GAIN_RACE_ATTACK: // bonus2 bSPGainRaceAttack,r,n; - PC_BONUS_CHK_RACE(type2,SP_SP_GAIN_RACE_ATTACK); - if(sd->state.lr_flag != 2) - sd->sp_gain_race_attack[type2] = cap_value(sd->sp_gain_race_attack[type2] + val, 0, INT16_MAX); - break; - case SP_HP_GAIN_RACE_ATTACK: // bonus2 bHPGainRaceAttack,r,n; - PC_BONUS_CHK_RACE(type2,SP_HP_GAIN_RACE_ATTACK); - if(sd->state.lr_flag != 2) - sd->hp_gain_race_attack[type2] = cap_value(sd->hp_gain_race_attack[type2] + val, 0, INT16_MAX); - break; case SP_SKILL_USE_SP_RATE: // bonus2 bSkillUseSPrate,sk,n; if(sd->state.lr_flag == 2) break; @@ -3630,22 +3615,6 @@ void pc_bonus2(struct map_session_data *sd,int type,int type2,int val) sd->skillusesp[i].val = val; } break; - case SP_HP_GAIN_RACE_ATTACK_RATE: // bonus2 bHPGainRaceAttackRate,r,n; - PC_BONUS_CHK_RACE(type2,SP_HP_GAIN_RACE_ATTACK_RATE); - sd->hp_gain_race_attack_rate[type2] += val; - break; - case SP_SP_GAIN_RACE_ATTACK_RATE: // bonus2 bSPGainRaceAttackRate,r,n; - PC_BONUS_CHK_RACE(type2,SP_SP_GAIN_RACE_ATTACK_RATE); - sd->sp_gain_race_attack_rate[type2] += val; - break; - case SP_HP_GAIN_ATTACK_RATE: // bonus2 bHPGainAttackRate,x,n; - sd->hp_gain_attack.rate += type2; - sd->hp_gain_attack.per += val; - break; - case SP_SP_GAIN_ATTACK_RATE: // bonus2 bSPGainAttackRate,x,n; - sd->sp_gain_attack.rate += type2; - sd->sp_gain_attack.per += val; - break; case SP_SUB_SKILL: // bonus2 bSubSkill,sk,n; ARR_FIND(0, ARRAYLENGTH(sd->subskill), i, sd->subskill[i].id == type2 || sd->subskill[i].id == 0); if (i == ARRAYLENGTH(sd->subskill)) { @@ -3663,6 +3632,16 @@ void pc_bonus2(struct map_session_data *sd,int type,int type2,int val) PC_BONUS_CHK_ELEMENT(type2,SP_SUBDEF_ELE); sd->subdefele[type2] += val; break; + case SP_COMA_CLASS: // bonus2 bComaClass,c,n; + PC_BONUS_CHK_CLASS(type2,SP_COMA_CLASS); + sd->coma_class[type2] += val; + sd->special_state.bonus_coma = 1; + break; + case SP_COMA_RACE: // bonus2 bComaRace,r,n; + PC_BONUS_CHK_RACE(type2,SP_COMA_RACE); + sd->coma_race[type2] += val; + sd->special_state.bonus_coma = 1; + break; default: ShowWarning("pc_bonus2: unknown type %d %d %d!\n",type,type2,val); break; @@ -4603,7 +4582,7 @@ bool pc_isUseitem(struct map_session_data *sd,int n) } if (sd->state.storage_flag && item->type != IT_CASH) { - clif_colormes(sd, color_table[COLOR_RED], msg_txt(sd,388)); + clif_colormes(sd->fd, color_table[COLOR_RED], msg_txt(sd,388)); return false; // You cannot use this item while storage is open. } @@ -4700,7 +4679,7 @@ bool pc_isUseitem(struct map_session_data *sd,int n) return false; } if( !pc_inventoryblank(sd) ) { - clif_colormes(sd, color_table[COLOR_RED], msg_txt(sd, 732)); //Item cannot be open when inventory is full + clif_colormes(sd->fd, color_table[COLOR_RED], msg_txt(sd, 732)); //Item cannot be open when inventory is full return false; } } @@ -4815,7 +4794,7 @@ int pc_useitem(struct map_session_data *sd,int n) else sprintf(e_msg,msg_txt(sd,380), // Item Failed. [%s] is cooling down. Wait %d seconds. itemdb_jname(sd->item_delay[i].nameid), e_tick+1); - clif_colormes(sd,color_table[COLOR_YELLOW],e_msg); + clif_colormes(sd->fd,color_table[COLOR_YELLOW],e_msg); return 0; // Delay has not expired yet } } else {// not yet used item (all slots are initially empty) @@ -7206,7 +7185,7 @@ void pc_damage(struct map_session_data *sd,struct block_list *src,unsigned int h clif_progressbar_abort(sd); if( sd->status.pet_id > 0 && sd->pd && battle_config.pet_damage_support ) - pet_target_check(sd,src,1); + pet_target_check(sd->pd,src,1); if( sd->status.ele_id > 0 ) elemental_set_target(sd,src); @@ -7354,8 +7333,8 @@ int pc_dead(struct map_session_data *sd,struct block_list *src) if ( sd->spiritball !=0 ) pc_delspiritball(sd,sd->spiritball,0); - for(i = 1; i < 5; i++) - pc_del_talisman(sd, sd->talisman[i], i); + if (sd->spiritcharm_type != CHARM_TYPE_NONE && sd->spiritcharm > 0) + pc_delspiritcharm(sd,sd->spiritcharm,sd->spiritcharm_type); if (src) switch (src->type) { @@ -7639,7 +7618,10 @@ int pc_readparam(struct map_session_data* sd,int type) case SP_CHARMOVE: val = sd->status.character_moves; break; case SP_CHARRENAME: val = sd->status.rename; break; case SP_CHARFONT: val = sd->status.font; break; - case SP_BANK_VAULT: val = sd->bank_vault; break; + case SP_BANK_VAULT: val = sd->bank_vault; break; + case SP_ROULETTE_BRONZE: val = sd->roulette_point.bronze; break; + case SP_ROULETTE_SILVER: val = sd->roulette_point.silver; break; + case SP_ROULETTE_GOLD: val = sd->roulette_point.gold; break; case SP_CRITICAL: val = sd->battle_status.cri/10; break; case SP_ASPD: val = (2000-sd->battle_status.amotion)/10; break; case SP_BASE_ATK: val = sd->battle_status.batk; break; @@ -7898,6 +7880,18 @@ bool pc_setparam(struct map_session_data *sd,int type,int val) sd->bank_vault = cap_value(val, 0, MAX_BANK_ZENY); pc_setreg2(sd, BANK_VAULT_VAR, sd->bank_vault); return true; + case SP_ROULETTE_BRONZE: + sd->roulette_point.bronze = val; + pc_setreg2(sd, ROULETTE_BRONZE_VAR, sd->roulette_point.bronze); + return true; + case SP_ROULETTE_SILVER: + sd->roulette_point.silver = val; + pc_setreg2(sd, ROULETTE_SILVER_VAR, sd->roulette_point.silver); + return true; + case SP_ROULETTE_GOLD: + sd->roulette_point.gold = val; + pc_setreg2(sd, ROULETTE_GOLD_VAR, sd->roulette_point.gold); + return true; default: ShowError("pc_setparam: Attempted to set unknown parameter '%d'.\n", type); return false; @@ -10150,102 +10144,138 @@ bool pc_should_log_commands(struct map_session_data *sd) return pc_group_should_log_commands(pc_get_group_id(sd)); } -static int pc_talisman_timer(int tid, unsigned int tick, int id, intptr_t data) +/** + * Spirit Charm expiration timer. + * @see TimerFunc + */ +static int pc_spiritcharm_timer(int tid, unsigned int tick, int id, intptr_t data) { struct map_session_data *sd; - int i, type; + int i; - if( (sd=(struct map_session_data *)map_id2sd(id)) == NULL || sd->bl.type!=BL_PC ) + if ((sd = (struct map_session_data *)map_id2sd(id)) == NULL || sd->bl.type != BL_PC) return 1; - ARR_FIND(1, 5, type, sd->talisman[type] > 0); - - if( sd->talisman[type] <= 0 ) - { - ShowError("pc_talisman_timer: %d talisman's available. (aid=%d cid=%d tid=%d)\n", sd->talisman[type], sd->status.account_id, sd->status.char_id, tid); - sd->talisman[type] = 0; + if (sd->spiritcharm <= 0) { + ShowError("pc_spiritcharm_timer: %d spiritcharm's available. (aid=%d cid=%d tid=%d)\n", sd->spiritcharm, sd->status.account_id, sd->status.char_id, tid); + sd->spiritcharm = 0; + sd->spiritcharm_type = CHARM_TYPE_NONE; return 0; } - ARR_FIND(0, sd->talisman[type], i, sd->talisman_timer[type][i] == tid); - if( i == sd->talisman[type] ) - { - ShowError("pc_talisman_timer: timer not found (aid=%d cid=%d tid=%d)\n", sd->status.account_id, sd->status.char_id, tid); + ARR_FIND(0, sd->spiritcharm, i, sd->spiritcharm_timer[i] == tid); + + if (i == sd->spiritcharm) { + ShowError("pc_spiritcharm_timer: timer not found (aid=%d cid=%d tid=%d)\n", sd->status.account_id, sd->status.char_id, tid); return 0; } - sd->talisman[type]--; - if( i != sd->talisman[type] ) - memmove(sd->talisman_timer[type]+i, sd->talisman_timer[type]+i+1, (sd->talisman[type]-i)*sizeof(int)); - sd->talisman_timer[type][sd->talisman[type]] = INVALID_TIMER; + sd->spiritcharm--; - clif_talisman(sd, type); + if (i != sd->spiritcharm) + memmove(sd->spiritcharm_timer + i, sd->spiritcharm_timer + i + 1, (sd->spiritcharm - i) * sizeof(int)); + + sd->spiritcharm_timer[sd->spiritcharm] = INVALID_TIMER; + + if (sd->spiritcharm <= 0) + sd->spiritcharm_type = CHARM_TYPE_NONE; + + clif_spiritcharm(sd); return 0; } -void pc_add_talisman(struct map_session_data *sd,int interval,int max,int type) +/** + * Adds a spirit charm. + * @param sd: Target character + * @param interval: Duration + * @param max: Maximum amount of charms to add + * @param type: Charm type (@see spirit_charm_types) + */ +void pc_addspiritcharm(struct map_session_data *sd, int interval, int max, int type) { int tid, i; nullpo_retv(sd); - if(max > 10) - max = 10; - if(sd->talisman[type] < 0) - sd->talisman[type] = 0; + if (sd->spiritcharm_type != CHARM_TYPE_NONE && type != sd->spiritcharm_type) + pc_delspiritcharm(sd, sd->spiritcharm, sd->spiritcharm_type); - if( sd->talisman[type] && sd->talisman[type] >= max ) - { - if(sd->talisman_timer[type][0] != INVALID_TIMER) - delete_timer(sd->talisman_timer[type][0],pc_talisman_timer); - sd->talisman[type]--; - if( sd->talisman[type] != 0 ) - memmove(sd->talisman_timer[type]+0, sd->talisman_timer[type]+1, (sd->talisman[type])*sizeof(int)); - sd->talisman_timer[type][sd->talisman[type]] = INVALID_TIMER; + if (max > MAX_SPIRITCHARM) + max = MAX_SPIRITCHARM; + + if (sd->spiritcharm < 0) + sd->spiritcharm = 0; + + if (sd->spiritcharm && sd->spiritcharm >= max) { + if (sd->spiritcharm_timer[0] != INVALID_TIMER) + delete_timer(sd->spiritcharm_timer[0], pc_spiritcharm_timer); + sd->spiritcharm--; + if (sd->spiritcharm != 0) + memmove(sd->spiritcharm_timer + 0, sd->spiritcharm_timer + 1, (sd->spiritcharm) * sizeof(int)); + sd->spiritcharm_timer[sd->spiritcharm] = INVALID_TIMER; } - tid = add_timer(gettick()+interval, pc_talisman_timer, sd->bl.id, 0); - ARR_FIND(0, sd->talisman[type], i, sd->talisman_timer[type][i] == INVALID_TIMER || DIFF_TICK(get_timer(tid)->tick, get_timer(sd->talisman_timer[type][i])->tick) < 0); - if( i != sd->talisman[type] ) - memmove(sd->talisman_timer[type]+i+1, sd->talisman_timer[type]+i, (sd->talisman[type]-i)*sizeof(int)); - sd->talisman_timer[type][i] = tid; - sd->talisman[type]++; + tid = add_timer(gettick() + interval, pc_spiritcharm_timer, sd->bl.id, 0); + ARR_FIND(0, sd->spiritcharm, i, sd->spiritcharm_timer[i] == INVALID_TIMER || DIFF_TICK(get_timer(tid)->tick, get_timer(sd->spiritcharm_timer[i])->tick) < 0); - clif_talisman(sd, type); + if (i != sd->spiritcharm) + memmove(sd->spiritcharm_timer + i + 1, sd->spiritcharm_timer + i, (sd->spiritcharm - i) * sizeof(int)); + + sd->spiritcharm_timer[i] = tid; + sd->spiritcharm++; + sd->spiritcharm_type = type; + + clif_spiritcharm(sd); } -void pc_del_talisman(struct map_session_data *sd,int count,int type) +/** + * Removes one or more spirit charms. + * @param sd: The target character + * @param count: Amount of charms to remove + * @param type: Type of charm to remove + */ +void pc_delspiritcharm(struct map_session_data *sd, int count, int type) { int i; nullpo_retv(sd); - if( sd->talisman[type] <= 0 ) { - sd->talisman[type] = 0; + if (sd->spiritcharm_type != type) + return; + + if (sd->spiritcharm <= 0) { + sd->spiritcharm = 0; return; } - if( count <= 0 ) + if (count <= 0) return; - if( count > sd->talisman[type] ) - count = sd->talisman[type]; - sd->talisman[type] -= count; - if( count > 10 ) - count = 10; - for(i = 0; i < count; i++) { - if(sd->talisman_timer[type][i] != INVALID_TIMER) { - delete_timer(sd->talisman_timer[type][i],pc_talisman_timer); - sd->talisman_timer[type][i] = INVALID_TIMER; + if (count > sd->spiritcharm) + count = sd->spiritcharm; + + sd->spiritcharm -= count; + + if (count > MAX_SPIRITCHARM) + count = MAX_SPIRITCHARM; + + for (i = 0; i < count; i++) { + if (sd->spiritcharm_timer[i] != INVALID_TIMER) { + delete_timer(sd->spiritcharm_timer[i], pc_spiritcharm_timer); + sd->spiritcharm_timer[i] = INVALID_TIMER; } } - for(i = count; i < 10; i++) { - sd->talisman_timer[type][i-count] = sd->talisman_timer[type][i]; - sd->talisman_timer[type][i] = INVALID_TIMER; + + for (i = count; i < MAX_SPIRITCHARM; i++) { + sd->spiritcharm_timer[i - count] = sd->spiritcharm_timer[i]; + sd->spiritcharm_timer[i] = INVALID_TIMER; } - clif_talisman(sd, type); + if (sd->spiritcharm <= 0) + sd->spiritcharm_type = CHARM_TYPE_NONE; + + clif_spiritcharm(sd); } #if defined(RENEWAL_DROP) || defined(RENEWAL_EXP) @@ -11119,7 +11149,7 @@ enum e_BANKING_WITHDRAW_ACK pc_bank_withdraw(struct map_session_data *sd, int mo return BWA_NO_MONEY; } else if ( limit_check > MAX_ZENY ) { /* no official response for this scenario exists. */ - clif_colormes(sd,color_table[COLOR_RED],msg_txt(sd,1495)); //You can't withdraw that much money + clif_colormes(sd->fd,color_table[COLOR_RED],msg_txt(sd,1495)); //You can't withdraw that much money return BWA_UNKNOWN_ERROR; } @@ -11574,7 +11604,7 @@ void do_init_pc(void) { add_timer_func_list(pc_spiritball_timer, "pc_spiritball_timer"); add_timer_func_list(pc_follow_timer, "pc_follow_timer"); add_timer_func_list(pc_endautobonus, "pc_endautobonus"); - add_timer_func_list(pc_talisman_timer, "pc_talisman_timer"); + add_timer_func_list(pc_spiritcharm_timer, "pc_spiritcharm_timer"); add_timer_func_list(pc_global_expiration_timer, "pc_global_expiration_timer"); add_timer_func_list(pc_expiration_timer, "pc_expiration_timer"); add_timer_func_list(pc_autotrade_timer, "pc_autotrade_timer"); diff --git a/src/map/pc.h b/src/map/pc.h index bdd1d96c66..1b545ae04c 100644 --- a/src/map/pc.h +++ b/src/map/pc.h @@ -28,8 +28,12 @@ #define DAMAGELOG_SIZE_PC 100 /// Damage log #define MAX_SPIRITBALL 15 /// Max spirit balls #define MAX_DEVOTION 5 /// Max Devotion slots +#define MAX_SPIRITCHARM 10 /// Max spirit charms #define BANK_VAULT_VAR "#BANKVAULT" +#define ROULETTE_BRONZE_VAR "RouletteBronze" +#define ROULETTE_SILVER_VAR "RouletteSilver" +#define ROULETTE_GOLD_VAR "RouletteGold" //Update this max as necessary. 55 is the value needed for Super Baby currently //Raised to 84 since Expanded Super Novice needs it. @@ -327,9 +331,11 @@ struct map_session_data { int subrace2[RC2_MAX]; int subsize[SZ_MAX]; short reseff[SC_COMMON_MAX-SC_COMMON_MIN+1]; //TODO: Make this for all SC? - int weapon_coma_ele[ELE_MAX]; - int weapon_coma_race[RC_MAX]; - int weapon_coma_class[CLASS_MAX]; + short coma_class[CLASS_MAX]; + short coma_race[RC_MAX]; + short weapon_coma_ele[ELE_MAX]; + short weapon_coma_race[RC_MAX]; + short weapon_coma_class[CLASS_MAX]; int weapon_atk[16]; int weapon_atk_rate[16]; int arrow_addele[ELE_MAX]; @@ -348,10 +354,6 @@ struct map_session_data { int ignore_mdef_by_class[CLASS_MAX]; int ignore_def_by_race[RC_MAX]; short sp_gain_race[RC_MAX]; - short sp_gain_race_attack[RC_MAX]; - short hp_gain_race_attack[RC_MAX]; - short hp_gain_race_attack_rate[RC_MAX]; - short sp_gain_race_attack_rate[RC_MAX]; // zeroed arrays end here. // zeroed structures start here @@ -389,7 +391,7 @@ struct map_session_data { struct s_bonus_vanish_gain { short rate, ///< Success rate 0 - 1000 (100%) per; ///< % HP/SP vanished/gained - } hp_vanish_race[RC_MAX], sp_vanish_race[RC_MAX], hp_gain_attack, sp_gain_attack; + } hp_vanish_race[RC_MAX], sp_vanish_race[RC_MAX]; // zeroed structures end here // manually zeroed structures start here. @@ -437,8 +439,6 @@ struct map_session_data { int ematk; // matk bonus from equipment int eatk; // atk bonus from equipment uint8 absorb_dmg_maxhp; // [Cydh] - short hp_gain_attack, sp_gain_attack; - short hp_gain_attack_rate, sp_gain_attack_rate; } bonus; // zeroed vars end here. @@ -454,8 +454,9 @@ struct map_session_data { int8 spiritball, spiritball_old; int spirit_timer[MAX_SPIRITBALL]; - short talisman[ELE_POISON+1]; // There are actually 5 talisman Fire, Ice, Wind, Earth & Poison maybe because its color violet. - int talisman_timer[ELE_POISON+1][10]; + short spiritcharm; //No. of spirit + int spiritcharm_type; //Spirit type + int spiritcharm_timer[MAX_SPIRITCHARM]; unsigned char potion_success_counter; //Potion successes in row counter unsigned char mission_count; //Stores the bounty kill count for TK_MISSION @@ -643,6 +644,17 @@ struct map_session_data { #ifdef PACKET_OBFUSCATION unsigned int cryptKey; ///< Packet obfuscation key to be used for the next received packet #endif + + struct { + int bronze, silver, gold; ///< Roulette Coin + } roulette_point; + + struct { + short stage; + int8 prizeIdx; + short prizeStage; + bool claimPrize; + } roulette; }; struct eri *pc_sc_display_ers; /// Player's SC display table @@ -1153,8 +1165,8 @@ void pc_itemcd_do(struct map_session_data *sd, bool load); int pc_load_combo(struct map_session_data *sd); -void pc_add_talisman(struct map_session_data *sd,int interval,int max,int type); -void pc_del_talisman(struct map_session_data *sd,int count,int type); +void pc_addspiritcharm(struct map_session_data *sd, int interval, int max, int type); +void pc_delspiritcharm(struct map_session_data *sd, int count, int type); void pc_baselevelchanged(struct map_session_data *sd); diff --git a/src/map/pet.c b/src/map/pet.c index 71c332adfc..c1760ddd1a 100644 --- a/src/map/pet.c +++ b/src/map/pet.c @@ -64,7 +64,7 @@ void pet_set_intimate(struct pet_data *pd, int value) pd->pet.intimate = value; - if( (intimate >= battle_config.pet_equip_min_friendly && pd->pet.intimate < battle_config.pet_equip_min_friendly) || (intimate < battle_config.pet_equip_min_friendly && pd->pet.intimate >= battle_config.pet_equip_min_friendly) ) + if( sd && (intimate >= battle_config.pet_equip_min_friendly && pd->pet.intimate < battle_config.pet_equip_min_friendly) || (intimate < battle_config.pet_equip_min_friendly && pd->pet.intimate >= battle_config.pet_equip_min_friendly) ) status_calc_pc(sd,SCO_NONE); } @@ -156,12 +156,11 @@ int pet_attackskill(struct pet_data *pd, int target_id) * @param type : pet's attack rate type * @return 0 */ -int pet_target_check(struct map_session_data *sd,struct block_list *bl,int type) +int pet_target_check(struct pet_data *pd,struct block_list *bl,int type) { - struct pet_data *pd; int rate; - pd = sd->pd; + nullpo_ret(pd); Assert((pd->master == 0) || (pd->master->pd == pd)); diff --git a/src/map/pet.h b/src/map/pet.h index ed60daff67..941b3664a2 100644 --- a/src/map/pet.h +++ b/src/map/pet.h @@ -108,7 +108,7 @@ struct pet_data { int pet_create_egg(struct map_session_data *sd, unsigned short item_id); int pet_hungry_val(struct pet_data *pd); void pet_set_intimate(struct pet_data *pd, int value); -int pet_target_check(struct map_session_data *sd,struct block_list *bl,int type); +int pet_target_check(struct pet_data *pd,struct block_list *bl,int type); int pet_unlocktarget(struct pet_data *pd); int pet_sc_check(struct map_session_data *sd, int type); //Skotlex int search_petDB_index(int key,int type); diff --git a/src/map/script.c b/src/map/script.c index d035a8e964..3f2f594e08 100644 --- a/src/map/script.c +++ b/src/map/script.c @@ -11191,9 +11191,9 @@ BUILDIN_FUNC(changebase) } /** - * Change sec and unequip all item and request for a changesex to char-serv + * Change account sex and unequip all item and request for a changesex to char-serv * changesex({}); - **/ + */ BUILDIN_FUNC(changesex) { int i; @@ -11204,12 +11204,42 @@ BUILDIN_FUNC(changesex) pc_resetskill(sd,4); // to avoid any problem with equipment and invalid sex, equipment is unequiped. - for( i=0; iequip_index[i] >= 0 ) pc_unequipitem(sd, sd->equip_index[i], 3); - chrif_changesex(sd); + for(i = 0; i < EQI_MAX; i++) { + if (sd->equip_index[i] >= 0) + pc_unequipitem(sd, sd->equip_index[i], 3); + } + + chrif_changesex(sd, true); return SCRIPT_CMD_SUCCESS; } +/** + * Change character's sex and unequip all item and request for a changesex to char-serv + * changecharsex({}); + */ +BUILDIN_FUNC(changecharsex) +{ +#if PACKETVER >= 20141016 + int i; + TBL_PC *sd = NULL; + + if (!script_charid2sd(2,sd)) + return SCRIPT_CMD_FAILURE; + + pc_resetskill(sd,4); + // to avoid any problem with equipment and invalid sex, equipment is unequiped. + for (i = 0; i < EQI_MAX; i++) { + if (sd->equip_index[i] >= 0) + pc_unequipitem(sd, sd->equip_index[i], 3); + } + + chrif_changesex(sd, false); + return SCRIPT_CMD_SUCCESS; +#else + return SCRIPT_CMD_FAILURE; +#endif +} + /*========================================== * Works like 'announce' but outputs in the common chat window *------------------------------------------*/ @@ -16024,7 +16054,7 @@ BUILDIN_FUNC(callshop) } if (i == nd->u.shop.count) { - clif_colormes(sd, color_table[COLOR_RED], msg_txt(sd, 534)); + clif_colormes(sd->fd, color_table[COLOR_RED], msg_txt(sd, 534)); return false; } @@ -16666,10 +16696,10 @@ BUILDIN_FUNC(getunitdata) TBL_PET* pd = NULL; TBL_ELEM* ed = NULL; TBL_NPC* nd = NULL; - int64 num; char* name; + struct script_data *data = script_getdata(st, 3); - if (!data_isreference(script_getdata(st, 3))) { + if (!data_isreference(data)) { ShowWarning("buildin_getunitdata: Error in argument! Please give a variable to store values in.\n"); return SCRIPT_CMD_FAILURE; } @@ -16690,10 +16720,9 @@ BUILDIN_FUNC(getunitdata) case BL_NPC: nd = map_id2nd(bl->id); break; } - num = st->stack->stack_data[st->start+3].u.num; - name = (char *)(str_buf+str_data[num&0x00ffffff].str); + name = reference_getname(data); -#define getunitdata_sub(idx__,var__) setd_sub(st,sd,name,(idx__),(void *)__64BPRTSIZE((int)(var__)),script_getref(st,3)) +#define getunitdata_sub(idx__,var__) setd_sub(st,sd,name,(idx__),(void *)__64BPRTSIZE((int)(var__)),data->ref) switch(bl->type) { case BL_MOB: @@ -16904,7 +16933,16 @@ BUILDIN_FUNC(setunitdata) case BL_PET: pd = map_id2pd(bl->id); break; case BL_MER: mc = map_id2mc(bl->id); break; case BL_ELEM: ed = map_id2ed(bl->id); break; - case BL_NPC: nd = map_id2nd(bl->id); break; + case BL_NPC: + nd = map_id2nd(bl->id); + if (!nd->status.hp) + status_calc_npc(nd, SCO_FIRST); + else + status_calc_npc(nd, SCO_NONE); + break; + default: + ShowError("buildin_setunitdata: Invalid object!"); + return SCRIPT_CMD_FAILURE; } type = script_getnum(st, 3); @@ -17095,7 +17133,7 @@ BUILDIN_FUNC(setunitdata) break; case BL_NPC: - if (!md) { + if (!nd) { ShowWarning("buildin_setunitdata: Error in finding object BL_NPC!\n"); return SCRIPT_CMD_FAILURE; } @@ -17108,12 +17146,12 @@ BUILDIN_FUNC(setunitdata) case 5: if (!unit_walktoxy(bl, (short)value, nd->bl.y, 2)) unit_movepos(bl, (short)value, nd->bl.x, 0, 0); break; case 6: if (!unit_walktoxy(bl, nd->bl.x, (short)value, 2)) unit_movepos(bl, nd->bl.x, (short)value, 0, 0); break; case 7: unit_setdir(bl, (uint8)value); break; - case 8: nd->status.str = (unsigned short)value; status_calc_bl(bl, SCB_ALL); break; - case 9: nd->status.agi = (unsigned short)value; status_calc_bl(bl, SCB_ALL); break; - case 10: nd->status.vit = (unsigned short)value; status_calc_bl(bl, SCB_ALL); break; - case 11: nd->status.int_ = (unsigned short)value; status_calc_bl(bl, SCB_ALL); break; - case 12: nd->status.dex = (unsigned short)value; status_calc_bl(bl, SCB_ALL); break; - case 13: nd->status.luk = (unsigned short)value; status_calc_bl(bl, SCB_ALL); break; + case 8: nd->params.str = (unsigned short)value; status_calc_bl(bl, SCB_ALL); break; + case 9: nd->params.agi = (unsigned short)value; status_calc_bl(bl, SCB_ALL); break; + case 10: nd->params.vit = (unsigned short)value; status_calc_bl(bl, SCB_ALL); break; + case 11: nd->params.int_ = (unsigned short)value; status_calc_bl(bl, SCB_ALL); break; + case 12: nd->params.dex = (unsigned short)value; status_calc_bl(bl, SCB_ALL); break; + case 13: nd->params.luk = (unsigned short)value; status_calc_bl(bl, SCB_ALL); break; default: ShowError("buildin_setunitdata: Unknown data identifier %d for BL_NPC.\n", type); return SCRIPT_CMD_FAILURE; @@ -17475,9 +17513,9 @@ BUILDIN_FUNC(unitskilluseid) if (bl != NULL) { if (bl->type == BL_NPC) { if (!((TBL_NPC*)bl)->status.hp) - status_calc_npc(((TBL_NPC*)bl), true); + status_calc_npc(((TBL_NPC*)bl), SCO_FIRST); else - status_calc_npc(((TBL_NPC*)bl), false); + status_calc_npc(((TBL_NPC*)bl), SCO_NONE); } unit_skilluse_id2(bl, target_id, skill_id, skill_lv, (casttime * 1000) + skill_castfix(bl, skill_id, skill_lv), skill_get_castcancel(skill_id)); } @@ -17739,7 +17777,7 @@ BUILDIN_FUNC(openauction) return SCRIPT_CMD_FAILURE; if( !battle_config.feature_auction ) { - clif_colormes(sd, color_table[COLOR_RED], msg_txt(sd, 517)); + clif_colormes(sd->fd, color_table[COLOR_RED], msg_txt(sd, 517)); return 0; } @@ -17995,21 +18033,23 @@ BUILDIN_FUNC(questinfo) int quest_id, icon; struct questinfo qi; - if( nd == NULL || nd->bl.m == -1 ) - return true; + if( nd == NULL || nd->bl.m == -1 ) { + ShowError("buildin_questinfo: No NPC attached.\n"); + return SCRIPT_CMD_FAILURE; + } quest_id = script_getnum(st, 2); icon = script_getnum(st, 3); - #if PACKETVER >= 20120410 - if(icon < 0 || (icon > 8 && icon != 9999) || icon == 7) - icon = 9999; // Default to nothing if icon id is invalid. - #else - if(icon < 0 || icon > 7) - icon = 0; - else - icon = icon + 1; - #endif +#if PACKETVER >= 20120410 + if(icon < 0 || (icon > 8 && icon != 9999) || icon == 7) + icon = 9999; // Default to nothing if icon id is invalid. +#else + if(icon < 0 || icon > 7) + icon = 0; + else + icon = icon + 1; +#endif qi.quest_id = quest_id; qi.icon = (unsigned char)icon; @@ -18040,7 +18080,7 @@ BUILDIN_FUNC(questinfo) map_add_questinfo(nd->bl.m,&qi); - return true; + return SCRIPT_CMD_SUCCESS; } /** @@ -18176,15 +18216,15 @@ BUILDIN_FUNC(showevent) } } - #if PACKETVER >= 20120410 - if(icon < 0 || (icon > 8 && icon != 9999) || icon == 7) - icon = 9999; // Default to nothing if icon id is invalid. - #else - if(icon < 0 || icon > 7) - icon = 0; - else - icon = icon + 1; - #endif +#if PACKETVER >= 20120410 + if(icon < 0 || (icon > 8 && icon != 9999) || icon == 7) + icon = 9999; // Default to nothing if icon id is invalid. +#else + if(icon < 0 || icon > 7) + icon = 0; + else + icon = icon + 1; +#endif clif_quest_show_event(sd, &nd->bl, icon, color); return SCRIPT_CMD_SUCCESS; @@ -20000,9 +20040,6 @@ BUILDIN_FUNC(montransform) { val4 = script_getnum(st, 8); if (tick != 0) { - char msg[CHAT_SIZE_MAX]; - struct mob_db *monster = mob_db(mob_id); - if (battle_config.mon_trans_disable_in_gvg && map_flag_gvg2(sd->bl.m)) { clif_displaymessage(sd->fd, msg_txt(sd,731)); // Transforming into monster is not allowed in Guild Wars. return SCRIPT_CMD_FAILURE; @@ -20013,11 +20050,9 @@ BUILDIN_FUNC(montransform) { return SCRIPT_CMD_FAILURE; } - sprintf(msg, msg_txt(sd,728), monster->name); // Traaaansformation-!! %s form!! - clif_showscript(&sd->bl, msg); status_change_end(&sd->bl, SC_MONSTER_TRANSFORM, INVALID_TIMER); // Clear previous sc_start2(NULL, &sd->bl, SC_MONSTER_TRANSFORM, 100, mob_id, type, tick); - if (script_hasdata(st, 4)) + if (type != SC_NONE) sc_start4(NULL, &sd->bl, type, 100, val1, val2, val3, val4, tick); } @@ -20435,6 +20470,35 @@ BUILDIN_FUNC(getvar) { return SCRIPT_CMD_SUCCESS; } +/** + * Display script message + * showscript ""{,}; + **/ +BUILDIN_FUNC(showscript) { + struct block_list *bl = NULL; + const char *msg = script_getstr(st,2); + int id = 0; + + if (script_hasdata(st,3)) { + id = script_getnum(st,3); + bl = map_id2bl(id); + } + else { + bl = st->rid ? map_id2bl(st->rid) : map_id2bl(st->oid); + } + + if (!bl) { + ShowError("buildin_showscript: Script not attached. (id=%, rid=%d, oid=%d)\n", id, st->rid, st->oid); + script_pushint(st,0); + return SCRIPT_CMD_FAILURE; + } + + clif_showscript(bl, msg); + + script_pushint(st,1); + return SCRIPT_CMD_SUCCESS; +} + #include "../custom/script.inc" // declarations that were supposed to be exported from npc_chat.c @@ -20659,6 +20723,7 @@ struct script_function buildin_func[] = { BUILDIN_DEF(skillpointcount,"?"), BUILDIN_DEF(changebase,"i?"), BUILDIN_DEF(changesex,"?"), + BUILDIN_DEF(changecharsex,"?"), BUILDIN_DEF(waitingroom,"si?????"), BUILDIN_DEF(delwaitingroom,"?"), BUILDIN_DEF2(waitingroomkickall,"kickwaitingroomall","?"), @@ -20989,6 +21054,7 @@ struct script_function buildin_func[] = { BUILDIN_DEF(npcshopupdate,"sii?"), BUILDIN_DEF(getattachedrid,""), BUILDIN_DEF(getvar,"vi"), + BUILDIN_DEF(showscript,"s?"), #include "../custom/script_def.inc" diff --git a/src/map/skill.c b/src/map/skill.c index 7e40eb448c..806f4de836 100755 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -851,7 +851,6 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1 struct mob_data *md, *dstmd; struct status_data *sstatus, *tstatus; struct status_change *sc, *tsc; - enum sc_type status; int skill; int rate; @@ -1103,7 +1102,7 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1 break; case HT_SHOCKWAVE: - status_percent_damage(src, bl, 0, 15*skill_lv+5, false); + status_percent_damage(src, bl, 0, -(15*skill_lv+5), false); break; case HT_SANDMAN: @@ -1465,10 +1464,12 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1 skill_castend_damage_id(src,bl,LG_PINPOINTATTACK,rnd_value(1, pc_checkskill(sd,LG_PINPOINTATTACK)),tick,0); break; case SR_DRAGONCOMBO: - sc_start(src,bl, SC_STUN, 1 + skill_lv, skill_lv, skill_get_time(skill_id, skill_lv)); + case SR_FLASHCOMBO_ATK_STEP1: + sc_start(src,bl, SC_STUN, 1 + skill_lv, skill_lv, skill_get_time(SR_DRAGONCOMBO, skill_lv)); break; case SR_FALLENEMPIRE: - sc_start(src,bl, SC_STOP, 100, skill_lv, skill_get_time(skill_id, skill_lv)); + case SR_FLASHCOMBO_ATK_STEP2: + sc_start(src,bl, SC_STOP, 100, skill_lv, skill_get_time(SR_FALLENEMPIRE, skill_lv)); break; case SR_WINDMILL: if( dstsd ) @@ -1745,16 +1746,25 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1 src = sd?&sd->bl:src; } - if( attack_type&BF_WEAPON ) - { // Coma, Breaking Equipment - if( sd && sd->special_state.bonus_coma ) - { - rate = sd->weapon_coma_ele[tstatus->def_ele] + sd->weapon_coma_ele[ELE_ALL]; + // Coma + if (sd && sd->special_state.bonus_coma && (!md || !mob_is_gvg(md) || !mob_is_battleground(md))) { + rate = 0; + //! TODO: Filter the skills that shouldn't inflict coma bonus, to avoid some non-damage skills inflict coma. [Cydh] + if (!skill_id || !(skill_get_nk(skill_id)&NK_NO_DAMAGE)) { + rate += sd->coma_class[tstatus->class_] + sd->coma_class[CLASS_ALL]; + rate += sd->coma_race[tstatus->race] + sd->coma_race[RC_ALL]; + } + if (attack_type&BF_WEAPON) { + rate += sd->weapon_coma_ele[tstatus->def_ele] + sd->weapon_coma_ele[ELE_ALL]; rate += sd->weapon_coma_race[tstatus->race] + sd->weapon_coma_race[RC_ALL]; rate += sd->weapon_coma_class[tstatus->class_] + sd->weapon_coma_class[CLASS_ALL]; - if (rate) - status_change_start(src,bl, SC_COMA, rate, 0, 0, src->id, 0, 0, SCSTART_NONE); } + if (rate > 0) + status_change_start(src,bl, SC_COMA, rate, 0, 0, src->id, 0, 0, SCSTART_NONE); + } + + if( attack_type&BF_WEAPON ) + { // Breaking Equipment if( sd && battle_config.equip_self_break_rate ) { // Self weapon breaking rate = battle_config.equip_natural_break_rate; @@ -2413,6 +2423,7 @@ int skill_strip_equip(struct block_list *src,struct block_list *bl, unsigned sho * [2] counts how many targets have been processed. counter is added in skill_area_sub if the foreach function flag is: flag&(SD_SPLASH|SD_PREAMBLE) */ static int skill_area_temp[8]; +static int64 skill_area_temp_i64[1]; /** Used to knock back players, monsters, traps, etc @@ -2883,8 +2894,10 @@ void skill_attack_blow(struct block_list *src, struct block_list *dsrc, struct b * flag&1 * flag&2 - Disable re-triggered by double casting * flag&4 - Skip to blow target (because already knocked back before skill_attack somewhere) + * flag&8 - Force assume the target is not as is_infinite_defense() on in battle_calc_attack() first. + * Once it's done, store the damage to skill_area_temp_i64[0] then re-calcuate for real against 'plant'. * - * flag&0xFFF is passed to the underlying battle_calc_attack for processing + * flag&0xFFF is passed to the underlying battle_calc_attack for processing. * (usually holds number of targets, or just 1 for simple splash attacks) * * flag&0xF000 - Values from enum e_skill_display @@ -3051,6 +3064,14 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list * skill_id == MER_INCAGI || skill_id == MER_BLESSING) && tsd->sc.data[SC_CHANGEUNDEAD] ) damage = 1; + if (flag&8) { + skill_area_temp_i64[0] = damage; + if (is_infinite_defense(bl, dmg.flag)) { + dmg = battle_calc_attack_plant(dmg, src, bl, skill_id, skill_lv); + damage = dmg.damage + dmg.damage2; + } + } + if( damage && tsc && tsc->data[SC_GENSOU] && dmg.flag&BF_MAGIC ){ struct block_list *nbl; nbl = battle_getenemyarea(bl,bl->x,bl->y,2,BL_CHAR,bl->id); @@ -3317,9 +3338,9 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list * (dmg.flag&BF_MISC && (skill_id == RA_CLUSTERBOMB || skill_id == RA_FIRINGTRAP || skill_id == RA_ICEBOUNDTRAP)) ) ) { if (battle_config.left_cardfix_to_right) - battle_drain(sd, bl, dmg.damage, dmg.damage, tstatus->race, tstatus->class_); + battle_drain(sd, bl, dmg.damage, dmg.damage, tstatus->race, tstatus->class_, is_infinite_defense(bl,dmg.flag)); else - battle_drain(sd, bl, dmg.damage, dmg.damage2, tstatus->race, tstatus->class_); + battle_drain(sd, bl, dmg.damage, dmg.damage2, tstatus->race, tstatus->class_, is_infinite_defense(bl,dmg.flag)); } if( damage > 0 ) { // Post-damage effects @@ -3752,10 +3773,10 @@ static int skill_timerskill(int tid, unsigned int tick, int id, intptr_t data) case WL_TETRAVORTEX_WIND: case WL_TETRAVORTEX_GROUND: // For SR_FLASHCOMBO - case SR_DRAGONCOMBO: - case SR_FALLENEMPIRE: - case SR_TIGERCANNON: - case SR_SKYNETBLOW: + case SR_FLASHCOMBO_ATK_STEP1: + case SR_FLASHCOMBO_ATK_STEP2: + case SR_FLASHCOMBO_ATK_STEP3: + case SR_FLASHCOMBO_ATK_STEP4: break; // Exceptions default: continue; // Caster is Dead @@ -3905,14 +3926,15 @@ static int skill_timerskill(int tid, unsigned int tick, int id, intptr_t data) break; } // For SR_FLASHCOMBO - case SR_DRAGONCOMBO: - case SR_FALLENEMPIRE: - case SR_TIGERCANNON: - case SR_SKYNETBLOW: + case SR_FLASHCOMBO_ATK_STEP1: + case SR_FLASHCOMBO_ATK_STEP2: + case SR_FLASHCOMBO_ATK_STEP3: + case SR_FLASHCOMBO_ATK_STEP4: if( src->type == BL_PC ) { + const int use_skill_lv[] = { SR_DRAGONCOMBO, SR_FALLENEMPIRE, SR_TIGERCANNON, SR_SKYNETBLOW }; if( distance_xy(src->x, src->y, target->x, target->y) >= 3 ) break; - skill_castend_damage_id(src, target, skl->skill_id, pc_checkskill(((TBL_PC *)src), skl->skill_id), tick, 0); + skill_castend_damage_id(src, target, skl->skill_id, pc_checkskill(((TBL_PC *)src), use_skill_lv[skl->skill_id-SR_FLASHCOMBO_ATK_STEP1]), tick, 0); } break; case SC_ESCAPE: @@ -4033,10 +4055,10 @@ int skill_cleartimerskill (struct block_list *src) case WL_TETRAVORTEX_WIND: case WL_TETRAVORTEX_GROUND: // For SR_FLASHCOMBO - case SR_DRAGONCOMBO: - case SR_FALLENEMPIRE: - case SR_TIGERCANNON: - case SR_SKYNETBLOW: + case SR_FLASHCOMBO_ATK_STEP1: + case SR_FLASHCOMBO_ATK_STEP2: + case SR_FLASHCOMBO_ATK_STEP3: + case SR_FLASHCOMBO_ATK_STEP4: continue; } delete_timer(ud->skilltimerskill[i]->timer, skill_timerskill); @@ -4123,8 +4145,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint map_freeblock_lock(); - switch(skill_id) - { + switch(skill_id) { case MER_CRASH: case SM_BASH: case MS_BASH: @@ -4194,7 +4215,9 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint case TK_COUNTER: case GS_CHAINACTION: case GS_TRIPLEACTION: +#ifndef RENEWAL case GS_MAGICALBULLET: +#endif case GS_TRACKING: case GS_PIERCINGSHOT: case GS_RAPIDSHOWER: @@ -4229,6 +4252,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint case LG_OVERBRAND: case LG_OVERBRAND_BRANDISH: case SR_FALLENEMPIRE: + case SR_FLASHCOMBO_ATK_STEP2: case SR_CRESCENTELBOW_AUTOSPELL: case SR_GATEOFHELL: case SR_GENTLETOUCH_QUIET: @@ -4459,6 +4483,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint case LG_EARTHDRIVE: case SR_RAMPAGEBLASTER: case SR_SKYNETBLOW: + case SR_FLASHCOMBO_ATK_STEP4: case SR_WINDMILL: case SR_RIDEINLIGHTNING: case WM_SOUND_OF_DESTRUCTION: @@ -4788,6 +4813,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint case TF_THROWSTONE: #ifdef RENEWAL case ASC_BREAKER: + case GS_MAGICALBULLET: #endif case NPC_SMOKING: case GS_FLING: @@ -5239,6 +5265,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint break; case SR_DRAGONCOMBO: + case SR_FLASHCOMBO_ATK_STEP1: skill_attack(BF_WEAPON,src,src,bl,skill_id,skill_lv,tick,flag); break; @@ -5290,17 +5317,30 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint break; case SR_TIGERCANNON: - if ( flag&1 ) { - skill_attack(BF_WEAPON, src, src, bl, skill_id, skill_lv, tick, flag); - status_zap(bl, 0, status_get_max_sp(bl) * 10 / 100); - } else if ( sd ) { - int hpcost = 10 + 2 * skill_lv, spcost = 5 + 1 * skill_lv; - if (!status_charge(src, status_get_max_hp(src) * hpcost / 100, status_get_max_sp(src) * spcost / 100)) { - if (sd) - clif_skill_fail(sd, skill_id, USESKILL_FAIL_LEVEL, 0); - break; + case SR_FLASHCOMBO_ATK_STEP3: + if (flag&1) { + if (skill_area_temp[3] == skill_id && skill_area_temp_i64[0]) { // Safe check + if (skill_area_temp[1] != bl->id) { + int64 dmg = skill_area_temp_i64[0]; + bool infdef = is_infinite_defense(bl, skill_get_type(skill_id)); + if (infdef) + dmg = 1; + status_damage(src, bl, dmg, 0, 0, 0); + status_zap(bl, 0, status_get_max_sp(bl) * 10 / 100); + clif_skill_damage(src, bl, tick, status_get_amotion(bl), 0, dmg, 1, skill_id, skill_lv, 6); + } } - map_foreachinrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), splash_target(src), src, skill_id, skill_lv, tick, flag|BCT_ENEMY|1, skill_castend_damage_id); + else { // Somehow, we failed + skill_attack(BF_WEAPON, src, src, bl, skill_id, skill_lv, tick, flag); + status_zap(bl, 0, status_get_max_sp(bl) * 10 / 100); + } + } + else if (sd) { + skill_area_temp[1] = bl->id; + skill_area_temp[3] = skill_id; + skill_attack(BF_WEAPON, src, src, bl, skill_id, skill_lv, tick, flag|8); // Only do attack calculation once + status_zap(bl, 0, status_get_max_sp(bl) * 10 / 100); + map_foreachinrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), splash_target(src), src, skill_id, skill_lv, tick, flag|BCT_ENEMY|SD_SPLASH|1, skill_castend_damage_id); } break; @@ -6491,8 +6531,14 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui i = 0; if (dstsd && dstsd->spiritball && (sd == dstsd || map_flag_vs(src->m) || (sd && sd->duel_group && sd->duel_group == dstsd->duel_group)) && ((dstsd->class_&MAPID_BASEMASK) != MAPID_GUNSLINGER || (dstsd->class_&MAPID_UPPERMASK) != MAPID_REBELLION)) { // split the if for readability, and included gunslingers in the check so that their coins cannot be removed [Reddozen] - i = dstsd->spiritball * 7; - pc_delspiritball(dstsd,dstsd->spiritball,0); + if (dstsd->spiritball > 0) { + i = dstsd->spiritball * 7; + pc_delspiritball(dstsd,dstsd->spiritball,0); + } + if (dstsd->spiritcharm_type != CHARM_TYPE_NONE && dstsd->spiritcharm > 0) { + i += dstsd->spiritcharm * 7; + pc_delspiritcharm(dstsd,dstsd->spiritcharm,dstsd->spiritcharm_type); + } } else if (dstmd && !(tstatus->mode&MD_BOSS) && rnd() % 100 < 20) { // check if target is a monster and not a Boss, for the 20% chance to absorb 2 SP per monster's level [Reddozen] i = 2 * dstmd->level; mob_target(dstmd,src,0); @@ -6543,6 +6589,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case NC_AXETORNADO: case GC_COUNTERSLASH: case SR_SKYNETBLOW: + case SR_FLASHCOMBO_ATK_STEP4: case SR_RAMPAGEBLASTER: case SR_HOWLINGOFLION: case KO_HAPPOKUNAI: @@ -6589,7 +6636,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui clif_skill_nodamage(src,bl,skill_id,skill_lv,1); map_foreachinrange(skill_area_sub,src, skill_get_splash(skill_id, skill_lv),BL_CHAR|BL_SKILL, - src,skill_id,skill_lv,tick, flag|BCT_ENEMY|1, + src,skill_id,skill_lv,tick, flag|BCT_ENEMY|SD_ANIMATION|1, skill_castend_damage_id); break; @@ -7045,7 +7092,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case AL_HOLYWATER: if(sd) { - if (skill_produce_mix(sd, skill_id, 523, 0, 0, 0, 1)) + if (skill_produce_mix(sd, skill_id, ITEMID_HOLY_WATER, 0, 0, 0, 1)) clif_skill_nodamage(src,bl,skill_id,skill_lv,1); else clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0); @@ -9445,14 +9492,20 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui break; case SR_ASSIMILATEPOWER: - if( flag&1 ) { + if (flag&1) { i = 0; - if( dstsd && dstsd->spiritball && (sd == dstsd || map_flag_vs(src->m)) && (dstsd->class_&MAPID_BASEMASK)!=MAPID_GUNSLINGER ) - { - i = dstsd->spiritball; //1%sp per spiritball. - pc_delspiritball(dstsd, dstsd->spiritball, 0); + if (dstsd && dstsd->spiritball && (sd == dstsd || map_flag_vs(src->m)) && (dstsd->class_&MAPID_BASEMASK)!=MAPID_GUNSLINGER) { + if (dstsd->spiritball > 0) { + i = dstsd->spiritball; + pc_delspiritball(dstsd,dstsd->spiritball,0); + } + if (dstsd->spiritcharm_type != CHARM_TYPE_NONE && dstsd->spiritcharm > 0) { + i += dstsd->spiritcharm; + pc_delspiritcharm(dstsd,dstsd->spiritcharm,dstsd->spiritcharm_type); + } } - if( i ) status_percent_heal(src, 0, i); + if (i) + status_percent_heal(src, 0, i); clif_skill_nodamage(src, bl, skill_id, skill_lv, i ? 1:0); } else { clif_skill_damage(src,bl,tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, 6); @@ -9499,14 +9552,15 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv))); break; case SR_FLASHCOMBO: { - const int combo[] = { SR_DRAGONCOMBO, SR_FALLENEMPIRE, SR_TIGERCANNON, SR_SKYNETBLOW }; + const int combo[] = { SR_FLASHCOMBO_ATK_STEP1, SR_FLASHCOMBO_ATK_STEP2, SR_FLASHCOMBO_ATK_STEP3, SR_FLASHCOMBO_ATK_STEP4 }; + const int delay[] = { 0, 250, 500, 2000 }; if (sd) sd->ud.attackabletime = sd->canuseitem_tick = sd->ud.canact_tick; clif_skill_nodamage(src,bl,skill_id,skill_lv, sc_start2(src,bl,type,100,skill_lv,bl->id,skill_get_time(skill_id,skill_lv))); for (i = 0; i < ARRAYLENGTH(combo); i++) - skill_addtimerskill(src,tick + 500 * i,bl->id,0,0,combo[i],skill_lv,BF_WEAPON,flag|SD_LEVEL); + skill_addtimerskill(src,tick + delay[i],bl->id,0,0,combo[i],skill_lv,BF_WEAPON,flag|SD_LEVEL); } break; @@ -10037,13 +10091,11 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case KO_HYOUHU_HUBUKI: case KO_KAZEHU_SEIRAN: case KO_DOHU_KOUKAI: - if(sd) { - int i_tal, ttype = skill_get_ele(skill_id, skill_lv); - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); - ARR_FIND(1, 6, i_tal, sd->talisman[i_tal] > 0 && ttype != i_tal); - if( i_tal < 6 ) - pc_del_talisman(sd, sd->talisman[i_tal], i_tal); // Replace talisman - pc_add_talisman(sd, skill_get_time(skill_id, skill_lv), 10, ttype); + if (sd) { + int type = skill_get_ele(skill_id,skill_lv); + + clif_skill_nodamage(src,bl,skill_id,skill_lv,1); + pc_addspiritcharm(sd,skill_get_time(skill_id,skill_lv),MAX_SPIRITCHARM,type); } break; case KO_ZANZOU: @@ -10219,7 +10271,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui if(hd->master && hd->sc.data[SC_STYLE_CHANGE]) { char output[128]; safesnprintf(output,sizeof(output),msg_txt(sd,378),(sce->val1==MH_MD_FIGHTING?"fighthing":"grappling")); - clif_colormes(hd->master,color_table[COLOR_RED],output); + clif_colormes(hd->master->fd, color_table[COLOR_RED], output); } } else sc_start(&hd->bl,&hd->bl, SC_STYLE_CHANGE, 100, MH_MD_FIGHTING, -1); @@ -11446,7 +11498,7 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui case SO_ARRULLO: i = skill_get_splash(skill_id,skill_lv); - map_foreachinarea(skill_area_sub,src->m,x-i,y-i,x+i,y+i,splash_target(src), + map_foreachinarea(skill_area_sub,src->m,x-i,y-i,x+i,y+i,BL_CHAR, src, skill_id, skill_lv, tick, flag|BCT_ENEMY|1, skill_castend_nodamage_id); break; @@ -12322,15 +12374,12 @@ struct skill_unit_group *skill_unitsetting(struct block_list *src, uint16 skill_ limit = ((sd ? pc_checkskill(sd,GN_DEMONIC_FIRE) : 1) + 1) * limit; break; case KO_ZENKAI: - if( sd ){ - ARR_FIND(1, 6, i, sd->talisman[i] > 0); - if( i < 5 ){ - val1 = sd->talisman[i]; // no. of aura - val2 = i; // aura type - limit += val1 * 1000; - subunt = i - 1; - pc_del_talisman(sd, sd->talisman[i], i); - } + if (sd && sd->spiritcharm_type != CHARM_TYPE_NONE && sd->spiritcharm > 0) { + val1 = sd->spiritcharm; + val2 = sd->spiritcharm_type; + limit = 6000 * val1; + subunt = sd->spiritcharm_type - 1; + pc_delspiritcharm(sd,sd->spiritcharm,sd->spiritcharm_type); } break; case HW_GRAVITATION: @@ -14702,7 +14751,7 @@ bool skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_i MOBID_EMPERIUM, MOBID_GUARDIAN_STONE1, MOBID_GUARDIAN_STONE2)) { char output[128]; sprintf(output,"%s",msg_txt(sd,382)); // You're too close to a stone or emperium to use this skill. - clif_colormes(sd,color_table[COLOR_RED], output); + clif_colormes(sd->fd,color_table[COLOR_RED], output); return false; } } @@ -14779,20 +14828,15 @@ bool skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_i case KO_HYOUHU_HUBUKI: case KO_KAZEHU_SEIRAN: case KO_DOHU_KOUKAI: - { - int ttype = skill_get_ele(skill_id, skill_lv); - ARR_FIND(1, 5, i, sd->talisman[i] > 0 && i != ttype); - if( sd->talisman[ttype] >= 10 ) { - clif_skill_fail(sd, skill_id, USESKILL_FAIL_SUMMON, 0); - return false; - } + if (sd->spiritcharm_type == skill_get_ele(skill_id,skill_lv) && sd->spiritcharm >= MAX_SPIRITCHARM) { + clif_skill_fail(sd,skill_id,USESKILL_FAIL_SUMMON,0); + return false; } break; case KO_KAIHOU: case KO_ZENKAI: - ARR_FIND(1, 6, i, sd->talisman[i] > 0); - if( i > 4 ) { - clif_skill_fail(sd, skill_id, USESKILL_FAIL_SUMMON, 0); + if (sd->spiritcharm_type == CHARM_TYPE_NONE || sd->spiritcharm <= 0) { + clif_skill_fail(sd,skill_id,USESKILL_FAIL_SUMMON_NONE,0); return false; } break; @@ -14914,7 +14958,7 @@ bool skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_i char output[CHAT_SIZE_MAX]; //Official use msgstringtable.txt for each skill failure sprintf(output,msg_txt(sd,722),itemdb_jname(reqeqit)); - clif_colormes(sd,color_table[COLOR_RED],output); + clif_colormes(sd->fd, color_table[COLOR_RED], output); return false; } } @@ -15095,7 +15139,7 @@ bool skill_check_condition_castend(struct map_session_data* sd, uint16 skill_id, skill_get_desc(skill_id), require.ammo_qty, itemdb_jname(sd->status.inventory[i].nameid)); - clif_colormes(sd,color_table[COLOR_RED],e_msg); + clif_colormes(sd->fd,color_table[COLOR_RED],e_msg); return false; } if (!(require.ammo&1<inventory_data[i]->look)) { //Ammo type check. Send the "wrong weapon type" message @@ -15126,7 +15170,7 @@ bool skill_check_condition_castend(struct map_session_data* sd, uint16 skill_id, //Official is using msgstringtable.txt for each requirement failure //clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0); sprintf(output, msg_txt(sd,720), itemdb_jname(require.itemid[i])); // %s is required. - clif_colormes(sd,color_table[COLOR_RED],output); + clif_colormes(sd->fd,color_table[COLOR_RED],output); } return false; } @@ -15810,6 +15854,8 @@ int skill_delayfix (struct block_list *bl, uint16 skill_id, uint16 skill_lv) case CH_CHAINCRUSH: case SR_DRAGONCOMBO: case SR_FALLENEMPIRE: + case SR_FLASHCOMBO_ATK_STEP1: + case SR_FLASHCOMBO_ATK_STEP2: //If delay not specified, it will be 1000 - 4*agi - 2*dex if (time == 0) time = 1000; @@ -18605,17 +18651,22 @@ bool skill_produce_mix(struct map_session_data *sd, uint16 skill_id, unsigned sh break; } } + if (skill_id == GN_CHANGEMATERIAL && tmp_item.amount) { //Success - int j, k = 0; + int j, k = 0, l; + bool isStackable = itemdb_isstackable(tmp_item.nameid); for (i = 0; i < MAX_SKILL_CHANGEMATERIAL_DB; i++) { if (skill_changematerial_db[i].nameid == nameid){ for (j = 0; j < MAX_SKILL_CHANGEMATERIAL_SET; j++){ if (rnd()%1000 < skill_changematerial_db[i].qty_rate[j]){ - tmp_item.amount = qty * skill_changematerial_db[i].qty[j]; - if ((flag = pc_additem(sd,&tmp_item,tmp_item.amount,LOG_TYPE_PRODUCE))) { - clif_additem(sd,0,0,flag); - map_addflooritem(&tmp_item,tmp_item.amount,sd->bl.m,sd->bl.x,sd->bl.y,0,0,0,0); + uint16 total_qty = qty * skill_changematerial_db[i].qty[j]; + tmp_item.amount = (isStackable ? total_qty : 1); + for (l = 0; l < total_qty; l += tmp_item.amount) { + if ((flag = pc_additem(sd,&tmp_item,tmp_item.amount,LOG_TYPE_PRODUCE))) { + clif_additem(sd,0,0,flag); + map_addflooritem(&tmp_item,tmp_item.amount,sd->bl.m,sd->bl.x,sd->bl.y,0,0,0,0); + } } k++; } @@ -18804,7 +18855,7 @@ int skill_poisoningweapon(struct map_session_data *sd, unsigned short nameid) type, chance, 0, skill_get_time(GC_POISONINGWEAPON, sd->menuskill_val)); sprintf(output, msg_txt(sd,721), msg); - clif_colormes(sd,color_table[COLOR_WHITE],output); + clif_colormes(sd->fd,color_table[COLOR_WHITE],output); /*#if PACKETVER >= 20110208 //! TODO: Check the correct PACKVETVER clif_msg(sd,msg); diff --git a/src/map/skill.h b/src/map/skill.h index 341e959bd4..958752256e 100644 --- a/src/map/skill.h +++ b/src/map/skill.h @@ -72,6 +72,7 @@ enum e_skill_inf2 { INF2_NO_BG_DMG = 0x08000, // Skill that ignore bg reduction INF2_NO_GVG_DMG = 0x10000, // Skill that ignore gvg reduction INF2_NO_NEARNPC = 0x20000, // disable to cast skill if near with NPC [Cydh] + INF2_HIT_TRAP = 0x40000, // can hit trap-type skill (INF2_TRAP) [Cydh] }; /// Skill info type 3 @@ -172,8 +173,8 @@ struct s_skill_db { int16 cast_def_rate; ///< Def rate during cast a skill uint16 skill_type; ///< Skill type int blewcount[MAX_SKILL_LEVEL]; ///< Blew count - uint32 inf2; ///< - uint32 inf3; ///< + uint32 inf2; ///< Skill flags @see enum e_skill_inf2 + uint32 inf3; ///< Skill flags @see enum e_skill_inf3 int maxcount[MAX_SKILL_LEVEL]; ///< Max number skill can be casted in same map // skill_castnodex_db.txt @@ -1719,10 +1720,10 @@ enum e_skill { WL_TELEKINESIS_INTENSE, LG_KINGS_GRACE, ALL_FULL_THROTTLE, - SR_FLASHCOMBO_ATK_STEP1, - SR_FLASHCOMBO_ATK_STEP2, - SR_FLASHCOMBO_ATK_STEP3, - SR_FLASHCOMBO_ATK_STEP4, + SR_FLASHCOMBO_ATK_STEP1, // SR_DRAGONCOMBO + SR_FLASHCOMBO_ATK_STEP2, // SR_FALLENEMPIRE + SR_FLASHCOMBO_ATK_STEP3, // SR_TIGERCANNON + SR_FLASHCOMBO_ATK_STEP4, // SR_SKYNETBLOW HLIF_HEAL = 8001, HLIF_AVOID, diff --git a/src/map/status.c b/src/map/status.c index 93ee641225..83ffde35a3 100644 --- a/src/map/status.c +++ b/src/map/status.c @@ -709,7 +709,8 @@ void initChangeTables(void) set_sc( SR_GENTLETOUCH_ENERGYGAIN , SC_GT_ENERGYGAIN , SI_GENTLETOUCH_ENERGYGAIN , SCB_NONE ); set_sc( SR_GENTLETOUCH_CHANGE , SC_GT_CHANGE , SI_GENTLETOUCH_CHANGE , SCB_WATK|SCB_MDEF|SCB_ASPD ); set_sc( SR_GENTLETOUCH_REVITALIZE , SC_GT_REVITALIZE , SI_GENTLETOUCH_REVITALIZE , SCB_MAXHP|SCB_REGEN ); - set_sc( SR_FLASHCOMBO , SC_FLASHCOMBO , SI_FLASHCOMBO , SCB_WATK ); + set_sc( SR_FLASHCOMBO , SC_FLASHCOMBO , SI_FLASHCOMBO , SCB_NONE ); + add_sc( SR_FLASHCOMBO_ATK_STEP1 , SC_STUN ); /* Wanderer / Minstrel */ set_sc( WA_SWING_DANCE , SC_SWINGDANCE , SI_SWINGDANCE , SCB_SPEED|SCB_ASPD ); @@ -1286,13 +1287,16 @@ static inline void status_cpy(struct status_data* a, const struct status_data* b int status_set_hp(struct block_list *bl, unsigned int hp, int flag) { struct status_data *status; - if (hp < 1) return 0; + if (hp < 1) + return 0; status = status_get_status_data(bl); if (status == &dummy_status) return 0; - if (hp > status->max_hp) hp = status->max_hp; - if (hp == status->hp) return 0; + if (hp > status->max_hp) + hp = status->max_hp; + if (hp == status->hp) + return 0; if (hp > status->hp) return status_heal(bl, hp - status->hp, 0, 1|flag); return status_zap(bl, status->hp - hp, 0); @@ -1309,15 +1313,17 @@ int status_set_hp(struct block_list *bl, unsigned int hp, int flag) int status_set_maxhp(struct block_list *bl, unsigned int maxhp, int flag) { struct status_data *status; - if (maxhp < 1) return 0; + if (maxhp < 1) + return 0; status = status_get_status_data(bl); if (status == &dummy_status) return 0; - if (maxhp == status->max_hp) return 0; - if (maxhp > status->max_hp) { + if (maxhp == status->max_hp) + return 0; + if (maxhp > status->max_hp) status_heal(bl, maxhp - status->max_hp, 0, 1|flag); - } else + else status_zap(bl, status->max_hp - maxhp, 0); status->max_hp = maxhp; @@ -1340,8 +1346,10 @@ int status_set_sp(struct block_list *bl, unsigned int sp, int flag) if (status == &dummy_status) return 0; - if (sp > status->max_sp) sp = status->max_sp; - if (sp == status->sp) return 0; + if (sp > status->max_sp) + sp = status->max_sp; + if (sp == status->sp) + return 0; if (sp > status->sp) return status_heal(bl, 0, sp - status->sp, 1|flag); return status_zap(bl, 0, status->sp - sp); @@ -1358,15 +1366,17 @@ int status_set_sp(struct block_list *bl, unsigned int sp, int flag) int status_set_maxsp(struct block_list *bl, unsigned int maxsp, int flag) { struct status_data *status; - if (maxsp < 1) return 0; + if (maxsp < 1) + return 0; status = status_get_status_data(bl); if (status == &dummy_status) return 0; - if (maxsp == status->max_sp) return 0; - if (maxsp > status->max_sp) { + if (maxsp == status->max_sp) + return 0; + if (maxsp > status->max_sp) status_heal(bl, maxsp - status->max_sp, 0, 1|flag); - } else + else status_zap(bl, status->max_sp - maxsp, 0); status->max_sp = maxsp; @@ -2986,6 +2996,8 @@ int status_calc_pc_(struct map_session_data* sd, enum e_status_calc_opt opt) + sizeof(sd->subrace2) + sizeof(sd->subsize) + sizeof(sd->reseff) + + sizeof(sd->coma_class) + + sizeof(sd->coma_race) + sizeof(sd->weapon_coma_ele) + sizeof(sd->weapon_coma_race) + sizeof(sd->weapon_coma_class) @@ -3007,10 +3019,6 @@ int status_calc_pc_(struct map_session_data* sd, enum e_status_calc_opt opt) + sizeof(sd->ignore_mdef_by_class) + sizeof(sd->ignore_def_by_race) + sizeof(sd->sp_gain_race) - + sizeof(sd->sp_gain_race_attack) - + sizeof(sd->hp_gain_race_attack) - + sizeof(sd->hp_gain_race_attack_rate) - + sizeof(sd->sp_gain_race_attack_rate) ); memset (&sd->right_weapon.overrefine, 0, sizeof(sd->right_weapon) - sizeof(sd->right_weapon.atkmods)); @@ -3082,8 +3090,6 @@ int status_calc_pc_(struct map_session_data* sd, enum e_status_calc_opt opt) + sizeof(sd->mdef_set_race) + sizeof(sd->hp_vanish_race) + sizeof(sd->sp_vanish_race) - + sizeof(sd->hp_gain_attack) - + sizeof(sd->sp_gain_attack) ); memset (&sd->bonus, 0, sizeof(sd->bonus)); @@ -3958,12 +3964,12 @@ int status_calc_npc_(struct npc_data *nd, enum e_status_calc_opt opt) status->speed = nd->speed; } - status->str = nd->stat_point; - status->agi = nd->stat_point; - status->vit = nd->stat_point; - status->int_= nd->stat_point; - status->dex = nd->stat_point; - status->luk = nd->stat_point; + status->str = nd->stat_point + nd->params.str; + status->agi = nd->stat_point + nd->params.agi; + status->vit = nd->stat_point + nd->params.vit; + status->int_= nd->stat_point + nd->params.int_; + status->dex = nd->stat_point + nd->params.dex; + status->luk = nd->stat_point + nd->params.luk; status_calc_misc(&nd->bl, status, nd->level); status_cpy(&nd->status, status); @@ -4858,6 +4864,9 @@ void status_calc_bl_(struct block_list* bl, enum scb_flag flag, enum e_status_ca } else if( bl->type == BL_MER ) { TBL_MER* md = BL_CAST(BL_MER, bl); + if (!md->master) + return; + if( b_status.rhw.atk != status->rhw.atk || b_status.rhw.atk2 != status->rhw.atk2 ) clif_mercenary_updatestatus(md->master, SP_ATK1); if( b_status.matk_max != status->matk_max ) @@ -4885,6 +4894,9 @@ void status_calc_bl_(struct block_list* bl, enum scb_flag flag, enum e_status_ca } else if( bl->type == BL_ELEM ) { TBL_ELEM* ed = BL_CAST(BL_ELEM, bl); + if (!ed->master) + return; + if( b_status.max_hp != status->max_hp ) clif_elemental_updatestatus(ed->master, SP_MAXHP); if( b_status.max_sp != status->max_sp ) @@ -5456,8 +5468,6 @@ static unsigned short status_calc_watk(struct block_list *bl, struct status_chan watk += sc->data[SC_PYROCLASTIC]->val2; if(sc->data[SC_ANGRIFFS_MODUS]) watk += watk * sc->data[SC_ANGRIFFS_MODUS]->val2/100; - if( sc->data[SC_FLASHCOMBO] ) - watk += sc->data[SC_FLASHCOMBO]->val2; if(sc->data[SC_ODINS_POWER]) watk += 40 + 30 * sc->data[SC_ODINS_POWER]->val1; @@ -9614,7 +9624,10 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty break; case SC__ENERVATION: val2 = 20 + 10 * val1; // ATK Reduction - if( sd ) pc_delspiritball(sd,sd->spiritball,0); + if (sd) { + pc_delspiritball(sd,sd->spiritball,0); + pc_delspiritcharm(sd,sd->spiritcharm,sd->spiritcharm_type); + } break; case SC__GROOMY: val2 = 20 + 10 * val1; // ASPD diff --git a/src/map/status.h b/src/map/status.h index 456a5f3393..d50f24734f 100644 --- a/src/map/status.h +++ b/src/map/status.h @@ -1791,7 +1791,7 @@ enum scb_flag enum e_status_calc_opt { SCO_NONE = 0x0, - SCO_FIRST = 0x1, ///< Trigger the calculations that should take place only onspawn/once + SCO_FIRST = 0x1, ///< Trigger the calculations that should take place only onspawn/once, process base status initialization code SCO_FORCE = 0x2, ///< Only relevant to BL_PC types, ensures call bypasses the queue caused by delayed damage }; diff --git a/src/map/unit.c b/src/map/unit.c index e1b0e88137..7265b11747 100644 --- a/src/map/unit.c +++ b/src/map/unit.c @@ -2585,7 +2585,7 @@ static int unit_attack_timer_sub(struct block_list* src, int tid, unsigned int t ud->attacktarget_lv = battle_weapon_attack(src,target,tick,0); if(sd && sd->status.pet_id > 0 && sd->pd && battle_config.pet_attack_support) - pet_target_check(sd,target,0); + pet_target_check(sd->pd,target,0); map_freeblock_unlock(); @@ -3046,7 +3046,7 @@ int unit_remove_map_(struct block_list *bl, clr_type clrtype, const char* file, if( elemental_get_lifetime(ed) <= 0 && !(ed->master && !ed->master->state.active) ) { clif_clearunit_area(bl,clrtype); map_delblock(bl); - unit_free(bl,0); + unit_free(bl,CLR_OUTSIGHT); map_freeblock_unlock(); return 0; @@ -3163,10 +3163,8 @@ int unit_free(struct block_list *bl, clr_type clrtype) guild_send_memberinfoshort(sd,0); pc_cleareventtimer(sd); pc_inventory_rental_clear(sd); - pc_delspiritball(sd,sd->spiritball,1); - - for(i = 1; i < 5; i++) - pc_del_talisman(sd, sd->talisman[i], i); + pc_delspiritball(sd, sd->spiritball, 1); + pc_delspiritcharm(sd, sd->spiritcharm, sd->spiritcharm_type); if( sd->st && sd->st->state != RUN ) {// free attached scripts that are waiting script_free_state(sd->st); @@ -3263,6 +3261,7 @@ int unit_free(struct block_list *bl, clr_type clrtype) if( sd ) sd->pd = NULL; + pd->master = NULL; break; } case BL_MOB: { @@ -3341,6 +3340,7 @@ int unit_free(struct block_list *bl, clr_type clrtype) if( sd ) sd->hd = NULL; + hd->master = NULL; break; } case BL_MER: { @@ -3360,6 +3360,7 @@ int unit_free(struct block_list *bl, clr_type clrtype) sd->md = NULL; mercenary_contract_stop(md); + md->master = NULL; break; } case BL_ELEM: { @@ -3379,6 +3380,7 @@ int unit_free(struct block_list *bl, clr_type clrtype) sd->ed = NULL; elemental_summon_stop(ed); + ed->master = NULL; break; } }