2018/12/25
■ [変愚蛮怒/攻略] 変愚蛮怒開発日誌part113…特別編「変愚蛮怒の地形実装例 ~毒沼やら酸の沼やら~(後編)」
相変わらずトリを欲しがる割には盛り上がらない最後ですが、前回の続きで最後です。
前提:新しい固定部屋生成処理を追加してみる
前回までで溶岩と同じ要領で、酸と毒の川を作成しました。このまま同じように冷気と電撃もなし崩しにやっていいのかもしれませんが、基本的に川として生成される要素ではない気もします。
そこで今回は、これまで大きく分けて16種類だった部屋生成に17番目の「特殊固定部屋」を設定し(実はこの件より前に実装したものだったりしますが)v_info.txtにこれまで実装された地形を追加してみましょう。 これまでの部屋については、
- Type1(基本長方形部屋)
- Type2(長方形二つ重ね部屋)
- Type3(十字部屋)
- Type4(二重部屋)
- Type5(モンスターネスト)
- Type6(モンスターピット)
- Type7/8(小型/大型Vault)
- Type9(フラクタル生成部屋)
- Type10(ランダムVault)
- Type11(円形部屋)
- Type12(聖堂)
- Type13(トラップつきモンスター・ピット)
- Type14(トラップ部屋)
- Type15(ガラス部屋)
- Type16(地下街)
なども参照ください。
今回作成する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にまず適当に足してみる
- Sat Oct 6 17:50:31 2018 +0900: [Feature] #38635 v_infoの2種部屋追加。 Add 2 rooms to v_info.
- Thu Oct 4 20:52:55 2018 +0900: [Feature] #38635 v_infoを参照する通常固定部屋の生成処理を実装。7種部屋追加。 Implement fixed room from v_info.txt, add 7 rooms.
いくつか雑に追加したうちの一部を抜粋します。
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用の新規定義追加と該当地形を持った固定部屋を作成。
- Sat Oct 6 15:48:37 2018 +0900: [Feature] #38635 v_infoの地形定義追加。 Add feature definition for v_info.
- Tue Dec 25 21:18:44 2018 +0900: [Feature] #38635 Vault用地形定義を追加。 / Implement new vault features.
雑にバグ修正も挟まっている辺りの更新です、ご了承ください。 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; } --
最後に
今後とも精進して色々やっていきますのでどうぞよろしくお願いいたします。皆様良いお年を。