rogue > add_pack()


※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

呼び出し元

rogue/init_player()

メモ

バックパックのパック。

引数に入ってきたTHINGを手荷物の中に追加。

引数がnullならプレイヤの足元にあるアイテムを追加。

依存のデータ構造が入り組みすぎてヤバイ。

使用関数

rogue/find_obj() //引数に指定した座標にあるThingを返す。

rogue/detach() //第一引数に指定したリスト構造から、第二引数に指定したTHINGデータを外す。

rogue/floor_ch() //通路か部屋かの判定?

rogue/mvaddch()

rogue/chat()

rogue/update_mdest()

rogue/discard()

rogue/msg()

rogue/pack_char()

rogue/pack_room()

rogue/next()

依存データ構造

rogue/struct/THING

依存グローバル

rogue/datas/hero //player.t_posのこと。

rogue/datas/lvl_obj //何かのリスト構造

ソース

/*
 * add_pack:
 *      Pick up an object and add it to the pack.  If the argument is
 *      non-null use it as the linked_list pointer instead of gettting
 *      it off the ground.
 */

void
add_pack(THING *obj, int silent)
{
    THING *op, *lp;
    int from_floor;
    int discarded = 0;

    from_floor = FALSE;
  //objがnull(指定されていない)なら、
    //足元にあるアイテムを見つけて、それを拾うようにする
    if (obj == NULL)
    {
        if ((obj = find_obj(hero.y, hero.x)) == NULL)
            return;
        from_floor = TRUE;
    }

なければ関数を終了、from_floorは何に使うかはここでは未定。

/*
     * Check for and deal with scare monster scrolls
     */
    if (obj->o_type == SCROLL && obj->o_which == S_SCARE)
        if (obj->o_flags & ISFOUND)
        {
            detach(lvl_obj, obj);
            //現在Level(階層)に所属しているitemをいったんはずす。

            mvaddch(hero.y, hero.x, floor_ch());
            chat(hero.y, hero.x) = (proom->r_flags & ISGONE) ? PASSAGE : FLOOR;
            update_mdest(obj);
            discarded = 1;
            discard(obj);
            msg("the scroll turns to dust as you pick it up");
            return;
        }

    if (pack == NULL)
    {
        pack = obj;
        obj->o_packch = pack_char();
        inpack++;
    }
    else
    {
        lp = NULL;
        for (op = pack; op != NULL; op = next(op))
        {
            if (op->o_type != obj->o_type)
                lp = op;
            else
            {
                while (op->o_type == obj->o_type && op->o_which != obj->o_which)
                {
                    lp = op;
                    if (next(op) == NULL)
                        break;
                    else
                        op = next(op);
                }
                if (op->o_type == obj->o_type && op->o_which == obj->o_which)
                {
                    if (ISMULT(op->o_type))
                    {
                        if (!pack_room(from_floor, obj))
                            return;
                        op->o_count++;
dump_it:
                        update_mdest(obj);
                        discard(obj);
                        obj = op;
                        discarded = 1;
                        lp = NULL;
                        goto out;
                    }
                    else if (obj->o_group)
                    {
                        lp = op;
                        while (op->o_type == obj->o_type
                            && op->o_which == obj->o_which
                            && op->o_group != obj->o_group)
                        {
                            lp = op;
                            if (next(op) == NULL)
                                break;
                            else
                                op = next(op);
                        }
                        if (op->o_type == obj->o_type
                            && op->o_which == obj->o_which
                            && op->o_group == obj->o_group)
                        {
                                op->o_count += obj->o_count;
                                inpack--;
                                if (!pack_room(from_floor, obj))
                                    return;
                                goto dump_it;
                        }
                    }
                    else
                        lp = op;
                }
out:
                break;
            }
        }

        if (lp != NULL)
        {
            if (!pack_room(from_floor, obj))
                return;
            else
            {
                obj->o_packch = pack_char();
                next(obj) = next(lp);
                prev(obj) = lp;
                if (next(lp) != NULL)
                    prev(next(lp)) = obj;
                next(lp) = obj;
            }
        }
    }

    obj->o_flags |= ISFOUND;

    /*
     * If this was the object of something's desire, that monster will
     * get mad and run at the hero.
     */
    if (!discarded)
        update_mdest(obj);

    if (obj->o_type == AMULET)
        amulet = TRUE;
    /*
     * Notify the user
     */
    if (!silent)
    {
        if (!terse)
            addmsg("you now have ");
        msg("%s (%c)", inv_name(obj, !terse), obj->o_packch);
    }
}