wolfpaw4.0-release/area/
wolfpaw4.0-release/backup/
wolfpaw4.0-release/bin/
wolfpaw4.0-release/boards/
wolfpaw4.0-release/clans/
wolfpaw4.0-release/councils/
wolfpaw4.0-release/deity/
wolfpaw4.0-release/finger/
wolfpaw4.0-release/gods/
wolfpaw4.0-release/guilds/
wolfpaw4.0-release/lockers/
wolfpaw4.0-release/log/
wolfpaw4.0-release/log/Clean/
wolfpaw4.0-release/maps/
wolfpaw4.0-release/offline_data/
wolfpaw4.0-release/player-obj/
wolfpaw4.0-release/player-obj/a/
wolfpaw4.0-release/player/
wolfpaw4.0-release/player/a/
wolfpaw4.0-release/plog/
wolfpaw4.0-release/save-rooms/
wolfpaw4.0-release/secure/
wolfpaw4.0-release/source/
wolfpaw4.0-release/source/betasrc/system/
wolfpaw4.0-release/source/betasrc/util/
wolfpaw4.0-release/system/clean-source/
wolfpaw4.0-release/system/clean-source/grux/
/*--------------------------------------------------------------------------*
 *                         ** WolfPaw 3.0 ** 				    *
 *--------------------------------------------------------------------------*
 *               WolfPaw 3.0 (c) 1997 - 1999 by Dale Corse		    *
 *--------------------------------------------------------------------------*
 *            The WolfPaw Coding Team is headed by: Greywolf                *
 *  With the Assitance from: Callinon, Dhamon, Sentra, Wyverns, Altrag      *
 *                           Scryn, Thoric, Justice, Tricops and Brogar.    *
 *--------------------------------------------------------------------------*
 *  Based on SMAUG 1.2a. Copyright 1994 - 1996 by Derek Snider		    *
 *  SMAUG Coding Team: Thoric, Altrag, Blodkai, Narn, Haus, Scryn, Rennard, *
 *		       Swordbearer, Gorog, Grishnakh and Tricops.           *
 *--------------------------------------------------------------------------*
 *  Merc 2.1 Diku MUD Improvments (C) 1992 - 1993 by Michael Chastain,      *
 *  Michael Quan, and Michael Tse. 					    *
 *  Original Diku MUD (C) 1990 - 1991 by Sebastian Hammer, Michael Seifert, *
 *  Hans Hendrik Strfeldt, Tom Madsen, and Katja Nyboe. 		    *
 *--------------------------------------------------------------------------*
 *			Upstatted EQ Module				    *
 *--------------------------------------------------------------------------*/

#include <ctype.h>
#include <stdio.h>
#include <stdarg.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/dir.h>
#include "mud.h"

#define UPSTAT_LOG_FILE		"../system/upstatlog"

OBJ_DATA *upstat_obj( OBJ_DATA *obj, bool mend, CHAR_DATA *ch );

void init_upstat( void )
{
FILE *fp;

fp=fopen(UPSTAT_LOG_FILE,"w");
new_fclose(fp);
log_string("[UPSTAT] Initialized.");
return;
}

void upstat_log( char *string )
{
FILE *fp;

if ( (fp=fopen(UPSTAT_LOG_FILE,"a"))==NULL)
{
bug("Failed to open UPstat Log!");
perror(UPSTAT_LOG_FILE);
return;
}

fprintf(fp,string);
fprintf(fp,"\n\r");
new_fclose(fp);
return;
}

/* decide weather or not TO upstat the object */
OBJ_DATA *obj_upstat_check( OBJ_DATA *obj )
{
int rand=0;

/* Armor and Weapons only */
if ( obj->item_type != ITEM_WEAPON && obj->item_type != ITEM_ARMOR )
return obj;

rand=number_range(1,100);

if ( rand > 30 && rand < 65 )
return upstat_obj(obj,FALSE,NULL);

return obj;
}

/* actually upstat the object */
OBJ_DATA *upstat_obj( OBJ_DATA *obj, bool mend, CHAR_DATA *ch )
{
char buf[MSL];
int dam_up=0,hit_up=0,ac_down=0,mac_down=0;

/* random stats.. */
hit_up += number_range(1,10);
dam_up += number_range(1,5);
ac_down += number_range(1,20);
mac_down += number_range(1,10);

if ( !mend )
{
sprintf(buf,"UPSTAT: [%d](%d) Upped %d Damage, %d Hitroll, %d AC %d MAC",obj->pIndexData->vnum,
	obj->pIndexData->area ? obj->pIndexData->area->zone->number : 1, dam_up,hit_up,ac_down,mac_down);
log_string_plus(buf,LOG_NORMAL,LEVEL_HYPERION);
}
else
{
sprintf(buf,"MEND: [%s][%d](%d) Upped %d Damage, %d Hitroll, %d AC %d MAC",capitalize(ch->name),obj->pIndexData->vnum,
	obj->pIndexData->area ? obj->pIndexData->area->zone->number : 1, dam_up,hit_up,ac_down,mac_down);
log_string_plus(buf,LOG_NORMAL,ch->level);
}

upstat_log(buf);

/* Reset Upped */
obj->dam_bonus = 0;
obj->hit_bonus = 0;
obj->ac_bonus = 0;
obj->mac_bonus = 0;

/* Upstat it */
obj->dam_bonus += hit_up;
obj->hit_bonus += dam_up;
obj->ac_bonus += ac_down;
obj->mac_bonus += mac_down;

SET_BIT(obj->magic_flags, ITEM_UPSTATED);

return obj;
}

/* Show the objects upstatted this boot */
void do_upstatlog( CHAR_DATA *ch, char *argument )
{
show_file(ch,UPSTAT_LOG_FILE);
return;
}

/* Player command to TRY and upstat things .. between us.. the closer to at limit
 * it is, or if it is OVER limit, its gone :) --GW
 */
void do_mend( CHAR_DATA *ch, char *argument )
{
int rand=0;
char arg[MIL];
LIMIT_DATA *limit;
OBJ_DATA *obj;
char logbuf[MSL];

one_argument(argument,arg);

if ( ch->race != RACE_HUMAN )
{
  send_to_char("Only Humans possess the means to use this.\n\r",ch);
  return;
}

if ( !(obj=get_obj_carry(ch,arg)) )
{
  send_to_char("You cannot find that.\n\r",ch);
  return;
}

separate_obj(obj);

if ( ms_find_obj(ch) )
        return;

if ( IS_SET(obj->magic_flags, ITEM_UPSTATED ) )
{
  send_to_char("That Item is already of a high quality!\n\r",ch);
  return;
}

/* Not limited - 25% chance of Upping, 15% chance of Destroying */ 
if (!IS_LIMITED(obj))
{
rand=number_range(1,100);
if ( IS_IMP(ch) || rand <= 25 ) /* Upstat */
{
  send_to_char("You gasp as you look down apon the MASTERPIECE you have Created!\n\r",ch);
  obj=upstat_obj(obj,TRUE,ch);
  return;
}
else if ( rand >= 85 ) /* Destroy */
{
  send_to_char("You totally bungle your attempt to mend, and the object is DESTROYED!\n\r",ch);
  sprintf(logbuf,"MEND: %s DESTROYED %s",capitalize(ch->name),obj->short_descr);
  log_string_plus(logbuf,LOG_NORMAL,ch->level);
  obj_from_char(obj);
  extract_obj(obj);
}
else /* Fail */
{
  send_to_char("You fail to mend.\n\r",ch);
  return;
}

}

/* Limited
 * Overlimit - 5% chance of Upstat, 75% chance of Destruction
 * At limit - 10% chance of Upstat, 25% chance of Destruction
 * Below Limit - 15% chance of Upstat, 15% chance of Destruction
 */
if ( IS_LIMITED(obj) )
{
  limit=limit_lookup(obj->pIndexData->area->zone->number,obj->pIndexData->vnum);
  /* Overlimit */
  if ( limit->loaded > limit->limit )
  {
    rand=number_range(1,100);

    if ( IS_IMP(ch) || rand <= 5 ) /* Upstat */
    {
     send_to_char("You gasp as you look down apon the MASTERPIECE you have Created!\n\r",ch);
     obj=upstat_obj(obj,TRUE,ch);
     return;
    }
    else if ( rand >= 25 ) /* Destroy */
    {
     send_to_char("You totally bungle your attempt to mend, and the object is DESTROYED!\n\r",ch);
     sprintf(logbuf,"MEND: %s DESTROYED %s",capitalize(ch->name),obj->short_descr);
     log_string_plus(logbuf,LOG_NORMAL,ch->level);
     obj_from_char(obj);
     extract_obj(obj);
    }
    else /* Fail */
    {
      send_to_char("You fail to mend.\n\r",ch);
      return;
    }
  }

  /* At Limit */
  if ( limit->loaded == limit->limit )
  {
    rand=number_range(1,100);

    if ( IS_IMP(ch) || rand <= 10 ) /* Upstat */
    {
     send_to_char("You gasp as you look down apon the MASTERPIECE you have Created!\n\r",ch);
     obj=upstat_obj(obj,TRUE,ch);
     return;
    }
    else if ( rand >= 75 ) /* Destroy */
    {
     send_to_char("You totally bungle your attempt to mend, and the object is DESTROYED!\n\r",ch);
     sprintf(logbuf,"MEND: %s DESTROYED %s",capitalize(ch->name),obj->short_descr);
     log_string_plus(logbuf,LOG_NORMAL,ch->level);
     obj_from_char(obj);
     extract_obj(obj);
    }
    else /* Fail */
    {
      send_to_char("You fail to mend.\n\r",ch);
      return;
    }
  }

  /* Below Limit */
  if ( limit->loaded < limit->limit )
  {
    rand=number_range(1,100);

    if ( IS_IMP(ch) || rand <= 15 ) /* Upstat */
    {
     send_to_char("You gasp as you look down apon the MASTERPIECE you have Created!\n\r",ch);
     obj=upstat_obj(obj,TRUE,ch);
     return;
    }
    else if ( rand >= 85 ) /* Destroy */
    {
     send_to_char("You totally bungle your attempt to mend, and the object is DESTROYED!\n\r",ch);
     sprintf(logbuf,"MEND: %s DESTROYED %s",capitalize(ch->name),obj->short_descr);
     log_string_plus(logbuf,LOG_NORMAL,ch->level);
     obj_from_char(obj);
     extract_obj(obj);
    }
    else /* Fail */
    {
      send_to_char("You fail to mend.\n\r",ch);
      return;
    }
  }
}

return;
}