Rogue 3.6.3: 部屋の表示

do_roomsで呼び出されていた関数を読んでいく。まずはdraw_room。これは名前からすると、画面上に部屋を表示するものだと思われる。部屋情報を構造体として受け取っている。

draw_room(rp)
register struct room *rp;
{
    register int j, k;

    move(rp->r_pos.y, rp->r_pos.x+1);
    vert(rp->r_max.y-2);                /* Draw left side */
    move(rp->r_pos.y+rp->r_max.y-1, rp->r_pos.x);
    horiz(rp->r_max.x);                    /* Draw bottom */
    move(rp->r_pos.y, rp->r_pos.x);
    horiz(rp->r_max.x);                    /* Draw top */
    vert(rp->r_max.y-2);                /* Draw right side */
    /*
     * Put the floor down
     */
    for (j = 1; j < rp->r_max.y-1; j++)
    {
    move(rp->r_pos.y + j, rp->r_pos.x+1);
    for (k = 1; k < rp->r_max.x-1; k++)
        addch(FLOOR);
    }
    /*
     * Put the gold there
     */
    if (rp->r_goldval)
    mvaddch(rp->r_gold.y, rp->r_gold.x, GOLD);
}

cursesの仕様をよく知らなかったのだけれど、現在のカーソル位置が記録される構造になってるみたいだ。で、cursesのmove関数を使ってカーソルを部屋の左上の位置まで持って行った後、vertという関数を呼び出す。これは部屋の左右に縦線を引く関数。その後呼び出されているhorizは横線を引く関数である。

horiz(cnt)
register int cnt;
{
    while (cnt--)
    addch('-');
}

vert(cnt)
register int cnt;
{
    register int x, y;

    getyx(stdscr, y, x);
    x--;
    while (cnt--) {
    move(++y, x);
    addch('|');
    }
}

addchはcursesのある場所に文字を表示する関数。horizはただaddchを使って横線を引っ張っているだけ。つまり、カーソル位置は出力後に一つ右にずれる。縦線はもうちょっと面倒で、getyxを使って現在のカーソル位置を取得。その後毎回moveで位置を合わせながら縦線を引いていく。
その後床を表示する。その際に使われる文字はFLOORで定義されている。これはrogue.hで定義されており、その値は「.」である。他にもいろいろ定義されている。

#define PASSAGE '#'
#define DOOR '+'
#define FLOOR '.'
#define PLAYER '@'
#define TRAP '^'
#define TRAPDOOR '>'
  :
  :

最後にお金を配置している。ちなみに、ここでcursesが出力しているのはstdscrというウインドウ。これは標準ウインドウなんだけど、これをRogueではこの標準ウインドウをマップすべてを保存することに利用しているっぽい。ここに書かれた情報が、ゲーム上でものの配置を調べるためにいろいろ利用される...ようになっている気がする。