// MorgenGrauen MUDlib
//
// living/std_skills.c -- Standardfaehigkeiten
//
// $Id: std_skills.c 6673 2008-01-05 20:57:43Z Zesstra $
#pragma strong_types
#pragma save_types
#pragma range_check
#pragma no_clone

#define NEED_PROTOTYPES
#include <living/skills.h>
#include <living/skill_attributes.h>
#include <thing/properties.h>
#include <attributes.h>
#undef NEED_PROTOTYPES
#include <properties.h>
#include <new_skills.h>

#define SIG(x) (x?(x>0?1:-1):0)

protected int StdSkill_Nightvision(object me, string sname, mixed sinfo) {
  int abil,light,llt,dt,res;

  if (!sinfo || !environment()) return 0;
  if (intp(sinfo)) sinfo=([SI_SKILLABILITY:sinfo]);
  if (!mappingp(sinfo)) return 0;
  if ((light=QueryProp(P_PLAYER_LIGHT))>0) {
    ModifySkill(sname,([SI_LASTLIGHT:time()]));
    return light;
  }
  abil=sinfo[SI_SKILLABILITY];
  if (!(llt=sinfo[SI_LASTLIGHT])) {
    ModifySkill(sname,([SI_LASTLIGHT:time()]));
    dt=0;
  } else {
    dt=time()-llt;
    if (dt<0) dt=0;
    if (dt>86400) dt=86400;
  }

  res=(abil*dt)/(20*MAX_ABILITY)+light;
  if (res<=0) {
    res--; // Wert muss !=0 sein
    if (res<-MAX_ABILITY) res=-MAX_ABILITY;
  } else {
    if (res>MAX_ABILITY) res=MAX_ABILITY;
  }
  return res;
}

protected mapping StdSkill_Bihand(object me, string sname, mapping sinfo) {
  int abil,val;

  // printf("Bihand: %O\n",sinfo);
  if (!sinfo) return 0;
  abil=sinfo[SI_SKILLABILITY];
  val=(abil*(QueryAttribute(A_STR)+33))/MAX_ABILITY;
  val=(val*QuerySkillAttribute(SA_DAMAGE))/100;
  sinfo[SI_SKILLDAMAGE]+=val;
  // + max. 53
  return sinfo;
}

protected mapping StdSkill_Fight_sword(object me, string sname, mapping sinfo) {
  int abil,asig,val;

  abil=sinfo[SI_SKILLABILITY];asig=SIG(abil);
  val=(abil*(QueryAttribute(A_STR) +
             QueryAttribute(A_DEX)*asig +
             33))/MAX_ABILITY;
  val=(val*QuerySkillAttribute(SA_DAMAGE))/100;
  sinfo[SI_SKILLDAMAGE]+=val;
  // + max. 73
  return sinfo;
}

protected mapping StdSkill_Fight_hands(object me, string sname, mapping sinfo) {
  int abil,asig,val;

  if (!sinfo) return 0;
  abil=sinfo[SI_SKILLABILITY];asig=SIG(abil);
  val=(abil*(QueryAttribute(A_STR) +
             QueryAttribute(A_DEX)*3*asig +
             100))/MAX_ABILITY;
  val=(val*QuerySkillAttribute(SA_DAMAGE))/100;
  sinfo[SI_SKILLDAMAGE]+=val;
  // + max. 180
  return sinfo;
}

protected int StdSkill_Booze(object me, string sname, mapping sinfo) {
  int abil,val;

  val=0;
  if (!sinfo || (val=sinfo[SI_SKILLARG])<=0)
    return val;
  abil=sinfo[SI_SKILLABILITY];
  val-=(val*abil)/(MAX_ABILITY+2500); // Bis zu 80% Abzug bei Alkoholikern.
  if (val<=0) val=1;
  return val;
}

