*ロングワーム [#nd1ebed3]
(worm.cのコメントの和訳)

**ロングワームの実装に関する説明 [#t87ea5cb]

尻尾を持つワームの頭部に相当する monst 構造体は、いずれも wormno メンバに 1 <= wormno < MAX_NUM_WORMS の値を持つ。wormno == 0 ならば、その怪物はロングワームの尻尾を持たないことを意味する(ワームでないことを意味するわけではない)。

ワームの実際の体節は、monst 構造体ではなく、小さな wseg 構造体である。配列 levels.monsters[][] にはワームの頭部の monst 構造体が格納される。これにより情報の参照やHPの整合をとるのが非常に容易になっている。

(※wseg構造体のメンバは、座標および次のwseg構造体へのポインタ)

マップ上に存在するロングワームの体節群は、片方向リンクリストの配列に納められている。wormno の値はこれらの配列のインデックスとして使われる。

|配列|説明|h
|wtails|リンクリストの先頭(最初の構造体)。これはワームの体節の最後尾を指す。|
|wheads|リンクリストの末尾(最後の構造体)。これは実際のワームの頭部と同じ位置の体節を指す。wheads[wormno] が指す体節は画面に表示されないことに注意すること。これは単純にどこに頭部があるかを把握するためであり、これにより後のワームの移動と表示が簡単になる。ワームの頭部の体節をリンクリストの最後尾に保つのは混乱の元なのだが、必要なことである。以下、「最初」と「最後」をリンクリストを指すのに用い、「頭」と「尻尾」をワームを指すのに用いる。|
|wgrowtime|いつワームの体節を新しく追加するかを示す。|

ワームが移動したとき、新しい体節を頭部に追加し、尻尾の体節を削除する(成長させたくなければ)。この新しい頭部の体節は、実際のワームの頭部と全く同じ位置に置かれる。ワームを成長させたい場合は、尻尾の体節を削除せず、ワームのHPを増やしてやる(最大値で頭打ちになるかもしれない)。

動かないワーム(worm_nomove)は自分の尻尾に囲まれているとみなし、成長させる代わりに縮小する(頭が動けるまで)。この場合、尻尾の体節を削除し、ワームのHPを減らす。

***関数 [#pcea5745]
:get_wormno()|未使用のワーム尻尾スロットを探し、インデックスを返す。0 はスロットに空きがないことを示す。この場合、ワームの頭部は存在できても、尻尾を伸ばすことはできない。

:initworm()|この関数を呼ぶ前に、if (mon->wormno = get_wormno()) を行うこと!~
ワームの登録を初期化する。ワームの成長時刻を初期化し、wheads[] と wtails[] のためのダミーの体節を初期化する。~
ワームが尾を持たない(つまり、get_wormno()が失敗した)場合、この関数を呼ぶ必要はない。

:toss_wsegs()|与えられたポインタ curr およびそれに連なる全てのワームの体節を削除する。画面は更新することもしないこともできる。

:shrink_worm()|ワームの尻尾部分の体節(リンクリストの最初)を削除する。

:worm_move()|この関数を呼ぶ前に、mon->wormno をチェックすること!~
ワームを移動する。成長する可能性あり。

:worm_nomove()|この関数を呼ぶ前に、mon->wormno をチェックすること!~
ワームを移動できないので、縮める。

:wormgone()|この関数を呼ぶ前に、mon->wormno をチェックすること!~
ワームの尾を削除する。

:wormhitu()|この関数を呼ぶ前に、mon->wormno をチェックすること!~
プレイヤーがワームの体節の近くにいたら、攻撃を試みる。この関数は現在正しく動かない。理由は、mattacku() は頭部がプレイヤーから離れているとみなしてしまうからである。頭部を瞬間的にプレイヤーの近くに移動する手もあるかもしれないが、そうする前にもう少し考慮が必要だ。

:cutworm()|この関数を呼ぶ前に、mon->wormno をチェックすること!~
座標 x, y のワームを武器で攻撃するとき、ワームが真っ二つになる可能性および、真っ二つになった両方が生き残る可能性がある。

:see_wsegs()|引数で与えられたワームの全ての体節を再描画する。この関数は display.c の see_monster() か、もしくは不可視になったときのみ呼ばれる。この関数はモジュール化の観点からここに置かれている。

:detect_wsegs()|引数で与えられたワームの全ての体節を表示する。Detection用。

:save_worm()|ワーム情報を保存する。カウントはダミーを含む体節の総数。save.c から呼ばれる。

:restore_worm()|ワーム情報をセーブファイルから読み戻す。restore.c から呼ばれる。

:place_wsegs()|ワームの体節を配置する。restore.c から呼ばれる。

:remove_worm()|この関数は rm.h で #define により定義されている remove_monster() と同等であるが、ワームとその尻尾を合わせてレベルの配列から取り除くところが異なる。この関数はワームの尻尾の構造体を廃棄(dealloc)せず、頭部の monst 構造体を fmon チェインから取り除かない。

:place_worm_tail_randomly()|ワームの尻尾を頭から適当にマップ上に配置する。この関数は配置中、wsegs の順序を頭から尾に逆転する。x, y は通常 worm->mx, worm->my だが、何らかの理由で頭部が尾から切り離されている場合は一致していなくてもよい。

:count_wsegs()|ワームの持つ体節の数を返す。

:create_worm_tail()|(num_segs + 1) のワームの尻尾チェインを生成し、そのポインタを返す。

:worm_known()|このワームの体節のどこかが視界内に入っているか?~
注: 呼び出し側は不可視とテレパシーのチェックをしなければならない。~
主に canseemon() マクロから呼ばれる。

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS