#include <stdlib.h>
#include "kernel.h"
#include "zones.h"
#include "levels.h"
#include "mobile.h"
#include "rooms.h"
#include "objsys.h"
#include "clone.h"
#include "bprintf.h"
#include "log.h"
#include "parse.h"
#include "uaf.h"
#include "locations.h"
/* returns the number of players in a zone, excludes aliased mobs */
void resize_zones(void);
int count_players_in_zone(int zone) {
int i;
int plrs = 0;
for (i = 0 ; i < max_players ; i++)
if (is_in_game(i) && loc2zone(ploc(i)) == zone)
plrs++;
return(plrs);
}
/* give this two numbers, LOCMIN & LOCMAX */
int count_players_between_locs(int loca, int locb) {
int i;
int plrs = 0;
for (i = 0 ; i < max_players ; i++)
if (is_in_game(i) && ploc(i) <= loca && ploc(i) >= locb)
plrs++;
return(plrs);
}
/* Return the zone index for a given zone name (abbreviation).
* -1 if no such zone is found.
*/
int
get_zone_by_name (char *name)
{
int x;
int w = strlen (name);
for (x = 0; x < numzon; x++) {
if (strncasecmp (name, zname (x), w) == 0)
return x;
}
return -1;
}
/* Return the zone index among the non-permanent zones which matches
* the given name exactly. If none exists, create one and return that index.
*/
int get_wizzone_by_name(char *zonename){
int i;
for (i = num_const_zon; i < numzon; i++) { /* already here */
if (!strcasecmp(zonename, zname (i)))
return(i);
}
resize_zones(); /* new wizzone */
zname(numzon) = COPY(zonename);
init_intset (zlocs (numzon), 5);
init_intset (zmobs (numzon), 3);
init_intset (zobjs (numzon), 3);
return numzon++;
}
/* Return the ZONE entry index for the zone that 'loc' is member of.
* Return -1 if invalid loc number.
*/
int
loc2zone (int loc)
{
return exists (loc) ? lzone (loc) : -1;
}
/* Take a 'loc' as argument and return the zone name and the offset within
* the zone for this loc.
* If buff = NULL, return the name in a static buffer.
*/
int
findzone (int loc, char *buff)
{
int z, x;
if ((z = loc2zone (loc)) == -1) {
strcpy (buff, "TCHAN");
return 0;
}
strcpy (buff, zname (z));
if (!(x = find_int (loc, zlocs (z)))) {
mudlog ("ERROR: Location %d was not in its zone %d.", loc, z);
}
return x;
}
/* This function is inverse of findzone in that it
* from a zone index and offset number finds the loc that it makes up.
* 0 is returned on error.
*/
int getlocid (int z, int off) {
int a;
if (z == -1 || z >= numzon)
return 0;
if (off == 0)
off = 1;
else if (off < 0)
return 0;
return (a = find_int_number (off - 1, zlocs (z))) == SET_END ? 0 : a;
}
void reset_zone (int z) {
int i, ct, loc;
/* reset data for each room/obj/mob, if it moves from the intset, *
* then decrement ct so that when ct++ happens we are at the proper *
* place in the link list (where the old one was deleted */
for (ct = 0 ; ct < znumchars(z) ; ct++) {
i = zmob_nr(ct, z);
loc = pzone(i);
reset_mobile(i);
if (loc != pzone(i)) ct--;
}
for (ct = 0 ; ct < znumobs(z) ; ct++) {
i = zobj_nr(ct, z);
loc = ozone(i);
reset_object(i);
if (loc != ozone(i)) ct--;
}
for (ct = 0 ; ct < znumloc(z) ; ct++) {
i = zloc_nr(ct, z);
loc = lzone(i);
reset_location(i);
if (loc != lzone(i)) ct--;
}
}
void zonescom (void) {
int a;
if (plev (mynum) < LVL_WIZARD) {
erreval ();
return;
}
bprintf ("&+C Zone-Name Rooms Mobiles Objects "
"Zone-Name Rooms Mobiles Objects\n\n");
for (a = 0; a < num_const_zon; a++) {
bprintf ("&*%14s&+W%5d %7d %7d", zname (a), znumloc (a), znumchars (a), znumobs (a));
if (a % 2 == 1 || a == num_const_zon - 1)
bprintf ("\n");
}
bprintf ("\n&*A total of &+W%d &*permanent zones containing "
"&+W%d &*rooms, &+W%d &*mobiles, &+W%d &*objects.\n\n",
num_const_zon, num_const_locs, num_const_chars - max_players,
num_const_obs);
if (numzon != num_const_zon) {
int i = 0;
for (a = num_const_zon; a < numzon; a++) {
int locs = znumloc (a);
int mobs = znumchars (a);
int objs = znumobs (a);
if (locs > 0 || mobs > 0 || objs > 0) {
if (!i)
bprintf ("&+C Zone-Name Rooms Mobiles Objects "
"Zone-Name Rooms Mobiles Objects\n\n");
bprintf ("&*%14s&+W%5d %7d %7d", zname (a), locs, mobs, objs);
if (i++ % 2 == 1)
bprintf ("\n");
}
}
if (i)
bprintf ("\n&*A total of &+W%d &*Wizard's zones containing "
"&+W%d &*rooms, &+W%d &*mobiles, &+W%d &*objects.\n",
i,
numloc - num_const_locs,
numchars - num_const_chars,
numobs - num_const_obs);
}
}
/* The LOCATIONS command
*/
void
locationscom ()
{
int a, b;
b = 0;
if (plev (mynum) < LVL_WIZARD) {
erreval ();
return;
}
bprintf ("&+CZone Locations Zone Locations Zone Locations\n");
bprintf ("&+c------------------------ ------------------------ ------------------------\n");
for (a = 0; a < num_const_zon; a++) {
++b;
bprintf ("&*%-15s&+W%9d", zname (a), znumloc (a));
if (b % 3 == 0 || a == num_const_zon - 1) {
b = 0;
bprintf ("\n");
} else
bprintf (" ");
}
if (b)
bprintf ("\n");
bprintf ("&+c------------------------ ------------------------ ------------------------\n");
bprintf ("&+wA total of &+W%d &+wpermanent zones, with &+W%d &+wlocations.\n",
num_const_zon, num_const_locs);
if (numzon != num_const_zon) {
int i = 0;
b = 0;
bprintf ("&+c------------------------ ------------------------ ------------------------\n");
bprintf ("&+CZone Locations Zone Locations Zone Locations\n");
bprintf ("&+c------------------------ ------------------------ ------------------------\n");
for (a = num_const_zon; a < numzon; a++) {
int locs = znumloc (a);
int mobs = znumchars (a);
int objs = znumobs (a);
if (locs > 0 || mobs > 0 || objs > 0) {
bprintf ("&*%-15s&+W%9d", zname (a), znumloc (a));
++b;
++i;
if (b % 3 == 0 || a == num_const_zon - 1) {
b = 0;
bprintf ("\n");
} else
bprintf (" ");
}
}
if (b)
bprintf ("\n");
bprintf ("&+c------------------------ ------------------------ ------------------------\n");
bprintf ("&+wA total of &+W%d &+wWizard zones, with &+W%d &+wlocations.\n",
i, numloc - num_const_locs);
}
}