/
bin/95/
docs/DM/
docs/creatures/
docs/objects/
docs/rooms/
docs/utils/
help/
log/
objmon/ddesc/
player/
post/
rooms/
util/
util/fing/
util/italk/
util/lev-reset/
util/lib/
util/list/
util/msg/
util/tdel/
util/vote/
util/wtfix/
/*	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;
}