diff options
author | skotlex <skotlex@54d463be-8e91-2dee-dedb-b68131a5f0ec> | 2007-09-25 18:32:08 +0000 |
---|---|---|
committer | skotlex <skotlex@54d463be-8e91-2dee-dedb-b68131a5f0ec> | 2007-09-25 18:32:08 +0000 |
commit | 77b02c49796f442a3ea87bb5bab1b568a4d80a29 (patch) | |
tree | af359d1fdb161b0ecd330946a2d52dc458f814c1 /src | |
parent | c92056c063c53cbee4f7004d064f075b3c96c33f (diff) | |
download | hercules-77b02c49796f442a3ea87bb5bab1b568a4d80a29.tar.gz hercules-77b02c49796f442a3ea87bb5bab1b568a4d80a29.tar.bz2 hercules-77b02c49796f442a3ea87bb5bab1b568a4d80a29.tar.xz hercules-77b02c49796f442a3ea87bb5bab1b568a4d80a29.zip |
- Modified a bit the hard/lazy ai triggers to match aegis:
- Mobs go into active AI when they are 2 cells from entering a player's view (ACTIVE_AI_RANGE)
- Mobs in passive AI no longer use skills.
- Mobs in passive AI do not random walk UNLESS they have entered active AI before (random walk frequency is not lost during passive AI).
- Added an additional check to prevent support skills from being blocked if the target has an armor element that blocks it.
git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@11294 54d463be-8e91-2dee-dedb-b68131a5f0ec
Diffstat (limited to 'src')
-rw-r--r-- | src/map/map.h | 1 | ||||
-rw-r--r-- | src/map/mob.c | 16 | ||||
-rw-r--r-- | src/map/pc.c | 2 | ||||
-rw-r--r-- | src/map/skill.c | 1 |
4 files changed, 14 insertions, 6 deletions
diff --git a/src/map/map.h b/src/map/map.h index b33f8f1d1..cdae79a78 100644 --- a/src/map/map.h +++ b/src/map/map.h @@ -919,6 +919,7 @@ struct mob_data { unsigned alchemist: 1; unsigned no_random_walk: 1; unsigned killer: 1; + unsigned spotted: 1; unsigned char attacked_count; //For rude attacked. int provoke_flag; // Celest } state; diff --git a/src/map/mob.c b/src/map/mob.c index bfa22fe4a..07fc2db22 100644 --- a/src/map/mob.c +++ b/src/map/mob.c @@ -36,17 +36,18 @@ #include <string.h> #include <math.h> +#define ACTIVE_AI_RANGE 2 //Distance added on top of 'AREA_SIZE' at which mobs enter active AI mode. #define IDLE_SKILL_INTERVAL 10 //Active idle skills should be triggered every 1 second (1000/MIN_MOBTHINKTIME) -#define MOB_LAZYSKILLPERC 10 // Probability for mobs far from players from doing their IDLE skill. (rate of 1000 minute) -#define MOB_LAZYMOVEPERC 50 // Move probability in the negligent mode MOB (rate of 1000 minute) +#define MOB_LAZYSKILLPERC 0 // Probability for mobs far from players from doing their IDLE skill. (rate of 1000 minute) +// Move probability for mobs away from players (rate of 1000 minute) +// in Aegis, this is 100% for mobs that have been activated by players and none otherwise. +#define MOB_LAZYMOVEPERC(md) (md->state.spotted?1000:0) #define MOB_LAZYWARPPERC 20 // Warp probability in the negligent mode MOB (rate of 1000 minute) #define MAX_MINCHASE 30 //Max minimum chase value to use for mobs. - #define RUDE_ATTACKED_COUNT 2 //After how many rude-attacks should the skill be used? - //Used to determine default enemy type of mobs (for use in eachinrange calls) #define DEFAULT_ENEMY_TYPE(md) (md->special_state.ai?BL_CHAR:BL_PC|BL_HOM) @@ -1129,6 +1130,9 @@ static int mob_ai_sub_hard(struct block_list *bl,va_list ap) if(md->bl.prev == NULL || md->status.hp <= 0) return 1; + if(!md->state.spotted) //Hard AI triggered. + md->state.spotted = 1; + if (DIFF_TICK(tick, md->last_thinktime) < MIN_MOBTHINKTIME) return 0; md->last_thinktime = tick; @@ -1367,7 +1371,7 @@ static int mob_ai_sub_foreachclient(struct map_session_data *sd,va_list ap) { unsigned int tick; tick=va_arg(ap,unsigned int); - map_foreachinrange(mob_ai_sub_hard,&sd->bl, AREA_SIZE*2, BL_MOB,tick); + map_foreachinrange(mob_ai_sub_hard,&sd->bl, AREA_SIZE+ACTIVE_AI_RANGE, BL_MOB,tick); return 0; } @@ -1413,7 +1417,7 @@ static int mob_ai_sub_lazy(DBKey key,void * data,va_list ap) // Since PC is in the same map, somewhat better negligent processing is carried out. // It sometimes moves. - if(rand()%1000<MOB_LAZYMOVEPERC) + if(rand()%1000<MOB_LAZYMOVEPERC(md)) mob_randomwalk(md,tick); else if(rand()%1000<MOB_LAZYSKILLPERC) //Chance to do a mob's idle skill. mobskill_use(md, tick, -1); diff --git a/src/map/pc.c b/src/map/pc.c index cd071445a..5b7a6aab0 100644 --- a/src/map/pc.c +++ b/src/map/pc.c @@ -1753,6 +1753,8 @@ int pc_bonus(struct map_session_data *sd,int type,int val) case SP_NO_GEMSTONE: if(sd->state.lr_flag != 2) sd->special_state.no_gemstone = 1; + ShowDebug("Rate: %d\n", sd->special_state.no_gemstone); + break; case SP_INTRAVISION: // Maya Purple Card effect allowing to see Hiding/Cloaking people [DracoRPG] if(sd->state.lr_flag != 2) { diff --git a/src/map/skill.c b/src/map/skill.c index 50df5e138..6343f98d6 100644 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -3485,6 +3485,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in if (src!=bl && type > -1 && (i = skill_get_pl(skillid, skilllv)) > ELE_NEUTRAL && + skill_get_inf(skillid) != INF_SUPPORT_SKILL && battle_attr_fix(NULL, NULL, 100, i, tstatus->def_ele, tstatus->ele_lv) <= 0) return 1; //Skills that cause an status should be blocked if the target element blocks its element. |