X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=src%2Fplayer%2Fdigestion-processor.cpp;h=d0bcfe08f17bf835685c24c9470ed3b12fec4277;hb=23cf9fbcf5bcaddd0d8c2ff163a3c2791c201751;hp=3d4d0d13d53593dcfab75b9f0f5c3d143631542b;hpb=ecf1714e141296e0e29fbf5aa1138c9815d63f72;p=hengbandforosx%2Fhengbandosx.git diff --git a/src/player/digestion-processor.cpp b/src/player/digestion-processor.cpp index 3d4d0d13d..d0bcfe08f 100644 --- a/src/player/digestion-processor.cpp +++ b/src/player/digestion-processor.cpp @@ -1,8 +1,6 @@ #include "player/digestion-processor.h" #include "avatar/avatar.h" #include "core/disturbance.h" -#include "core/player-redraw-types.h" -#include "core/player-update-types.h" #include "core/speed-table.h" #include "core/stuff-handler.h" #include "floor/wild.h" @@ -11,12 +9,16 @@ #include "main/sound-of-music.h" #include "object-enchant/trc-types.h" #include "player-base/player-class.h" +#include "player-info/monk-data-type.h" #include "player-info/samurai-data-type.h" #include "player/player-damage.h" #include "player/player-status.h" #include "player/special-defense-types.h" #include "status/bad-status-setter.h" #include "system/player-type-definition.h" +#include "system/redrawing-flags-updater.h" +#include "timed-effect/player-paralysis.h" +#include "timed-effect/timed-effects.h" #include "view/display-messages.h" #include "world/world.h" @@ -24,46 +26,56 @@ * @brief 10ゲームターンが進行するごとにプレイヤーの腹を減らす * @param player_ptr プレイヤーへの参照ポインタ */ -void starve_player(player_type *player_ptr) +void starve_player(PlayerType *player_ptr) { - if (player_ptr->phase_out) + if (player_ptr->phase_out) { return; + } if (player_ptr->food >= PY_FOOD_MAX) { (void)set_food(player_ptr, player_ptr->food - 100); } else if (!(w_ptr->game_turn % (TURNS_PER_TICK * 5))) { - int digestion = SPEED_TO_ENERGY(player_ptr->pspeed); - if (player_ptr->regenerate) + int digestion = speed_to_energy(player_ptr->pspeed); + if (player_ptr->regenerate) { digestion += 20; - if ((player_ptr->special_defense & (KAMAE_MASK)) || (PlayerClass(player_ptr).get_kata() != SamuraiKata::NONE)) + } + PlayerClass pc(player_ptr); + if (!pc.monk_stance_is(MonkStanceType::NONE) || !pc.samurai_stance_is(SamuraiStanceType::NONE)) { digestion += 20; - if (player_ptr->cursed.has(TRC::FAST_DIGEST)) + } + if (player_ptr->cursed.has(CurseTraitType::FAST_DIGEST)) { digestion += 30; + } - if (player_ptr->slow_digest) + if (player_ptr->slow_digest) { digestion -= 5; + } - if (digestion < 1) + if (digestion < 1) { digestion = 1; - if (digestion > 100) + } + if (digestion > 100) { digestion = 100; + } (void)set_food(player_ptr, player_ptr->food - digestion); } - if ((player_ptr->food >= PY_FOOD_FAINT)) + if ((player_ptr->food >= PY_FOOD_FAINT)) { return; + } - if (!player_ptr->paralyzed && (randint0(100) < 10)) { + if (!player_ptr->effects()->paralysis()->is_paralyzed() && (randint0(100) < 10)) { msg_print(_("あまりにも空腹で気絶してしまった。", "You faint from the lack of food.")); disturb(player_ptr, true, true); (void)BadStatusSetter(player_ptr).mod_paralysis(1 + randint0(5)); } if (player_ptr->food < PY_FOOD_STARVE) { - HIT_POINT dam = (PY_FOOD_STARVE - player_ptr->food) / 10; - if (!is_invuln(player_ptr)) + int dam = (PY_FOOD_STARVE - player_ptr->food) / 10; + if (!is_invuln(player_ptr)) { take_hit(player_ptr, DAMAGE_LOSELIFE, dam, _("空腹", "starvation")); + } } } @@ -93,12 +105,13 @@ void starve_player(player_type *player_ptr) * game turns, or 500/(100/5) = 25 player turns (if nothing else is * affecting the player speed).\n */ -bool set_food(player_type *player_ptr, TIME_EFFECT v) +bool set_food(PlayerType *player_ptr, TIME_EFFECT v) { int old_aux, new_aux; bool notice = false; - v = (v > 20000) ? 20000 : (v < 0) ? 0 : v; + v = (v > 20000) ? 20000 : (v < 0) ? 0 + : v; if (player_ptr->food < PY_FOOD_FAINT) { old_aux = 0; } else if (player_ptr->food < PY_FOOD_WEAK) { @@ -127,14 +140,17 @@ bool set_food(player_type *player_ptr, TIME_EFFECT v) new_aux = 5; } - if (old_aux < 1 && new_aux > 0) - chg_virtue(player_ptr, V_PATIENCE, 2); - else if (old_aux < 3 && (old_aux != new_aux)) - chg_virtue(player_ptr, V_PATIENCE, 1); - if (old_aux == 2) - chg_virtue(player_ptr, V_TEMPERANCE, 1); - if (old_aux == 0) - chg_virtue(player_ptr, V_TEMPERANCE, -1); + if (old_aux < 1 && new_aux > 0) { + chg_virtue(player_ptr, Virtue::PATIENCE, 2); + } else if (old_aux < 3 && (old_aux != new_aux)) { + chg_virtue(player_ptr, Virtue::PATIENCE, 1); + } + if (old_aux == 2) { + chg_virtue(player_ptr, Virtue::TEMPERANCE, 1); + } + if (old_aux == 0) { + chg_virtue(player_ptr, Virtue::TEMPERANCE, -1); + } if (new_aux > old_aux) { switch (new_aux) { @@ -153,9 +169,9 @@ bool set_food(player_type *player_ptr, TIME_EFFECT v) case 5: msg_print(_("食べ過ぎだ!", "You have gorged yourself!")); - chg_virtue(player_ptr, V_HARMONY, -1); - chg_virtue(player_ptr, V_PATIENCE, -1); - chg_virtue(player_ptr, V_TEMPERANCE, -2); + chg_virtue(player_ptr, Virtue::HARMONY, -1); + chg_virtue(player_ptr, Virtue::PATIENCE, -1); + chg_virtue(player_ptr, Virtue::TEMPERANCE, -2); break; } @@ -190,13 +206,17 @@ bool set_food(player_type *player_ptr, TIME_EFFECT v) } player_ptr->food = v; - if (!notice) + if (!notice) { return false; + } - if (disturb_state) + if (disturb_state) { disturb(player_ptr, false, false); - player_ptr->update |= (PU_BONUS); - player_ptr->redraw |= (PR_HUNGER); + } + + auto &rfu = RedrawingFlagsUpdater::get_instance(); + rfu.set_flag(StatusRedrawingFlag::BONUS); + rfu.set_flag(MainWindowRedrawingFlag::HUNGER); handle_stuff(player_ptr); return true;