OSDN Git Service

Merge remote-tracking branch 'remotes/origin/feature/Fix-Sanity-Blast-by-AutoSave...
[hengband/hengband.git] / src / util / object-sort.c
1 /*!
2  * @brief オブジェクトのソート処理
3  * @date 2020/06/03
4  * @author Hourier
5  */
6
7 #include "util/object-sort.h"
8 #include "monster-race/monster-race.h"
9 #include "object-hook/hook-enchant.h"
10 #include "object/object-value.h"
11 #include "perception/object-perception.h"
12 #include "player/player-realm.h"
13
14 /*!
15  * @brief オブジェクトを定義された基準に従いソートするための関数 /
16  * Check if we have space for an item in the pack without overflow
17  * @param o_ptr 比較対象オブジェクトの構造体参照ポインタ1
18  * @param o_value o_ptrのアイテム価値(手動であらかじめ代入する必要がある?)
19  * @param j_ptr 比較対象オブジェクトの構造体参照ポインタ2
20  * @return o_ptrの方が上位ならばTRUEを返す。
21  */
22 bool object_sort_comp(player_type *player_ptr, object_type *o_ptr, s32b o_value, object_type *j_ptr)
23 {
24     int o_type, j_type;
25     if (!j_ptr->k_idx)
26         return TRUE;
27
28     if ((o_ptr->tval == get_realm1_book(player_ptr)) && (j_ptr->tval != get_realm1_book(player_ptr)))
29         return TRUE;
30     if ((j_ptr->tval == get_realm1_book(player_ptr)) && (o_ptr->tval != get_realm1_book(player_ptr)))
31         return FALSE;
32
33     if ((o_ptr->tval == get_realm2_book(player_ptr)) && (j_ptr->tval != get_realm2_book(player_ptr)))
34         return TRUE;
35     if ((j_ptr->tval == get_realm2_book(player_ptr)) && (o_ptr->tval != get_realm2_book(player_ptr)))
36         return FALSE;
37
38     if (o_ptr->tval > j_ptr->tval)
39         return TRUE;
40     if (o_ptr->tval < j_ptr->tval)
41         return FALSE;
42
43     if (!object_is_aware(o_ptr))
44         return FALSE;
45     if (!object_is_aware(j_ptr))
46         return TRUE;
47
48     if (o_ptr->sval < j_ptr->sval)
49         return TRUE;
50     if (o_ptr->sval > j_ptr->sval)
51         return FALSE;
52
53     if (!object_is_known(o_ptr))
54         return FALSE;
55     if (!object_is_known(j_ptr))
56         return TRUE;
57
58     if (object_is_fixed_artifact(o_ptr))
59         o_type = 3;
60     else if (o_ptr->art_name)
61         o_type = 2;
62     else if (object_is_ego(o_ptr))
63         o_type = 1;
64     else
65         o_type = 0;
66
67     if (object_is_fixed_artifact(j_ptr))
68         j_type = 3;
69     else if (j_ptr->art_name)
70         j_type = 2;
71     else if (object_is_ego(j_ptr))
72         j_type = 1;
73     else
74         j_type = 0;
75
76     if (o_type < j_type)
77         return TRUE;
78     if (o_type > j_type)
79         return FALSE;
80
81     switch (o_ptr->tval) {
82     case TV_FIGURINE:
83     case TV_STATUE:
84     case TV_CORPSE:
85     case TV_CAPTURE:
86         if (r_info[o_ptr->pval].level < r_info[j_ptr->pval].level)
87             return TRUE;
88         if ((r_info[o_ptr->pval].level == r_info[j_ptr->pval].level) && (o_ptr->pval < j_ptr->pval))
89             return TRUE;
90         return FALSE;
91
92     case TV_SHOT:
93     case TV_ARROW:
94     case TV_BOLT:
95         if (o_ptr->to_h + o_ptr->to_d < j_ptr->to_h + j_ptr->to_d)
96             return TRUE;
97         if (o_ptr->to_h + o_ptr->to_d > j_ptr->to_h + j_ptr->to_d)
98             return FALSE;
99         break;
100
101     case TV_ROD:
102         if (o_ptr->pval < j_ptr->pval)
103             return TRUE;
104         if (o_ptr->pval > j_ptr->pval)
105             return FALSE;
106         break;
107     }
108
109     return o_value > object_value(player_ptr, j_ptr);
110 }