From 470ab15023f09dc823e8ce8ac818e0bbe8a95aef Mon Sep 17 00:00:00 2001 From: Haru Date: Tue, 3 Dec 2013 16:19:16 +0100 Subject: [PATCH] Corrected Steal Coin formulas and battle log message - Updated to use official formulas from Aegis (for both success chance and stolen zeny amount.) - It now shows the correct stolen zeny amount in the battle log, rather than showing the skill level. - Made possible thanks to Yommy and Ind. Signed-off-by: Haru --- src/map/pc.c | 27 ++++++++++++++------------- src/map/skill.c | 13 ++++++------- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/src/map/pc.c b/src/map/pc.c index 64fbd77f3e6..602b67a26fa 100644 --- a/src/map/pc.c +++ b/src/map/pc.c @@ -4814,14 +4814,16 @@ int pc_steal_item(struct map_session_data *sd,struct block_list *bl, uint16 skil return 1; } -/*========================================== - * Stole zeny from bl (mob) - * return - * 0 = fail - * 1 = success - *------------------------------------------*/ -int pc_steal_coin(struct map_session_data *sd,struct block_list *target) { - int rate,skill_lv; +/** + * Steals zeny from a monster through the RG_STEALCOIN skill. + * + * @param sd Source character + * @param target Target monster + * + * @return Amount of stolen zeny (0 in case of failure) + **/ +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) return 0; @@ -4833,15 +4835,14 @@ int pc_steal_coin(struct map_session_data *sd,struct block_list *target) { if( mob_is_treasure(md) ) return 0; - // FIXME: This formula is either custom or outdated. - skill_lv = pc->checkskill(sd,RG_STEALCOIN)*10; - rate = skill_lv + (sd->status.base_level - md->level)*3 + sd->battle_status.dex*2 + sd->battle_status.luk*2; + 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; if(rnd()%1000 < rate) { - int amount = md->level*10 + rnd()%100; + 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; - return 1; + return amount; } return 0; } diff --git a/src/map/skill.c b/src/map/skill.c index 45d06c97a97..197d4fe2d17 100644 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -6114,15 +6114,14 @@ int skill_castend_nodamage_id(struct block_list *src, struct block_list *bl, uin case RG_STEALCOIN: if(sd) { - if(pc->steal_coin(sd,bl)) - { + int amount = pc->steal_coin(sd, bl); + if( amount > 0 ) { dstmd->state.provoke_flag = src->id; - mob->target(dstmd, src, skill->get_range2(src,skill_id,skill_lv)); - clif->skill_nodamage(src,bl,skill_id,skill_lv,1); + mob->target(dstmd, src, skill->get_range2(src, skill_id, skill_lv)); + clif->skill_nodamage(src, bl, skill_id, amount, 1); - } - else - clif->skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0); + } else + clif->skill_fail(sd, skill_id, USESKILL_FAIL_LEVEL, 0); } break;