summaryrefslogtreecommitdiff
path: root/src/map
diff options
context:
space:
mode:
Diffstat (limited to 'src/map')
-rw-r--r--src/map/mob.c26
-rw-r--r--src/map/unit.c13
-rw-r--r--src/map/unit.h1
3 files changed, 26 insertions, 14 deletions
diff --git a/src/map/mob.c b/src/map/mob.c
index d7e6f9592..fca96c965 100644
--- a/src/map/mob.c
+++ b/src/map/mob.c
@@ -1123,12 +1123,16 @@ static int mob_ai_sub_hard(struct block_list *bl,va_list ap)
if (md->attacked_id == md->target_id)
{
if (!battle_check_range(&md->bl, tbl, md->status.rhw.range) &&
- ((!can_move && battle_config.mob_ai&0x2) ||
- (!mob_can_reach(md, tbl, md->min_chase, MSS_RUSH))))
+ (
+ (!can_move && battle_config.mob_ai&0x2) ||
+ (!mob_can_reach(md, tbl, md->min_chase, MSS_RUSH))
+ ) &&
+ DIFF_TICK(tick, md->ud.canmove_tick) > 0 &&
+ md->state.attacked_count++ >= RUDE_ATTACKED_COUNT
+ )
{ //Rude-attacked (avoid triggering due to can-walk delay).
- if (DIFF_TICK(tick, md->ud.canmove_tick) > 0 &&
- md->state.attacked_count++ >= RUDE_ATTACKED_COUNT)
- mobskill_use(md, tick, MSC_RUDEATTACKED);
+ if (!mobskill_use(md, tick, MSC_RUDEATTACKED) && can_move)
+ unit_escape(bl, tbl, rand()%10 +1);
}
} else
if ((abl= map_id2bl(md->attacked_id)) && (!tbl || mob_can_changetarget(md, abl, mode))) {
@@ -1142,15 +1146,9 @@ static int mob_ai_sub_hard(struct block_list *bl,va_list ap)
((TBL_PC*)abl)->state.gangsterparadise
)
) { //Can't attack back
- if (md->state.attacked_count++ >= RUDE_ATTACKED_COUNT) {
- if (mobskill_use(md, tick, MSC_RUDEATTACKED) == 0 && can_move)
- {
- int dist = rand() % 10 + 1;//後退する距離
- int dir = map_calc_dir(abl, bl->x, bl->y);
- int mask[8][2] = {{0,1},{-1,1},{-1,0},{-1,-1},{0,-1},{1,-1},{1,0},{1,1}};
- unit_walktoxy(&md->bl, md->bl.x + dist * mask[dir][0], md->bl.y + dist * mask[dir][1], 0);
- }
- }
+ if (md->state.attacked_count++ >= RUDE_ATTACKED_COUNT &&
+ !mobskill_use(md, tick, MSC_RUDEATTACKED) && can_move)
+ unit_escape(bl, abl, rand()%10 +1);
} else if (!(battle_config.mob_ai&0x2) && !status_check_skilluse(bl, abl, 0, 0)) {
//Can't attack back, but didn't invoke a rude attacked skill...
md->attacked_id = 0; //Simply unlock, shouldn't attempt to run away when in dumb_ai mode.
diff --git a/src/map/unit.c b/src/map/unit.c
index 8684c0732..a03b24d74 100644
--- a/src/map/unit.c
+++ b/src/map/unit.c
@@ -413,6 +413,19 @@ int unit_run(struct block_list *bl)
return 1;
}
+//Makes bl attempt to run dist cells away from target. Uses hard-paths.
+int unit_escape(struct block_list *bl, struct block_list *target, int dist)
+{
+ int dir = map_calc_dir(target, bl->x, bl->y);
+ while (dist > 0 && map_getcell(bl->m,
+ bl->x + dist*dirx[dir], bl->y + dist*diry[dir],
+ CELL_CHKNOREACH))
+ dist--;
+ return (dist > 0 && unit_walktoxy(bl,
+ bl->x + dist*dirx[dir], bl->y + dist*diry[dir],
+ 0));
+}
+
//Instant warp function.
int unit_movepos(struct block_list *bl,int dst_x,int dst_y, int easy, int checkpath)
{
diff --git a/src/map/unit.h b/src/map/unit.h
index 8f44616d8..9b53f90bf 100644
--- a/src/map/unit.h
+++ b/src/map/unit.h
@@ -24,6 +24,7 @@ int unit_can_move(struct block_list *bl);
int unit_is_walking(struct block_list *bl);
int unit_set_walkdelay(struct block_list *bl, unsigned int tick, int delay, int type);
+int unit_escape(struct block_list *bl, struct block_list *target, int dist);
// 位置の強制移動(吹き飛ばしなど)
int unit_movepos(struct block_list *bl,int dst_x,int dst_y, int easy, int checkpath);
int unit_warp(struct block_list *bl, int map, short x, short y, int type);