OSDN Git Service

[Feature] 元素使いのバランス調整
authoriks <iks3@users.noreply.github.com>
Mon, 22 Mar 2021 16:21:47 +0000 (01:21 +0900)
committeriks <iks3@users.noreply.github.com>
Tue, 23 Mar 2021 15:08:27 +0000 (00:08 +0900)
精気乱射を集約可能にして本数とダメージを調整
闇系統は暗くなった場所の地形を忘れない
氷のレイシャルを周辺化、闇のレイシャルを暗所限定次元の扉、瘴気のレイシャルを増殖阻止

src/effect/effect-feature.cpp
src/mind/mind-elementalist.cpp
src/player/race-info-table.cpp

index d61979d..0237872 100644 (file)
@@ -9,6 +9,7 @@
 #include "grid/trap.h"
 #include "main/sound-definitions-table.h"
 #include "main/sound-of-music.h"
+#include "mind/mind-elementalist.h"
 #include "mind/mind-ninja.h"
 #include "monster/monster-update.h"
 #include "player/special-defense-types.h"
@@ -358,7 +359,7 @@ bool affect_feature(player_type *caster_ptr, MONSTER_IDX who, POSITION r, POSITI
         g_ptr->info &= ~(CAVE_GLOW);
 
         /* Hack -- Forget "boring" grids */
-        if (!has_flag(f_ptr->flags, FF_REMEMBER)) {
+        if (!has_flag(f_ptr->flags, FF_REMEMBER) || has_element_resist(caster_ptr, ElementRealm::DARKNESS, 1)) {
             /* Forget */
             g_ptr->info &= ~(CAVE_MARK);
             note_spot(caster_ptr, y, x);
index 49a5067..6fbe8c7 100644 (file)
@@ -21,6 +21,7 @@
 #include "game-option/disturbance-options.h"
 #include "game-option/input-options.h"
 #include "game-option/text-display-options.h"
+#include "grid/feature-flag-types.h"
 #include "io/command-repeater.h"
 #include "io/input-key-acceptor.h"
 #include "io/input-key-requester.h"
@@ -30,6 +31,7 @@
 #include "monster/monster-describer.h"
 #include "monster-race/monster-race.h"
 #include "monster-race/race-flags3.h"
+#include "monster-race/race-flags7.h"
 #include "monster-race/race-flags-resistance.h"
 #include "mind/mind-mindcrafter.h"
 #include "player/player-status-table.h"
 #include "spell-kind/magic-item-recharger.h"
 #include "spell-kind/spells-beam.h"
 #include "spell-kind/spells-sight.h"
+#include "spell-kind/spells-teleport.h"
 #include "spell-kind/spells-world.h"
 #include "status/bad-status-setter.h"
 #include "status/base-status.h"
+#include "system/floor-type-definition.h"
 #include "system/game-option-types.h"
 #include "util/bit-flags-calculator.h"
 #include "util/buffer-shaper.h"
 #include "util/int-char-converter.h"
+#include "target/grid-selector.h"
 #include "target/target-getter.h"
 #include "term/screen-processor.h"
 #include "term/term-color-types.h"
@@ -424,16 +429,16 @@ void get_element_effect_info(player_type *caster_ptr, int spell_idx, char *p)
         sprintf(p, " %s%dd%d", KWD_DAM, 12 + ((plev - 5) / 4), 8);
         break;
     case ElementSpells::WAVE_1ST:
-        sprintf(p, " %sd%d", KWD_DAM, plev * 4);
+        sprintf(p, " %s50+d%d", KWD_DAM, plev * 3);
         break;
     case ElementSpells::BALL_2ND:
-        sprintf(p, " %s%d", KWD_DAM, 75 + plev);
+        sprintf(p, " %s%d", KWD_DAM, 75 + plev * 3 / 2);
         break;
     case ElementSpells::BURST_1ST:
-        sprintf(p, " %s%dd%d", KWD_DAM, 6 + plev / 8, 8);
+        sprintf(p, " %s%dd%d", KWD_DAM, 6 + plev / 8, 7);
         break;
     case ElementSpells::STORM_2ND:
-        sprintf(p, " %s%d", KWD_DAM, 120 + plev * 2);
+        sprintf(p, " %s%d", KWD_DAM, 115 + plev * 5 / 2);
         break;
     case ElementSpells::BREATH_1ST:
         sprintf(p, " %s%d", KWD_DAM, p_ptr->chp * 2 / 3);
@@ -536,16 +541,16 @@ static bool cast_element_spell(player_type *caster_ptr, SPELL_IDX spell_idx)
         fire_bolt_or_beam(caster_ptr, plev, typ, dir, dam);
         break;
     case ElementSpells::WAVE_1ST:
-        dam = randint1(plev * 4);
+        dam = 50 + randint1(plev * 3);
         typ = get_element_spells_type(caster_ptr, power.elem);
         project_all_los(caster_ptr, typ, dam);
         break;
     case ElementSpells::BALL_2ND:
         if (!get_aim_dir(caster_ptr, &dir))
             return FALSE;
-        dam = 75 + plev;
+        dam = 75 + plev * 3 / 2;
         typ = get_element_spells_type(caster_ptr, power.elem);
-        if (fire_ball(caster_ptr, typ, dir, dam, 2)) {
+        if (fire_ball(caster_ptr, typ, dir, dam, 3)) {
             if (typ == GF_HYPODYNAMIA) {
                 (void)hp_player(caster_ptr, dam / 2);
             }
@@ -554,22 +559,24 @@ static bool cast_element_spell(player_type *caster_ptr, SPELL_IDX spell_idx)
     case ElementSpells::BURST_1ST:
         y = caster_ptr->y;
         x = caster_ptr->x;
-        num = damroll(5, 3);
+        num = damroll(4, 3);
         typ = get_element_spells_type(caster_ptr, power.elem);
         for (int k = 0; k < num; k++) {
             int attempts = 1000;
             while (attempts--) {
                 scatter(caster_ptr, &y, &x, caster_ptr->y, caster_ptr->x, 4, PROJECT_NONE);
+                if (!cave_has_flag_bold(caster_ptr->current_floor_ptr, y, x, FF_PROJECT))
+                    continue;
                 if (!player_bold(caster_ptr, y, x))
                     break;
             }
-            project(caster_ptr, 0, 0, y, x, damroll(6 + plev / 8, 10), typ, (PROJECT_BEAM | PROJECT_THRU | PROJECT_GRID | PROJECT_KILL), -1);
+            project(caster_ptr, 0, 0, y, x, damroll(6 + plev / 8, 7), typ, (PROJECT_BEAM | PROJECT_THRU | PROJECT_GRID | PROJECT_KILL), -1);
         }
         break;
     case ElementSpells::STORM_2ND:
         if (!get_aim_dir(caster_ptr, &dir))
             return FALSE;
-        dam = 125 + plev * 2;
+        dam = 115 + plev * 5 / 2;
         typ = get_element_spells_type(caster_ptr, power.elem);
         if (fire_ball(caster_ptr, typ, dir, dam, 4)) {
             if (typ == GF_HYPODYNAMIA) {
@@ -1210,6 +1217,7 @@ byte select_element_realm(player_type *creature_ptr)
  */
 void switch_element_racial(player_type *creature_ptr, rc_type *rc_ptr)
 {
+    auto plev = creature_ptr->lev;
     auto realm = static_cast<ElementRealm>(creature_ptr->realm1);
     switch (realm) {
     case ElementRealm::FIRE:
@@ -1221,11 +1229,11 @@ void switch_element_racial(player_type *creature_ptr, rc_type *rc_ptr)
         rc_ptr->power_desc[rc_ptr->num++].number = -4;
         break;
     case ElementRealm::ICE:
-        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("フリーズ・モンスター", "Sleep monster"));
+        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("周辺フリーズ", "Sleep monsters"));
         rc_ptr->power_desc[rc_ptr->num].min_level = 10;
-        rc_ptr->power_desc[rc_ptr->num].cost = 10;
+        rc_ptr->power_desc[rc_ptr->num].cost = 15;
         rc_ptr->power_desc[rc_ptr->num].stat = A_WIS;
-        rc_ptr->power_desc[rc_ptr->num].fail = 15;
+        rc_ptr->power_desc[rc_ptr->num].fail = 25;
         rc_ptr->power_desc[rc_ptr->num++].number = -4;
         break;
     case ElementRealm::SKY:
@@ -1245,9 +1253,9 @@ void switch_element_racial(player_type *creature_ptr, rc_type *rc_ptr)
         rc_ptr->power_desc[rc_ptr->num++].number = -4;
         break;
     case ElementRealm::DARKNESS:
-        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("アンデッド従属", "Enslave undead"));
-        rc_ptr->power_desc[rc_ptr->num].min_level = 10;
-        rc_ptr->power_desc[rc_ptr->num].cost = 10;
+        sprintf(rc_ptr->power_desc[rc_ptr->num].racial_name, _("闇の扉(半径%d)", "Door to darkness(rad %d)"), 15 + plev / 2);
+        rc_ptr->power_desc[rc_ptr->num].min_level = 5;
+        rc_ptr->power_desc[rc_ptr->num].cost = 5 + plev / 7;
         rc_ptr->power_desc[rc_ptr->num].stat = A_WIS;
         rc_ptr->power_desc[rc_ptr->num].fail = 20;
         rc_ptr->power_desc[rc_ptr->num++].number = -4;
@@ -1269,9 +1277,9 @@ void switch_element_racial(player_type *creature_ptr, rc_type *rc_ptr)
         rc_ptr->power_desc[rc_ptr->num++].number = -4;
         break;
     case ElementRealm::DEATH:
-        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("害è\99«é§\86é\99¤", "Pesticide"));
+        strcpy(rc_ptr->power_desc[rc_ptr->num].racial_name, _("å¢\97æ®\96é\98»æ­¢", "Sterilization"));
         rc_ptr->power_desc[rc_ptr->num].min_level = 5;
-        rc_ptr->power_desc[rc_ptr->num].cost = 3;
+        rc_ptr->power_desc[rc_ptr->num].cost = 5;
         rc_ptr->power_desc[rc_ptr->num].stat = A_WIS;
         rc_ptr->power_desc[rc_ptr->num].fail = 20;
         rc_ptr->power_desc[rc_ptr->num++].number = -4;
@@ -1282,6 +1290,11 @@ void switch_element_racial(player_type *creature_ptr, rc_type *rc_ptr)
 }
 
 /*!
+ * @todo 宣言だけ。後日適切な場所に移動
+ */
+static bool door_to_darkness(player_type *caster_ptr, POSITION dist);
+
+/*!
  * @brief クラスパワーを実行
  * @param creature_ptr プレイヤー情報への参照ポインタ
  * @return 実行したらTRUE、しなかったらFALSE
@@ -1297,9 +1310,8 @@ bool switch_element_execution(player_type *creature_ptr)
         (void)lite_area(creature_ptr, damroll(2, plev / 2), plev / 10);
         break;
     case ElementRealm::ICE:
-        if (!get_aim_dir(creature_ptr, &dir))
-            return FALSE;
-        (void)project_hook(creature_ptr, GF_OLD_SLEEP, dir, (plev * 2), PROJECT_STOP | PROJECT_KILL | PROJECT_REFLECTABLE);
+        (void)project(creature_ptr, 0, 5, creature_ptr->y, creature_ptr->x, 1, GF_COLD, PROJECT_ITEM, -1);
+        (void)project_all_los(creature_ptr, GF_OLD_SLEEP, 20 + plev * 3 / 2);
         break;
     case ElementRealm::SKY:
         (void)recharge(creature_ptr, 120);
@@ -1310,9 +1322,7 @@ bool switch_element_execution(player_type *creature_ptr)
         (void)wall_to_mud(creature_ptr, dir, plev * 3 / 2);
         break;
     case ElementRealm::DARKNESS:
-        if (!get_aim_dir(creature_ptr, &dir))
-            return FALSE;
-        (void)control_one_undead(creature_ptr, dir, plev * 3 / 2);
+        return door_to_darkness(creature_ptr, 15 + plev / 2);
         break;
     case ElementRealm::CHAOS:
         reserve_alter_reality(creature_ptr, randint0(21) + 15);
@@ -1321,7 +1331,8 @@ bool switch_element_execution(player_type *creature_ptr)
         (void)earthquake(creature_ptr, creature_ptr->y, creature_ptr->x, 10, 0);
         break;
     case ElementRealm::DEATH:
-        (void)dispel_monsters(creature_ptr, plev / 2);
+        if (creature_ptr->current_floor_ptr->num_repro <= MAX_REPRO)
+            creature_ptr->current_floor_ptr->num_repro += MAX_REPRO;
         break;
     default:
         return FALSE;
@@ -1329,3 +1340,82 @@ bool switch_element_execution(player_type *creature_ptr)
 
     return TRUE;
 }
+
+/*!
+ * @brief 指定したマスが暗いかどうか
+ * @param f_ptr 階の情報への参照ポインタ
+ * @param y 指定のy座標
+ * @param x 指定のx座標
+ * @return 暗いならTRUE、そうでないならFALSE
+ */
+static bool is_target_grid_dark(floor_type* f_ptr, POSITION y, POSITION x)
+{
+    if (any_bits(f_ptr->grid_array[y][x].info, CAVE_MNLT))
+        return FALSE;
+
+    bool is_dark = FALSE;
+    bool is_lite = any_bits(f_ptr->grid_array[y][x].info, CAVE_GLOW | CAVE_LITE);
+
+    for (int dx = x - 2; dx <= x + 2; dx++)
+        for (int dy = y - 2; dy <= y + 2; dy++) {
+            if (dx == x && dy == y)
+                continue;
+            if (!in_bounds(f_ptr, dy, dx))
+                continue;
+
+            MONSTER_IDX m_idx = f_ptr->grid_array[dy][dx].m_idx;
+            if (!m_idx)
+                continue;
+
+            POSITION d = distance(dy, dx, y, x);
+            monster_race *r_ptr = &r_info[f_ptr->m_list[m_idx].r_idx];
+            if (d <= 1 && any_bits(r_ptr->flags7, RF7_HAS_LITE_1 | RF7_SELF_LITE_1))
+                return FALSE;
+            if (d <= 2 && any_bits(r_ptr->flags7, RF7_HAS_LITE_2 | RF7_SELF_LITE_2))
+                return FALSE;
+            if (d <= 1 && any_bits(r_ptr->flags7, RF7_HAS_DARK_1 | RF7_SELF_DARK_1))
+                is_dark = TRUE;
+            if (d <= 2 && any_bits(r_ptr->flags7, RF7_HAS_DARK_2 | RF7_SELF_DARK_2))
+                is_dark = TRUE;
+        }
+
+    return !is_lite || is_dark;
+}
+
+/*!
+ * @breif 暗いところ限定での次元の扉
+ * @param caster_ptr プレイヤー情報への参照ポインタ
+ */
+static bool door_to_darkness(player_type* caster_ptr, POSITION dist)
+{
+    POSITION y = caster_ptr->y;
+    POSITION x = caster_ptr->x;
+    floor_type *f_ptr;
+
+    for (int i = 0; i < 3; i++) {
+        if (!tgt_pt(caster_ptr, &x, &y))
+            return FALSE;
+
+        f_ptr = caster_ptr->current_floor_ptr;
+
+        if (distance(y, x, caster_ptr->y, caster_ptr->x) > dist) {
+            msg_print(_("遠すぎる!", "There is too far!"));
+            continue;
+        }
+
+        if (!is_cave_empty_bold(caster_ptr, y, x) || f_ptr->grid_array[y][x].info & CAVE_ICKY) {
+            msg_print(_("そこには移動できない。", "Can not teleport to there."));
+            continue;
+        }
+
+        break;
+    }
+
+    bool flag = cave_player_teleportable_bold(caster_ptr, y, x, TELEPORT_SPONTANEOUS)  && is_target_grid_dark(f_ptr, y, x);
+    if (flag) {
+        teleport_player_to(caster_ptr, y, x, TELEPORT_SPONTANEOUS);
+    } else {
+        msg_print(_("闇の扉は開かなかった!", "Door to darkness does not open!"));
+    }
+    return TRUE;
+}
index 9db8e9c..4dfcaa6 100644 (file)
@@ -107,7 +107,7 @@ const player_race race_info[MAX_RACES] =
                48,  3, 150, 10,
                46,  3, 120, 10,
                5,
-               0x01890005,
+               0x11890005,
        },
        {
 #ifdef JP
@@ -122,7 +122,7 @@ const player_race race_info[MAX_RACES] =
                66,  1, 150,  5,
                62,  1, 120,  5,
                3,
-               0x0DD8818D,
+               0x1DD8818D,
        },
        {
 #ifdef JP
@@ -197,7 +197,7 @@ const player_race race_info[MAX_RACES] =
                92, 10, 255, 60,
                80,  8, 235, 60,
                3,
-               0x00A80407,
+               0x10A80407,
        },
        {
 #ifdef JP
@@ -287,7 +287,7 @@ const player_race race_info[MAX_RACES] =
                60,  1, 130,  5,
                55,  1, 100,  5,
                3,
-               0x0444A009,
+               0x1444A009,
        },
        {
 #ifdef JP
@@ -302,7 +302,7 @@ const player_race race_info[MAX_RACES] =
                43,  3, 92,  6,
                40,  3, 78,  3,
                5,
-               0x0569040F,
+               0x1569040F,
        },
        {
 #ifdef JP
@@ -392,7 +392,7 @@ const player_race race_info[MAX_RACES] =
                72,  6, 50, 5,
                66,  4, 50, 5,
                2,
-               0x1234070F,
+               0x0234070F,
        },
        {
 #ifdef JP
@@ -422,7 +422,7 @@ const player_race race_info[MAX_RACES] =
                72,  6, 180, 25,
                66,  4, 150, 20,
                5,
-               0x167DC7FF,
+               0x067DC7FF,
        },
        {
 #ifdef JP
@@ -437,7 +437,7 @@ const player_race race_info[MAX_RACES] =
                72, 6, 100, 25,
                66, 4, 100, 20,
                5,
-               0x1631474A,
+               0x0631474A,
        },
        {
 #ifdef JP
@@ -481,7 +481,7 @@ const player_race race_info[MAX_RACES] =
                111, 11, 255, 50,
                99, 11, 250, 45,
                  0,
-               0x00010005,
+               0x10010005,
        },
        {
 #ifdef JP
@@ -496,7 +496,7 @@ const player_race race_info[MAX_RACES] =
                82, 5, 190, 20,
                78,  6, 180, 15,
                3,
-               0x0779F777,
+               0x1779F777,
        },
        {
 #ifdef JP
@@ -513,7 +513,7 @@ const player_race race_info[MAX_RACES] =
                100,10, 255, 65,
                80, 10, 240, 64,
                5,
-               0x17EDC4DB,
+               0x07EDC4DB,
        },
        {
 #ifdef JP
@@ -581,13 +581,12 @@ const player_race race_info[MAX_RACES] =
                "Merfolk",
 
                { -1,  0,  2,  1,  -1,  1},
-                       2,  3,  2,  1, 6,  11, -1,  5,
-                       10,  130,
-                       24, 16,
-                       66,  6, 130, 15,
-                       62,  6, 100, 10,
-                       2,
-                       0x1E77E7FF,
+               2,  3,  2,  1, 6,  11, -1,  5,
+               10,  130,
+               24, 16,
+               66,  6, 130, 15,
+               62,  6, 100, 10,
+               2,
+               0x1E77E7FF,
        },
-
 };