/*********************************************************************/
/* 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"
/*********************/
/* the #MARK command */
/*********************/
void mark_command(struct session *ses)
{
if(ses) {
ses->path_mark=0;
ses->path_now=0;
ses->path_lenght=0;
tintin_puts("OK. MARK SET.", ses);
}
else
tintin_puts("NO SESSION ACTIVE => NO PATH!", ses);
}
/*********************/
/* the #PATH command */
/*********************/
void path_command(struct session *ses)
{
if(ses) {
int pathpos, len, outlen;
char mypath[MAX_PATH_LENGHT+16]="#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(struct session *ses)
{
if(ses) {
if(ses->path_lenght) {
char command[2]={'x', '\n'};
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(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(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(char dir, struct session *ses)
{
if(ses->path_lenght && dir==reverse_dir(ses->path[(ses->path_mark+
(ses->path_lenght-1))%MAX_PATH_LENGHT]))
ses->path_lenght--; /*player went back*/
else {
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(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';
}
}