- Cleaned up the mob-random-walking code.

git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@6468 54d463be-8e91-2dee-dedb-b68131a5f0ec
This commit is contained in:
skotlex 2006-05-04 16:44:15 +00:00
parent 4ef4e4dc84
commit b30e1fdda7

View File

@ -982,46 +982,48 @@ int mob_unlocktarget(struct mob_data *md,int tick)
int mob_randomwalk(struct mob_data *md,int tick) int mob_randomwalk(struct mob_data *md,int tick)
{ {
const int retrycount=20; const int retrycount=20;
int i,x,y,c,d;
int speed; int speed;
nullpo_retr(0, md); nullpo_retr(0, md);
if(DIFF_TICK(md->next_walktime,tick)<0 && unit_can_move(&md->bl)){ if(DIFF_TICK(md->next_walktime,tick)>0 || !unit_can_move(&md->bl))
int i,x,y,c,d=12-md->move_fail_count; return 0;
speed=status_get_speed(&md->bl);
if(d<5) d=5;
for(i=0;i<retrycount;i++){ // Search of a movable place
int r=rand();
x=r%(d*2+1)-d;
y=r/(d*2+1)%(d*2+1)-d;
x+=md->bl.x;
y+=md->bl.y;
if((map_getcell(md->bl.m,x,y,CELL_CHKPASS)) && unit_walktoxy(&md->bl,x,y,1)){ d =12-md->move_fail_count;
md->move_fail_count=0; if(d<5) d=5;
break; for(i=0;i<retrycount;i++){ // Search of a movable place
} int r=rand();
if(i+1>=retrycount){ x=r%(d*2+1)-d;
md->move_fail_count++; y=r/(d*2+1)%(d*2+1)-d;
if(md->move_fail_count>1000){ x+=md->bl.x;
if(battle_config.error_log) y+=md->bl.y;
ShowWarning("MOB cant move. random spawn %d, class = %d\n",md->bl.id,md->class_);
md->move_fail_count=0; if((map_getcell(md->bl.m,x,y,CELL_CHKPASS)) && unit_walktoxy(&md->bl,x,y,1)){
mob_spawn(md); break;
}
}
} }
for(i=c=0;i<md->ud.walkpath.path_len;i++){ // The next walk start time is calculated.
if(md->ud.walkpath.path[i]&1)
c+=speed*14/10;
else
c+=speed;
}
md->next_walktime = tick+rand()%3000+3000+c;
md->state.skillstate=MSS_WALK;
return 1;
} }
return 0; if(i==retrycount){
md->move_fail_count++;
if(md->move_fail_count>1000){
if(battle_config.error_log)
ShowWarning("MOB cant move. random spawn %d, class = %d\n",md->bl.id,md->class_);
md->move_fail_count=0;
mob_spawn(md);
}
return 0;
}
speed=status_get_speed(&md->bl);
for(i=c=0;i<md->ud.walkpath.path_len;i++){ // The next walk start time is calculated.
if(md->ud.walkpath.path[i]&1)
c+=speed*14/10;
else
c+=speed;
}
md->state.skillstate=MSS_WALK;
md->move_fail_count=0;
md->next_walktime = tick+rand()%3000+3000+c;
return 1;
} }
/*========================================== /*==========================================
@ -1259,15 +1261,8 @@ static int mob_ai_sub_hard(struct block_list *bl,va_list ap)
} }
// Nothing else to do... except random walking. // Nothing else to do... except random walking.
// Slaves do not random walk! [Skotlex] // Slaves do not random walk! [Skotlex]
if (can_move && !md->master_id) if (can_move && !md->master_id && DIFF_TICK(md->next_walktime, tick) <= 0)
{ mob_randomwalk(md,tick);
if (DIFF_TICK(md->next_walktime, tick) > 7000 &&
(md->ud.walkpath.path_len == 0 || md->ud.walkpath.path_pos >= md->ud.walkpath.path_len))
md->next_walktime = tick + 3000 + rand() % 2000;
// Random movement
if (mob_randomwalk(md,tick))
return 0;
}
return 0; return 0;
} }