/* LINKR.C
*
* Links rooms together
*
* Copyright (C) 1991 Steven D. Wallace
*
*/
#include "mstruct.h"
#include "mextern.h"
#include <time.h>
#include <stdio.h>
#ifdef TC
#include <fcntl.h>
#include <stdlib.h>
#include <sys/file.h>
#endif
#ifndef TC
#include <sys/file.h>
#endif
void link_rom();
void loadit();
void getstr();
void split_string();
void zero();
void merror();
char argread = 0;
short deflt = 1;
void main(argc, argv)
int argc;
char *argv[];
{
int i,x;
short num1, num2, diff;
room *rom1_ptr = 0, *rom2_ptr = 0;
room *rom1b_ptr = 0, *rom2b_ptr = 0;
char str[80];
char str1[80];
char str2[80];
char typestr[10];
char type;
umask(0);
typestr[0] = 0;
do {
if (!argread && (argc > 3)) {
num1 = atoi(argv[1]);
num2 = atoi(argv[2]);
strcpy(typestr, argv[3]);
argread = 1;
}
else {
printf("\nCurrent type: %s Link rooms: ", typestr);
gets(str);
if (!str[0]) exit(0);
if (str[0] == 'n') {
diff = atoi(str+1); /* ignore 'n', get difference */
if (diff == 0) diff = deflt;
deflt = diff;
num1 = num2;
num2 += diff;
}
else if (str[0] == 'b') {
diff = atoi(str+1); /* ignore 'n', get difference */
if (diff == 0) diff = deflt;
deflt = diff;
num2 = num1;
num1 -= diff;
}
else if (str[0] == 'u') {
if (save_rom_to_file(num1, rom1b_ptr) < 0)
printf("Error undoing room %d\n", num1);
if (save_rom_to_file(num2, rom2b_ptr) < 0)
printf("Error undoing room %d\n", num2);
printf("\nLast link undone.\n");
continue;
}
else {
split_string(str, str1, str); /* source room = str1 */
split_string(str, str2, str); /* dest room = str2 */
if (*str) strcpy(typestr, str);/* typestr = (sn, we) */
num1 = atoi(str1);
num2 = atoi(str2);
}
}
/* Check type */
if ((strcmp(typestr, "we")) && (strcmp(typestr, "ns"))) {
printf ("Illegal link type: %s\n", typestr);
continue;
}
/* Free up old room memory! */
if (rom1_ptr) free_rom(rom1_ptr);
if (rom2_ptr) free_rom(rom2_ptr);
if (rom1b_ptr) free_rom(rom1b_ptr);
if (rom2b_ptr) free_rom(rom2b_ptr);
rom1_ptr = rom2_ptr = rom1b_ptr = rom2b_ptr = 0;
loadit(num1, &rom1_ptr, &rom1b_ptr);
loadit(num2, &rom2_ptr, &rom2b_ptr);
printf("\nVia %s, linking %d(%s) <-> %d(%s).\n",
typestr, num1, rom1_ptr->name, num2, rom2_ptr->name);
if (!strcmp(typestr, "we")) {
link_rom(&rom1_ptr, num2, "east");
link_rom(&rom2_ptr, num1, "west");
}
else if (!strcmp(typestr, "ns")) {
link_rom(&rom1_ptr, num2, "south");
link_rom(&rom2_ptr, num1, "north");
}
/* Save rooms to disk */
if (save_rom_to_file(num1, rom1_ptr) < 0)
printf("Error saving room %d\n", num1);
if (save_rom_to_file(num2, rom2_ptr) < 0)
printf("Error saving room %d\n", num2);
} while (!argread);
}
void link_rom(rom_ptr, tonum, dir)
room **rom_ptr;
short tonum;
char *dir;
{
exit_ *ext;
xtag *next_xtag;
xtag *prev_xtag = 0;
xtag *new_xtag;
char found = 0;
next_xtag = (*rom_ptr)->first_ext;
while(next_xtag) {
ext = next_xtag->ext;
prev_xtag = next_xtag;
next_xtag = next_xtag->next_tag;
if (!strcmp(ext->name, dir)) {
zero(ext, sizeof(exit_));
strcpy(ext->name, dir);
ext->room = tonum;
return;
}
}
/* direction not found in current exit list, so create a new one */
/* allocate memory for exit and a new tag */
new_xtag = (xtag *)malloc(sizeof(xtag));
ext = (exit_ *)malloc(sizeof(exit_));
/* zero new exit and set its direction and number */
zero(ext, sizeof(exit_));
strcpy(ext->name, dir);
ext->room = tonum;
new_xtag->next_tag = 0; /* new tag is end of tag list */
new_xtag->ext = ext; /* tag points to new exit */
/* old end of list point to new tag */
if (prev_xtag)
prev_xtag->next_tag = new_xtag;
else
(*rom_ptr)->first_ext = new_xtag;
}
void loadit(num, rom_ptr, romb_ptr)
short num;
room **rom_ptr;
room **romb_ptr;
{
if (load_rom_from_file(num, rom_ptr)) {
printf("Warning: Room %d does not exist. Creating new room.\n", num);
(*rom_ptr)->rom_num = num;
if (!(*rom_ptr)->established)
(*rom_ptr)->established = time(0);
*romb_ptr = (room *)malloc(sizeof(room));
zero(*romb_ptr, sizeof(room));
}
else {
load_rom_from_file(num, romb_ptr);
}
}
void getstr(str, origstr, maxlen)
char *str, *origstr;
int maxlen;
{
char tempstr[256];
gets(tempstr);
if(!tempstr[0])
strcpy(str, origstr);
else if(!strcmp(tempstr, "@"))
str[0] = 0;
else
strncpy(str, tempstr, maxlen-1);
}
void split_string(str_in, str_one, str_two)
char *str_in;
char *str_one;
char *str_two;
{
int i=0, j=0;
while(str_in[i] != ' ' && str_in[i] != '\n' && str_in[i] != 0)
str_one[j++] = str_in[i++];
str_one[j]=0; j=0;
while(str_in[i] == ' ' || str_in[i] == '\n') i++;
if(str_in[i])
while(str_in[i] != 0 && str_in[i] != '\n')
str_two[j++] = str_in[i++];
str_two[j]=0;
}