
/* skill system */

#define _gm "/guild/master"

closure call;

void skill_reset(int flag)
{
     if (flag == 0)
         call = #'call_other;
}

/* skilltype : skillname min_skill max_skill  costfactor */

#define SKILLS ([ \
        "monk_meditate":   ({"meditate",1,100,120}),    \
        "monk_attack":     ({"attack",1,100,300}),      \
        "monk_blink":      ({"blink",1,100,200}),            \
        "monk_aikido":     ({"aikido",1,100,20}),       \
        "monk_cure":       ({"cure",1,100,150}),        \
        "monk_grill":      ({"grill",1,100,2}),         \
        "monk_scan":       ({"scan",1,100,30}),         \
        "monk_death":      ({"death",1,100,200}),        \
        "monk_damage":     ({"damage",1,100,300}),      \
        "monk_choke":      ({"choke",1,100,40}),        \
        "monk_smash":      ({"smash",1,100,300}),        \
        "monk_disarm":     ({"disarm",1,100,90}),       \
        "monk_block":      ({"block",1,100,40}),        \
        "monk_rescue":     ({"rescue",1,100,15}),       \
        "monk_feet":       ({"feet",1,100,14}),         \
        "monk_springleap": ({"springleap",1,100,150}),   \
        "monk_hide":       ({"hide",1,100,200}),        \
        "monk_dead":       ({"dead",1,180,50}),       \
        ])
  
/*
  Function: query_skill(object, skill)
  Returns: 0 or the actual skill of the monk 
                                                   */
int query_skill(object mob,string mskill)
{
   mixed skill;

   skill = funcall(call,mob,"get_skill",mskill);

   if ( sizeof(skill)  && member(SKILLS,mskill)==1)
      return skill[0];
   return 0;
}

/*
  Function: query_cost(object, skill)
  Returns: the actual costs of the skill 
                                                   */
int query_cost(object mob,string mskill)
{
   int cost;

    if (!mskill || member(SKILLS,mskill)!=1)
        return 0;

    cost = SKILLS[mskill][3] + SKILLS[mskill][3] * query_skill(mob,mskill);

    return cost;
} 

  
/*
  Function: list_skills(object, silence)
  Usage: silence 0 silence 1 skill display 2 full display 
                                                                        */
mixed list_skills(object mob,int silence)
{
    int i, sz;
    mixed skill;
    string *skills;
    string ret;

    ret = "";
    skills = m_indices(SKILLS);
    sz = sizeof(skills);

    if (silence==2)
    {
      ret+=sprintf("----------------------------------------------------------\n");
      ret+=sprintf("%-15s %-25s %-10s %-10s\n",
              "Skilltype:","Skilllevel:","Max.Skill:","Cost:");
      ret+=sprintf("----------------------------------------------------------\n");
    }
    else if (silence == 1)
    {
       ret+=sprintf("--------------------------------------\n");
       ret+=sprintf("%-15s %-25s\n",
              "Skilltype:","Skilllevel:");
       ret+=sprintf("--------------------------------------\n");
    }
    for (i = 0; i < sz; i++)
    {
       if (!funcall(call,mob,"get_skill",skills[i]))
       {
          funcall(call,"/guild/master","change_skill",
          mob,skills[i],SKILLS[skills[i]][1]+random(5),
                        SKILLS[skills[i]][2],7);
       }
       skill = funcall(call,mob,"get_skill",skills[i]);
       if (silence==2)
       {
         ret+=sprintf("%-15s %-25s %-10s %-10s\n",
         SKILLS[skills[i]][0],
         funcall(call,"/obj/skill_master","get_skill_title",skill[0]),
         "guru",
         to_string(query_cost( mob, skills[i])));
       }
       else if (silence == 1)
       {
         ret+=sprintf("%-15s %-25s\n",
         SKILLS[skills[i]][0],
         funcall(call,"/obj/skill_master","get_skill_title",skill[0]) );
       }
    }
  return ret;
}

/*
  Function: raise_practice(object, boni)
  Returns: the new practice sessions of the monk
                                                   */
int raise_practice(object mob,int boni)
{
   int mbon;
   int act;
   object master;

   if (boni)
       mbon = boni;
   else 
       mbon = 0;

   if (!act = query_skill(mob,"monk_practice"))
   {
      if (mbon > 100)
          mbon = 100;
      funcall(call,_gm,"change_skill",mob,"monk_practice",mbon,100,7);
      return mbon;
    }
    if (act + mbon > 100)
       mbon = 100;
    else 
       mbon = act + mbon;
    funcall(call,_gm,"change_skill",mob,"monk_practice",mbon,100,7);
    return mbon;
}
    

/*
   Function: raise_skill ( object, skillid, boni)
   Returns: -1 if no monk skill, 0 if not valid : the newskill
                                                                */    
int raise_skill(object mob,string mskill,int boni)
{
   int newskill;

    if (member(SKILLS,mskill)!=1)
        return -1;
   
    if (query_skill(mob,mskill)) 
        newskill = query_skill(mob,mskill) + boni;
    else 
       return 0;

    if (newskill > 100)
        newskill = 100;
    if (newskill < 1)
        newskill = 1;
   
      
    funcall(call,_gm,"change_skill",mob,mskill,newskill,SKILLS[mskill][2],7);

    return newskill;
}
    
 /* end */
