/*****************************************************************************
* *
* Project : Diku-Mud-World-Creator *
* *
* Program : Diku-Mud-Style Command-Line Interface *
* Version : 1.0 *
* Last changed on: 27.7.93 *
* *
* Code by: Georg Essl (essl@fstgds06.tu-graz.ac.at) *
* *
*****************************************************************************/
/*** INCLUDES ***/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include "medit.h"
#include "iedit.h"
#include "redit.h"
#include "zedit.h"
#include "dikusim.h"
#include "dutil.h"
/*** DEFINES ***/
#define DC_HELPFILE "dikucli.hlp"
#define DC_CONFFILE "iconfig.def"
#define DC_PROMPT "> "
#define DC_MAXSTRLEN 255
#define DC_CONFVARS 11
#define DC_NR_ACMDS 0
#define DC_NR_BCMDS 0
#define DC_NR_CCMDS 3
#define DC_NR_DCMDS 2
#define DC_NR_ECMDS 2
#define DC_NR_FCMDS 0
#define DC_NR_GCMDS 2
#define DC_NR_HCMDS 1
#define DC_NR_ICMDS 7
#define DC_NR_JCMDS 0
#define DC_NR_KCMDS 0
#define DC_NR_LCMDS 2
#define DC_NR_MCMDS 7
#define DC_NR_NCMDS 1
#define DC_NR_OCMDS 0
#define DC_NR_PCMDS 2
#define DC_NR_QCMDS 1
#define DC_NR_RCMDS 7
#define DC_NR_SCMDS 1
#define DC_NR_TCMDS 0
#define DC_NR_UCMDS 1
#define DC_NR_VCMDS 1
#define DC_NR_WCMDS 2
#define DC_NR_XCMDS 0
#define DC_NR_YCMDS 0
#define DC_NR_ZCMDS 7
#define DIR_NORTH 0
#define DIR_EAST 1
#define DIR_SOUTH 2
#define DIR_WEST 3
#define DIR_UP 4
#define DIR_DOWN 5
/*** STRUCTS ***/
#if !defined(__osf__) && !defined(m88k) && !defined(__386BSD__)
typedef struct command
#else
struct command
#endif
{
char *cmd;
char *help;
void (*funct)(char *);
};
#if !defined(__osf__) && !defined(m88k) && !defined(__386BSD__)
typedef struct hashentry
#else
struct hashentry
#endif
{
int nr;
struct command *cmds;
};
/*** PROTOTYPES ***/
void dc_NotFound(void);
/* FOR CONFIG FUNCTIONS */
void dc_CMudName(char *);
void dc_CItemFile(char *);
void dc_CIETempF(char *);
void dc_CMobileFile(char *);
void dc_CMETempF(char *);
void dc_CRoomFile(char *);
void dc_CRETempF(char *);
void dc_CZoneFile(char *);
void dc_CZETempF(char *);
void dc_CDataBPath(char *);
void dc_CAffBitVector(char *);
/* FOR CMD FUNCTIONS */
void dc_commands(char *);
void dc_credits(char *);
void dc_down(char *);
void dc_doorstate(char *);
void dc_east(char *);
void dc_exits(char *);
void dc_give(char *);
void dc_goto(char *);
void dc_help(char *);
void dc_iclone(char *);
void dc_icreate(char *);
void dc_iedit(char *);
void dc_ifind(char *);
void dc_ilist(char *);
void dc_ipurge(char *);
void dc_ishow(char *);
void dc_load(char *);
void dc_look(char *);
void dc_mclone(char *);
void dc_mcreate(char *);
void dc_medit(char *);
void dc_mfind(char *);
void dc_mlist(char *);
void dc_mpurge(char *);
void dc_mshow(char *);
void dc_north(char *);
void dc_rclone(char *);
void dc_rcreate(char *);
void dc_redit(char *);
void dc_rfind(char *);
void dc_rlist(char *);
void dc_rpurge(char *);
void dc_rshow(char *);
void dc_purge(char *);
void dc_put(char *);
void dc_quit(char *);
void dc_south(char *);
void dc_up(char *);
void dc_version(char *);
void dc_west(char *);
void dc_wear(char *);
void dc_zclone(char *);
void dc_zcreate(char *);
void dc_zedit(char *);
void dc_zfind(char *);
void dc_zlist(char *);
void dc_zpurge(char *);
void dc_zshow(char *);
/*** GLOBAL VARS ***/
int dc_quitflag;
char lastcommand[DC_MAXSTRLEN];
char MudName[DC_MAXSTRLEN]="";
/***** EXTERNS *****/
extern int zw_max;
extern char **zw_str;
extern int zd_max;
extern char **zd_str;
extern struct zone_data *ze_activezone;
/*** COMMAND CONSTANTS ***/
struct command dc_ccmds[DC_NR_CCMDS]=
{
{"cmds",NULL,dc_commands},
{"commands",NULL,dc_commands},
{"credits",NULL,dc_credits}
};
struct command dc_dcmds[DC_NR_DCMDS]=
{
{"down",NULL,dc_down},
{"doorstate",NULL,dc_doorstate}
};
struct command dc_ecmds[DC_NR_ECMDS]=
{
{"east",NULL,dc_east},
{"exits",NULL,dc_exits}
};
struct command dc_gcmds[DC_NR_GCMDS]=
{
{"give",NULL,dc_give},
{"goto",NULL,dc_goto}
};
struct command dc_hcmds[DC_NR_HCMDS]=
{
{"help",NULL,dc_help}
};
struct command dc_icmds[DC_NR_ICMDS]=
{
{"iclone",NULL,dc_iclone},
{"icreate",NULL,dc_icreate},
{"iedit",NULL,dc_iedit},
{"ifind",NULL,dc_ifind},
{"ilist",NULL,dc_ilist},
{"ipurge",NULL,dc_ipurge},
{"ishow",NULL,dc_ishow}
};
struct command dc_lcmds[DC_NR_LCMDS]=
{
{"look",NULL,dc_look},
{"load",NULL,dc_load}
};
struct command dc_mcmds[DC_NR_MCMDS]=
{
{"mclone",NULL,dc_mclone},
{"mcreate",NULL,dc_mcreate},
{"medit",NULL,dc_medit},
{"mfind",NULL,dc_mfind},
{"mlist",NULL,dc_mlist},
{"mpurge",NULL,dc_mpurge},
{"mshow",NULL,dc_mshow}
};
struct command dc_ncmds[DC_NR_NCMDS]=
{
{"north",NULL,dc_north}
};
struct command dc_pcmds[DC_NR_PCMDS]=
{
{"purge",NULL,dc_purge},
{"put",NULL,dc_put}
};
struct command dc_qcmds[DC_NR_QCMDS]=
{
{"quit",NULL,dc_quit}
};
struct command dc_rcmds[DC_NR_RCMDS]=
{
{"rclone",NULL,dc_rclone},
{"rcreate",NULL,dc_rcreate},
{"redit",NULL,dc_redit},
{"rfind",NULL,dc_rfind},
{"rlist",NULL,dc_rlist},
{"rpurge",NULL,dc_rpurge},
{"rshow",NULL,dc_rshow}
};
struct command dc_scmds[DC_NR_SCMDS]=
{
{"south",NULL,dc_south}
};
struct command dc_vcmds[DC_NR_VCMDS]=
{
{"version",NULL,dc_version}
};
struct command dc_ucmds[DC_NR_UCMDS]=
{
{"up",NULL,dc_up}
};
struct command dc_wcmds[DC_NR_WCMDS]=
{
{"west",NULL,dc_west},
{"wear",NULL,dc_wear}
};
struct command dc_zcmds[DC_NR_ZCMDS]=
{
{"zclone",NULL,dc_zclone},
{"zcreate",NULL,dc_zcreate},
{"zedit",NULL,dc_zedit},
{"zfind",NULL,dc_zfind},
{"zlist",NULL,dc_zlist},
{"zpurge",NULL,dc_zpurge},
{"zshow",NULL,dc_zshow}
};
struct hashentry dc_cmdhash[26] =
{
{DC_NR_ACMDS,NULL},
{DC_NR_BCMDS,NULL},
{DC_NR_CCMDS,dc_ccmds},
{DC_NR_DCMDS,dc_dcmds},
{DC_NR_ECMDS,dc_ecmds},
{DC_NR_FCMDS,NULL},
{DC_NR_GCMDS,dc_gcmds},
{DC_NR_HCMDS,dc_hcmds},
{DC_NR_ICMDS,dc_icmds},
{DC_NR_JCMDS,NULL},
{DC_NR_KCMDS,NULL},
{DC_NR_LCMDS,dc_lcmds},
{DC_NR_MCMDS,dc_mcmds},
{DC_NR_NCMDS,dc_ncmds},
{DC_NR_OCMDS,NULL},
{DC_NR_PCMDS,dc_pcmds},
{DC_NR_QCMDS,dc_qcmds},
{DC_NR_RCMDS,dc_rcmds},
{DC_NR_SCMDS,dc_scmds},
{DC_NR_TCMDS,NULL},
{DC_NR_UCMDS,dc_ucmds},
{DC_NR_VCMDS,dc_vcmds},
{DC_NR_WCMDS,dc_wcmds},
{DC_NR_XCMDS,NULL},
{DC_NR_YCMDS,NULL},
{DC_NR_ZCMDS,dc_zcmds}
};
char ConfigVars[DC_CONFVARS][40] =
{
"MudName",
"ItemFile",
"ItemTempFile",
"MobileFile",
"MobileTempFile",
"RoomFile",
"RoomTempFile",
"ZoneFile",
"ZoneTempFile",
"DataBasePath",
"AffBitVector"
};
void (*dc_conf[DC_CONFVARS])(char *) =
{
dc_CMudName,
dc_CItemFile,
dc_CIETempF,
dc_CMobileFile,
dc_CMETempF,
dc_CRoomFile,
dc_CRETempF,
dc_CZoneFile,
dc_CZETempF,
dc_CDataBPath,
dc_CAffBitVector
};
/*** FUNCTIONS ***/
void dc_commands(char *wstr)
{
int i,i2;
for(i=0;i<26;i++)
{
for(i2=0;i2<dc_cmdhash[i].nr;i2++)
{
printf("%s ",dc_cmdhash[i].cmds[i2].cmd);
}
}
printf("\n");
}
void dc_credits(char *wstr)
{
printf("------ CREDITS ------ \n");
printf("This Program was coded by:\n");
printf("Concept and Idea, DikuCli, DikuSim, IEdit, MEdit and ZEdit by:\n");
printf(" GEORG ESSL (essl@fstgds06.tu-graz.ac.at)\n\n");
printf("Modifications and REdit by:\n");
printf(" KENNETH HOLMLUND (holmlund@tp.umu.se)\n");
}
void dc_exits(char *wstr)
{
int wint,wint2;
char wstr2[DC_MAXSTRLEN];
wstr=strtok(wstr," ");
if(wstr=='\0')
{
sim_DoExits(re_GetRealNumber(sim_get_curr_room()));
}
else
printf("*** Syntax: EXITS\n");
}
void dc_give(char *wstr)
{
int wint,wint2;
int objnr;
int mobnr;
char wstr2[DC_MAXSTRLEN];
char *wstr3;
char *wstr4;
wstr3=strtok(wstr," ");
wstr4=strtok(NULL," ");
if(wstr3!='\0')
{
wint=atoi(wstr3);
if(((strcspn(wstr3,"."))==strlen(wstr3))&&((wint>0)||((wint==0)&&(!strcmp(wstr3,"0")))))
{
if(ie_GetRealNumber(wint)>=0)
{
objnr=wint;
}
else
{
dc_NotFound();
return;
}
}
else
{
if((wint=strcspn(wstr3,"."))==strlen(wstr3))
{
if((wint2=ie_FindNrRealItem(1,wstr3))>=0)
{
objnr=wint2;
}
else
{
dc_NotFound();
return;
}
}
else
{
strncpy(wstr2,wstr3,wint);
wstr2[wint]='\0';
wint2=atoi(wstr2);
wstr3+=wint+1;
if((wint=ie_FindNrRealItem(wint2,wstr3))>=0)
{
objnr=wint;
}
else
{
dc_NotFound();
return;
}
}
}
if(wstr4!='\0')
{
wint=atoi(wstr4);
if(((strcspn(wstr4,"."))==strlen(wstr4))&&((wint>0)||((wint==0)&&(!strcmp(wstr4,"0")))))
{
if((wint2=ze_FindNrMobRoom(1,wint,ze_getroom(ze_activezone,sim_get_curr_room())))>=0)
ze_GiveItemMob(objnr,wint2);
else
dc_NotFound();
}
else
{
if((wint=strcspn(wstr4,"."))==strlen(wstr4))
{
if((wint2=ze_FindMobRoom(1,wstr4,ze_getroom(ze_activezone,sim_get_curr_room())))>=0)
ze_GiveItemMob(objnr,wint2);
else
dc_NotFound();
}
else
{
strncpy(wstr2,wstr4,wint);
wstr2[wint]='\0';
wint2=atoi(wstr2);
wstr4+=wint+1;
if((wint=ze_FindMobRoom(wint2,wstr4,ze_getroom(ze_activezone,sim_get_curr_room())))>=0)
ze_GiveItemMob(objnr,wint);
else
dc_NotFound();
}
}
}
else
{
printf("*** Syntax: GIVE <ObjNr|[Nr.]Pattern> <MobNr|[Nr.]Pattern>\n");
}
}
else
{
printf("*** Syntax: GIVE <ObjNr|[Nr.]Pattern> <MobNr|[Nr.]Pattern>\n");
}
}
void dc_goto(char *wstr)
{
int wint,wint2;
char wstr2[DC_MAXSTRLEN];
wstr=strtok(wstr," ");
if(wstr=='\0')
printf("*** Syntax: GOTO <RoomNumber> or GOTO <[Nr.]Pattern>\n");
else
{
wint=atoi(wstr);
if(((strcspn(wstr,"."))==strlen(wstr))&&((wint>0)||((wint==0)&&(!strcmp(wstr,"0")))))
{
if((wint2=re_GetRealNumber(wint))>=0)
sim_DoGoto(wint2);
else
dc_NotFound();
}
else
{
if((wint=strcspn(wstr,"."))==strlen(wstr))
{
if((wint2=re_FindNrRoom(1,wstr))>=0)
sim_DoGoto(wint2);
else
dc_NotFound();
}
else
{
strncpy(wstr2,wstr,wint);
wstr2[wint]='\0';
wint2=atoi(wstr2);
wstr+=wint+1;
if((wint=re_FindNrRoom(wint2,wstr))>=0)
sim_DoGoto(wint);
else
dc_NotFound();
}
}
}
}
void dc_help(char *wstr)
{
char arg[DC_MAXSTRLEN];
char wchr;
int i,i2;
if(sscanf(wstr,"%s",arg)==1)
{
wchr=toupper(*arg);
if((wchr>='A')&&(wchr<='Z'))
{
for(i=0;i<dc_cmdhash[wchr-'A'].nr;i++)
{
if(!strnccmp(arg,dc_cmdhash[wchr-'A'].cmds[i].cmd,strlen(arg)))
{
printf("%s",dc_cmdhash[wchr-'A'].cmds[i].help);
break;
}
}
if(i==dc_cmdhash[wchr-'A'].nr)
printf("No help for that!!!\n");
}
}
else
{
printf("There is HELP available about:\n\n");
printf("Information: HELP CREDITS VERSION CMDS\n");
printf("Item-Editor: ICLONE ICREATE IEDIT IFIND ILIST IPURGE ISHOW\n");
printf("Mob-Editor : MCLONE MCREATE MEDIT MFIND MLIST MPURGE MSHOW\n");
printf("Room-Editor: RCLONE RCREATE REDIT RFIND RLIST RPURGE RSHOW\n");
printf("Zone-Editor: ZCLONE ZCREATE ZEDIT ZFIND ZLIST ZPURGE ZSHOW\n");
printf("Simulator : EXITS GIVE GOTO LOAD LOOK PURGE PUT WEAR\n");
printf(" DOORSTATE NORTH EAST SOUTH WEST UP DOWN\n");
printf("Other: QUIT\n");
}
}
void dc_iclone(char *wstr)
{
char *wstr3;
char *wstr4;
char wstr2[DC_MAXSTRLEN];
int wint,wint2,wint3;
wstr3=strtok(wstr," ");
wstr4=strtok(NULL," ");
if(wstr4!=NULL)
wint3=atoi(wstr4);
else
wint3=0;
if((wstr3==NULL)||(wstr4==NULL)||((wint3==0)&&(strcmp(wstr4,"0")))||(wstr3=='\0')||(wstr4=='\0'))
printf("*** Syntax: ICLONE <ItemNr> <ItemNr> or ICLONE <[Nr.]Pattern> <ItemNr>\n");
else
{
wint=atoi(wstr3);
if(((strcspn(wstr3,"."))==strlen(wstr3))&&((wint>0)||((wint==0)&&(!strcmp(wstr3,"0")))))
{
if((wint2=ie_GetRealNumber(wint))>=0)
ie_CloneItem(wint2,wint3);
else
dc_NotFound();
}
else
{
if((wint=strcspn(wstr3,"."))==strlen(wstr3))
{
if((wint2=ie_FindNrItem(1,wstr3))>=0)
ie_CloneItem(wint2,wint3);
else
dc_NotFound();
}
else
{
strncpy(wstr2,wstr3,wint);
wstr2[wint]='\0';
wint2=atoi(wstr2);
wstr3+=wint+1;
if((wint=ie_FindNrItem(wint2,wstr3))>=0)
ie_CloneItem(wint,wint3);
else
dc_NotFound();
}
}
}
}
void dc_icreate(char *wstr)
{
int wint;
wstr=strtok(wstr," ");
if(wstr!=NULL)
wint=atoi(wstr);
else
wint=0;
if(wstr!=NULL && (strcspn(wstr,".")==strlen(wstr))&&((wint>0)||((wint==0)&&(!strcmp(wstr,"0")))))
{
ie_CloneItem(-1,wint);
}
else
printf("*** Syntax: ICREATE <ItemNumber>\n");
}
void dc_iedit(char *wstr)
{
int wint,wint2;
char wstr2[DC_MAXSTRLEN];
wstr=strtok(wstr," ");
if(wstr=='\0')
printf("*** Syntax: IEDIT <ItemNumber> or IEDIT <[Nr.]Pattern>\n");
else
{
wint=atoi(wstr);
if(((strcspn(wstr,"."))==strlen(wstr))&&((wint>0)||((wint==0)&&(!strcmp(wstr,"0")))))
{
if((wint2=ie_GetRealNumber(wint))>=0)
ie_EditItem(wint2);
else
{
ie_CloneItem(-1,wint);
if((wint2=ie_GetRealNumber(wint))>=0)
ie_EditItem(wint2);
}
}
else
{
if((wint=strcspn(wstr,"."))==strlen(wstr))
{
if((wint2=ie_FindNrItem(1,wstr))>=0)
ie_EditItem(wint2);
else
dc_NotFound();
}
else
{
strncpy(wstr2,wstr,wint);
wstr2[wint]='\0';
wint2=atoi(wstr2);
wstr+=wint+1;
if((wint=ie_FindNrItem(wint2,wstr))>=0)
ie_EditItem(wint);
else
dc_NotFound();
}
}
}
}
void dc_ifind(char *wstr)
{
wstr=strtok(wstr," ");
if(wstr!='\0')
ie_FindItems(wstr);
else
printf("*** Syntax: IFIND <SearchPattern>\n");
}
void dc_ilist(char *wstr)
{
dc_ifind("*");
}
void dc_ipurge(char *wstr)
{
int wint,wint2;
wstr=strtok(wstr," ");
wint=atoi(wstr);
if((strcspn(wstr,".")==strlen(wstr))&&((wint>0)||((wint==0)&&(!strcmp(wstr,"0")))))
{
if((wint2=ie_GetRealNumber(wint))>=0)
ie_PurgeItem(wint2);
else
dc_NotFound();
}
else
printf("*** Syntax: IPURGE <ItemNumber>\n");
}
void dc_ishow(char *wstr)
{
int wint,wint2;
char wstr2[DC_MAXSTRLEN];
wstr=strtok(wstr," ");
if(wstr=='\0')
printf("*** Syntax: ISHOW <ItemNr|[Nr.]Pattern>\n");
else
{
wint=atoi(wstr);
if(((strcspn(wstr,"."))==strlen(wstr))&&((wint>0)||((wint==0)&&(!strcmp(wstr,"0")))))
{
if((wint2=ie_GetRealNumber(wint))>=0)
ie_ShowItem(wint2);
else
dc_NotFound();
}
else
{
if((wint=strcspn(wstr,"."))==strlen(wstr))
{
if((wint2=ie_FindNrItem(1,wstr))>=0)
ie_ShowItem(wint2);
else
dc_NotFound();
}
else
{
strncpy(wstr2,wstr,wint);
wstr2[wint]='\0';
wint2=atoi(wstr2);
wstr+=wint+1;
if((wint=ie_FindNrItem(wint2,wstr))>=0)
ie_ShowItem(wint);
else
dc_NotFound();
}
}
}
}
void dc_load(char *wstr)
{
int wint,wint2;
char wstr2[DC_MAXSTRLEN];
char *wstr3;
char *wstr4;
wstr3=strtok(wstr," ");
if(wstr3!='\0')
{
switch(toupper(*wstr3))
{
case 'M':
wstr4=strtok(NULL," ");
if(wstr4!='\0')
{
wint=atoi(wstr4);
if(((strcspn(wstr4,"."))==strlen(wstr4))&&((wint>0)||((wint==0)&&(!strcmp(wstr4,"0")))))
{
if(me_GetRealNumber(wint)>=0)
ze_LoadMobile(wint);
else
dc_NotFound();
}
else
{
if((wint=strcspn(wstr4,"."))==strlen(wstr4))
{
if((wint2=me_FindNrRealMobile(1,wstr4))>=0)
ze_LoadMobile(wint2);
else
dc_NotFound();
}
else
{
strncpy(wstr2,wstr4,wint);
wstr2[wint]='\0';
wint2=atoi(wstr2);
wstr4+=wint+1;
if((wint=me_FindNrRealMobile(wint2,wstr4))>=0)
ze_LoadMobile(wint);
else
dc_NotFound();
}
}
}
break;
case 'O':
wstr4=strtok(NULL," ");
if(wstr4!='\0')
{
wint=atoi(wstr4);
if(((strcspn(wstr4,"."))==strlen(wstr4))&&((wint>0)||((wint==0)&&(!strcmp(wstr4,"0")))))
{
if(ie_GetRealNumber(wint)>=0)
ze_LoadItem(wint);
else
dc_NotFound();
}
else
{
if((wint=strcspn(wstr4,"."))==strlen(wstr4))
{
if((wint2=ie_FindNrRealItem(1,wstr4))>=0)
ze_LoadItem(wint2);
else
dc_NotFound();
}
else
{
strncpy(wstr2,wstr4,wint);
wstr2[wint]='\0';
wint2=atoi(wstr2);
wstr4+=wint+1;
if((wint=ie_FindNrRealItem(wint2,wstr4))>=0)
ze_LoadItem(wint);
else
dc_NotFound();
}
}
}
break;
default:
printf("*** Syntax: LOAD MOB <MobNr|[Nr.]Pattern>\n");
printf(" LOAD OBJ <ObjNr|[Nr.]Pattern>\n");
break;
}
}
else
{
printf("*** Syntax: LOAD MOB <MobNr|[Nr.]Pattern>\n");
printf(" LOAD OBJ <ObjNr|[Nr.]Pattern>\n");
}
}
void dc_look(char *wstr)
{
int wint,wint2;
char wstr2[DC_MAXSTRLEN];
char *wstr4;
wstr=strtok(wstr," ");
if(wstr=='\0')
{
sim_DoLook(re_GetRealNumber(sim_get_curr_room()));
}
else
{
switch(toupper(*wstr))
{
case 'A':
wstr4=strtok(NULL," ");
if(wstr4!='\0')
{
wint=atoi(wstr4);
if(((strcspn(wstr4,"."))==strlen(wstr4))&&((wint>0)||((wint==0)&&(!strcmp(wstr4,"0")))))
{
if(ze_FindNrMobRoom(1,wint,ze_getroom(ze_activezone,sim_get_curr_room()))>=0)
sim_LookMobile(wint);
else
dc_NotFound();
}
else
{
if((wint=strcspn(wstr4,"."))==strlen(wstr4))
{
if((wint2=ze_FindMobRoom(1,wstr4,ze_getroom(ze_activezone,sim_get_curr_room())))>=0)
sim_LookMobile(wint2);
else
dc_NotFound();
}
else
{
strncpy(wstr2,wstr4,wint);
wstr2[wint]='\0';
wint2=atoi(wstr2);
wstr4+=wint+1;
if((wint=ze_FindMobRoom(wint2,wstr4,ze_getroom(ze_activezone,sim_get_curr_room())))>=0)
sim_LookMobile(wint);
else
dc_NotFound();
}
}
}
break;
case 'I':
wstr4=strtok(NULL," ");
if(wstr4!='\0')
{
wint=atoi(wstr4);
if(((strcspn(wstr4,"."))==strlen(wstr4))&&((wint>0)||((wint==0)&&(!strcmp(wstr4,"0")))))
{
if(ze_FindNrItemRoom(1,wint,ze_getroom(ze_activezone,sim_get_curr_room()))>=0)
sim_LookItem(wint);
else
dc_NotFound();
}
else
{
if((wint=strcspn(wstr4,"."))==strlen(wstr4))
{
if((wint2=ze_FindItemRoom(1,wstr4,ze_getroom(ze_activezone,sim_get_curr_room())))>=0)
sim_LookItem(wint2);
else
dc_NotFound();
}
else
{
strncpy(wstr2,wstr4,wint);
wstr2[wint]='\0';
wint2=atoi(wstr2);
wstr4+=wint+1;
if((wint=ze_FindItemRoom(wint2,wstr4,ze_getroom(ze_activezone,sim_get_curr_room())))>=0)
sim_LookItem(wint);
else
dc_NotFound();
}
}
}
break;
case 'N':
sim_LookDir(DIR_NORTH);
break;
case 'E':
sim_LookDir(DIR_EAST);
break;
case 'S':
sim_LookDir(DIR_SOUTH);
break;
case 'W':
sim_LookDir(DIR_WEST);
break;
case 'U':
sim_LookDir(DIR_UP);
break;
case 'D':
sim_LookDir(DIR_DOWN);
break;
default:
printf("*** SYNTAX: LOOK or LOOK AT <MobNr|[Nr.]Pattern>\n");
printf(" LOOK IN <ObjNr|[Nr].Pattern>\n");
printf(" LOOK <Direction>\n");
break;
}
}
}
void dc_mclone(char *wstr)
{
char *wstr3;
char *wstr4;
char wstr2[DC_MAXSTRLEN];
int wint,wint2,wint3;
wstr3=strtok(wstr," ");
wstr4=strtok(NULL," ");
if(wstr4!=NULL)
wint3=atoi(wstr4);
else
wint3=0;
if((wstr3==NULL)||(wstr4==NULL)||((wint3==0)&&(strcmp(wstr4,"0")))||(wstr3=='\0')||(wstr4=='\0'))
printf("*** Syntax: MCLONE <MobNr> <MobNr> or MCLONE <[Nr.]Pattern> <MobNr>\n");
else
{
wint=atoi(wstr3);
if(((strcspn(wstr3,"."))==strlen(wstr3))&&((wint>0)||((wint==0)&&(!strcmp(wstr3,"0")))))
{
if((wint2=me_GetRealNumber(wint))>=0)
me_CloneMobile(wint2,wint3);
else
dc_NotFound();
}
else
{
if((wint=strcspn(wstr3,"."))==strlen(wstr3))
{
if((wint2=me_FindNrMobile(1,wstr3))>=0)
me_CloneMobile(wint2,wint3);
else
dc_NotFound();
}
else
{
strncpy(wstr2,wstr3,wint);
wstr2[wint]='\0';
wint2=atoi(wstr2);
wstr3+=wint+1;
if((wint=me_FindNrMobile(wint2,wstr3))>=0)
me_CloneMobile(wint,wint3);
else
dc_NotFound();
}
}
}
}
void dc_mcreate(char *wstr)
{
int wint;
wstr=strtok(wstr," ");
if(wstr!=NULL)
wint=atoi(wstr);
else
wint=0;
if(wstr!=NULL && (strcspn(wstr,".")==strlen(wstr))&&((wint>0)||((wint==0)&&(!strcmp(wstr,"0")))))
{
me_CloneMobile(-1,wint);
}
else
printf("*** Syntax: MCREATE <MobNumber>\n");
}
void dc_medit(char *wstr)
{
int wint,wint2;
char wstr2[DC_MAXSTRLEN];
wstr=strtok(wstr," ");
if(wstr=='\0')
printf("*** Syntax: MEDIT <MobNr|[Nr.]Pattern>\n");
else
{
wint=atoi(wstr);
if(((strcspn(wstr,"."))==strlen(wstr))&&((wint>0)||((wint==0)&&(!strcmp(wstr,"0")))))
{
if((wint2=me_GetRealNumber(wint))>=0)
me_EditMobile(wint2);
else
{
me_CloneMobile(-1,wint);
if((wint2=me_GetRealNumber(wint))>=0)
me_EditMobile(wint2);
}
}
else
{
if((wint=strcspn(wstr,"."))==strlen(wstr))
{
if((wint2=me_FindNrMobile(1,wstr))>=0)
me_EditMobile(wint2);
else
dc_NotFound();
}
else
{
strncpy(wstr2,wstr,wint);
wstr2[wint]='\0';
wint2=atoi(wstr2);
wstr+=wint+1;
if((wint=me_FindNrMobile(wint2,wstr))>=0)
me_EditMobile(wint);
else
dc_NotFound();
}
}
}
}
void dc_mfind(char *wstr)
{
wstr=strtok(wstr," ");
if(wstr!='\0')
me_FindMobiles(wstr);
else
printf("*** Syntax: MFIND <SearchPattern>\n");
}
void dc_mlist(char *wstr)
{
dc_mfind("*");
}
void dc_mpurge(char *wstr)
{
int wint,wint2;
wstr=strtok(wstr," ");
wint=atoi(wstr);
if((strcspn(wstr,".")==strlen(wstr))&&((wint>0)||((wint==0)&&(!strcmp(wstr,"0")))))
{
if((wint2=me_GetRealNumber(wint))>=0)
me_PurgeMobile(wint2);
else
dc_NotFound();
}
else
printf("*** Syntax: MPURGE <MobileNumber>\n");
}
void dc_mshow(char *wstr)
{
int wint,wint2;
char wstr2[DC_MAXSTRLEN];
wstr=strtok(wstr," ");
if(wstr=='\0')
printf("*** Syntax: MSHOW <MobNr|[Nr.]Pattern>\n");
else
{
wint=atoi(wstr);
if(((strcspn(wstr,"."))==strlen(wstr))&&((wint>0)||((wint==0)&&(!strcmp(wstr,"0")))))
{
if((wint2=me_GetRealNumber(wint))>=0)
me_ShowMobile(wint2);
else
dc_NotFound();
}
else
{
if((wint=strcspn(wstr,"."))==strlen(wstr))
{
if((wint2=me_FindNrMobile(1,wstr))>=0)
me_ShowMobile(wint2);
else
dc_NotFound();
}
else
{
strncpy(wstr2,wstr,wint);
wstr2[wint]='\0';
wint2=atoi(wstr2);
wstr+=wint+1;
if((wint=me_FindNrMobile(wint2,wstr))>=0)
me_ShowMobile(wint);
else
dc_NotFound();
}
}
}
}
void dc_purge(char *wstr)
{
int wint,wint2;
char wstr2[DC_MAXSTRLEN];
char *wstr3;
char *wstr4;
wstr3=strtok(wstr," ");
if(wstr3!='\0')
{
switch(toupper(*wstr3))
{
case 'M':
wstr4=strtok(NULL," ");
if(wstr4!='\0')
{
wint=atoi(wstr4);
if(((strcspn(wstr4,"."))==strlen(wstr4))&&((wint>0)||((wint==0)&&(!strcmp(wstr4,"0")))))
{
if(me_GetRealNumber(wint)>=0)
ze_PurgeMobile(wint);
else
dc_NotFound();
}
else
{
if((wint=strcspn(wstr4,"."))==strlen(wstr4))
{
if((wint2=me_FindNrRealMobile(1,wstr4))>=0)
ze_PurgeMobile(wint2);
else
dc_NotFound();
}
else
{
strncpy(wstr2,wstr4,wint);
wstr2[wint]='\0';
wint2=atoi(wstr2);
wstr4+=wint+1;
if((wint=me_FindNrRealMobile(wint2,wstr4))>=0)
ze_PurgeMobile(wint);
else
dc_NotFound();
}
}
}
break;
case 'O':
wstr4=strtok(NULL," ");
if(wstr4!='\0')
{
wint=atoi(wstr4);
if(((strcspn(wstr4,"."))==strlen(wstr4))&&((wint>0)||((wint==0)&&(!strcmp(wstr4,"0")))))
{
if(ie_GetRealNumber(wint)>=0)
ze_PurgeItem(wint);
else
dc_NotFound();
}
else
{
if((wint=strcspn(wstr4,"."))==strlen(wstr4))
{
if((wint2=ie_FindNrRealItem(1,wstr4))>=0)
ze_PurgeItem(wint2);
else
dc_NotFound();
}
else
{
strncpy(wstr2,wstr4,wint);
wstr2[wint]='\0';
wint2=atoi(wstr2);
wstr4+=wint+1;
if((wint=ie_FindNrRealItem(wint2,wstr4))>=0)
ze_PurgeItem(wint);
else
dc_NotFound();
}
}
}
break;
case 'A':
ze_PurgeAll();
break;
default:
printf("*** Syntax: PURGE MOB <MobNr|[Nr.]Pattern>\n");
printf(" PURGE OBJ <ObjNr|[Nr.]Pattern>\n");
printf(" PURGE ALL\n");
break;
}
}
else
{
printf("*** Syntax: PURGE MOB <MobNr|[Nr.]Pattern>\n");
printf(" PURGE OBJ <ObjNr|[Nr.]Pattern>\n");
printf(" PURGE ALL\n");
}
}
void dc_put(char *wstr)
{
int wint,wint2;
int objnr;
char wstr2[DC_MAXSTRLEN];
char *wstr3;
char *wstr4;
wstr3=strtok(wstr," ");
wstr4=strtok(NULL," ");
if(wstr3!='\0')
{
wint=atoi(wstr3);
if(((strcspn(wstr3,"."))==strlen(wstr3))&&((wint>0)||((wint==0)&&(!strcmp(wstr3,"0")))))
{
if(ie_GetRealNumber(wint)>=0)
{
objnr=wint;
}
else
{
dc_NotFound();
return;
}
}
else
{
if((wint=strcspn(wstr3,"."))==strlen(wstr3))
{
if((wint2=ie_FindNrRealItem(1,wstr3))>=0)
{
objnr=wint2;
}
else
{
dc_NotFound();
return;
}
}
else
{
strncpy(wstr2,wstr3,wint);
wstr2[wint]='\0';
wint2=atoi(wstr2);
wstr3+=wint+1;
if((wint=ie_FindNrRealItem(wint2,wstr3))>=0)
{
objnr=wint;
}
else
{
dc_NotFound();
return;
}
}
}
if(wstr4!='\0')
{
wint=atoi(wstr4);
if(((strcspn(wstr4,"."))==strlen(wstr4))&&((wint>0)||((wint==0)&&(!strcmp(wstr4,"0")))))
{
if((wint2=ze_FindNrItemRoom(1,wint,ze_getroom(ze_activezone,sim_get_curr_room())))>=0)
ze_GiveItemItem(objnr,wint2);
else
dc_NotFound();
}
else
{
if((wint=strcspn(wstr4,"."))==strlen(wstr4))
{
if((wint2=ze_FindItemRoom(1,wstr4,ze_getroom(ze_activezone,sim_get_curr_room())))>=0)
ze_GiveItemItem(objnr,wint2);
else
dc_NotFound();
}
else
{
strncpy(wstr2,wstr4,wint);
wstr2[wint]='\0';
wint2=atoi(wstr2);
wstr4+=wint+1;
if((wint=ze_FindItemRoom(wint2,wstr4,ze_getroom(ze_activezone,sim_get_curr_room())))>=0)
ze_GiveItemItem(objnr,wint);
else
dc_NotFound();
}
}
}
else
{
printf("*** Syntax: PUT <ObjNr|[Nr.]Pattern> <ObjNr|[Nr.]Pattern>\n");
}
}
else
{
printf("*** Syntax: PUT <ObjNr|[Nr.]Pattern> <ObjNr|[Nr.]Pattern>\n");
}
}
void dc_quit(char *wstr)
{
printf("Are you sure (yes/NO)? ");
if(AskYesNo("yes"))
dc_quitflag=1;
}
void dc_rclone(char *wstr)
{
char *wstr3;
char *wstr4;
char wstr2[DC_MAXSTRLEN];
int wint,wint2,wint3;
wstr3=strtok(wstr," ");
wstr4=strtok(NULL," ");
if(wstr4!=NULL)
wint3=atoi(wstr4);
else
wint3=0;
if((wstr3==NULL)||(wstr4==NULL)||((wint3==0)&&(strcmp(wstr4,"0")))||(wstr3=='\0')||(wstr4=='\0'))
printf("*** Syntax: RCLONE <RoomNr> <RoomNr> or RCLONE <[Nr.]Pattern> <RoomNr>\n")
;
else
{
wint=atoi(wstr3);
if(((strcspn(wstr3,"."))==strlen(wstr3))&&((wint>0)||((wint==0)&&(!strcmp(wstr3,"0")))))
{
if((wint2=re_GetRealNumber(wint))>=0)
re_CloneRoom(wint2,wint3);
else
dc_NotFound();
}
else
{
if((wint=strcspn(wstr3,"."))==strlen(wstr3))
{
if((wint2=re_FindNrRoom(1,wstr3))>=0)
re_CloneRoom(wint2,wint3);
else
dc_NotFound();
}
else
{
strncpy(wstr2,wstr3,wint);
wstr2[wint]='\0';
wint2=atoi(wstr2);
wstr3+=wint+1;
if((wint=re_FindNrRoom(wint2,wstr3))>=0)
re_CloneRoom(wint,wint3);
else
dc_NotFound();
}
}
}
}
void dc_rcreate(char *wstr)
{
int wint;
wstr=strtok(wstr," ");
if(wstr!=NULL)
wint=atoi(wstr);
else
wint=0;
if(wstr!=NULL && (strcspn(wstr,".")==strlen(wstr))&&((wint>0)||((wint==0)&&(!
strcmp(wstr,"0")))))
{
re_CloneRoom(-1,wint);
}
else
printf("*** Syntax: RCREATE <RoomNumber>\n");
}
void dc_redit(char *wstr)
{
int wint,wint2;
char wstr2[DC_MAXSTRLEN];
wstr=strtok(wstr," ");
if(wstr=='\0')
printf("*** Syntax: REDIT <RoomNr|[Nr.]Pattern>\n");
else
{
wint=atoi(wstr);
if(((strcspn(wstr,"."))==strlen(wstr))&&((wint>0)||((wint==0)&&(!strcmp(wstr,"0")))))
{
if((wint2=re_GetRealNumber(wint))>=0)
re_EditRoom(wint2);
else
{
re_CloneRoom(-1,wint);
if((wint2=re_GetRealNumber(wint))>=0)
re_EditRoom(wint2);
}
}
else
{
if((wint=strcspn(wstr,"."))==strlen(wstr))
{
if((wint2=re_FindNrRoom(1,wstr))>=0)
re_EditRoom(wint2);
else
dc_NotFound();
}
else
{
strncpy(wstr2,wstr,wint);
wstr2[wint]='\0';
wint2=atoi(wstr2);
wstr+=wint+1;
if((wint=re_FindNrRoom(wint2,wstr))>=0)
re_EditRoom(wint);
else
dc_NotFound();
}
}
}
}
void dc_rfind(char *wstr)
{
wstr=strtok(wstr," ");
if(wstr!='\0')
re_FindRooms(wstr);
else
printf("*** Syntax: RFIND <SearchPattern>\n");
}
void dc_rlist(char *wstr)
{
dc_rfind("*");
}
void dc_rpurge(char *wstr)
{
int wint,wint2;
wstr=strtok(wstr," ");
wint=atoi(wstr);
if((strcspn(wstr,".")==strlen(wstr))&&((wint>0)||((wint==0)&&(!strcmp(wstr,"0")))))
{
if((wint2=re_GetRealNumber(wint))>=0)
re_PurgeRoom(wint2);
else
dc_NotFound();
}
else
printf("*** Syntax: RPURGE <RoomNumber>\n");
}
void dc_rshow(char *wstr)
{
int wint,wint2;
char wstr2[DC_MAXSTRLEN];
wstr=strtok(wstr," ");
if(wstr=='\0')
printf("*** Syntax: RSHOW <RoomNr|[Nr.]Pattern>\n");
else
{
wint=atoi(wstr);
if(((strcspn(wstr,"."))==strlen(wstr))&&((wint>0)||((wint==0)&&(!strcmp(wstr,"0")))))
{
if((wint2=re_GetRealNumber(wint))>=0)
re_ShowRoom(wint2);
else
dc_NotFound();
}
else
{
if((wint=strcspn(wstr,"."))==strlen(wstr))
{
if((wint2=re_FindNrRoom(1,wstr))>=0)
re_ShowRoom(wint2);
else
dc_NotFound();
}
else
{
strncpy(wstr2,wstr,wint);
wstr2[wint]='\0';
wint2=atoi(wstr2);
wstr+=wint+1;
if((wint=re_FindNrRoom(wint2,wstr))>=0)
re_ShowRoom(wint);
else
dc_NotFound();
}
}
}
}
void dc_north(char *wstr)
{
int wint;
int wint2;
if((wint=sim_GetExit(re_GetRealNumber(sim_get_curr_room()),DIR_NORTH))==-1)
{
printf("No exit in this direction.\n");
}
else
if((wint2=re_GetRealNumber(wint))>=0)
sim_DoGoto(wint2);
else
dc_NotFound();
}
void dc_east(char *wstr)
{
int wint;
int wint2;
if((wint=sim_GetExit(re_GetRealNumber(sim_get_curr_room()),DIR_EAST))==-1)
{
printf("No exit in this direction.\n");
}
else
if((wint2=re_GetRealNumber(wint))>=0)
sim_DoGoto(wint2);
else
dc_NotFound();
}
void dc_south(char *wstr)
{
int wint;
int wint2;
if((wint=sim_GetExit(re_GetRealNumber(sim_get_curr_room()),DIR_SOUTH))==-1)
{
printf("No exit in this direction.\n");
}
else
if((wint2=re_GetRealNumber(wint))>=0)
sim_DoGoto(wint2);
else
dc_NotFound();
}
void dc_west(char *wstr)
{
int wint;
int wint2;
if((wint=sim_GetExit(re_GetRealNumber(sim_get_curr_room()),DIR_WEST))==-1)
{
printf("No exit in this direction.\n");
}
else
if((wint2=re_GetRealNumber(wint))>=0)
sim_DoGoto(wint2);
else
dc_NotFound();
}
void dc_up(char *wstr)
{
int wint;
int wint2;
if((wint=sim_GetExit(re_GetRealNumber(sim_get_curr_room()),DIR_UP))==-1)
{
printf("No exit in this direction.\n");
}
else
if((wint2=re_GetRealNumber(wint))>=0)
sim_DoGoto(wint2);
else
dc_NotFound();
}
void dc_down(char *wstr)
{
int wint;
int wint2;
if((wint=sim_GetExit(re_GetRealNumber(sim_get_curr_room()),DIR_DOWN))==-1)
{
printf("No exit in this direction.\n");
}
else
if((wint2=re_GetRealNumber(wint))>=0)
sim_DoGoto(wint2);
else
dc_NotFound();
}
void dc_doorstate(char *wstr)
{
int wint,wint2;
char wstr2[DC_MAXSTRLEN];
char *wstr4;
wstr=strtok(wstr," ");
if(wstr!='\0')
{
wstr4=strtok(NULL," ");
if(wstr4!='\0')
{
int wint3;
for(wint3=0;wint3<=zd_max;wint3++)
{
if(!strnccmp(wstr4,zd_str[wint3],strlen(wstr4)))
{
wint2=wint3;
break;
}
}
if(wint3>zd_max)
{
printf("Unknown DoorState.\n");
return;
}
switch(toupper(*wstr))
{
case 'N':
ze_DoorState(DIR_NORTH,wint2);
break;
case 'E':
ze_DoorState(DIR_EAST,wint2);
break;
case 'S':
ze_DoorState(DIR_SOUTH,wint2);
break;
case 'W':
ze_DoorState(DIR_WEST,wint2);
break;
case 'U':
ze_DoorState(DIR_UP,wint2);
break;
case 'D':
ze_DoorState(DIR_DOWN,wint2);
break;
default:
printf("Invalid direction.\n");
break;
}
}
else
printf("*** SYNTAX: DOORSTATE <Direction> <State>\n");
}
else
{
printf("*** SYNTAX: DOORSTATE <Direction> <State>\n");
}
}
void dc_version(char *wstr)
{
printf("IEDIT Version 1.6\n");
printf("MEDIT Version 1.1\n");
printf("REDIT Version 1.1\n");
printf("ZEDIT Version 1.0\n");
printf("DIKUSIM Version 1.0\n");
printf("DIKUCLI Version 1.0\n\n");
printf("DIKUED Project Version 1.0 pl2\n");
}
void dc_wear(char *wstr)
{
int wint,wint2;
int objnr;
int mobnr;
char wstr2[DC_MAXSTRLEN];
char *wstr3;
char *wstr4;
char *wstr5;
wstr3=strtok(wstr," ");
wstr4=strtok(NULL," ");
wstr5=strtok(NULL," ");
if(wstr3!='\0')
{
wint=atoi(wstr3);
if(((strcspn(wstr3,"."))==strlen(wstr3))&&((wint>0)||((wint==0)&&(!strcmp(wstr3,"0")))))
{
if(ie_GetRealNumber(wint)>=0)
{
objnr=wint;
}
else
{
dc_NotFound();
return;
}
}
else
{
if((wint=strcspn(wstr3,"."))==strlen(wstr3))
{
if((wint2=ie_FindNrRealItem(1,wstr3))>=0)
{
objnr=wint2;
}
else
{
dc_NotFound();
return;
}
}
else
{
strncpy(wstr2,wstr3,wint);
wstr2[wint]='\0';
wint2=atoi(wstr2);
wstr3+=wint+1;
if((wint=ie_FindNrRealItem(wint2,wstr3))>=0)
{
objnr=wint;
}
else
{
dc_NotFound();
return;
}
}
}
if(wstr4!='\0')
{
wint=atoi(wstr4);
if(((strcspn(wstr4,"."))==strlen(wstr4))&&((wint>0)||((wint==0)&&(!strcmp(wstr4,"0")))))
{
if((wint2=ze_FindNrMobRoom(1,wint,ze_getroom(ze_activezone,sim_get_curr_room())))>=0)
{
if(wstr5!='\0')
{
int wint3;
for(wint3=0;wint3<=zw_max;wint3++)
{
if(!strnccmp(wstr5,zw_str[wint3],strlen(wstr5)))
{
ze_WearItemMob(objnr,wint2,wint3);
return;
}
}
printf("Unknown WearPosition.\n");
}
else
ze_GiveItemMob(objnr,wint2);
}
else
dc_NotFound();
}
else
{
if((wint=strcspn(wstr4,"."))==strlen(wstr4))
{
if((wint2=ze_FindMobRoom(1,wstr4,ze_getroom(ze_activezone,sim_get_curr_room())))>=0)
{
if(wstr5!='\0')
{
int wint3;
for(wint3=0;wint3<=zw_max;wint3++)
{
if(!strnccmp(wstr5,zw_str[wint3],strlen(wstr5)))
{
ze_WearItemMob(objnr,wint2,wint3);
return;
}
}
printf("Unknown WearPosition.\n");
}
else
ze_GiveItemMob(objnr,wint2);
}
else
dc_NotFound();
}
else
{
strncpy(wstr2,wstr4,wint);
wstr2[wint]='\0';
wint2=atoi(wstr2);
wstr4+=wint+1;
if((wint=ze_FindMobRoom(wint2,wstr4,ze_getroom(ze_activezone,sim_get_curr_room())))>=0)
{
if(wstr5!='\0')
{
int wint3;
for(wint3=0;wint3<=zw_max;wint3++)
{
if(!strnccmp(wstr5,zw_str[wint3],strlen(wstr5)))
{
ze_WearItemMob(objnr,wint2,wint3);
return;
}
}
printf("Unknown WearPosition.\n");
}
else
ze_GiveItemMob(objnr,wint);
}
else
dc_NotFound();
}
}
}
else
{
printf("*** Syntax: WEAR <ObjNr|[Nr.]Pattern> <MobNr|[Nr.]Pattern> or\n");
printf(" WEAR <ObjNr|[Nr.]Pattern> <MobNr|[Nr.]Pattern> <WearPos>\n");
}
}
else
{
printf("*** Syntax: WEAR <ObjNr|[Nr.]Pattern> <MobNr|[Nr.]Pattern> or\n");
printf(" WEAR <ObjNr|[Nr.]Pattern> <MobNr|[Nr.]Pattern> <WearPos>\n");
}
}
void dc_zclone(char *wstr)
{
char *wstr3;
char *wstr4;
char wstr2[DC_MAXSTRLEN];
int wint,wint2,wint3;
wstr3=strtok(wstr," ");
wstr4=strtok(NULL," ");
if(wstr4!=NULL)
wint3=atoi(wstr4);
else
wint3=0;
if((wstr3==NULL)||(wstr4==NULL)||((wint3==0)&&(strcmp(wstr4,"0")))||(wstr3=='\0')||(wstr4=='\0'))
printf("*** Syntax: ZCLONE <ZoneNr> <ZoneNr> or ZCLONE <[Nr.]Pattern> <ZoneNr>\n");
else
{
wint=atoi(wstr3);
if(((strcspn(wstr3,"."))==strlen(wstr3))&&((wint>0)||((wint==0)&&(!strcmp(wstr3,"0")))))
{
if((wint2=ze_GetRealNumber(wint))>=0)
ze_CloneZone(wint2,wint3);
else
dc_NotFound();
}
else
{
if((wint=strcspn(wstr3,"."))==strlen(wstr3))
{
if((wint2=ze_FindNrZone(1,wstr3))>=0)
ze_CloneZone(wint2,wint3);
else
dc_NotFound();
}
else
{
strncpy(wstr2,wstr3,wint);
wstr2[wint]='\0';
wint2=atoi(wstr2);
wstr3+=wint+1;
if((wint=ze_FindNrZone(wint2,wstr3))>=0)
ze_CloneZone(wint,wint3);
else
dc_NotFound();
}
}
}
}
void dc_zcreate(char *wstr)
{
int wint;
wstr=strtok(wstr," ");
if(wstr!=NULL)
wint=atoi(wstr);
else
wint=0;
if(wstr!=NULL && (strcspn(wstr,".")==strlen(wstr))&&((wint>0)||((wint==0)&&(!strcmp(wstr,"0")))))
{
ze_CloneZone(-1,wint);
}
else
printf("*** Syntax: ZCREATE <ZoneNumber>\n");
}
void dc_zedit(char *wstr)
{
int wint,wint2;
char wstr2[DC_MAXSTRLEN];
wstr=strtok(wstr," ");
if(wstr=='\0')
printf("*** Syntax: ZEDIT <ZoneNr|[Nr.]Pattern>\n");
else
{
wint=atoi(wstr);
if(((strcspn(wstr,"."))==strlen(wstr))&&((wint>0)||((wint==0)&&(!strcmp(wstr,"0")))))
{
if((wint2=ze_GetRealNumber(wint))>=0)
ze_EditZone(wint2);
else
{
ze_CloneZone(-1,wint);
if((wint2=ze_GetRealNumber(wint))>=0)
ze_EditZone(wint2);
}
}
else
{
if((wint=strcspn(wstr,"."))==strlen(wstr))
{
if((wint2=ze_FindNrZone(1,wstr))>=0)
ze_EditZone(wint2);
else
dc_NotFound();
}
else
{
strncpy(wstr2,wstr,wint);
wstr2[wint]='\0';
wint2=atoi(wstr2);
wstr+=wint+1;
if((wint=ze_FindNrZone(wint2,wstr))>=0)
ze_EditZone(wint);
else
dc_NotFound();
}
}
}
}
void dc_zfind(char *wstr)
{
wstr=strtok(wstr," ");
if(wstr!='\0')
ze_FindZones(wstr);
else
printf("*** Syntax: ZFIND <SearchPattern>\n");
}
void dc_zlist(char *wstr)
{
dc_zfind("*");
}
void dc_zpurge(char *wstr)
{
int wint,wint2;
wstr=strtok(wstr," ");
wint=atoi(wstr);
if((strcspn(wstr,".")==strlen(wstr))&&((wint>0)||((wint==0)&&(!strcmp(wstr,"0")))))
{
if((wint2=ze_GetRealNumber(wint))>=0)
ze_PurgeZone(wint2);
else
dc_NotFound();
}
else
printf("*** Syntax: ZPURGE <ZoneNumber>\n");
}
void dc_zshow(char *wstr)
{
int wint,wint2;
char wstr2[DC_MAXSTRLEN];
wstr=strtok(wstr," ");
if(wstr=='\0')
printf("*** Syntax: ZSHOW <ZoneNr|[Nr.]Pattern>\n");
else
{
wint=atoi(wstr);
if(((strcspn(wstr,"."))==strlen(wstr))&&((wint>0)||((wint==0)&&(!strcmp(wstr,"0")))))
{
if((wint2=ze_GetRealNumber(wint))>=0)
ze_ShowZone(wint2);
else
dc_NotFound();
}
else
{
if((wint=strcspn(wstr,"."))==strlen(wstr))
{
if((wint2=ze_FindNrZone(1,wstr))>=0)
ze_ShowZone(wint2);
else
dc_NotFound();
}
else
{
strncpy(wstr2,wstr,wint);
wstr2[wint]='\0';
wint2=atoi(wstr2);
wstr+=wint+1;
if((wint=ze_FindNrZone(wint2,wstr))>=0)
ze_ShowZone(wint);
else
dc_NotFound();
}
}
}
}
void dc_NotFound(void)
{
printf("*** Nothing found, matching the parameter!\n");
}
void DoCmdLine(char *wstr)
{
char wchr;
char command[DC_MAXSTRLEN];
int i;
command[0]='\0';
sscanf(wstr,"%s ",command);
wchr=toupper(*command);
if((wchr>='A')&&(wchr<='Z'))
{
for(i=0;i<dc_cmdhash[wchr-'A'].nr;i++)
{
if(!strnccmp(command,dc_cmdhash[wchr-'A'].cmds[i].cmd,strlen(command)))
{
(*(dc_cmdhash[wchr-'A'].cmds[i].funct))(wstr+strlen(command));
break;
}
}
if(i==dc_cmdhash[wchr-'A'].nr)
printf("Unknown command!!!\n");
}
else
{
switch(wchr)
{
case '!': {
if(strlen(lastcommand)>0)
DoCmdLine(lastcommand);
break;
}
default : printf("Illegal input!!!\n");
}
}
}
void ReadHelpFile(void)
{
FILE *dc_helpfile;
char wstr1[DC_MAXSTRLEN];
char *wstr2;
char wchr;
int i;
if((dc_helpfile=fopen(DC_HELPFILE,"r"))==NULL)
{
printf("*** CAN'T OPEN HELP-FILE...\n");
return;
}
else
{
while(fgets(wstr1,DC_MAXSTRLEN,dc_helpfile)!=NULL)
{
if((wstr2=fread_string(dc_helpfile))==NULL)
{
printf("*** ERROR IN FORMAT OF HELP-FILE IN ENTRY: %s - ignored\n",wstr1);
}
else
{
wchr=toupper(*wstr1);
if((wchr>='A')&&(wchr<='Z'))
{
for(i=0;i<dc_cmdhash[wchr-'A'].nr;i++)
{
if(!strnccmp(wstr1,dc_cmdhash[wchr-'A'].cmds[i].cmd,strlen(wstr1)-1))
{
dc_cmdhash[wchr-'A'].cmds[i].help=wstr2;
break;
}
}
if(i==dc_cmdhash[wchr-'A'].nr)
printf("*** HELP FOR UNKNOWN COMMAND: %s- ignored\n",wstr1);
}
}
}
fclose(dc_helpfile);
}
}
void FreeHelp(void)
{
int wint1,wint2;
for(wint1=0;wint1<26;wint1++)
{
for(wint2=0;wint2<dc_cmdhash[wint1].nr;wint2++)
{
free(dc_cmdhash[wint1].cmds[wint2].help);
}
}
}
void SimulateDikuCli(void)
{
char inputline[DC_MAXSTRLEN];
printf(" --- DIKU STYLE CLI V1.0 --- \n\n");
if(*MudName!='\0')
printf("Running with database for %s.\n\n",MudName);
sim_DoLook(re_GetRealNumber(sim_get_curr_room()));
printf("\n");
while(!dc_quitflag)
{
printf(DC_PROMPT);
gets(inputline);
if(strlen(inputline)>0)
{
DoCmdLine(inputline);
if(*inputline!='!')
strcpy(lastcommand,inputline);
printf("\n");
}
}
return;
}
void dc_CMudName(char *wstr)
{
strcpy(MudName,wstr);
}
void dc_CItemFile(char *wstr)
{
ie_SetFile(wstr);
}
void dc_CIETempF(char *wstr)
{
ie_SetTemp(wstr);
}
void dc_CMobileFile(char *wstr)
{
me_SetFile(wstr);
}
void dc_CMETempF(char *wstr)
{
me_SetTemp(wstr);
}
void dc_CRoomFile(char *wstr)
{
re_SetFile(wstr);
}
void dc_CRETempF(char *wstr)
{
re_SetTemp(wstr);
}
void dc_CZoneFile(char *wstr)
{
ze_SetFile(wstr);
}
void dc_CZETempF(char *wstr)
{
ze_SetTemp(wstr);
}
void dc_CDataBPath(char *wstr)
{
ie_SetDBPath(wstr);
me_SetDBPath(wstr);
ze_SetDBPath(wstr);
}
void dc_CAffBitVector(char *wstr)
{
if(strcmp(wstr,"0")&&strcmp(wstr,"1"))
printf("*** Argument for 'AffBitVector' must be 0 or 1!\n");
else
ie_SetAffBitVec(atoi(wstr));
}
void DoConfigFile(void)
{
FILE *dc_conffile;
char wstr[DC_MAXSTRLEN];
char *wstr2,*wstr3;
int wint;
if(!(dc_conffile=fopen(DC_CONFFILE,"r")))
{
printf("*** Error opening the configuration-file... using defaults.\n");
return;
}
else
{
while(fgets(wstr,81,dc_conffile))
{
if(*wstr!='\n')
{
wstr2=strtok(wstr," \t\n");
for(wint=0;wint<DC_CONFVARS;wint++)
{
if(!strcmp(wstr2,ConfigVars[wint]))
{
wstr3=strtok(NULL," \t\n");
if(*wstr3=='\0')
printf("*** Missing argument for ConfVar: %s\n",wstr2);
else
(*dc_conf[wint])(wstr3);
break;
}
}
if(wint==DC_CONFVARS)
printf("*** Unknown ConfigVar '%s'... ignored\n",wstr2);
}
}
fclose(dc_conffile);
}
}
void main()
{
DoConfigFile();
ie_InitIEdit();
me_InitMEdit();
re_InitREdit();
ze_InitZEdit();
sim_InitDikuSim();
ReadHelpFile();
SimulateDikuCli();
ie_CloseIEdit();
me_CloseMEdit();
re_CloseREdit();
ze_CloseZEdit();
FreeHelp();
return;
}