From 3e7d13d9c3d4ea082d824defc8b4b2eb1254277b Mon Sep 17 00:00:00 2001 From: Hourier <66951241+Hourier@users.noreply.github.com> Date: Mon, 30 Oct 2023 22:13:13 +0900 Subject: [PATCH] =?utf8?q?[Refactor]=20#3779=20extract=5Fday=5Fhour=5Fmin(?= =?utf8?q?)=20=E3=82=92AngbandWorld=20=E3=81=AE=E3=82=AA=E3=83=96=E3=82=B8?= =?utf8?q?=E3=82=A7=E3=82=AF=E3=83=88=E3=83=A1=E3=82=BD=E3=83=83=E3=83=89?= =?utf8?q?=E3=81=B8=E7=B9=B0=E3=82=8A=E8=BE=BC=E3=82=93=E3=81=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- src/cmd-building/cmd-inn.cpp | 3 +-- src/cmd-io/cmd-dump.cpp | 5 ++--- src/io/write-diary.cpp | 17 +++++------------ src/view/display-player-middle.cpp | 17 ++++++----------- src/world/world-turn-processor.cpp | 16 +++++++--------- src/world/world.cpp | 29 ++++++++++++++--------------- src/world/world.h | 4 +++- 7 files changed, 38 insertions(+), 53 deletions(-) diff --git a/src/cmd-building/cmd-inn.cpp b/src/cmd-building/cmd-inn.cpp index 3ef092750..fe61097f9 100644 --- a/src/cmd-building/cmd-inn.cpp +++ b/src/cmd-building/cmd-inn.cpp @@ -192,8 +192,7 @@ static bool stay_inn(PlayerType *player_ptr) return false; } - int prev_day, prev_hour, prev_min; - extract_day_hour_min(player_ptr, &prev_day, &prev_hour, &prev_min); + const auto &[prev_day, prev_hour, prev_min] = w_ptr->extract_date_time(player_ptr->start_race); write_diary_stay_inn(player_ptr, prev_hour); pass_game_turn_by_stay(); diff --git a/src/cmd-io/cmd-dump.cpp b/src/cmd-io/cmd-dump.cpp index 0f2f8b59d..65b34c1ca 100644 --- a/src/cmd-io/cmd-dump.cpp +++ b/src/cmd-io/cmd-dump.cpp @@ -272,9 +272,7 @@ void do_cmd_feeling(PlayerType *player_ptr) */ void do_cmd_time(PlayerType *player_ptr) { - int day, hour, min; - extract_day_hour_min(player_ptr, &day, &hour, &min); - std::string desc = _("変な時刻だ。", "It is a strange time."); + const auto &[day, hour, min] = w_ptr->extract_date_time(player_ptr->start_race); std::string day_buf = (day < MAX_DAYS) ? std::to_string(day) : "*****"; constexpr auto mes = _("%s日目, 時刻は%d:%02d %sです。", "This is day %s. The time is %d:%02d %s."); msg_format(mes, day_buf.data(), (hour % 12 == 0) ? 12 : (hour % 12), min, (hour < 12) ? "AM" : "PM"); @@ -290,6 +288,7 @@ void do_cmd_time(PlayerType *player_ptr) return; } + std::string desc = _("変な時刻だ。", "It is a strange time."); auto full = hour * 100 + min; auto start = 9999; auto end = -9999; diff --git a/src/io/write-diary.cpp b/src/io/write-diary.cpp index 531e5e1ec..c6a45cba3 100644 --- a/src/io/write-diary.cpp +++ b/src/io/write-diary.cpp @@ -173,11 +173,8 @@ static void write_diary_pet(FILE *fff, int num, std::string_view note) */ int exe_write_diary_quest(PlayerType *player_ptr, DiaryKind dk, QuestId num) { - static bool disable_diary = false; - - int day, hour, min; - extract_day_hour_min(player_ptr, &day, &hour, &min); - + static auto disable_diary = false; + const auto &[day, hour, min] = w_ptr->extract_date_time(player_ptr->start_race); if (disable_diary) { return -1; } @@ -198,8 +195,7 @@ int exe_write_diary_quest(PlayerType *player_ptr, DiaryKind dk, QuestId num) return -1; } - bool do_level = true; - + auto do_level = true; switch (dk) { case DiaryKind::FIX_QUEST_C: { if (any_bits(quest.flags, QUEST_FLAG_SILENT)) { @@ -258,11 +254,8 @@ int exe_write_diary_quest(PlayerType *player_ptr, DiaryKind dk, QuestId num) */ void exe_write_diary(PlayerType *player_ptr, DiaryKind dk, int num, std::string_view note) { - static bool disable_diary = false; - - int day, hour, min; - extract_day_hour_min(player_ptr, &day, &hour, &min); - + static auto disable_diary = false; + const auto &[day, hour, min] = w_ptr->extract_date_time(player_ptr->start_race); if (disable_diary) { return; } diff --git a/src/view/display-player-middle.cpp b/src/view/display-player-middle.cpp index b82b31948..acbfc48b5 100644 --- a/src/view/display-player-middle.cpp +++ b/src/view/display-player-middle.cpp @@ -280,20 +280,15 @@ static void display_player_exp(PlayerType *player_ptr) /*! * @brief ゲーム内の経過時間を表示する * @param player_ptr プレイヤーへの参照ポインタ + * @details fmt をstring で受けているのはClang対策 */ static void display_playtime_in_game(PlayerType *player_ptr) { - int day, hour, min; - extract_day_hour_min(player_ptr, &day, &hour, &min); - - std::string buf; - if (day < MAX_DAYS) { - buf = format(_("%d日目 %2d:%02d", "Day %d %2d:%02d"), day, hour, min); - } else { - buf = format(_("*****日目 %2d:%02d", "Day ***** %2d:%02d"), hour, min); - } - - display_player_one_line(ENTRY_DAY, buf, TERM_L_GREEN); + const auto &[day, hour, min] = w_ptr->extract_date_time(player_ptr->start_race); + const auto is_days_countable = day < MAX_DAYS; + const std::string fmt = is_days_countable ? _("%d日目 %2d:%02d", "Day %d %2d:%02d") : _("*****日目 %2d:%02d", "Day ***** %2d:%02d"); + const auto mes = is_days_countable ? format(fmt.data(), day, hour, min) : format(fmt.data(), hour, min); + display_player_one_line(ENTRY_DAY, mes, TERM_L_GREEN); if (player_ptr->chp >= player_ptr->mhp) { display_player_one_line(ENTRY_HP, format("%4d/%4d", player_ptr->chp, player_ptr->mhp), TERM_L_GREEN); diff --git a/src/world/world-turn-processor.cpp b/src/world/world-turn-processor.cpp index 970687866..3ea111def 100644 --- a/src/world/world-turn-processor.cpp +++ b/src/world/world-turn-processor.cpp @@ -57,12 +57,10 @@ WorldTurnProcessor::WorldTurnProcessor(PlayerType *player_ptr) */ void WorldTurnProcessor::process_world() { - const int32_t a_day = TURNS_PER_TICK * TOWN_DAWN; - int32_t prev_turn_in_today = ((w_ptr->game_turn - TURNS_PER_TICK) % a_day + a_day / 4) % a_day; - int prev_min = (1440 * prev_turn_in_today / a_day) % 60; - - int dummy_day; - extract_day_hour_min(this->player_ptr, &dummy_day, &this->hour, &this->min); + const int a_day = TURNS_PER_TICK * TOWN_DAWN; + const int prev_turn_in_today = ((w_ptr->game_turn - TURNS_PER_TICK) % a_day + a_day / 4) % a_day; + const int prev_min = (1440 * prev_turn_in_today / a_day) % 60; + std::tie(std::ignore, this->hour, this->min) = w_ptr->extract_date_time(this->player_ptr->start_race); update_dungeon_feeling(this->player_ptr); process_downward(); process_monster_arena(); @@ -78,7 +76,7 @@ void WorldTurnProcessor::process_world() process_change_daytime_night(); process_world_monsters(); - if (!this->hour && !this->min) { + if ((this->hour == 0) && (this->min == 0)) { if (this->min != prev_min) { exe_write_diary(this->player_ptr, DiaryKind::DIALY, 0); determine_daily_bounty(this->player_ptr, false); @@ -108,9 +106,9 @@ void WorldTurnProcessor::print_time() const auto &[wid, hgt] = term_get_size(); const auto row = hgt + ROW_DAY; - int day; c_put_str(TERM_WHITE, " ", row, COL_DAY); - extract_day_hour_min(this->player_ptr, &day, &this->hour, &this->min); + auto day = 0; + std::tie(day, this->hour, this->min) = w_ptr->extract_date_time(this->player_ptr->start_race); if (day < 1000) { c_put_str(TERM_WHITE, format(_("%2d日目", "Day%3d"), day), row, COL_DAY); } else { diff --git a/src/world/world.cpp b/src/world/world.cpp index bafbe800c..30eec9893 100644 --- a/src/world/world.cpp +++ b/src/world/world.cpp @@ -40,31 +40,30 @@ bool is_daytime(void) } /*! - * @brief 現在の日数、時刻を返す / - * Extract day, hour, min - * @param player_ptr プレイヤーへの参照ポインタ - * @param day 日数を返すための参照ポインタ - * @param hour 時数を返すための参照ポインタ - * @param min 分数を返すための参照ポインタ + * @brief プレイ開始からの経過時間を計算する + * @param start_race 開始時のプレイヤー種族 + * @return 日数、時間、分 */ -void extract_day_hour_min(PlayerType *player_ptr, int *day, int *hour, int *min) +std::tuple AngbandWorld::extract_date_time(PlayerRaceType start_race) const { - const int32_t A_DAY = TURNS_PER_TICK * TOWN_DAWN; - int32_t turn_in_today = (w_ptr->game_turn + A_DAY / 4) % A_DAY; - - switch (player_ptr->start_race) { + const auto a_day = TURNS_PER_TICK * TOWN_DAWN; + const auto turn_in_today = (this->game_turn + a_day / 4) % a_day; + int day; + switch (start_race) { case PlayerRaceType::VAMPIRE: case PlayerRaceType::SKELETON: case PlayerRaceType::ZOMBIE: case PlayerRaceType::SPECTRE: - *day = (w_ptr->game_turn - A_DAY * 3 / 4) / A_DAY + 1; + day = (this->game_turn - a_day * 3 / 4) / a_day + 1; break; default: - *day = (w_ptr->game_turn + A_DAY / 4) / A_DAY + 1; + day = (this->game_turn + a_day / 4) / a_day + 1; break; } - *hour = (24 * turn_in_today / A_DAY) % 24; - *min = (1440 * turn_in_today / A_DAY) % 60; + + auto hour = (24 * turn_in_today / a_day) % 24; + auto min = (1440 * turn_in_today / a_day) % 60; + return { day, hour, min }; } /*! diff --git a/src/world/world.h b/src/world/world.h index 61f34320b..c9ce21376 100644 --- a/src/world/world.h +++ b/src/world/world.h @@ -5,12 +5,14 @@ #include "system/angband.h" #include "util/flag-group.h" #include "util/rng-xoshiro.h" +#include constexpr auto MAX_BOUNTY = 20; /*! * @brief 世界情報構造体 */ +enum class PlayerRaceType; class AngbandWorld { public: AngbandWorld() = default; @@ -72,6 +74,7 @@ public: void set_arena(const bool new_status); bool get_arena() const; + std::tuple extract_date_time(PlayerRaceType start_race) const; private: bool is_out_arena = false; // アリーナ外部にいる時だけtrue. @@ -81,7 +84,6 @@ extern AngbandWorld *w_ptr; class PlayerType; bool is_daytime(void); -void extract_day_hour_min(PlayerType *player_ptr, int *day, int *hour, int *min); void update_playtime(void); void add_winner_class(PlayerClassType c); void add_retired_class(PlayerClassType c); -- 2.11.0