Fixed walk_choices's type (#3353)

Fixes #3310

Replaced some still hardcoded values with their define constants.
Added a function to check if a walk will be diagonal and fixed invalid calculation for it.

Thanks to @DavidPS92
This commit is contained in:
Lemongrass3110 2018-07-30 00:24:31 +02:00 committed by GitHub
parent 4f97c749c4
commit a05ed6e814
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 31 additions and 27 deletions

View File

@ -1644,7 +1644,7 @@ int mob_randomwalk(struct mob_data *md,unsigned int tick)
} }
speed=status_get_speed(&md->bl); speed=status_get_speed(&md->bl);
for(i=c=0;i<md->ud.walkpath.path_len;i++){ // The next walk start time is calculated. 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) if( direction_diagonal( md->ud.walkpath.path[i] ) )
c+=speed*MOVE_DIAGONAL_COST/MOVE_COST; c+=speed*MOVE_DIAGONAL_COST/MOVE_COST;
else else
c+=speed; c+=speed;

View File

@ -56,7 +56,7 @@ static BHEAP_STRUCT_VAR(node_heap, g_open_set); // use static heap for all path
/// @} /// @}
// Translates dx,dy into walking direction // Translates dx,dy into walking direction
static const char walk_choices [3][3] = static enum directions walk_choices [3][3] =
{ {
{DIR_NORTHWEST,DIR_NORTH,DIR_NORTHEAST}, {DIR_NORTHWEST,DIR_NORTH,DIR_NORTHEAST},
{DIR_WEST,DIR_CENTER,DIR_EAST}, {DIR_WEST,DIR_CENTER,DIR_EAST},
@ -510,3 +510,7 @@ int distance_client(int dx, int dy)
return ((int)temp_dist); return ((int)temp_dist);
} }
bool direction_diagonal( enum directions direction ){
return direction == DIR_NORTHWEST || direction == DIR_SOUTHWEST || direction == DIR_SOUTHEAST || direction == DIR_NORTHEAST;
}

View File

@ -13,17 +13,6 @@ enum cell_chk : uint8;
#define MAX_WALKPATH 32 #define MAX_WALKPATH 32
struct walkpath_data {
unsigned char path_len,path_pos;
unsigned char path[MAX_WALKPATH];
};
struct shootpath_data {
int rx,ry,len;
int x[MAX_WALKPATH];
int y[MAX_WALKPATH];
};
enum directions : int8 { enum directions : int8 {
DIR_CENTER = -1, DIR_CENTER = -1,
DIR_NORTH = 0, DIR_NORTH = 0,
@ -37,6 +26,17 @@ enum directions : int8 {
DIR_MAX DIR_MAX
}; };
struct walkpath_data {
unsigned char path_len,path_pos;
enum directions path[MAX_WALKPATH];
};
struct shootpath_data {
int rx,ry,len;
int x[MAX_WALKPATH];
int y[MAX_WALKPATH];
};
#define check_distance_bl(bl1, bl2, distance) check_distance((bl1)->x - (bl2)->x, (bl1)->y - (bl2)->y, distance) #define check_distance_bl(bl1, bl2, distance) check_distance((bl1)->x - (bl2)->x, (bl1)->y - (bl2)->y, distance)
#define check_distance_blxy(bl, x1, y1, distance) check_distance((bl)->x-(x1), (bl)->y-(y1), distance) #define check_distance_blxy(bl, x1, y1, distance) check_distance((bl)->x-(x1), (bl)->y-(y1), distance)
#define check_distance_xy(x0, y0, x1, y1, distance) check_distance((x0)-(x1), (y0)-(y1), distance) #define check_distance_xy(x0, y0, x1, y1, distance) check_distance((x0)-(x1), (y0)-(y1), distance)
@ -68,6 +68,8 @@ unsigned int distance(int dx, int dy);
bool check_distance_client(int dx, int dy, int distance); bool check_distance_client(int dx, int dy, int distance);
int distance_client(int dx, int dy); int distance_client(int dx, int dy);
bool direction_diagonal( enum directions direction );
// //
void do_init_path(); void do_init_path();
void do_final_path(); void do_final_path();

View File

@ -1076,7 +1076,7 @@ static int pet_randomwalk(struct pet_data *pd,unsigned int tick)
} }
for(i = c = 0; i < pd->ud.walkpath.path_len; i++) { for(i = c = 0; i < pd->ud.walkpath.path_len; i++) {
if(pd->ud.walkpath.path[i]&1) if( direction_diagonal( pd->ud.walkpath.path[i] ) )
c += pd->status.speed*MOVE_DIAGONAL_COST/MOVE_COST; c += pd->status.speed*MOVE_DIAGONAL_COST/MOVE_COST;
else else
c += pd->status.speed; c += pd->status.speed;

View File

@ -101,13 +101,12 @@ int unit_walktoxy_sub(struct block_list *bl)
if (ud->target_to && ud->chaserange>1) { if (ud->target_to && ud->chaserange>1) {
// Generally speaking, the walk path is already to an adjacent tile // Generally speaking, the walk path is already to an adjacent tile
// so we only need to shorten the path if the range is greater than 1. // so we only need to shorten the path if the range is greater than 1.
uint8 dir;
// Trim the last part of the path to account for range, // Trim the last part of the path to account for range,
// but always move at least one cell when requested to move. // but always move at least one cell when requested to move.
for (i = (ud->chaserange*10)-10; i > 0 && ud->walkpath.path_len>1;) { for (i = (ud->chaserange*10)-10; i > 0 && ud->walkpath.path_len>1;) {
ud->walkpath.path_len--; ud->walkpath.path_len--;
dir = ud->walkpath.path[ud->walkpath.path_len]; enum directions dir = ud->walkpath.path[ud->walkpath.path_len];
if(dir&1) if( direction_diagonal( dir ) )
i -= MOVE_COST*20; //When chasing, units will target a diamond-shaped area in range [Playtester] i -= MOVE_COST*20; //When chasing, units will target a diamond-shaped area in range [Playtester]
else else
i -= MOVE_COST; i -= MOVE_COST;
@ -126,7 +125,7 @@ int unit_walktoxy_sub(struct block_list *bl)
if(ud->walkpath.path_pos>=ud->walkpath.path_len) if(ud->walkpath.path_pos>=ud->walkpath.path_len)
i = -1; i = -1;
else if(ud->walkpath.path[ud->walkpath.path_pos]&1) else if( direction_diagonal( ud->walkpath.path[ud->walkpath.path_pos] ) )
i = status_get_speed(bl)*MOVE_DIAGONAL_COST/MOVE_COST; i = status_get_speed(bl)*MOVE_DIAGONAL_COST/MOVE_COST;
else else
i = status_get_speed(bl); i = status_get_speed(bl);
@ -322,7 +321,6 @@ static TIMER_FUNC(unit_walktoxy_timer){
int i; int i;
int x,y,dx,dy; int x,y,dx,dy;
unsigned char icewall_walk_block; unsigned char icewall_walk_block;
uint8 dir;
struct block_list *bl; struct block_list *bl;
struct unit_data *ud; struct unit_data *ud;
TBL_PC *sd=NULL; TBL_PC *sd=NULL;
@ -356,17 +354,17 @@ static TIMER_FUNC(unit_walktoxy_timer){
if(ud->walkpath.path_pos>=ud->walkpath.path_len) if(ud->walkpath.path_pos>=ud->walkpath.path_len)
return 0; return 0;
if(ud->walkpath.path[ud->walkpath.path_pos]>=8) if(ud->walkpath.path[ud->walkpath.path_pos]>=DIR_MAX)
return 1; return 1;
x = bl->x; x = bl->x;
y = bl->y; y = bl->y;
dir = ud->walkpath.path[ud->walkpath.path_pos]; enum directions dir = ud->walkpath.path[ud->walkpath.path_pos];
ud->dir = dir; ud->dir = dir;
dx = dirx[(int)dir]; dx = dirx[dir];
dy = diry[(int)dir]; dy = diry[dir];
// Get icewall walk block depending on Status Immune mode (players can't be trapped) // Get icewall walk block depending on Status Immune mode (players can't be trapped)
if(md && status_has_mode(&md->status,MD_STATUS_IMMUNE)) if(md && status_has_mode(&md->status,MD_STATUS_IMMUNE))
@ -495,8 +493,8 @@ static TIMER_FUNC(unit_walktoxy_timer){
ud->steptimer = INVALID_TIMER; ud->steptimer = INVALID_TIMER;
} }
//Delay stepactions by half a step (so they are executed at full step) //Delay stepactions by half a step (so they are executed at full step)
if(ud->walkpath.path[ud->walkpath.path_pos]&1) if( direction_diagonal( ud->walkpath.path[ud->walkpath.path_pos] ) )
i = status_get_speed(bl)*14/20; i = status_get_speed(bl)*MOVE_DIAGONAL_COST/MOVE_COST/2;
else else
i = status_get_speed(bl)/2; i = status_get_speed(bl)/2;
ud->steptimer = add_timer(tick+i, unit_step_timer, bl->id, 0); ud->steptimer = add_timer(tick+i, unit_step_timer, bl->id, 0);
@ -515,8 +513,8 @@ static TIMER_FUNC(unit_walktoxy_timer){
if(ud->walkpath.path_pos >= ud->walkpath.path_len) if(ud->walkpath.path_pos >= ud->walkpath.path_len)
i = -1; i = -1;
else if(ud->walkpath.path[ud->walkpath.path_pos]&1) else if( direction_diagonal( ud->walkpath.path[ud->walkpath.path_pos] ) )
i = status_get_speed(bl)*14/10; i = status_get_speed(bl)*MOVE_DIAGONAL_COST/MOVE_COST;
else else
i = status_get_speed(bl); i = status_get_speed(bl);