diff --git a/db/pre-re/skill_db.txt b/db/pre-re/skill_db.txt index 89b45f34ad..7cc056b1da 100644 --- a/db/pre-re/skill_db.txt +++ b/db/pre-re/skill_db.txt @@ -544,7 +544,7 @@ //**** // Sniper 380,0,6,4,0,0x1,0,10,1,no,0,0,0,weapon,0,0x0, SN_SIGHT,Falcon Eyes -381,5,8,1,0,0x40,0,5,1,yes,0,0,0,misc,0,0x80, SN_FALCONASSAULT,Falcon Assault +381,5,8,1,-3,0x40,0,5,1,yes,0,0,0,misc,0,0x80, SN_FALCONASSAULT,Falcon Assault 382,9,8,1,-1,0,2,5,1,yes,0,0,13,weapon,0,0x0, SN_SHARPSHOOTING,Focused Arrow Strike 383,0,6,4,0,0x3,-1,10,1,yes,0,0,0,weapon,0,0x0, SN_WINDWALK,Wind Walker @@ -1021,7 +1021,7 @@ 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,-1,0xCA,2:3:4,3,1,no,0,0,0,misc,5,0x0, NC_SELFDESTRUCTION,Self Destruction +2267,0,6,4,0,0xCA,2:3:4,3,1,no,0,0,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 diff --git a/db/re/skill_cast_db.txt b/db/re/skill_cast_db.txt index cb646aa10f..cb59db54c2 100644 --- a/db/re/skill_cast_db.txt +++ b/db/re/skill_cast_db.txt @@ -1091,11 +1091,11 @@ //-- RK_DRAGONHOWLING 2009,0,0,0,15000,0,10000,-1 //-- RK_MILLENNIUMSHIELD -2011,0,1000,0,180000,0,60000,-1 +2011,0,1000,0,180000,60000,60000,-1 //-- RK_CRUSHSTRIKE -2012,0,0,0,30000,0,30000,1000 +2012,0,0,0,30000,30000,30000,1000 //-- RK_REFRESH -2013,0,0,0,60000,0,120000,1000 +2013,0,0,0,60000,120000,120000,1000 //-- RK_GIANTGROWTH 2014,0,0,0,180000,0,0,1000 //-- RK_STONEHARDSKIN diff --git a/db/re/skill_db.txt b/db/re/skill_db.txt index 6c63340e4c..a7f3a81eb4 100644 --- a/db/re/skill_db.txt +++ b/db/re/skill_db.txt @@ -544,7 +544,7 @@ //**** // Sniper 380,0,6,4,0,0x1,0,10,1,no,0,0,0,weapon,0,0x0, SN_SIGHT,Falcon Eyes -381,5,8,1,0,0x40,0,5,1,yes,0,0,0,misc,0,0x80, SN_FALCONASSAULT,Falcon Assault +381,5,8,1,-3,0x40,0,5,1,yes,0,0,0,misc,0,0x80, SN_FALCONASSAULT,Falcon Assault 382,9,8,1,-1,0,2,5,1,yes,0,0,13,weapon,0,0x0, SN_SHARPSHOOTING,Focused Arrow Strike 383,0,6,4,0,0x3,-1,10,1,yes,0,0,0,weapon,0,0x0, SN_WINDWALK,Wind Walker @@ -1021,7 +1021,7 @@ 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,-1,0xCA,2:3:4,3,1,no,0,0,0,misc,5,0x0, NC_SELFDESTRUCTION,Self Destruction +2267,0,6,4,0,0xCA,2:3:4,3,1,no,0,0,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 diff --git a/src/map/battle.c b/src/map/battle.c index a61a65586e..91a2806297 100644 --- a/src/map/battle.c +++ b/src/map/battle.c @@ -2711,9 +2711,7 @@ 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) + 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); } else ATK_ADD(wd.damage, wd.damage2, sstatus->rhw.atk2); //Else use Atk2 @@ -2722,6 +2720,44 @@ struct Damage battle_calc_skill_base_damage(struct Damage wd, struct block_list wd.weaponAtk2 = (int)wd.damage2; #endif break; + case RK_DRAGONBREATH: + case RK_DRAGONBREATH_WATER: + { + int damagevalue = 0; + + wd.damage = wd.damage2 = 0; +#ifdef RENEWAL + wd.weaponAtk = wd.weaponAtk2 = 0; +#endif + damagevalue = ((sstatus->hp / 50) + (status_get_max_sp(src) / 4)) * skill_lv; + if(status_get_lv(src) > 100) + damagevalue = damagevalue * status_get_lv(src) / 150; + if(sd) + damagevalue = damagevalue * (100 + 5 * (pc_checkskill(sd,RK_DRAGONTRAINING) - 1)) / 100; + ATK_ADD(wd.damage, wd.damage2, damagevalue); +#ifdef RENEWAL + ATK_ADD(wd.weaponAtk, wd.weaponAtk2, damagevalue); +#endif + wd.flag |= BF_LONG; + } + break; + case NC_SELFDESTRUCTION: { + int damagevalue = 0; + + wd.damage = wd.damage2 = 0; +#ifdef RENEWAL + wd.weaponAtk = wd.weaponAtk2 = 0; +#endif + damagevalue = (skill_lv + 1) * ((sd ? pc_checkskill(sd,NC_MAINFRAME) : 0) + 8) * (status_get_sp(src) + sstatus->vit); + if(status_get_lv(src) > 100) + damagevalue = damagevalue * status_get_lv(src) / 100; + damagevalue = damagevalue + sstatus->hp; + ATK_ADD(wd.damage, wd.damage2, damagevalue); +#ifdef RENEWAL + ATK_ADD(wd.weaponAtk, wd.weaponAtk2, damagevalue); +#endif + } + break; case KO_HAPPOKUNAI: { int damagevalue = 0; @@ -2745,9 +2781,8 @@ struct Damage battle_calc_skill_base_damage(struct Damage wd, struct block_list } break; case HFLI_SBR44: //[orn] - if(src->type == BL_HOM) { + if(src->type == BL_HOM) wd.damage = ((TBL_HOM*)src)->homunculus.intimacy ; - } break; default: @@ -2802,6 +2837,7 @@ struct Damage battle_calc_skill_base_damage(struct Damage wd, struct block_list //Add any bonuses that modify the base atk (pre-skills) if(sd) { int skill; + if (sd->bonus.atk_rate) { ATK_ADDRATE(wd.damage, wd.damage2, sd->bonus.atk_rate); RE_ALLATK_ADDRATE(wd, sd->bonus.atk_rate); @@ -5928,8 +5964,15 @@ struct Damage battle_calc_misc_attack(struct block_list *src,struct block_list * s_ele = skill_get_ele(skill_id, skill_lv); if (s_ele < 0 && s_ele != -3) //Attack that takes weapon's element for misc attacks? Make it neutral [Skotlex] s_ele = ELE_NEUTRAL; - else if (s_ele == -3) //Use random element - s_ele = rnd()%ELE_ALL; + else if (s_ele == -3) { //Use random element + if (skill_id == SN_FALCONASSAULT) { + if (sstatus->rhw.ele && !status_get_attack_sc_element(src, status_get_sc(src))) + s_ele = sstatus->rhw.ele; + else + s_ele = status_get_attack_sc_element(src, status_get_sc(src)); + } else + s_ele = rnd()%ELE_ALL; + } //Skill Range Criteria md.flag |= battle_range_type(src, target, skill_id, skill_lv); @@ -6118,24 +6161,14 @@ struct Damage battle_calc_misc_attack(struct block_list *src,struct block_list * case RA_ICEBOUNDTRAP: md.damage = skill_lv * status_get_dex(src) + status_get_int(src) * 5 ; RE_LVL_TMDMOD(); - if(sd) - { + 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); else md.damage = 0; - }else + } else md.damage = (int64)md.damage * 200 / (skill_id == RA_CLUSTERBOMB?50:100); - - break; - case NC_SELFDESTRUCTION: - { - short totaldef = status_get_def2(target) + (short)status_get_def(target); - md.damage = ( ((sd) ? pc_checkskill(sd,NC_MAINFRAME) : skill_get_max(NC_MAINFRAME)) + 8 ) * ( skill_lv + 1 ) * ( status_get_sp(src) + status_get_vit(src) ); - RE_LVL_MDMOD(100); - md.damage += status_get_hp(src) - totaldef; - } break; case GN_THORNS_TRAP: md.damage = 100 + 200 * skill_lv + status_get_int(src); diff --git a/src/map/map.h b/src/map/map.h index 96d3a7604d..8e4125e8e9 100644 --- a/src/map/map.h +++ b/src/map/map.h @@ -54,6 +54,8 @@ void map_msg_reload(void); /** Added definitions for WoESE objects and other [L0ne_W0lf], [aleos] */ enum MOBID { MOBID_PORING = 1002, + MOBID_RED_PLANT = 1078, + MOBID_BLACK_MUSHROOM = 1084, MOBID_GOBLIN_1 = 1122, MOBID_GOBLIN_2, MOBID_GOBLIN_3, @@ -100,6 +102,7 @@ enum MOBID { MOBID_MAGICDECOY_WATER, MOBID_MAGICDECOY_EARTH, MOBID_MAGICDECOY_WIND, + MOBID_ZANZOU = 2308, MOBID_S_HORNET = 2158, MOBID_S_GIANT_HORNET, MOBID_S_LUCIOLA_VESPA, diff --git a/src/map/pc.c b/src/map/pc.c index 6076e1c0a7..c11ec81285 100755 --- a/src/map/pc.c +++ b/src/map/pc.c @@ -2197,22 +2197,22 @@ int pc_bonus(struct map_session_data *sd,int type,int val) break; case SP_BASE_ATK: if(sd->state.lr_flag != 2) { - #ifdef RENEWAL +#ifdef RENEWAL sd->bonus.eatk += val; - #else +#else bonus = status->batk + val; status->batk = cap_value(bonus, 0, USHRT_MAX); - #endif +#endif } break; case SP_DEF1: if(sd->state.lr_flag != 2) { bonus = status->def + val; - #ifdef RENEWAL +#ifdef RENEWAL status->def = cap_value(bonus, SHRT_MIN, SHRT_MAX); - #else +#else status->def = cap_value(bonus, CHAR_MIN, CHAR_MAX); - #endif +#endif } break; case SP_DEF2: @@ -2224,11 +2224,11 @@ int pc_bonus(struct map_session_data *sd,int type,int val) case SP_MDEF1: if(sd->state.lr_flag != 2) { bonus = status->mdef + val; - #ifdef RENEWAL +#ifdef RENEWAL status->mdef = cap_value(bonus, SHRT_MIN, SHRT_MAX); - #else +#else status->mdef = cap_value(bonus, CHAR_MIN, CHAR_MAX); - #endif +#endif if( sd->state.lr_flag == 3 ) {//Shield, used for royal guard sd->bonus.shieldmdef += bonus; } @@ -2315,9 +2315,9 @@ int pc_bonus(struct map_session_data *sd,int type,int val) break; sd->bonus.sp += val; break; - #ifndef RENEWAL_CAST +#ifndef RENEWAL_CAST case SP_VARCASTRATE: - #endif +#endif case SP_CASTRATE: if(sd->state.lr_flag != 2) sd->castrate+=val; @@ -2369,11 +2369,11 @@ int pc_bonus(struct map_session_data *sd,int type,int val) break; case SP_ASPD_RATE: //Stackable increase - Made it linear as per rodatazone if(sd->state.lr_flag != 2) - #ifndef RENEWAL_ASPD +#ifndef RENEWAL_ASPD status->aspd_rate -= 10*val; - #else +#else status->aspd_rate2 += val; - #endif +#endif break; case SP_HP_RECOV_RATE: if(sd->state.lr_flag != 2) @@ -2752,7 +2752,7 @@ int pc_bonus(struct map_session_data *sd,int type,int val) if(sd->state.lr_flag != 2) sd->bonus.add_fixcast += val; break; - #ifdef RENEWAL_CAST +#ifdef RENEWAL_CAST case SP_VARCASTRATE: if(sd->state.lr_flag != 2) sd->bonus.varcastrate -= val; @@ -2761,7 +2761,7 @@ int pc_bonus(struct map_session_data *sd,int type,int val) if(sd->state.lr_flag != 2) sd->bonus.add_varcast += val; break; - #endif +#endif case SP_ADDMAXWEIGHT: if (sd->state.lr_flag != 2) sd->max_weight += val; diff --git a/src/map/skill.c b/src/map/skill.c index b01f157184..a5543e292c 100755 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -997,9 +997,9 @@ int skill_additional_effect (struct block_list* src, struct block_list *bl, uint /** * Storm Gust counter was dropped in renewal **/ - #ifdef RENEWAL +#ifdef RENEWAL sc_start(src,bl,SC_FREEZE,65-(5*skill_lv),skill_lv,skill_get_time2(skill_id,skill_lv)); - #else +#else //On third hit, there is a 150% to freeze the target if(tsc->sg_counter >= 3 && sc_start(src,bl,SC_FREEZE,150,skill_lv,skill_get_time2(skill_id,skill_lv))) @@ -1009,7 +1009,7 @@ int skill_additional_effect (struct block_list* src, struct block_list *bl, uint **/ else if( tsc->sg_counter > 250 ) tsc->sg_counter = 0; - #endif +#endif break; case WZ_METEOR: @@ -8958,10 +8958,12 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case NC_SELFDESTRUCTION: if( sd ) { if( pc_ismadogear(sd) ) - pc_setmadogear(sd, 0); + pc_setmadogear(sd, 0); + skill_area_temp[1] = 0; clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); - skill_castend_damage_id(src, src, skill_id, skill_lv, tick, flag); + 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); status_set_sp(src, 0, 0); + skill_clear_unitgroup(src); } break; @@ -9587,7 +9589,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui int rate = (4 * skill_lv) + ((sd) ? pc_checkskill(sd,WM_LESSON)*2 + sd->status.job_level/5 : skill_get_max(WM_LESSON)) + status_get_lv(src) / 15; if( bl != src ) sc_start(src,bl,type,rate,skill_lv,skill_get_time(skill_id,skill_lv)); - }else { + } else { clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); map_foreachinrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), BL_CHAR, src, skill_id, skill_lv, tick, flag|BCT_ALL|1, skill_castend_nodamage_id); @@ -9846,7 +9848,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui if(sd){ struct mob_data *md; - md = mob_once_spawn_sub(src, src->m, src->x, src->y, status_get_name(src), 2308, "", SZ_SMALL, AI_NONE); + md = mob_once_spawn_sub(src, src->m, src->x, src->y, status_get_name(src), MOBID_ZANZOU, "", SZ_SMALL, AI_NONE); if( md ) { md->master_id = src->id; @@ -9880,7 +9882,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0); break; case KO_GENWAKU: - if ( !map_flag_gvg(src->m) && ( dstsd || dstmd ) && battle_check_target(src,bl,BCT_ENEMY) > 0 ) { + if ( !map_flag_gvg2(src->m) && ( dstsd || dstmd ) && !(tstatus->mode&MD_PLANT) && battle_check_target(src,bl,BCT_ENEMY) > 0 ) { int x = src->x, y = src->y; if( sd && rnd()%100 > ((45+5*skill_lv) - status_get_int(bl)/10) ){//[(Base chance of success) - (Intelligence Objectives / 10)]%. @@ -9893,8 +9895,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui clif_slide(src, bl->x, bl->y); clif_fixpos(src); sc_start(src,src,SC_CONFUSION,25,skill_lv,skill_get_time(skill_id,skill_lv)); - if (unit_movepos(bl,x,y,0,0)) - { + if (unit_movepos(bl,x,y,0,0)) { clif_skill_damage(bl,bl,tick, status_get_amotion(src), 0, -30000, 1, skill_id, -1, 6); if( bl->type == BL_PC && pc_issit((TBL_PC*)bl)) clif_sitting(bl); //Avoid sitting sync problem @@ -11077,7 +11078,7 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui if (rnd()%100 < 50) { clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0); } else { - TBL_MOB* md = mob_once_spawn_sub(src, src->m, x, y, "--ja--",(skill_lv < 2 ? 1084+rnd()%2 : 1078+rnd()%6),"", SZ_SMALL, AI_NONE); + TBL_MOB* md = mob_once_spawn_sub(src, src->m, x, y, "--ja--",(skill_lv < 2 ? MOBID_BLACK_MUSHROOM + rnd()%2 : MOBID_RED_PLANT + rnd()%6),"", SZ_SMALL, AI_NONE); int i; if (!md) break; if ((i = skill_get_time(skill_id, skill_lv)) > 0) @@ -11194,7 +11195,7 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui case 2: sx = x - i; break; case 6: sx = x + i; break; } - skill_addtimerskill(src,gettick() + (150 * i),0,sx,sy,skill_id,skill_lv,dir,flag&2); + skill_addtimerskill(src,gettick() + (140 * i),0,sx,sy,skill_id,skill_lv,dir,flag&2); } } break; @@ -11224,10 +11225,9 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui case NC_SILVERSNIPER: { - int class_ = MOBID_SILVERSNIPER; struct mob_data *md; - md = mob_once_spawn_sub(src, src->m, x, y, status_get_name(src), class_, "", SZ_SMALL, AI_NONE); + md = mob_once_spawn_sub(src, src->m, x, y, status_get_name(src), MOBID_SILVERSNIPER, "", SZ_SMALL, AI_NONE); if( md ) { md->master_id = src->id; md->special_state.ai = AI_FAW; @@ -12909,6 +12909,7 @@ int skill_unit_onplace_timer (struct skill_unit *src, struct block_list *bl, uns case UNT_ELECTRICWALK: case UNT_PSYCHIC_WAVE: case UNT_MAGMA_ERUPTION: + case UNT_MAKIBISHI: skill_attack(skill_get_type(sg->skill_id),ss,&src->bl,bl,sg->skill_id,sg->skill_lv,tick,0); break; @@ -13162,12 +13163,6 @@ int skill_unit_onplace_timer (struct skill_unit *src, struct block_list *bl, uns sc_start2(ss, bl,type,100,sg->val1,sg->val2,skill_get_time2(sg->skill_id, sg->skill_lv)); break; - case UNT_MAKIBISHI: - skill_attack(BF_MISC, ss, &src->bl, bl, sg->skill_id, sg->skill_lv, tick, 0); - sg->limit = DIFF_TICK(tick, sg->tick); - sg->unit_id = UNT_USED_TRAPS; - break; - case UNT_LAVA_SLIDE: skill_attack(BF_WEAPON, ss, &src->bl, bl, sg->skill_id, sg->skill_lv, tick, 0); if(++sg->val1 > 4) //after 5 stop hit and destroy me @@ -14655,7 +14650,7 @@ bool skill_check_condition_castend(struct map_session_data* sd, uint16 skill_id, case KO_ZANZOU: { int c = 0; - i = map_foreachinmap(skill_check_condition_mob_master_sub, sd->bl.m, BL_MOB, sd->bl.id, 2308, skill_id, &c); + i = map_foreachinmap(skill_check_condition_mob_master_sub, sd->bl.m, BL_MOB, sd->bl.id, MOBID_ZANZOU, skill_id, &c); if( c >= skill_get_maxcount(skill_id,skill_lv) || c != i) { clif_skill_fail(sd , skill_id, USESKILL_FAIL_LEVEL, 0); return false;