calisto-20000323/
calisto-20000323/lib/
calisto-20000323/lib/etc/
calisto-20000323/lib/players/
calisto-20000323/lib/text/
calisto-20000323/log/
/*
 Calisto (c) 1998-1999 Peter Howkins, Matthew Howkins, Simon Howkins

 $Id: structs.h,v 1.2 2000/01/12 20:32:14 peter Exp $

 $Log: structs.h,v $
 Revision 1.2  2000/01/12 20:32:14  peter
 Added CRYPT_PASSWORD_LENGTH and changed MAX_PASSWORD_LENGTH

 Revision 1.1  1999/12/21 20:37:58  peter
 Initial revision


 */
#ifndef structs_h
#define structs_h

#include <time.h>

#include "dllist.h"

#ifndef BOOL
#define BOOL
typedef int bool;
#define FALSE ((bool) 0)
#define TRUE  ((bool) 1)
#endif /* BOOL */

#define MIN_NAME_LENGTH           1
#define MAX_NAME_LENGTH          12   /* Length of chars names */
#define MIN_PASSWORD_LENGTH       3
#define MAX_PASSWORD_LENGTH       8   /* Length of chars password */
#define CRYPT_PASSWORD_LENGTH    13   /* Length from crypt() function */
#define MAX_RAW_INPUT_BUFFER    512   /* Input buffer length */
#define MAX_HOST_NAME           256   /* host name len eg. fish.dripple.com */
#define MAX_TERMTYPE_LEN         20   /* terminal type eg xterm or vt100 */
#define MAX_PROMPT_LENGTH        12
#define OUTPUT_BUFFER          1024   /* Output buffer length */
#define MAX_GROUP_NAME_LENGTH    12

#define STATE_LOGIN     0
#define STATE_PASSWORD  1
#define STATE_PLAY      2
#define STATE_CLOSING   3
#define STATE_NEW1      4      
#define STATE_NEW2      5
#define STATE_NEW3      6

typedef struct character character;
typedef struct descriptor descriptor;
typedef struct logindata logindata;

/* used when making a new char to remember some things */
struct logindata {
  char name[MAX_NAME_LENGTH+1]; /* Chars name */
  char password[CRYPT_PASSWORD_LENGTH+1];    /* Chars password */
};

struct character {
  bool loggedin;
  char name[MAX_NAME_LENGTH+1];       /* Chars name */
  char password[CRYPT_PASSWORD_LENGTH+1];    /* Chars password */
  unsigned long privs;
  char prompt[MAX_PROMPT_LENGTH+1];
  char group[MAX_GROUP_NAME_LENGTH+1];/* name of their group */
  unsigned long prevtime;             /* num of seconds, prev to this login */

  time_t logintime;                   /* time they successfully logged in */

  listnode characterlink;             /* links together all active characters */
  listnode roomlink;                  /* links together the characters in each room */
};

struct descriptor {
  int sfd;                          /* socket descriptor */
  int state;                        /* the state the socket is in (eg playing
                                       or at password) */

  char inbuf[MAX_RAW_INPUT_BUFFER]; /* the raw data from the socket */
  int inbuf_used;                   /* number of bytes used in inbuf */
  int inbuf_used_lines;             /* number of bytes used for whole lines in inbuf */
  char outbuf[OUTPUT_BUFFER];
  time_t connecttime;               /* time connection was made */
  time_t idletime;                  /* time since last information received */

  char termtype[MAX_TERMTYPE_LEN+1];
  unsigned term_width;              /* the terminals width and height */
  unsigned term_height;

  char hostname[MAX_HOST_NAME+1];     /* returned by gethostbyname */

  /* HACK - used in login process, has to be a nicer way though */
  logindata data;

  /* HACK - needed cos its tricky to find out if a socket is connected */
  bool safe;

  listnode descriptorlink;
  character player;                 /* The character using this socket */
};

#endif