OSDN Git Service

Merge pull request #3569 from sikabane-works/release/3.0.0.88-alpha
[hengbandforosx/hengbandosx.git] / src / view / display-self-info.cpp
1 #include "view/display-self-info.h"
2 #include "avatar/avatar.h"
3 #include "io/input-key-acceptor.h"
4 #include "player-info/alignment.h"
5 #include "player-info/race-info.h"
6 #include "player-info/self-info-util.h"
7 #include "player/player-status-table.h"
8 #include "system/player-type-definition.h"
9 #include "term/gameterm.h"
10 #include "term/screen-processor.h"
11 #include "term/z-form.h"
12 #include "util/enum-converter.h"
13 #include "util/string-processor.h"
14 #include <string>
15
16 void display_life_rating(PlayerType *player_ptr, self_info_type *self_ptr)
17 {
18     player_ptr->knowledge |= KNOW_STAT | KNOW_HPRATE;
19     angband_strcpy(self_ptr->plev_buf, "", sizeof(self_ptr->plev_buf));
20     int percent = (int)(((long)player_ptr->player_hp[PY_MAX_LEVEL - 1] * 200L) / (2 * player_ptr->hitdie + ((PY_MAX_LEVEL - 1 + 3) * (player_ptr->hitdie + 1))));
21     strnfmt(self_ptr->plev_buf, sizeof(self_ptr->plev_buf), _("現在の体力ランク : %d/100", "Your current Life Rating is %d/100."), percent);
22     angband_strcpy(self_ptr->buf[0], self_ptr->plev_buf, sizeof(self_ptr->buf[0]));
23     self_ptr->info[self_ptr->line++] = self_ptr->buf[0];
24     self_ptr->info[self_ptr->line++] = "";
25 }
26
27 void display_max_base_status(PlayerType *player_ptr, self_info_type *self_ptr)
28 {
29     self_ptr->info[self_ptr->line++] = _("能力の最大値", "Limits of maximum stats");
30     for (int v_nr = 0; v_nr < A_MAX; v_nr++) {
31         strnfmt(self_ptr->s_string[v_nr], sizeof(self_ptr->s_string[v_nr]), "%s 18/%d", stat_names[v_nr], player_ptr->stat_max_max[v_nr] - 18);
32         self_ptr->info[self_ptr->line++] = self_ptr->s_string[v_nr];
33     }
34 }
35
36 void display_virtue(PlayerType *player_ptr, self_info_type *self_ptr)
37 {
38     self_ptr->info[self_ptr->line++] = "";
39     std::string alg = PlayerAlignment(player_ptr).get_alignment_description(true);
40     strnfmt(self_ptr->plev_buf, sizeof(self_ptr->plev_buf), _("現在の属性 : %s", "Your alignment : %s"), alg.data());
41     angband_strcpy(self_ptr->buf[1], self_ptr->plev_buf, sizeof(self_ptr->buf[1]));
42     self_ptr->info[self_ptr->line++] = self_ptr->buf[1];
43     for (int v_nr = 0; v_nr < 8; v_nr++) {
44         const auto vir_name = virtue_names.at(player_ptr->vir_types[v_nr]).data();
45         std::string vir_desc;
46         int tester = player_ptr->virtues[v_nr];
47         if (tester < -100) {
48             vir_desc = format(_("[%s]の対極 (%d)", "You are the polar opposite of %s (%d)."), vir_name, tester);
49         } else if (tester < -80) {
50             vir_desc = format(_("[%s]の大敵 (%d)", "You are an arch-enemy of %s (%d)."), vir_name, tester);
51         } else if (tester < -60) {
52             vir_desc = format(_("[%s]の強敵 (%d)", "You are a bitter enemy of %s (%d)."), vir_name, tester);
53         } else if (tester < -40) {
54             vir_desc = format(_("[%s]の敵 (%d)", "You are an enemy of %s (%d)."), vir_name, tester);
55         } else if (tester < -20) {
56             vir_desc = format(_("[%s]の罪者 (%d)", "You have sinned against %s (%d)."), vir_name, tester);
57         } else if (tester < 0) {
58             vir_desc = format(_("[%s]の迷道者 (%d)", "You have strayed from the path of %s (%d)."), vir_name, tester);
59         } else if (tester == 0) {
60             vir_desc = format(_("[%s]の中立者 (%d)", "You are neutral to %s (%d)."), vir_name, tester);
61         } else if (tester < 20) {
62             vir_desc = format(_("[%s]の小徳者 (%d)", "You are somewhat virtuous in %s (%d)."), vir_name, tester);
63         } else if (tester < 40) {
64             vir_desc = format(_("[%s]の中徳者 (%d)", "You are virtuous in %s (%d)."), vir_name, tester);
65         } else if (tester < 60) {
66             vir_desc = format(_("[%s]の高徳者 (%d)", "You are very virtuous in %s (%d)."), vir_name, tester);
67         } else if (tester < 80) {
68             vir_desc = format(_("[%s]の覇者 (%d)", "You are a champion of %s (%d)."), vir_name, tester);
69         } else if (tester < 100) {
70             vir_desc = format(_("[%s]の偉大な覇者 (%d)", "You are a great champion of %s (%d)."), vir_name, tester);
71         } else {
72             vir_desc = format(_("[%s]の具現者 (%d)", "You are the living embodiment of %s (%d)."), vir_name, tester);
73         }
74
75         angband_strcpy(self_ptr->v_string[v_nr], vir_desc, sizeof(self_ptr->v_string[v_nr]));
76         self_ptr->info[self_ptr->line++] = self_ptr->v_string[v_nr];
77     }
78 }
79
80 void display_mimic_race_ability(PlayerType *player_ptr, self_info_type *self_ptr)
81 {
82     switch (player_ptr->mimic_form) {
83     case MimicKindType::NONE:
84         return;
85     case MimicKindType::DEMON:
86     case MimicKindType::DEMON_LORD:
87         strnfmt(self_ptr->plev_buf, sizeof(self_ptr->plev_buf), _("あなたは %d ダメージの地獄か火炎のブレスを吐くことができる。(%d MP)", "You can breathe nether, dam. %d (cost %d)."),
88             3 * player_ptr->lev, 10 + player_ptr->lev / 3);
89
90         self_ptr->info[self_ptr->line++] = self_ptr->plev_buf;
91         return;
92     case MimicKindType::VAMPIRE:
93         if (player_ptr->lev <= 1) {
94             break;
95         }
96
97         strnfmt(self_ptr->plev_buf, sizeof(self_ptr->plev_buf), _("あなたは敵から %d-%d HP の生命力を吸収できる。(%d MP)", "You can steal life from a foe, dam. %d-%d (cost %d)."),
98             player_ptr->lev + std::max(1, player_ptr->lev / 10), player_ptr->lev + player_ptr->lev * std::max(1, player_ptr->lev / 10),
99             1 + (player_ptr->lev / 3));
100         self_ptr->info[self_ptr->line++] = self_ptr->plev_buf;
101         return;
102     }
103 }
104
105 void display_self_info(self_info_type *self_ptr)
106 {
107     screen_save();
108     for (int k = 1; k < MAIN_TERM_MIN_ROWS; k++) {
109         prt("", k, 13);
110     }
111
112     prt(_("        あなたの状態:", "     Your Attributes:"), 1, 15);
113     int k = 2;
114     for (int j = 0; j < self_ptr->line; j++) {
115         prt(self_ptr->info[j], k++, 15);
116
117         /* Every 20 entries (lines 2 to 21), start over */
118         if ((k != 22) || (j + 1 >= self_ptr->line)) {
119             continue;
120         }
121
122         prt(_("-- 続く --", "-- more --"), k, 15);
123         inkey();
124         for (; k > 2; k--) {
125             prt("", k, 15);
126         }
127     }
128
129     prt(_("[何かキーを押すとゲームに戻ります]", "[Press any key to continue]"), k, 13);
130     inkey();
131     screen_load();
132 }