#include "mstruct.h"
#include "mextern.h"
#ifdef DMALLOC
#include "/usr/local/include/dmalloc.h"
#endif
/* dm_talk() Function for writing interactive talk strings on-line
* Copyright (C) 1996 Brooke Paul & Paul Telford
*
* Yes, I know it's a monster function, but it should be quite
* readable.
*/
int dm_talk(ply_ptr, cmnd)
creature *ply_ptr;
cmd *cmnd;
{
ttag *talk;
char *ptr, buf[1024], file[256], crt_name[80];
FILE *fp;
creature *crt_ptr;
int fd, i, append;
fd = ply_ptr->fd;
if(ply_ptr->class < CARETAKER)
return(PROMPT);
if(cmnd->num < 2) {
print(fd, "Use: *talk [i|k|r|l|s|d]\n");
return(PROMPT);
}
switch(cmnd->str[1][0]) {
/*********** START UP TALK STUFF ************/
case 'i': /* initialize talk stuff */
talk = (ttag *) malloc(sizeof(ttag));
if(!talk)
merror("dm_add_talk", FATAL);
talk->next_tag = 0;
talk->key = 0;
talk->response = 0;
talk->type = 0;
talk->action = 0;
talk->target = 0;
ply_ptr->first_tlk = talk;
print(fd,"Talk ready for input.\n");
return(PROMPT);
/************** SET KEYS **********************/
case 'k': /* set the key */
if(!ply_ptr->first_tlk)
{
print(fd,"You must start a talk first.\n");
return(PROMPT);
}
if(ply_ptr->first_tlk->key)
{
print(fd,"Keyword replaced.\n");
free(ply_ptr->first_tlk->key);
}
else
print(fd,"Keyword set\n");
ptr = cmnd->fullstr;
for(;*ptr == ' ';ptr++);
for(;*ptr != ' ' && *ptr;ptr++);
for(;*ptr == ' ' && *ptr;ptr++);
for(;*ptr != ' ' && *ptr;ptr++);
for(;*ptr == ' ' && *ptr;ptr++);
if(!*ptr)
{
print(fd,"*talk k keyword [ACTION <action> <action args>]\n");
return 0;
}
ply_ptr->first_tlk->key = (char *)malloc(strlen(ptr)+1);
if(!ply_ptr->first_tlk->key)
merror("dm_add_talk_key",FATAL);
strcpy(ply_ptr->first_tlk->key,ptr);
return(PROMPT);
/********* SET THE RESPONSE *********/
case 'r': /* set the response */
if(!ply_ptr->first_tlk)
{
print(fd,"You must start a talk first.\n");
return(PROMPT);
}
ptr = cmnd->fullstr;
for(;*ptr == ' ';ptr++);
for(;*ptr != ' ' && *ptr;ptr++);
for(;*ptr == ' ' && *ptr;ptr++);
for(;;ptr++)
{
if(!*ptr)
{
print(fd,"*talk r [-|+ ]<line>\n");
return(PROMPT);
}
if(*ptr == '+')
{
append = 1;
break;
}
if(*ptr == '-')
{
append = 0;
break;
}
}
if(!*(ptr+1))
return PROMPT;
if(append && ply_ptr->first_tlk->response)
{
strcpy(buf,ply_ptr->first_tlk->response);
free(ply_ptr->first_tlk->response);
strcat(buf,++ptr);
}
else
{
free(ply_ptr->first_tlk->response);
strcpy(buf,++ptr);
}
ply_ptr->first_tlk->response = (char *) malloc(strlen(buf)+1);
if(!ply_ptr->first_tlk->response)
merror("dm_add_talk_resp",FATAL);
strcpy(ply_ptr->first_tlk->response,buf);
print(fd, "Response added.\n");
return(PROMPT);
/************** DISPLAY OUR WORK *********/
case 'l': /* list what we have so far */
if(!ply_ptr->first_tlk) {
print(fd,"You must start a talk first.\n");
return(PROMPT);
}
if(ply_ptr->first_tlk->key) {
print(fd,"Keyword: ");
print(fd,ply_ptr->first_tlk->key);
print(fd,"\n");
}
else {
print(fd, "Keyword: (not set)\n");
}
if(ply_ptr->first_tlk->response) {
print(fd,"Response: ");
print(fd,ply_ptr->first_tlk->response);
print(fd,"\n");
}
else {
print(fd, "Response: (not set)\n");
}
return(0);
/************ SAVE!!! ***********/
case 's': /* save our handiwork */
if(!ply_ptr->first_tlk)
{
print(fd,"You must start a talk first.\n");
return(PROMPT);
}
if(!ply_ptr->first_tlk->key)
{
print(fd,"You must define a keyword.\n");
return(PROMPT);
}
if(!ply_ptr->first_tlk->response)
{
print(fd,"You must supply a response.\n");
return(PROMPT);
}
if(cmnd->num < 3) {
print(fd, "Use: *talk s <monster>\n");
return(PROMPT);
}
cmnd->val[2]= 1;
crt_ptr = find_crt(ply_ptr,ply_ptr->parent_rom->first_mon, cmnd->str[2],
cmnd->val[2]);
if (!crt_ptr)
{
print(fd,"Creature not found in the room.\n");
return(PROMPT);
}
F_SET(crt_ptr, MTALKS); /* make sure the crt knows to respond -PDT */
strcpy(crt_name,crt_ptr->name);
for(i=0;crt_name[i];i++)
if(crt_name[i] == ' ')
crt_name[i] = '_';
sprintf(file,"%s/talk/%s-%d",MONPATH,crt_name,crt_ptr->level);
fp = fopen(file,"a");
if(!fp) {
print(fd, "Could not open talk file. (check permissions).\n");
return(PROMPT);
}
fprintf(fp,"%s\n",ply_ptr->first_tlk->key);
fprintf(fp,"%s\n",ply_ptr->first_tlk->response);
fclose(fp);
print(fd,"Talk saved.\n");
flush_crt(); /* flush memory of old talks and.... */
load_crt_tlk(crt_ptr); /* reload so we can see test immediately */
return 0; /* that should work, but you might */
/* need to *reload anyway. -PDT */
/**** DELETE A TALK FILE ****/
case 'd': /* Delete the talk file for a monster */
if(cmnd->num < 3) {
print(fd, "Use: *talk d <monster>\n");
return(PROMPT);
}
cmnd->val[2]= 1;
crt_ptr = find_crt(ply_ptr,ply_ptr->parent_rom->first_mon, cmnd->str[2],
cmnd->val[2]);
if (!crt_ptr)
{
print(fd,"Creature not found in the room.\n");
return(PROMPT);
}
strcpy(crt_name,crt_ptr->name);
for(i=0;crt_name[i];i++)
if(crt_name[i] == ' ')
crt_name[i] = '_';
sprintf(file,"%s/talk/%s-%d",MONPATH,crt_name,crt_ptr->level);
unlink(file);
print(fd, "File deleted.\n");
return(0);
/**** END OF ALL ALLOWED ARGUMENTS ****/
default:
print(fd, "Use: *talk [i|k|r|l|s|d]\n");
}
}