OSDN Git Service

Merge pull request #3814 from Slimebreath6078/feature/Add_Laffey_II
author火炎の飛竜 <87808091+Slimebreath6078@users.noreply.github.com>
Sun, 3 Mar 2024 13:40:54 +0000 (22:40 +0900)
committerGitHub <noreply@github.com>
Sun, 3 Mar 2024 13:40:54 +0000 (22:40 +0900)
モンスター「ラフィーII」実装

14 files changed:
lib/edit/MonsterRaceDefinitions.txt
lib/file/mondeath.txt
lib/file/mondeath_j.txt
lib/file/monspeak.txt
lib/file/monspeak_j.txt
src/monster-race/race-indice-types.h
src/monster/monster-pain-describer.cpp
src/mspell/mspell-summon.cpp
src/mspell/specified-summon.cpp
src/mspell/specified-summon.h
src/system/monster-entity.cpp
src/system/monster-entity.h
src/system/monster-race-info.cpp
src/system/monster-race-info.h

index cb5ad74..10b7178 100644 (file)
@@ -27160,3 +27160,53 @@ D:彼に触れられバグる者の姿も時々見える。
 D:$This is the fate of those who continue to seek an exit from the Amazing Digital Circus and reach their breaking point.
 D:$  He is crawling yet after being sent into the cellar.
 D:$  All touched by him start abstracting.
+
+# 特殊仕様で以下の特性あり
+# ・一度に受けるダメージは現在HPの10%まで。
+# ・ただしこの軽減効果は最大HPの1.4%を下回らない。
+# ・救援召喚はウサウサストライカー(後述)を
+#   2体召喚する。
+# このダメージキャップは最低29回攻撃を受けないと死なない。
+# 元ネタにはある延命がないため、その分ダメージキャップは盛っている。
+# (元々は33回だったが、90F前提のものなため調整で弱体化した)
+# (ちなみに元ネタでは31回)
+# 元々はレアリティ6の予定だったが、β版であることやダメージキャップを取り入れるモンスターは初ということもあり試験的に3に下げる
+N:1356:ラフィーII
+E:Laffey II
+G:g:w
+I:125:50d40:40:180:30
+W:63:3:35000:0:0
+B:SHOOT:HURT:12d12
+B:PUNCH:SUPERHURT:12d12
+B:HIT:HURT:8d8
+B:KICK:HURT:8d8
+X:FEMALE
+F:ONLY_ONE | NONLIVING | GOOD | FORCE_MAXHP | SPEAK_ALL |
+F:WEIRD_MIND | DIMINISH_MAX_DAMAGE |
+F:IM_FIRE | IM_COLD | IM_POIS | RES_DARK | RES_LITE | RES_DISE | RES_CHAO | RES_WATE |
+F:NO_CONF | NO_FEAR | NO_INSTANTLY_DEATH |
+F:OPEN_DOOR | BASH_DOOR | MOVE_BODY | TAKE_ITEM | CAN_SWIM | SMART |
+F:DROP_CORPSE | DROP_GREAT | DROP_2D2 |
+S:1_IN_2
+S:ROCKET | PSY_SPEAR | BO_LITE | SHOOT | S_KIN |
+R:1356:2d1
+D:$Laffey became immensely stronger...
+D:$  Yep, became stronger... Zzzzz...
+D:ラフィーとっても強くなった…
+D:うん、強くなった……Zzzz…
+
+N:1357:ウサウサストライカー
+E:Bunbun Striker
+G:*:w
+I:117:25d22:50:90:0
+W:63:15:5000:0:0
+F:NONLIVING | FORCE_MAXHP | EMPTY_MIND | SMART |
+F:CAN_FLY | RAND_25 | NEVER_BLOW |
+F:HURT_FIRE | IM_COLD | IM_POIS | RES_DARK | RES_LITE | RES_DISE | RES_CHAO | RES_WATE |
+F:NO_CONF | NO_FEAR | NO_SLEEP | NO_STUN |
+S:1_IN_4
+S:PSY_SPEAR | BO_LITE |
+D:$It is a part of Laffey II's rigging: a bunny-looking, propeller-less, futuristic drone.
+D:$  It can project light bolts that burn a hole through a target.
+D:ラフィーIIの艤装の一部で、兎を模したプロペラのない未来的なドローンだ。
+D:光の矢が放たれるようになっており、それが通ったものには風穴が空く。
index 05afe19..549eae6 100644 (file)
@@ -89,5 +89,8 @@ says, 'Why... my plasma power loses... even though I remodeled my whole body...'
 N:1345:GREAT THING, the Huge Battle Ship
 is destroyed.  FINAL ZONE IS OVER.
 
+N:1355:Laffey II
+says, 'My battle... isn't over yet... Nope.'
+
 N:*:Default
 shouts, 'AAAARRRGGGHHH!!!'
index a65a981..6827136 100644 (file)
@@ -110,5 +110,8 @@ N:1333:『プロフェッサー・オオツキ』
 N:1345:巨大戦艦『グレート・シング』
 を撃破した。FINAL ZONE IS OVER.
 
+N:1355:ラフィーII
+「ラフィーの戦いは…これで終わりじゃない…うん」
+
 N:*:Default
 「グアァァァ!」
index cb36dca..306b3fe 100644 (file)
@@ -901,6 +901,13 @@ says, 'Let's talk meaningfully.'
 says, 'If you want, I can introduce you to Lord Lucifer.'
 says, 'Do you feel like ending your life in such a dimly-lit dungeon?'
 
+N:1355:Laffey II
+says, 'Connection established. Deploying...!'
+says, 'As long as I can shoot, I won't give up...'
+says, 'First things first, we gotta beat baddies... Yep, hurry...'
+says, 'Located a target, I'll begin to eliminate...!'
+says, '"The Ship That Would Not Die" won't go down that easy...'
+
 N:*:Default lines
 cackles evilly.
 cackles diabolically.
index b32fb6a..efcb89b 100644 (file)
@@ -1183,6 +1183,13 @@ N:1346:地獄の論客『カイム』
 「君さえその気であれば、私がルシファー様に口添えをしてもよいのだが。」
 「こんな薄暗いダンジョンで、人生を終える気かね?」
 
+N:1355:ラフィーII
+「接続完了、展開…!」
+「撃てる限り、諦めない…」
+「まずは敵を倒す…うん、早く…」
+「目標発見、殲滅開始…!」
+「「不死身の船」、簡単には沈まない…」
+
 N:*:Default lines
 #cackles evilly.
 は邪悪に笑っている。
index 6fced2d..ee860f6 100644 (file)
@@ -197,4 +197,6 @@ enum class MonsterRaceId : int16_t {
     CHEST_MIMIC_03 = 1338,
     CHEST_MIMIC_04 = 1339,
     CHEST_MIMIC_11 = 1340,
+    LAFFEY_II = 1356,
+    BUNBUN_STRIKERS = 1357,
 };
index 795431a..c8a9c05 100644 (file)
@@ -1,5 +1,6 @@
 #include "monster/monster-pain-describer.h"
 #include "monster-race/monster-race.h"
+#include "monster-race/race-indice-types.h"
 #include "monster/monster-describer.h"
 #include "system/floor-type-definition.h"
 #include "system/monster-entity.h"
@@ -33,151 +34,151 @@ static auto d_char_is_any_of(concptr symbols)
     };
 }
 
-static const std::vector<pain_message_type> pain_messages{
-    { d_char_is_any_of(",ejmvwQ"),
-        {
-            { 95, _("はほとんど気にとめていない。", " barely notices.") },
-            { 75, _("はしり込みした。", " flinches.") },
-            { 50, _("は縮こまった。", " squelches.") },
-            { 35, _("は痛みに震えた。", " quivers in pain.") },
-            { 20, _("は身もだえした。", " writhes about.") },
-            { 10, _("は苦痛で身もだえした。", " writhes in agony.") },
-            { 0, _("はぐにゃぐにゃと痙攣した。", " jerks limply.") },
-        } },
-    { d_char_is_any_of("l"),
-        {
-            { 95, _("はほとんど気にとめていない。", " barely notices.") },
-            { 75, _("はしり込みした。", " flinches.") },
-            { 50, _("は躊躇した。", " hesitates.") },
-            { 35, _("は痛みに震えた。", " quivers in pain.") },
-            { 20, _("は身もだえした。", " writhes about.") },
-            { 10, _("は苦痛で身もだえした。", " writhes in agony.") },
-            { 0, _("はぐにゃぐにゃと痙攣した。", " jerks limply.") },
-        } },
-    { d_char_is_any_of("g#+<>"),
-        {
-            { 95, _("は攻撃に肩をすくめた。", " shrugs off the attack.") },
-            { 75, _("は雷鳴のように吠えた。", " roars thunderously.") },
-            { 50, _("は苦しげに吠えた。", " rumbles.") },
-            { 35, _("はうめいた。", " grunts.") },
-            { 20, _("は攻撃を気にとめていない。", " ignores the attack.") },
-            { 10, _("は躊躇した。", " hesitates.") },
-            { 0, _("はくしゃくしゃになった。", " crumples.") },
-        } },
-    { [](const MonsterEntity &monster) {
-        const auto &monrace = monster.get_monrace();
-        return d_char_is_any_of("JMR")(monster) || !isalpha(monrace.d_char); },
-        {
-            { 95, _("はほとんど気にとめていない。", " barely notices.") },
-            { 75, _("はシーッと鳴いた。", " hisses.") },
-            { 50, _("は怒って頭を上げた。", " rears up in anger.") },
-            { 35, _("は猛然と威嚇した。", " hisses furiously.") },
-            { 20, _("は身もだえした。", " writhes about.") },
-            { 10, _("は苦痛で身もだえした。", " writhes in agony.") },
-            { 0, _("はぐにゃぐにゃと痙攣した。", " jerks limply.") },
-        } },
-    { d_char_is_any_of("f"),
-        {
-            { 95, _("は攻撃に肩をすくめた。", " shrugs off the attack.") },
-            { 75, _("は吠えた。", " roars.") },
-            { 50, _("は怒って吠えた。", " growls angrily.") },
-            { 35, _("は痛みでシーッと鳴いた。", " hisses with pain.") },
-            { 20, _("は痛みで弱々しく鳴いた。", " mewls in pain.") },
-            { 10, _("は苦痛にうめいた。", " hisses in agony.") },
-            { 0, _("は哀れな鳴き声を出した。", " mewls pitifully.") },
-        } },
-    { d_char_is_any_of("acFIKS"),
-        {
-            { 95, _("は攻撃を気にとめていない。", " ignores the attack.") },
-            { 75, _("はキーキー鳴いた。", " chitters.") },
-            { 50, _("はヨロヨロ逃げ回った。", " scuttles about.") },
-            { 35, _("はうるさく鳴いた。", " twitters.") },
-            { 20, _("は痛みに痙攣した。", " jerks in pain.") },
-            { 10, _("は苦痛で痙攣した。", " jerks in agony.") },
-            { 0, _("はピクピクひきつった。", " twitches.") },
-        } },
-    { d_char_is_any_of("B"),
-        {
-            { 95, _("はさえずった。", " chirps.") },
-            { 75, _("はピーピー鳴いた。", " twitters.") },
-            { 50, _("はギャーギャー鳴いた。", " squawks.") },
-            { 35, _("はギャーギャー鳴きわめいた。", " chatters.") },
-            { 20, _("は苦しんだ。", " jeers.") },
-            { 10, _("はのたうち回った。", " flutters about.") },
-            { 0, _("はキーキーと鳴き叫んだ。", " squeaks.") },
-        } },
-    { d_char_is_any_of("duDLUW"),
-        {
-            { 95, _("は攻撃を気にとめていない。", " ignores the attack.") },
-            { 75, _("はしり込みした。", " flinches.") },
-            { 50, _("は痛みでシーッと鳴いた。", " hisses in pain.") },
-            { 35, _("は痛みでうなった。", " snarls with pain.") },
-            { 20, _("は痛みに吠えた。", " roars with pain.") },
-            { 10, _("は苦しげに叫んだ。", " gasps.") },
-            { 0, _("は弱々しくうなった。", " snarls feebly.") },
-        } },
-    { d_char_is_any_of("s"),
-        {
-            { 95, _("は攻撃を気にとめていない。", " ignores the attack.") },
-            { 75, _("は攻撃に肩をすくめた。", " shrugs off the attack.") },
-            { 50, _("はカタカタと笑った。", " rattles.") },
-            { 35, _("はよろめいた。", " stumbles.") },
-            { 20, _("はカタカタ言った。", " rattles.") },
-            { 10, _("はよろめいた。", " staggers.") },
-            { 0, _("はガタガタ言った。", " clatters.") },
-        } },
-    { d_char_is_any_of("z"),
-        {
-            { 95, _("は攻撃を気にとめていない。", " ignores the attack.") },
-            { 75, _("は攻撃に肩をすくめた。", " shrugs off the attack.") },
-            { 50, _("はうめいた。", " groans.") },
-            { 35, _("は苦しげにうめいた。", " moans.") },
-            { 20, _("は躊躇した。", " hesitates.") },
-            { 10, _("はうなった。", " grunts.") },
-            { 0, _("はよろめいた。", " staggers.") },
-        } },
-    { d_char_is_any_of("G"),
-        {
-            { 95, _("は攻撃を気にとめていない。", " ignores the attack.") },
-            { 75, _("は攻撃に肩をすくめた。", " shrugs off the attack.") },
-            { 50, _("はうめいた。", " moans.") },
-            { 35, _("は泣きわめいた。", " wails.") },
-            { 20, _("は吠えた。", " howls.") },
-            { 10, _("は弱々しくうめいた。", " moans softly.") },
-            { 0, _("はかすかにうめいた。", " sighs.") },
-        } },
-    { d_char_is_any_of("CZ"),
-        {
-            { 95, _("は攻撃に肩をすくめた。", " shrugs off the attack.") },
-            { 75, _("は痛みでうなった。", " snarls with pain.") },
-            { 50, _("は痛みでキャンキャン吠えた。", " yelps in pain.") },
-            { 35, _("は痛みで鳴きわめいた。", " howls in pain.") },
-            { 20, _("は苦痛のあまり鳴きわめいた。", " howls in agony.") },
-            { 10, _("は苦痛でもだえ苦しんだ。", " writhes in agony.") },
-            { 0, _("は弱々しく吠えた。", " yelps feebly.") },
-        } },
-    { d_char_is_any_of("Xbilqrt"),
-        {
-            { 95, _("は攻撃を気にとめていない。", " ignores the attack.") },
-            { 75, _("は痛みでうなった。", " grunts with pain.") },
-            { 50, _("は痛みで叫んだ。", " squeals in pain.") },
-            { 35, _("は痛みで絶叫した。", " shrieks in pain.") },
-            { 20, _("は苦痛のあまり絶叫した。", " shrieks in agony.") },
-            { 10, _("は苦痛でもだえ苦しんだ。", " writhes in agony.") },
-            { 0, _("は弱々しく叫んだ。", " cries out feebly.") },
-        } },
-    { [](const MonsterEntity &) { return true; },
-        {
-            { 95, _("は攻撃に肩をすくめた。", " shrugs off the attack.") },
-            { 75, _("は痛みでうなった。", " grunts with pain.") },
-            { 50, _("は痛みで叫んだ。", " cries out in pain.") },
-            { 35, _("は痛みで絶叫した。", " screams in pain.") },
-            { 20, _("は苦痛のあまり絶叫した。", " screams in agony.") },
-            { 10, _("は苦痛でもだえ苦しんだ。", " writhes in agony.") },
-            { 0, _("は弱々しく叫んだ。", " cries out feebly.") },
-        } },
+static bool is_personified(const MonsterEntity &m_info)
+{
+    switch (m_info.r_idx) {
+    case MonsterRaceId::LAFFEY_II:
+        return true;
+    default:
+        return false;
+    }
+}
+
+static const std::map<int, concptr, std::greater<int>> pain_messages_common = {
+    { 95, _("は攻撃に肩をすくめた。", " shrugs off the attack.") },
+    { 75, _("は痛みでうなった。", " grunts with pain.") },
+    { 50, _("は痛みで叫んだ。", " cries out in pain.") },
+    { 35, _("は痛みで絶叫した。", " screams in pain.") },
+    { 20, _("は苦痛のあまり絶叫した。", " screams in agony.") },
+    { 10, _("は苦痛でもだえ苦しんだ。", " writhes in agony.") },
+    { 0, _("は弱々しく叫んだ。", " cries out feebly.") },
 };
 
+static const std::vector<pain_message_type>
+    pain_messages{
+        { is_personified, pain_messages_common },
+        { d_char_is_any_of(",ejmvwQ"), {
+                                           { 95, _("はほとんど気にとめていない。", " barely notices.") },
+                                           { 75, _("はしり込みした。", " flinches.") },
+                                           { 50, _("は縮こまった。", " squelches.") },
+                                           { 35, _("は痛みに震えた。", " quivers in pain.") },
+                                           { 20, _("は身もだえした。", " writhes about.") },
+                                           { 10, _("は苦痛で身もだえした。", " writhes in agony.") },
+                                           { 0, _("はぐにゃぐにゃと痙攣した。", " jerks limply.") },
+                                       } },
+        { d_char_is_any_of("l"), {
+                                     { 95, _("はほとんど気にとめていない。", " barely notices.") },
+                                     { 75, _("はしり込みした。", " flinches.") },
+                                     { 50, _("は躊躇した。", " hesitates.") },
+                                     { 35, _("は痛みに震えた。", " quivers in pain.") },
+                                     { 20, _("は身もだえした。", " writhes about.") },
+                                     { 10, _("は苦痛で身もだえした。", " writhes in agony.") },
+                                     { 0, _("はぐにゃぐにゃと痙攣した。", " jerks limply.") },
+                                 } },
+        { d_char_is_any_of("g#+<>"), {
+                                         { 95, _("は攻撃に肩をすくめた。", " shrugs off the attack.") },
+                                         { 75, _("は雷鳴のように吠えた。", " roars thunderously.") },
+                                         { 50, _("は苦しげに吠えた。", " rumbles.") },
+                                         { 35, _("はうめいた。", " grunts.") },
+                                         { 20, _("は攻撃を気にとめていない。", " ignores the attack.") },
+                                         { 10, _("は躊躇した。", " hesitates.") },
+                                         { 0, _("はくしゃくしゃになった。", " crumples.") },
+                                     } },
+        { [](const MonsterEntity &monster) {
+        const auto &monrace = monster.get_monrace();
+        return d_char_is_any_of("JMR")(monster) || !isalpha(monrace.d_char); }, {
+                                                    { 95, _("はほとんど気にとめていない。", " barely notices.") },
+                                                    { 75, _("はシーッと鳴いた。", " hisses.") },
+                                                    { 50, _("は怒って頭を上げた。", " rears up in anger.") },
+                                                    { 35, _("は猛然と威嚇した。", " hisses furiously.") },
+                                                    { 20, _("は身もだえした。", " writhes about.") },
+                                                    { 10, _("は苦痛で身もだえした。", " writhes in agony.") },
+                                                    { 0, _("はぐにゃぐにゃと痙攣した。", " jerks limply.") },
+                                                } },
+        { d_char_is_any_of("f"), {
+                                     { 95, _("は攻撃に肩をすくめた。", " shrugs off the attack.") },
+                                     { 75, _("は吠えた。", " roars.") },
+                                     { 50, _("は怒って吠えた。", " growls angrily.") },
+                                     { 35, _("は痛みでシーッと鳴いた。", " hisses with pain.") },
+                                     { 20, _("は痛みで弱々しく鳴いた。", " mewls in pain.") },
+                                     { 10, _("は苦痛にうめいた。", " hisses in agony.") },
+                                     { 0, _("は哀れな鳴き声を出した。", " mewls pitifully.") },
+                                 } },
+        { d_char_is_any_of("acFIKS"), {
+                                          { 95, _("は攻撃を気にとめていない。", " ignores the attack.") },
+                                          { 75, _("はキーキー鳴いた。", " chitters.") },
+                                          { 50, _("はヨロヨロ逃げ回った。", " scuttles about.") },
+                                          { 35, _("はうるさく鳴いた。", " twitters.") },
+                                          { 20, _("は痛みに痙攣した。", " jerks in pain.") },
+                                          { 10, _("は苦痛で痙攣した。", " jerks in agony.") },
+                                          { 0, _("はピクピクひきつった。", " twitches.") },
+                                      } },
+        { d_char_is_any_of("B"), {
+                                     { 95, _("はさえずった。", " chirps.") },
+                                     { 75, _("はピーピー鳴いた。", " twitters.") },
+                                     { 50, _("はギャーギャー鳴いた。", " squawks.") },
+                                     { 35, _("はギャーギャー鳴きわめいた。", " chatters.") },
+                                     { 20, _("は苦しんだ。", " jeers.") },
+                                     { 10, _("はのたうち回った。", " flutters about.") },
+                                     { 0, _("はキーキーと鳴き叫んだ。", " squeaks.") },
+                                 } },
+        { d_char_is_any_of("duDLUW"), {
+                                          { 95, _("は攻撃を気にとめていない。", " ignores the attack.") },
+                                          { 75, _("はしり込みした。", " flinches.") },
+                                          { 50, _("は痛みでシーッと鳴いた。", " hisses in pain.") },
+                                          { 35, _("は痛みでうなった。", " snarls with pain.") },
+                                          { 20, _("は痛みに吠えた。", " roars with pain.") },
+                                          { 10, _("は苦しげに叫んだ。", " gasps.") },
+                                          { 0, _("は弱々しくうなった。", " snarls feebly.") },
+                                      } },
+        { d_char_is_any_of("s"), {
+                                     { 95, _("は攻撃を気にとめていない。", " ignores the attack.") },
+                                     { 75, _("は攻撃に肩をすくめた。", " shrugs off the attack.") },
+                                     { 50, _("はカタカタと笑った。", " rattles.") },
+                                     { 35, _("はよろめいた。", " stumbles.") },
+                                     { 20, _("はカタカタ言った。", " rattles.") },
+                                     { 10, _("はよろめいた。", " staggers.") },
+                                     { 0, _("はガタガタ言った。", " clatters.") },
+                                 } },
+        { d_char_is_any_of("z"), {
+                                     { 95, _("は攻撃を気にとめていない。", " ignores the attack.") },
+                                     { 75, _("は攻撃に肩をすくめた。", " shrugs off the attack.") },
+                                     { 50, _("はうめいた。", " groans.") },
+                                     { 35, _("は苦しげにうめいた。", " moans.") },
+                                     { 20, _("は躊躇した。", " hesitates.") },
+                                     { 10, _("はうなった。", " grunts.") },
+                                     { 0, _("はよろめいた。", " staggers.") },
+                                 } },
+        { d_char_is_any_of("G"), {
+                                     { 95, _("は攻撃を気にとめていない。", " ignores the attack.") },
+                                     { 75, _("は攻撃に肩をすくめた。", " shrugs off the attack.") },
+                                     { 50, _("はうめいた。", " moans.") },
+                                     { 35, _("は泣きわめいた。", " wails.") },
+                                     { 20, _("は吠えた。", " howls.") },
+                                     { 10, _("は弱々しくうめいた。", " moans softly.") },
+                                     { 0, _("はかすかにうめいた。", " sighs.") },
+                                 } },
+        { d_char_is_any_of("CZ"), {
+                                      { 95, _("は攻撃に肩をすくめた。", " shrugs off the attack.") },
+                                      { 75, _("は痛みでうなった。", " snarls with pain.") },
+                                      { 50, _("は痛みでキャンキャン吠えた。", " yelps in pain.") },
+                                      { 35, _("は痛みで鳴きわめいた。", " howls in pain.") },
+                                      { 20, _("は苦痛のあまり鳴きわめいた。", " howls in agony.") },
+                                      { 10, _("は苦痛でもだえ苦しんだ。", " writhes in agony.") },
+                                      { 0, _("は弱々しく吠えた。", " yelps feebly.") },
+                                  } },
+        { d_char_is_any_of("Xbilqrt"), {
+                                           { 95, _("は攻撃を気にとめていない。", " ignores the attack.") },
+                                           { 75, _("は痛みでうなった。", " grunts with pain.") },
+                                           { 50, _("は痛みで叫んだ。", " squeals in pain.") },
+                                           { 35, _("は痛みで絶叫した。", " shrieks in pain.") },
+                                           { 20, _("は苦痛のあまり絶叫した。", " shrieks in agony.") },
+                                           { 10, _("は苦痛でもだえ苦しんだ。", " writhes in agony.") },
+                                           { 0, _("は弱々しく叫んだ。", " cries out feebly.") },
+                                       } },
+        { [](const MonsterEntity &) { return true; }, pain_messages_common },
+    };
+
 MonsterPainDescriber::MonsterPainDescriber(PlayerType *player_ptr, const MonsterEntity *m_ptr)
     : player_ptr(player_ptr)
     , m_ptr(m_ptr)
index f79f75c..1f40dc3 100644 (file)
@@ -109,12 +109,11 @@ static void decide_summon_kin_caster(
             msg_format(_("%s^が何かをつぶやいた。", "%s^ mumbles."), m_name);
         }
     } else if (mon_to_player || (mon_to_mon && known && see_either)) {
-        auto *r_ptr = &m_ptr->get_monrace();
 #ifdef JP
         (void)m_poss;
 #endif
-        _(msg_format("%sが魔法で%sを召喚した。", m_name, (r_ptr->kind_flags.has(MonsterKindType::UNIQUE) ? "手下" : "仲間")),
-            msg_format("%s^ magically summons %s %s.", m_name, m_poss, (r_ptr->kind_flags.has(MonsterKindType::UNIQUE) ? "minions" : "kin")));
+        _(msg_format("%sが魔法で%sを召喚した。", m_name, m_ptr->get_pronoun_of_summoned_kin().data()),
+            msg_format("%s^ magically summons %s %s.", m_name, m_poss, m_ptr->get_pronoun_of_summoned_kin().data()));
     }
 
     if (mon_to_mon && known && !see_either) {
@@ -203,6 +202,9 @@ MonsterSpellResult spell_RF6_S_KIN(PlayerType *player_ptr, POSITION y, POSITION
     case MonsterRaceId::OOTSUKI:
         count += summon_PLASMA(player_ptr, y, x, rlev, m_idx);
         break;
+    case MonsterRaceId::LAFFEY_II:
+        count += summon_LAFFEY_II(player_ptr, Pos2D(y, x), m_idx);
+        break;
     default:
         count += summon_Kin(player_ptr, y, x, rlev, m_idx);
         break;
index 53caf56..539d7f8 100644 (file)
@@ -334,3 +334,21 @@ MONSTER_NUMBER summon_PLASMA(PlayerType *player_ptr, POSITION y, POSITION x, int
     msg_print(_("プーラーズーマーッ!!", "P--la--s--ma--!!"));
     return count;
 }
+
+/*!
+ * @brief ウサウサストライカー召喚の処理。 /
+ * @param player_ptr プレイヤーへの参照ポインタ
+ * @param y 対象の地点のy座標
+ * @param x 対象の地点のx座標
+ * @param m_idx 呪文を唱えるモンスターID
+ * @return 召喚したモンスターの数を返す。
+ */
+MONSTER_NUMBER summon_LAFFEY_II(PlayerType *player_ptr, const Pos2D &position, MONSTER_IDX m_idx)
+{
+    auto count = 0;
+    constexpr auto summon_num = 2;
+    for (auto k = 0; k < summon_num; k++) {
+        count += summon_named_creature(player_ptr, m_idx, position.y, position.x, MonsterRaceId::BUNBUN_STRIKERS, PM_NONE);
+    }
+    return count;
+}
index f1b5752..f29a79f 100644 (file)
@@ -1,6 +1,7 @@
 #pragma once
 
 #include "system/angband.h"
+#include "util/point-2d.h"
 
 class PlayerType;
 MONSTER_NUMBER summon_EAGLE(PlayerType *player_ptr, POSITION y, POSITION x, int rlev, MONSTER_IDX m_idx);
@@ -19,3 +20,4 @@ MONSTER_NUMBER summon_VESPOID(PlayerType *player_ptr, POSITION y, POSITION x, in
 MONSTER_NUMBER summon_YENDER_WIZARD(PlayerType *player_ptr, POSITION y, POSITION x, MONSTER_IDX m_idx);
 MONSTER_NUMBER summon_THUNDERS(PlayerType *player_ptr, POSITION y, POSITION x, int rlev, MONSTER_IDX m_idx);
 MONSTER_NUMBER summon_PLASMA(PlayerType *player_ptr, POSITION y, POSITION x, int rlev, MONSTER_IDX m_idx);
+MONSTER_NUMBER summon_LAFFEY_II(PlayerType *player_ptr, const Pos2D &position, MONSTER_IDX m_idx);
index e06e4e2..5072801 100644 (file)
@@ -329,3 +329,8 @@ void MonsterEntity::set_hostile()
 
     this->mflag2.reset({ MonsterConstantFlagType::PET, MonsterConstantFlagType::FRIENDLY });
 }
+
+std::string MonsterEntity::get_pronoun_of_summoned_kin() const
+{
+    return this->get_monrace().get_pronoun_of_summoned_kin();
+}
index 24e023b..2f91456 100644 (file)
@@ -91,6 +91,7 @@ public:
     bool is_explodable() const;
     std::string get_died_message() const;
     std::pair<TERM_COLOR, int> get_hp_bar_data() const;
+    std::string get_pronoun_of_summoned_kin() const;
 
     void set_hostile();
 };
index 9515079..cee13a2 100644 (file)
@@ -66,6 +66,19 @@ void MonsterRaceInfo::kill_unique()
     }
 }
 
+std::string MonsterRaceInfo::get_pronoun_of_summoned_kin() const
+{
+    if (this->kind_flags.has(MonsterKindType::UNIQUE)) {
+        return _("手下", "minions");
+    }
+    switch (this->idx) {
+    case MonsterRaceId::LAFFEY_II:
+        return _("ウサウサストライカー", "Bunbun Strikers");
+    default:
+        return _("仲間", "kin");
+    }
+}
+
 const std::map<MonsterRaceId, std::set<MonsterRaceId>> MonraceList::unified_uniques = {
     { MonsterRaceId::BANORLUPART, { MonsterRaceId::BANOR, MonsterRaceId::LUPART } },
 };
index 8e83a3a..2b5cb15 100644 (file)
@@ -143,6 +143,7 @@ public:
     bool is_explodable() const;
     std::string get_died_message() const;
     void kill_unique();
+    std::string get_pronoun_of_summoned_kin() const;
 };
 
 class MonraceList {