diff --git a/conf/map/battle/skill.conf b/conf/map/battle/skill.conf index b48ce8b35c8..2eafba3e203 100644 --- a/conf/map/battle/skill.conf +++ b/conf/map/battle/skill.conf @@ -325,7 +325,7 @@ trap_reflect: true // Note: If your MVPs are too tough, reduce it to 10. mob_max_skilllvl: 100 -// Area of Bowling Bash chain reaction +// Area of Bowling Bash chain reaction (Pre-renewal only) // 0: Use official gutter line system // 1: Gutter line system without demi gutter bug // 2-20: Area around caster (2 = 5x5, 3 = 7x7, 4 = 9x9, ..., 20 = 41x41) diff --git a/db/constants.conf b/db/constants.conf index 0b94291486f..50dbde88369 100644 --- a/db/constants.conf +++ b/db/constants.conf @@ -1310,6 +1310,8 @@ constants_db: { SC_FIRE_EXPANSION_TEAR_GAS_SOB: 718 + SC_NO_SWITCH_WEAPON: 719 + comment__: "Emotes" e_gasp: 0 e_what: 1 diff --git a/db/pre-re/sc_config.conf b/db/pre-re/sc_config.conf index 2589e6aa587..1a1ccfa5193 100644 --- a/db/pre-re/sc_config.conf +++ b/db/pre-re/sc_config.conf @@ -6408,3 +6408,13 @@ SC_ACTIVE_MONSTER_TRANSFORM: { SC__FEINTBOMB_MASTER: { Skill: "SC_FEINTBOMB" } +SC_NO_SWITCH_WEAPON: { + Flags: { + NoSave: true + NoDispelReset: true + NoBBReset: true + NoClearanceReset: true + Buff: true + } + Icon: "SI_NOEQUIPWEAPON" +} diff --git a/db/re/sc_config.conf b/db/re/sc_config.conf index 1efbeb8e023..a347a645bec 100644 --- a/db/re/sc_config.conf +++ b/db/re/sc_config.conf @@ -6414,3 +6414,13 @@ SC_ACTIVE_MONSTER_TRANSFORM: { SC__FEINTBOMB_MASTER: { Skill: "SC_FEINTBOMB" } +SC_NO_SWITCH_WEAPON: { + Flags: { + NoSave: true + NoDispelReset: true + NoBBReset: true + NoClearanceReset: true + Buff: true + } + Icon: "SI_NOEQUIPWEAPON" +} diff --git a/db/re/skill_db.conf b/db/re/skill_db.conf index 2ad1724eeb1..cccd4ec8bea 100644 --- a/db/re/skill_db.conf +++ b/db/re/skill_db.conf @@ -2317,7 +2317,7 @@ skill_db: ( Description: "Bowling Bash" MaxLevel: 10 Range: -2 - Hit: "BDT_SKILL" + Hit: "BDT_MULTIHIT" SkillType: { Enemy: true } @@ -2330,9 +2330,10 @@ skill_db: ( DamageType: { SplashArea: true } - SplashRange: 1 - KnockBackTiles: 1 - CastTime: 350 + SplashRange: 2 + KnockBackTiles: 5 + SkillData1: 1_000 // weapon change block duration + CoolDown: 1_000 FixedCastTime: 350 Requirements: { SPCost: { diff --git a/src/map/battle.c b/src/map/battle.c index 4eaf9abbb9f..bf9d832ab86 100644 --- a/src/map/battle.c +++ b/src/map/battle.c @@ -4723,13 +4723,29 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src, struct bl case GS_GROUNDDRIFT: case KN_SPEARSTAB: +#ifndef RENEWAL case KN_BOWLINGBASH: +#endif case MS_BOWLINGBASH: case MO_BALKYOUNG: case TK_TURNKICK: wd.blewcount=0; break; +#ifdef RENEWAL + case KN_BOWLINGBASH: + wd.div_ = 2; + + // wflag stores the number of affected targets + if (sd != NULL && sd->weapontype == W_2HSWORD) { + if (wflag >= 2 && wflag < 4) + wd.div_ = 3; + else if (wflag >= 4) + wd.div_ = 4; + } + break; +#endif + case KN_AUTOCOUNTER: wd.flag=(wd.flag&~BF_SKILLMASK)|BF_NORMAL; break; diff --git a/src/map/pc.c b/src/map/pc.c index 8906bcd78bd..141ba53df63 100644 --- a/src/map/pc.c +++ b/src/map/pc.c @@ -1129,8 +1129,10 @@ static int pc_isequip(struct map_session_data *sd, int n) } if (sd->sc.count != 0) { - if ((item->equip & EQP_ARMS) != 0 && item->type == IT_WEAPON && sd->sc.data[SC_NOEQUIPWEAPON] != NULL) // Also works with left-hand weapons. [DracoRPG] + if ((item->equip & EQP_ARMS) != 0 && item->type == IT_WEAPON + && (sd->sc.data[SC_NOEQUIPWEAPON] != NULL || sd->sc.data[SC_NO_SWITCH_WEAPON] != NULL)) { // Also works with left-hand weapons. [DracoRPG] return 0; + } if ((item->equip & EQP_SHIELD) != 0 && item->type == IT_ARMOR && sd->sc.data[SC_NOEQUIPSHIELD] != NULL) return 0; diff --git a/src/map/skill.c b/src/map/skill.c index e42a628849f..61a76113629 100644 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -5281,7 +5281,23 @@ static int skill_castend_damage_id(struct block_list *src, struct block_list *bl skill->attack(skill->get_type(skill_id, skill_lv), src, src, bl, skill_id, skill_lv, tick, flag); break; +#ifdef RENEWAL case KN_BOWLINGBASH: + // skill->area_temp[0] holds the number of targets affected + if (flag & 1) { + int sflag = skill->area_temp[0] | SD_ANIMATION; + skill->attack(skill->get_type(skill_id, skill_lv), src, src, bl, skill_id, skill_lv, tick, sflag); + } else { + sc_start(src, src, SC_NO_SWITCH_WEAPON, 100, 1, skill->get_time(skill_id, skill_lv), skill_id); + skill->area_temp[0] = map->foreachinrange(skill->area_sub, bl, skill->get_splash(skill_id, skill_lv), BL_CHAR, src, skill_id, skill_lv, tick, BCT_ENEMY, skill->area_sub_count); + + // recursive invocation of skill->castend_damage_id() with flag|1 + map->foreachinrange(skill->area_sub, bl, skill->get_splash(skill_id, skill_lv), skill->splash_target(src), src, skill_id, skill_lv, tick, flag | BCT_ENEMY | SD_SPLASH | 1, skill->castend_damage_id); + } + break; +#else // !RENEWAL + case KN_BOWLINGBASH: +#endif case MS_BOWLINGBASH: { int min_x,max_x,min_y,max_y,i,c,dir,tx,ty; diff --git a/src/map/status.h b/src/map/status.h index 23afdd08093..f265c0628f6 100644 --- a/src/map/status.h +++ b/src/map/status.h @@ -914,6 +914,8 @@ typedef enum sc_type { SC_FIRE_EXPANSION_TEAR_GAS_SOB, + SC_NO_SWITCH_WEAPON, + #ifndef SC_MAX SC_MAX, //Automatically updated max, used in for's to check we are within bounds. #endif