From c006ae4da70a3136067e6fd93b46d83fab2090e5 Mon Sep 17 00:00:00 2001 From: Atemo Date: Sat, 28 Oct 2023 16:13:49 +0200 Subject: [PATCH] Implemented SH_TEMPORARY_COMMUNION MAX Lv: 5 Skill Requirement: Mystical Creature Mastery 10 Skill Form: Active(AP) Type: Secondary Target: Instant Casting Consumes: AP 150 Description: Can only be used when the user learned at least one of either Commune with Chulho, Kisul or Hyunrok. Through the temporary communion with Chulho, Kisul and Hyunrok, the user is in the state of communion of all three mystical creatures for the certain duration. Increases P.Atk, S.Matk and H.Plus for the duration. _ [Level 1]: Duration: 30 seconds / P.Atk, S.Matk, H.Plus +3 [Level 2]: Duration: 60 seconds / P.Atk, S.Matk, H.Plus +6 [Level 3]: Duration: 90 seconds / P.Atk, S.Matk, H.Plus +9 [Level 4]: Duration: 120 seconds / P.Atk, S.Matk, H.Plus +12 [Level 5]: Duration: 150 seconds / P.Atk, S.Matk, H.Plus +15 1st rebalance : (none) 2nd rebalance : (none) --- db/re/skill_db.yml | 28 ++++++++++++++++++++++++++++ db/re/status.yml | 7 +++++++ src/map/skill.cpp | 7 +++++++ src/map/status.cpp | 10 ++++++++++ 4 files changed, 52 insertions(+) diff --git a/db/re/skill_db.yml b/db/re/skill_db.yml index f66b912072..569c0aa530 100644 --- a/db/re/skill_db.yml +++ b/db/re/skill_db.yml @@ -41533,6 +41533,34 @@ Body: Name: SH_COMMUNE_WITH_HYUN_ROK Description: Commune with Hyunrok MaxLevel: 1 + - Id: 5447 + Name: SH_TEMPORARY_COMMUNION + Description: Temporary Communion + MaxLevel: 5 + Type: Magic + TargetType: Self + DamageFlags: + NoDamage: true + CastCancel: true + CastTime: 2000 + AfterCastActDelay: 500 + Cooldown: 60000 + FixedCastTime: 1500 + Duration1: + - Level: 1 + Time: 30000 + - Level: 2 + Time: 60000 + - Level: 3 + Time: 90000 + - Level: 4 + Time: 12000 + - Level: 5 + Time: 150000 + Requires: + SpCost: 100 + ApCost: 150 + Status: Temporary_Communion - Id: 6001 Name: DK_DRAGONIC_BREATH Description: Dragonic Breath diff --git a/db/re/status.yml b/db/re/status.yml index 5b435d98e5..1389379961 100644 --- a/db/re/status.yml +++ b/db/re/status.yml @@ -8758,3 +8758,10 @@ Body: Debuff: true BlEffect: true DisplayPc: true + - Status: Temporary_Communion + Icon: EFST_TEMPORARY_COMMUNION + DurationLookup: SH_TEMPORARY_COMMUNION + CalcFlags: + Patk: true + Smatk: true + Hplus: true diff --git a/src/map/skill.cpp b/src/map/skill.cpp index e690789654..43faa49912 100755 --- a/src/map/skill.cpp +++ b/src/map/skill.cpp @@ -7920,6 +7920,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case NPC_DAMAGE_HEAL: case NPC_RELIEVE_ON: case NPC_RELIEVE_OFF: + case SH_TEMPORARY_COMMUNION: clif_skill_nodamage(src,bl,skill_id,skill_lv, sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv))); break; @@ -17839,6 +17840,12 @@ bool skill_check_condition_castbegin(map_session_data* sd, uint16 skill_id, uint if (!(sc && sc->getSCE(SC_THIRD_EXOR_FLAME))) return false; break; + case SH_TEMPORARY_COMMUNION: + if (sd && !pc_checkskill(sd, SH_COMMUNE_WITH_CHUL_HO) && !pc_checkskill(sd, SH_COMMUNE_WITH_HYUN_ROK) && !pc_checkskill(sd, SH_COMMUNE_WITH_KI_SUL)) { + clif_skill_fail(sd,skill_id,USESKILL_FAIL_CONDITION,0); + return false; + } + break; } /* check state required */ diff --git a/src/map/status.cpp b/src/map/status.cpp index 7b12bd1b3b..d4f1b9a410 100644 --- a/src/map/status.cpp +++ b/src/map/status.cpp @@ -8487,6 +8487,8 @@ static signed short status_calc_patk(struct block_list *bl, status_change *sc, i if( sc->getSCE( SC_ATTACK_STANCE ) ){ patk += sc->getSCE( SC_ATTACK_STANCE )->val3; } + if (sc->getSCE(SC_TEMPORARY_COMMUNION)) + patk += sc->getSCE(SC_TEMPORARY_COMMUNION)->val2; return (short)cap_value(patk, 0, SHRT_MAX); } @@ -8514,6 +8516,8 @@ static signed short status_calc_smatk(struct block_list *bl, status_change *sc, if( sc->getSCE( SC_ATTACK_STANCE ) ){ smatk += sc->getSCE( SC_ATTACK_STANCE )->val3; } + if (sc->getSCE(SC_TEMPORARY_COMMUNION)) + smatk += sc->getSCE(SC_TEMPORARY_COMMUNION)->val2; return (short)cap_value(smatk, 0, SHRT_MAX); } @@ -8582,6 +8586,9 @@ static signed short status_calc_hplus(struct block_list *bl, status_change *sc, if (!sc || !sc->count) return cap_value(hplus, 0, SHRT_MAX); + if (sc->getSCE(SC_TEMPORARY_COMMUNION)) + hplus += sc->getSCE(SC_TEMPORARY_COMMUNION)->val2; + return (short)cap_value(hplus, 0, SHRT_MAX); } @@ -12693,6 +12700,9 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty case SC_WEAPONBREAKER: val2 = val1 * 2 * 100; // Chance to break weapon break; + case SC_TEMPORARY_COMMUNION: + val2 = val1 * 3; + break; default: if (calc_flag.none() && scdb->skill_id == 0 && scdb->icon == EFST_BLANK && scdb->opt1 == OPT1_NONE && scdb->opt2 == OPT2_NONE && scdb->state.none() && scdb->flag.none() && scdb->endonstart.empty() && scdb->endreturn.empty() && scdb->fail.empty() && scdb->endonend.empty()) {