lima-1.0b5/
lima-1.0b5/driver/
lima-1.0b5/driver/ChangeLog.old/
lima-1.0b5/driver/Win32/
lima-1.0b5/driver/compat/
lima-1.0b5/driver/include/
lima-1.0b5/driver/testsuite/
lima-1.0b5/driver/testsuite/clone/
lima-1.0b5/driver/testsuite/command/
lima-1.0b5/driver/testsuite/data/
lima-1.0b5/driver/testsuite/etc/
lima-1.0b5/driver/testsuite/include/
lima-1.0b5/driver/testsuite/inherit/
lima-1.0b5/driver/testsuite/inherit/master/
lima-1.0b5/driver/testsuite/log/
lima-1.0b5/driver/testsuite/single/
lima-1.0b5/driver/testsuite/single/tests/compiler/
lima-1.0b5/driver/testsuite/single/tests/efuns/
lima-1.0b5/driver/testsuite/single/tests/operators/
lima-1.0b5/driver/testsuite/u/
lima-1.0b5/driver/tmp/
lima-1.0b5/etc/
lima-1.0b5/lib/WWW/help/
lima-1.0b5/lib/cmds/
lima-1.0b5/lib/cmds/create/
lima-1.0b5/lib/cmds/player/attic/
lima-1.0b5/lib/contrib/bboard/
lima-1.0b5/lib/contrib/boards/
lima-1.0b5/lib/contrib/marriage/
lima-1.0b5/lib/contrib/roommaker/
lima-1.0b5/lib/contrib/transient_effect/
lima-1.0b5/lib/daemons/channel/
lima-1.0b5/lib/daemons/imud/
lima-1.0b5/lib/data/
lima-1.0b5/lib/data/config/
lima-1.0b5/lib/data/links/
lima-1.0b5/lib/data/news/
lima-1.0b5/lib/data/players/
lima-1.0b5/lib/data/secure/
lima-1.0b5/lib/domains/
lima-1.0b5/lib/domains/std/2.4.5/maze1/
lima-1.0b5/lib/domains/std/2.4.5/npc/
lima-1.0b5/lib/domains/std/2.4.5/post_dir/
lima-1.0b5/lib/domains/std/2.4.5/sub/
lima-1.0b5/lib/domains/std/camera/
lima-1.0b5/lib/domains/std/config/
lima-1.0b5/lib/domains/std/cult/
lima-1.0b5/lib/domains/std/effects/
lima-1.0b5/lib/domains/std/misc/
lima-1.0b5/lib/domains/std/monsters/
lima-1.0b5/lib/domains/std/recorder/
lima-1.0b5/lib/domains/std/rooms/
lima-1.0b5/lib/domains/std/rooms/beach/
lima-1.0b5/lib/domains/std/rooms/labyrinth/
lima-1.0b5/lib/domains/std/school/
lima-1.0b5/lib/domains/std/school/O/
lima-1.0b5/lib/domains/std/spells/
lima-1.0b5/lib/domains/std/spells/stock-mage/
lima-1.0b5/lib/domains/std/spells/stock-priest/
lima-1.0b5/lib/help/
lima-1.0b5/lib/help/admin/
lima-1.0b5/lib/help/hints/General_Questions/
lima-1.0b5/lib/help/hints/Pirate_Quest/
lima-1.0b5/lib/help/player/
lima-1.0b5/lib/help/player/bin/
lima-1.0b5/lib/help/player/quests/
lima-1.0b5/lib/help/wizard/
lima-1.0b5/lib/help/wizard/coding/guilds/
lima-1.0b5/lib/help/wizard/coding/rooms/
lima-1.0b5/lib/help/wizard/lib/daemons/
lima-1.0b5/lib/help/wizard/lib/lfun/
lima-1.0b5/lib/help/wizard/lib/std/
lima-1.0b5/lib/help/wizard/mudos_doc/
lima-1.0b5/lib/help/wizard/mudos_doc/applies/
lima-1.0b5/lib/help/wizard/mudos_doc/applies/interactive/
lima-1.0b5/lib/help/wizard/mudos_doc/applies/parsing/
lima-1.0b5/lib/help/wizard/mudos_doc/concepts/
lima-1.0b5/lib/help/wizard/mudos_doc/driver/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/arrays/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/buffers/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/compile/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/filesystem/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/floats/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/functions/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/general/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/mappings/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/mixed/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/numbers/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/parsing/
lima-1.0b5/lib/help/wizard/mudos_doc/lpc/constructs/
lima-1.0b5/lib/help/wizard/mudos_doc/lpc/types/
lima-1.0b5/lib/include/driver/
lima-1.0b5/lib/log/
lima-1.0b5/lib/obj/admtool/
lima-1.0b5/lib/obj/admtool/internal/
lima-1.0b5/lib/obj/admtool/mudinfo/
lima-1.0b5/lib/obj/admtool/secure/
lima-1.0b5/lib/obj/secure/
lima-1.0b5/lib/obj/secure/cmd/
lima-1.0b5/lib/obj/secure/mailers/
lima-1.0b5/lib/obj/secure/shell/
lima-1.0b5/lib/obj/secure/shell/classes/
lima-1.0b5/lib/obj/tasktool/
lima-1.0b5/lib/obj/tasktool/internal/
lima-1.0b5/lib/open/
lima-1.0b5/lib/secure/
lima-1.0b5/lib/secure/cgi/
lima-1.0b5/lib/secure/modules/
lima-1.0b5/lib/secure/simul_efun/
lima-1.0b5/lib/std/adversary/
lima-1.0b5/lib/std/adversary/advancement/
lima-1.0b5/lib/std/adversary/armor/
lima-1.0b5/lib/std/adversary/blows/
lima-1.0b5/lib/std/adversary/death/
lima-1.0b5/lib/std/adversary/formula/
lima-1.0b5/lib/std/adversary/health/
lima-1.0b5/lib/std/adversary/pulse/
lima-1.0b5/lib/std/adversary/wield/
lima-1.0b5/lib/std/classes/event_info/
lima-1.0b5/lib/std/container/
lima-1.0b5/lib/std/living/
lima-1.0b5/lib/std/modules/contrib/
lima-1.0b5/lib/std/patterns/
lima-1.0b5/lib/std/race/
lima-1.0b5/lib/std/race/restricted/
lima-1.0b5/lib/std/room/
lima-1.0b5/lib/tmp/
lima-1.0b5/lib/trans/
lima-1.0b5/lib/trans/admincmds/
lima-1.0b5/lib/trans/obj/
lima-1.0b5/lib/wiz/
/* Do not remove the headers from this file! see /USAGE for more info. */

/*
** verb_ob.c
**
** This is a standard verb handler.  It handles adding and removing
** verb rules (to/from the parser efuns).
*/

#include <verbs.h>

string verb = split_path(file_name())[1];
int flags = NEED_TO_SEE | NEED_TO_BE_ALIVE | NEED_TO_THINK;

protected varargs void add_rules(array rules, array syns)
{
  parse_init();

  foreach (string rule in rules)
  {
    parse_add_rule(verb, rule);
    if (syns)
      foreach (string syn in syns)
        parse_add_synonym(syn, verb, rule);
  }
}

protected void set_flags(int f){ flags = f; }

protected void add_flag(int f){ flags |= f; }

protected void clear_flag(int f){ flags &= ~f; }

string refer_to_object(object ob)
{
// In the future, this should be smarter.  Ideally it would generate
// something unique like 'my first sword' or 'the third sword on the table'
  return ob->query_primary_name();
}

mixed try_to_acquire(object ob)
{
/* for things that can be used in certain conditions without
 * actually being in the player's inventory
 */
  if (ob->always_usable())
    return 1;

  if (environment(ob) == this_body())
    return 1;
  write("(Taking " + ob->the_short());
  if (!environment(ob))
  {
    write(" first)\n");
    write("What a quaint idea.\n");
    return 0;
  }

  if (environment(ob) != environment(this_body()))
    write(" from " + environment(ob)->the_short());
  write(" first)\n");
  this_body()->do_game_command("get " + refer_to_object(ob));
  return environment(ob) == this_body();
}

mixed check_ghost()
{
  if (this_body()->query_ghost())
    return "But you're a ghost!\n";
  return 1;
}

mixed check_vision()
{
  if (environment(this_body())->query_light())
    return 1;
  if (environment(this_body())->parent_environment_accessible())
    if (environment(environment(this_body()))->query_light())
      return 1;
  return "You can't see a thing!\n";
}

mixed check_condition()
{
  mixed tmp;

  if (tmp = this_body()->check_condition(0))
    return tmp;
  return 1;
}

/* All (most) can_* functions should call this */
mixed default_checks()
{
  mixed tmp;

  if ((flags & NEED_TO_SEE) && (tmp = check_vision()) != 1)
    return tmp;

  if ((flags & NEED_TO_BE_ALIVE) && (tmp = check_ghost()) != 1)
    return tmp;
// This checks stunned, asleep

  if ((flags & NEED_TO_THINK))
    return check_condition();

  return 1;
}

void handle_obs(array info, function callback, mixed extra...)
{
  foreach (mixed ob in info)
  {
    if (stringp(ob))
      write(ob);
    else
    {
//      write(ob->short() + ": ");
      evaluate(callback, ob, extra...);
    }
  }
}

/* we defined the rule, so assume by default we allow it */
mixed can_verb_rule(string verb, string rule)
{
  return default_checks();
}


int do_verb_one(string verb, object ob)
{
  if ((flags & TRY_TO_ACQUIRE) && !try_to_acquire(ob))
  {
//    write("You can't get " + ob->the_short() +
//        " in order to " + verb + " it.\n");
    return 0;
  }
  if(function_exists("do_" + verb, ob))
  {
    call_other(ob, "do_" + verb);
    return 1;
  } else {
// Safety net in case the object has no do_ function
    write("Trying to " + verb + " " + ob->the_short() + " has no effect.\n");
    return 0;
  }
}

/* default behavior for OBJ rules */
void do_verb_obj(string verb, object ob)
{
  if(do_verb_one(verb, ob))
    this_body()->simple_action("$N $v" + verb + " the $o.", ob);
}

/* default behavior for OBS rules */
void do_verb_obs(string verb, object * obs)
{
  object * success = ({});
  foreach(mixed ob in obs)
    if(objectp(ob))
      if(do_verb_one(verb, ob))
        success += ({ ob });
  if(sizeof(success))
    this_body()->simple_action("$N $v" + verb + " the $o.", success);
}

// default behaviour for "" rules
// Use this where you want to prompt player to use an object with verb
void do_verb(string verb)
{
  write(sprintf("You can't just %s - you need to %s something.\n",
      verb, verb));
}