+ * 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)
+{
+ byte *x = (byte*)(u);
+ byte *y = (byte*)(v);
+ cave_type *ca_ptr = &cave[y[a]][x[a]];
+ cave_type *cb_ptr = &cave[y[b]][x[b]];
+ monster_type *ma_ptr = &m_list[ca_ptr->m_idx];
+ monster_type *mb_ptr = &m_list[cb_ptr->m_idx];
+ monster_race *ap_ra_ptr, *ap_rb_ptr;
+
+ /* The player grid */
+ if (y[a] == py && x[a] == px) return TRUE;
+ if (y[b] == py && x[b] == px) 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 (cave[y[a]][x[a]].o_idx && !cave[y[b]][x[b]].o_idx) return TRUE;
+ if (!cave[y[a]][x[a]].o_idx && cave[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);
+}
+
+
+/*