トップ «前の日記(2013/06/11) 最新 次の日記(2013/06/13)» 編集

SikabaneWorksが関係するコンテンツ(主に*band系ローグライク)の開発近況・補足から全く個人的な雑記まで。

[WEB:屍の見える丘公園]| [RSS]

Angband | Badiashimshe | C# | CRAUZEL | D'angband/小説草稿 | D'angband/開発 | DarkSouls | Demon'sSouls | DungeonCrawl | ElvenUteruses | Haskell | Hengband | J9シリーズ | LEGO | LineDrawing | MISC | MTG | Mac | Math | Moria | R-18 | Roguelike | Rough | RoughSketch | Ruby | SDL | UNIX | VMware | WarHammer | Zangband | アタシラヂョウヲウ | イラスト | ガジェット | ゲーム | ゲーム紹介 | ゲーム製作技術 | ゲーム論 | スケッチ | ツクール | テクノロジー | ニコニコ動画 | ファルコム | ファンタジー | マリオ | ヴィーヤウトゥムノ | 別記事追加予定 | 変愚蛮怒 | 変愚蛮怒/スポイラー | 変愚蛮怒/元ネタ探訪 | 変愚蛮怒/攻略 | 変愚蛮怒/開発 | 宗教 | 情報 | 政治 | 文字コード | 日ペ昔話 | 東方ワンドロ | 東方外法漢女 | 歴史 | 漫画製作 | 版権絵 | 画像処理 | 翻訳 | 自然言語 | 艦隊これくしょん | 落書き | 言語解析 | 読書 | 超人ロック | 追記予定 | 通信 | 阿片窟 | 馬鹿馬鹿蛮怒/開発 | 魔法少女まどか☆マギカ | 魚類版深夜の真剣お絵描き60分一本勝負


2013/06/12

[変愚蛮怒/開発]パッチを解読してみる・種族:ショゴス編

元々1.6.x系か1.7.x系列向けに実装されたもので、当然現在の最新版では使えないパッチである。

今後の変愚正式版やD'angへのアイデア流用や、実際に種族を追加するためにどのような手続きを行う必要があるかの手本として、以下差分毎に引用させてもらう。

パッチ実装者にはともかくも感謝の意を示したい。

都市情報の追加

都市の施設には種族毎に利用可能か否を指定する行が存在する。バルログやゾンビ等が宿屋の食事を利用できない設定等は、これによって実装されている。いずれも配列の末尾にショゴスが施設を利用できるか否かのフラグを0=利用できない、1=利用できる、で指定してある。

diff -u -rN hengband/lib/edit/t0000001.txt hengband-s/lib/edit/t0000001.txt
--- hengband/lib/edit/t0000001.txt	Sun Nov 30 07:19:37 2003
+++ hengband-s/lib/edit/t0000001.txt	Fri Jun 11 02:26:03 2004
@@ -459,8 +459,8 @@
 B:0:A:3:クエスト:0:0:q:6:0
 B:$0:A:4:Teleport to other town:500:500:m:42:0
 B:0:A:4:他の町へ移動:500:500:m:42:0
-B:$0:R:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:0:0:0:0:0:1:1:0:1:0:1:1:1:0
-B:0:R:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:0:0:0:0:0:1:1:0:1:0:1:1:1:0
+B:$0:R:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:0:0:0:0:0:1:1:0:1:0:1:1:1:0:1
+B:0:R:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:0:0:0:0:0:1:1:0:1:0:1:1:1:0:1

 B:$1:N:Mayor:Uldrik:Human
 B:1:N:村長:ウルドリック:人間
diff -u -rN hengband/lib/edit/t0000002.txt hengband-s/lib/edit/t0000002.txt
--- hengband/lib/edit/t0000002.txt	Sun Nov 30 06:06:29 2003
+++ hengband-s/lib/edit/t0000002.txt	Fri Jun 11 02:27:57 2004
@@ -305,8 +305,8 @@
 B:4:A:2:噂を聞く:10:10:u:19:0
 B:$4:A:3:Teleport to other town:500:500:m:42:0
 B:4:A:3:他の町へ移動:500:500:m:42:0
-B:$4:R:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:0:0:0:0:0:1:1:0:1:0:1:1:1:0
-B:4:R:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:0:0:0:0:0:1:1:0:1:0:1:1:1:0
+B:$4:R:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:0:0:0:0:0:1:1:0:1:0:1:1:1:0:1
+B:4:R:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:0:0:0:0:0:1:1:0:1:0:1:1:1:0:1

 B:$5:N:Beastmaster:Lorien:Elf
 B:5:N:モンスター仙人:ロリエン:エルフ
diff -u -rN hengband/lib/edit/t0000003.txt hengband-s/lib/edit/t0000003.txt
--- hengband/lib/edit/t0000003.txt	Sun Nov 30 06:06:29 2003
+++ hengband-s/lib/edit/t0000003.txt	Fri Jun 11 02:28:42 2004
@@ -264,8 +264,8 @@
 B:4:A:2:噂を聞く:10:10:u:19:0
 B:$4:A:3:Teleport to other town:500:500:m:42:0
 B:4:A:3:他の町へ移動:500:500:m:42:0
-B:$4:R:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:0:0:0:0:0:1:1:0:1:0:1:1:1:0
-B:4:R:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:0:0:0:0:0:1:1:0:1:0:1:1:1:0
+B:$4:R:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:0:0:0:0:0:1:1:0:1:0:1:1:1:0:1
+B:4:R:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:0:0:0:0:0:1:1:0:1:0:1:1:1:0:1

 B:$5:N:Beastmaster:Draxle:Draconian
 B:5:N:モンスター仙人:ドラクスル:ドラコニアン
diff -u -rN hengband/lib/edit/t0000004.txt hengband-s/lib/edit/t0000004.txt
--- hengband/lib/edit/t0000004.txt	Sun Nov 30 06:06:29 2003
+++ hengband-s/lib/edit/t0000004.txt	Fri Jun 11 02:29:34 2004
@@ -171,8 +171,8 @@
 B:4:A:2:噂を聞く:10:10:u:19:0
 B:$4:A:3:Teleport to other town:500:500:m:42:0
 B:4:A:3:他の町へ移動:500:500:m:42:0
-B:$4:R:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:0:0:0:0:0:1:1:0:1:0:1:1:1:0
-B:4:R:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:0:0:0:0:0:1:1:0:1:0:1:1:1:0
+B:$4:R:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:0:0:0:0:0:1:1:0:1:0:1:1:1:0:1
+B:4:R:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:0:0:0:0:0:1:1:0:1:0:1:1:1:0:1

 B:$5:N:Beastmaster:Aradreth:Elf
 B:5:N:モンスター仙人:アラドレス:エルフ
@@ -250,8 +250,8 @@
 B:13:A:0:ダンジョンへ帰還:0:150:r:33:0
 B:$13:A:1:Teleport to dungeon-level:100000:1000000:t:34:0
 B:13:A:1:階を指定してテレポート:100000:1000000:t:34:0
-B:$13:R:0:0:0:0:0:0:0:0:1:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0
-B:13:R:0:0:0:0:0:0:0:0:1:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0
+B:$13:R:0:0:0:0:0:0:0:0:1:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0
+B:13:R:0:0:0:0:0:0:0:0:1:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0
 B:$13:M:0:0:0:0:0:2:0:0:0:0
 B:13:M:0:0:0:0:0:2:0:0:0:0
diff -u -rN hengband/lib/edit/t0000005.txt hengband-s/lib/edit/t0000005.txt
--- hengband/lib/edit/t0000005.txt	Sun Nov 30 06:06:29 2003
+++ hengband-s/lib/edit/t0000005.txt	Fri Jun 11 02:30:45 2004
@@ -128,8 +128,8 @@
 B:4:A:1:食事をする:2:2:f:18:1
 B:$4:A:2:Listen for rumors:10:10:u:19:0
 B:4:A:2:噂を聞く:10:10:u:19:0
-B:$4:R:2:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:0:0:0:0:0:1:1:0:1:0:1:1:1:0
-B:4:R:2:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:0:0:0:0:0:1:1:0:1:0:1:1:1:0
+B:$4:R:2:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:0:0:0:0:0:1:1:0:1:0:1:1:1:0:1
+B:4:R:2:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:0:0:0:0:0:1:1:0:1:0:1:1:1:0:1
 B:$4:A:3:Identify item:100:100:i:44:0
 B:4:A:3:アイテム鑑定:100:100:i:44:0

@@ -152,8 +152,8 @@
 B:14:A:0:クエスト:0:0:q:6:1
 B:$14:A:1:Cure mutation:1000:5000:m:35:0
 B:14:A:1:突然変異を治療する:1000:5000:m:35:0
-B:$14:R:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:1:0:0:0:0:0:0:0
-B:14:R:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:1:0:0:0:0:0:0:0
+B:$14:R:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:1:0:0:0:0:0:0:0:0
+B:14:R:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:1:0:0:0:0:0:0:0:0
 B:$14:M:0:0:0:2:0:0:0:0:0:0
 B:14:M:0:0:0:2:0:0:0:0:0:0
diff -u -rN hengband/lib/edit/t_lite.txt hengband-s/lib/edit/t_lite.txt
--- hengband/lib/edit/t_lite.txt	Sun Nov 30 07:19:37 2003
+++ hengband-s/lib/edit/t_lite.txt	Mon Jun 14 18:09:35 2004
@@ -524,8 +524,8 @@
 B:0:A:1:食事をする:1:1:f:18:1
 B:$0:A:2:Listen for rumors:5:5:u:19:0
 B:0:A:2:噂を聞く:5:5:u:19:0
-B:$0:R:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:0:0:0:0:0:1:1:0:1:0:1:1:1:0
-B:0:R:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:0:0:0:0:0:1:1:0:1:0:1:1:1:0
+B:$0:R:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:0:0:0:0:0:1:1:0:1:0:1:1:1:0:1
+B:0:R:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:0:0:0:0:0:1:1:0:1:0:1:1:1:0:1

 B:$1:N:Mayor:Uldrik:Human
 B:1:N:村長:ウルドリック:人間
@@ -655,8 +655,8 @@
 B:13:A:0:クエスト:0:0:q:6:1
 B:$13:A:1:Cure mutation:1000:5000:m:35:0
 B:13:A:1:突然変異を治療する:1000:5000:m:35:0
-B:$13:R:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:1:0:0:0:0:0:0:0
-B:13:R:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:1:0:0:0:0:0:0:0
+B:$13:R:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:1:0:0:0:0:0:0:0:0
+B:13:R:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:1:0:0:0:0:0:0:0:0
 B:$13:M:0:0:0:2:0:0:0:0:0:0
 B:13:M:0:0:0:2:0:0:0:0:0:0

ヘルプの修正

なんとショゴスに関する情報をヘルプの各種情報にも追加してくれている。下手すると本家開発版すらサボっていることを、丁寧にやってくれるパッチ製作者は開発者の鑑。

diff -u -rN hengband/lib/help/editor.txt hengband-s/lib/help/editor.txt
--- hengband/lib/help/editor.txt	Thu Dec  4 23:55:53 2003
+++ hengband-s/lib/help/editor.txt	Fri Jun 11 04:58:45 2004
@@ -313,7 +313,7 @@
       Half-Giant, Half-Titan, Cyclops, Yeek, Klackon, Kobold,
       Nibelung, Dark-Elf, Draconian, Mindflayer, Imp, Golem,
       Skeleton, Zombie, Vampire, Spectre, Sprite, Beastman, Ent,
-      Archon, Balrog, Dunadan, Shadow-Fairy, Kutar, Android,
+      Archon, Balrog, Dunadan, Shadow-Fairy, Kutar, Android, Shoggoth

     $CLASS
      Returns name of player class. One of below:
diff -u -rN hengband/lib/help/jeditor.txt hengband-s/lib/help/jeditor.txt
--- hengband/lib/help/jeditor.txt	Fri Dec  5 15:18:03 2003
+++ hengband-s/lib/help/jeditor.txt	Fri Jun 11 04:58:29 2004
@@ -544,7 +544,7 @@
    Cyclops, Yeek, Klackon, Kobold, Nibelung, Dark-Elf, Draconian,
    Mindflayer, Imp, Golem, Skeleton, Zombie, Vampire, Spectre, Sprite,
    Beastman, Ent, Archon, Balrog, Dunadan, Shadow-Fairy, Kuta,
-   Android
+   Android, Shoggoth
    のどれか

 $CLASS
diff -u -rN hengband/lib/help/jraceclas.txt hengband-s/lib/help/jraceclas.txt
--- hengband/lib/help/jraceclas.txt	Sun Nov 16 23:42:05 2003
+++ hengband-s/lib/help/jraceclas.txt	Fri Jun 11 05:46:48 2004
@@ -411,8 +411,16 @@
     身体のいたるところに電子回路が組み込まれているため、電撃によって通
     常よりも大きなダメージを受けてしまいます。彼らは食物からほとんど動
     力を得られませんが、油を補給する事で動力源を得る事ができます。
-

+***** <Shoggoth>
+--- ショゴス ---
+
+    ショゴスは絶え間なく「テケリ・リ!」と叫ぶ、ゼリー状の悪夢のような
+    存在です。愚かですが、外なる神と関係があるので賢いです。タフであり、
+    麻痺することも朦朧とすることもありません。光なしで物を見ることがで
+    き、見えない物を見ることができます。叫び声は敵を起こしてしまいます。
+    ショゴスは通常は経験値を得ることができませんが、食事により経験値を
+    得ることができます。ショゴスは何でも食べることができます。

 ***** <TheClasses>
 === 職業 ===
@@ -1061,6 +1069,7 @@
 影フェアリー   -2   +2   +2   +1   -1   +0      7         +20%
 クター         +0   -1   -1   +1   +2   +3      11        +40%
 アンドロイド   +4   -5   -5   +0   +4   -2      13        +100%
+ショゴス       +2   -4   +4   +0   +4   -6      13        +100%


 --- Table 2 - Class Statistic Bonus Table ---
@@ -1159,6 +1168,7 @@
 影フェアリー   +7    +8    +0    +6    +12   +15   -10   -5    40 feet
 クター         -2    +5    +5    +5    -2    +6    +0    -5    None
 アンドロイド   +0    -5    +0    -2    +3    +14   +20   +10   None
+ショゴス       -5    +0    +8    -inf  +0    +7    +20   +0    None


 --- Table 5 - Class Skill Bonus Table ---
diff -u -rN hengband/lib/help/raceclas.txt hengband-s/lib/help/raceclas.txt
--- hengband/lib/help/raceclas.txt	Sun Nov 16 23:42:05 2003
+++ hengband-s/lib/help/raceclas.txt	Fri Jun 11 04:57:46 2004
@@ -458,6 +458,15 @@
     gain very little nutrition from the food of mortals, but they can
     use flasks of oil as their energy source.

+***** <Shoggoth>
+--- Shoggoth ---
+
+    A Shoggoth is a jelly-like nightmare that constantly cries
+    'Tekeli-li!'.  Although it is stupid, its relationship to the
+    outer gods makes it wise.  It is tough and it can't be paralyzed
+    or stunned.  It can see without light and see the invisible.  Its
+    cry wakes its enemies up.  It doesn't acquire experience normally,
+    but it can acquire experience by eating.  It can eat anything.

 ***** <TheClasses>
 === The Classes ===
@@ -1143,6 +1152,7 @@
 Shadow-Fairy   -2   +2   +2   +1   -1   +0      7         +20%
 Kutar          +0   -1   -1   +1   +2   +3      11        +40%
 Android        +4   -5   -5   +0   +4   -2      13        +100%
+Shoggoth       +2   -4   +4   +0   +4   -6      13        +100%


 --- Table 2 - Class Statistic Bonus Table ---
@@ -1244,6 +1254,7 @@
 Shadow-Fairy   +7    +8    +0    +6    +12   +15   -10   -5    40 feet
 Kutar          -2    +5    +5    +5    -2    +6    +0    -5    None
 Android        +0    -5    +0    -2    +3    +14   +20   +10   None
+Shoggoth       -5    +0    +8    -inf  +0    +7    +20   +0    None

 --- Table 5 - Class Skill Bonus Table ---

徳の設定

種族固有の徳を指定する処理。「活」と「正」か。

diff -u -rN hengband/src/avatar.c hengband-s/src/avatar.c
--- hengband/src/avatar.c	Sun Jan  4 14:46:48 2004
+++ hengband-s/src/avatar.c	Fri Jun 11 03:33:31 2004
@@ -332,7 +332,7 @@
 	case RACE_HIGH_ELF: case RACE_KUTA:
 		p_ptr->vir_types[i++] = V_VITALITY;
 		break;
-	case RACE_HALF_GIANT: case RACE_GOLEM: case RACE_ANGEL: case RACE_DEMON:
+	case RACE_HALF_GIANT: case RACE_GOLEM: case RACE_ANGEL: case RACE_DEMON: case RACE_SHOGGOTH:
 		p_ptr->vir_types[i++] = V_JUSTICE;
 		break;
 	case RACE_HALF_TITAN:

生い立ち設定

バルログ等と同じく一種類のみ。

余談だがショゴスは元は古のものが肉体労働向けに創造した奉仕種族が知性を持ち反乱を起こしたもので、ウボ=サスラと繋がりを持つ設定は自分の知る限り皆無である。

追記

黒扇娘娘的信使さんから以下のようなご指摘をツイートで頂いた。

成程、原ショゴスか、つまりこの変愚のショゴスは古のものの手が加わったり、反乱したことも無い、文面通りのごく自然発生的な生まれということになるのか。これは勉強不足だった。

diff -u -rN hengband/src/birth.c hengband-s/src/birth.c
--- hengband/src/birth.c	Thu Mar 11 20:57:56 2004
+++ hengband-s/src/birth.c	Fri Jun 11 05:46:24 2004
@@ -1608,6 +1608,16 @@
 	{", and you firmly believe that you are a real one.", 95, 158, 0, 50},
 	{", and you are almost indistinguishable from a real one.", 100, 158, 0, 100},
 #endif
+
+        /*
+         * just a placeholder --- if you care about the background,
+         * edit it manually
+         */
+#ifdef JP
+	{"あなたは自存する源『ウボ=サスラ』から生まれました。", 100, 170, 0, 0},
+#else
+	{"You were born of Ubbo-Sathla, the Unbegotten Source.", 100, 170, 0, 0}
+#endif
 };
@@ -2974,6 +2988,11 @@
 			chart = 155;
 			break;
 		}
+		case RACE_SHOGGOTH:
+		{
+			chart = 170;
+			break;
+		}
 		default:
 		{
 			chart = 0;

キャラ作成時の種族紹介

 static cptr race_jouhou[MAX_RACES] =
@@ -1685,7 +1695,9 @@

 "クターとしている無表情の謎の生物です。彼らは外見がかわいらしいため、魅力が高いです。彼らは混乱しません。なぜなら、混乱してもクターとしているため変わりないからです。しかも、そのクターとしている外見から敵に見つかりにくいです。しかし、彼らは注意力が少ないため探索や知覚能力は悪いです。彼らはレベルが上がると横に伸びてACを上げる技を覚えますが、伸びている間は魔法防御能力は低くなってしまいます。",

-"アンドロイドは機械の身体を持つ人工的な存在です。魔法をうまく使うことはできませんが、戦士としては非常に優れています。彼らは他の種族のように経験値を得て成長するということはありません。身体に身につける装備によって成長します。ただし、指輪、アミュレット、光源は成長に影響しません。彼らは毒の耐性を持ち、麻痺知らずで、生命力を吸われることがありません。また、身体が頑丈なのでACにボーナスを得ます。しかし身体のいたるところに電子回路が組み込まれているため、電撃によって通常よりも大きなダメージを受けてしまいます。彼らは食物からほとんど動力を得られませんが、油を補給する事で動力源を得る事ができます。"
+"アンドロイドは機械の身体を持つ人工的な存在です。魔法をうまく使うことはできませんが、戦士としては非常に優れています。彼らは他の種族のように経験値を得て成長するということはありません。身体に身につける装備によって成長します。ただし、指輪、アミュレット、光源は成長に影響しません。彼らは毒の耐性を持ち、麻痺知らずで、生命力を吸われることがありません。また、身体が頑丈なのでACにボーナスを得ます。しかし身体のいたるところに電子回路が組み込まれているため、電撃によって通常よりも大きなダメージを受けてしまいます。彼らは食物からほとんど動力を得られませんが、油を補給する事で動力源を得る事ができます。",
+
+"ショゴスは絶え間なく「テケリ・リ!」と叫ぶ、ゼリー状の悪夢のような存在です。愚かですが、外なる神と関係があるので賢いです。タフであり、麻痺することも朦朧とすることもありません。光なしで物を見ることができ、見えない物を見ることができます。叫び声は敵を起こしてしまいます。ショゴスは通常は経験値を得ることができませんが、食事により経験値を得ることができます。ショゴスは何でも食べることができます。"

 #else

@@ -1761,7 +1773,9 @@

 "A Kutar is an expressionless animal-like living creature.  The word 'kuta' means 'absentmindedly' or 'vacantly'.  Their absentmindedness hurts their searching and perception skills, but renders them incapable of being confused.  Their unearthly calmness and serenity make them among the most stealthy of any race.  Kutars, although expressionless, are beautiful and so have a high charisma.  Members of this race can learn to expand their body horizontally.  This increases armour class, but renders them vulnerable to magical attacks.",

-"An android is a artificial creation with a body of machinery.  They are poor at spell casting, but they make excellent warriors.  They don't acquire experience like other races, but rather gain in power as they attach new equipment to their frame.  Rings, amulets, and lights do not influence growth.  Androids are resistant to poison, can move freely, and are immune to life-draining attacks.  Moreover, because of their hard metallic bodies, they get a bonus to AC.  Androids have electronic circuits throughout their body and must beware of electric shocks.  They gain very little nutrition from the food of mortals, but they can use flasks of oil as their energy source."
+"An android is a artificial creation with a body of machinery.  They are poor at spell casting, but they make excellent warriors.  They don't acquire experience like other races, but rather gain in power as they attach new equipment to their frame.  Rings, amulets, and lights do not influence growth.  Androids are resistant to poison, can move freely, and are immune to life-draining attacks.  Moreover, because of their hard metallic bodies, they get a bonus to AC.  Androids have electronic circuits throughout their body and must beware of electric shocks.  They gain very little nutrition from the food of mortals, but they can use flasks of oil as their energy source.",
+
+"A Shoggoth is a jelly-like nightmare that constantly cries 'Tekeli-li!'.  Although it is stupid, its relationship to the outer gods makes it wise.  It is tough and it can't be paralyzed or stunned.  It can see without light and see the invisible.  Its cry wakes its enemies up.  It doesn't acquire experience normally, but it can acquire experience by eating.  It can eat anything."

 #endif
 };

種族に依存する、初期所持品の指定

バルログに最初から人型生物の死体を持たせる処理などと同等である。スライムモルドを大量に所持するらしい。

また、後述の通り、忍者と同様に暗がりを最初から見通せる性質を持っているので光源(松明)が初期所持品から抜ける。

@@ -3833,6 +3852,14 @@

 		break;

+	case RACE_SHOGGOTH:
+		/* Slime Molds */
+		object_prep(q_ptr, lookup_kind(TV_FOOD, SV_FOOD_SLIME_MOLD));
+		q_ptr->number = (byte)rand_range(15, 23);
+		add_outfit(q_ptr);
+
+		break;
+
 	default:
 		/* Food rations */
 		object_prep(q_ptr, lookup_kind(TV_FOOD, SV_FOOD_RATION));
@@ -3853,7 +3880,8 @@

 		add_outfit(q_ptr);
 	}
-	else if (p_ptr->pclass != CLASS_NINJA)
+	else if ((p_ptr->pclass != CLASS_NINJA)
+                 && (p_ptr->prace != RACE_SHOGGOTH))
 	{
 		/* Hack -- Give the player some torches */
 		object_prep(q_ptr, lookup_kind(TV_LITE, SV_LITE_TORCH));

死の大鎌の反射スレイ

DEMON持ち種族扱いとしてダメージが3倍になる。

diff -u -rN hengband/src/cmd1.c hengband-s/src/cmd1.c
--- hengband/src/cmd1.c	Mon Jan 19 13:27:35 2004
+++ hengband-s/src/cmd1.c	Fri Jun 11 03:31:46 2004
@@ -2939,6 +2939,7 @@
 							case RACE_SPECTRE:
 							case RACE_DEMON:
 							case RACE_DRACONIAN:
+                                                        case RACE_SHOGGOTH:
 								mult = 30;break;
 							default:
 								mult = 10;break;

食事をとった場合の効果

基本的に何でも食べると最大満腹状態になる。

diff -u -rN hengband/src/cmd6.c hengband-s/src/cmd6.c
--- hengband/src/cmd6.c	Wed Feb 11 02:01:59 2004
+++ hengband-s/src/cmd6.c	Fri Jun 11 19:45:14 2004
@@ -605,12 +605,134 @@
 		/* Waybread is always fully satisfying. */
 		set_food(MAX(p_ptr->food, PY_FOOD_MAX - 1));
 	}
+	else if (prace_is_(RACE_SHOGGOTH))
+	{
+		/* A shoggoth happily eats anything. */
+		set_food(MAX(p_ptr->food, PY_FOOD_MAX - 1));
+	}
 	else
 	{
 		/* Food can feed the player */
 		(void)set_food(p_ptr->food + o_ptr->pval);
 	}

また、この種族は捕食によって経験値を得る仕様になっているため、アイテムの価値や種類に応じてかなり複雑な経験値算出をおこなっているようである。

+        if ((prace_is_(RACE_SHOGGOTH)) && (!(p_ptr->is_dead)))
+        {
+          object_type forge;
+          object_type *q_ptr = &forge;
+          u32b value, exp;
+          int level = MAX(k_info[o_ptr->k_idx].level - 8, 1);
+
+          /* Wipe the object */
+          object_wipe(q_ptr);
+
+          object_copy(q_ptr, o_ptr);
+          /*
+           * we do consider discount here --- this should prevent the
+           * abuse of the magic 'Trump Branding' and such
+           */
+          q_ptr->curse_flags = 0L;
+
+          if (object_is_fixed_artifact(o_ptr))
+          {
+            level = (level + MAX(a_info[o_ptr->name1].level - 8, 5)) / 2;
+            level += MIN(20, a_info[o_ptr->name1].rarity/(a_info[o_ptr->name1].gen_flags & TRG_INSTA_ART ? 10 : 3));
+          }
+          else if (object_is_ego(o_ptr))
+          {
+            level += MAX(3, (e_info[o_ptr->name2].rating - 5)/2);
+          }
+          else if (o_ptr->art_name)
+          {
+            s32b total_flags = flag_cost(o_ptr, o_ptr->pval);
+            int fake_level;
+
+            if (!object_is_weapon_ammo(o_ptr))
+            {
+              /* For armors */
+              if (total_flags < 15000) fake_level = 10;
+              else if (total_flags < 35000) fake_level = 25;
+              else fake_level = 40;
+            }
+            else
+            {
+              /* For weapons */
+              if (total_flags < 20000) fake_level = 10;
+              else if (total_flags < 45000) fake_level = 25;
+              else fake_level = 40;
+            }
+
+            level = MAX(level, (level + MAX(fake_level - 8, 5)) / 2
+                        + 3);
+          }
+
+          value = object_value_real(q_ptr);
+          /* Apply discount (if any) */
+          if (q_ptr->discount) value -= (value * q_ptr->discount / 100L);
+
+          if ((o_ptr->tval == TV_CORPSE) && (o_ptr->pval > 0))
+          {
+            monster_race *r_ptr = &r_info[q_ptr->pval];
+            value = r_ptr->mexp * r_ptr->level;
+          }
+
+          if (value > 0)
+          {
+            if ((o_ptr->tval == TV_SOFT_ARMOR) && (o_ptr->sval == SV_ABUNAI_MIZUGI) && (p_ptr->pseikaku != SEIKAKU_SEXY)) value /= 32;
+            if (value > 5000000L) value = 5000000L;
+            if ((o_ptr->tval == TV_DRAG_ARMOR) || (o_ptr->tval == TV_CARD))
+              level /= 2;
+
+            if (object_is_artifact(o_ptr) || object_is_ego(o_ptr) ||
+                (o_ptr->tval == TV_DRAG_ARMOR) ||
+                ((o_ptr->tval == TV_HELM) && (o_ptr->sval == SV_DRAGON_HELM)) ||
+                ((o_ptr->tval == TV_SHIELD) && (o_ptr->sval == SV_DRAGON_SHIELD)) ||
+                ((o_ptr->tval == TV_GLOVES) && (o_ptr->sval == SV_SET_OF_DRAGON_GLOVES)) ||
+                ((o_ptr->tval == TV_BOOTS) && (o_ptr->sval == SV_PAIR_OF_DRAGON_GREAVE)) ||
+                ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_DIAMOND_EDGE)))
+            {
+              if (level > 65) level = 35 + (level - 65) / 5;
+              else if (level > 35) level = 25 + (level - 35) / 3;
+              else if (level > 15) level = 15 + (level - 15) / 2;
+              exp = MIN(100000L, value) * level * level / 2;
+              if (value > 100000L)
+                exp += (value - 100000L) * level * level / 8;
+            }
+            else
+            {
+              exp = MIN(100000L, value) * level;
+              if (value > 100000L)
+                exp += (value - 100000L) * level / 4;
+            }
+            exp /= 32;
+            if ((o_ptr->tval == TV_WHISTLE)
+                || (o_ptr->tval == TV_CAPTURE)
+                || ((o_ptr->tval >= TV_WEARABLE_BEGIN)
+                    && (o_ptr->tval <= TV_WEARABLE_END)))
+              exp /= 2;
+            else if (o_ptr->tval != TV_CORPSE)
+              exp /= 8;
+            p_ptr->exp += exp;
+
+            /* Slowly recover from experience drainage */
+            if (p_ptr->exp < p_ptr->max_exp)
+            {
+              /* Gain max experience (20%) (was 10%) */
+              p_ptr->max_exp += exp / 5;
+            }
+
+            /* Check Experience */
+            check_experience();
+          }
+        }
+
+        /* if you eat a fixed artifact, you can't find it again */
+        if ((prace_is_(RACE_SHOGGOTH)) && (object_is_fixed_artifact(o_ptr)))
+        {
+          artifact_type *a_ptr = &a_info[o_ptr->name1];
+          a_ptr->cur_num = 1;
+        }
+
 	/* Destroy a food in the pack */
 	if (item >= 0)
 	{
@@ -636,6 +758,8 @@
 {
 	if (o_ptr->tval==TV_FOOD) return TRUE;

+        if (prace_is_(RACE_SHOGGOTH)) return TRUE;
+
 #if 0
 	if (prace_is_(RACE_SKELETON))
 	{

経験の薬の効果無効

アンドロイドと同様、経験の薬で経験値を増やすことはできない。

@@ -1306,6 +1430,7 @@

 		case SV_POTION_EXPERIENCE:
 			if (p_ptr->prace == RACE_ANDROID) break;
+			if (p_ptr->prace == RACE_SHOGGOTH) break;
 			chg_virtue(V_ENLIGHTEN, 1);
 			if (p_ptr->exp < PY_MAX_EXP)
 			{

定義追加

ショゴスの種族IDと種族全体の最大値をここで定義する

diff -u -rN hengband/src/defines.h hengband-s/src/defines.h
--- hengband/src/defines.h	Wed Mar 10 21:06:24 2004
+++ hengband-s/src/defines.h	Fri Jun 11 01:21:39 2004
@@ -863,11 +863,12 @@
 #define RACE_S_FAIRY            34
 #define RACE_KUTA               35
 #define RACE_ANDROID            36
+#define RACE_SHOGGOTH           37

 /*
  * Maximum number of player "race" types (see "table.c", etc)
  */
-#define MAX_RACES               37
+#define MAX_RACES               38


 /*

種族的特徴

ゴーレムと同様に朦朧としない。

diff -u -rN hengband/src/effects.c hengband-s/src/effects.c
--- hengband/src/effects.c	Thu Mar 11 20:57:57 2004
+++ hengband-s/src/effects.c	Fri Jun 11 04:13:10 2004
@@ -3400,7 +3400,7 @@

 	if (p_ptr->is_dead) return FALSE;

-	if (prace_is_(RACE_GOLEM) || ((p_ptr->pclass == CLASS_BERSERKER) && (p_ptr->lev > 34))) v = 0;
+	if (prace_is_(RACE_GOLEM) || prace_is_(RACE_SHOGGOTH) || ((p_ptr->pclass == CLASS_BERSERKER) && (p_ptr->lev > 34))) v = 0;

 	/* Knocked out */
 	if (p_ptr->stun > 100)
@@ -3863,6 +3863,10 @@
 	/* Hack -- Force good values */
 	v = (v > 20000) ? 20000 : (v < 0) ? 0 : v;

食い過ぎにならない

+        /* a Shoggoth can't be gorged */
+        if ((prace_is_(RACE_SHOGGOTH)) && (v >= PY_FOOD_MAX))
+          v = PY_FOOD_MAX - 1;
+
 	/* Fainting / Starving */
 	if (p_ptr->food < PY_FOOD_FAINT)
 	{

通常の経験値処理をアンドロイドと同様に無効にする。

@@ -5382,6 +5386,7 @@
 	if (p_ptr->is_dead) return;

 	if (p_ptr->prace == RACE_ANDROID) return;
+	if (p_ptr->prace == RACE_SHOGGOTH) return;

 	/* Gain some experience */
 	s64b_add(&(p_ptr->exp), &(p_ptr->exp_frac), amount, amount_frac);

ダンプ上の耐性表記

透明視、麻痺知らず、反感を持つ。

diff -u -rN hengband/src/files.c hengband-s/src/files.c
--- hengband/src/files.c	Thu Mar 11 20:57:57 2004
+++ hengband-s/src/files.c	Fri Jun 11 02:42:43 2004
@@ -2536,6 +2536,11 @@
 		add_flag(flgs, TR_SLOW_DIGEST);
 		add_flag(flgs, TR_HOLD_LIFE);
 		break;
+        case RACE_SHOGGOTH:
+                  add_flag(flgs, TR_SEE_INVIS);
+                  add_flag(flgs, TR_FREE_ACT);
+                  add_flag(flgs, TR_AGGRAVATE);
+                  break;
 	default:
 		; /* Do nothing */
 	}

エルドリッチホラー無効

インプやバルログと同様

diff -u -rN hengband/src/monster2.c hengband-s/src/monster2.c
--- hengband/src/monster2.c	Wed Mar 10 21:06:24 2004
+++ hengband-s/src/monster2.c	Fri Jun 11 03:29:49 2004
@@ -2034,7 +2034,7 @@
 		r_ptr->r_flags2 |= RF2_ELDRITCH_HORROR;

 		/* Demon characters are unaffected */
-		if (prace_is_(RACE_IMP) || prace_is_(RACE_DEMON) || (mimic_info[p_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_DEMON)) return;
+		if (prace_is_(RACE_IMP) || prace_is_(RACE_DEMON) || prace_is_(RACE_SHOGGOTH) || (mimic_info[p_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_DEMON)) return;
 		if (p_ptr->wizard) return;

 		/* Undead characters are 50% likely to be unaffected */

援軍生成時のモンスターシンボル

jになる。

diff -u -rN hengband/src/spells3.c hengband-s/src/spells3.c
--- hengband/src/spells3.c	Thu Mar 11 20:57:57 2004
+++ hengband-s/src/spells3.c	Fri Jun 11 11:09:38 2004
@@ -5986,6 +5986,9 @@
 			case RACE_DEMON:
 				summon_kin_type = 'U';
 				break;
+                        case RACE_SHOGGOTH:
+				summon_kin_type = 'j';
+				break;
 			default:
 				summon_kin_type = 'p';
 				break;

種族ステータス

diff -u -rN hengband/src/tables.c hengband-s/src/tables.c
--- hengband/src/tables.c	Sat Jan  3 00:18:33 2004
+++ hengband-s/src/tables.c	Fri Jun 11 04:53:45 2004
@@ -3382,6 +3382,21 @@
 		0,
 		0x0800001,
 	},
+	{
+#ifdef JP
+		"ショゴス",
+#endif
+		"Shoggoth",
+
+		{ 2, -4, 4, 0, 4, -6 },
+		-5, 0, 8, -100, 0, 7, 20, 0,
+		13, 200,
+		255, 255,
+		72, 12, 240, 64,
+		66, 12, 220, 64,
+		0,
+		0x1909325,
+	},
 };

ゲーム上のステータス反映

ダンプと同様、透明視、麻痺知らず、反感を持ち、p_ptr->see_noctoで忍者と同じ視界を持つ。

diff -u -rN hengband/src/xtra1.c hengband-s/src/xtra1.c
--- hengband/src/xtra1.c	Mon Jan 19 20:10:55 2004
+++ hengband-s/src/xtra1.c	Fri Jun 11 02:14:46 2004
@@ -3553,6 +3553,12 @@
 			p_ptr->resist_pois = TRUE;
 			p_ptr->hold_life = TRUE;
 			break;
+		case RACE_SHOGGOTH:
+                  p_ptr->see_inv = TRUE;
+                  p_ptr->see_nocto = TRUE;
+                  p_ptr->free_act = TRUE;
+                  p_ptr->cursed |= (TRC_AGGRAVATE);
+                  break;
 		default:
 			/* Do nothing */
 			;

[ヴィーヤウトゥムノ]運命の魔女/Wyrd sister (Yellow 'p')

=== Num:647  Lev:40  Rar:4  Spd:+15  Hp:550  Ac:60  Exp:1900
この年老いたしわくちゃ婆はカオスの魔女だと噂されている...しかし君は魔女な
んか信じていないんだろう?
彼女は通常地下 40 階で出現し、かなり素早く動いている。この邪悪なる人間を
倒すことは 50 レベルのキャラクタにとって 約1461.54 ポイントの経験となる。
彼女は魔法を使うことができ、恐怖、目くらまし、混乱、暗闇、デーモン一体召
喚の呪文を唱えることがある(確率:1/2)。彼女は AC60 の防御力と 550 の体力が
ある。彼女はドアを開け、ドアを打ち破ることができる。彼女は進化しない。彼
女は混乱しないし、眠らされない。彼女は侵入者を幾分注意深く見ており、 200
フィート先から侵入者に気付くことがある。彼女は 4 個までのアイテムを持って
いることがある。彼女は 2d6 のダメージでひっかいて攻撃し、 2d6 のダメージ
でひっかいて攻撃し、 2d8 のダメージでひっかいて攻撃する。

原語の「Wyrd」は北ゲルマンや北欧等の「来ること」「成すこと」等の意で運命そのものやその神性を指すらしい。ちょうどマクベスの三人の魔女がその最たるイメージそのものである。

思い出に「カオスの魔女」という噂を付け加えてるのは、恐らくは真世界アンバーシリーズ上の枠組みに見れば、いかにも混沌の宮廷の関係者らしい異形性や原初性を持っているためか。加速+15で動く有様はまさにターボババァの如きと妄想。

Wyrd Sister