diff --git a/db/pre-re/skill_cast_db.txt b/db/pre-re/skill_cast_db.txt index 9452617c90..7cf18d43ed 100644 --- a/db/pre-re/skill_cast_db.txt +++ b/db/pre-re/skill_cast_db.txt @@ -1410,7 +1410,7 @@ 2325,2000,2000,0,30000:45000:60000:75000:90000,0,540000:480000:420000:360000:300000 //-- LG_KINGS_GRACE -5013,1000,0,0,5000,0,60000 +5013,0,1000,0,5000,0,90000 //========================================== //===== Sura Skills ======================== diff --git a/db/pre-re/skill_db.txt b/db/pre-re/skill_db.txt index cc4a67a7d7..a866d93771 100644 --- a/db/pre-re/skill_db.txt +++ b/db/pre-re/skill_db.txt @@ -1319,7 +1319,7 @@ 5010,0,6,2,0,0x1,0,5,1,no,0,0,0,none,0,0x0, SC_ESCAPE,Emergency Escape 5011,0,6,4,0,0x1,0,5,1,no,0,0,0,none,0,0x0, AB_OFFERTORIUM,Offertorium 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,5,5,1,no,0,0,0,none,0,0x0, LG_KINGS_GRACE,King's Grace +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 diff --git a/db/pre-re/skill_unit_db.txt b/db/pre-re/skill_unit_db.txt index 395a15abf3..c40eebe987 100644 --- a/db/pre-re/skill_unit_db.txt +++ b/db/pre-re/skill_unit_db.txt @@ -171,6 +171,7 @@ 5006,0x101, , 0, 3,2000,enemy, 0x018 //NC_MAGMA_ERUPTION 5008,0x85, , 0, 0, -1,all, 0x003 //SO_ELEMENTAL_SHIELD 5010,0xfe, , 0, 2, -1,enemy, 0x000 //SC_ESCAPE +5013,0x102, , 3, 0, -1,all, 0x2002 //LG_KINGS_GRACE 8020,0xf5, , 3, 0,2300:2100:1900:1700:1500,enemy, 0x018 //MH_POISON_MIST 8033,0x7e, , 0, 0, -1,all, 0x003 //MH_STEINWAND diff --git a/db/re/item_db.txt b/db/re/item_db.txt index 58326b021a..478d224c6f 100644 --- a/db/re/item_db.txt +++ b/db/re/item_db.txt @@ -5804,10 +5804,10 @@ 11588,Fresh_Strawberries,Fresh Strawberries,0,10,,10,,,,0,0xFFFFFFFF,63,2,,,,,,{ itemheal rand(32,56),rand(16,28); },{},{} 11589,Iceflake,Cold Snow Cone,0,20,,50,,,,,0xFFFFFFFF,63,2,,,,,,{ percentheal 5,5; },{},{} 11590,Meat_Skewer5,Skewer No.5,0,5000,,300,,,,,0xFFFFFFFF,63,2,,,,,,{ itemheal rand(760,810),10; },{},{} -11592,Trans-Red_Candy,Trans-Red Candy,0,20,,30,,,,,0xFFFFFFFF,63,2,,,,,,{ itemheal 45,0; transform "1507",600000,SC_NONE; sc_start SC_INCMHP,600000,1000; },{},{} -11593,Trans-Blue_Candy,Trans-Blue Candy,0,20,,30,,,,,0xFFFFFFFF,63,2,,,,,,{ itemheal 45,0; transform "1102",600000,SC_NONE; sc_start SC_INCMSP,600000,100; },{},{} -11594,Trans-Yellow_Candy,Trans-Yellow Candy,0,20,,30,,,,,0xFFFFFFFF,63,2,,,,,,{ itemheal 45,0; transform "1130",600000,SC_NONE; autobonus "{ bonus2 bAddItemHealRate,535,2000; }",10000,600000; },{},{} -11595,Trans-Green_Candy,Trans-Green Candy,0,20,,30,,,,,0xFFFFFFFF,63,2,,,,,,{ itemheal 45,0; transform "1508",600000,SC_NONE; autobonus "{ bonus bHit,10; bonus bFlee,20; }",10000,600000; },{},{} +11592,Trans_Candy_Red,Trans Candy Red,0,20,,30,,,,,0xFFFFFFFF,63,2,,,,,,{ itemheal 45,0; transform 1507,600000,SC_MTF_MHP,1000; },{},{} +11593,Trans_Candy_Blue,Trans Candy Blue,0,20,,30,,,,,0xFFFFFFFF,63,2,,,,,,{ itemheal 45,0; transform 1102,600000,SC_MTF_MSP,100; },{},{} +11594,Trans_Candy_Yellow,Trans Candy Yellow,0,20,,30,,,,,0xFFFFFFFF,63,2,,,,,,{ itemheal 45,0; transform 1130,600000,SC_MTF_PUMPKIN,2000; },{},{} +11595,Trans_Candy_Green,Trans Candy Green,0,20,,30,,,,,0xFFFFFFFF,63,2,,,,,,{ itemheal 45,0; transform 1508,600000,SC_MTF_HITFLEE,10,20; },{},{} 11596,Blood_In_Skull,Blood In Skull,0,20,,50,,,,,0xFFFFFFFF,63,2,,,,,,{ itemheal rand(600,800),0; },{},{} 11597,Iron_Worm,Iron Worm,0,10,,10,,,,0,0xFFFFFFFF,63,2,,,,,,{},{},{} 11598,Bitter_Cacao_Bean,Bitter Cacao Bean,0,10,,0,,,,0,0xFFFFFFFF,63,2,,,,,,{},{},{} @@ -6479,13 +6479,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 "Deviruchi",1200000,SC_MTF_ASPD; },{},{} -12659,Trans_Scroll_Ray_Arch,Transformation Scroll(Raydric),2,20,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ transform "Raydric Archer",1200000,SC_MTF_RANGEATK; },{},{} -12660,Trans_Scroll_Mavka,Transformation Scroll(Mavka),2,20,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ transform "Mavka",1200000,SC_MTF_RANGEATK; },{},{} -12661,Trans_Scroll_Marduk,Transformation Scroll(Marduk),2,20,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ transform "Marduk",1200000,SC_MTF_MATK; },{},{} -12662,Trans_Scroll_Banshee,Transformation Scroll(Banshee),2,20,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ transform "Banshee",1200000,SC_MTF_MATK; },{},{} -12663,Trans_Scroll_Poring,Transformation Scroll(Poring),2,20,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ transform "Poring",1200000,SC_MTF_CRIDAMAGE; },{},{} -12664,Trans_Scroll_Golem,Transformation Scroll(Golem),2,20,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ transform "Golem",1200000,SC_MTF_MLEATKED; },{},{} +12658,Trans_Scroll_Devi,Transformation Scroll(Deviruchi),2,20,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ transform 1109,1200000,SC_MTF_ASPD; },{},{} +12659,Trans_Scroll_Ray_Arch,Transformation Scroll(Raydric),2,20,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ transform 1276,1200000,SC_MTF_RANGEATK; },{},{} +12660,Trans_Scroll_Mavka,Transformation Scroll(Mavka),2,20,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ transform 1884,1200000,SC_MTF_RANGEATK; },{},{} +12661,Trans_Scroll_Marduk,Transformation Scroll(Marduk),2,20,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ transform 1140,1200000,SC_MTF_MATK; },{},{} +12662,Trans_Scroll_Banshee,Transformation Scroll(Banshee),2,20,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ transform 1867,1200000,SC_MTF_MATK; },{},{} +12663,Trans_Scroll_Poring,Transformation Scroll(Poring),2,20,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ transform 1002,1200000,SC_MTF_CRIDAMAGE; },{},{} +12664,Trans_Scroll_Golem,Transformation Scroll(Golem),2,20,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ transform 1040,1200000,SC_MTF_MLEATKED; },{},{} 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; },{},{} @@ -6678,7 +6678,7 @@ 12853,Patron_Scroll,Patron Scroll,2,20,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ getgroupitem(IG_Patron_Scroll); },{},{} 12860,Mommy_Day_Cake,Mommy Day Cake,2,0,,200,,,,,0xFFFFFFFF,63,2,,,,,,{ percentheal 50,50; skilleffect "HP_ASSUMPTIO",0; sc_start SC_ASSUMPTIO,100000,5; },{},{} 12863,Treasure_Chest_Summoned_II,Treasure Chest Summoned II,3,10,,0,,,,,0xFFFFFFFF,63,2,,,,,,{ monster "this",-1,-1,"--ja--",rand(1324,1363),1,""; },{},{} -12883,Almighty,Almighty,2,20,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ specialeffect2 EF_BASH3D; sc_start SC_INCALLSTATUS,1800000,10; /* SetBuff "EFST_2011RWC_SCROLL" 1800 1800 */ },{},{} +12883,Almighty,Almighty,2,20,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ specialeffect2 EF_BASH3D; sc_start SC_2011RWC_SCROLL,1800000,10; },{},{} 12884,Infinite_Concentration_Potion,Infinite Concentration Potion,11,10,,0,,,,0,0xFFFFFFFF,63,2,,,,,,{ sc_start SC_ASPDPOTION0,1800000,4; },{},{} 12885,Infinite_Awakening_Potion,Infinite Awakening Potion,11,10,,0,,,,0,0xFFFFFFFF,63,2,,,,,,{ sc_start SC_ASPDPOTION1,1800000,6; },{},{} 12886,Infinite_Berserk_Potion,Infinite Berserk Potion,11,10,,0,,,,0,0xFFFFFFFF,63,2,,,,,,{ sc_start SC_ASPDPOTION2,1800000,9; },{},{} @@ -9803,7 +9803,7 @@ 22618,Clear_Box_A,Clear Box A,18,10,,10,,,,0,0xFFFFFFFF,63,2,,,,,,{},{},{} 22619,Ghost_Summon_Scroll,Ghost Scroll,2,0,,0,,,,,0xFFFFFFFF,63,2,,,,,,{ /* mercenary_create M_E_DEVILING,1800000; */ },{},{} 22620,Memorial_Box,Box Of Memories,2,0,,0,,,,,0xFFFFFFFF,63,2,,,,,,{ /* TODO */ },{},{} -22621,Squid_Bbq,Barbecued Squid,2,5000,,250,,,,,0xFFFFFFFF,63,2,,,,,,{ specialeffect2 EF_EXIT; /* SetBuff "EFST_JP_EVENT04" 300000 1 */ percentheal 5,5; },{},{} +22621,Squid_Bbq,Barbecued Squid,2,5000,,250,,,,,0xFFFFFFFF,63,2,,,,,,{ specialeffect2 EF_EXIT; sc_start SC_JP_EVENT04,300000,25; percentheal 5,5; },{},{} 22623,New_Start_Box,New Start Box,18,10,,10,,,,0,0xFFFFFFFF,63,2,,,,,,{ getitem 12803,1; getitem 12802,1; getitem 12809,1; },{},{} 22624,Riesen_Bretzel,Riesen Bretzel,0,0,,0,,,,,0xFFFFFFFF,63,2,,,,,,{ percentheal 100,0; },{},{} 22625,Oktoberfest_Bag,Oktoberfest Bag,2,0,,100,,,,,0xFFFFFFFF,63,2,,,,,,{ sc_start SC_OKTOBERFEST,600000,0; },{},{} @@ -9860,12 +9860,12 @@ 22747,Dengeki_Shot_Cartridge,Dengeki Shot Cartridge,18,10,,250,,,,0,0xFFFFFFFF,63,2,,,,,,{ getitem 13218,500; },{},{} 22748,Hearthstone_Shot_Cartridge,Hearthstone Shot Cartridge,18,10,,250,,,,0,0xFFFFFFFF,63,2,,,,,,{ getitem 13219,500; },{},{} 22749,Purification_Shot_Cartridge,Purification Shot Cartridge,18,10,,250,,,,0,0xFFFFFFFF,63,2,,,,,,{ getitem 13220,500; },{},{} -22750,Trans_Scroll_Horn_Scaraba,Transformation Scroll(Horn Scaraba),2,10,,10,,,,0,0xFFFFFFFF,63,2,,,,,,{ transform "2161",1200000,SC_NONE; /*ASPD + 2, HIT + 10*/ },{},{} -22751,Trans_Scroll_Wanderer,Transformation Scroll(Wanderer),2,10,,10,,,,0,0xFFFFFFFF,63,2,,,,,,{ transform "1208",1200000,SC_NONE; /*ASPD + 2, HIT + 10*/ },{},{} -22752,Trans_Scroll_Gazeti,Transformation Scroll(Gazeti),2,10,,10,,,,0,0xFFFFFFFF,63,2,,,,,,{ transform "1778",1200000,SC_NONE; /*Ranged Attack +30%*/ },{},{} -22753,Trans_Scroll_Kobold_Archer,Transformation Scroll(Kobold Archer),2,10,,10,,,,0,0xFFFFFFFF,63,2,,,,,,{ transform "1282",1200000,SC_NONE; /*Ranged Attack +30%*/ },{},{} -22754,Trans_Scroll_Necromancer,Transformation Scroll(Necromancer),2,10,,10,,,,0,0xFFFFFFFF,63,2,,,,,,{ transform "1870",1200000,SC_NONE; /*Ranged Attack +30%*/ },{},{} -22755,Trans_Scroll_Wind_Ghost,Transformation Scroll(Wind Ghost),2,10,,10,,,,0,0xFFFFFFFF,63,2,,,,,,{ transform "1263",1200000,SC_NONE; /*MATK + 50*/ },{},{} +22750,Trans_Scroll_Horn_Scaraba,Transformation Scroll(Horn Scaraba),2,10,,10,,,,0,0xFFFFFFFF,63,2,,,,,,{ transform 2161,1200000,SC_MTF_ASPD2; },{},{} +22751,Trans_Scroll_Wanderer,Transformation Scroll(Wanderer),2,10,,10,,,,0,0xFFFFFFFF,63,2,,,,,,{ transform 1208,1200000,SC_MTF_ASPD2; },{},{} +22752,Trans_Scroll_Gazeti,Transformation Scroll(Gazeti),2,10,,10,,,,0,0xFFFFFFFF,63,2,,,,,,{ transform 1778,1200000,SC_MTF_RANGEATK2; },{},{} +22753,Trans_Scroll_Kobold_Archer,Transformation Scroll(Kobold Archer),2,10,,10,,,,0,0xFFFFFFFF,63,2,,,,,,{ transform 1282,1200000,SC_MTF_RANGEATK2; },{},{} +22754,Trans_Scroll_Necromancer,Transformation Scroll(Necromancer),2,10,,10,,,,0,0xFFFFFFFF,63,2,,,,,,{ transform 1870,1200000,SC_MTF_RANGEATK2; },{},{} +22755,Trans_Scroll_Wind_Ghost,Transformation Scroll(Wind Ghost),2,10,,10,,,,0,0xFFFFFFFF,63,2,,,,,,{ transform 1263,1200000,SC_MTF_MATK2; },{},{} 22757,Collection_Of_Scrolls_Magical_Transformation,Collection Of Scrolls Magical Transformation,18,10,,200,,,,0,0xFFFFFFFF,63,2,,,,,,{ getitem 22755,1; getitem 22754,1; },{},{} 22758,Collection_Of_Scrolls_Shooting_Transformation,Collection Of Scrolls Shooting Transformation,18,10,,200,,,,0,0xFFFFFFFF,63,2,,,,,,{ getitem 22753,1; getitem 22752,1; },{},{} 22759,Collection_Of_Scrolls_Attack_Speed_Transformation,Collection Of Scrolls Attack Speed Transformation,18,10,,0,,,,,0xFFFFFFFF,63,2,,,,,,{ getitem 22751,1; getitem 22750,1; },{},{} diff --git a/db/re/skill_cast_db.txt b/db/re/skill_cast_db.txt index 81fa28d518..b8dad3d6e1 100644 --- a/db/re/skill_cast_db.txt +++ b/db/re/skill_cast_db.txt @@ -1411,7 +1411,7 @@ //-- LG_INSPIRATION 2325,2000,2000,0,30000:45000:60000:75000:90000,0,540000:480000:420000:360000:300000,1000 //-- LG_KINGS_GRACE -5013,1000,0,0,5000,0,60000,-1 +5013,0,1000,0,5000,0,90000,-1 //========================================== //===== Sura Skills ======================== diff --git a/db/re/skill_db.txt b/db/re/skill_db.txt index 55caa90c01..28b7798090 100644 --- a/db/re/skill_db.txt +++ b/db/re/skill_db.txt @@ -1322,7 +1322,7 @@ 5010,0,6,2,0,0x1,0,5,1,no,0,0,0,none,0,0x0, SC_ESCAPE,Emergency Escape 5011,0,6,4,0,0x1,0,5,1,no,0,0,0,none,0,0x0, AB_OFFERTORIUM,Offertorium 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,5,5,1,no,0,0,0,none,0,0x0, LG_KINGS_GRACE,King's Grace +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 diff --git a/db/re/skill_unit_db.txt b/db/re/skill_unit_db.txt index 70dfdaf70a..b6b1671b61 100644 --- a/db/re/skill_unit_db.txt +++ b/db/re/skill_unit_db.txt @@ -173,6 +173,7 @@ 5006,0x101, , 0, 3,2000,enemy, 0x018 //NC_MAGMA_ERUPTION 5008,0x85, , 0, 0, -1,all, 0x003 //SO_ELEMENTAL_SHIELD 5010,0xfe, , 0, 2, -1,enemy, 0x000 //SC_ESCAPE +5013,0x102, , 3, 0, -1,all, 0x2002 //LG_KINGS_GRACE 8020,0xf5, , 3, 0,2300:2100:1900:1700:1500,enemy, 0x018 //MH_POISON_MIST 8033,0x7e, , 0, 0, -1,all, 0x003 //MH_STEINWAND diff --git a/doc/script_commands.txt b/doc/script_commands.txt index 99fb05079d..47d6fc6e15 100644 --- a/doc/script_commands.txt +++ b/doc/script_commands.txt @@ -5458,11 +5458,13 @@ undisguise; // Return to normal character sprite. --------------------------------------- -*transform ,,{,,,,}; +*transform ,,{,,,,}; +*transform "",,{,,,,}; This command will turn a player into a monster for a given duration and grants an SC attribute effect while transformed. Note that players cannot be transformed during War of Emperium or if already disguised. +Can only be removed when you die or the duration ends. --------------------------------------- \\ diff --git a/src/map/battle.c b/src/map/battle.c index f4e57c494a..0e39139499 100644 --- a/src/map/battle.c +++ b/src/map/battle.c @@ -892,7 +892,7 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam status_change_end(bl, SC_SAFETYWALL, INVALID_TIMER); } - if (sc->data[SC__MANHOLE]) { + if (sc->data[SC__MANHOLE] || (src->type == BL_PC && sc->data[SC_KINGS_GRACE])) { d->dmg_lv = ATK_BLOCK; return 0; } @@ -2391,8 +2391,12 @@ static bool is_attack_hitting(struct Damage wd, struct block_list *src, struct b hitrate += 3 * skill; } - if(sc && sc->data[SC_MTF_ASPD]) - hitrate += 5; + if (sc) { + if (sc->data[SC_MTF_ASPD]) + hitrate += 5; + if (sc->data[SC_MTF_ASPD2]) + hitrate += 10; + } hitrate = cap_value(hitrate, battle_config.min_hitrate, battle_config.max_hitrate); return (rnd()%100 < hitrate); @@ -4135,7 +4139,7 @@ static int battle_calc_skill_constant_addition(struct Damage wd, struct block_li * Initial refactoring by Baalberith * Refined and optimized by helvetica */ -struct Damage battle_attack_sc_bonus(struct Damage wd, struct block_list *src, struct block_list *target, uint16 skill_id) +struct Damage battle_attack_sc_bonus(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 status_change *sc = status_get_sc(src); @@ -4269,15 +4273,19 @@ 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(sc->data[SC_MTF_RANGEATK] && (wd.flag&(BF_LONG|BF_MAGIC)) == BF_LONG) { // Monster Transformation bonus - ATK_ADDRATE(wd.damage, wd.damage2, 25); - RE_ALLATK_ADDRATE(wd, 25); + if((wd.flag&(BF_LONG|BF_MAGIC)) == BF_LONG) { // Monster Transformation bonus + if (sc->data[SC_MTF_RANGEATK]) { + ATK_ADDRATE(wd.damage, wd.damage2, 25); + RE_ALLATK_ADDRATE(wd, 25); + } + if (sc->data[SC_MTF_RANGEATK2]) { + ATK_ADDRATE(wd.damage, wd.damage2, 30); + RE_ALLATK_ADDRATE(wd, 30); + } + if (sc->data[SC_MTF_CRIDAMAGE] && is_attack_critical(wd, src, target, skill_id, skill_lv, false)) { + ATK_ADDRATE(wd.damage, wd.damage2, 25); + RE_ALLATK_ADDRATE(wd, 25); //Temporary it should be 'bonus.crit_atk_rate' + } } } @@ -5033,7 +5041,7 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src, struct bl } // final attack bonuses that aren't affected by cards - wd = battle_attack_sc_bonus(wd, src, target, skill_id); + wd = battle_attack_sc_bonus(wd, src, target, skill_id, skill_lv); if (sd) { //monsters, homuns and pets have their damage computed directly wd.damage = wd.statusAtk + wd.weaponAtk + wd.equipAtk + wd.masteryAtk; @@ -5045,7 +5053,7 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src, struct bl } #else // final attack bonuses that aren't affected by cards - wd = battle_attack_sc_bonus(wd, src, target, skill_id); + wd = battle_attack_sc_bonus(wd, src, target, skill_id, skill_lv); #endif if (wd.damage + wd.damage2) { //Check if attack ignores DEF @@ -6216,7 +6224,7 @@ struct Damage battle_calc_misc_attack(struct block_list *src,struct block_list * break; case HVAN_EXPLOSION: //[orn] md.damage = (int64)sstatus->max_hp * (50 + 50 * skill_lv) / 100; - break ; + break; case ASC_BREAKER: #ifdef RENEWAL // Official Renewal formula [helvetica] @@ -7258,15 +7266,18 @@ int battle_check_target( struct block_list *src, struct block_list *target,int f return 0; } //end switch actual target - switch( t_bl->type ) - { //Checks on target master - case BL_PC: - { + switch( t_bl->type ) { //Checks on target master + case BL_PC: { struct map_session_data *sd; - if( t_bl == s_bl ) break; - sd = BL_CAST(BL_PC, t_bl); + struct status_change *sc = NULL; - if( sd->state.monster_ignore && flag&BCT_ENEMY ) + if( t_bl == s_bl ) + break; + + sd = BL_CAST(BL_PC, t_bl); + sc = status_get_sc(t_bl); + + if( (sd->state.monster_ignore || (sc->data[SC_KINGS_GRACE] && s_bl->type != BL_PC)) && flag&BCT_ENEMY ) return 0; // Global immunity only to Attacks if( sd->status.karma && s_bl->type == BL_PC && ((TBL_PC*)s_bl)->status.karma ) state |= BCT_ENEMY; // Characters with bad karma may fight amongst them diff --git a/src/map/itemdb.h b/src/map/itemdb.h index 22184108a2..0954265567 100644 --- a/src/map/itemdb.h +++ b/src/map/itemdb.h @@ -40,6 +40,7 @@ enum item_itemid ITEMID_WHITE_POTION = 504, ITEMID_BLUE_POTION = 505, ITEMID_HOLY_WATER = 523, + ITEMID_PUMPKIN = 535, ITEMID_RED_SLIM_POTION = 545, ITEMID_YELLOW_SLIM_POTION = 546, ITEMID_WHITE_SLIM_POTION = 547, diff --git a/src/map/pc.c b/src/map/pc.c index 5331d4ffe8..eb04b39b5a 100755 --- a/src/map/pc.c +++ b/src/map/pc.c @@ -7943,6 +7943,9 @@ int pc_itemheal(struct map_session_data *sd,int itemid, int hp,int sp) // Recovery Potion if( sd->sc.data[SC_INCHEALRATE] ) hp += (int)(hp * sd->sc.data[SC_INCHEALRATE]->val1/100.); + // 2014 Halloween Event : Pumpkin Bonus + if(sd->sc.data[SC_MTF_PUMPKIN] && itemid == ITEMID_PUMPKIN) + hp += (int)(hp * sd->sc.data[SC_MTF_PUMPKIN]->val1 / 100.); } if(sp) { bonus = 100 + (sd->battle_status.int_<<1) diff --git a/src/map/script.c b/src/map/script.c index 7818a7bafa..7d7260de0e 100644 --- a/src/map/script.c +++ b/src/map/script.c @@ -10442,23 +10442,34 @@ BUILDIN_FUNC(sc_end) if (!bl) return 0; - if (type >= 0 && type < SC_MAX) - { + if (type >= 0 && type < SC_MAX) { struct status_change *sc = status_get_sc(bl); struct status_change_entry *sce = sc ? sc->data[type] : NULL; if (!sce) return 0; - - switch (type) - { + switch (type) { case SC_WEIGHT50: case SC_WEIGHT90: case SC_NOCHAT: case SC_PUSH_CART: + case SC_ALL_RIDING: + case SC_STYLE_CHANGE: + case SC_MONSTER_TRANSFORM: + case SC_MTF_ASPD: + case SC_MTF_RANGEATK: + case SC_MTF_MATK: + case SC_MTF_MLEATKED: + case SC_MTF_CRIDAMAGE: + case SC_MTF_ASPD2: + case SC_MTF_RANGEATK2: + case SC_MTF_MATK2: + case SC_MTF_MHP: + case SC_MTF_MSP: + case SC_MTF_PUMPKIN: + case SC_MTF_HITFLEE: return 0; - default: break; } @@ -10466,8 +10477,7 @@ BUILDIN_FUNC(sc_end) //This should help status_change_end force disabling the SC in case it has no limit. sce->val1 = sce->val2 = sce->val3 = sce->val4 = 0; status_change_end(bl, (sc_type)type, INVALID_TIMER); - } - else + } else status_change_clear(bl, 3); // remove all effects return SCRIPT_CMD_SUCCESS; diff --git a/src/map/skill.c b/src/map/skill.c index cf5ee43bf8..6c89d3e0b9 100755 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -1624,12 +1624,7 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1 if (bl->type != BL_PC) sc_start(src,bl,SC_STUN,10 * skill_lv + rnd()%50,skill_lv,skill_get_time2(skill_id,skill_lv)); //(custom) break; - case RL_BANISHING_BUSTER: - { - //kRO update 2014-02-12. 100% chance to remove random buff(s) (1/2/3/4/5) - //TODO: - //- Confirm the removeable buffs. I'm using SA_DISPEL behavior - //- Make this removes 'random' buffs + case RL_BANISHING_BUSTER: { uint16 i, n = skill_lv; if (!tsc || !tsc->count) @@ -1656,7 +1651,7 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1 case SC_INTFOOD: case SC_DEXFOOD: case SC_LUKFOOD: case SC_HITFOOD: case SC_FLEEFOOD: case SC_BATKFOOD: case SC_WATKFOOD: case SC_MATKFOOD: case SC_DANCING: - case SC_EDP: case SC_AUTOBERSERK: + case SC_SPIRIT: case SC_AUTOBERSERK: case SC_CARTBOOST: case SC_MELTDOWN: case SC_SAFETYWALL: case SC_SMA: case SC_SPEEDUP0: case SC_NOCHAT: case SC_ANKLE: case SC_SPIDERWEB: case SC_JAILED: @@ -1665,7 +1660,7 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1 case SC_INCHITRATE: case SC_INCATKRATE: case SC_NEN: case SC_READYSTORM: case SC_READYDOWN: case SC_READYTURN: case SC_READYCOUNTER: case SC_DODGE: case SC_WARM: - case SC_SPEEDUP1: case SC_AUTOTRADE: case SC_CRITICALWOUND: + /*case SC_SPEEDUP1:*/ case SC_AUTOTRADE: case SC_CRITICALWOUND: case SC_JEXPBOOST: case SC_INVINCIBLE: case SC_INVINCIBLEOFF: case SC_HELLPOWER: case SC_MANU_ATK: case SC_MANU_DEF: case SC_SPL_ATK: case SC_SPL_DEF: case SC_MANU_MATK: @@ -1673,33 +1668,35 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1 case SC_DRUMBATTLE: case SC_NIBELUNGEN: case SC_ROKISWEIL: case SC_INTOABYSS: case SC_SIEGFRIED: case SC_FOOD_STR_CASH: case SC_FOOD_AGI_CASH: case SC_FOOD_VIT_CASH: case SC_FOOD_DEX_CASH: - case SC_FOOD_INT_CASH: case SC_FOOD_LUK_CASH: case SC_SEVENWIND: - case SC_MIRACLE: case SC_S_LIFEPOTION: case SC_L_LIFEPOTION: - case SC_INCHEALRATE: case SC_ELECTRICSHOCKER: case SC__STRIPACCESSORY: - case SC_SAVAGE_STEAK: case SC_COCKTAIL_WARG_BLOOD: case SC_MINOR_BBQ: - case SC_SIROMA_ICE_TEA: case SC_DROCERA_HERB_STEAMED: case SC_PUTTI_TAILS_NOODLES: - case SC_NEUTRALBARRIER_MASTER: case SC_NEUTRALBARRIER: case SC_STEALTHFIELD_MASTER: - case SC_STEALTHFIELD: case SC_GIANTGROWTH: case SC_MILLENNIUMSHIELD: - case SC_REFRESH: case SC_STONEHARDSKIN: case SC_VITALITYACTIVATION: - case SC_FIGHTINGSPIRIT: case SC_ABUNDANCE: case SC__SHADOWFORM: - case SC_LEADERSHIP: case SC_GLORYWOUNDS: case SC_SOULCOLD: - case SC_HAWKEYES: case SC_PUSH_CART: - case SC_RAISINGDRAGON: case SC_GT_ENERGYGAIN: case SC_GT_CHANGE: - case SC_GT_REVITALIZE: case SC_REFLECTDAMAGE: case SC_INSPIRATION: - case SC_EXEEDBREAK: case SC_FORCEOFVANGUARD: case SC_BANDING: - case SC_DUPLELIGHT: case SC_EXPIATIO: case SC_LAUDAAGNUS: - case SC_LAUDARAMUS: case SC_GATLINGFEVER: case SC_INCREASING: - case SC_ADJUSTMENT: case SC_MADNESSCANCEL: - case SC_ANGEL_PROTECT: case SC_MONSTER_TRANSFORM: case SC_FULL_THROTTLE: - case SC_REBOUND: case SC_TELEKINESIS_INTENSE: - case SC_HEAT_BARREL: case SC_HEAT_BARREL_AFTER: case SC_P_ALTER: - case SC_E_CHAIN: case SC_C_MARKER: case SC_B_TRAP: - case SC_H_MINE: case SC_RECOGNIZEDSPELL: case SC_CHASEWALK2: - case SC_MTF_ASPD: case SC_MTF_RANGEATK: case SC_MTF_MATK: - case SC_MTF_MLEATKED: case SC_MTF_CRIDAMAGE: case SC_GN_CARTBOOST: + case SC_FOOD_INT_CASH: case SC_FOOD_LUK_CASH: case SC_ELECTRICSHOCKER: + case SC__STRIPACCESSORY: case SC__ENERVATION: case SC__GROOMY: + case SC__IGNORANCE: case SC__LAZINESS: case SC__UNLUCKY: + case SC__WEAKNESS: case SC_SAVAGE_STEAK: case SC_COCKTAIL_WARG_BLOOD: + case SC_MAGNETICFIELD: case SC_MINOR_BBQ: case SC_SIROMA_ICE_TEA: + case SC_DROCERA_HERB_STEAMED: case SC_PUTTI_TAILS_NOODLES: case SC_NEUTRALBARRIER_MASTER: + case SC_NEUTRALBARRIER: case SC_STEALTHFIELD_MASTER: case SC_STEALTHFIELD: + case SC_LEADERSHIP: case SC_GLORYWOUNDS: case SC_SOULCOLD: + case SC_HAWKEYES: case SC_REGENERATION: case SC_SEVENWIND: + case SC_MIRACLE: case SC_S_LIFEPOTION: case SC_L_LIFEPOTION: + case SC_INCHEALRATE: case SC_PUSH_CART: case SC_PARTYFLEE: + case SC_RAISINGDRAGON: case SC_GT_REVITALIZE: case SC_GT_ENERGYGAIN: + case SC_GT_CHANGE: case SC_ANGEL_PROTECT: case SC_MONSTER_TRANSFORM: + case SC_FULL_THROTTLE: case SC_REBOUND: case SC_TELEKINESIS_INTENSE: + case SC_MOONSTAR: case SC_SUPER_STAR: case SC_ALL_RIDING: + case SC_MTF_ASPD: case SC_MTF_RANGEATK: case SC_MTF_MATK: + case SC_MTF_MLEATKED: case SC_MTF_CRIDAMAGE: case SC_HEAT_BARREL: + case SC_HEAT_BARREL_AFTER: case SC_P_ALTER: case SC_E_CHAIN: + case SC_C_MARKER: case SC_B_TRAP: case SC_H_MINE: + case SC_STRANGELIGHTS: case SC_DECORATION_OF_MUSIC: case SC_GN_CARTBOOST: + case SC_RECOGNIZEDSPELL: case SC_CHASEWALK2: case SC_BITE: #ifdef RENEWAL case SC_EXTREMITYFIST2: #endif + case SC_HIDING: case SC_CLOAKING: case SC_CHASEWALK: + case SC_CLOAKINGEXCEED: case SC__INVISIBILITY: case SC_UTSUSEMI: + case SC_MTF_ASPD2: case SC_MTF_RANGEATK2: case SC_MTF_MATK2: + case SC_2011RWC_SCROLL: case SC_JP_EVENT04: case SC_MTF_MHP: + case SC_MTF_MSP: case SC_MTF_PUMPKIN: case SC_MTF_HITFLEE: continue; case SC_WHISTLE: case SC_ASSNCROS: case SC_POEMBRAGI: case SC_APPLEIDUN: case SC_HUMMING: case SC_DONTFORGETME: @@ -1712,8 +1709,9 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1 continue; break; } - if (i == SC_BERSERK) tsc->data[i]->val2=0; //Mark a dispelled berserk to avoid setting hp to 100 by setting hp penalty to 0. - status_change_end(bl, (sc_type)i, INVALID_TIMER); + if( i == SC_BERSERK || i == SC_SATURDAYNIGHTFEVER ) + tsc->data[i]->val2 = 0; + status_change_end(bl,(sc_type)i,INVALID_TIMER); n--; } //Remove bonus_script by Banishing Buster @@ -3749,10 +3747,11 @@ static int skill_timerskill(int tid, unsigned int tick, int id, intptr_t data) case WL_TETRAVORTEX_WATER: case WL_TETRAVORTEX_WIND: case WL_TETRAVORTEX_GROUND: - case SR_FLASHCOMBO_ATK_STEP1: - case SR_FLASHCOMBO_ATK_STEP2: - case SR_FLASHCOMBO_ATK_STEP3: - case SR_FLASHCOMBO_ATK_STEP4: + // For SR_FLASHCOMBO + case SR_DRAGONCOMBO: + case SR_FALLENEMPIRE: + case SR_TIGERCANNON: + case SR_SKYNETBLOW: break; // Exceptions default: continue; // Caster is Dead @@ -3901,17 +3900,15 @@ static int skill_timerskill(int tid, unsigned int tick, int id, intptr_t data) skill_attack(skl->type,src,src,target,skl->skill_id,skl->skill_lv,tick,skl->flag); break; } - case SR_FLASHCOMBO_ATK_STEP1: - case SR_FLASHCOMBO_ATK_STEP2: - case SR_FLASHCOMBO_ATK_STEP3: - case SR_FLASHCOMBO_ATK_STEP4: + // For SR_FLASHCOMBO + case SR_DRAGONCOMBO: + case SR_FALLENEMPIRE: + case SR_TIGERCANNON: + case SR_SKYNETBLOW: if( src->type == BL_PC ) { - TBL_PC *sd = NULL; - const enum e_skill combos[] = {SR_DRAGONCOMBO, SR_FALLENEMPIRE, SR_TIGERCANNON, SR_SKYNETBLOW}; - if( (sd = BL_CAST(BL_PC,src)) ) { - uint16 cid = combos[skl->skill_id - SR_FLASHCOMBO_ATK_STEP1]; - skill_castend_damage_id(src, target, cid, pc_checkskill(sd, cid), tick, 0); - } + 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); } break; case SC_ESCAPE: @@ -4028,10 +4025,11 @@ int skill_cleartimerskill (struct block_list *src) case WL_TETRAVORTEX_WATER: case WL_TETRAVORTEX_WIND: case WL_TETRAVORTEX_GROUND: - case SR_FLASHCOMBO_ATK_STEP1: - case SR_FLASHCOMBO_ATK_STEP2: - case SR_FLASHCOMBO_ATK_STEP3: - case SR_FLASHCOMBO_ATK_STEP4: + // For SR_FLASHCOMBO + case SR_DRAGONCOMBO: + case SR_FALLENEMPIRE: + case SR_TIGERCANNON: + case SR_SKYNETBLOW: continue; } delete_timer(ud->skilltimerskill[i]->timer, skill_timerskill); @@ -7367,68 +7365,74 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui if (!tsc->data[i]) continue; switch (i) { - case SC_WEIGHT50: case SC_WEIGHT90: case SC_HALLUCINATION: - case SC_STRIPWEAPON: case SC_STRIPSHIELD: case SC_STRIPARMOR: - case SC_STRIPHELM: case SC_CP_WEAPON: case SC_CP_SHIELD: - case SC_CP_ARMOR: case SC_CP_HELM: case SC_COMBO: - case SC_STRFOOD: case SC_AGIFOOD: case SC_VITFOOD: - case SC_INTFOOD: case SC_DEXFOOD: case SC_LUKFOOD: - case SC_HITFOOD: case SC_FLEEFOOD: case SC_BATKFOOD: - case SC_WATKFOOD: case SC_MATKFOOD: case SC_DANCING: - case SC_EDP: case SC_AUTOBERSERK: - case SC_CARTBOOST: case SC_MELTDOWN: case SC_SAFETYWALL: - case SC_SMA: case SC_SPEEDUP0: case SC_NOCHAT: - case SC_ANKLE: case SC_SPIDERWEB: case SC_JAILED: - case SC_ITEMBOOST: case SC_EXPBOOST: case SC_LIFEINSURANCE: - case SC_BOSSMAPINFO: case SC_PNEUMA: case SC_AUTOSPELL: - case SC_INCHITRATE: case SC_INCATKRATE: case SC_NEN: - case SC_READYSTORM: case SC_READYDOWN: case SC_READYTURN: - case SC_READYCOUNTER: case SC_DODGE: case SC_WARM: - case SC_SPEEDUP1: case SC_AUTOTRADE: case SC_CRITICALWOUND: - case SC_JEXPBOOST: case SC_INVINCIBLE: case SC_INVINCIBLEOFF: - case SC_HELLPOWER: case SC_MANU_ATK: case SC_MANU_DEF: - case SC_SPL_ATK: case SC_SPL_DEF: case SC_MANU_MATK: - case SC_SPL_MATK: case SC_RICHMANKIM: case SC_ETERNALCHAOS: - case SC_DRUMBATTLE: case SC_NIBELUNGEN: case SC_ROKISWEIL: - case SC_INTOABYSS: case SC_SIEGFRIED: case SC_FOOD_STR_CASH: - case SC_FOOD_AGI_CASH: case SC_FOOD_VIT_CASH: case SC_FOOD_DEX_CASH: - case SC_FOOD_INT_CASH: case SC_FOOD_LUK_CASH: case SC_SEVENWIND: - case SC_MIRACLE: case SC_S_LIFEPOTION: case SC_L_LIFEPOTION: - case SC_INCHEALRATE: case SC_ELECTRICSHOCKER: case SC__STRIPACCESSORY: - case SC_SAVAGE_STEAK: case SC_COCKTAIL_WARG_BLOOD: case SC_MINOR_BBQ: - case SC_SIROMA_ICE_TEA: case SC_DROCERA_HERB_STEAMED: case SC_PUTTI_TAILS_NOODLES: - case SC_NEUTRALBARRIER_MASTER: case SC_NEUTRALBARRIER: case SC_STEALTHFIELD_MASTER: - case SC_STEALTHFIELD: case SC_GIANTGROWTH: case SC_MILLENNIUMSHIELD: - case SC_REFRESH: case SC_STONEHARDSKIN: case SC_VITALITYACTIVATION: - case SC_FIGHTINGSPIRIT: case SC_ABUNDANCE: case SC__SHADOWFORM: - case SC_LEADERSHIP: case SC_GLORYWOUNDS: case SC_SOULCOLD: - case SC_HAWKEYES: case SC_PUSH_CART: - case SC_RAISINGDRAGON: case SC_GT_ENERGYGAIN: case SC_GT_CHANGE: - case SC_GT_REVITALIZE: case SC_REFLECTDAMAGE: case SC_INSPIRATION: - case SC_EXEEDBREAK: case SC_FORCEOFVANGUARD: case SC_BANDING: - case SC_DUPLELIGHT: case SC_EXPIATIO: case SC_LAUDAAGNUS: - case SC_LAUDARAMUS: case SC_GATLINGFEVER: case SC_INCREASING: - case SC_ADJUSTMENT: case SC_MADNESSCANCEL: - case SC_ANGEL_PROTECT: case SC_MONSTER_TRANSFORM: case SC_FULL_THROTTLE: - case SC_REBOUND: case SC_TELEKINESIS_INTENSE: - case SC_HEAT_BARREL: case SC_HEAT_BARREL_AFTER: case SC_P_ALTER: - case SC_E_CHAIN: case SC_C_MARKER: case SC_B_TRAP: - case SC_H_MINE: case SC_RECOGNIZEDSPELL: - case SC_MTF_ASPD: case SC_MTF_RANGEATK: case SC_MTF_MATK: - case SC_MTF_MLEATKED: case SC_MTF_CRIDAMAGE: case SC_GN_CARTBOOST: + case SC_WEIGHT50: case SC_WEIGHT90: case SC_HALLUCINATION: + case SC_STRIPWEAPON: case SC_STRIPSHIELD: case SC_STRIPARMOR: + case SC_STRIPHELM: case SC_CP_WEAPON: case SC_CP_SHIELD: + case SC_CP_ARMOR: case SC_CP_HELM: case SC_COMBO: + case SC_STRFOOD: case SC_AGIFOOD: case SC_VITFOOD: + case SC_INTFOOD: case SC_DEXFOOD: case SC_LUKFOOD: + case SC_HITFOOD: case SC_FLEEFOOD: case SC_BATKFOOD: + case SC_WATKFOOD: case SC_MATKFOOD: case SC_DANCING: + case SC_EDP: case SC_AUTOBERSERK: + case SC_CARTBOOST: case SC_MELTDOWN: case SC_SAFETYWALL: + case SC_SMA: case SC_SPEEDUP0: case SC_NOCHAT: + case SC_ANKLE: case SC_SPIDERWEB: case SC_JAILED: + case SC_ITEMBOOST: case SC_EXPBOOST: case SC_LIFEINSURANCE: + case SC_BOSSMAPINFO: case SC_PNEUMA: case SC_AUTOSPELL: + case SC_INCHITRATE: case SC_INCATKRATE: case SC_NEN: + case SC_READYSTORM: case SC_READYDOWN: case SC_READYTURN: + case SC_READYCOUNTER: case SC_DODGE: case SC_WARM: + /*case SC_SPEEDUP1:*/ case SC_AUTOTRADE: case SC_CRITICALWOUND: + case SC_JEXPBOOST: case SC_INVINCIBLE: case SC_INVINCIBLEOFF: + case SC_HELLPOWER: case SC_MANU_ATK: case SC_MANU_DEF: + case SC_SPL_ATK: case SC_SPL_DEF: case SC_MANU_MATK: + case SC_SPL_MATK: case SC_RICHMANKIM: case SC_ETERNALCHAOS: + case SC_DRUMBATTLE: case SC_NIBELUNGEN: case SC_ROKISWEIL: + case SC_INTOABYSS: case SC_SIEGFRIED: case SC_FOOD_STR_CASH: + case SC_FOOD_AGI_CASH: case SC_FOOD_VIT_CASH: case SC_FOOD_DEX_CASH: + case SC_FOOD_INT_CASH: case SC_FOOD_LUK_CASH: case SC_SEVENWIND: + case SC_MIRACLE: case SC_S_LIFEPOTION: case SC_L_LIFEPOTION: + case SC_INCHEALRATE: case SC_ELECTRICSHOCKER: case SC__STRIPACCESSORY: + case SC_SAVAGE_STEAK: case SC_COCKTAIL_WARG_BLOOD: case SC_MINOR_BBQ: + case SC_SIROMA_ICE_TEA: case SC_DROCERA_HERB_STEAMED: case SC_PUTTI_TAILS_NOODLES: + case SC_NEUTRALBARRIER_MASTER: case SC_NEUTRALBARRIER: case SC_STEALTHFIELD_MASTER: + case SC_STEALTHFIELD: case SC_GIANTGROWTH: case SC_MILLENNIUMSHIELD: + case SC_REFRESH: case SC_STONEHARDSKIN: case SC_VITALITYACTIVATION: + case SC_FIGHTINGSPIRIT: case SC_ABUNDANCE: case SC__SHADOWFORM: + case SC_RECOGNIZEDSPELL:case SC_LEADERSHIP: case SC_GLORYWOUNDS: + case SC_SOULCOLD: case SC_HAWKEYES: case SC_REGENERATION: + case SC_PUSH_CART: case SC_RAISINGDRAGON: case SC_GT_ENERGYGAIN: + case SC_GT_CHANGE: case SC_GT_REVITALIZE: case SC_REFLECTDAMAGE: + case SC_INSPIRATION: case SC_EXEEDBREAK: case SC_FORCEOFVANGUARD: + case SC_BANDING: case SC_DUPLELIGHT: case SC_EXPIATIO: + case SC_LAUDAAGNUS: case SC_LAUDARAMUS: case SC_GATLINGFEVER: + case SC_INCREASING: case SC_ADJUSTMENT: case SC_MADNESSCANCEL: + case SC_ANGEL_PROTECT: case SC_MONSTER_TRANSFORM: case SC_FULL_THROTTLE: + case SC_REBOUND: case SC_TELEKINESIS_INTENSE: case SC_MOONSTAR: + case SC_SUPER_STAR: case SC_ALL_RIDING: case SC_MTF_ASPD: + case SC_MTF_RANGEATK: case SC_MTF_MATK: case SC_MTF_MLEATKED: + case SC_MTF_CRIDAMAGE: case SC_HEAT_BARREL: case SC_HEAT_BARREL_AFTER: + case SC_P_ALTER: case SC_E_CHAIN: case SC_C_MARKER: + case SC_B_TRAP: case SC_H_MINE: case SC_STRANGELIGHTS: + case SC_DECORATION_OF_MUSIC: case SC_GN_CARTBOOST: case SC_CHASEWALK2: #ifdef RENEWAL - case SC_EXTREMITYFIST2: + case SC_EXTREMITYFIST2: #endif - continue; - // bugreport:4888 these songs may only be dispelled if you're not in their song area anymore - case SC_WHISTLE: - case SC_ASSNCROS: - case SC_POEMBRAGI: - case SC_APPLEIDUN: - case SC_HUMMING: - case SC_DONTFORGETME: - case SC_FORTUNE: - case SC_SERVICE4U: + case SC_HIDING: case SC_CLOAKING: case SC_CHASEWALK: + case SC_CLOAKINGEXCEED: case SC__INVISIBILITY: case SC_UTSUSEMI: + case SC_MTF_ASPD2: case SC_MTF_RANGEATK2: case SC_MTF_MATK2: + case SC_2011RWC_SCROLL: case SC_JP_EVENT04: case SC_MTF_MHP: + case SC_MTF_MSP: case SC_MTF_PUMPKIN: case SC_MTF_HITFLEE: + continue; + //bugreport:4888 these songs may only be dispelled if you're not in their song area anymore + case SC_WHISTLE: + case SC_ASSNCROS: + case SC_POEMBRAGI: + case SC_APPLEIDUN: + case SC_HUMMING: + case SC_DONTFORGETME: + case SC_FORTUNE: + case SC_SERVICE4U: if(tsc->data[i]->val4==0) continue; //if in song-area don't end it break; @@ -8845,56 +8849,63 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui if (!tsc->data[i]) continue; switch (i) { - case SC_WEIGHT50: case SC_WEIGHT90: case SC_HALLUCINATION: - case SC_STRIPWEAPON: case SC_STRIPSHIELD: case SC_STRIPARMOR: - case SC_STRIPHELM: case SC_CP_WEAPON: case SC_CP_SHIELD: - case SC_CP_ARMOR: case SC_CP_HELM: case SC_COMBO: - case SC_STRFOOD: case SC_AGIFOOD: case SC_VITFOOD: - case SC_INTFOOD: case SC_DEXFOOD: case SC_LUKFOOD: - case SC_HITFOOD: case SC_FLEEFOOD: case SC_BATKFOOD: - case SC_WATKFOOD: case SC_MATKFOOD: case SC_DANCING: - case SC_SPIRIT: case SC_AUTOBERSERK: - case SC_CARTBOOST: case SC_MELTDOWN: case SC_SAFETYWALL: - case SC_SMA: case SC_SPEEDUP0: case SC_NOCHAT: - case SC_ANKLE: case SC_SPIDERWEB: case SC_JAILED: - case SC_ITEMBOOST: case SC_EXPBOOST: case SC_LIFEINSURANCE: - case SC_BOSSMAPINFO: case SC_PNEUMA: case SC_AUTOSPELL: - case SC_INCHITRATE: case SC_INCATKRATE: case SC_NEN: - case SC_READYSTORM: case SC_READYDOWN: case SC_READYTURN: - case SC_READYCOUNTER:case SC_DODGE: case SC_WARM: - case SC_SPEEDUP1: case SC_AUTOTRADE: case SC_CRITICALWOUND: - case SC_JEXPBOOST: case SC_INVINCIBLE: case SC_INVINCIBLEOFF: - case SC_HELLPOWER: case SC_MANU_ATK: case SC_MANU_DEF: - case SC_SPL_ATK: case SC_SPL_DEF: case SC_MANU_MATK: - case SC_SPL_MATK: case SC_RICHMANKIM: case SC_ETERNALCHAOS: - case SC_DRUMBATTLE: case SC_NIBELUNGEN: case SC_ROKISWEIL: - case SC_INTOABYSS: case SC_SIEGFRIED: case SC_WHISTLE: - case SC_ASSNCROS: case SC_POEMBRAGI: case SC_APPLEIDUN: - case SC_HUMMING: case SC_DONTFORGETME: case SC_FORTUNE: - case SC_SERVICE4U: case SC_FOOD_STR_CASH: case SC_FOOD_AGI_CASH: - case SC_FOOD_VIT_CASH: case SC_FOOD_DEX_CASH: case SC_FOOD_INT_CASH: - case SC_FOOD_LUK_CASH: case SC_ELECTRICSHOCKER: case SC_BITE: - case SC__STRIPACCESSORY: case SC__ENERVATION: case SC__GROOMY: - case SC__IGNORANCE: case SC__LAZINESS: case SC__UNLUCKY: - case SC__WEAKNESS: case SC_SAVAGE_STEAK: case SC_COCKTAIL_WARG_BLOOD: - case SC_MAGNETICFIELD: case SC_MINOR_BBQ: case SC_SIROMA_ICE_TEA: - case SC_DROCERA_HERB_STEAMED: case SC_PUTTI_TAILS_NOODLES: - case SC_NEUTRALBARRIER_MASTER: case SC_NEUTRALBARRIER: - case SC_STEALTHFIELD_MASTER: case SC_STEALTHFIELD: - case SC_LEADERSHIP: case SC_GLORYWOUNDS: case SC_SOULCOLD: - case SC_HAWKEYES: case SC_PUSH_CART: - case SC_PARTYFLEE: case SC_GT_REVITALIZE: - case SC_RAISINGDRAGON: case SC_GT_ENERGYGAIN: case SC_GT_CHANGE: - case SC_ANGEL_PROTECT: case SC_MONSTER_TRANSFORM: - case SC_FULL_THROTTLE: case SC_REBOUND: case SC_TELEKINESIS_INTENSE: - case SC_HEAT_BARREL: case SC_HEAT_BARREL_AFTER: case SC_P_ALTER: - case SC_E_CHAIN: case SC_C_MARKER: case SC_B_TRAP: - case SC_H_MINE: case SC_RECOGNIZEDSPELL: - case SC_MTF_ASPD: case SC_MTF_RANGEATK: case SC_MTF_MATK: - case SC_MTF_MLEATKED: case SC_MTF_CRIDAMAGE: case SC_GN_CARTBOOST: + case SC_WEIGHT50: case SC_WEIGHT90: case SC_HALLUCINATION: + case SC_STRIPWEAPON: case SC_STRIPSHIELD: case SC_STRIPARMOR: + case SC_STRIPHELM: case SC_CP_WEAPON: case SC_CP_SHIELD: + case SC_CP_ARMOR: case SC_CP_HELM: case SC_COMBO: + case SC_STRFOOD: case SC_AGIFOOD: case SC_VITFOOD: + case SC_INTFOOD: case SC_DEXFOOD: case SC_LUKFOOD: + case SC_HITFOOD: case SC_FLEEFOOD: case SC_BATKFOOD: + case SC_WATKFOOD: case SC_MATKFOOD: case SC_DANCING: + case SC_SPIRIT: case SC_AUTOBERSERK: + case SC_CARTBOOST: case SC_MELTDOWN: case SC_SAFETYWALL: + case SC_SMA: case SC_SPEEDUP0: case SC_NOCHAT: + case SC_ANKLE: case SC_SPIDERWEB: case SC_JAILED: + case SC_ITEMBOOST: case SC_EXPBOOST: case SC_LIFEINSURANCE: + case SC_BOSSMAPINFO: case SC_PNEUMA: case SC_AUTOSPELL: + case SC_INCHITRATE: case SC_INCATKRATE: case SC_NEN: + case SC_READYSTORM: case SC_READYDOWN: case SC_READYTURN: + case SC_READYCOUNTER: case SC_DODGE: case SC_WARM: + /*case SC_SPEEDUP1:*/ case SC_AUTOTRADE: case SC_CRITICALWOUND: + case SC_JEXPBOOST: case SC_INVINCIBLE: case SC_INVINCIBLEOFF: + case SC_HELLPOWER: case SC_MANU_ATK: case SC_MANU_DEF: + case SC_SPL_ATK: case SC_SPL_DEF: case SC_MANU_MATK: + case SC_SPL_MATK: case SC_RICHMANKIM: case SC_ETERNALCHAOS: + case SC_DRUMBATTLE: case SC_NIBELUNGEN: case SC_ROKISWEIL: + case SC_INTOABYSS: case SC_SIEGFRIED: case SC_WHISTLE: + case SC_ASSNCROS: case SC_POEMBRAGI: case SC_APPLEIDUN: + case SC_HUMMING: case SC_DONTFORGETME: case SC_FORTUNE: + case SC_SERVICE4U: case SC_FOOD_STR_CASH: case SC_FOOD_AGI_CASH: + case SC_FOOD_VIT_CASH: case SC_FOOD_DEX_CASH: case SC_FOOD_INT_CASH: + case SC_FOOD_LUK_CASH: case SC_ELECTRICSHOCKER: case SC_BITE: + case SC__STRIPACCESSORY: case SC__ENERVATION: case SC__GROOMY: + case SC__IGNORANCE: case SC__LAZINESS: case SC__UNLUCKY: + case SC__WEAKNESS: case SC_SAVAGE_STEAK: case SC_COCKTAIL_WARG_BLOOD: + case SC_MAGNETICFIELD: case SC_MINOR_BBQ: case SC_SIROMA_ICE_TEA: + case SC_DROCERA_HERB_STEAMED: case SC_PUTTI_TAILS_NOODLES: case SC_NEUTRALBARRIER_MASTER: + case SC_NEUTRALBARRIER: case SC_STEALTHFIELD_MASTER: case SC_STEALTHFIELD: + case SC_LEADERSHIP: case SC_GLORYWOUNDS: case SC_SOULCOLD: + case SC_HAWKEYES: case SC_REGENERATION: case SC_SEVENWIND: + case SC_MIRACLE: case SC_S_LIFEPOTION: case SC_L_LIFEPOTION: + case SC_INCHEALRATE: case SC_PUSH_CART: case SC_PARTYFLEE: + case SC_RAISINGDRAGON: case SC_GT_REVITALIZE: case SC_GT_ENERGYGAIN: + case SC_GT_CHANGE: case SC_ANGEL_PROTECT: case SC_MONSTER_TRANSFORM: + case SC_FULL_THROTTLE: case SC_REBOUND: case SC_TELEKINESIS_INTENSE: + case SC_MOONSTAR: case SC_SUPER_STAR: case SC_ALL_RIDING: + case SC_MTF_ASPD: case SC_MTF_RANGEATK: case SC_MTF_MATK: + case SC_MTF_MLEATKED: case SC_MTF_CRIDAMAGE: case SC_HEAT_BARREL: + case SC_HEAT_BARREL_AFTER: case SC_P_ALTER: case SC_E_CHAIN: + case SC_C_MARKER: case SC_B_TRAP: case SC_H_MINE: + case SC_STRANGELIGHTS: case SC_DECORATION_OF_MUSIC: case SC_GN_CARTBOOST: + case SC_RECOGNIZEDSPELL: case SC_CHASEWALK2: #ifdef RENEWAL - case SC_EXTREMITYFIST2: + case SC_EXTREMITYFIST2: #endif + case SC_HIDING: case SC_CLOAKING: case SC_CHASEWALK: + case SC_CLOAKINGEXCEED: case SC__INVISIBILITY: case SC_UTSUSEMI: + case SC_MTF_ASPD2: case SC_MTF_RANGEATK2: case SC_MTF_MATK2: + case SC_2011RWC_SCROLL: case SC_JP_EVENT04: case SC_MTF_MHP: + case SC_MTF_MSP: case SC_MTF_PUMPKIN: case SC_MTF_HITFLEE: continue; case SC_ASSUMPTIO: if( bl->type == BL_MOB ) @@ -8942,24 +8953,6 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui } break; - case LG_KINGS_GRACE: - if( flag&1 ) { - int sc_toend[] = { SC_POISON, SC_BLIND, SC_FREEZE, SC_STONE, SC_STUN, SC_SLEEP, SC_BLEEDING, SC_CURSE, - SC_CONFUSION, SC_HALLUCINATION, SC_SILENCE, SC_BURNING, SC_CRYSTALIZE, SC_FREEZING, - SC_DEEPSLEEP, SC_FEAR, SC_MANDRAGORA}; - for( i = 0; i < ARRAYLENGTH(sc_toend); i++) { - status_change_end(bl, (sc_type)sc_toend[i], INVALID_TIMER); - } - sc_start(src, bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv)); - } else { - skill_area_temp[2] = 0; - if( !map_flag_vs(src->m) && !map_flag_gvg(src->m) ) - flag |= BCT_GUILD; - map_foreachinrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), BL_PC, src, skill_id, skill_lv, tick, flag|SD_PREAMBLE|BCT_PARTY|BCT_SELF|1, skill_castend_nodamage_id); - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); - } - break; - case WL_WHITEIMPRISON: if( (src == bl || battle_check_target(src, bl, BCT_ENEMY)>0) && !is_boss(bl) )// Should not work with bosses. { @@ -9523,14 +9516,17 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui 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))); break; - case SR_FLASHCOMBO: - if( sd ) + case SR_FLASHCOMBO: { + const int combo[] = { SR_DRAGONCOMBO, SR_FALLENEMPIRE, SR_TIGERCANNON, SR_SKYNETBLOW }; + + if (sd) sd->ud.attackabletime = sd->canuseitem_tick = sd->ud.canact_tick; clif_skill_nodamage(src,bl,skill_id,skill_lv, - sc_start(src,src,type,100,skill_lv,skill_get_time(skill_id,skill_lv))); - for( i = SR_FLASHCOMBO_ATK_STEP1; i <= SR_FLASHCOMBO_ATK_STEP4; i++ ) - skill_addtimerskill(src,tick + 500 * (i - SR_FLASHCOMBO_ATK_STEP1),bl->id,0,0,i,skill_lv,BF_WEAPON,flag|SD_LEVEL); - break; + 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); + } + break; case WA_SWING_DANCE: case WA_MOONLIT_SERENADE: @@ -11130,6 +11126,7 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui case MH_STEINWAND: case MH_XENO_SLASHER: case NC_MAGMA_ERUPTION: + case LG_KINGS_GRACE: case SO_ELEMENTAL_SHIELD: case RL_B_TRAP: flag|=1;//Set flag to 1 to prevent deleting ammo (it will be deleted on group-delete). @@ -12701,6 +12698,17 @@ static int skill_unit_onplace(struct skill_unit *unit, struct block_list *bl, un sc_start(ss, bl, SC_ASH, 100, sg->skill_lv, skill_get_time(MH_VOLCANIC_ASH, sg->skill_lv)); break; + case UNT_KINGS_GRACE: + if (!sce) { + int state = 0; + + if (!map_flag_vs(ss->m) && !map_flag_gvg2(ss->m)) + state |= BCT_GUILD; + if (battle_check_target(&unit->bl, bl, BCT_SELF|BCT_PARTY|state) > 0) + sc_start4(ss, bl, type, 100, sg->skill_lv, 0, ss->id, 0, sg->limit); + } + break; + case UNT_GD_LEADERSHIP: case UNT_GD_GLORYWOUNDS: case UNT_GD_SOULCOLD: @@ -13617,6 +13625,7 @@ int skill_unit_onleft(uint16 skill_id, struct block_list *bl, unsigned int tick) case SC_BLOODYLUST: case GN_FIRE_EXPANSION_SMOKE_POWDER: case GN_FIRE_EXPANSION_TEAR_GAS: + case LG_KINGS_GRACE: case SO_ELEMENTAL_SHIELD: if (sce) status_change_end(bl, type, INVALID_TIMER); diff --git a/src/map/status.c b/src/map/status.c index ab8686b4cb..ae50b0e434 100644 --- a/src/map/status.c +++ b/src/map/status.c @@ -709,7 +709,7 @@ 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|SCB_MAXHP ); set_sc( SR_GENTLETOUCH_REVITALIZE , SC_GT_REVITALIZE , SI_GENTLETOUCH_REVITALIZE , SCB_MAXHP|SCB_REGEN ); - add_sc( SR_FLASHCOMBO , SC_FLASHCOMBO ); + set_sc( SR_FLASHCOMBO , SC_FLASHCOMBO , SI_FLASHCOMBO , SCB_WATK ); /* Wanderer / Minstrel */ set_sc( WA_SWING_DANCE , SC_SWINGDANCE , SI_SWINGDANCE , SCB_SPEED|SCB_ASPD ); @@ -977,6 +977,8 @@ void initChangeTables(void) StatusIconChangeTable[SC_UPHEAVAL] = SI_UPHEAVAL; StatusIconChangeTable[SC_REBOUND] = SI_REBOUND; + StatusIconChangeTable[SC_DEFSET] = SI_SET_NUM_DEF; + StatusIconChangeTable[SC_MDEFSET] = SI_SET_NUM_MDEF; StatusIconChangeTable[SC_MONSTER_TRANSFORM] = SI_MONSTER_TRANSFORM; StatusIconChangeTable[SC_ALL_RIDING] = SI_ALL_RIDING; StatusIconChangeTable[SC_PUSH_CART] = SI_ON_PUSH_CART; @@ -994,16 +996,25 @@ void initChangeTables(void) StatusIconChangeTable[SC_QUEST_BUFF1] = SI_QUEST_BUFF1; StatusIconChangeTable[SC_QUEST_BUFF2] = SI_QUEST_BUFF2; StatusIconChangeTable[SC_QUEST_BUFF3] = SI_QUEST_BUFF3; + StatusIconChangeTable[SC_MTF_ASPD2] = SI_MTF_ASPD2; + StatusIconChangeTable[SC_MTF_RANGEATK2] = SI_MTF_RANGEATK2; + StatusIconChangeTable[SC_MTF_MATK2] = SI_MTF_MATK2; + StatusIconChangeTable[SC_2011RWC_SCROLL] = SI_2011RWC_SCROLL; + StatusIconChangeTable[SC_JP_EVENT04] = SI_JP_EVENT04; + StatusIconChangeTable[SC_MTF_HITFLEE] = SI_MTF_HITFLEE; + StatusIconChangeTable[SC_MTF_MHP] = SI_MTF_MHP; + StatusIconChangeTable[SC_MTF_MSP] = SI_MTF_MSP; + StatusIconChangeTable[SC_MTF_PUMPKIN] = SI_MTF_PUMPKIN; /* Other SC which are not necessarily associated to skills */ - StatusChangeFlagTable[SC_ASPDPOTION0] = SCB_ASPD; - StatusChangeFlagTable[SC_ASPDPOTION1] = SCB_ASPD; - StatusChangeFlagTable[SC_ASPDPOTION2] = SCB_ASPD; - StatusChangeFlagTable[SC_ASPDPOTION3] = SCB_ASPD; - StatusChangeFlagTable[SC_SPEEDUP0] = SCB_SPEED; - StatusChangeFlagTable[SC_SPEEDUP1] = SCB_SPEED; - StatusChangeFlagTable[SC_ATKPOTION] = SCB_BATK; - StatusChangeFlagTable[SC_MATKPOTION] = SCB_MATK; + StatusChangeFlagTable[SC_ASPDPOTION0] |= SCB_ASPD; + StatusChangeFlagTable[SC_ASPDPOTION1] |= SCB_ASPD; + StatusChangeFlagTable[SC_ASPDPOTION2] |= SCB_ASPD; + StatusChangeFlagTable[SC_ASPDPOTION3] |= SCB_ASPD; + StatusChangeFlagTable[SC_SPEEDUP0] |= SCB_SPEED; + StatusChangeFlagTable[SC_SPEEDUP1] |= SCB_SPEED; + StatusChangeFlagTable[SC_ATKPOTION] |= SCB_BATK; + StatusChangeFlagTable[SC_MATKPOTION] |= SCB_MATK; StatusChangeFlagTable[SC_INCALLSTATUS] |= SCB_STR|SCB_AGI|SCB_VIT|SCB_INT|SCB_DEX|SCB_LUK; StatusChangeFlagTable[SC_INCSTR] |= SCB_STR; StatusChangeFlagTable[SC_INCAGI] |= SCB_AGI; @@ -1045,12 +1056,12 @@ void initChangeTables(void) StatusChangeFlagTable[SC_CHASEWALK2] |= SCB_STR; /* Cash Items */ - StatusChangeFlagTable[SC_FOOD_STR_CASH] = SCB_STR; - StatusChangeFlagTable[SC_FOOD_AGI_CASH] = SCB_AGI; - StatusChangeFlagTable[SC_FOOD_VIT_CASH] = SCB_VIT; - StatusChangeFlagTable[SC_FOOD_DEX_CASH] = SCB_DEX; - StatusChangeFlagTable[SC_FOOD_INT_CASH] = SCB_INT; - StatusChangeFlagTable[SC_FOOD_LUK_CASH] = SCB_LUK; + StatusChangeFlagTable[SC_FOOD_STR_CASH] |= SCB_STR; + StatusChangeFlagTable[SC_FOOD_AGI_CASH] |= SCB_AGI; + StatusChangeFlagTable[SC_FOOD_VIT_CASH] |= SCB_VIT; + StatusChangeFlagTable[SC_FOOD_DEX_CASH] |= SCB_DEX; + StatusChangeFlagTable[SC_FOOD_INT_CASH] |= SCB_INT; + StatusChangeFlagTable[SC_FOOD_LUK_CASH] |= SCB_LUK; /* Mercenary Bonus Effects */ StatusChangeFlagTable[SC_MERC_FLEEUP] |= SCB_FLEE; @@ -1104,6 +1115,12 @@ void initChangeTables(void) StatusChangeFlagTable[SC_QUEST_BUFF1] |= SCB_BATK|SCB_MATK; StatusChangeFlagTable[SC_QUEST_BUFF2] |= SCB_BATK|SCB_MATK; StatusChangeFlagTable[SC_QUEST_BUFF3] |= SCB_BATK|SCB_MATK; + StatusChangeFlagTable[SC_MTF_ASPD2] |= SCB_ASPD|SCB_HIT; + StatusChangeFlagTable[SC_MTF_MATK2] |= SCB_MATK; + StatusChangeFlagTable[SC_2011RWC_SCROLL] |= SCB_BATK|SCB_MATK|SCB_STR|SCB_AGI|SCB_VIT|SCB_INT|SCB_DEX|SCB_LUK; + StatusChangeFlagTable[SC_MTF_HITFLEE] |= SCB_HIT|SCB_FLEE; + StatusChangeFlagTable[SC_MTF_MHP] |= SCB_MAXHP; + StatusChangeFlagTable[SC_MTF_MSP] |= SCB_MAXSP; #ifdef RENEWAL // renewal EDP increases your weapon atk @@ -1183,6 +1200,7 @@ void initChangeTables(void) StatusChangeStateTable[SC_KAGEHUMI] |= SCS_NOMOVE; StatusChangeStateTable[SC_KYOUGAKU] |= SCS_NOMOVE; StatusChangeStateTable[SC_PARALYSIS] |= SCS_NOMOVE; + StatusChangeStateTable[SC_KINGS_GRACE] |= SCS_NOMOVE; /* StatusChangeState (SCS_) NOPICKUPITEMS */ StatusChangeStateTable[SC_HIDING] |= SCS_NOPICKITEM; @@ -2628,6 +2646,8 @@ static int status_get_hpbonus(struct block_list *bl, enum e_status_bonus type) { bonus += (600 * sc->data[SC_INSPIRATION]->val1); if(sc->data[SC_SOLID_SKIN_OPTION]) bonus += 2000; + if(sc->data[SC_MTF_MHP]) + bonus += sc->data[SC_MTF_MHP]->val1; if(sc->data[SC_MARIONETTE]) bonus -= 1000; } @@ -2734,9 +2754,11 @@ static int status_get_spbonus(struct block_list *bl, enum e_status_bonus type) { //Bonus by SC if (sc) { if(sc->data[SC_INCMSP]) - bonus += (sc->data[SC_INCMSP]->val1); + bonus += sc->data[SC_INCMSP]->val1; if(sc->data[SC_EARTH_INSIGNIA] && sc->data[SC_EARTH_INSIGNIA]->val1 == 3) bonus += 50; + if(sc->data[SC_MTF_MSP]) + bonus += sc->data[SC_MTF_MSP]->val1; } } else if (type == STATUS_BONUS_RATE) { struct status_change *sc = status_get_sc(bl); @@ -4855,6 +4877,8 @@ static unsigned short status_calc_str(struct block_list *bl, struct status_chang str += sc->data[SC_SAVAGE_STEAK]->val1; if(sc->data[SC_INSPIRATION]) str += sc->data[SC_INSPIRATION]->val3; + if(sc->data[SC_2011RWC_SCROLL]) + str += sc->data[SC_2011RWC_SCROLL]->val1; if(sc->data[SC_STOMACHACHE]) str -= sc->data[SC_STOMACHACHE]->val1; if(sc->data[SC_KYOUGAKU]) @@ -4899,6 +4923,8 @@ static unsigned short status_calc_agi(struct block_list *bl, struct status_chang agi += sc->data[SC_INCREASEAGI]->val2; if(sc->data[SC_INCREASING]) agi += 4; // Added based on skill updates [Reddozen] + if(sc->data[SC_2011RWC_SCROLL]) + agi += sc->data[SC_2011RWC_SCROLL]->val1; if(sc->data[SC_DECREASEAGI]) agi -= sc->data[SC_DECREASEAGI]->val2; if(sc->data[SC_QUAGMIRE]) @@ -4971,6 +4997,8 @@ static unsigned short status_calc_vit(struct block_list *bl, struct status_chang vit += sc->data[SC_MINOR_BBQ]->val1; if(sc->data[SC_INSPIRATION]) vit += sc->data[SC_INSPIRATION]->val3; + if(sc->data[SC_2011RWC_SCROLL]) + vit += sc->data[SC_2011RWC_SCROLL]->val1; if(sc->data[SC_STOMACHACHE]) vit -= sc->data[SC_STOMACHACHE]->val1; if(sc->data[SC_KYOUGAKU]) @@ -5027,6 +5055,8 @@ static unsigned short status_calc_int(struct block_list *bl, struct status_chang int_ += sc->data[SC_NEN]->val1; if(sc->data[SC_MARIONETTE]) int_ -= ((sc->data[SC_MARIONETTE]->val4)>>16)&0xFF; + if(sc->data[SC_2011RWC_SCROLL]) + int_ += sc->data[SC_2011RWC_SCROLL]->val1; if(sc->data[SC_MARIONETTE2]) int_ += ((sc->data[SC_MARIONETTE2]->val4)>>16)&0xFF; if(sc->data[SC_SPIRIT] && sc->data[SC_SPIRIT]->val2 == SL_HIGH) @@ -5100,6 +5130,8 @@ static unsigned short status_calc_dex(struct block_list *bl, struct status_chang dex += 4; // Added based on skill updates [Reddozen] if(sc->data[SC_MARIONETTE]) dex -= ((sc->data[SC_MARIONETTE]->val4)>>8)&0xFF; + if(sc->data[SC_2011RWC_SCROLL]) + dex += sc->data[SC_2011RWC_SCROLL]->val1; if(sc->data[SC_MARIONETTE2]) dex += ((sc->data[SC_MARIONETTE2]->val4)>>8)&0xFF; if(sc->data[SC_SPIRIT] && sc->data[SC_SPIRIT]->val2 == SL_HIGH) @@ -5169,7 +5201,8 @@ static unsigned short status_calc_luk(struct block_list *bl, struct status_chang luk -= sc->data[SC_KYOUGAKU]->val2; if(sc->data[SC_LAUDARAMUS]) luk += 4 + sc->data[SC_LAUDARAMUS]->val1; - + if(sc->data[SC_2011RWC_SCROLL]) + luk += sc->data[SC_2011RWC_SCROLL]->val1; if(sc->data[SC__STRIPACCESSORY] && bl->type != BL_PC) luk -= luk * sc->data[SC__STRIPACCESSORY]->val2 / 100; if(sc->data[SC_BANANA_BOMB]) @@ -5219,7 +5252,8 @@ static unsigned short status_calc_batk(struct block_list *bl, struct status_chan batk += sc->data[SC_PYROCLASTIC]->val2; if (sc->data[SC_ANGRIFFS_MODUS]) batk += sc->data[SC_ANGRIFFS_MODUS]->val2; - + if(sc->data[SC_2011RWC_SCROLL]) + batk += 30; if(sc->data[SC_INCATKRATE]) batk += batk * sc->data[SC_INCATKRATE]->val1/100; if(sc->data[SC_PROVOKE]) @@ -5345,6 +5379,8 @@ 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; @@ -5394,6 +5430,10 @@ static unsigned short status_calc_ematk(struct block_list *bl, struct status_cha matk += sc->data[SC_QUEST_BUFF2]->val1; if(sc->data[SC_QUEST_BUFF3]) matk += sc->data[SC_QUEST_BUFF3]->val1; + if(sc->data[SC_MTF_MATK2]) + matk += 50; + if(sc->data[SC_2011RWC_SCROLL]) + matk += 30; return (unsigned short)cap_value(matk,0,USHRT_MAX); } @@ -5432,6 +5472,10 @@ static unsigned short status_calc_matk(struct block_list *bl, struct status_chan matk += 40 + 30 * sc->data[SC_ODINS_POWER]->val1; // 70 lvl1, 100lvl2 if (sc->data[SC_IZAYOI]) matk += 25 * sc->data[SC_IZAYOI]->val1; + if (sc->data[SC_MTF_MATK2]) + matk += 50; + if (sc->data[SC_2011RWC_SCROLL]) + matk += 30; #endif if (sc->data[SC_ZANGETSU]) matk += sc->data[SC_ZANGETSU]->val3; @@ -5451,6 +5495,8 @@ static unsigned short status_calc_matk(struct block_list *bl, struct status_chan matk += sc->data[SC_MOONLITSERENADE]->val3/100; if (sc->data[SC_MTF_MATK]) matk += matk * 25 / 100; + if(sc->data[SC_2011RWC_SCROLL]) + matk += 30; return (unsigned short)cap_value(matk,0,USHRT_MAX); } @@ -5523,7 +5569,8 @@ static signed short status_calc_hit(struct block_list *bl, struct status_change hit += 20; // RockmanEXE; changed based on updated [Reddozen] if(sc->data[SC_MERC_HITUP]) hit += sc->data[SC_MERC_HITUP]->val2; - + if(sc->data[SC_MTF_HITFLEE]) + hit += sc->data[SC_MTF_HITFLEE]->val1; if(sc->data[SC_INCHITRATE]) hit += hit * sc->data[SC_INCHITRATE]->val1/100; if(sc->data[SC_BLIND]) @@ -5538,8 +5585,6 @@ static signed short status_calc_hit(struct block_list *bl, struct status_change hit -= hit * 50 / 100; if(sc->data[SC_ILLUSIONDOPING]) hit -= 50; - if (sc->data[SC_MTF_ASPD]) - hit += 5; return (short)cap_value(hit,1,SHRT_MAX); } @@ -5596,6 +5641,8 @@ static signed short status_calc_flee(struct block_list *bl, struct status_change flee += sc->data[SC_MERC_FLEEUP]->val2; if( sc->data[SC_HALLUCINATIONWALK] ) flee += sc->data[SC_HALLUCINATIONWALK]->val2; + if(sc->data[SC_MTF_HITFLEE]) + flee += sc->data[SC_MTF_HITFLEE]->val2; if( sc->data[SC_WATER_BARRIER] ) flee -= sc->data[SC_WATER_BARRIER]->val3; if( sc->data[SC_C_MARKER] ) @@ -6265,6 +6312,8 @@ static short status_calc_fix_aspd(struct block_list *bl, struct status_change *s aspd -= sc->data[SC_FIGHTINGSPIRIT]->val2; if (sc->data[SC_MTF_ASPD]) aspd -= 10; + if (sc->data[SC_MTF_ASPD2]) + aspd -= 20; return cap_value(aspd, 0, 2000); // Will be recap for proper bl anyway } @@ -7744,11 +7793,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty return 0; break; case SC_MAGNIFICAT: - if( sc->data[SC_OFFERTORIUM] || sc->option&OPTION_MADOGEAR ) // Mado is immune to magnificat - return 0; - break; - case SC_OFFERTORIUM: - if(sc->data[SC_MAGNIFICAT]) + if( sc->option&OPTION_MADOGEAR ) // Mado is immune to magnificat return 0; break; case SC_ONEHAND: @@ -7890,27 +7935,27 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty return 0; break; case SC_FOOD_STR_CASH: - if (sc->data[SC_STRFOOD] && sc->data[SC_STRFOOD]->val1 > val1) + if ((sc->data[SC_STRFOOD] && sc->data[SC_STRFOOD]->val1 > val1) || sc->data[SC_2011RWC_SCROLL]) return 0; break; case SC_FOOD_AGI_CASH: - if (sc->data[SC_AGIFOOD] && sc->data[SC_AGIFOOD]->val1 > val1) + if ((sc->data[SC_AGIFOOD] && sc->data[SC_AGIFOOD]->val1 > val1) || sc->data[SC_2011RWC_SCROLL]) return 0; break; case SC_FOOD_VIT_CASH: - if (sc->data[SC_VITFOOD] && sc->data[SC_VITFOOD]->val1 > val1) + if ((sc->data[SC_VITFOOD] && sc->data[SC_VITFOOD]->val1 > val1) || sc->data[SC_2011RWC_SCROLL]) return 0; break; case SC_FOOD_INT_CASH: - if (sc->data[SC_INTFOOD] && sc->data[SC_INTFOOD]->val1 > val1) + if ((sc->data[SC_INTFOOD] && sc->data[SC_INTFOOD]->val1 > val1) || sc->data[SC_2011RWC_SCROLL]) return 0; break; case SC_FOOD_DEX_CASH: - if (sc->data[SC_DEXFOOD] && sc->data[SC_DEXFOOD]->val1 > val1) + if ((sc->data[SC_DEXFOOD] && sc->data[SC_DEXFOOD]->val1 > val1) || sc->data[SC_2011RWC_SCROLL]) return 0; break; case SC_FOOD_LUK_CASH: - if (sc->data[SC_LUKFOOD] && sc->data[SC_LUKFOOD]->val1 > val1) + if ((sc->data[SC_LUKFOOD] && sc->data[SC_LUKFOOD]->val1 > val1) || sc->data[SC_2011RWC_SCROLL]) return 0; break; case SC_CAMOUFLAGE: @@ -7971,6 +8016,10 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty if (sc->data[SC_P_ALTER] || sc->data[SC_HEAT_BARREL]) return 0; break; + case SC_KINGS_GRACE: + if (sc->data[SC_DEVOTION] || sc->data[SC_WHITEIMPRISON]) + return 0; + break; case SC_WEDDING: case SC_XMAS: @@ -8086,6 +8135,12 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty // Cancels Normal Overthrust. [Skotlex] status_change_end(bl, SC_OVERTHRUST, INVALID_TIMER); break; + case SC_MAGNIFICAT: + status_change_end(bl,SC_OFFERTORIUM,INVALID_TIMER); + break; + case SC_OFFERTORIUM: + status_change_end(bl,SC_MAGNIFICAT,INVALID_TIMER); + break; case SC_KYRIE: // Cancels Assumptio status_change_end(bl, SC_ASSUMPTIO, INVALID_TIMER); @@ -8298,6 +8353,33 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty case SC_FREEZING: status_change_end(bl, SC_BURNING, INVALID_TIMER); break; + case SC_KINGS_GRACE: + status_change_end(bl,SC_POISON,INVALID_TIMER); + status_change_end(bl,SC_BLIND,INVALID_TIMER); + status_change_end(bl,SC_FREEZE,INVALID_TIMER); + status_change_end(bl,SC_STONE,INVALID_TIMER); + status_change_end(bl,SC_STUN,INVALID_TIMER); + status_change_end(bl,SC_SLEEP,INVALID_TIMER); + status_change_end(bl,SC_BLEEDING,INVALID_TIMER); + status_change_end(bl,SC_CURSE,INVALID_TIMER); + status_change_end(bl,SC_CONFUSION,INVALID_TIMER); + status_change_end(bl,SC_HALLUCINATION,INVALID_TIMER); + status_change_end(bl,SC_SILENCE,INVALID_TIMER); + status_change_end(bl,SC_BURNING,INVALID_TIMER); + status_change_end(bl,SC_CRYSTALIZE,INVALID_TIMER); + status_change_end(bl,SC_FREEZING,INVALID_TIMER); + status_change_end(bl,SC_DEEPSLEEP,INVALID_TIMER); + status_change_end(bl,SC_FEAR,INVALID_TIMER); + status_change_end(bl,SC_MANDRAGORA,INVALID_TIMER); + break; + case SC_2011RWC_SCROLL: + status_change_end(bl,SC_FOOD_STR_CASH,INVALID_TIMER); + status_change_end(bl,SC_FOOD_AGI_CASH,INVALID_TIMER); + status_change_end(bl,SC_FOOD_VIT_CASH,INVALID_TIMER); + status_change_end(bl,SC_FOOD_INT_CASH,INVALID_TIMER); + status_change_end(bl,SC_FOOD_DEX_CASH,INVALID_TIMER); + status_change_end(bl,SC_FOOD_LUK_CASH,INVALID_TIMER); + break; case SC_EQC: status_change_end(bl,SC_TINDER_BREAKER2,INVALID_TIMER); break; @@ -9231,6 +9313,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty break; case SC_EXPBOOST: case SC_JEXPBOOST: + case SC_JP_EVENT04: if (val1 < 0) val1 = 0; break; @@ -10031,6 +10114,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty case SC_EXPBOOST: case SC_JEXPBOOST: case SC_ITEMBOOST: + case SC_JP_EVENT04: val_flag |= 1; break; // Start |1|2 val_flag setting @@ -10480,7 +10564,7 @@ int status_change_clear(struct block_list* bl, int type) if(!sc->data[i]) continue; - if(type == 0) + if(type == 0) { switch (i) { // Type 0: PC killed -> Place here statuses that do not dispel on death. case SC_ELEMENTALCHANGE: // Only when its Holy or Dark that it doesn't dispell on death if( sc->data[i]->val2 != ELE_HOLY && sc->data[i]->val2 != ELE_DARK ) @@ -10549,7 +10633,10 @@ int status_change_clear(struct block_list* bl, int type) case SC_QUEST_BUFF1: case SC_QUEST_BUFF2: case SC_QUEST_BUFF3: + case SC_2011RWC_SCROLL: + case SC_JP_EVENT04: continue; + } } if( type == 3 ) { @@ -12398,6 +12485,15 @@ void status_change_clear_buffs (struct block_list* bl, int type) case SC_QUEST_BUFF1: case SC_QUEST_BUFF2: case SC_QUEST_BUFF3: + case SC_MTF_ASPD2: + case SC_MTF_RANGEATK2: + case SC_MTF_MATK2: + case SC_2011RWC_SCROLL: + case SC_JP_EVENT04: + case SC_MTF_MHP: + case SC_MTF_MSP: + case SC_MTF_PUMPKIN: + case SC_MTF_HITFLEE: continue; // Debuffs that can be removed. diff --git a/src/map/status.h b/src/map/status.h index b10162a0ec..51122b53ee 100644 --- a/src/map/status.h +++ b/src/map/status.h @@ -694,7 +694,7 @@ typedef enum sc_type { SC_QUEST_BUFF1, SC_QUEST_BUFF2, SC_QUEST_BUFF3, - + SC_ALL_RIDING, SC_TEARGAS_SOB, @@ -703,6 +703,18 @@ typedef enum sc_type { SC_ELEMENTAL_SHIELD, SC_CHASEWALK2, + SC_MTF_ASPD2, + SC_MTF_RANGEATK2, + SC_MTF_MATK2, + SC_2011RWC_SCROLL, + SC_JP_EVENT04, + + // 2014 Halloween Event + SC_MTF_MHP, + SC_MTF_MSP, + SC_MTF_PUMPKIN, + SC_MTF_HITFLEE, + #ifdef RENEWAL SC_EXTREMITYFIST2, //! NOTE: This SC should be right before SC_MAX, so it doesn't disturb if RENEWAL is disabled #endif @@ -1520,7 +1532,52 @@ enum si_type { SI_GET_MAILBOX = 814, SI_JUMPINGCLAN = 815, SI_JP_OTP = 816, - + SI_HANDICAPTOLERANCE_LEVELGAP = 817, + SI_MTF_RANGEATK2 = 818, + SI_MTF_ASPD2 = 819, + SI_MTF_MATK2 = 820, + SI_SHOW_NPCHPBAR = 821, + SI_FLOWERSMOKE = 822, + SI_FSTONE = 823, + SI_DAILYSENDMAILCNT = 824, + SI_QSCARABA = 825, + SI_LJOSALFAR = 826, + SI_PAD_READER_KNIGHT = 827, + SI_PAD_READER_CRUSADER = 828, + SI_PAD_READER_BLACKSMITH = 829, + SI_PAD_READER_ALCHEMIST = 830, + SI_PAD_READER_ASSASSIN = 831, + SI_PAD_READER_ROGUE = 832, + SI_PAD_READER_WIZARD = 833, + SI_PAD_READER_SAGE = 834, + SI_PAD_READER_PRIEST = 835, + SI_PAD_READER_MONK = 836, + SI_PAD_READER_HUNTER = 837, + SI_PAD_READER_BARD = 838, + SI_PAD_READER_DANCER = 839, + SI_PAD_READER_TAEKWON = 840, + SI_PAD_READER_NINJA = 841, + SI_PAD_READER_GUNSLINGER = 842, + SI_PAD_READER_SUPERNOVICE = 843, + SI_ESSENCE_OF_TIME = 844, + SI_MINIGAME_ROULETTE = 845, + SI_MINIGAME_GOLD_POINT = 846, + SI_MINIGAME_SILVER_POINT = 847, + SI_MINIGAME_BRONZE_POINT = 848, + SI_HAPPINESS_STAR = 849, + SI_SUMMEREVENT01 = 850, + SI_SUMMEREVENT02 = 851, + SI_SUMMEREVENT03 = 852, + SI_SUMMEREVENT04 = 853, + SI_SUMMEREVENT05 = 854, + SI_MINIGAME_ROULETTE_BONUS_ITEM = 855, + SI_DRESS_UP = 856, + SI_MAPLE_FALLS = 857, + SI_ALL_NIFLHEIM_RECALL = 858, + SI_DRACULA_CARD = 865, + SI_LIMIT_POWER_BOOSTER = 867, + SI_TIME_ACCESSORY = 872, + SI_EP16_DEF = 873, SI_MAX, };