OSDN Git Service

敵魔法「スターライトアロー」を実装
authorSlimebreath6078 <slimebreath6078@yahoo.co.jp>
Fri, 29 Dec 2023 14:04:03 +0000 (23:04 +0900)
committerSlimebreath6078 <slimebreath6078@yahoo.co.jp>
Mon, 8 Jan 2024 13:20:03 +0000 (22:20 +0900)
14 files changed:
lib/edit/MonsterRaceDefinitions.txt
src/blue-magic/blue-magic-ball-bolt.cpp
src/blue-magic/blue-magic-ball-bolt.h
src/blue-magic/blue-magic-caster.cpp
src/blue-magic/learnt-info.cpp
src/cmd-action/cmd-mane.cpp
src/info-reader/race-info-tokens-table.cpp
src/lore/magic-types-setter.cpp
src/monster-race/race-ability-flags.h
src/monster-race/race-ability-mask.cpp
src/mspell/assign-monster-spell.cpp
src/mspell/monster-power-table.cpp
src/mspell/mspell-attack/mspell-bolt.cpp
src/mspell/mspell-damage-calculator.cpp

index 84a27b2..a6c0403 100644 (file)
@@ -19109,6 +19109,7 @@ S:BR_SOUN | BR_CHAO | BR_DISE | BR_NEXU | BR_TIME | BR_INER | BR_GRAV | BR_SHAR
 S:BR_PLAS | BR_FORC | BR_MANA | BA_NUKE | BR_NUKE | BA_CHAO | BR_DISI | BA_ACID |
 S:BA_ELEC | BA_FIRE | BA_COLD | BA_POIS | BA_NETH | BA_WATE | BA_MANA | BA_DARK |
 S:BA_ABYSS | BA_VOID | BR_ABYSS | BR_VOID | BO_ABYSS | BO_VOID | BA_METEOR | BO_METEOR |
+S:BO_LITE |
 S:DRAIN_MANA | MIND_BLAST| BRAIN_SMASH | CAUSE_1 | CAUSE_2 | CAUSE_3 | CAUSE_4 |
 S:BO_ACID | BO_ELEC | BO_FIRE | BO_COLD | BO_NETH | BO_WATE | BO_MANA |
 S:BO_PLAS | BO_ICEE | MISSILE | BLIND | CONF | SLOW | HOLD | HASTE | HAND_DOOM |
index 1ee6824..a7a59da 100644 (file)
@@ -355,3 +355,14 @@ bool cast_blue_bolt_meteor(PlayerType *player_ptr, bmc_type *bmc_ptr)
     fire_bolt(player_ptr, AttributeType::METEOR, bmc_ptr->dir, bmc_ptr->damage);
     return true;
 }
+bool cast_blue_bolt_lite(PlayerType *player_ptr, bmc_type *bmc_ptr)
+{
+    if (!get_aim_dir(player_ptr, &bmc_ptr->dir)) {
+        return false;
+    }
+
+    msg_print(_("スターライトアローの呪文を唱えた。", "You cast a starlight arrow."));
+    bmc_ptr->damage = monspell_bluemage_damage(player_ptr, MonsterAbilityType::BO_LITE, bmc_ptr->plev, DAM_ROLL);
+    fire_bolt(player_ptr, AttributeType::LITE, bmc_ptr->dir, bmc_ptr->damage);
+    return true;
+}
index 2add4eb..e5bfbd0 100644 (file)
@@ -34,4 +34,5 @@ bool cast_blue_bolt_icee(PlayerType *player_ptr, bmc_type *bmc_ptr);
 bool cast_blue_bolt_void(PlayerType *player_ptr, bmc_type *bmc_ptr);
 bool cast_blue_bolt_abyss(PlayerType *player_ptr, bmc_type *bmc_ptr);
 bool cast_blue_bolt_meteor(PlayerType *player_ptr, bmc_type *bmc_ptr);
+bool cast_blue_bolt_lite(PlayerType *player_ptr, bmc_type *bmc_ptr);
 bool cast_blue_bolt_missile(PlayerType *player_ptr, bmc_type *bmc_ptr);
index 87e59c5..c13afda 100644 (file)
@@ -316,6 +316,8 @@ static bool switch_cast_blue_magic(PlayerType *player_ptr, bmc_type *bmc_ptr, Mo
         return cast_blue_bolt_void(player_ptr, bmc_ptr);
     case MonsterAbilityType::BO_METEOR:
         return cast_blue_bolt_meteor(player_ptr, bmc_ptr);
+    case MonsterAbilityType::BO_LITE:
+        return cast_blue_bolt_lite(player_ptr, bmc_ptr);
     case MonsterAbilityType::MISSILE:
         return cast_blue_bolt_missile(player_ptr, bmc_ptr);
     case MonsterAbilityType::SCARE:
index b499f79..ae8b906 100644 (file)
@@ -113,6 +113,7 @@ std::string learnt_info(PlayerType *player_ptr, MonsterAbilityType power)
     case MonsterAbilityType::BO_VOID:
     case MonsterAbilityType::BO_ICEE:
     case MonsterAbilityType::BO_METEOR:
+    case MonsterAbilityType::BO_LITE:
     case MonsterAbilityType::MISSILE:
         return set_bluemage_damage(player_ptr, power, plev, KWD_DAM);
     case MonsterAbilityType::HASTE:
index b15db9c..d51ad6c 100644 (file)
@@ -863,6 +863,15 @@ static bool use_mane(PlayerType *player_ptr, MonsterAbilityType spell)
 
         fire_bolt(player_ptr, AttributeType::METEOR, dir, damage);
         break;
+    case MonsterAbilityType::BO_LITE:
+        if (!get_aim_dir(player_ptr, &dir)) {
+            return false;
+        } else {
+            msg_print(_("スターライトアローの呪文を唱えた。", "You cast a starlight arrow."));
+        }
+
+        fire_bolt(player_ptr, AttributeType::LITE, dir, damage);
+        break;
     case MonsterAbilityType::MISSILE:
         if (!get_aim_dir(player_ptr, &dir)) {
             return false;
index 2c696d6..d0d306b 100644 (file)
@@ -195,6 +195,7 @@ const std::unordered_map<std::string_view, MonsterAbilityType> r_info_ability_fl
        {"BO_VOID", MonsterAbilityType::BO_VOID },
        {"BO_ABYSS", MonsterAbilityType::BO_ABYSS },
        {"BO_METEOR", MonsterAbilityType::BO_METEOR },
+       {"BO_LITE", MonsterAbilityType::BO_LITE },
        {"MISSILE", MonsterAbilityType::MISSILE },
        {"SCARE", MonsterAbilityType::SCARE },
        {"BLIND", MonsterAbilityType::BLIND },
index 3c04b34..e453c5e 100644 (file)
@@ -381,6 +381,12 @@ void set_bolt_types(PlayerType *player_ptr, lore_type *lore_ptr)
         lore_ptr->color[lore_ptr->vn++] = TERM_UMBER;
     }
 
+    if (lore_ptr->ability_flags.has(MonsterAbilityType::BO_LITE)) {
+        set_damage(player_ptr, lore_ptr, MonsterAbilityType::BO_LITE, _("スターライトアロー%s", "produce starlight arrow%s"));
+        lore_ptr->vp[lore_ptr->vn] = lore_ptr->tmp_msg[lore_ptr->vn];
+        lore_ptr->color[lore_ptr->vn++] = TERM_YELLOW;
+    }
+
     if (lore_ptr->ability_flags.has(MonsterAbilityType::MISSILE)) {
         set_damage(player_ptr, lore_ptr, MonsterAbilityType::MISSILE, _("マジックミサイル%s", "produce magic missiles%s"));
         lore_ptr->vp[lore_ptr->vn] = lore_ptr->tmp_msg[lore_ptr->vn];
index b829fe3..7c9ba2c 100644 (file)
@@ -108,5 +108,6 @@ enum class MonsterAbilityType {
     BA_ABYSS = 102, /*!< モンスター能力: 深淵のボール / Abyss Ball */
     BA_METEOR = 103, /*!< モンスター能力: 隕石のボール / Meteor Ball */
     BO_METEOR = 104, /*!< モンスター能力: 隕石のボルト / Meteor Bolt */
+    BO_LITE = 105, /*!< モンスター能力: 光のボルト(スターライトアロー) / Starlight arrow */
     MAX,
 };
index cf6e16c..e3ba4ff 100644 (file)
@@ -31,9 +31,9 @@ const EnumClassFlagGroup<MonsterAbilityType> RF_ABILITY_RIDING_MASK = {
  */
 const EnumClassFlagGroup<MonsterAbilityType> RF_ABILITY_BOLT_MASK = {
     MonsterAbilityType::ROCKET, MonsterAbilityType::SHOOT, MonsterAbilityType::BO_ACID, MonsterAbilityType::BO_ELEC,
-    MonsterAbilityType::BO_FIRE, MonsterAbilityType::BO_COLD, MonsterAbilityType::BO_NETH, MonsterAbilityType::BO_WATE,
-    MonsterAbilityType::BO_MANA, MonsterAbilityType::BO_PLAS, MonsterAbilityType::BO_ICEE, MonsterAbilityType::BO_VOID,
-    MonsterAbilityType::BO_ABYSS, MonsterAbilityType::BO_METEOR, MonsterAbilityType::MISSILE,
+    MonsterAbilityType::BO_FIRE, MonsterAbilityType::BO_COLD, MonsterAbilityType::BO_NETH, MonsterAbilityType::BO_LITE,
+    MonsterAbilityType::BO_WATE, MonsterAbilityType::BO_MANA, MonsterAbilityType::BO_PLAS, MonsterAbilityType::BO_ICEE,
+    MonsterAbilityType::BO_VOID, MonsterAbilityType::BO_ABYSS, MonsterAbilityType::BO_METEOR, MonsterAbilityType::MISSILE,
 };
 
 /*
index 3902617..5a2f54d 100644 (file)
@@ -109,6 +109,7 @@ static MonsterSpellResult monspell_to_player_impl(PlayerType *player_ptr, Monste
     case MonsterAbilityType::BO_VOID:
     case MonsterAbilityType::BO_ABYSS:
     case MonsterAbilityType::BO_METEOR:
+    case MonsterAbilityType::BO_LITE:
     case MonsterAbilityType::MISSILE: 
         return MSpellBolt(player_ptr, m_idx, ms_type, MONSTER_TO_PLAYER).shoot(y,x);
 
@@ -243,6 +244,7 @@ static MonsterSpellResult monspell_to_monster_impl(
     case MonsterAbilityType::BO_VOID:
     case MonsterAbilityType::BO_ABYSS:
     case MonsterAbilityType::BO_METEOR:
+    case MonsterAbilityType::BO_LITE:
     case MonsterAbilityType::MISSILE: 
          return MSpellBolt(player_ptr, m_idx, t_idx, ms_type, MONSTER_TO_MONSTER).shoot(y, x);
 
index 210dba4..db73546 100644 (file)
@@ -75,6 +75,7 @@ const std::map<MonsterAbilityType, const monster_power> monster_powers = {
     { MonsterAbilityType::BO_VOID, { 35, 31, 80, 342, 70, A_INT, _("ヴォイド・ボルト", "void bolt") } },
     { MonsterAbilityType::BO_ABYSS, { 35, 33, 80, 342, 70, A_INT, _("アビス・ボルト", "abyss bolt") } },
     { MonsterAbilityType::BO_METEOR, { 30, 28, 90, 400, 80, A_INT, _("メテオストライク", "meteor strike") } },
+    { MonsterAbilityType::BO_LITE, { 20, 25, 75, 300, 65, A_INT, _("スターライトアロー", "starlight arrow") } },
     { MonsterAbilityType::MISSILE, { 3, 1, 25, 12, 20, A_INT, _("マジック・ミサイル", "magic missile") } },
     { MonsterAbilityType::SCARE, { 5, 3, 35, 0, 20, A_INT, _("恐慌", "scare") } },
     { MonsterAbilityType::BLIND, { 10, 5, 40, 0, 20, A_INT, _("盲目", "blind") } },
index 62a743a..fe0c7a5 100644 (file)
@@ -79,6 +79,10 @@ const std::unordered_map<MonsterAbilityType, MSpellData> bolt_list = {
                                            _("%s^がメテオストライクの呪文を唱えた。", "%s^ casts a meteor strike."),
                                            _("%s^が%sに向かってメテオストライクの呪文を唱えた。", "%s^ casts a meteor strike at %s.") },
                                          AttributeType::METEOR, DRS_REFLECT } },
+    { MonsterAbilityType::BO_LITE, { { _("%s^が何かをつぶやいた。", "%s^ mumbles."),
+                                         _("%s^がスターライトアローを放った。", "%s^ fires a starlight arrow."),
+                                         _("%s^が%sに向かってスターライトアローを放った。", "%s^ fires a starlight arrow at %s.") },
+                                       AttributeType::LITE, DRS_REFLECT } },
     { MonsterAbilityType::MISSILE, { { _("%s^が何かをつぶやいた。", "%s^ mumbles."),
                                          _("%s^がマジック・ミサイルの呪文を唱えた。", "%s^ casts a magic missile."),
                                          _("%s^が%sに向かってマジック・ミサイルの呪文を唱えた。", "%s^ casts a magic missile at %s.") },
index 94313eb..ee89a9f 100644 (file)
@@ -347,6 +347,11 @@ static int monspell_damage_base(
         dice_num = 1;
         dice_side = rlev;
         break;
+    case MonsterAbilityType::BO_LITE:
+        dam = powerful ? 60 : 40;
+        dice_num = 1;
+        dice_side = powerful ? rlev * 4 : rlev * 2;
+        break;
     case MonsterAbilityType::MISSILE:
         dam = (rlev / 3);
         dice_num = 2;