A dump of #331 (Staff)

@create #59933 named staff:staff
@prop #331."accept_gem_payment" 1 rc
@prop #331."gem_spells" {} rc
;;#331.("gem_spells") = {"shatter", "harden", "hail", "summon", "appraise"}
@prop #331."pearl_spells" {} rc
;;#331.("pearl_spells") = {"waterwhip", "iceshell", "acidrain", "parch"}
@prop #331."mounted" #-1 r
@prop #331."forcewall_cast_msg" "%N %<intones> words of protection while swinging %p %[focus] about %r in a circle.  %S then %<taps> %d lightly with %p %[focus]." rc
@prop #331."enchant_cast_msg" "%N %<concentrates> on %p %[focus], gently caressing it while muttering odd syllables." rc
@prop #331."barkskin_cast_msg" "%N %<clasps> %p %[focus] tightly to %o whilst tracing mystic symbols about %p body and chanting words of change." rc
@prop #331."hail_cast_msg" "%N %<bangs> %p %[focus] forcefully on the ground while shouting words of power to the heavens." rc
@prop #331."unwall_cast_msg" "%N %<waves> %p hands at %d, intoning words of dispelling." rc
@prop #331."shatter_cast_msg" "%N %<scowls> fiercely, pointing %p %[focus] at %[target] and barking out a short spell." rc
@prop #331."unwall_cast_self_msg" "%N %<waves> %p hands about %r, intoning words of dispelling." rc
@prop #331."forcewall_cast_self_msg" "%N %<intones> words of protection while swinging %p %[focus] about %r in a circle." rc
@prop #331."harden_cast_msg" "%N %<intones> something like `Huge Blooming Cruft' while pointing %p %[focus] and staring cross-eyed at %[target]." rc
@prop #331."biting_cloud_cast_msg" "%N %<holds> %p %[focus] aloft, chanting a buzzing, clicking sort of spell." rc
@prop #331."waterwhip_cast_msg" "%N %<waves> %p %[focus] fluidly, speaking some odd syllables." rc
@prop #331."conjure_cast_msg" "%N %<traces> a strange diagram on the ground with %p %[focus], then %<steps> back, %<spreads> %p arms wide and %<commences> reciting weird syllables." rc
@prop #331."summon_cast_msg" "%N %<traces> arcane symbols on the ground, then %<whispers> a single arcane word to the wind." rc
"#331.("enchantment") => E_PERM (Permission denied)
@prop #331."acidrain_cast_msg" "%N %<points> %p %[focus] at the clouds above %d, chanting and cackling evilly." rc
@prop #331."appraise_cast_msg" "%N %<whispers> under %p breath and %<stares> intently at %[target]." rc
@prop #331."magic_fist_cast_msg" "%N %<punches> forward forcefully while shouting, \"Yzor!\"" rc
@prop #331."unbark_cast_msg" "%N %<taps> %r on the forehead with %p %[focus] while incanting a short rhyme." rc
@prop #331."viper_bite_cast_msg" "%N %<speaks> a sibilant spell, ceasing by spitting." rc
@prop #331."unviper_cast_msg" "%N %<speaks> a sibilant spell, ceasing by sucking in %p spittle." rc
@prop #331."stoneflesh_cast_msg" "%N %<taps> %p forehead, chest and shoulders, whilst chanting words of change." rc
@prop #331."fortify_cast_msg" "%N %<runs> %p hands deftly up and down the length of %p %[focus], then %<touches> its head to %p %[target]." rc
"#331.("bonus") => E_PERM (Permission denied)
"#331.("visible_spells") => E_PERM (Permission denied)
"#331.("no_imp") => E_PERM (Permission denied)
"#331.("dodgable") => E_PERM (Permission denied)
"#331.("parryable") => E_PERM (Permission denied)
;;#331.("osheathe") = "puts away"
;;#331.("sheathe") = "put away"
"#331.("slowness") => E_PERM (Permission denied)
;;#331.("length") = 30
"#331.("parry") => E_PERM (Permission denied)
"#331.("attack") => E_PERM (Permission denied)
"#331.("pen") => E_PERM (Permission denied)
"#331.("dam") => E_PERM (Permission denied)
"#331.("skill") => E_PERM (Permission denied)
;;#331.("hands") = 2
;;#331.("wooden") = 1
;;#331.("blunt") = 1
;;#331.("pierce") = -3
;;#331.("con") = 3
"#331.("max_str_bonus") => E_PERM (Permission denied)
"#331.("can_degrade") => E_PERM (Permission denied)
"#331.("track_usage") => E_PERM (Permission denied)
;;#331.("encumbrance") = 4
;;#331.("manufactured") = 820783482
;;#331.("worth") = -1
;;#331.("condition") = 100
;;#331.("last_action") = 1129633343
;;#331.("use_spell_msg_db") = 1
;;#331.("odrop_failed_msg") = "%<tries> to drop %t but fails!"
;;#331.("odrop_succeeded_msg") = "%<drops> %t."
;;#331.("otake_succeeded_msg") = "%<picks> up %t."
"#331.("key") => E_PERM (Permission denied)
;;#331.("aliases") = {"staff"}
;;#331.("description") = "A long, straight branch trimmed from a sapient pear tree."
;;#331.("object_size") = {37132, 1141286558}

@verb #331:"heal" this none this rd
@program #331:heal
if (this:check_casting(player, dobj, (rpg = $local.rpg).skills.(verb)) && valid(targ = this:check_live_target(player, dobj, rpg.skills.(verb), peaceful = 1)))
  if (targ.inj <= 0)
    player:tell(targ.character.name, " is uninjured.");
  elseif (doll.paralyzed = rpg.magic_db.iceshell_paralyzed_msg)
    player:tell("You'll have to get rid of that shell of ice around ", target.character.name, " first.");
  else
    this:spell(player, targ, rpg.skills.(verb), 0, peaceful);
  endif
endif
.

@verb #331:"storm" this none this rd
@program #331:storm
if (this:check_casting(player, dobjstr, $local.rpg.skills.(verb)))
  this:spell(player, player.location, $local.rpg.skills.(verb));
endif
.

@verb #331:"unwall" any with this rxd
@program #331:unwall
if (this:check_casting(player, dobj, skill = $local.rpg.skills.forcewall) && valid(targ = this:check_live_target(player, dobjstr, skill)))
  if (!(info = targ:read_misc_note("force_wall")))
    player:tell("There is no wall of force around ", targ.character.po, ".");
  else
    mod = 20;
    if (valid(mage_doll = info[1]) && (parent(mage_doll) == $local.rpg.doll))
      if (mage_doll.character != player)
        player:tell("You didn't cast that wall around ", targ.character.name, ";  this might be a little difficult. . .");
        mod = -info[2];
      endif
    else
      player:tell("The original caster of that wall is no more, allowing you to easily dispel the magick.");
      mod = 200;
    endif
    this:spell(player, targ, "unwall", mod, 0, skill);
  endif
endif
.

@verb #331:"forcewall" any with this rxd
@program #331:forcewall
if (this:check_casting(player, dobjstr, skill = $local.rpg.skills.(verb)) && valid(targ = this:check_live_target(player, dobjstr, skill, peaceful = 1)))
  this:spell(player, targ, skill, 0, peaceful, skill);
endif
.

@verb #331:"look_self" this none this
@program #331:look_self
pass(@args);
if (valid(this.mounted))
  player:tell("Mounted at the tip of the ", this.name, " is a ", this.mounted.name, ".");
endif
.

@verb #331:"enchant" none with this rxd
@program #331:enchant
if (this:check_casting(player, dobjstr, skill = $local.rpg.skills.(verb)))
  if (this:enchantment())
    player:tell(this:titlec(), " is already enchanted.");
  else
    this:spell(player, this, skill, 0, 1);
  endif
endif
.

@verb #331:"barkskin" none with this rxd
@program #331:barkskin
rpg = $local.rpg;
if (this:check_casting(player, dobjstr, $local.rpg.skills.(verb)))
  "if ($math_utils:sum($list_utils:map_arg($math_utils, \"sum\", $list_utils:map_prop(rpg:get_doll(player).wearing, \"cover\"))))";
  "  player:tell(\"You'll have to remove what you're wearing first.\");";
  "else";
  for item in ($local.rpg:get_doll(player).schedule)
    if (item[2] in {"unslow", "unspeed"})
      player:tell("Your altered metabolism prevents the spell from affecting you.");
      return;
    endif
  endfor
  this:spell(player, player, $local.rpg.skills.(verb), 0, 1);
endif
"endif";
"Hydros (#106189) - Fri May 27, 2005 - Removed the armour check.  This is already done in $local.rpg.magic_db:barkskin.";
.

@verb #331:"biting_cloud" any with this rxd
@program #331:biting_cloud
if (this:check_casting(player, dobjstr, $local.rpg.skills.(verb)) && valid(targ = this:check_live_target(player, dobjstr, $local.rpg.skills.(verb))))
  this:spell(player, targ, $local.rpg.skills.(verb));
endif
.

@verb #331:"claim" any with this rxd
@program #331:claim
if (this:check_casting(player, dobjstr, (rpg = $local.rpg).skills.(verb)) && valid(targ = this:check_object_target(player, dobjstr)))
  if (rpg.object_db:is_monster(targ))
    rpg:playertell(player, "Sorry, but the LRPG prohibits slavery.");
  else
    doll = rpg:get_doll(player);
    claimed_by = targ:claimed_by();
    claimed_objs = doll:claimed_objects();
    if (((!valid(claimed_by)) && (length(claimed_objs) < doll.max_claims)) || (targ in claimed_objs))
      rpg:playertell(player, "You don't need a spell to accomplish that.");
    elseif (is_player(targ.location) && (!$object_utils:connected(targ.location)))
      rpg:playertell(player, "Hold your magic! By edict of the great wizard, bystanders must not be molested.");
    else
      this:spell(player, targ, rpg.skills.(verb), 0, 1);
    endif
  endif
endif
.

@verb #331:"unbark" none with this rxd
@program #331:unbark
rpg = $local.rpg;
if (this:check_casting(player, dobjstr, rpg.skills.barkskin))
  doll = rpg:get_doll(player);
  if (!(rpg.magic_db.bs_combat_effect in doll.magic_effects))
    player:tell("While your skin may be tough and gnarly, it is not the result of magick.  Perhaps you should consult a dermatologist.");
  else
    player:tell("You try to cast Girdling the Bark.");
    rpg:say_action(this:casting_msg(player, "unbark", player), player);
    data = doll.schedule[$list_utils:iassoc("unbark", doll.schedule, 2)];
    doll:cancel(data);
    rpg.toady:call_verb(data[1], data[2], {doll, @data[4]});
    doll:check_ins(15);
  endif
endif
.

@verb #331:"title" this none this
@program #331:title
name = valid(this.mounted) ? this.mounted.name + "-tipped " | "";
return name + pass(@args);
.

@verb #331:"mount" any on this rxd
@program #331:mount
rpg = $local.rpg;
if ($command_utils:object_match_failed(what = player:my_match_object(dobjstr), dobjstr))
elseif (what.location != player)
  rpg:playertell(player, "You have to be holding the ", what.name, " in order to mount it into ", this.name, ".");
elseif (this.location != player)
  rpg:playertell(player, "Hard to do that without holding ", this.name, ".");
elseif (!rpg.object_db:is_gem(what))
  rpg:playertell(player, "That doesn't seem to be a likely candidate for mounting.");
elseif (!valid(doll = rpg:get_doll(player)))
  rpg:playertell(player, "You haven't the foggiest notion how to accomplish that. Perhaps you should go play with the cows.");
elseif (doll.paralyzed)
  if (typeof(doll.paralyzed) == STR)
    rpg:playertell(player, doll.paralyzed);
  else
    rpg:playertell(player, "Your'e paralyzed. Knock it off.");
  endif
elseif (is_player(player) && (`idle_seconds(player) ! ANY => 500' > (2 * rpg.idle_threshold)))
  rpg:playertell(player, "You drop your ", what.name, "and lose it.");
  what:moveto(rpg.cemetery);
elseif ($recycler:valid(this.mounted))
  rpg:playertell(player, "You'll have to unmount the ", this.mounted.name, " first.");
elseif (!doll:long_enough())
  rpg:playertell(player, "You're trying to do too many things at once.  Take a deep breath and try again.");
elseif ((try_ = rpg.skills.gadget:resolve(player, 0)) < 1)
  rpg:playertell(player, "You fumble around for a bit, but can't seem to manage to get the ", what.name, " mounted on ", this.name, ".");
else
  rpg:say_action(("%N deftly %<mounts> " + what.name) + " upon the tip of %p %t.", player);
  what:moveto(this);
  this.mounted = what;
  doll.last_attack = time();
endif
"Profane (#30788) - Sun Oct 26 14:11:34 1997 PST - Check for paralysis and idleness";
.

@verb #331:"unmount" any from this rxd
@program #331:unmount
what = this:match(dobjstr);
rpg = $local.rpg;
if (this.location != player)
  rpg:playertell(player, "Hard to do that while you're not holding ", this.name, ".");
elseif ($command_utils:object_match_failed(what, dobjstr))
elseif ((!valid(this.mounted)) || (what != this.mounted))
  rpg:playertell(player, "That does not seem to be mounted in ", this.name, ".");
elseif (!$recycler:valid(doll = rpg:get_doll(player)))
  rpg:playertell(player, "You haven't the slightest idea how to do that. Perhaps you should go play with the cows.");
else
  this.mounted:moveto(player);
  this.mounted = $nothing;
  rpg:say_action("%N deftly %<unmounts> a %t from %p %i.", player, what);
  doll.last_attack = time();
endif
"Irin Sat Oct 12 15:10:35 1996 PDT -- changed to match this.contents, rather than player.contents.";
.

@verb #331:"exitfunc" this none this
@program #331:exitfunc
{what} = args;
if (!(rpg = $local.rpg):trusted_efunc())
  return E_PERM;
elseif (((!$recycler:valid(this.mounted)) || (this.mounted.location != this)) || (this.mounted == what))
  this.mounted = $nothing;
endif
.

@verb #331:"shatter" any with this rxd
@program #331:shatter
if (this:check_casting(player, dobjstr, (rpg = $local.rpg).skills.(verb)) && valid(target = this:check_object_target(player, dobjstr)))
  db = rpg.object_db;
  dude = target.location;
  doll = rpg:get_doll(dude);
  "if (is_player(dude) && (!(((!valid(doll)) || (dude in connected_players())) || ((idle_seconds(dude) > 180) && ((time() - doll.last_attack) > 180)))))";
  if (is_player(dude) && (!valid(this:check_live_target(player, dude, rpg.skills.(verb), 0))))
    return;
  elseif (rpg.magic_db.is_combat_effect in `doll:get_att("freeze_effects") ! E_INVIND => {}')
    player:tell("You'll have to shatter the shell of ice around ", dude.name, " first.");
  elseif (((!db:is_monster(target)) && ((db:is_money(target) || db:is_gem(target)) || db:is_metallic(target))) && (`typeof(target.condition) ! ANY' == NUM))
    this:spell(player, target, rpg.skills.(verb));
  elseif (`target:receive_shatter(target, rpg.skills.(verb)) ! E_VERBNF => 0')
    "... target handled the attack ...";
  else
    player:tell("My God!  ", target:titlec(), " seems to be immune to Terram magic!");
  endif
endif
"Profane 31-MAR-97 1330PST -- no shatter stuff on disconnected players.";
"Hydros (#106189) - Sun Apr 17, 2005 - Added :check_live_target line to handle new PKProtection effect, and because it should probably have this check anyway.";
.

@verb #331:"harden" any with this rxd
@program #331:harden
if (this:check_casting(player, dobjstr, $local.rpg.skills.(verb)) && valid(target = this:check_object_target(player, dobjstr)))
  if ((!`target.condition ! ANY => 0') || `target.wooden ! E_PROPNF, E_PERM => `target.leather ! E_PROPNF, E_PERM => 1'')
    player:tell("My God!  ", target:titlec(), " seems to be immune to Terram magic!");
  elseif (target.location != player)
    player:tell("You must hold ", target:title(), " to affect it.");
  else
    this:spell(player, target, $local.rpg.skills.(verb), 0, 1);
  endif
endif
.

@verb #331:"hail" any with this rxd
@program #331:hail
if (this:check_casting(player, dobjstr, $local.rpg.skills.(verb)) && (targets = this:check_multiple_live_targets(player, dobjstr, $local.rpg.skills.(verb))))
  this:spell(player, targets, $local.rpg.skills.(verb));
endif
.

@verb #331:"iceshell" any with this rxd
@program #331:iceshell
if (this:check_casting(player, dobjstr, skill = $local.rpg.skills.(verb)) && valid(targ = this:check_live_target(player, dobjstr, skill, peaceful = 0)))
  if ($local.rpg.magic_db.is_combat_effect in targ:get_att("freeze_effects"))
    player:tell(targ.character.name, " is already encased in ice.");
  else
    this:spell(player, targ, verb, 0, peaceful, skill);
  endif
endif
.

@verb #331:"waterwhip" none with this rxd
@program #331:waterwhip
rpg = $local.rpg;
if (this:check_casting(player, dobjstr, skill = rpg.skills.(verb)))
  doll = rpg:get_doll(player);
  generic = rpg.magic_db.(verb);
  for t in (generic:get_value("dispellers"))
    {who, when} = t;
    if (when < time())
      generic:set_value("dispellers", setremove(generic:get_value("dispellers"), t));
    elseif (who == player)
      return rpg:playertell(player, "You recently dispelled a waterwhip and the dessicating energies still swirl around you.");
    endif
  endfor
  whip = $list_utils:iassoc("unwhip", schedule = doll:get_att("schedule"), 2);
  if (whip && (schedule[whip][4][1].location == player))
    player:tell("You already have one.");
  else
    this:spell(player, generic, verb, 0, 1, skill);
  endif
endif
.

@verb #331:"acceptable" this none this
@program #331:acceptable
return $object_utils:isa(thing = args[1], $local.rpg.gem);
.

@verb #331:"conjure" any with this rxd
@program #331:conjure
magic = (rpg = $local.rpg).magic_db;
spell = rpg.skills.(verb);
if (this:check_casting(player, dobjstr, spell))
  if ("submerged" in player.location:get_room_flags())
    player:tell("You cannot conjure animals underwater!");
  else
    animal = summoned = 0;
    for type in (magic.summonable_animals)
      if (animal)
      elseif ($sysobj:match(dobjstr, type))
        animal = type in magic.summonable_animals;
      endif
    endfor
    for critter in (children(magic.summonable_animal))
      if (critter:master() == player)
        summoned = summoned + 1;
      endif
    endfor
    if ((!animal) && dobjstr)
      player:tell("I don't think you can conjure a \"", dobjstr, "\".");
    else
      this:spell(player, player.location, spell, -55 * summoned, 1, spell, animal);
    endif
  endif
endif
"Irin Fri Oct 18 16:41:25 1996 PDT -- One animal per person, _please_.";
"Profane 2-SEP-97 1706PDT -- no conjure underwater.";
.

@verb #331:"summon" any with this rxd
@program #331:summon
"Copied from thin wand (#65144):summon by Griffen (#93228) Sat Sep  7 13:46:25 1996 PDT";
"...usage: summon <truename> with <foci>...";
spell = $local.rpg.skills.(verb);
if (this:check_casting(player, dobjstr, spell))
  this:spell(player, player.location, spell, 0, 1, spell, dobjstr);
endif
"...Griffen (#93228), 6-11-96.  Added...";
.

@verb #331:"may_cast" this none this
@program #331:may_cast
"may_cast(doll, spell) => can we cast the spell?";
{doll, spell} = args;
who = doll.character;
if (is_player(who) && `$perm_utils:caller()[1]:gem_needed(doll, spell) ! ANY => 1')
  if (spell in this.gem_spells)
    if (valid(this.mounted) && (!index(this.mounted.name, "pearl")))
      return 1;
    else
      who:tell(("You'll have to mount a gem on your " + this.name) + " to cast that spell.");
      return 0;
    endif
  elseif (spell in this.pearl_spells)
    if (valid(this.mounted) && index(this.mounted.name, "pearl"))
      return 1;
    else
      who:tell(("You'll have to mount a pearl on your " + this.name) + " to cast that spell.");
      return 0;
    endif
  endif
endif
return 1;
.

@verb #331:"pay_cost" this none this
@program #331:pay_cost
":pay_cost(doll, spell, skill, div) => pay the cost of the casting.";
rpg = $local.rpg;
if ((caller == this) || (caller.owner in rpg.gms))
  {doll, spell, skillobj, costdiv} = args;
  if (is_player(doll.character) && ((spell in this.gem_spells) || (spell in this.pearl_spells)))
    if (!$recycler:valid(mounted = this.mounted))
      "Hmm, how'd they manage to cast the spell then? Oh well, we'll just skip the gem bit.";
      return pass(doll, spell, skillobj, costdiv);
    endif
    price = (skillobj.diff / (costdiv * 4)) + (length(children(parent(mounted))) / 375);
    tvalue = mounted:get_true_value();
    tvalue = (typeof(tvalue) == NUM) ? tvalue | 0;
    mounted:set_true_value(tvalue - price);
    avalue = mounted:get_appraised_value();
    if (avalue)
      mounted:set_appraised_value(max(((avalue - price) + random(20)) - random(20), 1));
    endif
    if (this.mounted:get_true_value() < 1)
      rpg:say_action(("The " + this.mounted.name) + " mounted on %n's %t shatters into a thousand slivers!", this.location, this);
      this.mounted = $nothing;
      fork (rpg.gm_lag)
        if ($recycler:valid(mounted))
          mounted:moveto(rpg.gem_dispenser);
        endif
      endfork
    endif
  endif
  pass(doll, spell, skillobj, costdiv);
endif
"Profane 30-NOV-96 1309PST - move this.mounted=$nothing outside of fork.";
"Irin Sun Dec  1 18:45:19 1996 PST -- Changed this.mounted to mounted, inside the fork, so that gems _will_ shatter.";
"Profane 7-DEC-96 1234PST -- removed obsolete reference to gem_focus_dispenser";
.

@verb #331:"do_enchant" this none this
@program #331:do_enchant
":do_enchant(power, end time) => Enchant the item.";
if ($local.rpg:trusted(caller_perms()))
  {power, dur} = args;
  if (this.enchantment)
    this.enchantment[1] = max(power, this.enchantment[1]);
    this.enchantment[2] = max(this.enchantment[2] + (dur / 2), time() + dur);
  else
    this.enchantment = {power, time() + dur};
  endif
endif
.

@verb #331:"dam" this none this
@program #331:dam
return pass(@args) + (this:enchantment() / 10);
.

@verb #331:"con" this none this
@program #331:con
return max(1, pass(@args) - (this:enchantment() / 50));
"THX (#105941) - Tue Jan  9, 2001 - Made enchantment subtractive.  It might actually help now.";
.

@verb #331:"enchantment" this none this
@program #331:enchantment
if (enc = this.enchantment)
  (rpg = $local.rpg):secure();
  if (enc[2] < time())
    if (valid(x = rpg:get_doll(this.location)))
      if ((x.body_areas == rpg.magic_db.barkskin_body_areas) && (this in x.wielding))
        return enc[1];
      endif
      name = (this.location.name + "'s ") + this:title();
    else
      name = this:title();
    endif
    rpg:say_action(name + " seems to flicker briefly.", this.location, this, this.location.location);
    this.enchantment = 0;
    return 0;
  else
    return enc[1];
  endif
endif
return 0;
"THX (#105941) - Wed Jul 12, 2000 - If the caster is barkskinned, let's let the enchantment stay!";
.

@verb #331:"attack parry" this none this
@program #331:attack
return pass(@args) + (this:enchantment() / 15);
.

@verb #331:"set_mounted" this none this
@program #331:set_mounted
":set_mounted(OBJ gem) => Sets the .mounted value, allowing non G_M code to change this on G_M owned objects.  It is the coding GM's responsibility to make sure any already mounted gems are removed, and any unmounted gems are moved to the staff.";
if ($local.rpg:trusted(caller_perms()))
  this.mounted = args[1];
endif
.

@verb #331:"acidrain" any with this rxd
@program #331:acidrain
if (this:check_casting(player, dobjstr, skill = $local.rpg.skills.(verb)) && valid(targ = this:check_live_target(player, dobjstr, skill)))
  storms = $local.rpg.magic_db:storms_active_in(player.location);
  if (!(targ.character in $list_utils:slice(storms, 2)))
    player:tell("There's no storm above ", targ.character.name, " to turn into acid.");
  elseif (targ.character == player)
    player:tell("Melting yourself with acid is not very comfortable. I don't advise it.");
  else
    this:spell(player, targ, skill, 0);
  endif
endif
.

@verb #331:"appraise" any with this rxd
@program #331:appraise
skill = $local.rpg.skills.(verb);
if (this:check_casting(player, dobjstr, skill) && valid(target = this:check_object_target(player, dobjstr)))
  if (target.location != player)
    player:tell("You have to hold something to use this spell on it.");
  elseif ($local.rpg.object_db:is_money(target))
    player:tell("Um, just count it. You don't need a spell.");
  elseif (parent(target) != $local.rpg.gem)
    player:tell("The spell only works on gems, pal.");
  elseif (target:get_appraised_value())
    player:tell("The ", target.name, " has already been appraised.");
  else
    this:spell(player, target, skill, 0, 1);
  endif
endif
.

@verb #331:"hidden_verbs" this none this
@program #331:hidden_verbs
"Swiped from Staff:hidden_verbs by Dagard (#49807) Mon Dec  1 12:00:42 1997 PST";
{who} = args;
prev = pass(who);
staff = (rpg = $local.rpg).staff;
if (valid(this.mounted))
  prev = {@prev, {staff, "mount", {"any", "on top of/on/onto/upon", "this"}}};
  pearl = index(this.mounted.name, "pearl");
  gem = !pearl;
else
  prev = {@prev, {staff, "unmount", {"any", "out of/from inside/from", "this"}}};
  pearl = gem = 0;
endif
pearl || (prev = {@prev, {staff, "iceshell", {"any", "with/using", "this"}}});
pearl || (prev = {@prev, {staff, "waterwhip", {"none", "with/using", "this"}}});
pearl || (prev = {@prev, {staff, "acidrain", {"any", "with/using", "this"}}});
gem || (prev = {@prev, {staff, "shatter", {"any", "with/using", "this"}}});
gem || (prev = {@prev, {staff, "hail", {"any", "with/using", "this"}}});
gem || (prev = {@prev, {staff, "harden", {"any", "with/using", "this"}}});
gem || (prev = {@prev, {staff, "summon", {"any", "with/using", "this"}}});
gem || (prev = {@prev, {staff, "appraise", {"any", "with/using", "this"}}});
if (!this:enchantment())
  prev = {@prev, {staff, "magicfist magic*_fist punch", {"any", "with/using", "this"}}};
  prev = {@prev, {staff, "firebolt heat", {"any", "with/using", "this"}}};
endif
return prev;
"THX (#105941) - Wed Feb 16, 2000 - Added removal of pearl-or-gem requiring verbs if not mounted and added removal of verbs that require enchantment if no enchantment is present.";
.

@verb #331:"break" this none this
@program #331:break
(rpg = $local.rpg):secure();
mounted = this.mounted;
loc = this.location;
if (valid(mounted))
  mounted:moveto(rpg.cemetery.turf[1]);
endif
"Moving to nothing is necessary 'cause otherwise it gets offed when the staff itself gets offed.";
if ((typeof(pass(@args)) != ERR) && valid(mounted))
  if (valid(rpg:get_doll(loc)))
    mounted:moveto(loc.location);
    rpg:say_action(("The " + mounted.name) + " from %n's %t tumbles to the ground.", loc);
  else
    mounted:moveto(loc);
  endif
else
  "Ooops, error. move the gem back!";
  `mounted:moveto(this) ! E_INVIND';
endif
.

@verb #331:"magicfist magic*_fist punch" any with this rxd
@program #331:magicfist
if (this:enchantment())
  if (this:check_casting(player, dobjstr, (rpg = $local.rpg).skills.magic_fist) && valid(target = this:check_live_target(player, dobjstr, rpg.skills.magic_fist)))
    this:spell(player, target, rpg.skills.magic_fist);
  endif
else
  player:tell((random(3) == 1) ? ("The " + this.name) + " that you are holding might be a focus for that spell if you enchanted it first ..." | "You need to be wielding the proper focus.");
endif
.

@verb #331:"firebolt heat" any with this rxd
@program #331:firebolt
if (this:enchantment() < 99)
  player:tell("You try to cast the ", verb, " spell, but realize you lack the proper focus.");
elseif (this:check_casting(player, dobjstr, skill = $local.rpg.skills.(verb)) && valid(targ = this:check_live_target(player, dobjstr, skill, peaceful = 0)))
  this:spell(player, targ, skill, 0);
endif
.

@verb #331:"viper_bite" none with this rxd
@program #331:viper_bite
rpg = $local.rpg;
if (this:check_casting(player, dobjstr, skill = rpg.skills.(verb)))
  "if (rpg:get_doll(player).natural_weapons != rpg.doll.natural_weapons)";
  "  player:tell(\"Hmm, you can't get the spell to work.\");";
  "else";
  this:spell(player, player, skill);
  "endif";
endif
.

@verb #331:"unviper" none with this rxd
@program #331:unviper
rpg = $local.rpg;
if (this:check_casting(player, dobj, rpg.skills.viper_bite))
  "if (!(rpg.magic_db.viper_bite in (doll = rpg:get_doll(player)).natural_weapons))";
  if (!(rpg.magic_db.viper_bite in rpg.object_db.natweap_db:get_all_natweaps(doll = rpg:get_doll(player))))
    player:tell("You don't have any dental problems that can be fixed by magick.");
  else
    this:spell(player, doll, "unviper", 0, 0, rpg.skills.viper_bite);
  endif
endif
.

@verb #331:"nickname" this none this
@program #331:nickname
{nickname} = args;
if (children(this) || this.unique)
elseif ((this.owner == $local.rpg.owner) && ($code_utils:verb_loc() == parent(this)))
  $local.rpg:secure();
  this.name = nickname;
  this.aliases = setadd(this.aliases, nickname);
endif
.

@verb #331:"stoneflesh" none with this rxd
@program #331:stoneflesh
rpg = $local.rpg;
if (this:check_casting(player, dobjstr, skill = rpg.skills.harden))
  this:spell(player, player, verb, 0, 1, skill);
endif
.

@verb #331:"parch" any with this rxd
@program #331:parch
if (this:check_casting(player, dobjstr, skill = $local.rpg.skills.(verb)) && valid(targ = this:check_live_target(player, dobjstr, skill, peaceful = 0)))
  this:spell(player, targ, verb, 0, peaceful, skill);
endif
.

@verb #331:"unstone" none with this rxd
@program #331:unstone
if (this:check_casting(player, player.location, $local.rpg.skills.harden))
  this:spell(player, $local.rpg:get_doll(player), "unstone", 0, 1, $local.rpg.skills.harden);
endif
.

@verb #331:"fortify" any with this rxd
@program #331:fortify
if (this:enchantment() < 111)
  player:tell("You try to cast the ", verb, " spell, but realize you lack the proper focus.  Your ", this.name, " may not be magickal enough.");
elseif (this:check_casting(player, dobjstr, $local.rpg.skills.harden) && valid(target = this:check_object_target(player, dobjstr)))
  if ((!`target.condition ! ANY => 0') || `!target.wooden ! E_PROPNF, E_PERM => `!target.leather ! E_PROPNF, E_PERM => 1'')
    player:tell("My God!  ", target:titlec(), " seems to be immune to Herbam magic!");
  elseif (target.location != player)
    player:tell("You must hold ", target:title(), " to affect it.");
  elseif ((doll = (rpg = $local.rpg):get_doll(player)):read_misc_note("Knows_Fortify") == E_PROPNF)
    player:tell("You lack the knowledge of how to cast this spell.");
  else
    this:spell(player, target, verb, doll.herbam, 1, rpg.skills.herbam);
  endif
endif
"dalton (#116601) - Wed Jul  9, 2003 - Copied from Hydros' (#106189) prototype ";
.

"***finished***