/*********************************************************************/
/* file: path.c - stuff for the path feature */
/* TINTIN III */
/* (T)he K(I)cki(N) (T)ickin D(I)kumud Clie(N)t */
/* coded by peter unold 1992 */
/*********************************************************************/
/* the path is implemented as a fix-sized queue. It gets a bit messy */
/* here and there, but it should work.... */
/*********************************************************************/
#include <string.h>
#include "tintin.h"
#if IRIX
#include <stdlib.h>
#include <unistd.h>
#endif
void check_insert_path();
void insert_path();
char reverse_dir();
extern char tintin_char;
/*********************/
/* the #MARK command */
/*********************/
void mark_command(ses)
struct session *ses;
{
if(ses) {
ses->path_mark=0;
ses->path_now=0;
ses->path_lenght=0;
tintin_puts("#OK. Path starts here.", ses);
}
else
tintin_puts("NO SESSION ACTIVE => NO PATH!", ses);
}
/*********************/
/* the #MAP command */
/*********************/
void map_command(arg, ses)
char *arg;
struct session *ses;
{
if (ses) {
get_arg_in_braces(arg,arg, 1);
check_insert_path(arg,ses);
}
else {
tintin_puts2("#Sorry, no session active=no path", ses);
}
}
/*************************/
/* the SAVEPATH command */
/*************************/
void savepath_command(arg, ses)
char *arg;
struct session *ses;
{
char result[BUFFER_SIZE], *ptr;
if (ses) {
get_arg_in_braces(arg,arg,1);
if ((strlen(arg)<=0) || (ses->path_lenght<=0)){
tintin_puts("Error - Inproper arguments, or no path to save...",ses);
tintin_puts("Usage: #savepath <alias_to_be>",ses);
}
else {
sprintf(result, "Size:%d Arg:%s\n\r",strlen(arg),arg);
tintin_puts2(result, (struct session *)NULL);
*result=tintin_char;
*(result+1)='\0';
strcat(result, "alias ");
strcat(result, arg);
strcat(result, " {");
ptr=result+strlen(result);
strncat(result,ses->path, ses->path_lenght);
*(ptr+ses->path_lenght)='}';
*(ptr+ses->path_lenght+1)='\0';
parse_input(result, ses);
}
}
else
tintin_puts2("#No session active, so no path to save.", ses);
}
/*********************/
/* the #PATH command */
/*********************/
void path_command(ses)
struct session *ses;
{
if(ses) {
int pathpos, len, outlen;
char mypath[MAX_PATH_LENGHT+16];
strcpy(mypath, "#PATH YOU WENT:");
for(pathpos=ses->path_mark, len=ses->path_lenght, outlen=strlen(mypath); len;
len--, pathpos=(pathpos+1)%MAX_PATH_LENGHT)
mypath[outlen++]=ses->path[pathpos];
mypath[outlen]='\0';
tintin_puts(mypath, ses);
}
else
tintin_puts("#NO SESSION ACTIVE => NO PATH!", ses);
}
/***********************/
/* the #RETURN command */
/***********************/
void return_command(ses)
struct session *ses;
{
if(ses) {
if(ses->path_lenght) {
char command[2];
strcpy(command, "x");
command[0]=reverse_dir(ses->path[(ses->path_mark+(ses->path_lenght-1))%MAX_PATH_LENGHT]);
ses->path_lenght--;
if(ses->logfile)
fwrite(command, 1, 2, ses->logfile);
if(write(ses->socket, command, 2)==-1)
syserr("write in send_to_mud");
}
}
else
tintin_puts("#NO SESSION ACTIVE => NO PATH!", ses);
}
/***********************/
/* the #UNPATH command */
/***********************/
void unpath_command(ses)
struct session *ses;
{
if(ses) {
if(ses->path_lenght) {
ses->path_lenght--;
tintin_puts("OK. FORGOT THAT MOVE.", ses);
}
}
else
tintin_puts("#NO SESSION ACTIVE => NO PATH!", ses);
}
/*********************************************************/
/* check to see if command=direction then insert in path */
/*********************************************************/
void check_insert_path(command, ses)
char *command;
struct session *ses;
{
if(is_abrev(command, "north"))
insert_path('n', ses);
else if(is_abrev(command, "east"))
insert_path('e', ses);
else if(is_abrev(command, "south"))
insert_path('s', ses);
else if(is_abrev(command, "west"))
insert_path('w', ses);
else if(is_abrev(command, "up"))
insert_path('u', ses);
else if(is_abrev(command, "down"))
insert_path('d', ses);
}
/***************************************************************************/
/* insert a direction in the path - first check if player went back though */
/* I know this gives problems with one-way-exits but...... */
/***************************************************************************/
void insert_path(dir, ses)
char dir;
struct session *ses;
{
if(ses->path_lenght==MAX_PATH_LENGHT)
ses->path_mark=(ses->path_mark+1)%MAX_PATH_LENGHT;
ses->path[(ses->path_mark+ses->path_lenght)%MAX_PATH_LENGHT]=dir;
if(ses->path_lenght<MAX_PATH_LENGHT)
ses->path_lenght++;
}
/***************************************************/
/* return char containing reverse direction as dir */
/***************************************************/
char reverse_dir(dir)
char dir;
{
switch(dir) {
case 'n':
return 's';
case 'e':
return 'w';
case 's':
return 'n';
case 'w':
return 'e';
case 'u':
return 'd';
case 'd':
return 'u';
default:
return ' ';
}
}