generic container (#8)

(an instance of generic thing made by The_Mayor)





VERB SOURCE CODE:

p*ut in*sert d*rop:
if ((this.location != player) && (this.location != player.location))
    player:tell("You can't get at ", this.name, ".");
elseif (dobj == $nothing)
    player:tell("What do you want to put ", prepstr, " ", this.name, "?");
elseif ($command_utils:object_match_failed(dobj, dobjstr))
elseif ((dobj.location != player) && (dobj.location != player.location))
    player:tell("You don't have ", dobj.name, ".");
elseif (!this.opened)
    player:tell(this.name, " is closed.");
else
    set_task_perms(callers() ? caller_perms() | player);
    dobj:moveto(this);
    if (dobj.location == this)
        player:tell(this:put_msg());
        if (msg = this:oput_msg())
            player.location:announce(player.name, " ", msg);
        endif
    else
        player:tell(this:put_fail_msg());
        if (msg = this:oput_fail_msg())
            player.location:announce(player.name, " ", msg);
        endif
    endif
endif
.


re*move ta*ke g*et:
if (!this.opened)
    player:tell(this.name, " is not open.");
elseif (this.dark)
    player:tell("You can't see into ", this.name, " to remove anything.");
elseif ((dobj = this:match_object(dobjstr)) == $nothing)
    player:tell("What do you want to take from ", this.name, "?");
elseif ($command_utils:object_match_failed(dobj, dobjstr))
elseif (!(dobj in this:contents()))
    player:tell(dobj.name, " isn't in ", this.name, ".");
else
    dobj:moveto(player);
    if (dobj.location == player)
        player:tell(this:remove_msg());
        if (msg = this:oremove_msg())
            player.location:announce(player.name, " ", msg);
        endif
    else
        dobj:moveto(this.location);
        if (dobj.location == this.location)
            player:tell(this:remove_msg());
            if (msg = this:oremove_msg())
                player.location:announce(player.name, " ", msg);
            endif
            player:tell("You can't pick up ", dobj.name, ", so it tumbles onto the 
floor.");
        else
            player:tell(this:remove_fail_msg());
            if (msg = this:oremove_fail_msg())
                player.location:announce(player.name, " ", msg);
            endif
        endif
    endif
endif
.


look_self:
pass();
if (!this.dark)
    this:tell_contents();
endif
.


acceptable:
return !is_player(args[1]);
.


open:
perms = (callers() && (caller != this)) ? caller_perms() | player;
if (this.opened)
    player:tell("It's already open.");
    "elseif (this:is_openable_by(player))";
elseif (this:is_openable_by(perms))
    this:set_opened(1);
    player:tell(this:open_msg());
    if (msg = this:oopen_msg())
        player.location:announce(player.name, " ", msg);
    endif
else
    player:tell(this:open_fail_msg());
    if (msg = this:oopen_fail_msg())
        player.location:announce(player.name, " ", msg);
    endif
endif
.


@lock_for_open:
set_task_perms(player);
key = $lock_utils:parse_keyexp(iobjstr, player);
if (typeof(key) == STR)
    player:tell("That key expression is malformed:");
    player:tell("  ", key);
else
    res = this.open_key = key;
    if (typeof(res) == ERR)
        player:tell(res, ".");
    else
        player:tell("Locked opening of ", this.name, " with this key:");
        player:tell("  ", $lock_utils:unparse_key(key));
    endif
endif
.


is_openable_by:
return (this.open_key == 0) || $lock_utils:eval_key(this.open_key, args[1]);
.


close:
if (!this.opened)
    player:tell("It's already closed.");
else
    this:set_opened(0);
    player:tell(this:close_msg());
    if (msg = this:oclose_msg())
        player.location:announce(player.name, " ", msg);
    endif
endif
.


@unlock_for_open:
set_task_perms(player);
res = dobj.open_key = 0;
if (typeof(res) == ERR)
    player:tell(res, ".");
else
    player:tell("Unlocked ", dobj.name, " for opening.");
endif
.


tell_contents:
if (this.contents)
    player:tell("Contents:");
    for thing in (this.contents)
        player:tell("  ", thing:title());
    endfor
elseif (msg = this:empty_msg())
    player:tell(msg);
endif
.


set_opened:
if (!$perm_utils:controls(caller.owner, this))
    return E_PERM;
else
    this.opened = opened = !(!args[1]);
    this.dark = this.opaque > opened;
    return opened;
endif
.


@opacity:
if (!$perm_utils:controls(player, this))
    player:tell("Can't set opacity of something you don't own.");
elseif ((iobjstr != "0") && (!tonum(iobjstr)))
    player:tell("Opacity must be an integer (0, 1, 2).");
else
    player:tell("Opacity changed:  Now " + {"transparent.", "opaque.", "a black hole."}[1 
+ this:set_opaque(tonum(iobjstr))]);
endif
.


set_opaque:
if (!$perm_utils:controls(caller.owner, this))
    return E_PERM;
elseif (typeof(number = args[1]) != NUM)
    return E_INVARG;
else
    number = (number < 0) ? 0 | ((number > 2) ? 2 | number);
    this.dark = number > this.opened;
    return this.opaque = number;
endif
.


oclose_msg close_msg oopen_msg open_msg oput_fail_msg put_fail_msg oremove_fail_msg oremove_msg remove_fail_msg remove_msg oput_msg put_msg oopen_fail_msg open_fail_msg empty_msg:
return (msg = this.(verb)) ? $string_utils:pronoun_sub(msg) | "";
.



PROPERTY DATA:
      oclose_msg
      close_msg
      oopen_msg
      open_msg
      oput_fail_msg
      put_fail_msg
      opaque
      dark
      oremove_fail_msg
      oremove_msg
      remove_fail_msg
      remove_msg
      oput_msg
      put_msg
      oopen_fail_msg
      open_fail_msg
      empty_msg
      opened
      open_key

CHILDREN:
wooden box shelf of candles paper bag smorgasbord red vinyl backpack Steamer Trunk cage leather knapsack suitcase a stage trunk little yellow bucket Coffee Machine peepshow Basket a small desk pint_glass pint_glass toybox an empty pizza box envelope a reflective black cabinet Big Box O' Numbers cabinet chamber Test a painting or sense a SOUND Sack of Potatoes oread's niche Birthday Box! envelope