/*********************************************************************/
/* file: misc.c - misc commands                                      */
/*                             TINTIN III                            */
/*          (T)he K(I)cki(N) (T)ickin D(I)kumud Clie(N)t             */
/*                     coded by peter unold 1992                     */
/*********************************************************************/
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include "tintin.h"

/* externs */
extern struct session *sessionlist;
extern char tintin_char;
extern int echo;
extern int ignore;
extern int speedwalk;

/********************/
/* the #all command */
/********************/
struct session *all_command(char *arg, struct session *ses)
{
  struct session *sesptr;

  if(sessionlist) {
    get_arg_with_spaces(arg, arg);
    for(sesptr=sessionlist; sesptr; sesptr=sesptr->next)
      parse_input(arg, sesptr);
  }
  else
    tintin_puts("BUT THERE ISN'T ANY SESSION AT ALL!", ses);
  return ses;
}


/*********************/
/* the #bell command */
/*********************/
void bell_command(struct session *ses)
{
  putchar('\a');
  fflush(stdout);
}


/*********************/
/* the #boss command */
/*********************/
void boss_command(struct session *ses)
{
  int i;
  for(i=0; i<50; i++)
    printf("in-order traverse of tree starting from node %d resulted in %d red nodes\n", i, 50-i);

  getchar(); /* stop screen from scrolling stuff */
}

/*********************/
/* the #char command */
/*********************/
void char_command(char *arg, struct session *ses)
{
  get_arg_stop_spaces(arg, arg);
  if(ispunct(*arg)) {
    tintin_char=*arg;
    tintin_puts("#OK. GOT NEW TINTIN-CHAR.", ses);
  }
  else
    tintin_puts("#SPECIFY A PROPER TINTIN-CHAR! SOMETHING LIKE # OR /!", ses);
}


/*********************/
/* the #echo command */
/*********************/
void echo_command(struct session *ses)
{
  echo=!echo;
  if(echo)
    tintin_puts("#ECHO IS NOW ON.", ses);
  else
    tintin_puts("#ECHO IS NOW OFF.", ses);
}

/*********************/
/* the #end command */
/*********************/
void end_command(char *command, struct session *ses)
{
  if(strcmp(command, "end"))
    tintin_puts("#YOU HAVE TO WRITE #end - NO LESS, TO END!", ses);
  else {
    struct session *sesptr;
    for(sesptr=sessionlist; sesptr; sesptr=sesptr->next) 
      cleanup_session(sesptr);
      puts("\n\rTINTIN suffers from bloodlack, and the lack of a beating heart...");
      puts("TINTIN is dead! R.I.P.");
      puts("Your blood freezes as you hear TINTIN's death cry.");
      exit(0);
  }
}

/***********************/
/* the #ignore command */
/***********************/
void ignore_command(struct session *ses)
{
  ignore=!ignore;
  if(ignore)
    tintin_puts("#ACTIONS ARE IGNORED FROM NOW ON.", ses);
  else
    tintin_puts("#ACTIONS ARE NO LONGER IGNORED.", ses);
}

/**********************/
/* the #snoop command */
/**********************/
void snoop_command(char *arg, struct session *ses)
{
  char buf[100];
  struct session *sesptr=ses;

  if(ses) {
    get_arg_stop_spaces(arg, arg);
    if(*arg) {
      for(sesptr=sessionlist; sesptr && strcmp(sesptr->name, arg); sesptr=sesptr->next);
      if(!sesptr) {
        tintin_puts("#NO SESSION WITH THAT NAME!", ses);
        return;
      }
    }
    if(sesptr->snoopstatus) {
      sesptr->snoopstatus=FALSE;
      sprintf(buf, "#UNSNOOPING SESSION '%s'", sesptr->name);
      tintin_puts(buf, ses);
    }
    else {
      sesptr->snoopstatus=TRUE;
      sprintf(buf, "#SNOOPING SESSION '%s'", sesptr->name);
      tintin_puts(buf, ses);
    }
  }
  else
    tintin_puts("#NO SESSION ACTIVE => NO SNOOPING", ses);
}

/**************************/
/* the #speedwalk command */
/**************************/
void speedwalk_command(struct session *ses)
{
  speedwalk=!speedwalk;
  if(speedwalk)
    tintin_puts("#SPEEDWALK IS NOW ON.", ses);
  else
    tintin_puts("#SPEEDWALK IS NOW OFF.", ses);
}

/***********************/
/* the #system command */
/***********************/
void system_command(char *arg, struct session *ses)
{
  get_arg_with_spaces(arg, arg);
  if(*arg) {
    tintin_puts("#OK EXECUTING SHELL COMMAND.", ses);
    system(arg);
    tintin_puts("#OK COMMAND EXECUTED.", ses);
  }
  else
    tintin_puts("#EXECUTE WHAT COMMAND?", ses);
}


/********************/
/* the #zap command */
/********************/
struct session *zap_command(struct session *ses)
{
  tintin_puts("#ZZZZZZZAAAAAAAAPPPP!!!!!!!!! LET'S GET OUTTA HERE!!!!!!!!", ses);
  if(ses) {  
    cleanup_session(ses);
    return newactive_session();
  }
  else
    exit(0);
}




/************************/
/* the #wizlist command */
/************************/
void wizlist_command(struct session *ses)
{
  puts("\n==========================================================================");
  puts("The following people have achieved immortality and superior powers in this");
  puts("realm. They should be treated with respect, and occasional prayers are");
  puts("advisable. Stealing from these people is punishable by death.");
  puts("The Utmost Scum people should be killed at sight.");
  puts("==========================================================================");
  puts("                           Implementor:");
  puts("                              Snowy");
  puts("\n                        Wiiiiiiiiiiild ones:");
  puts("                         Jaz Jstlook Vivace");
  puts("\n                          TINTIN testers:");
  puts("  AWK DaShadow Emp Gilthan Gizmo Guru Gutz Kafka Lunitil Luke Memo"); 
  puts("                Silvia Sphinx Spit Switchblade Ubik Zendar");
  puts("\n                            Utmost Scum:");
  puts("                         Ali Destiny Impaler");
  prompt(ses);
}

/*********************/
/* the #help command */
/*********************/
void help_command(struct session *ses)
{
  puts("#LIST OF TINTIN-COMMANDS:");
  printf("%caction [TEXT [TEXT]]       : LIST/DISPLAY/DEFINE ACTIONS\n", tintin_char);
  printf("%calias  [TEXT [TEXT]]       : LIST/DISPLAY/DEFINE ALIASES\n", tintin_char);
  printf("%call COMMAND                : SEND COMMAND TO ALL SESSIONS\n", tintin_char);
  printf("%cbell                       : RING BELL\n", tintin_char);
  printf("%cboss                       : FILL SCREEN WITH SERIOUS STUFF\n", tintin_char);
  printf("%cchar                       : CHANGE THE TINTIN-CHAR\n", tintin_char);
  printf("%cecho                       : TURN ACTION ECHOING ON/OFF\n", tintin_char);
  printf("%cend                        : CUT ALL CONNECTIONS AND END TINTIN\n", tintin_char);
  printf("%chelp                       : THIS TEXT\n", tintin_char);
  printf("%chistory                    : SHOW COMMANDS IN HISTORY\n", tintin_char);
  printf("%cignore                     : TURN ACTION IGNORING ON/OFF\n", tintin_char);
  printf("%clog [FILENAME]             : TURN LOGGING TO 'FILENAME' ON/OFF\n", tintin_char);
  printf("%cNUMBER COMMAND             : REPEAT 'COMMAND' NUMBER TIMES\n", tintin_char);
  printf("%cmark                       : MARK BEGINNING OF A NEW PATH\n", tintin_char);
  printf("%cpath                       : SHOW THE PATH WALKED UNTIL NOW\n", tintin_char);
  printf("%creturn                     : GO ONE MOVE BACK ON THE PATH\n", tintin_char);
  printf("%cread FILENAME              : READ A COMMANDFILE AND EXECUTE IT\n", tintin_char);
  printf("%csession [NAME [MUDADDRESS]]: LIST/DISPLAY/DEFINE SESSIONS\n", tintin_char);
  printf("%cNAME COMMAND               : SEND 'COMMAND' TO SESSION 'NAME'\n", tintin_char);
  printf("%csnoop [SESSIONNAME]        : SNOOP/UNSNOOP A SESSION\n", tintin_char);
  printf("%cspeedwalk                  : TURN SPEEDWALKING ON/OFF\n", tintin_char);
  printf("%csubstitute [TEXT [TEXT]]   : LIST/DISPLAY/DEFINE SUBS\n", tintin_char);
  printf("%csystem SHELL-COMMAND       : EXECUTE SHELL COMMAND\n", tintin_char);
  printf("%ctick                       : DISPLAY #SECONDS TO NEXT TICK\n", tintin_char);
  printf("%ctickon/tickoff             : TURN TICK WARNINGS ON/OFF\n", tintin_char);
  printf("%cticksize NUMBER            : SET THE LENGTH OF A TICK\n", tintin_char);
  printf("%cunalias/unaction/unsubs    : DELETE ACTIONS/ALIASES/SUBS\n", tintin_char);
  printf("%cunpath                     : REMOVE LAST MOVE ON PATH\n", tintin_char);
  printf("%cwizlist                    : LEARN THIS LIST BY HEART!\n", tintin_char);
  printf("%cwrite FILENAME             : WRITE ALL KNOWN TO A SESSION\n", tintin_char);
  printf("%cwritesession FILENAME      : WRITE ALL SPECIAL TO A SESSION\n", tintin_char);
  printf("%czap                        : CUT CONNECTION TO CURRENT SESSION\n", tintin_char);
  prompt(ses);
}