#include <sys/types.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "emlen.h"
#ifndef WINDOWS
#include <sys/time.h>
#endif
void
room_to_room (ROOM_DATA * vehicle, ROOM_DATA * room)
{
CHAR_DATA *c;
if (!vehicle->more)
return;
if (!IS_SET (vehicle->room_flags, ROOM_ISVEHICLE))
return;
if (IS_SET (room->room_flags, ROOM_ISVEHICLE))
return;
if (vehicle->linkage)
{
fprintf (stderr, "Error.. room_to_room.. vehicle has non-null linkage!\n");
return;
}
vehicle->linkage = room->linkage;
room->linkage = vehicle;
vehicle->more->linked_to = room;
SET_BIT (vehicle->area->area_flags, AREA_CHANGED);
vehicle->x = room->x;
vehicle->y = room->y;
vehicle->z = room->z;
return;
}
void
room_from_room (ROOM_DATA * vehicle)
{
ROOM_DATA *r;
ROOM_DATA *sr;
if (!vehicle->more)
return;
if (!vehicle->more->linked_to)
return;
r = vehicle->more->linked_to;
for (sr = r; sr != NULL; sr = sr->linkage)
{
if (sr->linkage == vehicle)
{
sr->linkage = vehicle->linkage;
vehicle->linkage = NULL;
break;
}
}
vehicle->more->linked_to = NULL;
if (vehicle->linkage)
{
fprintf (stderr, "Vehicle room not found in correct room.\n");
return;
}
return;
}
void
move_vehicles (CHAR_DATA * ch, char *argy)
{
int hash;
ROOM_DATA *r;
ROOM_DATA *to;
DEFINE_COMMAND ("vehicle_reset", move_vehicles, POSITION_DEAD, 110, LOG_ALWAYS, "This command resets all vehicle locations.")
for (hash = 0; hash < HASH_MAX; hash++)
{
for (r = room_hash[hash]; r != NULL; r = r->next)
{
if (r->more && r->more->linked_to && r->more->orig_room != 0 &&
(to = get_room_index (r->more->orig_room)) != NULL)
{
room_from_room (r);
room_to_room (r, to);
}
}
}
send_to_char ("Vehicle locations reset.\n\r", ch);
return;
}
void
z_areachange (CHAR_DATA * ch, char *argy)
{
char arg1[100];
char arg2[100];
int start_vnum = -1;
int end_vnum = -1;
int new_area_num = -1;
int i;
ROOM_DATA *room;
AREA_DATA *a;
AREA_DATA *destination_area = NULL;
DEFINE_COMMAND ("z_areachange", z_areachange, POSITION_DEAD, 110, LOG_ALWAYS, "This command moves vnums into a new area, without changing the vnums.")
argy = one_argy (argy, arg1);
argy = one_argy (argy, arg2);
start_vnum = atoi (arg1);
end_vnum = atoi (arg2);
new_area_num = atoi (argy);
if (start_vnum <= 0 || end_vnum <= 0 || start_vnum > end_vnum ||
new_area_num < 0)
{
send_to_char ("Invalid. Syntax: z_areachange <min vnum> <max vnum> <new area>.\n\r", ch);
return;
}
for (a = area_first; a != NULL; a = a->next)
{
if (a->vnum == new_area_num)
{
destination_area = a;
break;
}
}
if (!destination_area)
{
send_to_char ("Destination area vnum not found.\n\r", ch);
return;
}
/* Purge the world of mobs */
for (i = 0; i < HASH_MAX; i++)
{
for (room = room_hash[i]; room != NULL; room = room->next)
{
raw_purge (room);
}
}
for (i = start_vnum; i < end_vnum; i++)
{
if ((room = get_room_index (i)) == NULL)
continue;
room->area = destination_area;
}
reset_world ();
send_to_char ("Operation complete. Please asave complete at this time.\n\r", ch);
return;
}
ROOM_DATA *
find_coord (short x, short y, char z)
{
ROOM_DATA *room;
int hash;
for (hash = 0; hash < HASH_MAX; hash++)
{
for (room = room_hash[hash]; room != NULL; room = room->next)
{
if (room->x == x && room->y == y && room->z == z)
return room;
}
}
return NULL;
}
void
do_idea (CHAR_DATA * ch, char *argy)
{
FILE *fpp;
DEFINE_COMMAND ("idea", do_idea, POSITION_DEAD, 0, LOG_NORMAL, "Allows you to enter an idea for the admin to read later on.")
if (!ch)
return;
if ((fpp = fopen ("ideas.txt", "a+")) == NULL)
return;
fprintf (fpp, "%s at %d: %s\n", NAME (ch), (ch->in_room ? ch->in_room->vnum : 0), argy);
fclose (fpp);
send_to_char ("Noted! Thanks!\n\r", ch);
return;
}
void
check_room_more (ROOM_DATA * room)
{
ROOM_MORE *mor;
if (!room)
return;
if (room->more)
return;
mor = mem_alloc (sizeof (*mor));
bzero (mor, sizeof (*mor));
mor->people = NULL;
mor->contents = NULL;
mor->copper = 0;
mor->extra_descr = NULL;
mor->move_dir = 0;
mor->gold = 0;
mor->move_message = &str_empty[0];
mor->pcs = 0;
mor->obj_description = NULL;
room->more = mor;
return;
}
void
check_clear_more (ROOM_DATA * room)
{
ROOM_MORE *mor = room->more;
if (!mor)
return;
if (!mor->move_message && !mor->linked_to && !mor->obj_description && mor->move_dir == 0 && !mor->reset_first && !mor->reset_last &&
!mor->people && !mor->contents && !mor->gold && !mor->copper && !mor->pcs)
{
free_m (mor);
room->more = NULL;
}
return;
}
ROOM_DATA *
new_room (void)
{
ROOM_DATA *oneroom;
short door;
oneroom = mem_alloc (sizeof (*oneroom));
oneroom->more = NULL;
oneroom->data_type = K_ROOM;
oneroom->img[0]='\0';
oneroom->img[1]='\0';
oneroom->room_flags = 0;
oneroom->room_flags_2 = 0;
oneroom->light = 0;
oneroom->sector_type = 1;
oneroom->name = &str_empty[0];
oneroom->description = &str_empty[0];
oneroom->shade = FALSE;
for (door = 0; door <= 5; door++)
oneroom->exit[door] = NULL;
oneroom->tracks = NULL;
return oneroom;
}