ackfuss-4.4.1/
ackfuss-4.4.1/board/
ackfuss-4.4.1/help/k/
ackfuss-4.4.1/help/n/
ackfuss-4.4.1/help/s/
ackfuss-4.4.1/help/u/
ackfuss-4.4.1/help/v/
ackfuss-4.4.1/help/x/
ackfuss-4.4.1/help/y/
ackfuss-4.4.1/help/z/
ackfuss-4.4.1/src/areaconvert/
ackfuss-4.4.1/src/areaconvert/h/
/***************************************************************************
 * _/_/_/_/  _/    _/  _/_/_/_/ _/_/_/_/ AckFUSS is modified ACK!MUD 4.3.1 *
 * _/        _/    _/  _/       _/       copyright Matt Goff (Kline) 2008  *
 * _/_/      _/    _/  _/_/_/_/ _/_/_/_/                                   *
 * _/        _/    _/        _/       _/ Support for this code is provided *
 * _/        _/_/_/_/  _/_/_/_/ _/_/_/_/ at www.ackmud.net -- check it out!*
 ***************************************************************************/

#include "h/globals.h"

#ifndef DEC_ACT_WIZ_H
#include "h/act_wiz.h"
#endif

#ifndef DEC_COMM_H
#include "h/comm.h"
#endif

#ifndef DEC_DB_H
#include "h/db.h"
#endif

#ifndef DEC_HANDLER_H
#include "h/handler.h"
#endif

#ifndef DEC_MAGIC_H
#include "h/magic.h"
#endif

#ifndef DEC_SSM_H
#include "h/ssm.h"
#endif

bool char_data::check_cooldown( const char *skill )
{
 int sn = skill_lookup(skill);

 if( sn < 0 )
  return false;

 if( skill_table[sn].cooldown <= COOLDOWN_NONE )
  return false;

 if( cooldown[skill_table[sn].cooldown] > 0 )
 {
  switch( skill_table[sn].cooldown )
  {
   case COOLDOWN_OFF: send_to_char("@@eYour offensive abilities are on cooldown right now.\r\n",this); break;
   case COOLDOWN_DEF: send_to_char("@@lYour defensive abilities are on cooldown right now.\r\n",this); break;
  }
  return true;
 }

 return false;
}

bool char_data::check_cooldown( int pos )
{
 if( pos <= COOLDOWN_NONE )
  return false;

 if( cooldown[pos] > 0 )
 {
  switch( pos )
  {
   case COOLDOWN_OFF: send_to_char("@@eYour offensive abilities are on cooldown right now.\r\n",this); break;
   case COOLDOWN_DEF: send_to_char("@@lYour defensive abilities are on cooldown right now.\r\n",this); break;
  }
  return true;
 }

 return false;
}

void char_data::gain_exp( int gain )
{
 if( IS_NPC(this) && !act.test(ACT_INTELLIGENT) )
  return;
 if( IS_IMMORTAL(this) )
  return;

 if( (exp + gain) >= MAX_EXP )
  exp = MAX_EXP;
 else
  exp += gain;

 if( exp < 0 )
  exp = 0;

 return;
}

short char_data::get_level( const char *what )
{
 short i = 0, max = 0;;

 if( what == '\0' )
  return level;

 if( !str_prefix(what,"maxmortal") )
 {
  for( i = 0; i < MAX_CLASS; i++ )
   if( lvl[i] > max )
    max = lvl[i];
  return max;
 }
 if( !str_prefix(what,"maxremortal") )
 {
  for( i = 0; i < MAX_CLASS; i++ )
   if( lvl2[i] > max )
    max = lvl2[i];
  return max;
 }
 if( !str_prefix(what,"mortal") )
  return (lvl[CLS_MAG] + lvl[CLS_CLE] + lvl[CLS_THI] + lvl[CLS_WAR] + lvl[CLS_PSI]);
 if( !str_prefix(what,"remortal") )
  return (lvl2[CLS_SOR] + lvl2[CLS_MON] + lvl2[CLS_ASS] + lvl2[CLS_KNI] + lvl2[CLS_NEC]);
 if( !str_prefix(what,"psuedo") )
  return (level + (get_level("remortal")/4));

 if( !str_prefix(what,"adept") )
  return IS_NPC(this) ? level / 7 : pcdata->adept_level;
 if( !str_prefix(what,"mage") )
  return lvl[CLS_MAG];
 if( !str_prefix(what,"cleric") )
  return lvl[CLS_CLE];
 if( !str_prefix(what,"thief") )
  return lvl[CLS_THI];
 if( !str_prefix(what,"warrior") )
  return lvl[CLS_WAR];
 if( !str_prefix(what,"psionicist") )
  return lvl[CLS_PSI];
 if( !str_prefix(what,"sorcerer") )
  return lvl2[CLS_SOR];
 if( !str_prefix(what,"monk") )
  return lvl2[CLS_MON];
 if( !str_prefix(what,"assassin") )
  return lvl2[CLS_ASS];
 if( !str_prefix(what,"knight") )
  return lvl2[CLS_KNI];
 if( !str_prefix(what,"necromancer") )
  return lvl2[CLS_NEC];

 snprintf(log_buf,(2 * MIL),"char_data::get_level(): Received invalid request for '%s'.",what);
 monitor_chan(log_buf,MONITOR_DEBUG);
 return level;
}

const char *char_data::get_name( CHAR_DATA *looker )
{
 if( looker != NULL )
 {
  if( can_see(looker,this) )
  {
   if( IS_NPC(this) )
    return npcdata->short_descr;
   else
   {
    if( IS_WOLF(this) && (IS_SHIFTED(this) || IS_RAGED(this)) )
     return "A Large @@bWolf@@N";
    else
     return name.c_str();
   }
  }
  else
  {
   if( IS_IMMORTAL(this) )
    return "A Mystical Being";
   else
    return "Someone";
  }
 }
 else
 {
  if( IS_NPC(this) )
   return npcdata->short_descr;
  else
   return name.c_str();
 }

 return "Unknown!";
}

const char *char_data::get_title( )
{
 if( IS_NPC(this) )
  return "";
 else
  return pcdata->title;
}

void char_data::send( string txt, ... )
{
 char buf[MSL];
 va_list args;

 if( this == NULL || desc == NULL )
  return;

 if( txt.empty() )
  return;

 va_start(args,txt);
 vsprintf(buf,txt.c_str(),args);
 va_end(args);

 if( desc->showstr_head != NULL )
 {
  char *ssh;

  ssh = (char *)qgetmem( strlen( desc->showstr_head ) + strlen( buf ) + 1 );
  strcpy( ssh, desc->showstr_head );
  strcat( ssh, buf );

  if( desc->showstr_point )
   desc->showstr_point += ( ssh - desc->showstr_head );
  else
   desc->showstr_point = ssh;

  free(desc->showstr_head);
  desc->showstr_head = ssh;
 }
 else
 {
  desc->showstr_head = (char *)malloc( strlen( buf ) + 1);
  strcpy( desc->showstr_head, buf );
  desc->showstr_point = desc->showstr_head;
 }
 if( desc->showstr_point == desc->showstr_head )
  show_string( desc, "" );
 return;
}

void char_data::set_cooldown( const char *skill )
{
 int sn = skill_lookup(skill);

 if( sn < 0 )
  return;

 if( skill_table[sn].cooldown <= COOLDOWN_NONE )
  return;

 cooldown[skill_table[sn].cooldown] += skill_table[sn].beats;

 return;
}

void char_data::set_cooldown( int pos, float duration )
{
 if( pos <= COOLDOWN_NONE )
  return;

 cooldown[pos] += duration;

 return;
}

void char_data::set_title( const char *title )
{
 if( IS_NPC(this) )
  return;

 free_string(pcdata->title);
 pcdata->title = str_dup(title);

 return;
}