OSDN Git Service

[Refactor] #39970 Separated occur_curse_effect() from execute_cursed_items_effect()
authorHourier <hourier@users.sourceforge.jp>
Sun, 10 May 2020 06:15:32 +0000 (15:15 +0900)
committerHourier <hourier@users.sourceforge.jp>
Sun, 10 May 2020 06:15:32 +0000 (15:15 +0900)
src/inventory/inventory-curse.c

index dc74f31..77f6ea1 100644 (file)
@@ -120,187 +120,191 @@ object_type *choose_cursed_obj_name(player_type* player_ptr, BIT_FLAGS flag)
     return &player_ptr->inventory_list[choices[randint0(number)]];
 }
 
-/*!
- * @brief 10ゲームターンが進行するごとに装備効果の発動判定を行う処理
- * / Handle curse effects once every 10 game turns
- * @return なし
- */
-void process_world_aux_curse(player_type* creature_ptr)
+static void occur_curse_effect(player_type *creature_ptr)
 {
-    if ((creature_ptr->cursed & TRC_P_FLAG_MASK) && !creature_ptr->phase_out && !creature_ptr->wild_mode) {
-        /*
-                * Hack: Uncursed teleporting items (e.g. Trump Weapons)
-                * can actually be useful!
-                */
-        if ((creature_ptr->cursed & TRC_TELEPORT_SELF) && one_in_(200)) {
-            GAME_TEXT o_name[MAX_NLEN];
-            object_type* o_ptr;
-            int i_keep = 0, count = 0;
-            for (int i = INVEN_RARM; i < INVEN_TOTAL; i++) {
-                BIT_FLAGS flgs[TR_FLAG_SIZE];
-                o_ptr = &creature_ptr->inventory_list[i];
-                if (!o_ptr->k_idx)
-                    continue;
-
-                object_flags(o_ptr, flgs);
-
-                if (have_flag(flgs, TR_TELEPORT)) {
-                    /* {.} will stop random teleportation. */
-                    if (!o_ptr->inscription || !my_strchr(quark_str(o_ptr->inscription), '.')) {
-                        count++;
-                        if (one_in_(count))
-                            i_keep = i;
-                    }
-                }
-            }
-
-            o_ptr = &creature_ptr->inventory_list[i_keep];
-            object_desc(creature_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
-            msg_format(_("%sがテレポートの能力を発動させようとしている。", "Your %s is activating teleportation."), o_name);
-            if (get_check_strict(_("テレポートしますか?", "Teleport? "), CHECK_OKAY_CANCEL)) {
-                disturb(creature_ptr, FALSE, TRUE);
-                teleport_player(creature_ptr, 50, TELEPORT_SPONTANEOUS);
-            } else {
-                msg_format(_("%sに{.}(ピリオド)と銘を刻むと発動を抑制できます。",
-                               "You can inscribe {.} on your %s to disable random teleportation. "),
-                    o_name);
-                disturb(creature_ptr, TRUE, TRUE);
-            }
-        }
+    if (((creature_ptr->cursed & TRC_P_FLAG_MASK) == 0) || creature_ptr->phase_out || creature_ptr->wild_mode)
+        return;
 
-        if ((creature_ptr->cursed & TRC_CHAINSWORD) && one_in_(CHAINSWORD_NOISE)) {
-            char noise[1024];
-            if (!get_rnd_line(_("chainswd_j.txt", "chainswd.txt"), 0, noise))
-                msg_print(noise);
-            disturb(creature_ptr, FALSE, FALSE);
-        }
+    if ((creature_ptr->cursed & TRC_TELEPORT_SELF) && one_in_(200)) {
+        GAME_TEXT o_name[MAX_NLEN];
+        object_type* o_ptr;
+        int i_keep = 0, count = 0;
+        for (int i = INVEN_RARM; i < INVEN_TOTAL; i++) {
+            BIT_FLAGS flgs[TR_FLAG_SIZE];
+            o_ptr = &creature_ptr->inventory_list[i];
+            if (!o_ptr->k_idx)
+                continue;
 
-        if ((creature_ptr->cursed & TRC_TY_CURSE) && one_in_(TY_CURSE_CHANCE)) {
-            int count = 0;
-            (void)activate_ty_curse(creature_ptr, FALSE, &count);
-        }
+            object_flags(o_ptr, flgs);
 
-        if (creature_ptr->prace != RACE_ANDROID && ((creature_ptr->cursed & TRC_DRAIN_EXP) && one_in_(4))) {
-            creature_ptr->exp -= (creature_ptr->lev + 1) / 2;
-            if (creature_ptr->exp < 0)
-                creature_ptr->exp = 0;
-            creature_ptr->max_exp -= (creature_ptr->lev + 1) / 2;
-            if (creature_ptr->max_exp < 0)
-                creature_ptr->max_exp = 0;
-            check_experience(creature_ptr);
+            if (have_flag(flgs, TR_TELEPORT)) {
+                /* {.} will stop random teleportation. */
+                if (!o_ptr->inscription || !my_strchr(quark_str(o_ptr->inscription), '.')) {
+                    count++;
+                    if (one_in_(count))
+                        i_keep = i;
+                }
+            }
         }
 
-        if ((creature_ptr->cursed & TRC_ADD_L_CURSE) && one_in_(2000)) {
-            object_type* o_ptr;
-            o_ptr = choose_cursed_obj_name(creature_ptr, TRC_ADD_L_CURSE);
-            BIT_FLAGS new_curse = get_curse(0, o_ptr);
-            if (!(o_ptr->curse_flags & new_curse)) {
-                GAME_TEXT o_name[MAX_NLEN];
-                object_desc(creature_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
-                o_ptr->curse_flags |= new_curse;
-                msg_format(_("悪意に満ちた黒いオーラが%sをとりまいた...", "There is a malignant black aura surrounding your %s..."), o_name);
-                o_ptr->feeling = FEEL_NONE;
-                creature_ptr->update |= (PU_BONUS);
-            }
+        o_ptr = &creature_ptr->inventory_list[i_keep];
+        object_desc(creature_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
+        msg_format(_("%sがテレポートの能力を発動させようとしている。", "Your %s is activating teleportation."), o_name);
+        if (get_check_strict(_("テレポートしますか?", "Teleport? "), CHECK_OKAY_CANCEL)) {
+            disturb(creature_ptr, FALSE, TRUE);
+            teleport_player(creature_ptr, 50, TELEPORT_SPONTANEOUS);
+        } else {
+            msg_format(_("%sに{.}(ピリオド)と銘を刻むと発動を抑制できます。",
+                           "You can inscribe {.} on your %s to disable random teleportation. "),
+                o_name);
+            disturb(creature_ptr, TRUE, TRUE);
         }
+    }
 
-        if ((creature_ptr->cursed & TRC_ADD_H_CURSE) && one_in_(2000)) {
-            object_type* o_ptr;
-            o_ptr = choose_cursed_obj_name(creature_ptr, TRC_ADD_H_CURSE);
-            BIT_FLAGS new_curse = get_curse(1, o_ptr);
-            if (!(o_ptr->curse_flags & new_curse)) {
-                GAME_TEXT o_name[MAX_NLEN];
+    if ((creature_ptr->cursed & TRC_CHAINSWORD) && one_in_(CHAINSWORD_NOISE)) {
+        char noise[1024];
+        if (!get_rnd_line(_("chainswd_j.txt", "chainswd.txt"), 0, noise))
+            msg_print(noise);
+        disturb(creature_ptr, FALSE, FALSE);
+    }
 
-                object_desc(creature_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
+    if ((creature_ptr->cursed & TRC_TY_CURSE) && one_in_(TY_CURSE_CHANCE)) {
+        int count = 0;
+        (void)activate_ty_curse(creature_ptr, FALSE, &count);
+    }
 
-                o_ptr->curse_flags |= new_curse;
-                msg_format(_("悪意に満ちた黒いオーラが%sをとりまいた...", "There is a malignant black aura surrounding your %s..."), o_name);
-                o_ptr->feeling = FEEL_NONE;
+    if (creature_ptr->prace != RACE_ANDROID && ((creature_ptr->cursed & TRC_DRAIN_EXP) && one_in_(4))) {
+        creature_ptr->exp -= (creature_ptr->lev + 1) / 2;
+        if (creature_ptr->exp < 0)
+            creature_ptr->exp = 0;
+        creature_ptr->max_exp -= (creature_ptr->lev + 1) / 2;
+        if (creature_ptr->max_exp < 0)
+            creature_ptr->max_exp = 0;
+        check_experience(creature_ptr);
+    }
 
-                creature_ptr->update |= (PU_BONUS);
-            }
+    if ((creature_ptr->cursed & TRC_ADD_L_CURSE) && one_in_(2000)) {
+        object_type* o_ptr;
+        o_ptr = choose_cursed_obj_name(creature_ptr, TRC_ADD_L_CURSE);
+        BIT_FLAGS new_curse = get_curse(0, o_ptr);
+        if (!(o_ptr->curse_flags & new_curse)) {
+            GAME_TEXT o_name[MAX_NLEN];
+            object_desc(creature_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
+            o_ptr->curse_flags |= new_curse;
+            msg_format(_("悪意に満ちた黒いオーラが%sをとりまいた...", "There is a malignant black aura surrounding your %s..."), o_name);
+            o_ptr->feeling = FEEL_NONE;
+            creature_ptr->update |= (PU_BONUS);
         }
+    }
 
-        if ((creature_ptr->cursed & TRC_CALL_ANIMAL) && one_in_(2500)) {
-            if (summon_specific(creature_ptr, 0, creature_ptr->y, creature_ptr->x, creature_ptr->current_floor_ptr->dun_level, SUMMON_ANIMAL, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET))) {
-                GAME_TEXT o_name[MAX_NLEN];
-                object_desc(creature_ptr, o_name, choose_cursed_obj_name(creature_ptr, TRC_CALL_ANIMAL), (OD_OMIT_PREFIX | OD_NAME_ONLY));
-                msg_format(_("%sが動物を引き寄せた!", "Your %s has attracted an animal!"), o_name);
-                disturb(creature_ptr, FALSE, TRUE);
-            }
-        }
+    if ((creature_ptr->cursed & TRC_ADD_H_CURSE) && one_in_(2000)) {
+        object_type* o_ptr;
+        o_ptr = choose_cursed_obj_name(creature_ptr, TRC_ADD_H_CURSE);
+        BIT_FLAGS new_curse = get_curse(1, o_ptr);
+        if (!(o_ptr->curse_flags & new_curse)) {
+            GAME_TEXT o_name[MAX_NLEN];
 
-        if ((creature_ptr->cursed & TRC_CALL_DEMON) && one_in_(1111)) {
-            if (summon_specific(creature_ptr, 0, creature_ptr->y, creature_ptr->x, creature_ptr->current_floor_ptr->dun_level, SUMMON_DEMON, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET))) {
-                GAME_TEXT o_name[MAX_NLEN];
-                object_desc(creature_ptr, o_name, choose_cursed_obj_name(creature_ptr, TRC_CALL_DEMON), (OD_OMIT_PREFIX | OD_NAME_ONLY));
-                msg_format(_("%sが悪魔を引き寄せた!", "Your %s has attracted a demon!"), o_name);
-                disturb(creature_ptr, FALSE, TRUE);
-            }
-        }
+            object_desc(creature_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
 
-        if ((creature_ptr->cursed & TRC_CALL_DRAGON) && one_in_(800)) {
-            if (summon_specific(creature_ptr, 0, creature_ptr->y, creature_ptr->x, creature_ptr->current_floor_ptr->dun_level, SUMMON_DRAGON,
-                    (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET))) {
-                GAME_TEXT o_name[MAX_NLEN];
-                object_desc(creature_ptr, o_name, choose_cursed_obj_name(creature_ptr, TRC_CALL_DRAGON), (OD_OMIT_PREFIX | OD_NAME_ONLY));
-                msg_format(_("%sがドラゴンを引き寄せた!", "Your %s has attracted an dragon!"), o_name);
-                disturb(creature_ptr, FALSE, TRUE);
-            }
-        }
+            o_ptr->curse_flags |= new_curse;
+            msg_format(_("悪意に満ちた黒いオーラが%sをとりまいた...", "There is a malignant black aura surrounding your %s..."), o_name);
+            o_ptr->feeling = FEEL_NONE;
 
-        if ((creature_ptr->cursed & TRC_CALL_UNDEAD) && one_in_(1111)) {
-            if (summon_specific(creature_ptr, 0, creature_ptr->y, creature_ptr->x, creature_ptr->current_floor_ptr->dun_level, SUMMON_UNDEAD,
-                    (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET))) {
-                GAME_TEXT o_name[MAX_NLEN];
-                object_desc(creature_ptr, o_name, choose_cursed_obj_name(creature_ptr, TRC_CALL_UNDEAD), (OD_OMIT_PREFIX | OD_NAME_ONLY));
-                msg_format(_("%sが死霊を引き寄せた!", "Your %s has attracted an undead!"), o_name);
-                disturb(creature_ptr, FALSE, TRUE);
-            }
+            creature_ptr->update |= (PU_BONUS);
         }
+    }
 
-        if ((creature_ptr->cursed & TRC_COWARDICE) && one_in_(1500)) {
-            if (!creature_ptr->resist_fear) {
-                disturb(creature_ptr, FALSE, TRUE);
-                msg_print(_("とても暗い... とても恐い!", "It's so dark... so scary!"));
-                set_afraid(creature_ptr, creature_ptr->afraid + 13 + randint1(26));
-            }
+    if ((creature_ptr->cursed & TRC_CALL_ANIMAL) && one_in_(2500)) {
+        if (summon_specific(creature_ptr, 0, creature_ptr->y, creature_ptr->x, creature_ptr->current_floor_ptr->dun_level, SUMMON_ANIMAL, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET))) {
+            GAME_TEXT o_name[MAX_NLEN];
+            object_desc(creature_ptr, o_name, choose_cursed_obj_name(creature_ptr, TRC_CALL_ANIMAL), (OD_OMIT_PREFIX | OD_NAME_ONLY));
+            msg_format(_("%sが動物を引き寄せた!", "Your %s has attracted an animal!"), o_name);
+            disturb(creature_ptr, FALSE, TRUE);
         }
+    }
 
-        if ((creature_ptr->cursed & TRC_TELEPORT) && one_in_(200) && !creature_ptr->anti_tele) {
+    if ((creature_ptr->cursed & TRC_CALL_DEMON) && one_in_(1111)) {
+        if (summon_specific(creature_ptr, 0, creature_ptr->y, creature_ptr->x, creature_ptr->current_floor_ptr->dun_level, SUMMON_DEMON, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET))) {
+            GAME_TEXT o_name[MAX_NLEN];
+            object_desc(creature_ptr, o_name, choose_cursed_obj_name(creature_ptr, TRC_CALL_DEMON), (OD_OMIT_PREFIX | OD_NAME_ONLY));
+            msg_format(_("%sが悪魔を引き寄せた!", "Your %s has attracted a demon!"), o_name);
             disturb(creature_ptr, FALSE, TRUE);
-            teleport_player(creature_ptr, 40, TELEPORT_PASSIVE);
         }
+    }
 
-        if ((creature_ptr->cursed & TRC_DRAIN_HP) && one_in_(666)) {
+    if ((creature_ptr->cursed & TRC_CALL_DRAGON) && one_in_(800)) {
+        if (summon_specific(creature_ptr, 0, creature_ptr->y, creature_ptr->x, creature_ptr->current_floor_ptr->dun_level, SUMMON_DRAGON,
+                (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET))) {
             GAME_TEXT o_name[MAX_NLEN];
-            object_desc(creature_ptr, o_name, choose_cursed_obj_name(creature_ptr, TRC_DRAIN_HP), (OD_OMIT_PREFIX | OD_NAME_ONLY));
-            msg_format(_("%sã\81¯ã\81\82ã\81ªã\81\9fã\81®ä½\93å\8a\9bã\82\92å\90¸å\8f\8eã\81\97ã\81\9fï¼\81", "Your %s drains HP from you!"), o_name);
-            take_hit(creature_ptr, DAMAGE_LOSELIFE, MIN(creature_ptr->lev * 2, 100), o_name, -1);
+            object_desc(creature_ptr, o_name, choose_cursed_obj_name(creature_ptr, TRC_CALL_DRAGON), (OD_OMIT_PREFIX | OD_NAME_ONLY));
+            msg_format(_("%sã\81\8cã\83\89ã\83©ã\82´ã\83³ã\82\92å¼\95ã\81\8då¯\84ã\81\9bã\81\9fï¼\81", "Your %s has attracted an dragon!"), o_name);
+            disturb(creature_ptr, FALSE, TRUE);
         }
+    }
 
-        if ((creature_ptr->cursed & TRC_DRAIN_MANA) && creature_ptr->csp && one_in_(666)) {
+    if ((creature_ptr->cursed & TRC_CALL_UNDEAD) && one_in_(1111)) {
+        if (summon_specific(creature_ptr, 0, creature_ptr->y, creature_ptr->x, creature_ptr->current_floor_ptr->dun_level, SUMMON_UNDEAD,
+                (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET))) {
             GAME_TEXT o_name[MAX_NLEN];
-            object_desc(creature_ptr, o_name, choose_cursed_obj_name(creature_ptr, TRC_DRAIN_MANA), (OD_OMIT_PREFIX | OD_NAME_ONLY));
-            msg_format(_("%sはあなたの魔力を吸収した!", "Your %s drains mana from you!"), o_name);
-            creature_ptr->csp -= MIN(creature_ptr->lev, 50);
-            if (creature_ptr->csp < 0) {
-                creature_ptr->csp = 0;
-                creature_ptr->csp_frac = 0;
-            }
+            object_desc(creature_ptr, o_name, choose_cursed_obj_name(creature_ptr, TRC_CALL_UNDEAD), (OD_OMIT_PREFIX | OD_NAME_ONLY));
+            msg_format(_("%sが死霊を引き寄せた!", "Your %s has attracted an undead!"), o_name);
+            disturb(creature_ptr, FALSE, TRUE);
+        }
+    }
 
-            creature_ptr->redraw |= PR_MANA;
+    if ((creature_ptr->cursed & TRC_COWARDICE) && one_in_(1500)) {
+        if (!creature_ptr->resist_fear) {
+            disturb(creature_ptr, FALSE, TRUE);
+            msg_print(_("とても暗い... とても恐い!", "It's so dark... so scary!"));
+            set_afraid(creature_ptr, creature_ptr->afraid + 13 + randint1(26));
         }
     }
 
-    if (one_in_(999) && !creature_ptr->anti_magic) {
-        object_type* o_ptr = &creature_ptr->inventory_list[INVEN_LITE];
-        if (o_ptr->name1 == ART_JUDGE) {
-            if (object_is_known(o_ptr))
-                msg_print(_("『審判の宝石』はあなたの体力を吸収した!", "The Jewel of Judgement drains life from you!"));
-            else
-                msg_print(_("なにかがあなたの体力を吸収した!", "Something drains life from you!"));
-            take_hit(creature_ptr, DAMAGE_LOSELIFE, MIN(creature_ptr->lev, 50), _("審判の宝石", "the Jewel of Judgement"), -1);
+    if ((creature_ptr->cursed & TRC_TELEPORT) && one_in_(200) && !creature_ptr->anti_tele) {
+        disturb(creature_ptr, FALSE, TRUE);
+        teleport_player(creature_ptr, 40, TELEPORT_PASSIVE);
+    }
+
+    if ((creature_ptr->cursed & TRC_DRAIN_HP) && one_in_(666)) {
+        GAME_TEXT o_name[MAX_NLEN];
+        object_desc(creature_ptr, o_name, choose_cursed_obj_name(creature_ptr, TRC_DRAIN_HP), (OD_OMIT_PREFIX | OD_NAME_ONLY));
+        msg_format(_("%sはあなたの体力を吸収した!", "Your %s drains HP from you!"), o_name);
+        take_hit(creature_ptr, DAMAGE_LOSELIFE, MIN(creature_ptr->lev * 2, 100), o_name, -1);
+    }
+
+    if ((creature_ptr->cursed & TRC_DRAIN_MANA) && creature_ptr->csp && one_in_(666)) {
+        GAME_TEXT o_name[MAX_NLEN];
+        object_desc(creature_ptr, o_name, choose_cursed_obj_name(creature_ptr, TRC_DRAIN_MANA), (OD_OMIT_PREFIX | OD_NAME_ONLY));
+        msg_format(_("%sはあなたの魔力を吸収した!", "Your %s drains mana from you!"), o_name);
+        creature_ptr->csp -= MIN(creature_ptr->lev, 50);
+        if (creature_ptr->csp < 0) {
+            creature_ptr->csp = 0;
+            creature_ptr->csp_frac = 0;
         }
+
+        creature_ptr->redraw |= PR_MANA;
     }
 }
+
+/*!
+ * @brief 10ゲームターンが進行するごとに装備効果の発動判定を行う処理
+ * / Handle curse effects once every 10 game turns
+ * @return なし
+ */
+void execute_cursed_items_effect(player_type* creature_ptr)
+{
+    occur_curse_effect(creature_ptr);
+    if (!one_in_(999) || creature_ptr->anti_magic)
+        return;
+
+    object_type* o_ptr = &creature_ptr->inventory_list[INVEN_LITE];
+    if (o_ptr->name1 != ART_JUDGE)
+        return;
+
+    if (object_is_known(o_ptr))
+        msg_print(_("『審判の宝石』はあなたの体力を吸収した!", "The Jewel of Judgement drains life from you!"));
+    else
+        msg_print(_("なにかがあなたの体力を吸収した!", "Something drains life from you!"));
+
+    take_hit(creature_ptr, DAMAGE_LOSELIFE, MIN(creature_ptr->lev, 50), _("審判の宝石", "the Jewel of Judgement"), -1);
+}