/***************************************************************************
 *  Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer,        *
 *  Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe.   *
 *                                                                         *
 *  Merc Diku Mud improvments copyright (C) 1992, 1993 by Michael          *
 *  Chastain, Michael Quan, and Mitchell Tse.                              *
 *                                                                         *
 *  In order to use any part of this Merc Diku Mud, you must comply with   *
 *  both the original Diku license in 'license.doc' as well the Merc       *
 *  license in 'license.txt'.  In particular, you may not remove either of *
 *  these copyright notices.                                               *
 *                                                                         *
 *  Dystopia Mud improvements copyright (C) 2000, 2001 by Brian Graversen  *
 *                                                                         *
 *  Much time and thought has gone into this software and you are          *
 *  benefitting.  We hope that you share your changes too.  What goes      *
 *  around, comes around.                                                  *
 ***************************************************************************/

#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "merc.h"

/*
 * The following special functions are available for mobiles.
 */
DECLARE_SPEC_FUN( spec_priest		);
DECLARE_SPEC_FUN( spec_ninja		);


/***************************************************
 * This is a prototype of a special program, feel  *
 * free to copy and edit this to suit your needs   *
 ***************************************************

bool spec_prototype(CHAR_DATA *ch, char *argument)
{
  if (!str_cmp(argument, "update"))
  {
    if (ch->fighting) return FALSE;

    // This part should contain movement, spell-casting, etc,
    // this part is called once every 4 seconds, and is not
    // related to combat...
  }
  else if (!str_cmp(argument, "midround"))
  {
    if (!ch->fighting) return FALSE;

    // This part is the combat oriented part of the code,
    // and is called once every combat round. It should
    // contain special moves/powers the mob uses in combat.
  }

  return FALSE;
}

****************************************************/

bool spec_ninja(CHAR_DATA *ch, char *argument)
{
  if (!str_cmp(argument, "update"))
  {
    if (ch->fighting) return FALSE;

    /* if not hidden, hide */
    if (ch->position == POS_STANDING && !IS_AFFECTED(ch, AFF_HIDE))
      do_hide(ch, "");
    else return FALSE;
  }
  else if (!str_cmp(argument, "midround"))
  {
    CHAR_DATA *victim;

    if ((victim = ch->fighting) == NULL)
      return FALSE;

    if (number_range(1,3) == 2)
      one_hit(ch, victim, gsn_backstab, 0);
  }

  return FALSE;
}

bool spec_priest(CHAR_DATA *ch, char *argument)
{
  if (!str_cmp(argument, "update"))
  {
    CHAR_DATA *vch;
    CHAR_DATA *gch;
    bool found = FALSE;
    int sn;

    for (vch = ch->in_room->people; vch && !found; vch = vch->next_in_room)
    {
      if (vch == ch) continue;
      if (number_range(1,2) == 1) continue;
      found = TRUE;
      gch = vch;
    }

    if (!found) return FALSE;

    switch(number_range(1,3))
    {
      case 1:
        sn = skill_lookup("heal");
        break;
      case 2:
        sn = skill_lookup("bless");
        break;
      case 3:
        sn = skill_lookup("darkblessing");
        break;
    }
    if (sn < 1) return FALSE;

    act("$n mumbles a few arcane words.", ch, NULL, NULL, TO_ROOM);
    (*skill_table[sn].spell_fun) (sn, ch->level, ch, gch);

    return TRUE;
  }
  else if (!str_cmp(argument, "midround"))
  {
    /* the priest does not fight */
    return FALSE;
  }

  return FALSE;
}

/*
 * Special Functions Table.     OLC
 */
const   struct  spec_type       spec_table      [ ] =
{
    /*
     * Special function commands.
     */
    { "spec_priest",                spec_priest         },
    { "spec_ninja",                 spec_ninja          },

    /*
     * End of list.
     */
    { "",                       0       }
};


/*****************************************************************************
 Name:          spec_lookup
 Purpose:       Given a name, return the appropriate spec fun.
 Called by:     do_mset(act_wiz.c) load_specials,reset_area(db.c)
 ****************************************************************************/
SPEC_FUN *spec_lookup( const char *name )       /* OLC */
{   
    int cmd;

    for ( cmd = 0; *spec_table[cmd].spec_name; cmd++ )  /* OLC 1.1b */
        if ( !str_cmp( name, spec_table[cmd].spec_name ) )
            return spec_table[cmd].spec_fun;
 
    return 0;
}

/*****************************************************************************
 Name:          spec_string
 Purpose:       Given a function, return the appropriate name.
 Called by:     <???>
 ****************************************************************************/
char *spec_string( SPEC_FUN *fun )      /* OLC */
{
    int cmd;

    for ( cmd = 0; *spec_table[cmd].spec_fun; cmd++ )   /* OLC 1.1b */
        if ( fun == spec_table[cmd].spec_fun )
            return spec_table[cmd].spec_name;
    
    return 0;
}
 
