/***************************************************************************
* file: utility.c, Utility module. Part of DIKUMUD *
* Usage: Utility procedures *
* Copyright (C) 1990, 1991 - see 'license.doc' for complete information. *
* *
* Copyright (C) 1992, 1993 Michael Chastain, Michael Quan, Mitchell Tse *
* Performance optimization and bug fixes by MERC Industries. *
* You can use our stuff in any way you like whatsoever so long as this *
* copyright notice remains intact. If you like it please drop a line *
* to mec@garnet.berkeley.edu. *
* *
* This is free software and you are benefitting. We hope that you *
* share your changes too. What goes around, comes around. *
***************************************************************************/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include "structs.h"
#include "mob.h"
#include "obj.h"
#include "utils.h"
extern struct time_data time_info;
char log_buf[512];
/*
* Generates a random number.
*/
int number( int from, int to )
{
if ( from >= to )
return from;
return from + random() % (to - from + 1);
}
/*
* Simulates dice roll.
*/
int dice( int number, int size )
{
int r;
int sum = number;
for ( r = 1; r <= number; r++ )
sum += random() % size;
return sum;
}
/*
* Compare strings, case insensitive.
*/
int str_cmp( char *arg1, char *arg2 )
{
int check, i;
for ( i = 0; arg1[i] || arg2[i]; i++ )
{
check = LOWER(arg1[i]) - LOWER(arg2[i]);
if ( check < 0 )
return -1;
if ( check > 0 )
return 1;
}
return 0;
}
/*
* Duplicate a string into dynamic memory.
*/
char *str_dup( const char *str )
{
char *str_new;
CREATE( str_new, char, strlen(str) + 1 );
strcpy( str_new, str );
return str_new;
}
/* writes a string to the log */
void log( char *str )
{
long ct;
char *tmstr;
ct = time(0);
tmstr = asctime(localtime(&ct));
*(tmstr + strlen(tmstr) - 1) = '\0';
fprintf(stderr, "%s :: %s\n", tmstr, str);
}
void sprintbit( long vektor, char *names[], char *result )
{
long nr;
*result = '\0';
for ( nr=0; vektor; vektor>>=1 )
{
if ( IS_SET(1, vektor) )
{
if ( *names[nr] != '\n' )
strcat( result, names[nr] );
else
strcat( result, "Undefined" );
strcat( result, " " );
}
if ( *names[nr] != '\n' )
nr++;
}
if ( *result == '\0' )
strcat( result, "NoBits" );
}
void sprinttype( int type, char *names[], char *result )
{
int nr;
for ( nr = 0; *names[nr] != '\n'; nr++ )
;
if ( type < nr )
strcpy( result, names[type] );
else
strcpy( result, "Undefined" );
}
/* Calculate the MUD time passed over the last t2-t1 centuries (secs) */
struct time_info_data mud_time_passed(time_t t2, time_t t1)
{
long secs;
struct time_info_data now;
secs = (long) (t2 - t1);
now.hours = (secs/SECS_PER_MUD_HOUR) % 24; /* 0..23 hours */
secs -= SECS_PER_MUD_HOUR*now.hours;
now.day = (secs/SECS_PER_MUD_DAY) % 35; /* 0..34 days */
secs -= SECS_PER_MUD_DAY*now.day;
now.month = (secs/SECS_PER_MUD_MONTH) % 17; /* 0..16 months */
secs -= SECS_PER_MUD_MONTH*now.month;
now.year = (secs/SECS_PER_MUD_YEAR); /* 0..XX? years */
return now;
}
struct time_info_data age(struct char_data *ch)
{
struct time_info_data player_age;
player_age = mud_time_passed(time(0),ch->player.time.birth);
player_age.year += 17; /* All players start at 17 */
return player_age;
}