セルのデータ
地形
強壁 [ ]
通行不可
壊せない
壊せない
壁 [##]
壁すり抜け属性を持っていないと移動不可攻撃不可
アイテムで壊して床にできる
アイテムで壊して床にできる
周囲に床が存在するときにだけ表示し
床 [ . ]
通常通行可能
水 [~~]
水上歩行属性か飛行属性を持っていないと(ry
アイテムで凍らせて床にできる
同じフロアでは
アイテムで凍らせて床にできる
同じフロアでは
空 [~ ]
飛行属性を持(ry
通路 [. ]
床と同じ
ゲーム的な地形
無
壁
床
水
空(崖)
通路
壁
床
水
空(崖)
通路
詳細な描写
ゲーム的な地形だけだと細かい描写ができない。
解決方法
- 固定マップ以外は細かい描写を諦め、固定マップだけで多種類のチップを使う
この方法では、ゲームプログラムに対して細かい描写のための手を加える必要がないが、ダンジョンの風景が単調になってしまう。
- 細かい描写のための情報をセルデータに内包し、インターフェイス側がそれを解釈して適切に表示する
フィールドデータを作るときに細かい描写のための情報を同時に作る必要があるので少し面倒。
で、どうすんの?
ゲームプログラム側では下記プログラム抜粋のCellType の未定義ビットを利用して解決方法2 を実行するつもりだがそこらへんはベストエフォート?で。
注意
細かい描写はゲーム自体に影響はない。
チップセットフォーマット
案い
1チップのサイズは32*32
地形6つ分横に並べる
縦に並べてバリエーションをつくる。
地形6つ分横に並べる
縦に並べてバリエーションをつくる。
案ろ
「案い」では地形ごとにバリエーションの数に差があるため、効率的でない。
インターフェイス、
地形 ー> 種類 ー> 画像
ができればいいのだから。
任意サイズの画像データと、内容を表わすテキストファイルを組にすることで実現する。
具体的なテキストファイルのフォーマットは
ファイル名に規則を設けて2つのファイルを結びつけ、
画像データのチップ数に合わせたcsv 的な構造を作り、
一単位ごとに地形と種類番号の組を書きこんだものでうまくいく。
読み込みは、地形と種類番号の組を鍵とした連想配列にしてもいいし、「案い」と同じ様に二次元配列にしても悪くはない。
インターフェイス、
地形 ー> 種類 ー> 画像
ができればいいのだから。
任意サイズの画像データと、内容を表わすテキストファイルを組にすることで実現する。
具体的なテキストファイルのフォーマットは
ファイル名に規則を設けて2つのファイルを結びつけ、
画像データのチップ数に合わせたcsv 的な構造を作り、
一単位ごとに地形と種類番号の組を書きこんだものでうまくいく。
読み込みは、地形と種類番号の組を鍵とした連想配列にしてもいいし、「案い」と同じ様に二次元配列にしても悪くはない。
プログラム抜粋
3 /// ///////////////////////////////////////////////////////$
4 /// CellType$
5 //$
6 /*** $
7 * CellType$
8 * 0-7 : ゲームに必要な情報。移動可能判定などのための情報。$
9 * 8-15 : ルームナンバー。$
10 * 16-31: 未定義。$
11 * CT_* の値の根拠$
12 * 0x0* なら無条件に移動可能$
13 * 0x1* なら移動に条件が必要$
14 * 0x20 なら移動は許されない$
15 */$
16 typedef CellType int ;$
17 enum $
18 {$
19 CT_ROOM = 0x00,$
20 CT_PATH = 0x01,$
21 CT_WATE = 0x11,$
22 CT_AIRR = 0x12,$
23 CT_WALL = 0x14,$
24 CT_NONE = 0x20,$
25 };$
26 $
27 enum PassableFlag$
28 {$
29 PF_NONE = 0x00,$
30 PF_WALL = 0x04,$
31 PF_AIRR = 0x03,$
32 PF_WATE = 0x01,$
33 };$
34 $
35 bool IsPassable(PassableFlag pf,CellType ct)$
36 {$
37 const int t = ct & 0x30;$
38 if(t == 0x10)$
39 return ct & pf;$
40 else $
41 return t == 0x00;$
42 }$
駄文
「無」ってのは「壁」が壁の表面であるのに対して壁の中身ともいえる。
「壁」は壊せるときがある。@「つるはし」とか「地震を起こす」とか。
空を通れる奴はだいたい水の上も通れるのではなかろうか?
床には床番号というものがあって、視界に影響する。
明るい場所では部屋に入った時点で部屋の中に何がいるか、どんなアイテムが落ちているかを知ることができる。そのときの処理として、踏んだ床と同じ床番号のセルを識別済みとするという方法が簡単だ。
明るい場所では部屋に入った時点で部屋の中に何がいるか、どんなアイテムが落ちているかを知ることができる。そのときの処理として、踏んだ床と同じ床番号のセルを識別済みとするという方法が簡単だ。
通路、これも視界に影響する。「通路にいる間は隣接したセルしか確認できない」という規則を採用することがある。
例を挙げると、
シレンは忘れたがディアボロだと上記の規則があるが、
nethack ではリアリティを重視するためいくらか先が見えたりみえなかったりする(謎)。
例を挙げると、
シレンは忘れたがディアボロだと上記の規則があるが、
nethack ではリアリティを重視するためいくらか先が見えたりみえなかったりする(謎)。
隠された地形について。nethack などのヘビーなやつでは地形が隠れていることがある。壁を調べると扉があったり、通路の行き止まりを調べるとまだ先があったりするというようなもの。