OSDN Git Service

[Refactor] #40573 Moved cast_mindcrafter_spell() from mind-switcher.c to mind-mindcra...
authorHourier <hourier@users.sourceforge.jp>
Wed, 29 Jul 2020 11:24:18 +0000 (20:24 +0900)
committerHourier <hourier@users.sourceforge.jp>
Wed, 29 Jul 2020 11:24:18 +0000 (20:24 +0900)
src/mind/mind-mindcrafter.c
src/mind/mind-mindcrafter.h
src/mind/mind-switcher.c

index 15e222c..72e1730 100644 (file)
@@ -1,19 +1,39 @@
 #include "mind/mind-mindcrafter.h"
 #include "autopick/autopick.h"
+#include "core/hp-mp-processor.h"
 #include "core/player-update-types.h"
 #include "core/window-redrawer.h"
+#include "effect/effect-characteristics.h"
 #include "flavor/flag-inscriptions-table.h"
 #include "flavor/flavor-describer.h"
 #include "flavor/object-flavor-types.h"
 #include "floor/floor-object.h"
 #include "game-option/auto-destruction-options.h"
+#include "mind/mind-caster.h"
+#include "mind/mind-mindcrafter.h"
 #include "object-enchant/item-feeling.h"
 #include "object-enchant/special-object-flags.h"
 #include "object/item-use-flags.h"
 #include "object/object-mark-types.h"
 #include "perception/object-perception.h"
 #include "perception/simple-perception.h"
+#include "player/avatar.h"
+#include "spell-kind/spells-detection.h"
+#include "spell-kind/spells-fetcher.h"
+#include "spell-kind/spells-floor.h"
+#include "spell-kind/spells-launcher.h"
+#include "spell-kind/spells-perception.h"
+#include "spell-kind/spells-sight.h"
+#include "spell-kind/spells-teleport.h"
+#include "spell/process-effect.h"
+#include "spell/spell-types.h"
+#include "spell/spells-status.h"
+#include "status/bad-status-setter.h"
+#include "status/buff-setter.h"
+#include "status/element-resistance.h"
+#include "status/sight-setter.h"
 #include "system/object-type-definition.h"
+#include "target/target-getter.h"
 #include "view/display-messages.h"
 
 /*!
@@ -97,3 +117,155 @@ bool psychometry(player_type *caster_ptr)
     autopick_alter_item(caster_ptr, item, (bool)(okay && destroy_feeling));
     return TRUE;
 }
+
+/*!
+ * @brief 超能力の発動 /
+ * do_cmd_cast calls this function if the player's class is 'mindcrafter'.
+ * @param spell 発動する特殊技能のID
+ * @return 処理を実行したらTRUE、キャンセルした場合FALSEを返す。
+ */
+bool cast_mindcrafter_spell(player_type *caster_ptr, int spell)
+{
+    int b = 0;
+    DIRECTION dir;
+    TIME_EFFECT t;
+    PLAYER_LEVEL plev = caster_ptr->lev;
+    // todo enum化する!
+    switch (spell) {
+    case 0: /* Precog */
+        if (plev > 44) {
+            chg_virtue(caster_ptr, V_KNOWLEDGE, 1);
+            chg_virtue(caster_ptr, V_ENLIGHTEN, 1);
+            wiz_lite(caster_ptr, FALSE);
+        } else if (plev > 19)
+            map_area(caster_ptr, DETECT_RAD_MAP);
+
+        if (plev < 30) {
+            b = detect_monsters_normal(caster_ptr, DETECT_RAD_DEFAULT);
+            if (plev > 14)
+                b |= detect_monsters_invis(caster_ptr, DETECT_RAD_DEFAULT);
+            if (plev > 4) {
+                b |= detect_traps(caster_ptr, DETECT_RAD_DEFAULT, TRUE);
+                b |= detect_doors(caster_ptr, DETECT_RAD_DEFAULT);
+            }
+        } else {
+            b = detect_all(caster_ptr, DETECT_RAD_DEFAULT);
+        }
+
+        if ((plev > 24) && (plev < 40))
+            set_tim_esp(caster_ptr, (TIME_EFFECT)plev, FALSE);
+
+        if (!b)
+            msg_print(_("安全な気がする。", "You feel safe."));
+
+        break;
+    case 1:
+        /* Mindblast */
+        if (!get_aim_dir(caster_ptr, &dir))
+            return FALSE;
+
+        if (randint1(100) < plev * 2)
+            fire_beam(caster_ptr, GF_PSI, dir, damroll(3 + ((plev - 1) / 4), (3 + plev / 15)));
+        else
+            fire_ball(caster_ptr, GF_PSI, dir, damroll(3 + ((plev - 1) / 4), (3 + plev / 15)), 0);
+        break;
+    case 2:
+        /* Minor displace */
+        teleport_player(caster_ptr, 10, TELEPORT_SPONTANEOUS);
+        break;
+    case 3:
+        /* Major displace */
+        teleport_player(caster_ptr, plev * 5, TELEPORT_SPONTANEOUS);
+        break;
+    case 4:
+        /* Domination */
+        if (plev < 30) {
+            if (!get_aim_dir(caster_ptr, &dir))
+                return FALSE;
+
+            fire_ball(caster_ptr, GF_DOMINATION, dir, plev, 0);
+        } else {
+            charm_monsters(caster_ptr, plev * 2);
+        }
+        break;
+    case 5:
+        /* Fist of Force  ---  not 'true' TK  */
+        if (!get_aim_dir(caster_ptr, &dir))
+            return FALSE;
+
+        fire_ball(caster_ptr, GF_TELEKINESIS, dir, damroll(8 + ((plev - 5) / 4), 8), (plev > 20 ? (plev - 20) / 8 + 1 : 0));
+        break;
+    case 6:
+        /* Character Armour */
+        set_shield(caster_ptr, (TIME_EFFECT)plev, FALSE);
+        if (plev > 14)
+            set_oppose_acid(caster_ptr, (TIME_EFFECT)plev, FALSE);
+        if (plev > 19)
+            set_oppose_fire(caster_ptr, (TIME_EFFECT)plev, FALSE);
+        if (plev > 24)
+            set_oppose_cold(caster_ptr, (TIME_EFFECT)plev, FALSE);
+        if (plev > 29)
+            set_oppose_elec(caster_ptr, (TIME_EFFECT)plev, FALSE);
+        if (plev > 34)
+            set_oppose_pois(caster_ptr, (TIME_EFFECT)plev, FALSE);
+        break;
+    case 7:
+        /* Psychometry */
+        if (plev < 25)
+            return psychometry(caster_ptr);
+        else
+            return ident_spell(caster_ptr, FALSE, 0);
+    case 8:
+        /* Mindwave */
+        msg_print(_("精神を捻じ曲げる波動を発生させた!", "Mind-warping forces emanate from your brain!"));
+
+        if (plev < 25)
+            project(caster_ptr, 0, 2 + plev / 10, caster_ptr->y, caster_ptr->x, (plev * 3), GF_PSI, PROJECT_KILL, -1);
+        else
+            (void)mindblast_monsters(caster_ptr, randint1(plev * ((plev - 5) / 10 + 1)));
+        break;
+    case 9:
+        /* Adrenaline */
+        set_afraid(caster_ptr, 0);
+        set_stun(caster_ptr, 0);
+        if (!is_fast(caster_ptr) || !is_hero(caster_ptr))
+            hp_player(caster_ptr, plev);
+
+        t = 10 + randint1((plev * 3) / 2);
+        set_hero(caster_ptr, t, FALSE);
+        (void)set_fast(caster_ptr, t, FALSE);
+        break;
+    case 10:
+        /* Telekinesis */
+        if (!get_aim_dir(caster_ptr, &dir))
+            return FALSE;
+
+        fetch_item(caster_ptr, dir, plev * 15, FALSE);
+        break;
+    case 11:
+        /* Psychic Drain */
+        if (!get_aim_dir(caster_ptr, &dir))
+            return FALSE;
+
+        b = damroll(plev / 2, 6);
+        if (fire_ball(caster_ptr, GF_PSI_DRAIN, dir, b, 0))
+            caster_ptr->energy_need += randint1(150);
+
+        break;
+    case 12:
+        /* psycho-spear */
+        if (!get_aim_dir(caster_ptr, &dir))
+            return FALSE;
+
+        fire_beam(caster_ptr, GF_PSY_SPEAR, dir, randint1(plev * 3) + plev * 3);
+        break;
+    case 13: {
+        time_walk(caster_ptr);
+        break;
+    }
+    default:
+        msg_print(_("なに?", "Zap?"));
+    }
+
+    return TRUE;
+}
index 4c6f2a3..e058412 100644 (file)
@@ -3,3 +3,4 @@
 #include "system/angband.h"
 
 bool psychometry(player_type *caster_ptr);
+bool cast_mindcrafter_spell(player_type *caster_ptr, int spell);
index f6df13a..2344205 100644 (file)
 #include "view/display-messages.h"
 
 /*!
- * @brief 超能力の発動 /
- * do_cmd_cast calls this function if the player's class is 'mindcrafter'.
- * @param spell 発動する特殊技能のID
- * @return 処理を実行したらTRUE、キャンセルした場合FALSEを返す。
- */
-static bool cast_mindcrafter_spell(player_type *caster_ptr, int spell)
-{
-    int b = 0;
-    DIRECTION dir;
-    TIME_EFFECT t;
-    PLAYER_LEVEL plev = caster_ptr->lev;
-    // todo enum化する!
-    switch (spell) {
-    case 0: /* Precog */
-        if (plev > 44) {
-            chg_virtue(caster_ptr, V_KNOWLEDGE, 1);
-            chg_virtue(caster_ptr, V_ENLIGHTEN, 1);
-            wiz_lite(caster_ptr, FALSE);
-        } else if (plev > 19)
-            map_area(caster_ptr, DETECT_RAD_MAP);
-
-        if (plev < 30) {
-            b = detect_monsters_normal(caster_ptr, DETECT_RAD_DEFAULT);
-            if (plev > 14)
-                b |= detect_monsters_invis(caster_ptr, DETECT_RAD_DEFAULT);
-            if (plev > 4) {
-                b |= detect_traps(caster_ptr, DETECT_RAD_DEFAULT, TRUE);
-                b |= detect_doors(caster_ptr, DETECT_RAD_DEFAULT);
-            }
-        } else {
-            b = detect_all(caster_ptr, DETECT_RAD_DEFAULT);
-        }
-
-        if ((plev > 24) && (plev < 40))
-            set_tim_esp(caster_ptr, (TIME_EFFECT)plev, FALSE);
-
-        if (!b)
-            msg_print(_("安全な気がする。", "You feel safe."));
-
-        break;
-    case 1:
-        /* Mindblast */
-        if (!get_aim_dir(caster_ptr, &dir))
-            return FALSE;
-
-        if (randint1(100) < plev * 2)
-            fire_beam(caster_ptr, GF_PSI, dir, damroll(3 + ((plev - 1) / 4), (3 + plev / 15)));
-        else
-            fire_ball(caster_ptr, GF_PSI, dir, damroll(3 + ((plev - 1) / 4), (3 + plev / 15)), 0);
-        break;
-    case 2:
-        /* Minor displace */
-        teleport_player(caster_ptr, 10, TELEPORT_SPONTANEOUS);
-        break;
-    case 3:
-        /* Major displace */
-        teleport_player(caster_ptr, plev * 5, TELEPORT_SPONTANEOUS);
-        break;
-    case 4:
-        /* Domination */
-        if (plev < 30) {
-            if (!get_aim_dir(caster_ptr, &dir))
-                return FALSE;
-
-            fire_ball(caster_ptr, GF_DOMINATION, dir, plev, 0);
-        } else {
-            charm_monsters(caster_ptr, plev * 2);
-        }
-        break;
-    case 5:
-        /* Fist of Force  ---  not 'true' TK  */
-        if (!get_aim_dir(caster_ptr, &dir))
-            return FALSE;
-
-        fire_ball(caster_ptr, GF_TELEKINESIS, dir, damroll(8 + ((plev - 5) / 4), 8), (plev > 20 ? (plev - 20) / 8 + 1 : 0));
-        break;
-    case 6:
-        /* Character Armour */
-        set_shield(caster_ptr, (TIME_EFFECT)plev, FALSE);
-        if (plev > 14)
-            set_oppose_acid(caster_ptr, (TIME_EFFECT)plev, FALSE);
-        if (plev > 19)
-            set_oppose_fire(caster_ptr, (TIME_EFFECT)plev, FALSE);
-        if (plev > 24)
-            set_oppose_cold(caster_ptr, (TIME_EFFECT)plev, FALSE);
-        if (plev > 29)
-            set_oppose_elec(caster_ptr, (TIME_EFFECT)plev, FALSE);
-        if (plev > 34)
-            set_oppose_pois(caster_ptr, (TIME_EFFECT)plev, FALSE);
-        break;
-    case 7:
-        /* Psychometry */
-        if (plev < 25)
-            return psychometry(caster_ptr);
-        else
-            return ident_spell(caster_ptr, FALSE, 0);
-    case 8:
-        /* Mindwave */
-        msg_print(_("精神を捻じ曲げる波動を発生させた!", "Mind-warping forces emanate from your brain!"));
-
-        if (plev < 25)
-            project(caster_ptr, 0, 2 + plev / 10, caster_ptr->y, caster_ptr->x, (plev * 3), GF_PSI, PROJECT_KILL, -1);
-        else
-            (void)mindblast_monsters(caster_ptr, randint1(plev * ((plev - 5) / 10 + 1)));
-        break;
-    case 9:
-        /* Adrenaline */
-        set_afraid(caster_ptr, 0);
-        set_stun(caster_ptr, 0);
-        if (!is_fast(caster_ptr) || !is_hero(caster_ptr))
-            hp_player(caster_ptr, plev);
-
-        t = 10 + randint1((plev * 3) / 2);
-        set_hero(caster_ptr, t, FALSE);
-        (void)set_fast(caster_ptr, t, FALSE);
-        break;
-    case 10:
-        /* Telekinesis */
-        if (!get_aim_dir(caster_ptr, &dir))
-            return FALSE;
-
-        fetch_item(caster_ptr, dir, plev * 15, FALSE);
-        break;
-    case 11:
-        /* Psychic Drain */
-        if (!get_aim_dir(caster_ptr, &dir))
-            return FALSE;
-
-        b = damroll(plev / 2, 6);
-        if (fire_ball(caster_ptr, GF_PSI_DRAIN, dir, b, 0))
-            caster_ptr->energy_need += randint1(150);
-
-        break;
-    case 12:
-        /* psycho-spear */
-        if (!get_aim_dir(caster_ptr, &dir))
-            return FALSE;
-
-        fire_beam(caster_ptr, GF_PSY_SPEAR, dir, randint1(plev * 3) + plev * 3);
-        break;
-    case 13: {
-        time_walk(caster_ptr);
-        break;
-    }
-    default:
-        msg_print(_("なに?", "Zap?"));
-    }
-
-    return TRUE;
-}
-
-/*!
  * @brief 練気術の発動 /
  * do_cmd_cast calls this function if the player's class is 'ForceTrainer'.
  * @param spell 発動する特殊技能のID