トップ «前の日記(2018/12/24) 最新 次の日記(2018/12/26)» 編集

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分一本勝負


2018/12/25

[変愚蛮怒/攻略] 変愚蛮怒開発日誌part113…特別編「変愚蛮怒の地形実装例 ~毒沼やら酸の沼やら~(後編)」

相変わらずトリを欲しがる割には盛り上がらない最後ですが、前回の続きで最後です。

前提:新しい固定部屋生成処理を追加してみる

前回までで溶岩と同じ要領で、酸と毒の川を作成しました。このまま同じように冷気と電撃もなし崩しにやっていいのかもしれませんが、基本的に川として生成される要素ではない気もします。

そこで今回は、これまで大きく分けて16種類だった部屋生成に17番目の「特殊固定部屋」を設定し(実はこの件より前に実装したものだったりしますが)v_info.txtにこれまで実装された地形を追加してみましょう。 これまでの部屋については、

なども参照ください。

今回作成するType17は、このうち、Type7/8の固定Vaultと同じように、v_info.txtで予め作られた固定の地形を生成する形にします。固定Vaultとの違いは、単純にアイテムや大量の深層的が生成されず、比較的部屋の生成確率を高くする、それだけです。

Type17(特殊固定部屋)の処理実装実装

基本、Type7/8のコピペです。いやDRY精神に則ると随分とアレですが。いずれ直します(すぐ直すとは言ってない)

@@ -109,6 +110,7 @@ static byte room_build_order[ROOM_T_MAX] = {
 	ROOM_T_OVERLAP,
 	ROOM_T_CROSS,
 	ROOM_T_FRACAVE,
+	ROOM_T_FIXED,
 	ROOM_T_NORMAL,
 };

@@ -2072,6 +2074,7 @@ static bool room_build(int typ)
 	case ROOM_T_TRAP:          return build_type14();
 	case ROOM_T_GLASS:         return build_type15();
 	case ROOM_T_ARCADE:        return build_type16();
+	case ROOM_T_FIXED:        return build_type17();
 	}

 	/* Paranoia */
diff --git a/src/rooms.h b/src/rooms.h
index 51f8209..97d3b43 100644
--- a/src/rooms.h
+++ b/src/rooms.h
@@ -39,8 +39,9 @@
 #define ROOM_T_TRAP          13 /* Piranha/Armageddon trap room */
 #define ROOM_T_GLASS         14 /* Glass room */
 #define ROOM_T_ARCADE        15 /* Arcade */
+#define ROOM_T_FIXED         16 /* Fixed room */

-#define ROOM_T_MAX 16
+#define ROOM_T_MAX 17

素直に#define定義を追加し、

--- a/src/rooms.c
+++ b/src/rooms.c
@@ -89,6 +89,7 @@ static room_info_type room_info_normal[ROOM_T_MAX] =
 	{{  0,  0,  1,  1,  1,  2,  3,  4,  5,  6,  8}, 20}, /*TRAP     */
 	{{  0,  0,  0,  0,  1,  1,  1,  2,  2,  2,  2}, 40}, /*GLASS    */
 	{{  1,  1,  1,  1,  1,  1,  1,  2,  2,  3,  3},  1}, /*ARCADE   */
+	{{ 20, 40, 60, 80,100,100,100,100,100,100,100},  1}, /*FIX   */
 };

room_info_normalに生成確率テーブルも追加します。

v_info.txtにまず適当に足してみる

いくつか雑に追加したうちの一部を抜粋します。

N:129:Fixed room1
X:16:8:7:7
D:%%%%%%%
D:%.....%
D:%.'''.%
D:%.'.'.%
D:%.'''.%
D:%.....%
D:%%%%%%%

N:130:Fixed room2
X:16:8:14:14
D:%%%%%%%%%%%%%%
D:%............%
D:%...........%%
D:%..........%%
D:%.........%%
D:%........%%
D:%.......%%
D:%......%%
D:%.....%%
D:%....%%
D:%...%%
D:%..%%
D:%.%%
D:%%%

N:131:Fixed room3
X:16:8:7:7
D:%%%%%%%
D:%..#..%
D:%.'#'.%
D:%##.##%
D:%.'#'.%
D:%..#..%
D:%%%%%%%

N:132:Fixed room4
X:16:8:10:10
D:   %%%%
D:  %%##%%
D: %%.. .%%
D:%%.#. #.%%
D:%#..##..#%
D:%#..##..#%
D:%%.#. #.%%
D: %%.. .%%
D:  %%##%%
D:   %%%%

この時点では以下のような地形を指定できます。Xは順に部屋の型ID、レアリティ(多分働いていない)、縦の長さ、横の長さです。……17番目の部屋種別なのに16にしてしまったのはミスです、早めに直します。

地形定義はType7/8の記事でも書いてありますがv_info.txtで以下の通りです。

#    % - outside of the vault, where corridors may be connected
#    # - granite
#    $ - glass wall
#    X - impenetrable rock
#    Y - impenetrable glass wall
#    * - treasure or trap
#    + - secret door
#    - - secret glass door
#    ' - curtain
#    ^ - trap
#    & - monster up to 5 levels out of depth (OOD)
#    @ - monster up to 11 levels OOD
#    9 - monster up to 9 levels OOD and treasure up to 7 levels OOD
#    8 - monster up to 40 levels OOD and treasure up to 20 levels OOD
#    , - monster up to 3 levels OOD and/or treasure up to 7 levels OOD

v_info.txt用の新規定義追加と該当地形を持った固定部屋を作成。

雑にバグ修正も挟まっている辺りの更新です、ご了承ください。 build_vault()関数のswitchにこんな感じに追加します。

@@ -470,6 +470,38 @@ static void build_vault(POSITION yval, POSITION xval, POSITION ymax, POSITION xm
 				set_cave_feat(y, x, feat_deep_lava);
 				break;

+			case 'f':
+				set_cave_feat(y, x, feat_shallow_acid_puddle);
+				break;
+
+			case 'F':
+				set_cave_feat(y, x, feat_deep_acid_puddle);
+				break;
+
+			case 'g':
+				set_cave_feat(y, x, feat_shallow_poisonous_puddle);
+				break;
+
+			case 'G':
+				set_cave_feat(y, x, feat_deep_poisonous_puddle);
+				break;
+
+			case 'h':
+				set_cave_feat(y, x, feat_cold_zone);
+				break;
+
+			case 'H':
+				set_cave_feat(y, x, feat_heavy_cold_zone);
+				break;
+
+			case 'i':
+				set_cave_feat(y, x, feat_electrical_zone);
+				break;
+
+			case 'I':
+				set_cave_feat(y, x, feat_heavy_electrical_zone);
+				break;
+

これに合わせてv_info.txtも追加します。

N:136:Spring 1
X:16:8:10:12
D:  %%%%%%%%
D: %%......%%
D:%%..^^^^..%%
D:%..^^==^^..%
D:%..^====^..%
D:%..^====^..%
D:%..^^==^^..%
D:%%..^^^^..%%
D: %%......%%
D:  %%%%%%%%

N:137:LavaSpring 1
X:16:8:10:12
D:  %%%%%%%%
D: %%......%%
D:%%..vvvv..%%
D:%..vvwwvv..%
D:%..vwwwwv..%
D:%..vwwwwv..%
D:%..vvwwvv..%
D:%%..vvvv..%%
D: %%......%%
D:  %%%%%%%%

N:138:AcidSpring 1
X:16:8:10:12
D:  %%%%%%%%
D: %%......%%
D:%%..ffff..%%
D:%..ffFFff..%
D:%..fFFFFf..%
D:%..fFFFFf..%
D:%..ffFFff..%
D:%%..ffff..%%
D: %%......%%
D:  %%%%%%%%

N:139:PoisonousSpring 1
X:16:8:10:12
D:  %%%%%%%%
D: %%......%%
D:%%..gggg..%%
D:%..ggGGgg..%
D:%..gGGGGg..%
D:%..gGGGGg..%
D:%..ggGGgg..%
D:%%..gggg..%%
D: %%......%%
D:  %%%%%%%%

N:140:ColdZone 1
X:16:8:10:12
D:  %%%%%%%%
D: %%......%%
D:%%..hhhh..%%
D:%..hhHHhh..%
D:%..hHHHHh..%
D:%..hHHHHh..%
D:%..hhHHhh..%
D:%%..hhhh..%%
D: %%......%%
D:  %%%%%%%%

N:141:ElectricalZone 1
X:16:8:10:12
D:  %%%%%%%%
D: %%......%%
D:%%..iiii..%%
D:%..iiIIii..%
D:%..iIIIIi..%
D:%..iIIIIi..%
D:%..iiIIii..%
D:%%..iiii..%%
D: %%......%%
D:  %%%%%%%%

結果

高電圧

うん、まだしょぼいですね。作るのならもっと、数も質も増やすべきです。折角v_info.txtで共通して使えるようになったのですから、Vaultでも各地形に囲われた要塞作っていいでしょう。

ついでにモンスターが該当耐性を持っているのみ地形に侵入できるよう修正

補足的なものです。こうして追加してきた地形をプレイヤーだけでなくモンスターも影響するように修正します。火耐性を持っていない敵が溶岩に侵入できないのと同様に、各属性への耐性がないと各地形に侵入できないようmonster_can_cross_terrain()を修正しておきます。

---
 src/monster1.c | 24 ++++++++++++++++++++++++
 1 file changed, 24 insertions(+)

diff --git a/src/monster1.c b/src/monster1.c
index bee3385..2e35540 100644
--- a/src/monster1.c
+++ b/src/monster1.c
@@ -2326,6 +2326,30 @@ bool monster_can_cross_terrain(FEAT_IDX feat, monster_race *r_ptr, BIT_FLAGS16 m
 		if (!(r_ptr->flagsr & RFR_EFF_IM_FIRE_MASK)) return FALSE;
 	}

+	/* Cold */
+	if (have_flag(f_ptr->flags, FF_COLD_PUDDLE))
+	{
+		if (!(r_ptr->flagsr & RFR_EFF_IM_COLD_MASK)) return FALSE;
+	}
+
+	/* Elec */
+	if (have_flag(f_ptr->flags, FF_ELEC_PUDDLE))
+	{
+		if (!(r_ptr->flagsr & RFR_EFF_IM_ELEC_MASK)) return FALSE;
+	}
+
+	/* Acid */
+	if (have_flag(f_ptr->flags, FF_ACID_PUDDLE))
+	{
+		if (!(r_ptr->flagsr & RFR_EFF_IM_ACID_MASK)) return FALSE;
+	}
+
+	/* Poison */
+	if (have_flag(f_ptr->flags, FF_POISON_PUDDLE))
+	{
+		if (!(r_ptr->flagsr & RFR_EFF_IM_POIS_MASK)) return FALSE;
+	}
+
 	return TRUE;
 }

--

最後に

今後とも精進して色々やっていきますのでどうぞよろしくお願いいたします。皆様良いお年を。