Re-phrased the attacker flee/def penalty config descs

git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@10530 54d463be-8e91-2dee-dedb-b68131a5f0ec
This commit is contained in:
ultramage 2007-05-11 17:09:09 +00:00
parent 3b8fb2fe6f
commit cc636df44f
5 changed files with 44 additions and 40 deletions

View File

@ -4,6 +4,8 @@ AS OF SVN REV. 5091, WE ARE NOW USING TRUNK. ALL UNTESTED BUGFIXES/FEATURES GO
IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
2007/05/11
* Re-phrased the attacker flee/def penalty config descs [ultramage]
Ref: http://www.eathena.ws/board/index.php?showtopic=150918
* Attempt to fix unwanted teleporting of immobile mobs [Playtester]
2007/05/10
* Adapted the shortlist to use a static array instead of a linked list and

View File

@ -123,18 +123,18 @@ weapon_defense_type: 0
//MDEFsame as above....(MDEF*value)
magic_defense_type: 0
// How to count the number of the enemies who do an agi penalty...
// 1 or less: It is a count altogether.
// 2: Full evasion exclusion
// 3: Full evasion and evasion exclusion
// 4 or more: Except all.
// How to count the number of attackers when applying agi penalty ? (choose one)
// 1-: Count every attack attempt (even those that were dodged/lucky-dodged)
// 2 : Count every non-lucky-dodged attack attempt
// 3 : Count only attacks that actually connect
// 4+: None of the above, count will always be 0
agi_penalty_count_lv: 2
// How to count the number of the enemies who do a vit penalty
// 1 or less: It is a count altogether.
// 2: Full evasion exclusion
// 3: Full evasion and evasion exclusion
// Four or more: Except all.
// How to count the number of attackers when applying vit penalty ? (choose one)
// 1-: Count every attack attempt (even those that were dodged/lucky-dodged)
// 2 : Count every non-lucky-dodged attack attempt
// 3 : Count only attacks that actually connect
// 4+: None of the above, count will always be 0
vit_penalty_count_lv: 3
// Change attacker's direction to face opponent on every attack? (Note 4)

View File

@ -1102,14 +1102,14 @@ static struct Damage battle_calc_weapon_attack(
if(battle_config.agi_penalty_type &&
battle_config.agi_penalty_target&target->type)
{
unsigned char target_count; //256 max targets should be a sane max
target_count = unit_counttargeted(target,battle_config.agi_penalty_count_lv);
if(target_count >= battle_config.agi_penalty_count)
unsigned char attacker_count; //256 max targets should be a sane max
attacker_count = unit_counttargeted(target,battle_config.agi_penalty_count_lv);
if(attacker_count >= battle_config.agi_penalty_count)
{
if (battle_config.agi_penalty_type == 1)
flee = (flee * (100 - (target_count - (battle_config.agi_penalty_count - 1))*battle_config.agi_penalty_num))/100;
flee = (flee * (100 - (attacker_count - (battle_config.agi_penalty_count - 1))*battle_config.agi_penalty_num))/100;
else //asume type 2: absolute reduction
flee -= (target_count - (battle_config.agi_penalty_count - 1))*battle_config.agi_penalty_num;
flee -= (attacker_count - (battle_config.agi_penalty_count - 1))*battle_config.agi_penalty_num;
if(flee < 1) flee = 1;
}
}
@ -2585,14 +2585,14 @@ struct Damage battle_calc_misc_attack(
if(battle_config.agi_penalty_type &&
battle_config.agi_penalty_target&target->type)
{
unsigned char target_count; //256 max targets should be a sane max
target_count = unit_counttargeted(target,battle_config.agi_penalty_count_lv);
if(target_count >= battle_config.agi_penalty_count)
unsigned char attacker_count; //256 max targets should be a sane max
attacker_count = unit_counttargeted(target,battle_config.agi_penalty_count_lv);
if(attacker_count >= battle_config.agi_penalty_count)
{
if (battle_config.agi_penalty_type == 1)
flee = (flee * (100 - (target_count - (battle_config.agi_penalty_count - 1))*battle_config.agi_penalty_num))/100;
flee = (flee * (100 - (attacker_count - (battle_config.agi_penalty_count - 1))*battle_config.agi_penalty_num))/100;
else //asume type 2: absolute reduction
flee -= (target_count - (battle_config.agi_penalty_count - 1))*battle_config.agi_penalty_num;
flee -= (attacker_count - (battle_config.agi_penalty_count - 1))*battle_config.agi_penalty_num;
if(flee < 1) flee = 1;
}
}

View File

@ -1033,7 +1033,12 @@ struct pet_data {
struct map_session_data *msd;
};
enum { ATK_LUCKY=1,ATK_FLEE,ATK_DEF}; // 囲まれペナルティ計算用
// state of a single attack attempt; used in flee/def penalty calculations when mobbed
enum {
ATK_LUCKY=1, // attack was lucky-dodged
ATK_FLEE, // attack was dodged
ATK_DEF // attack connected
};
struct map_data {
char name[MAP_NAME_LENGTH];

View File

@ -1521,15 +1521,14 @@ void unit_dataset(struct block_list *bl) {
}
/*==========================================
* (foreachclient)
*------------------------------------------
*/
static int unit_counttargeted_sub(struct block_list *bl, va_list ap)
* Returns 1 if this unit is attacking target 'id'
*------------------------------------------*/
static int unit_counttargeted_sub(struct block_list* bl, va_list ap)
{
int id, target_lv;
struct unit_data *ud;
id = va_arg(ap,int);
target_lv = va_arg(ap,int);
int id = va_arg(ap, int);
int target_lv = va_arg(ap, int); // extra condition
struct unit_data* ud;
if(bl->id == id)
return 0;
@ -1541,6 +1540,15 @@ static int unit_counttargeted_sub(struct block_list *bl, va_list ap)
return 0;
}
/*==========================================
* Counts the number of units attacking 'bl'
*------------------------------------------*/
int unit_counttargeted(struct block_list* bl, int target_lv)
{
nullpo_retr(0, bl);
return (map_foreachinrange(unit_counttargeted_sub, bl, AREA_SIZE, BL_CHAR, bl->id, target_lv));
}
/*==========================================
*
*------------------------------------------
@ -1554,17 +1562,6 @@ int unit_fixdamage(struct block_list *src,struct block_list *target,unsigned int
return status_fix_damage(src,target,damage+damage2,clif_damage(target,target,tick,sdelay,ddelay,damage,div,type,damage2));
}
/*==========================================
*
* 0
*------------------------------------------
*/
int unit_counttargeted(struct block_list *bl,int target_lv)
{
nullpo_retr(0, bl);
return (map_foreachinrange(unit_counttargeted_sub, bl, AREA_SIZE, BL_CHAR,
bl->id, target_lv));
}
/*==========================================
*