#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "struct.h"
#include "sysconfig.h"
extern PACKET *Get_Packet();
USER UserArray[MAXU];
extern char GameName[];
Bind_To_Server()
{
printf("Game compiled and booted\n");
return(packet_init());
}
/*
* Respond to messages
*/
#ifdef NET
void Exec_Packet_Response()
{
PACKET *p=Get_Packet();
if(!p)
return;
switch(p->pk_Code)
{
case PK_DISC:Disconnect(p);break;
case PK_CONN:Connect(p);break;
case PK_TXLN:Command(p);break;
case PK_SRVD:exit(0);break; /* Server going splat */
default:printf("Unhandled packet received (%d).\n",
p->pk_Code);
}
}
#endif
/*
* Mark user to be killed off
*/
void KillConnection(u)
tag u;
{
UserArray[OBJ(u)].us_State=US_IDLE;
}
/*
* handle a connection
*/
#ifdef NET
void Connect(p)
PACKET *p;
{
/*
* Entry: uid in pk_Data pk_Handle holds system handle of user
*/
int ct=0;
while(ct<MAXU)
{
if(UserArray[ct].us_State==US_IDLE)
{
goto gotslot;
}
ct++;
}
WriteToHandle(p->pk_Handle,PK_TXLN,"Sorry the game is currently full.\n");
WriteToHandle(p->pk_Handle,PK_DISC,NULL);
return;
gotslot:if(ReadUptime()>SYS_MAXUPTIME)
{
WriteToHandle(p->pk_Handle,PK_TXLN,"Sorry the machine is too busy.\n");
WriteToHandle(p->pk_Handle,PK_DISC,NULL);
return;
}
#endif
#ifndef NET
/*
* Main connection driver
*/
void Do_Connection(ct)
int ct;
{
PACKET a;
PACKET *p = &a;
p->pk_Handle=ct;
#endif
UserArray[ct].us_State=US_GNAM;
UserArray[ct].us_Handle=p->pk_Handle;
{
char block[128];
FILE *f=fopen("MOTD.TXT","r");
if(f)
{
while(fgets(block,127,f))
{
block[strlen(block)-1]=0;
WriteToHandle(p->pk_Handle,PK_TXLN,block);
}
fclose(f);
}
else
WriteToHandle(p->pk_Handle,PK_TXLN,"Welcome to MAGIC\n\n");
}
WriteToHandle(p->pk_Handle,PK_DISA,NULL);
WriteToHandle(p->pk_Handle,PK_PRMP,"Name: ");
WriteToHandle(p->pk_Handle,PK_ENAB,0);
}
#ifdef NET
void Disconnect(p)
PACKET *p;
{
int n=WhichUser(p->pk_Handle);
if(n==-1)
{
fprintf(stderr,"***WARNING: Anomalous Disconnect packet ignored.\n");
return;
}
/*
* For the moment
*/
#ifndef TELNET
WriteToHandle(p->pk_Handle,PK_PRMP,"chat> ");
#endif
#else
void Do_Disconnect(n)
tag n;
{
#endif
Exit_Player(ISOBJ(n));
UserArray[VAL(n)].us_State=US_IDLE;
}
/*
* Process a command
*/
#ifdef NET
void Command(p)
PACKET *p;
{
int n=WhichUser(p->pk_Handle);
if(n==-1)
{
printf("***WARNING: Anomalous Command packet ignored.\n");
return;
}
#else
void Do_Net_Driver(n,t)
tag n;
char *t;
{
PACKET pp;
PACKET *p= &pp;
/* printf("RECEIVED '%s' from %d.\n",t,n);*//*D BUG*/
strcpy(p->pk_Text,t);
p->pk_Handle=n;
#endif
n=VAL(n);
switch(UserArray[VAL(n)].us_State)
{
case US_CMD:DoCommand(n,p);break;
case US_GNAM:Create_Player(n,p);break;
case US_GEPW:Check_PW(n,p);break;
case US_SEPW:GetPW_1(n,p);break;
case US_VEPW:GetPW_2(n,p);break;
case US_CPWC:ChPW_1(n,p);break;
case US_CPWN:ChPW_2(n,p);break;
case US_CPWV:ChPW_3(n,p);break;
default:printf("***WARNING: User in unknown state, packet discarded.\n");
}
}
/*
* Perform a login
*/
void Create_Player(n,p)
tag n;
PACKET *p;
{
extern char *Is_Legal_Name();
char *x=Is_Legal_Name(p->pk_Text,ISOBJ(n));
if(x)
{
WriteToHandle(p->pk_Handle,PK_TXLN,x);
WriteToHandle(p->pk_Handle,PK_ENAB,NULL);
return;
}
SetName(ISOBJ(n),p->pk_Text);
ADJ(ISOBJ(n))= -1;
NOUN(ISOBJ(n))=28000+n;
WriteToHandle(p->pk_Handle,PK_NECH,NULL);
if(LoadUser(ISOBJ(n),p->pk_Text))
{
LOC(ISOBJ(n))= ISOBJ(-1);
SETVIS(ISOBJ(n),ISNUM(32767));
OBJECT(n)->ob_Child= -1;
OBJECT(n)->ob_Next= -1;
UserArray[n].us_State=US_GEPW;
WriteToHandle(p->pk_Handle,PK_PRMP,"This persona exists, what is its password: ");
WriteToHandle(p->pk_Handle,PK_ENAB,NULL);
return;
}
UserArray[n].us_State=US_SEPW;
WriteToHandle(p->pk_Handle,PK_PRMP,"Give me a password for this persona (DO NOT USE ANY MACHINE PASSWORDS): ");
WriteToHandle(p->pk_Handle,PK_ENAB,NULL);
OBJECT(n)->ob_Child= -1;
OBJECT(n)->ob_Next= -1;
LOC(ISOBJ(n))=ISNUM(-1);
SETVIS(ISOBJ(n),ISNUM(32767));
}
int Check_PW(n,p)
tag n;
PACKET *p;
{
extern struct Word *FindNumWord();
if(CryptX(p->pk_Text)!=PLAYER(ISOBJ(n))->pl_PwKey)
{
struct Word *wd;
WriteToHandle(p->pk_Handle,PK_TXLN,"Incorrect.");
WriteToHandle(p->pk_Handle,PK_ECHO,NULL);
WriteToHandle(p->pk_Handle,PK_PRMP,"Name: ");
WriteToHandle(p->pk_Handle,PK_ENAB,NULL);
wd=FindNumWord(28000+n,3);
if(wd)
DelWord(wd);
UserArray[VAL(n)].us_State=US_GNAM;
return(0);
}
SysFlags[0]=ISOBJ(n);
WriteToHandle(p->pk_Handle,PK_PRMP,">>>");
UserArray[VAL(n)].us_State=US_CMD;
WriteToHandle(p->pk_Handle,PK_ECHO,NULL);
ExecTable(5);
WriteToHandle(p->pk_Handle,PK_ENAB,NULL);
return(1);
}
void GetPW_1(n,p)
tag n;
PACKET *p;
{
PLAYER(ISOBJ(n))->pl_PwKey=CryptX(p->pk_Text);
WriteToHandle(p->pk_Handle,PK_PRMP,"Again to make sure: ");
WriteToHandle(p->pk_Handle,PK_ENAB,NULL);
UserArray[VAL(n)].us_State=US_VEPW;
}
void ChPW_2(n,p)
tag n;
PACKET *p;
{
PLAYER(ISOBJ(n))->pl_PwKey=CryptX(p->pk_Text);
WriteToHandle(p->pk_Handle,PK_PRMP,"Again to make sure: ");
WriteToHandle(p->pk_Handle,PK_ENAB,NULL);
UserArray[VAL(n)].us_State=US_CPWV;
}
void ChPW_1(n,p)
tag n;
PACKET *p;
{
if(CryptX(p->pk_Text)!=PLAYER(ISOBJ(n))->pl_PwKey)
{
WriteToHandle(p->pk_Handle,PK_TXLN,"Sorry..");
UserArray[VAL(n)].us_State=US_CMD;
WriteToHandle(p->pk_Handle,PK_PRMP,">>>");
WriteToHandle(p->pk_Handle,PK_ECHO,NULL);
WriteToHandle(p->pk_Handle,PK_ENAB,NULL);
ExecTable(1);
return;
}
WriteToHandle(p->pk_Handle,PK_PRMP,"New Password: ");
WriteToHandle(p->pk_Handle,PK_ENAB,NULL);
UserArray[VAL(n)].us_State=US_CPWN;
}
void GetPW_2(n,p)
tag n;
PACKET *p;
{
if(CryptX(p->pk_Text)!=PLAYER(ISOBJ(n))->pl_PwKey)
{
WriteToHandle(p->pk_Handle,PK_TXLN,"Incorrect - try again.\n");
UserArray[VAL(n)].us_State=US_SEPW;
WriteToHandle(p->pk_Handle,PK_PRMP,"Give me a password for this persona: ");
WriteToHandle(p->pk_Handle,PK_ENAB,NULL);
return;
}
SysFlags[0]=ISOBJ(n);
WriteToHandle(p->pk_Handle,PK_PRMP,">>>");
UserArray[VAL(n)].us_State=US_CMD;
WriteToHandle(p->pk_Handle,PK_ECHO,NULL);
ExecTable(4);
WriteToHandle(p->pk_Handle,PK_ENAB,NULL);
}
void ChPW_3(n,p)
tag n;
PACKET *p;
{
if(CryptX(p->pk_Text)!=PLAYER(ISOBJ(n))->pl_PwKey)
{
WriteToHandle(p->pk_Handle,PK_TXLN,"Incorrect - try again.\n");
UserArray[VAL(n)].us_State=US_CPWN;
WriteToHandle(p->pk_Handle,PK_PRMP,"Give me a password for this persona: ");
WriteToHandle(p->pk_Handle,PK_ENAB,NULL);
return;
}
WriteToHandle(p->pk_Handle,PK_PRMP,">>>");
UserArray[VAL(n)].us_State=US_CMD;
WriteToHandle(p->pk_Handle,PK_ECHO,NULL);
WriteToHandle(p->pk_Handle,PK_ENAB,NULL);
ExecTable(1);
}
void DoCommand(n,p)
tag n;
PACKET *p;
{
SysFlags[0]=ISOBJ(n);
ReportInput(p->pk_Text,ISOBJ(n));
if(Parser(p->pk_Text))
{
WhatThings();
ExecTable(0);
}
if(UserArray[VAL(n)].us_State!=US_IDLE) /* If not dead */
{
ExecTable(1);
WriteToHandle(p->pk_Handle,PK_ENAB,0);
}
}
/*
* Called every second
*/
void Exec_Time_Event()
{
ExecTable(6);
}
WhichUser(n)
tag n;
{
int ct=0;
while(ct<MAXU)
{
if(UserArray[ct].us_State!=US_IDLE&&
UserArray[ct].us_Handle==VAL(n))
return(ct);
ct++;
}
return(-1);
}