/
SilentMists/class/
SilentMists/gods/
SilentMists/player/
#if defined(macintosh)
#include <types.h>
#else
#include <sys/types.h>
#include <sys/time.h>
#endif

#include <ctype.h>
#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
#include <stdarg.h>

#include "merc.h"
#include "recycle.h"

char *nsprintf(char *fr, char *fmt, ...)
{
        char buf[2*MSL];
        va_list args;
 
        va_start(args, fmt);
        vsprintf(buf, fmt, args);
        va_end(args);
        
        free_string(fr);
        return str_dup(buf);
}

void printf_to_world(char *fmt, ...)
{
 char buf[2*MSL];
 va_list args;
 DESCRIPTOR_DATA *d;
 
 va_start(args, fmt);
 vsprintf(buf, fmt, args);
 va_end(args);
 
 for(d=descriptor_list;d;d=d->next)
 {
  if(d->character==NULL)
   continue;
  send_to_char(buf, d->character);
 }
 return;
}

void printf_to_room(ROOM_INDEX_DATA *rm, char *fmt, ...)
{
 char buf[2*MSL];
 va_list args;
 CHAR_DATA *ch;
 
 va_start(args,fmt);
 vsprintf(buf,fmt,args);
 va_end(args);
 for(ch=rm->people;ch;ch=ch->next_in_room)
  send_to_char(buf, ch);
 return;
}

EVENT_DATA *create_event(int delay, char *act)
{
        EVENT_DATA *ev;
        
        if(!str_cmp(act, "print"))
        {
                ev=new_event();
                ev->action=ACTION_PRINT;
        } else if(!str_cmp(act, "wait"))
        {
                ev=new_event();
                ev->action=ACTION_WAIT;
        } else if(!str_cmp(act, "act"))
        {
                ev=new_event();
                ev->action=ACTION_ACT;
        } else if(!str_cmp(act, "function"))
        {       ev=new_event();
                ev->action=ACTION_FUNCTION;
        }
        else { /* Bad Action */
                return NULL;
        }
        ev->delay= delay;
        ev->next = events;
        events   = ev;
        return ev;
}

void wait_act(int delay, char *msg, void *a1, void *a2, void *a3, int type)
{
        EVENT_DATA *ev=create_event(delay, "act");
        ev->args[0]=str_dup(msg);
        ev->argv[0]=a1;
        ev->argv[1]=a2;
        ev->argv[2]=a3;
        ev->argi[0]=type;
        return;
}

void wait_printf(CHAR_DATA *ch, int delay, char * fmt, ...)
{
        char buf[2*MSL];
        va_list args;
        EVENT_DATA *ev = create_event(delay, "print");
 
        va_start(args, fmt);
        vsprintf(buf, fmt, args);
        va_end(args);
        
        ev->args[0] = str_dup(buf);
        ev->argv[0] = ch;
        return;
}

/* after the delay has been met..it will freeze
 * the targeted victim for the set amount of 'dur'ation
 * ex:  wait_wait(ch,2,5); would:
 * cause player who triggered this call to be frozen
 * for 5 seconds after 2 seconds of function call
 */
void wait_wait(CHAR_DATA *ch, int delay, int dur)
{
        EVENT_DATA *ev = create_event(delay,"wait");
        
        ev->argv[0]=ch;
        ev->argi[0]=dur;
}

void wait_function (CHAR_DATA *ch, int delay, DO_FUN *do_fun, char *argument)
{
   EVENT_DATA *ev = create_event(delay,"function");
   
   ev->argv[0] = ch;
   ev->do_fun  = do_fun;
   ev->args[0] = str_dup( argument );
   return;
}