From 5954bf53cac41cac2fd1eb3bb3d91783f0f9644e Mon Sep 17 00:00:00 2001 From: Jedzkie Date: Wed, 23 Dec 2015 14:10:12 +0800 Subject: Item Update: - Remove the hard coded entry of Monster Transform Scrolls - Change mob names into mob constants. --- src/map/battle.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/map/battle.c') diff --git a/src/map/battle.c b/src/map/battle.c index b19e13438..88037b042 100644 --- a/src/map/battle.c +++ b/src/map/battle.c @@ -4905,7 +4905,7 @@ struct Damage battle_calc_weapon_attack(struct block_list *src,struct block_list if(flag.cri && sd->bonus.crit_atk_rate) ATK_ADDRATE(sd->bonus.crit_atk_rate); if(flag.cri && sc && sc->data[SC_MTF_CRIDAMAGE]) - ATK_ADDRATE(25);// temporary it should be 'bonus.crit_atk_rate' + ATK_ADDRATE(sc->data[SC_MTF_CRIDAMAGE]->val1);// temporary it should be 'bonus.crit_atk_rate' #ifndef RENEWAL if(sd->status.party_id && (temp=pc->checkskill(sd,TK_POWER)) > 0){ @@ -5218,7 +5218,7 @@ struct Damage battle_calc_weapon_attack(struct block_list *src,struct block_list if( wd.flag&BF_LONG ) ATK_ADDRATE(sd->bonus.long_attack_atk_rate); if( sc && sc->data[SC_MTF_RANGEATK] ) - ATK_ADDRATE(25);// temporary it should be 'bonus.long_attack_atk_rate' + ATK_ADDRATE(sc->data[SC_MTF_RANGEATK]->val1);// temporary it should be 'bonus.long_attack_atk_rate' #endif if( (i=pc->checkskill(sd,AB_EUCHARISTICA)) > 0 && (tstatus->race == RC_DEMON || tstatus->def_ele == ELE_DARK) ) -- cgit v1.2.3-60-g2f50 From e9129d00278edc75a45a1d5d47345c9d9f2460c3 Mon Sep 17 00:00:00 2001 From: Jedzkie Date: Wed, 23 Dec 2015 16:02:13 +0800 Subject: Update: - Rename BLUE_CRYST and PINK_CRYST to BLUE_CRYSTAL and PINK_CRYSTAL - Rename FOOD_STOR to FOOD_STORAGE - Rename TREAS01, TREAS40, TREAS41, TREAS49 to TREASURE_01, TREASURE_40, TREASURE_41, TREASURE_49 --- src/map/battle.c | 10 +++++----- src/map/map.h | 14 +++++++------- src/map/mob.c | 32 ++++++++++++++++---------------- src/map/mob.h | 6 +++--- src/map/pc.c | 13 +++++++------ src/map/skill.c | 39 +++++++++++++++++++-------------------- src/map/status.c | 14 +++++++------- 7 files changed, 64 insertions(+), 64 deletions(-) (limited to 'src/map/battle.c') diff --git a/src/map/battle.c b/src/map/battle.c index 88037b042..96289fcc8 100644 --- a/src/map/battle.c +++ b/src/map/battle.c @@ -3327,16 +3327,16 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam * Calculates BG related damage adjustments. *------------------------------------------*/ // FIXME: flag is undocumented -int64 battle_calc_bg_damage(struct block_list *src, struct block_list *bl, int64 damage, int div_, uint16 skill_id, uint16 skill_lv, int flag) -{ - if( !damage ) +int64 battle_calc_bg_damage(struct block_list *src, struct block_list *bl, int64 damage, int div_, uint16 skill_id, uint16 skill_lv, int flag) { + + if (!damage) return 0; nullpo_retr(damage, bl); - if( bl->type == BL_MOB ) { + if (bl->type == BL_MOB) { struct mob_data* md = BL_CAST(BL_MOB, bl); - if( flag&BF_SKILL && (md->class_ == MOBID_BLUE_CRYST || md->class_ == MOBID_PINK_CRYST) ) + if (flag&BF_SKILL && (md->class_ == MOBID_BLUE_CRYSTAL || md->class_ == MOBID_PINK_CRYSTAL)) return 0; // Crystal cannot receive skill damage on battlegrounds } diff --git a/src/map/map.h b/src/map/map.h index db03727f5..dacd81f71 100644 --- a/src/map/map.h +++ b/src/map/map.h @@ -66,17 +66,17 @@ enum E_MAPSERVER_ST { // Added definitions for WoESE objects. [L0ne_W0lf] enum MOBID { MOBID_EMPERIUM = 1288, - MOBID_TREAS01 = 1324, - MOBID_TREAS40 = 1363, + MOBID_TREASURE_01 = 1324, + MOBID_TREASURE_40 = 1363, MOBID_BARRICADE1 = 1905, MOBID_BARRICADE2, MOBID_GUARDIAN_STONE1, MOBID_GUARDIAN_STONE2, - MOBID_FOOD_STOR, - MOBID_BLUE_CRYST = 1914, - MOBID_PINK_CRYST, - MOBID_TREAS41 = 1938, - MOBID_TREAS49 = 1946, + MOBID_FOOD_STORAGE, + MOBID_BLUE_CRYSTAL = 1914, + MOBID_PINK_CRYSTAL, + MOBID_TREASURE_41 = 1938, + MOBID_TREASURE_49 = 1946, MOBID_SILVERSNIPER = 2042, MOBID_MAGICDECOY_WIND = 2046, }; diff --git a/src/map/mob.c b/src/map/mob.c index 0d6055b13..d0073d01b 100644 --- a/src/map/mob.c +++ b/src/map/mob.c @@ -2741,39 +2741,39 @@ int mob_random_class (int *value, size_t count) /*========================================== * Change mob base class *------------------------------------------*/ -int mob_class_change (struct mob_data *md, int class_) -{ +int mob_class_change (struct mob_data *md, int class_) { + int64 tick = timer->gettick(), c = 0; int i, hp_rate; nullpo_ret(md); - if( md->bl.prev == NULL ) + if (md->bl.prev == NULL) return 0; - //Disable class changing for some targets... + // Disable class changing for some targets... if (md->guardian_data) - return 0; //Guardians/Emperium + return 0; // Guardians/Emperium - if( mob_is_treasure(md) ) - return 0; //Treasure Boxes + if (mob_is_treasure(md)) + return 0; // Treasure Boxes - if( md->special_state.ai > AI_ATTACK ) - return 0; //Marine Spheres and Floras. + if (md->special_state.ai > AI_ATTACK) + return 0; // Marine Spheres and Floras. - if( mob->is_clone(md->class_) ) - return 0; //Clones + if (mob->is_clone(md->class_)) + return 0; // Clones - if( md->class_ == class_ ) - return 0; //Nothing to change. + if (md->class_ == class_) + return 0; // Nothing to change. hp_rate = get_percentage(md->status.hp, md->status.max_hp); md->class_ = class_; md->db = mob->db(class_); - if (battle_config.override_mob_names==1) - memcpy(md->name,md->db->name,NAME_LENGTH); + if (battle_config.override_mob_names == 1) + memcpy(md->name, md->db->name, NAME_LENGTH); else - memcpy(md->name,md->db->jname,NAME_LENGTH); + memcpy(md->name, md->db->jname, NAME_LENGTH); mob_stop_attack(md); mob_stop_walking(md, STOPWALKING_FLAG_NONE); diff --git a/src/map/mob.h b/src/map/mob.h index 6267c0e8c..48b44aab3 100644 --- a/src/map/mob.h +++ b/src/map/mob.h @@ -283,9 +283,9 @@ struct item_drop_list { #define mob_stop_walking(md, type) (unit->stop_walking(&(md)->bl, (type))) #define mob_stop_attack(md) (unit->stop_attack(&(md)->bl)) -#define mob_is_battleground(md) (map->list[(md)->bl.m].flag.battleground && ((md)->class_ == MOBID_BARRICADE2 || ((md)->class_ >= MOBID_FOOD_STOR && (md)->class_ <= MOBID_PINK_CRYST))) -#define mob_is_gvg(md) (map->list[(md)->bl.m].flag.gvg_castle && ( (md)->class_ == MOBID_EMPERIUM || (md)->class_ == MOBID_BARRICADE1 || (md)->class_ == MOBID_GUARIDAN_STONE1 || (md)->class_ == MOBID_GUARIDAN_STONE2)) -#define mob_is_treasure(md) (((md)->class_ >= MOBID_TREAS01 && (md)->class_ <= MOBID_TREAS40) || ((md)->class_ >= MOBID_TREAS41 && (md)->class_ <= MOBID_TREAS49)) +#define mob_is_battleground(md) (map->list[(md)->bl.m].flag.battleground && ((md)->class_ == MOBID_BARRICADE2 || ((md)->class_ >= MOBID_FOOD_STORAGE && (md)->class_ <= MOBID_PINK_CRYSTAL))) +#define mob_is_gvg(md) (map->list[(md)->bl.m].flag.gvg_castle && ( (md)->class_ == MOBID_EMPERIUM || (md)->class_ == MOBID_BARRICADE1 || (md)->class_ == MOBID_GUARDIAN_STONE1 || (md)->class_ == MOBID_GUARDIAN_STONE2)) +#define mob_is_treasure(md) (((md)->class_ >= MOBID_TREASURE_01 && (md)->class_ <= MOBID_TREASURE_40) || ((md)->class_ >= MOBID_TREASURE_41 && (md)->class_ <= MOBID_TREASURE_49)) struct mob_interface { // Dynamic mob database, allows saving of memory when there's big gaps in the mob_db [Skotlex] diff --git a/src/map/pc.c b/src/map/pc.c index 43d320a80..157f7faab 100644 --- a/src/map/pc.c +++ b/src/map/pc.c @@ -5246,7 +5246,7 @@ int pc_steal_item(struct map_session_data *sd,struct block_list *bl, uint16 skil sd_status= status->get_status_data(&sd->bl); md_status= status->get_status_data(bl); - if( md->master_id || md_status->mode&MD_BOSS || mob_is_treasure(md) || + if (md->master_id || md_status->mode&MD_BOSS || mob_is_treasure(md) || map->list[bl->m].flag.nomobloot || // check noloot map flag [Lorky] (battle_config.skill_steal_max_tries && //Reached limit of steal attempts. [Lupus] md->state.steal_flag++ >= battle_config.skill_steal_max_tries) @@ -5312,20 +5312,21 @@ int pc_steal_item(struct map_session_data *sd,struct block_list *bl, uint16 skil int pc_steal_coin(struct map_session_data *sd, struct block_list *target) { int rate, skill_lv; struct mob_data *md; - if(!sd || !target || target->type != BL_MOB) + + if (!sd || !target || target->type != BL_MOB) return 0; md = (TBL_MOB*)target; - if( md->state.steal_coin_flag || md->sc.data[SC_STONE] || md->sc.data[SC_FREEZE] || md->status.mode&MD_BOSS ) + if (md->state.steal_coin_flag || md->sc.data[SC_STONE] || md->sc.data[SC_FREEZE] || md->status.mode&MD_BOSS) return 0; - if( mob_is_treasure(md) ) + if (mob_is_treasure(md)) return 0; skill_lv = pc->checkskill(sd, RG_STEALCOIN); - rate = skill_lv*10 + (sd->status.base_level - md->level)*2 + sd->battle_status.dex/2 + sd->battle_status.luk/2; + rate = skill_lv * 10 + (sd->status.base_level - md->level) * 2 + sd->battle_status.dex / 2 + sd->battle_status.luk / 2; if(rnd()%1000 < rate) { - int amount = md->level * skill_lv / 10 + md->level*8 + rnd()%(md->level*2 + 1); // mob_lv * skill_lv / 10 + random [mob_lv*8; mob_lv*10] + int amount = md->level * skill_lv / 10 + md->level * 8 + rnd()%(md->level * 2 + 1); // mob_lv * skill_lv / 10 + random [mob_lv*8; mob_lv*10] pc->getzeny(sd, amount, LOG_TYPE_STEAL, NULL); md->state.steal_coin_flag = 1; diff --git a/src/map/skill.c b/src/map/skill.c index f870524fa..72363b9e3 100644 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -5401,19 +5401,18 @@ int skill_castend_nodamage_id(struct block_list *src, struct block_list *bl, uin int heal = skill->calc_heal(src, bl, (skill_id == AB_HIGHNESSHEAL)?AL_HEAL:skill_id, (skill_id == AB_HIGHNESSHEAL)?10:skill_lv, true); int heal_get_jobexp; //Highness Heal: starts at 1.7 boost + 0.3 for each level - if( skill_id == AB_HIGHNESSHEAL ) { - heal = heal * ( 17 + 3 * skill_lv ) / 10; + if (skill_id == AB_HIGHNESSHEAL) { + heal = heal * (17 + 3 * skill_lv) / 10; } - if( status->isimmune(bl) || - (dstmd && (dstmd->class_ == MOBID_EMPERIUM || mob_is_battleground(dstmd))) ) - heal=0; + if (status->isimmune(bl) || (dstmd && (dstmd->class_ == MOBID_EMPERIUM || mob_is_battleground(dstmd)))) + heal = 0; - if( sd && dstsd && sd->status.partner_id == dstsd->status.char_id && (sd->class_&MAPID_UPPERMASK) == MAPID_SUPER_NOVICE && sd->status.sex == 0 ) - heal = heal*2; + if (sd && dstsd && sd->status.partner_id == dstsd->status.char_id && (sd->class_&MAPID_UPPERMASK) == MAPID_SUPER_NOVICE && sd->status.sex == 0) + heal = heal * 2; - if( tsc && tsc->count ) + if (tsc && tsc->count) { - if( tsc->data[SC_KAITE] && !(sstatus->mode&MD_BOSS) ) + if (tsc->data[SC_KAITE] && !(sstatus->mode&MD_BOSS)) { //Bounce back heal if (--tsc->data[SC_KAITE]->val2 <= 0) status_change_end(bl, SC_KAITE, INVALID_TIMER); @@ -7703,9 +7702,9 @@ int skill_castend_nodamage_id(struct block_list *src, struct block_list *bl, uin map->freeblock_unlock(); return 0; } - if( rnd() % 100 > skill_lv * 8 || (dstmd && ((dstmd->guardian_data && dstmd->class_ == MOBID_EMPERIUM) || mob_is_battleground(dstmd))) ) { - if( sd ) - clif->skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0); + if (rnd() % 100 > skill_lv * 8 || (dstmd && ((dstmd->guardian_data && dstmd->class_ == MOBID_EMPERIUM) || mob_is_battleground(dstmd)))) { + if (sd) + clif->skill_fail(sd, skill_id, USESKILL_FAIL_LEVEL, 0); map->freeblock_unlock(); return 0; @@ -11911,24 +11910,24 @@ int skill_unit_onplace_timer(struct skill_unit *src, struct block_list *bl, int6 int heal = skill->calc_heal(ss,bl,sg->skill_id,sg->skill_lv,true); struct mob_data *md = BL_CAST(BL_MOB, bl); #ifdef RENEWAL - if( md && md->class_ == MOBID_EMPERIUM ) + if (md && md->class_ == MOBID_EMPERIUM) break; #endif - if( md && mob_is_battleground(md) ) + if (md && mob_is_battleground(md)) break; - if( tstatus->hp >= tstatus->max_hp ) + if (tstatus->hp >= tstatus->max_hp) break; - if( status->isimmune(bl) ) + if (status->isimmune(bl)) heal = 0; clif->skill_nodamage(&src->bl, bl, AL_HEAL, heal, 1); - if( tsc && tsc->data[SC_AKAITSUKI] && heal ) + if (tsc && tsc->data[SC_AKAITSUKI] && heal) heal = ~heal + 1; status->heal(bl, heal, 0, 0); - if( diff >= 500 ) + if (diff >= 500) sg->val1--; } - if( sg->val1 <= 0 ) - skill->del_unitgroup(sg,ALC_MARK); + if (sg->val1 <= 0) + skill->del_unitgroup(sg, ALC_MARK); break; case UNT_EVILLAND: diff --git a/src/map/status.c b/src/map/status.c index 5c2d1d2f5..b154c0283 100644 --- a/src/map/status.c +++ b/src/map/status.c @@ -7064,23 +7064,23 @@ int status_change_start(struct block_list *src, struct block_list *bl, enum sc_t sc = status->get_sc(bl); st = status->get_status_data(bl); - if( type <= SC_NONE || type >= SC_MAX ) { + if (type <= SC_NONE || type >= SC_MAX) { ShowError("status_change_start: invalid status change (%d)!\n", type); return 0; } - if( !sc ) + if (!sc) return 0; //Unable to receive status changes - if( status->isdead(bl) && type != SC_NOCHAT ) // SC_NOCHAT should work even on dead characters + if (status->isdead(bl) && type != SC_NOCHAT) // SC_NOCHAT should work even on dead characters return 0; - if( bl->type == BL_MOB) { - struct mob_data *md = BL_CAST(BL_MOB,bl); - if(md && (md->class_ == MOBID_EMPERIUM || mob_is_battleground(md)) && type != SC_SAFETYWALL && type != SC_PNEUMA) + if (bl->type == BL_MOB) { + struct mob_data *md = BL_CAST(BL_MOB, bl); + if (md && (md->class_ == MOBID_EMPERIUM || mob_is_battleground(md)) && type != SC_SAFETYWALL && type != SC_PNEUMA) return 0; //Emperium/BG Monsters can't be afflicted by status changes #if 0 - if(md && mob_is_gvg(md) && status->sc2scb_flag(type)&SCB_MAXHP) + if (md && mob_is_gvg(md) && status->sc2scb_flag(type)&SCB_MAXHP) return 0; //prevent status addinh hp to gvg mob (like bloodylust=hp*3 etc... #endif // 0 } -- cgit v1.2.3-60-g2f50 From 3f13598714f2d6cecb1c1e5c382592a904798624 Mon Sep 17 00:00:00 2001 From: Jedzkie Date: Thu, 24 Dec 2015 10:43:11 +0800 Subject: Item Update: - Fix items that uses SPVanishRate bonus are not working properly. - Fix Velum Katzbalger item effect. - Added HPVanishRate bonus. --- db/const.txt | 1 + db/pre-re/item_db.conf | 20 ++++++++++---------- db/re/item_db.conf | 50 +++++++++++++++++++++++++------------------------- doc/item_bonus.txt | 3 +++ src/map/battle.c | 38 ++++++++++++++++++++++++++------------ src/map/map.h | 2 +- src/map/pc.c | 26 ++++++++++++++++++++------ src/map/pc.h | 2 ++ 8 files changed, 88 insertions(+), 54 deletions(-) (limited to 'src/map/battle.c') diff --git a/db/const.txt b/db/const.txt index cca14517f..efdad29bc 100644 --- a/db/const.txt +++ b/db/const.txt @@ -529,6 +529,7 @@ bSkillHeal2 1088 bAddEffOnSkill 1089 bHealPower 1090 bHealPower2 1091 +bHPVanishRate 1092 bRestartFullRecover 2000 bNoCastCancel 2001 diff --git a/db/pre-re/item_db.conf b/db/pre-re/item_db.conf index 1185bc70a..27a80f4ee 100644 --- a/db/pre-re/item_db.conf +++ b/db/pre-re/item_db.conf @@ -5108,10 +5108,10 @@ item_db: ( EquipLv: 40 View: 2 Script: <" - bonus bAtkEle,Ele_Ghost; - bonus2 bSPVanishRate,30,30; - bonus bSPDrainValue,-1; - bonus bUnbreakableWeapon,0; + bonus bAtkEle, Ele_Ghost; + bonus2 bSPVanishRate, 30, 30; + bonus bSPDrainValue, -1; + bonus bUnbreakableWeapon, 1; "> }, { @@ -27330,8 +27330,8 @@ item_db: ( Weight: 10 Loc: 2 Script: <" - bonus2 bSPVanishRate,50,10; - if(BaseJob==Job_Sage) bonus bSPDrainValue,1; + bonus2 bSPVanishRate, 50, 10; + if (BaseJob == Job_Sage) bonus bSPDrainValue, 1; "> }, { @@ -74660,10 +74660,10 @@ item_db: ( Refine: false View: 2 Script: <" - bonus bAtkEle,Ele_Ghost; - bonus2 bSPVanishRate,45,30; - bonus bSPDrainValue,-1; - bonus bUnbreakableWeapon,0; + bonus bAtkEle, Ele_Ghost; + bonus2 bSPVanishRate, 45, 30; + bonus bSPDrainValue, -1; + bonus bUnbreakableWeapon, 1; "> }, { diff --git a/db/re/item_db.conf b/db/re/item_db.conf index 6c1b4c481..adf25baa8 100644 --- a/db/re/item_db.conf +++ b/db/re/item_db.conf @@ -4882,10 +4882,10 @@ item_db: ( EquipLv: 40 View: 2 Script: <" - bonus bAtkEle,Ele_Ghost; - bonus2 bSPVanishRate,30,30; - bonus bSPDrainValue,-1; - bonus bUnbreakableWeapon,0; + bonus bAtkEle, Ele_Ghost; + bonus2 bSPVanishRate, 30, 30; + bonus bSPDrainValue, -1; + bonus bUnbreakableWeapon, 1; "> }, { @@ -7874,7 +7874,7 @@ item_db: ( WeaponLv: 4 EquipLv: 95 View: 16 - Script: <" bonus3 bSPVanishRate,10000,10,BF_NORMAL; "> + Script: <" bonus3 bSPVanishRate, 1000, 10, BF_NORMAL; "> }, { Id: 1295 @@ -9370,8 +9370,8 @@ item_db: ( EquipLv: 95 View: 7 Script: <" - bonus bUnbreakableWeapon,0; - bonus3 bSPVanishRate,10000,10,BF_NORMAL; + bonus bUnbreakableWeapon, 1; + bonus3 bSPVanishRate, 1000, 10, BF_NORMAL; "> }, { @@ -14771,13 +14771,13 @@ item_db: ( EquipLv: 95 View: 10 Script: <" - bonus bInt,10; - bonus bUnbreakableWeapon,0; - bonus bUseSPrate,100; - bonus bMdef,20; - bonus3 bSPVanishRate,10000,5,BF_NORMAL|BF_SKILL; - if(getrefine()>5) { - bonus3 bSPVanishRate,10000,10,BF_NORMAL|BF_SKILL; + bonus bInt, 10; + bonus bUnbreakableWeapon, 0; + bonus bUseSPrate, 100; + bonus bMdef, 20; + bonus3 bSPVanishRate, 1000, 5, BF_NORMAL | BF_SKILL; + if (getrefine() >= 6) { + bonus3 bSPVanishRate, 1000, 10, BF_NORMAL | BF_SKILL; } "> }, @@ -35916,8 +35916,8 @@ item_db: ( Weight: 10 Loc: 2 Script: <" - bonus2 bSPVanishRate,50,10; - if(BaseJob==Job_Sage) bonus bSPDrainValue,1; + bonus2 bSPVanishRate, 50, 10; + if (BaseJob == Job_Sage) bonus bSPDrainValue, 1; "> }, { @@ -94221,18 +94221,18 @@ item_db: ( Trade: { nodrop: true notrade: true + nostorage: true noselltonpc: true nocart: true - nostorage: true - nogstorage: true nomail: true noauction: true + nogstorage: true } Script: <" - bonus bAtkEle,Ele_Ghost; - bonus2 bSPVanishRate,45,30; - bonus bSPDrainValue,-1; - bonus bUnbreakableWeapon,0; + bonus bAtkEle, Ele_Ghost; + bonus2 bSPVanishRate, 45, 30; + bonus bSPDrainValue, -1; + bonus bUnbreakableWeapon, 1; "> }, { @@ -119609,8 +119609,8 @@ item_db: ( EquipLv: 95 View: 11 Script: <" - bonus3 bSPVanishRate,10000,4,BF_NORMAL; - bonus bAspd,-5; + bonus3 bSPVanishRate, 1000, 4, BF_NORMAL; + bonus bAspd, -5; "> }, { @@ -134357,7 +134357,7 @@ item_db: ( WeaponLv: 4 EquipLv: 95 View: 3 - Script: <" bonus3 bSPVanishRate,10000,8,BF_NORMAL; "> + Script: <" bonus3 bHPVanishRate, 1000, 8, BF_NORMAL; "> }, { Id: 21003 diff --git a/doc/item_bonus.txt b/doc/item_bonus.txt index 6aeca16ea..f588921cd 100644 --- a/doc/item_bonus.txt +++ b/doc/item_bonus.txt @@ -353,7 +353,10 @@ bonus3 bSPDrainRateRace,r,n,x; Adds a n/10% chance to receive x% of damage deal HP/SP Vanish ------------ +bonus2 bHPVanishRate,n,x; Add the (n/10)% chance of decreasing enemy HP amount by x% when attacking bonus2 bSPVanishRate,n,x; Add the (n/10)% chance of decreasing enemy SP amount by x% when attacking + +bonus3 bHPVanishRate,n,x,bf; Add the (n/10)% chance of decreasing enemy HP amount by x% when attacking for criteria bf bonus3 bSPVanishRate,n,x,bf; Add the (n/10)% chance of decreasing enemy SP amount by x% when attacking for criteria bf HP/SP Gain diff --git a/src/map/battle.c b/src/map/battle.c index 96289fcc8..6c0e57863 100644 --- a/src/map/battle.c +++ b/src/map/battle.c @@ -5668,11 +5668,20 @@ struct Damage battle_calc_attack(int attack_type,struct block_list *bl,struct bl } else // Some skills like Weaponry Research will cause damage even if attack is dodged d.dmg_lv = ATK_DEF; - if(sd && d.damage+d.damage2>1) { - if(sd->bonus.sp_vanish_rate && sd->bonus.sp_vanish_trigger && rnd()%10000bonus.sp_vanish_rate && - ( (d.flag&sd->bonus.sp_vanish_trigger&BF_WEAPONMASK) || (d.flag&sd->bonus.sp_vanish_trigger&BF_RANGEMASK) - || (d.flag&sd->bonus.sp_vanish_trigger&BF_SKILLMASK) )) - status_percent_damage(&sd->bl,target,0,-sd->bonus.sp_vanish_per,false); + // HPVanishRate + if (sd && d.damage + d.damage2 > 1) { + if (sd->bonus.hp_vanish_rate && sd->bonus.hp_vanish_trigger && rnd() % 1000 < sd->bonus.hp_vanish_rate && + ((d.flag&sd->bonus.hp_vanish_trigger&BF_WEAPONMASK) || (d.flag&sd->bonus.hp_vanish_trigger&BF_RANGEMASK) + || (d.flag&sd->bonus.hp_vanish_trigger&BF_SKILLMASK))) + status_percent_damage(&sd->bl, target, -sd->bonus.hp_vanish_per, 0, false); + } + + // SPVanishRate + if (sd && d.damage + d.damage2 > 1) { + if (sd->bonus.sp_vanish_rate && sd->bonus.sp_vanish_trigger && rnd() % 1000 < sd->bonus.sp_vanish_rate && + ((d.flag&sd->bonus.sp_vanish_trigger&BF_WEAPONMASK) || (d.flag&sd->bonus.sp_vanish_trigger&BF_RANGEMASK) + || (d.flag&sd->bonus.sp_vanish_trigger&BF_SKILLMASK))) + status_percent_damage(&sd->bl, target, 0, -sd->bonus.sp_vanish_per, false); } return d; } @@ -5902,7 +5911,7 @@ void battle_drain(TBL_PC *sd, struct block_list *tbl, int64 rdamage, int64 ldama if (i == 0 || i == 2) type = race; else - type = boss?RC_BOSS:RC_NONBOSS; + type = boss ? RC_BOSS : RC_NONBOSS; hp = wd->hp_drain[type].value; if (wd->hp_drain[type].rate) @@ -5912,6 +5921,14 @@ void battle_drain(TBL_PC *sd, struct block_list *tbl, int64 rdamage, int64 ldama if (wd->sp_drain[type].rate) sp += battle->calc_drain(*damage, wd->sp_drain[type].rate, wd->sp_drain[type].per); + // HPVanishRate + if (sd->bonus.hp_vanish_rate && rnd() % 1000 < sd->bonus.hp_vanish_rate && !sd->bonus.hp_vanish_trigger) + status_percent_damage(&sd->bl, tbl, (unsigned char)sd->bonus.hp_vanish_per, 0, false); + + // SPVanishRate + if (sd->bonus.sp_vanish_rate && rnd() % 1000 < sd->bonus.sp_vanish_rate && !sd->bonus.sp_vanish_trigger) + status_percent_damage(&sd->bl, tbl, 0, (unsigned char)sd->bonus.sp_vanish_per, false); + if (hp) { if (wd->hp_drain[type].type) rhp += hp; @@ -5924,17 +5941,14 @@ void battle_drain(TBL_PC *sd, struct block_list *tbl, int64 rdamage, int64 ldama } } - if (sd->bonus.sp_vanish_rate && rnd()%1000 < sd->bonus.sp_vanish_rate && !sd->bonus.sp_vanish_trigger) - status_percent_damage(&sd->bl, tbl, 0, (unsigned char)sd->bonus.sp_vanish_per, false); - - if( sd->sp_gain_race_attack[race] ) + if (sd->sp_gain_race_attack[race]) tsp += sd->sp_gain_race_attack[race]; - if( sd->hp_gain_race_attack[race] ) + if (sd->hp_gain_race_attack[race]) thp += sd->hp_gain_race_attack[race]; if (!thp && !tsp) return; - status->heal(&sd->bl, thp, tsp, battle_config.show_hp_sp_drain?3:1); + status->heal(&sd->bl, thp, tsp, battle_config.show_hp_sp_drain ? 3 : 1); if (rhp || rsp) status_zap(tbl, rhp, rsp); diff --git a/src/map/map.h b/src/map/map.h index dacd81f71..bc479cdcf 100644 --- a/src/map/map.h +++ b/src/map/map.h @@ -465,7 +465,7 @@ enum status_point_types { SP_WEAPON_ATK,SP_WEAPON_ATK_RATE, // 1081-1082 SP_DELAYRATE,SP_HP_DRAIN_RATE_RACE,SP_SP_DRAIN_RATE_RACE, // 1083-1085 SP_IGNORE_MDEF_RATE,SP_IGNORE_DEF_RATE,SP_SKILL_HEAL2,SP_ADDEFF_ONSKILL, //1086-1089 - SP_ADD_HEAL_RATE,SP_ADD_HEAL2_RATE, //1090-1091 + SP_ADD_HEAL_RATE, SP_ADD_HEAL2_RATE, SP_HP_VANISH_RATE, //1090-1092 SP_RESTART_FULL_RECOVER=2000,SP_NO_CASTCANCEL,SP_NO_SIZEFIX,SP_NO_MAGIC_DAMAGE,SP_NO_WEAPON_DAMAGE,SP_NO_GEMSTONE, // 2000-2005 SP_NO_CASTCANCEL2,SP_NO_MISC_DAMAGE,SP_UNBREAKABLE_WEAPON,SP_UNBREAKABLE_ARMOR, SP_UNBREAKABLE_HELM, // 2006-2010 diff --git a/src/map/pc.c b/src/map/pc.c index 157f7faab..59232cc7b 100644 --- a/src/map/pc.c +++ b/src/map/pc.c @@ -3168,11 +3168,18 @@ int pc_bonus2(struct map_session_data *sd,int type,int type2,int val) sd->left_weapon.sp_drain[RC_BOSS].type = val; } break; + case SP_HP_VANISH_RATE: + if (sd->state.lr_flag != 2) { + sd->bonus.hp_vanish_rate += type2; + sd->bonus.hp_vanish_per = max(sd->bonus.hp_vanish_per, val); + sd->bonus.hp_vanish_trigger = 0; + } + break; case SP_SP_VANISH_RATE: - if(sd->state.lr_flag != 2) { + if (sd->state.lr_flag != 2) { sd->bonus.sp_vanish_rate += type2; - sd->bonus.sp_vanish_per = max(sd->bonus.sp_vanish_per,val); - sd->bonus.sp_vanish_trigger=0; + sd->bonus.sp_vanish_per = max(sd->bonus.sp_vanish_per, val); + sd->bonus.sp_vanish_trigger = 0; } break; case SP_GET_ZENY_NUM: @@ -3812,11 +3819,18 @@ int pc_bonus3(struct map_session_data *sd,int type,int type2,int type3,int val) } } break; + case SP_HP_VANISH_RATE: + if (sd->state.lr_flag != 2) { + sd->bonus.hp_vanish_rate += type2; + sd->bonus.hp_vanish_per = max(sd->bonus.hp_vanish_per, type3); + sd->bonus.hp_vanish_trigger = val; + } + break; case SP_SP_VANISH_RATE: - if(sd->state.lr_flag != 2) { + if (sd->state.lr_flag != 2) { sd->bonus.sp_vanish_rate += type2; - sd->bonus.sp_vanish_per = max(sd->bonus.sp_vanish_per,type3); - sd->bonus.sp_vanish_trigger=val; + sd->bonus.sp_vanish_per = max(sd->bonus.sp_vanish_per, type3); + sd->bonus.sp_vanish_trigger = val; } break; diff --git a/src/map/pc.h b/src/map/pc.h index 93173f6c8..97f339bf6 100644 --- a/src/map/pc.h +++ b/src/map/pc.h @@ -377,6 +377,8 @@ BEGIN_ZEROED_BLOCK; // this block will be globally zeroed at the beginning of st short add_steal_rate; short add_heal_rate, add_heal2_rate; short sp_gain_value, hp_gain_value, magic_sp_gain_value, magic_hp_gain_value; + short hp_vanish_rate; + short hp_vanish_per, hp_vanish_trigger; short sp_vanish_rate; short sp_vanish_per, sp_vanish_trigger; unsigned short unbreakable; // chance to prevent ANY equipment breaking [celest] -- cgit v1.2.3-60-g2f50 From 2dd2e23be8031e007708b6641736f5821c2abb82 Mon Sep 17 00:00:00 2001 From: Jedzkie Date: Sat, 26 Dec 2015 00:09:36 +0800 Subject: Follow up https://github.com/Jedzkie/Hercules/commit/3f13598714f2d6cecb1c1e5c382592a904798624, thanks to dastgir. --- src/map/battle.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) (limited to 'src/map/battle.c') diff --git a/src/map/battle.c b/src/map/battle.c index 6c0e57863..65038f240 100644 --- a/src/map/battle.c +++ b/src/map/battle.c @@ -5668,16 +5668,14 @@ struct Damage battle_calc_attack(int attack_type,struct block_list *bl,struct bl } else // Some skills like Weaponry Research will cause damage even if attack is dodged d.dmg_lv = ATK_DEF; - // HPVanishRate if (sd && d.damage + d.damage2 > 1) { + // HPVanishRate if (sd->bonus.hp_vanish_rate && sd->bonus.hp_vanish_trigger && rnd() % 1000 < sd->bonus.hp_vanish_rate && ((d.flag&sd->bonus.hp_vanish_trigger&BF_WEAPONMASK) || (d.flag&sd->bonus.hp_vanish_trigger&BF_RANGEMASK) || (d.flag&sd->bonus.hp_vanish_trigger&BF_SKILLMASK))) status_percent_damage(&sd->bl, target, -sd->bonus.hp_vanish_per, 0, false); - } - // SPVanishRate - if (sd && d.damage + d.damage2 > 1) { + // SPVanishRate if (sd->bonus.sp_vanish_rate && sd->bonus.sp_vanish_trigger && rnd() % 1000 < sd->bonus.sp_vanish_rate && ((d.flag&sd->bonus.sp_vanish_trigger&BF_WEAPONMASK) || (d.flag&sd->bonus.sp_vanish_trigger&BF_RANGEMASK) || (d.flag&sd->bonus.sp_vanish_trigger&BF_SKILLMASK))) -- cgit v1.2.3-60-g2f50