From 3fc088dd6ecd8976a29578d88c2bf91e9f0515be Mon Sep 17 00:00:00 2001 From: deskull Date: Tue, 19 Mar 2019 22:40:47 +0900 Subject: [PATCH] [Refactor] #37353 ang_sort_*() in xtra2.c to sort.c. --- src/sort.c | 124 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/sort.h | 3 ++ src/xtra2.c | 127 ------------------------------------------------------------ 3 files changed, 127 insertions(+), 127 deletions(-) diff --git a/src/sort.c b/src/sort.c index 62c610284..3e83920fc 100644 --- a/src/sort.c +++ b/src/sort.c @@ -67,3 +67,127 @@ void ang_sort(vptr u, vptr v, int n) +/* + * Sorting hook -- comp function -- by "distance to player" + * + * We use "u" and "v" to point to arrays of "x" and "y" positions, + * and sort the arrays by double-distance to the player. + */ +bool ang_sort_comp_distance(vptr u, vptr v, int a, int b) +{ + POSITION *x = (POSITION*)(u); + POSITION *y = (POSITION*)(v); + + POSITION da, db, kx, ky; + + /* Absolute distance components */ + kx = x[a]; kx -= p_ptr->x; kx = ABS(kx); + ky = y[a]; ky -= p_ptr->y; ky = ABS(ky); + + /* Approximate Double Distance to the first point */ + da = ((kx > ky) ? (kx + kx + ky) : (ky + ky + kx)); + + /* Absolute distance components */ + kx = x[b]; kx -= p_ptr->x; kx = ABS(kx); + ky = y[b]; ky -= p_ptr->y; ky = ABS(ky); + + /* Approximate Double Distance to the first point */ + db = ((kx > ky) ? (kx + kx + ky) : (ky + ky + kx)); + + /* Compare the distances */ + return (da <= db); +} + + +/* + * Sorting hook -- comp function -- by importance level of grids + * + * We use "u" and "v" to point to arrays of "x" and "y" positions, + * and sort the arrays by level of monster + */ +bool ang_sort_comp_importance(vptr u, vptr v, int a, int b) +{ + POSITION *x = (POSITION*)(u); + POSITION *y = (POSITION*)(v); + grid_type *ca_ptr = ¤t_floor_ptr->grid_array[y[a]][x[a]]; + grid_type *cb_ptr = ¤t_floor_ptr->grid_array[y[b]][x[b]]; + monster_type *ma_ptr = ¤t_floor_ptr->m_list[ca_ptr->m_idx]; + monster_type *mb_ptr = ¤t_floor_ptr->m_list[cb_ptr->m_idx]; + monster_race *ap_ra_ptr, *ap_rb_ptr; + + /* The player grid */ + if (y[a] == p_ptr->y && x[a] == p_ptr->x) return TRUE; + if (y[b] == p_ptr->y && x[b] == p_ptr->x) return FALSE; + + /* Extract monster race */ + if (ca_ptr->m_idx && ma_ptr->ml) ap_ra_ptr = &r_info[ma_ptr->ap_r_idx]; + else ap_ra_ptr = NULL; + if (cb_ptr->m_idx && mb_ptr->ml) ap_rb_ptr = &r_info[mb_ptr->ap_r_idx]; + else ap_rb_ptr = NULL; + + if (ap_ra_ptr && !ap_rb_ptr) return TRUE; + if (!ap_ra_ptr && ap_rb_ptr) return FALSE; + + /* Compare two monsters */ + if (ap_ra_ptr && ap_rb_ptr) + { + /* Unique monsters first */ + if ((ap_ra_ptr->flags1 & RF1_UNIQUE) && !(ap_rb_ptr->flags1 & RF1_UNIQUE)) return TRUE; + if (!(ap_ra_ptr->flags1 & RF1_UNIQUE) && (ap_rb_ptr->flags1 & RF1_UNIQUE)) return FALSE; + + /* Shadowers first (あやしい影) */ + if ((ma_ptr->mflag2 & MFLAG2_KAGE) && !(mb_ptr->mflag2 & MFLAG2_KAGE)) return TRUE; + if (!(ma_ptr->mflag2 & MFLAG2_KAGE) && (mb_ptr->mflag2 & MFLAG2_KAGE)) return FALSE; + + /* Unknown monsters first */ + if (!ap_ra_ptr->r_tkills && ap_rb_ptr->r_tkills) return TRUE; + if (ap_ra_ptr->r_tkills && !ap_rb_ptr->r_tkills) return FALSE; + + /* Higher level monsters first (if known) */ + if (ap_ra_ptr->r_tkills && ap_rb_ptr->r_tkills) + { + if (ap_ra_ptr->level > ap_rb_ptr->level) return TRUE; + if (ap_ra_ptr->level < ap_rb_ptr->level) return FALSE; + } + + /* Sort by index if all conditions are same */ + if (ma_ptr->ap_r_idx > mb_ptr->ap_r_idx) return TRUE; + if (ma_ptr->ap_r_idx < mb_ptr->ap_r_idx) return FALSE; + } + + /* An object get higher priority */ + if (current_floor_ptr->grid_array[y[a]][x[a]].o_idx && !current_floor_ptr->grid_array[y[b]][x[b]].o_idx) return TRUE; + if (!current_floor_ptr->grid_array[y[a]][x[a]].o_idx && current_floor_ptr->grid_array[y[b]][x[b]].o_idx) return FALSE; + + /* Priority from the terrain */ + if (f_info[ca_ptr->feat].priority > f_info[cb_ptr->feat].priority) return TRUE; + if (f_info[ca_ptr->feat].priority < f_info[cb_ptr->feat].priority) return FALSE; + + /* If all conditions are same, compare distance */ + return ang_sort_comp_distance(u, v, a, b); +} + + +/* + * Sorting hook -- swap function -- by "distance to player" + * + * We use "u" and "v" to point to arrays of "x" and "y" positions, + * and sort the arrays by distance to the player. + */ +void ang_sort_swap_distance(vptr u, vptr v, int a, int b) +{ + POSITION *x = (POSITION*)(u); + POSITION *y = (POSITION*)(v); + + POSITION temp; + + /* Swap "x" */ + temp = x[a]; + x[a] = x[b]; + x[b] = temp; + + /* Swap "y" */ + temp = y[a]; + y[a] = y[b]; + y[b] = temp; +} diff --git a/src/sort.h b/src/sort.h index 813a5addd..4834a8c07 100644 --- a/src/sort.h +++ b/src/sort.h @@ -1,3 +1,6 @@ extern void ang_sort_aux(vptr u, vptr v, int p, int q); extern void ang_sort(vptr u, vptr v, int n); +extern bool ang_sort_comp_distance(vptr u, vptr v, int a, int b); +extern bool ang_sort_comp_importance(vptr u, vptr v, int a, int b); +extern void ang_sort_swap_distance(vptr u, vptr v, int a, int b); diff --git a/src/xtra2.c b/src/xtra2.c index 987d46319..f11c756ca 100644 --- a/src/xtra2.c +++ b/src/xtra2.c @@ -260,133 +260,6 @@ bool target_okay(void) /* - * Sorting hook -- comp function -- by "distance to player" - * - * We use "u" and "v" to point to arrays of "x" and "y" positions, - * and sort the arrays by double-distance to the player. - */ -static bool ang_sort_comp_distance(vptr u, vptr v, int a, int b) -{ - POSITION *x = (POSITION*)(u); - POSITION *y = (POSITION*)(v); - - POSITION da, db, kx, ky; - - /* Absolute distance components */ - kx = x[a]; kx -= p_ptr->x; kx = ABS(kx); - ky = y[a]; ky -= p_ptr->y; ky = ABS(ky); - - /* Approximate Double Distance to the first point */ - da = ((kx > ky) ? (kx + kx + ky) : (ky + ky + kx)); - - /* Absolute distance components */ - kx = x[b]; kx -= p_ptr->x; kx = ABS(kx); - ky = y[b]; ky -= p_ptr->y; ky = ABS(ky); - - /* Approximate Double Distance to the first point */ - db = ((kx > ky) ? (kx + kx + ky) : (ky + ky + kx)); - - /* Compare the distances */ - return (da <= db); -} - - -/* - * Sorting hook -- comp function -- by importance level of grids - * - * We use "u" and "v" to point to arrays of "x" and "y" positions, - * and sort the arrays by level of monster - */ -static bool ang_sort_comp_importance(vptr u, vptr v, int a, int b) -{ - POSITION *x = (POSITION*)(u); - POSITION *y = (POSITION*)(v); - grid_type *ca_ptr = ¤t_floor_ptr->grid_array[y[a]][x[a]]; - grid_type *cb_ptr = ¤t_floor_ptr->grid_array[y[b]][x[b]]; - monster_type *ma_ptr = ¤t_floor_ptr->m_list[ca_ptr->m_idx]; - monster_type *mb_ptr = ¤t_floor_ptr->m_list[cb_ptr->m_idx]; - monster_race *ap_ra_ptr, *ap_rb_ptr; - - /* The player grid */ - if (y[a] == p_ptr->y && x[a] == p_ptr->x) return TRUE; - if (y[b] == p_ptr->y && x[b] == p_ptr->x) return FALSE; - - /* Extract monster race */ - if (ca_ptr->m_idx && ma_ptr->ml) ap_ra_ptr = &r_info[ma_ptr->ap_r_idx]; - else ap_ra_ptr = NULL; - if (cb_ptr->m_idx && mb_ptr->ml) ap_rb_ptr = &r_info[mb_ptr->ap_r_idx]; - else ap_rb_ptr = NULL; - - if (ap_ra_ptr && !ap_rb_ptr) return TRUE; - if (!ap_ra_ptr && ap_rb_ptr) return FALSE; - - /* Compare two monsters */ - if (ap_ra_ptr && ap_rb_ptr) - { - /* Unique monsters first */ - if ((ap_ra_ptr->flags1 & RF1_UNIQUE) && !(ap_rb_ptr->flags1 & RF1_UNIQUE)) return TRUE; - if (!(ap_ra_ptr->flags1 & RF1_UNIQUE) && (ap_rb_ptr->flags1 & RF1_UNIQUE)) return FALSE; - - /* Shadowers first (あやしい影) */ - if ((ma_ptr->mflag2 & MFLAG2_KAGE) && !(mb_ptr->mflag2 & MFLAG2_KAGE)) return TRUE; - if (!(ma_ptr->mflag2 & MFLAG2_KAGE) && (mb_ptr->mflag2 & MFLAG2_KAGE)) return FALSE; - - /* Unknown monsters first */ - if (!ap_ra_ptr->r_tkills && ap_rb_ptr->r_tkills) return TRUE; - if (ap_ra_ptr->r_tkills && !ap_rb_ptr->r_tkills) return FALSE; - - /* Higher level monsters first (if known) */ - if (ap_ra_ptr->r_tkills && ap_rb_ptr->r_tkills) - { - if (ap_ra_ptr->level > ap_rb_ptr->level) return TRUE; - if (ap_ra_ptr->level < ap_rb_ptr->level) return FALSE; - } - - /* Sort by index if all conditions are same */ - if (ma_ptr->ap_r_idx > mb_ptr->ap_r_idx) return TRUE; - if (ma_ptr->ap_r_idx < mb_ptr->ap_r_idx) return FALSE; - } - - /* An object get higher priority */ - if (current_floor_ptr->grid_array[y[a]][x[a]].o_idx && !current_floor_ptr->grid_array[y[b]][x[b]].o_idx) return TRUE; - if (!current_floor_ptr->grid_array[y[a]][x[a]].o_idx && current_floor_ptr->grid_array[y[b]][x[b]].o_idx) return FALSE; - - /* Priority from the terrain */ - if (f_info[ca_ptr->feat].priority > f_info[cb_ptr->feat].priority) return TRUE; - if (f_info[ca_ptr->feat].priority < f_info[cb_ptr->feat].priority) return FALSE; - - /* If all conditions are same, compare distance */ - return ang_sort_comp_distance(u, v, a, b); -} - - -/* - * Sorting hook -- swap function -- by "distance to player" - * - * We use "u" and "v" to point to arrays of "x" and "y" positions, - * and sort the arrays by distance to the player. - */ -static void ang_sort_swap_distance(vptr u, vptr v, int a, int b) -{ - POSITION *x = (POSITION*)(u); - POSITION *y = (POSITION*)(v); - - POSITION temp; - - /* Swap "x" */ - temp = x[a]; - x[a] = x[b]; - x[b] = temp; - - /* Swap "y" */ - temp = y[a]; - y[a] = y[b]; - y[b] = temp; -} - - - -/* * Hack -- help "select" a location (see below) */ static POSITION_IDX target_pick(POSITION y1, POSITION x1, POSITION dy, POSITION dx) -- 2.11.0