1 #include "cmd-building/cmd-inn.h"
2 #include "cmd-item/cmd-magiceat.h"
3 #include "core/turn-compensator.h"
4 #include "game-option/birth-options.h"
5 #include "io/write-diary.h"
6 #include "market/bounty.h"
7 #include "market/building-actions-table.h"
8 #include "player-base/player-class.h"
9 #include "player-base/player-race.h"
10 #include "player-info/magic-eater-data-type.h"
11 #include "player-info/race-info.h"
12 #include "player-info/race-types.h"
13 #include "player/digestion-processor.h"
14 #include "player/eldritch-horror.h"
15 #include "status/bad-status-setter.h"
16 #include "store/rumor.h"
17 #include "system/player-type-definition.h"
18 #include "timed-effect/player-cut.h"
19 #include "timed-effect/player-stun.h"
20 #include "timed-effect/timed-effects.h"
21 #include "view/display-messages.h"
22 #include "world/world.h"
26 * @param player_ptr プレイヤーへの参照ポインタ
27 * @return 満腹ならFALSE、そうでないならTRUE
29 static bool buy_food(player_type *player_ptr)
31 if (player_ptr->food >= PY_FOOD_FULL) {
32 msg_print(_("今は満腹だ。", "You are full now."));
36 msg_print(_("バーテンはいくらかの食べ物とビールをくれた。", "The barkeep gives you some gruel and a beer."));
37 (void)set_food(player_ptr, PY_FOOD_MAX - 1);
42 * @brief 健康体しか宿屋に泊めない処理
43 * @param player_ptr プレイヤーへの参照ポインタ
44 * @return 毒でも切り傷でもないならTRUE、そうでないならFALSE
46 static bool is_healthy_stay(player_type *player_ptr)
48 if (!player_ptr->poisoned && !player_ptr->effects()->cut()->is_cut()) {
52 msg_print(_("あなたに必要なのは部屋ではなく、治療者です。", "You need a healer, not a room."));
54 msg_print(_("すみません、でもうちで誰かに死なれちゃ困りますんで。", "Sorry, but I don't want anyone dying in here."));
59 static bool is_player_undead(player_type *player_ptr)
61 return PlayerRace(player_ptr, true).life() == PlayerRaceLifeType::UNDEAD;
66 * @brief 宿屋に泊まったことを日記に残す
67 * @param player_ptr プレイヤーへの参照ポインタ
68 * @param prev_hour 宿屋に入った直後のゲーム内時刻
70 static void write_diary_stay_inn(player_type *player_ptr, int prev_hour)
72 if ((prev_hour >= 6) && (prev_hour < 18)) {
73 concptr stay_message = _(is_player_undead(player_ptr) ? "宿屋に泊まった。" : "日が暮れるまで宿屋で過ごした。", "stayed during the day at the inn.");
74 exe_write_diary(player_ptr, DIARY_DESCRIPTION, 0, stay_message);
78 concptr stay_message = _(is_player_undead(player_ptr) ? "夜が明けるまで宿屋で過ごした。" : "宿屋に泊まった。", "stayed overnight at the inn.");
79 exe_write_diary(player_ptr, DIARY_DESCRIPTION, 0, stay_message);
83 * @brief 宿泊によってゲーム内ターンを経過させる
86 static void pass_game_turn_by_stay(void)
88 int32_t oldturn = w_ptr->game_turn;
89 w_ptr->game_turn = (w_ptr->game_turn / (TURNS_PER_TICK * TOWN_DAWN / 2) + 1) * (TURNS_PER_TICK * TOWN_DAWN / 2);
90 if (w_ptr->dungeon_turn >= w_ptr->dungeon_turn_limit)
93 w_ptr->dungeon_turn += std::min<int>((w_ptr->game_turn - oldturn), TURNS_PER_TICK * 250) * INN_DUNGEON_TURN_ADJ;
94 if (w_ptr->dungeon_turn > w_ptr->dungeon_turn_limit)
95 w_ptr->dungeon_turn = w_ptr->dungeon_turn_limit;
99 * @brief 悪夢モードなら悪夢を見せる
100 * @param player_ptr プレイヤーへの参照ポインタ
101 * @return 悪夢モードならばTRUE
103 static bool has_a_nightmare(player_type *player_ptr)
105 if (!ironman_nightmare)
108 msg_print(_("眠りに就くと恐ろしい光景が心をよぎった。", "Horrible visions flit through your mind as you sleep."));
111 sanity_blast(player_ptr, nullptr, false);
116 msg_print(_("あなたは絶叫して目を覚ました。", "You awake screaming."));
117 exe_write_diary(player_ptr, DIARY_DESCRIPTION, 0, _("悪夢にうなされてよく眠れなかった。", "had a nightmare."));
123 * @param player_ptr プレイヤーへの参照ポインタ
125 static void back_to_health(player_type *player_ptr)
127 BadStatusSetter bss(player_ptr);
128 (void)bss.blindness(0);
129 (void)bss.confusion(0);
130 player_ptr->effects()->stun()->reset();
131 player_ptr->chp = player_ptr->mhp;
132 player_ptr->csp = player_ptr->msp;
136 * @brief 魔道具術師の取り込んだ魔法をすべて完全に回復した状態にする
137 * @param player_ptr プレイヤーへの参照ポインタ
139 static void charge_magic_eating_energy(player_type *player_ptr)
141 auto magic_eater_data = PlayerClass(player_ptr).get_specific_data<magic_eater_data_type>();
142 if (!magic_eater_data) {
146 for (auto tval : { ItemKindType::STAFF, ItemKindType::WAND }) {
147 for (auto &item : magic_eater_data->get_item_group(tval)) {
148 item.charge = item.count * EATER_CHARGE;
151 for (auto &item : magic_eater_data->get_item_group(ItemKindType::ROD)) {
157 * @brief リフレッシュ結果を画面に表示する
158 * @param player_ptr プレイヤーへの参照ポインタ
159 * @param prev_hour 宿屋に入った直後のゲーム内時刻
161 static void display_stay_result(player_type *player_ptr, int prev_hour)
163 if ((prev_hour >= 6) && (prev_hour < 18)) {
165 char refresh_message_jp[50];
166 sprintf(refresh_message_jp, "%s%s%s", "あなたはリフレッシュして目覚め、", is_player_undead(player_ptr) ? "夜" : "夕方", "を迎えた。");
167 msg_print(refresh_message_jp);
169 msg_print("You awake refreshed for the evening.");
171 concptr awake_message = _(is_player_undead(player_ptr) ? "すがすがしい夜を迎えた。" : "夕方を迎えた。", "awoke refreshed.");
172 exe_write_diary(player_ptr, DIARY_DESCRIPTION, 0, awake_message);
176 msg_print(_("あなたはリフレッシュして目覚め、新たな日を迎えた。", "You awake refreshed for the new day."));
177 concptr awake_message = _(is_player_undead(player_ptr) ? "すがすがしい朝を迎えた。" : "朝を迎えた。", "awoke refreshed.");
178 exe_write_diary(player_ptr, DIARY_DESCRIPTION, 0, awake_message);
183 * @param player_ptr プレイヤーへの参照ポインタ
186 static bool stay_inn(player_type *player_ptr)
188 if (!is_healthy_stay(player_ptr))
191 int prev_day, prev_hour, prev_min;
192 extract_day_hour_min(player_ptr, &prev_day, &prev_hour, &prev_min);
193 write_diary_stay_inn(player_ptr, prev_hour);
195 pass_game_turn_by_stay();
196 prevent_turn_overflow(player_ptr);
198 if ((prev_hour >= 18) && (prev_hour <= 23)) {
199 determine_daily_bounty(player_ptr, false); /* Update daily bounty */
200 exe_write_diary(player_ptr, DIARY_DIALY, 0, nullptr);
203 player_ptr->chp = player_ptr->mhp;
204 if (has_a_nightmare(player_ptr))
207 back_to_health(player_ptr);
208 charge_magic_eating_energy(player_ptr);
210 display_stay_result(player_ptr, prev_hour);
216 * @param player_ptr プレイヤーへの参照ポインタ
217 * @param cmd 宿屋の利用施設ID
218 * @return 施設の利用が実際に行われたらTRUE
219 * @details inn commands
220 * Note that resting for the night was a perfect way to avoid player
221 * ghosts in the town *if* you could only make it to the inn in time (-:
222 * Now that the ghosts are temporarily disabled in 2.8.X, this function
223 * will not be that useful. I will keep it in the hopes the player
224 * ghost code does become a reality again. Does help to avoid filthy urchins.
225 * Resting at night is also a quick way to restock stores -KMW-
226 * @todo 悪夢を見る前後に全回復しているが、何か意図がある?
228 bool inn_comm(player_type *player_ptr, int cmd)
232 return buy_food(player_ptr);
234 return stay_inn(player_ptr);
236 display_rumor(player_ptr, true);
239 //!< @todo リファクタリング前のコードもTRUEだった、FALSEにすべきでは.