From 394dab1237a660093d5a778358fc09ff098fed10 Mon Sep 17 00:00:00 2001 From: Aleos Date: Tue, 28 Jun 2022 12:01:57 -0400 Subject: [PATCH] Cleans up Thief's Double Attack item bonuses (#7070) * Items that grant TF_DOUBLE now no longer require bDoubleRate. * Adds pc_checkskill_flag() to return a skill's flag value. Thanks to @eppc0330 and @secretdataz! --- db/pre-re/item_db_equip.yml | 9 +-------- db/pre-re/item_db_etc.yml | 1 - db/re/item_combos.yml | 6 +----- db/re/item_db_equip.yml | 18 +----------------- db/re/item_db_etc.yml | 3 --- src/common/mmo.hpp | 3 ++- src/map/battle.cpp | 1 + src/map/pc.cpp | 29 ++++++++++++++++++++++++++--- src/map/pc.hpp | 1 + 9 files changed, 33 insertions(+), 38 deletions(-) diff --git a/db/pre-re/item_db_equip.yml b/db/pre-re/item_db_equip.yml index b2f35b2953..3e96842099 100644 --- a/db/pre-re/item_db_equip.yml +++ b/db/pre-re/item_db_equip.yml @@ -844,7 +844,6 @@ Body: Refineable: true Script: | skill "TF_DOUBLE",5; - bonus bDoubleRate,25; bonus2 bAddRace,RC_DemiHuman,5; bonus2 bAddRace,RC_Player_Human,5; - Id: 1131 @@ -24702,7 +24701,6 @@ Body: Script: | bonus bMaxSP,100; skill "TF_DOUBLE",3; - bonus bDoubleRate,15; skill "TF_STEAL",1; skill "TF_HIDING",1; skill "TF_POISON",1; @@ -29767,7 +29765,6 @@ Body: bonus bMaxHP,50; bonus bMaxSP,50; skill "TF_DOUBLE",2; - bonus bDoubleRate,10; bonus2 bSubRace,RC_DemiHuman,3; bonus2 bSubRace,RC_Player_Human,3; - Id: 5284 @@ -31728,7 +31725,6 @@ Body: NoGuildStorage: true Script: | skill "TF_DOUBLE",5; - bonus bDoubleRate,25; - Id: 5389 AegisName: Angel_Spirit Name: Angel Spirit @@ -34171,9 +34167,7 @@ Body: View: 525 Script: | bonus bDex,2; - .@bonus = max(getskilllv("TF_DOUBLE"), 5); - skill "TF_DOUBLE",.@bonus; - bonus bDoubleRate,.@bonus * 5; + skill "TF_DOUBLE",5; - Id: 5532 AegisName: Pirate_Dagger_J Name: Pirate Dagger @@ -39963,7 +39957,6 @@ Body: WeaponLevel: 4 Script: | skill "TF_DOUBLE",5; - bonus bDoubleRate,25; bonus2 bAddRace,RC_DemiHuman,40; bonus2 bAddRace,RC_Player_Human,40; - Id: 13408 diff --git a/db/pre-re/item_db_etc.yml b/db/pre-re/item_db_etc.yml index be4fba4cca..09997ec170 100644 --- a/db/pre-re/item_db_etc.yml +++ b/db/pre-re/item_db_etc.yml @@ -4026,7 +4026,6 @@ Body: BuyingStore: true Script: | skill "TF_DOUBLE",1; - bonus bDoubleRate,5; - Id: 4118 AegisName: Petit_Card Name: Earth Petite Card diff --git a/db/re/item_combos.yml b/db/re/item_combos.yml index 55a14c54f7..7269f384b0 100644 --- a/db/re/item_combos.yml +++ b/db/re/item_combos.yml @@ -2518,13 +2518,10 @@ Body: Script: | .@r = getequiprefinerycnt(EQI_GARMENT); if (.@r >= 7) { - .@bonus = max(getskilllv("TF_DOUBLE"),5); - skill "TF_DOUBLE",.@bonus; - bonus bDoubleRate,.@bonus*5; + skill "TF_DOUBLE",5; } else if (.@r >= 5) { skill "TF_DOUBLE",1; - bonus bDoubleRate,25; } - Combos: - Combo: @@ -9915,7 +9912,6 @@ Body: .@val += 15; if ((.@weapon + .@eq) >= 22) { skill "TF_DOUBLE",4; - bonus bDoubleRate,20; } } bonus bAspdRate,.@val; diff --git a/db/re/item_db_equip.yml b/db/re/item_db_equip.yml index 341f62ac25..9f4b3a0735 100644 --- a/db/re/item_db_equip.yml +++ b/db/re/item_db_equip.yml @@ -844,7 +844,6 @@ Body: Refineable: true Script: | skill "TF_DOUBLE",5; - bonus bDoubleRate,25; bonus2 bAddRace,RC_DemiHuman,5; bonus2 bAddRace,RC_Player_Human,5; - Id: 1131 @@ -8689,7 +8688,6 @@ Body: bonus bAtkEle,Ele_Poison; bonus bCritical,10; skill "TF_DOUBLE",5; - bonus bDoubleRate,25; bonus2 bAddEff,Eff_Poison,1000; bonus2 bAddEff2,Eff_Poison,300; - Id: 1448 @@ -35842,7 +35840,6 @@ Body: Script: | bonus bMaxSP,100; skill "TF_DOUBLE",3; - bonus bDoubleRate,15; skill "TF_STEAL",1; skill "TF_HIDING",1; skill "TF_POISON",1; @@ -43509,7 +43506,6 @@ Body: bonus bMaxHP,50; bonus bMaxSP,50; skill "TF_DOUBLE",2; - bonus bDoubleRate,10; bonus2 bSubRace,RC_DemiHuman,3; bonus2 bSubRace,RC_Player_Human,3; bonus2 bSubRace,RC_Brute,3; @@ -45480,7 +45476,6 @@ Body: View: 393 Script: | skill "TF_DOUBLE",5; - bonus bDoubleRate,25; - Id: 5389 AegisName: Angel_Spirit Name: Angel Spirit @@ -48103,9 +48098,7 @@ Body: NoDrop: true Script: | bonus bDex,2; - .@bonus = max(getskilllv("TF_DOUBLE"), 5); - skill "TF_DOUBLE",.@bonus; - bonus bDoubleRate,.@bonus * 5; + skill "TF_DOUBLE",5; - Id: 5532 AegisName: Pirate_Dagger_J Name: Pirate Dagger @@ -49893,7 +49886,6 @@ Body: bonus2 bSubRace,RC_Brute,3; bonus2 bSubRace,RC_Player_Doram,3; skill "TF_DOUBLE",2; - bonus bDoubleRate,10; bonus bMaxHP,50; bonus bMaxSP,50; - Id: 5626 @@ -62443,7 +62435,6 @@ Body: NoAuction: true Script: | skill "TF_DOUBLE",5; - bonus bDoubleRate,25; bonus2 bAddRace,RC_DemiHuman,40; bonus2 bAddRace,RC_Player_Human,40; - Id: 13408 @@ -82624,7 +82615,6 @@ Body: bonus bMaxHP,50; bonus bMaxSP,50; skill "TF_DOUBLE",2; - bonus bDoubleRate,10; bonus2 bSubRace,RC_DemiHuman,3; bonus2 bSubRace,RC_Player_Human,3; - Id: 19130 @@ -83583,7 +83573,6 @@ Body: bonus bCritAtkRate,5*getskilllv("BS_OVERTHRUST"); if (.@r>=11) { skill "TF_DOUBLE",5; - bonus bDoubleRate,25; } - Id: 19190 AegisName: Racing_Cap_GN @@ -83797,7 +83786,6 @@ Body: if (.@r>=11) { bonus bUnbreakableWeapon; skill "TF_DOUBLE",5; - bonus bDoubleRate,25; } - Id: 19196 AegisName: Racing_Cap_RG @@ -99654,21 +99642,18 @@ Body: bonus bFlee,30; skill "TF_DOUBLE",10; skill "MO_TRIPLEATTACK",10; - bonus bDoubleRate,50; } else if (.@r>=7) { bonus bAspdRate,6; bonus bFlee,20; skill "TF_DOUBLE",5; skill "MO_TRIPLEATTACK",5; - bonus bDoubleRate,25; } else { bonus bAspdRate,3; bonus bFlee,10; skill "TF_DOUBLE",3; skill "MO_TRIPLEATTACK",3; - bonus bDoubleRate,15; } - Id: 20863 AegisName: MenblattWing @@ -118546,7 +118531,6 @@ Body: } if (.@r>=10) { skill "TF_DOUBLE",3; - bonus bDoubleRate,15; } - Id: 26154 AegisName: SoulWeight diff --git a/db/re/item_db_etc.yml b/db/re/item_db_etc.yml index 6f7d79ffb0..7deaa9ba06 100644 --- a/db/re/item_db_etc.yml +++ b/db/re/item_db_etc.yml @@ -4213,7 +4213,6 @@ Body: DropEffect: CLIENT Script: | skill "TF_DOUBLE",1; - bonus bDoubleRate,5; - Id: 4118 AegisName: Petit_Card Name: Earth Petite Card @@ -42880,7 +42879,6 @@ Body: SubType: Enchant Script: | skill "TF_DOUBLE",3; - bonus bDoubleRate,15; - Id: 29366 AegisName: Strong_Blow1 Name: Hard Blow 1 @@ -49587,7 +49585,6 @@ Body: bonus bCritAtkRate,15; if (getskilllv("AS_KATAR") >= 10) { skill "TF_DOUBLE",3; - bonus bDoubleRate,15; } - Id: 310189 AegisName: GuillotineCross_Bottom2 diff --git a/src/common/mmo.hpp b/src/common/mmo.hpp index a873b56ebe..e86112fd02 100644 --- a/src/common/mmo.hpp +++ b/src/common/mmo.hpp @@ -363,8 +363,9 @@ struct startitem { uint32 pos; }; -enum e_skill_flag +enum e_skill_flag : int8 { + SKILL_FLAG_NONE = -1, SKILL_FLAG_PERMANENT, SKILL_FLAG_TEMPORARY, SKILL_FLAG_PLAGIARIZED, diff --git a/src/map/battle.cpp b/src/map/battle.cpp index cfbbf66036..172bf8c53d 100644 --- a/src/map/battle.cpp +++ b/src/map/battle.cpp @@ -3805,6 +3805,7 @@ static void battle_calc_multi_attack(struct Damage* wd, struct block_list *src,s if( sd && !skill_id ) { // if no skill_id passed, check for double attack [helvetica] short i; if( ( ( skill_lv = pc_checkskill(sd,TF_DOUBLE) ) > 0 && sd->weapontype1 == W_DAGGER ) + || ( pc_checkskill_flag(*sd, TF_DOUBLE) > SKILL_FLAG_PERMANENT && sd->weapontype1 != W_FIST ) || ( sd->bonus.double_rate > 0 && sd->weapontype1 != W_FIST ) // Will fail bare-handed || ( sc && sc->data[SC_KAGEMUSYA] && sd->weapontype1 != W_FIST )) // Will fail bare-handed { //Success chance is not added, the higher one is used [Skotlex] diff --git a/src/map/pc.cpp b/src/map/pc.cpp index d80886ff2f..8bbacf7e93 100755 --- a/src/map/pc.cpp +++ b/src/map/pc.cpp @@ -4959,15 +4959,13 @@ bool pc_skill(struct map_session_data* sd, uint16 skill_id, int level, enum e_ad case ADDSKILL_TEMP: //Item bonus skill. if (sd->status.skill[idx].id != 0) { - if (sd->status.skill[idx].lv >= level) - return true; if (sd->status.skill[idx].flag == SKILL_FLAG_PERMANENT) //Non-granted skill, store it's level. sd->status.skill[idx].flag = SKILL_FLAG_REPLACED_LV_0 + sd->status.skill[idx].lv; } else { sd->status.skill[idx].id = skill_id; sd->status.skill[idx].flag = SKILL_FLAG_TEMPORARY; } - sd->status.skill[idx].lv = level; + sd->status.skill[idx].lv = max(sd->status.skill[idx].lv, level); break; case ADDSKILL_TEMP_ADDLEVEL: //Add skill bonus on top of what you had. @@ -6694,6 +6692,31 @@ uint8 pc_checkskill(struct map_session_data *sd, uint16 skill_id) return (sd->status.skill[idx].id == skill_id) ? sd->status.skill[idx].lv : 0; } +/** + * Returns the flag of the given skill (when learned). + * @param sd: Player data + * @param skill_id: Skill to lookup + * @return Skill flag type + */ +e_skill_flag pc_checkskill_flag(map_session_data &sd, uint16 skill_id) { + uint16 idx; + +#ifdef RENEWAL + if ((idx = skill_get_index(skill_id)) == 0) { +#else + if ((idx = skill_db.get_index(skill_id, skill_id >= RK_ENCHANTBLADE, __FUNCTION__, __FILE__, __LINE__)) == 0) { + if (skill_id >= RK_ENCHANTBLADE) { + // Silently fail for now -> future update planned + return SKILL_FLAG_NONE; + } +#endif + ShowError("pc_checkskill_flag: Invalid skill id %d (char_id=%d).\n", skill_id, sd.status.char_id); + return SKILL_FLAG_NONE; + } + + return (sd.status.skill[idx].id == skill_id && sd.status.skill[idx].lv > 0) ? static_cast(sd.status.skill[idx].flag) : SKILL_FLAG_NONE; +} + /** * Returns the amount of skill points invested in a Summoner's Power of Sea/Land/Life * @param sd: Player data diff --git a/src/map/pc.hpp b/src/map/pc.hpp index 8b7f945d0f..a86148a2d1 100644 --- a/src/map/pc.hpp +++ b/src/map/pc.hpp @@ -1265,6 +1265,7 @@ void pc_setinventorydata(struct map_session_data *sd); int pc_get_skillcooldown(struct map_session_data *sd, uint16 skill_id, uint16 skill_lv); uint8 pc_checkskill(struct map_session_data *sd,uint16 skill_id); +e_skill_flag pc_checkskill_flag(map_session_data &sd, uint16 skill_id); uint8 pc_checkskill_summoner(map_session_data *sd, e_summoner_power_type type); uint8 pc_checkskill_imperial_guard(struct map_session_data *sd, short flag); short pc_checkequip(struct map_session_data *sd,int pos,bool checkall=false);