diff options
Diffstat (limited to 'src/map')
-rw-r--r-- | src/map/battle.c | 118 | ||||
-rw-r--r-- | src/map/config/const.h | 8 | ||||
-rw-r--r-- | src/map/pc.h | 2 | ||||
-rw-r--r-- | src/map/script.c | 6 | ||||
-rw-r--r-- | src/map/skill.c | 14 | ||||
-rw-r--r-- | src/map/status.c | 7 |
6 files changed, 86 insertions, 69 deletions
diff --git a/src/map/battle.c b/src/map/battle.c index 35860da0c..112e8b723 100644 --- a/src/map/battle.c +++ b/src/map/battle.c @@ -2025,15 +2025,15 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src,struct blo break; case RK_SONICWAVE: skillratio += 400 + 100 * skill_lv; - RE_LVL_DMOD(); + RE_LVL_DMOD(100); break; case RK_HUNDREDSPEAR: skillratio += 500 + 40 * skill_lv; - RE_LVL_DMOD(); + RE_LVL_DMOD(100); break; case RK_WINDCUTTER: skillratio += 50 * skill_lv; - RE_LVL_DMOD(); + RE_LVL_DMOD(100); break; case RK_IGNITIONBREAK: i = distance_bl(src,target); @@ -2043,16 +2043,17 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src,struct blo skillratio = 100 + 200 * skill_lv; else skillratio = 100 + 100 * skill_lv; - RE_LVL_DMOD(); + RE_LVL_DMOD(100); if( sstatus->rhw.ele == ELE_FIRE ) skillratio += skillratio / 2; break; case RK_CRUSHSTRIKE: if( sd ) - { + {//ATK [{Weapon Level * (Weapon Upgrade Level + 6) * 100} + (Weapon ATK) + (Weapon Weight)]% short index = sd->equip_index[EQI_HAND_R]; if( index >= 0 && sd->inventory_data[index] && sd->inventory_data[index]->type == IT_WEAPON ) - skillratio = sd->inventory_data[index]->weight + sstatus->rhw.atk + 100 * sd->inventory_data[index]->wlv * (sd->status.inventory[index].refine + 6); + skillratio = sd->inventory_data[index]->weight/10 + sstatus->rhw.atk + + 100 * sd->inventory_data[index]->wlv * (sd->status.inventory[index].refine + 6); } break; case RK_STORMBLAST: @@ -2067,21 +2068,25 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src,struct blo * GC Guilotine Cross **/ case GC_CROSSIMPACT: - skillratio += 1050 + 50 * skill_lv; + skillratio += 900 + 100 * skill_lv; + RE_LVL_DMOD(120); break; case GC_PHANTOMMENACE: skillratio += 200; break; case GC_COUNTERSLASH: - skillratio += 200 + (100 * skill_lv) + sstatus->agi; + //ATK [{(Skill Level x 100) + 300} x Caster's Base Level / 120]% + ATK [(AGI x 2) + (Caster's Job Level x 4)]% + skillratio += 200 + (100 * skill_lv); + RE_LVL_DMOD(120); + skillratio += sstatus->agi + (sd?sd->status.job_level:0) * 4; break; case GC_ROLLINGCUTTER: - skillratio += 20 * skill_lv; - RE_LVL_DMOD(); + skillratio += -50 + 50 * skill_lv; + RE_LVL_DMOD(100); break; case GC_CROSSRIPPERSLASHER: skillratio += 300 + 80 * skill_lv; - RE_LVL_DMOD(); + RE_LVL_DMOD(100); if( sc && sc->data[SC_ROLLINGCUTTER] ) skillratio += sc->data[SC_ROLLINGCUTTER]->val1 * sstatus->agi; break; @@ -2096,11 +2101,11 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src,struct blo **/ case RA_ARROWSTORM: skillratio += 900 + 80 * skill_lv; - RE_LVL_DMOD(); + RE_LVL_DMOD(100); break; case RA_AIMEDBOLT: skillratio += 400 + 50 * skill_lv; - RE_LVL_DMOD(); + RE_LVL_DMOD(100); if( tsc && (tsc->data[SC_BITE] || tsc->data[SC_ANKLE] || tsc->data[SC_ELECTRICSHOCKER]) ) wd.div_ = tstatus->size + 2 + rnd()%2; break; @@ -2125,20 +2130,20 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src,struct blo **/ case NC_BOOSTKNUCKLE: skillratio += 100 + 100 * skill_lv + sstatus->dex; - RE_LVL_DMOD(); + RE_LVL_DMOD(100); break; case NC_PILEBUNKER: skillratio += 200 + 100 * skill_lv + sstatus->str; - RE_LVL_DMOD(); + RE_LVL_DMOD(100); break; case NC_VULCANARM: skillratio = 70 * skill_lv + sstatus->dex; - RE_LVL_DMOD(); + RE_LVL_DMOD(100); break; case NC_FLAMELAUNCHER: case NC_COLDSLOWER: skillratio += 200 + 300 * skill_lv; - RE_LVL_DMOD(); + RE_LVL_DMOD(100); break; case NC_ARMSCANNON: switch( tstatus->size ) { @@ -2146,7 +2151,7 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src,struct blo case SZ_MEDIUM: skillratio += 100 + 400 * skill_lv; break;// Medium case SZ_BIG: skillratio += 100 + 300 * skill_lv; break;// Large } - RE_LVL_DMOD(); + RE_LVL_DMOD(100); //NOTE: Their's some other factors that affects damage, but not sure how exactly. Will recheck one day. [Rytech] break; case NC_AXEBOOMERANG: @@ -2156,15 +2161,15 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src,struct blo if( index >= 0 && sd->inventory_data[index] && sd->inventory_data[index]->type == IT_WEAPON ) skillratio += sd->inventory_data[index]->weight / 10;// Weight is divided by 10 since 10 weight in coding make 1 whole actural weight. [Rytech] } - RE_LVL_DMOD(); + RE_LVL_DMOD(100); break; case NC_POWERSWING: skillratio += 80 + 20 * skill_lv + sstatus->str + sstatus->dex; - RE_LVL_DMOD(); + RE_LVL_DMOD(100); break; case NC_AXETORNADO: skillratio += 100 + 100 * skill_lv + sstatus->vit; - RE_LVL_DMOD(); + RE_LVL_DMOD(100); break; case SC_FATALMENACE: skillratio += 100 * skill_lv; @@ -2177,28 +2182,28 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src,struct blo break; case LG_CANNONSPEAR:// Stimated formula. Still need confirm it. skillratio += -100 + (50 + sstatus->str) * skill_lv; - RE_LVL_DMOD(); + RE_LVL_DMOD(100); break; case LG_BANISHINGPOINT: skillratio += -100 + ((50 * skill_lv) + (30 * ((sd)?pc_checkskill(sd,SM_BASH):1))); - RE_LVL_DMOD(); + RE_LVL_DMOD(100); break; case LG_SHIELDPRESS: skillratio += 60 + 43 * skill_lv; //if( sc && sc->data[SC_GLOOMYDAY_SK] ) // skillratio += 80 + (5 * sc->data[SC_GLOOMYDAY_SK]->val1); - RE_LVL_DMOD(); + RE_LVL_DMOD(100); break; case LG_PINPOINTATTACK: skillratio = ((100 * skill_lv) + (10 * status_get_agi(src)) ); - RE_LVL_DMOD(); + RE_LVL_DMOD(100); break; case LG_RAGEBURST: if( sd && sd->spiritball_old ) skillratio += -100 + (sd->spiritball_old * 200); else skillratio += -100 + 15 * 200; - RE_LVL_DMOD(); + RE_LVL_DMOD(100); break; case LG_SHIELDSPELL:// [(Caster’s Base Level x 4) + (Shield DEF x 10) + (Caster’s VIT x 2)] % if( sd ) { @@ -2211,27 +2216,27 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src,struct blo break; case LG_MOONSLASHER: skillratio += -100 + (120 * skill_lv + ((sd) ? pc_checkskill(sd,LG_OVERBRAND) : 5) * 80); - RE_LVL_DMOD(); + RE_LVL_DMOD(100); break; case LG_OVERBRAND: skillratio = 400 * skill_lv + (pc_checkskill(sd,CR_SPEARQUICKEN) * 30); - RE_LVL_DMOD(); + RE_LVL_DMOD(100); break; case LG_OVERBRAND_BRANDISH: skillratio = 300 * skill_lv + (2 * (sstatus->str + sstatus->dex) / 3); - RE_LVL_DMOD(); + RE_LVL_DMOD(100); break; case LG_OVERBRAND_PLUSATK: skillratio = 150 * skill_lv; - RE_LVL_DMOD(); + RE_LVL_DMOD(100); break; case LG_RAYOFGENESIS: skillratio = skillratio + 200 + 300 * skill_lv; - RE_LVL_DMOD(); + RE_LVL_DMOD(100); break; case LG_EARTHDRIVE: skillratio = (skillratio + 100) * skill_lv; - RE_LVL_DMOD(); + RE_LVL_DMOD(100); break; case LG_HESPERUSLIT: skillratio += 120 * skill_lv - 100; @@ -2276,7 +2281,7 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src,struct blo skillratio += 800 * skill_lv -100; else skillratio += 500 * skill_lv -100; - RE_LVL_DMOD(); + RE_LVL_DMOD(100); break; case SR_GENTLETOUCH_QUIET: skillratio += 100 * skill_lv - 100 + sstatus->dex; @@ -2306,7 +2311,7 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src,struct blo case GN_CART_TORNADO: if( sd ) skillratio += 50 * skill_lv + pc_checkskill(sd, GN_REMODELING_CART) * 100 - 100; - RE_LVL_DMOD(); + RE_LVL_DMOD(100); if( sc && sc->data[SC_GN_CARTBOOST] ) skillratio += 10 * sc->data[SC_GN_CARTBOOST]->val1; break; @@ -3402,11 +3407,11 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list case AB_JUDEX: skillratio += 180 + 20 * skill_lv; if (skill_lv > 4) skillratio += 20; - RE_LVL_DMOD(); + RE_LVL_DMOD(100); break; case AB_ADORAMUS: skillratio += 400 + 100 * skill_lv; - RE_LVL_DMOD(); + RE_LVL_DMOD(100); break; case AB_DUPLELIGHT_MAGIC: skillratio += 100 + 20 * skill_lv; @@ -3416,36 +3421,37 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list **/ case WL_SOULEXPANSION: skillratio += 300 + 100 * skill_lv + sstatus->int_; - RE_LVL_DMOD(); + RE_LVL_DMOD(100); break; case WL_FROSTMISTY: skillratio += 100 + 100 * skill_lv; - RE_LVL_DMOD(); + RE_LVL_DMOD(100); break; case WL_JACKFROST: { struct status_change *tsc = status_get_sc(target); - if( tsc && tsc->data[SC_FREEZING] ) { + if( tsc && tsc->data[SC_FREEZING] ){ skillratio += 900 + 300 * skill_lv; - RE_LVL_DMOD(); - } else + RE_LVL_DMOD(100); + }else{ skillratio += 400 + 100 * skill_lv; - RE_LVL_DMOD(); + RE_LVL_DMOD(150); + } } break; case WL_DRAINLIFE: skillratio = 200 * skill_lv + sstatus->int_; - RE_LVL_DMOD(); + RE_LVL_DMOD(100); break; case WL_CRIMSONROCK: skillratio += 1200 + 300 * skill_lv; - RE_LVL_DMOD(); + RE_LVL_DMOD(100); break; case WL_HELLINFERNO: if( status_get_element(target) == ELE_FIRE ) skillratio = 60 * skill_lv; else skillratio = 240 * skill_lv; - RE_LVL_DMOD(); + RE_LVL_DMOD(100); break; case WL_COMET: { struct status_change * sc = status_get_sc(src); @@ -3464,11 +3470,11 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list break; case WL_CHAINLIGHTNING_ATK: skillratio += 100 + 300 * skill_lv; - RE_LVL_DMOD(); + RE_LVL_DMOD(100); break; case WL_EARTHSTRAIN: skillratio += 1900 + 100 * skill_lv; - RE_LVL_DMOD(); + RE_LVL_DMOD(100); break; case WL_TETRAVORTEX_FIRE: case WL_TETRAVORTEX_WATER: @@ -3481,11 +3487,11 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list case WL_SUMMON_ATK_WIND: case WL_SUMMON_ATK_GROUND: skillratio = skill_lv * (status_get_lv(src) + ( sd ? sd->status.job_level : 50 ));// This is close to official, but lacking a little info to finalize. [Rytech] - RE_LVL_DMOD(); + RE_LVL_DMOD(100); break; case LG_RAYOFGENESIS: skillratio = (skillratio + 200) * skill_lv; - RE_LVL_DMOD(); + RE_LVL_DMOD(100); break; case LG_SHIELDSPELL:// [(Caster’s Base Level x 4) + (Shield MDEF x 100) + (Caster’s INT x 2)] % if( sd ) { @@ -3505,7 +3511,7 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list case SO_FIREWALK: { struct status_change * sc = status_get_sc(src); skillratio = 300; - RE_LVL_DMOD(); + RE_LVL_DMOD(100); if( sc && sc->data[SC_HEATER_OPTION] ) skillratio += skillratio * sc->data[SC_HEATER_OPTION]->val3 / 100; } @@ -3513,7 +3519,7 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list case SO_ELECTRICWALK: { struct status_change * sc = status_get_sc(src); skillratio = 300; - RE_LVL_DMOD(); + RE_LVL_DMOD(100); if( sc && sc->data[SC_BLAST_OPTION] ) skillratio += skillratio * sc->data[SC_BLAST_OPTION]->val2 / 100; } @@ -3521,7 +3527,7 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list case SO_EARTHGRAVE: { struct status_change * sc = status_get_sc(src); skillratio = ( 200 * ( sd ? pc_checkskill(sd, SA_SEISMICWEAPON) : 10 ) + sstatus->int_ * skill_lv ); - RE_LVL_DMOD(); + RE_LVL_DMOD(100); if( sc && sc->data[SC_CURSED_SOIL_OPTION] ) skillratio += skillratio * sc->data[SC_CURSED_SOIL_OPTION]->val2 / 100; } @@ -3529,7 +3535,7 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list case SO_DIAMONDDUST: { struct status_change * sc = status_get_sc(src); skillratio = ( 200 * ( sd ? pc_checkskill(sd, SA_FROSTWEAPON) : 10 ) + sstatus->int_ * skill_lv ); - RE_LVL_DMOD(); + RE_LVL_DMOD(100); if( sc && sc->data[SC_COOLER_OPTION] ) skillratio += skillratio * sc->data[SC_COOLER_OPTION]->val3 / 100; } @@ -3544,7 +3550,7 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list case SO_PSYCHIC_WAVE: { struct status_change * sc = status_get_sc(src); skillratio += -100 + skill_lv * 70 + (sstatus->int_ * 3); - RE_LVL_DMOD(); + RE_LVL_DMOD(100); if( sc ){ if( sc->data[SC_HEATER_OPTION] ) skillratio += skillratio * sc->data[SC_HEATER_OPTION]->val3 / 100; @@ -3560,7 +3566,7 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list case SO_VARETYR_SPEAR: { struct status_change * sc = status_get_sc(src); skillratio += -100 + ( 100 * ( sd ? pc_checkskill(sd, SA_LIGHTNINGLOADER) : 10 ) + sstatus->int_ * skill_lv ); - RE_LVL_DMOD(); + RE_LVL_DMOD(100); if( sc && sc->data[SC_BLAST_OPTION] ) skillratio += skillratio * sc->data[SC_BLAST_OPTION]->val2 / 100; } @@ -3568,7 +3574,7 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list case SO_CLOUD_KILL: { struct status_change * sc = status_get_sc(src); skillratio += -100 + skill_lv * 40; - RE_LVL_DMOD(); + RE_LVL_DMOD(100); if( sc && sc->data[SC_CURSED_SOIL_OPTION] ) skillratio += skillratio * sc->data[SC_CURSED_SOIL_OPTION]->val2 / 100; } diff --git a/src/map/config/const.h b/src/map/config/const.h index 1287219aa..6b46a6061 100644 --- a/src/map/config/const.h +++ b/src/map/config/const.h @@ -84,9 +84,9 @@ /* Renewal's dmg level modifier, used as a macro for a easy way to turn off. */ #ifdef RENEWAL_LVDMG - #define RE_LVL_DMOD() \ - if( status_get_lv(src) > 100 ) \ - skillratio = skillratio * status_get_lv(src) / 100; + #define RE_LVL_DMOD(val) \ + if( status_get_lv(src) > 100 && val > 0 ) \ + skillratio = skillratio * status_get_lv(src) / val; #define RE_LVL_MDMOD(val) \ if( status_get_lv(src) > 100 && val > 0) \ md.damage = md.damage * status_get_lv(src) / val; @@ -95,7 +95,7 @@ if( status_get_lv(src) > 100 ) \ md.damage = md.damage * 150 / 100 + md.damage * status_get_lv(src) / 100; #else - #define RE_LVL_DMOD() + #define RE_LVL_DMOD(val) #define RE_LVL_MDMOD(val) #define RE_LVL_TMDMOD() #endif diff --git a/src/map/pc.h b/src/map/pc.h index ab2ea732c..1ee7f966e 100644 --- a/src/map/pc.h +++ b/src/map/pc.h @@ -625,6 +625,8 @@ enum e_pc_permission { #define pc_isridingwug(sd) ( (sd)->sc.option&OPTION_WUGRIDER ) // Mechanic Magic Gear #define pc_ismadogear(sd) ( (sd)->sc.option&OPTION_MADOGEAR ) +// Rune Knight Dragon +#define pc_isridingdragon(sd) ( (sd)->sc.option&OPTION_DRAGON ) #define pc_stop_walking(sd, type) unit_stop_walking(&(sd)->bl, type) #define pc_stop_attack(sd) unit_stop_attack(&(sd)->bl) diff --git a/src/map/script.c b/src/map/script.c index e7a11309c..7c7250617 100644 --- a/src/map/script.c +++ b/src/map/script.c @@ -7865,7 +7865,7 @@ BUILDIN_FUNC(checkriding) if( sd == NULL ) return 0;// no player attached, report source - if( pc_isriding(sd) || pc_isridingwug(sd) || sd->sc.option&OPTION_DRAGON ) + if( pc_isriding(sd) || pc_isridingwug(sd) || pc_isridingdragon(sd) ) script_pushint(st, 1); else script_pushint(st, 0); @@ -16132,7 +16132,7 @@ BUILDIN_FUNC(checkdragon) { TBL_PC* sd; if( (sd = script_rid2sd(st)) == NULL ) return 0; - if( sd->sc.option&OPTION_DRAGON ) + if( pc_isridingdragon(sd) ) script_pushint(st,1); else script_pushint(st,0); @@ -16156,7 +16156,7 @@ BUILDIN_FUNC(setdragon) { return 0; if( !pc_checkskill(sd,RK_DRAGONTRAINING) || (sd->class_&MAPID_THIRDMASK) != MAPID_RUNE_KNIGHT ) script_pushint(st,0);//Doesn't have the skill or it's not a Rune Knight - else if ( sd->sc.option&OPTION_DRAGON ) {//Is mounted; release + else if ( pc_isridingdragon(sd) ) {//Is mounted; release pc_setoption(sd, sd->sc.option&~OPTION_DRAGON); script_pushint(st,1); } else {//Not mounted; Mount now. diff --git a/src/map/skill.c b/src/map/skill.c index 1274feae7..fa163c222 100644 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -2642,7 +2642,7 @@ int skill_attack (int attack_type, struct block_list* src, struct block_list *ds **/ switch( skillid ) { case RK_CRUSHSTRIKE: - skill_break_equip(src,EQP_WEAPON,10000,BCT_SELF); + skill_break_equip(src,EQP_WEAPON,2000,BCT_SELF); // 20% chance to destroy the weapon. break; case GC_VENOMPRESSURE: { struct status_change *ssc = status_get_sc(src); @@ -5973,7 +5973,15 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in if (i < 5) i = 5; //Minimum rate 5% //Duration in ms - d = skill_get_time(skillid,skilllv) + (sstatus->dex - tstatus->dex)*500; + if( skillid == GC_WEAPONCRUSH){ + d = skill_get_time(skillid,skilllv); + if(bl->type == BL_PC) + d += skilllv * 15 + (sstatus->dex - tstatus->dex); + else + d += skilllv * 30 + (sstatus->dex - tstatus->dex) / 2; + }else + d = skill_get_time(skillid,skilllv) + (sstatus->dex - tstatus->dex)*500; + if (d < 0) d = 0; //Minimum duration 0ms switch (skillid) { @@ -12402,7 +12410,7 @@ int skill_check_condition_castbegin(struct map_session_data* sd, short skill, sh * Rune Knight **/ case ST_RIDINGDRAGON: - if( !(sd->sc.option&OPTION_DRAGON)) { + if( !pc_isridingdragon(sd) ) { clif_skill_fail(sd,skill,USESKILL_FAIL_LEVEL,0); return 0; } diff --git a/src/map/status.c b/src/map/status.c index 424c397ac..f1e94ca96 100644 --- a/src/map/status.c +++ b/src/map/status.c @@ -2904,7 +2904,7 @@ int status_calc_pc_(struct map_session_data* sd, bool first) status->aspd_rate -= ((skill+1)/2) * 10; if(pc_isriding(sd)) status->aspd_rate += 500-100*pc_checkskill(sd,KN_CAVALIERMASTERY); - else if( sd->sc.option&OPTION_DRAGON ) + else if(pc_isridingdragon(sd)) status->aspd_rate += 250-50*pc_checkskill(sd,RK_DRAGONTRAINING); status->adelay = 2*status->amotion; @@ -2923,7 +2923,7 @@ int status_calc_pc_(struct map_session_data* sd, bool first) sd->max_weight += 2000*skill; if(pc_isriding(sd) && pc_checkskill(sd,KN_RIDING)>0) sd->max_weight += 10000; - else if( sd->sc.option&OPTION_DRAGON ) + else if(pc_isridingdragon(sd)) sd->max_weight += 5000+2000*pc_checkskill(sd,RK_DRAGONTRAINING); if(sc->data[SC_KNOWLEDGE]) sd->max_weight += sd->max_weight*sc->data[SC_KNOWLEDGE]->val1/10; @@ -7711,7 +7711,8 @@ int status_change_start(struct block_list* bl,enum sc_type type,int rate,int val val_flag |= 1|2|4; if( sd ) { // Removes Animals - if( pc_isriding(sd) ){ pc_setriding(sd, 0); pc_setoption(sd, sd->sc.option&~OPTION_DRAGON); } + if( pc_isriding(sd) ) pc_setriding(sd, 0); + if( pc_isridingdragon(sd) ) pc_setoption(sd, sd->sc.option&~OPTION_DRAGON); if( pc_iswug(sd) ) pc_setoption(sd, sd->sc.option&~OPTION_WUG); if( pc_isridingwug(sd) ) pc_setoption(sd, sd->sc.option&~OPTION_WUGRIDER); if( pc_isfalcon(sd) ) pc_setoption(sd, sd->sc.option&~OPTION_FALCON); |