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


#ifndef WINDOWS
#include <sys/times.h>
#include <sys/types.h>
#include <sys/resource.h>
#endif  


long mytime(void) {
#ifndef WINDOWS
     struct rusage resources;
     int who = RUSAGE_SELF;   

     int ierr;   

     long utime;   
     long stime;   

     ierr = getrusage (who, &resources);

/* -------------------------------------- */
/* In case of error, return garbage value */
/* -------------------------------------- */

     if (ierr != 0) 
      {
         utime = -1.0;
         stime = -1.0;
         return (utime + stime);
      }

/* ------------------------------------------------ */
/* Otherwise, unpack structure for return of values */
/* ------------------------------------------------ */

     utime = (resources.ru_utime.tv_sec*1000000) +
       resources.ru_utime.tv_usec;

     stime = (resources.ru_stime.tv_sec*1000000) +
       resources.ru_stime.tv_usec;

      return (utime + stime);
#else
return 0;
#endif

}

long info_mem(int i) 
{ /* 1 = shared, 2 = unshared data, 3 = stack */
#ifndef WINDOWS
  struct rusage resources;
  int who = RUSAGE_SELF;   
  int ierr;
  ierr = getrusage (who, &resources);
  fprintf(stderr,"%ld %ld %ld\n",resources.ru_ixrss,resources.ru_idrss,
	  resources.ru_isrss);
  if (i==1) return resources.ru_ixrss;
  if (i==2) return resources.ru_idrss;
  if (i==3) return resources.ru_isrss; 
  else 
#endif
    return 0;
}

#define GENERIC 0
#define ARMS 1
#define HEAD 2
#define BODY 3
#define LEGS 4

int tx,ty;
CHAR_DATA *c;


void NEW_POSITION(CHAR_DATA *ch,int nw) 
{
  ch->position=nw;
  return;
}



void SUBHIT(CHAR_DATA *ch,int i)
{
  if (!ch || ch->data_type==50) 
    {
      return;
    }
ch->hit-=i;
return;
}

void SUBMOVE(CHAR_DATA *ch,int i) 
{
  if (!ch || ch->data_type==50) 
    {
      fprintf(stderr,"NULL character or free'd character in SUBMOVE.\n");
      return;
    }
  ch->move-=i;
  
  return;
}

void ADDHIT(CHAR_DATA *ch,int i) 
{
ch->hit+=i;
return;
}

void ADDMOVE(CHAR_DATA *ch,int i) 
{
  if (!ch) return;
  ch->move+=i;
  
  return;
}

void MAXHIT(CHAR_DATA *ch) 
{
  ch->hit=ch->max_hit;
  
  return;
}

void MAXMOVE(CHAR_DATA *ch) {
  ch->move=ch->max_move;
  
  return;
}



void
read_damages (void)
{
  FILE *df;
  char buf[1000];
  int lastmark= 0;
  bzero (&dmsg, sizeof (dmsg));
  if ((df = fopen ("dam.dat", "r")) == NULL)
    {

      damt.kick_dam = str_dup ("o+2d/4m40+k/2");
      write_damages ();
    }
  for (;;)
    {
      strcpy (buf, fread_word (df));
      if (!str_cmp (buf, "END"))
	break;
      if (!str_cmp (buf, "Kickd"))
	damt.kick_dam = str_dup (fread_word (df));
      if (!str_prefix ("#", buf))
	{
	  fread_to_eol (df);
	  continue;
	}
      if (!str_cmp (buf, "GENERIC"))
	{
	  dmsg.generic_range[lastmark][0] = fread_number (df);
	  dmsg.generic_range[lastmark][1] = fread_number (df);
	  dmsg.generic_percent[lastmark][0] = fread_number (df);
	  dmsg.generic_percent[lastmark][1] = fread_number (df);
	  fread_to_eol (df);
	  dmsg.gen_m[lastmark] = fread_string_eol (df);
	  dmsg.gen_m1[lastmark] = fread_string_eol (df);
	  dmsg.gen_m2[lastmark]= fread_string_eol (df);
	  lastmark++;
	}
    }
  fclose (df);
  return;
}

char *
star_a (int dam, int maxhit)
{
  static char rs[100];
  int percent = (dam * 100) / maxhit;
  rs[0] = '\0';
  if (percent < 1)
    strcpy (rs, "barely scratches");
  else if (percent < 2)
    strcpy (rs, "lightly scratches");
  else if (percent < 3)
    strcpy (rs, "scratches");
  else if (percent < 5)
    strcpy (rs, "mildly wounds");
  else if (percent < 8)
    strcpy (rs, "wounds");
  else if (percent < 11)
    strcpy (rs, "badly wounds");
  else if (percent < 15)
    strcpy (rs, "causes major injury to");
  else if (percent < 20)
    strcpy (rs, "mangles");
  else if (percent < 35)
    strcpy (rs, "devastates");
  else if (percent < 70)
    strcpy (rs, "PULVERIZES");
  else
    strcpy (rs, "OBLITERATES");
  return rs;
}

char *
star_b (int dam, int maxhit)
{
  static char rst[100];
  int percent = (dam * 100) / maxhit;
  rst[0] = '\0';
  if (percent < 1)
    strcpy (rst, "barely scratching");
  else if (percent < 2)
    strcpy (rst, "lightly scratching");
  else if (percent < 3)
    strcpy (rst, "scratching");
  else if (percent < 5)
    strcpy (rst, "mildly wounding");
  else if (percent < 8)
    strcpy (rst, "wounding");
  else if (percent < 11)
    strcpy (rst, "badly wounding");
  else if (percent < 15)
    strcpy (rst, "causing major injury to");
  else if (percent < 20)
    strcpy (rst, "mangling");
  else if (percent < 35)
    strcpy (rst, "devastating");
  else if (percent < 70)
    strcpy (rst, "PULVERIZING");
  else
    strcpy (rst, "OBLITERATING");
  return rst;
}


void
display_dam_stuff (CHAR_DATA * ch)
{
  char buff[500];
  sprintf (buff, "Kick_dam....: %s --> %ld %ld %ld %ld\n", damt.kick_dam,
	   translate (damt.kick_dam,
		      LEVEL (ch), ch),
	   translate (damt.kick_dam,
		      LEVEL (ch), ch),
	   translate (damt.kick_dam,
		      LEVEL (ch), ch),
	   translate (damt.kick_dam,
		      LEVEL (ch), ch));
  send_to_char (buff, ch);
  return;
}

void
do_dam (CHAR_DATA * ch, char *argy)
{
  DEFINE_COMMAND ("damage", do_dam, POSITION_DEAD, MAX_LEVEL, LOG_NORMAL, "Checks kick damage.")
    display_dam_stuff (ch);
  return;
}