mthrowu, nhlan, options, regions, rip and role globals moved to g.
This commit is contained in:
400
src/region.c
400
src/region.c
@@ -11,10 +11,6 @@
|
||||
* structure eventually.
|
||||
*/
|
||||
|
||||
static NhRegion **regions;
|
||||
static int n_regions = 0;
|
||||
static int max_regions = 0;
|
||||
|
||||
#define NO_CALLBACK (-1)
|
||||
|
||||
boolean FDECL(inside_gas_cloud, (genericptr, genericptr));
|
||||
@@ -294,19 +290,19 @@ NhRegion *reg;
|
||||
NhRegion **tmp_reg;
|
||||
int i, j;
|
||||
|
||||
if (max_regions <= n_regions) {
|
||||
tmp_reg = regions;
|
||||
regions =
|
||||
(NhRegion **) alloc((max_regions + 10) * sizeof (NhRegion *));
|
||||
if (max_regions > 0) {
|
||||
(void) memcpy((genericptr_t) regions, (genericptr_t) tmp_reg,
|
||||
max_regions * sizeof (NhRegion *));
|
||||
if (g.max_regions <= g.n_regions) {
|
||||
tmp_reg = g.regions;
|
||||
g.regions =
|
||||
(NhRegion **) alloc((g.max_regions + 10) * sizeof (NhRegion *));
|
||||
if (g.max_regions > 0) {
|
||||
(void) memcpy((genericptr_t) g.regions, (genericptr_t) tmp_reg,
|
||||
g.max_regions * sizeof (NhRegion *));
|
||||
free((genericptr_t) tmp_reg);
|
||||
}
|
||||
max_regions += 10;
|
||||
g.max_regions += 10;
|
||||
}
|
||||
regions[n_regions] = reg;
|
||||
n_regions++;
|
||||
g.regions[g.n_regions] = reg;
|
||||
g.n_regions++;
|
||||
/* Check for monsters inside the region */
|
||||
for (i = reg->bounding_box.lx; i <= reg->bounding_box.hx; i++)
|
||||
for (j = reg->bounding_box.ly; j <= reg->bounding_box.hy; j++) {
|
||||
@@ -334,10 +330,10 @@ NhRegion *reg;
|
||||
{
|
||||
register int i, x, y;
|
||||
|
||||
for (i = 0; i < n_regions; i++)
|
||||
if (regions[i] == reg)
|
||||
for (i = 0; i < g.n_regions; i++)
|
||||
if (g.regions[i] == reg)
|
||||
break;
|
||||
if (i == n_regions)
|
||||
if (i == g.n_regions)
|
||||
return;
|
||||
|
||||
/* Update screen if necessary */
|
||||
@@ -349,9 +345,9 @@ NhRegion *reg;
|
||||
newsym(x, y);
|
||||
|
||||
free_region(reg);
|
||||
regions[i] = regions[n_regions - 1];
|
||||
regions[n_regions - 1] = (NhRegion *) 0;
|
||||
n_regions--;
|
||||
g.regions[i] = g.regions[g.n_regions - 1];
|
||||
g.regions[g.n_regions - 1] = (NhRegion *) 0;
|
||||
g.n_regions--;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -363,13 +359,13 @@ clear_regions()
|
||||
{
|
||||
register int i;
|
||||
|
||||
for (i = 0; i < n_regions; i++)
|
||||
free_region(regions[i]);
|
||||
n_regions = 0;
|
||||
if (max_regions > 0)
|
||||
free((genericptr_t) regions);
|
||||
max_regions = 0;
|
||||
regions = (NhRegion **) 0;
|
||||
for (i = 0; i < g.n_regions; i++)
|
||||
free_region(g.regions[i]);
|
||||
g.n_regions = 0;
|
||||
if (g.max_regions > 0)
|
||||
free((genericptr_t) g.regions);
|
||||
g.max_regions = 0;
|
||||
g.regions = (NhRegion **) 0;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -385,35 +381,35 @@ run_regions()
|
||||
|
||||
/* End of life ? */
|
||||
/* Do it backward because the array will be modified */
|
||||
for (i = n_regions - 1; i >= 0; i--) {
|
||||
if (regions[i]->ttl == 0L) {
|
||||
if ((f_indx = regions[i]->expire_f) == NO_CALLBACK
|
||||
|| (*callbacks[f_indx])(regions[i], (genericptr_t) 0))
|
||||
remove_region(regions[i]);
|
||||
for (i = g.n_regions - 1; i >= 0; i--) {
|
||||
if (g.regions[i]->ttl == 0L) {
|
||||
if ((f_indx = g.regions[i]->expire_f) == NO_CALLBACK
|
||||
|| (*callbacks[f_indx])(g.regions[i], (genericptr_t) 0))
|
||||
remove_region(g.regions[i]);
|
||||
}
|
||||
}
|
||||
|
||||
/* Process remaining regions */
|
||||
for (i = 0; i < n_regions; i++) {
|
||||
for (i = 0; i < g.n_regions; i++) {
|
||||
/* Make the region age */
|
||||
if (regions[i]->ttl > 0L)
|
||||
regions[i]->ttl--;
|
||||
if (g.regions[i]->ttl > 0L)
|
||||
g.regions[i]->ttl--;
|
||||
/* Check if player is inside region */
|
||||
f_indx = regions[i]->inside_f;
|
||||
if (f_indx != NO_CALLBACK && hero_inside(regions[i]))
|
||||
(void) (*callbacks[f_indx])(regions[i], (genericptr_t) 0);
|
||||
f_indx = g.regions[i]->inside_f;
|
||||
if (f_indx != NO_CALLBACK && hero_inside(g.regions[i]))
|
||||
(void) (*callbacks[f_indx])(g.regions[i], (genericptr_t) 0);
|
||||
/* Check if any monster is inside region */
|
||||
if (f_indx != NO_CALLBACK) {
|
||||
for (j = 0; j < regions[i]->n_monst; j++) {
|
||||
for (j = 0; j < g.regions[i]->n_monst; j++) {
|
||||
struct monst *mtmp =
|
||||
find_mid(regions[i]->monsters[j], FM_FMON);
|
||||
find_mid(g.regions[i]->monsters[j], FM_FMON);
|
||||
|
||||
if (!mtmp || DEADMONSTER(mtmp)
|
||||
|| (*callbacks[f_indx])(regions[i], mtmp)) {
|
||||
|| (*callbacks[f_indx])(g.regions[i], mtmp)) {
|
||||
/* The monster died, remove it from list */
|
||||
k = (regions[i]->n_monst -= 1);
|
||||
regions[i]->monsters[j] = regions[i]->monsters[k];
|
||||
regions[i]->monsters[k] = 0;
|
||||
k = (g.regions[i]->n_monst -= 1);
|
||||
g.regions[i]->monsters[j] = g.regions[i]->monsters[k];
|
||||
g.regions[i]->monsters[k] = 0;
|
||||
--j; /* current slot has been reused; recheck it next */
|
||||
}
|
||||
}
|
||||
@@ -431,40 +427,40 @@ xchar x, y;
|
||||
int i, f_indx;
|
||||
|
||||
/* First check if we can do the move */
|
||||
for (i = 0; i < n_regions; i++) {
|
||||
if (inside_region(regions[i], x, y) && !hero_inside(regions[i])
|
||||
&& !regions[i]->attach_2_u) {
|
||||
if ((f_indx = regions[i]->can_enter_f) != NO_CALLBACK)
|
||||
if (!(*callbacks[f_indx])(regions[i], (genericptr_t) 0))
|
||||
for (i = 0; i < g.n_regions; i++) {
|
||||
if (inside_region(g.regions[i], x, y) && !hero_inside(g.regions[i])
|
||||
&& !g.regions[i]->attach_2_u) {
|
||||
if ((f_indx = g.regions[i]->can_enter_f) != NO_CALLBACK)
|
||||
if (!(*callbacks[f_indx])(g.regions[i], (genericptr_t) 0))
|
||||
return FALSE;
|
||||
} else if (hero_inside(regions[i]) && !inside_region(regions[i], x, y)
|
||||
&& !regions[i]->attach_2_u) {
|
||||
if ((f_indx = regions[i]->can_leave_f) != NO_CALLBACK)
|
||||
if (!(*callbacks[f_indx])(regions[i], (genericptr_t) 0))
|
||||
} else if (hero_inside(g.regions[i]) && !inside_region(g.regions[i], x, y)
|
||||
&& !g.regions[i]->attach_2_u) {
|
||||
if ((f_indx = g.regions[i]->can_leave_f) != NO_CALLBACK)
|
||||
if (!(*callbacks[f_indx])(g.regions[i], (genericptr_t) 0))
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
/* Callbacks for the regions we do leave */
|
||||
for (i = 0; i < n_regions; i++)
|
||||
if (hero_inside(regions[i]) && !regions[i]->attach_2_u
|
||||
&& !inside_region(regions[i], x, y)) {
|
||||
clear_hero_inside(regions[i]);
|
||||
if (regions[i]->leave_msg != (const char *) 0)
|
||||
pline1(regions[i]->leave_msg);
|
||||
if ((f_indx = regions[i]->leave_f) != NO_CALLBACK)
|
||||
(void) (*callbacks[f_indx])(regions[i], (genericptr_t) 0);
|
||||
for (i = 0; i < g.n_regions; i++)
|
||||
if (hero_inside(g.regions[i]) && !g.regions[i]->attach_2_u
|
||||
&& !inside_region(g.regions[i], x, y)) {
|
||||
clear_hero_inside(g.regions[i]);
|
||||
if (g.regions[i]->leave_msg != (const char *) 0)
|
||||
pline1(g.regions[i]->leave_msg);
|
||||
if ((f_indx = g.regions[i]->leave_f) != NO_CALLBACK)
|
||||
(void) (*callbacks[f_indx])(g.regions[i], (genericptr_t) 0);
|
||||
}
|
||||
|
||||
/* Callbacks for the regions we do enter */
|
||||
for (i = 0; i < n_regions; i++)
|
||||
if (!hero_inside(regions[i]) && !regions[i]->attach_2_u
|
||||
&& inside_region(regions[i], x, y)) {
|
||||
set_hero_inside(regions[i]);
|
||||
if (regions[i]->enter_msg != (const char *) 0)
|
||||
pline1(regions[i]->enter_msg);
|
||||
if ((f_indx = regions[i]->enter_f) != NO_CALLBACK)
|
||||
(void) (*callbacks[f_indx])(regions[i], (genericptr_t) 0);
|
||||
for (i = 0; i < g.n_regions; i++)
|
||||
if (!hero_inside(g.regions[i]) && !g.regions[i]->attach_2_u
|
||||
&& inside_region(g.regions[i], x, y)) {
|
||||
set_hero_inside(g.regions[i]);
|
||||
if (g.regions[i]->enter_msg != (const char *) 0)
|
||||
pline1(g.regions[i]->enter_msg);
|
||||
if ((f_indx = g.regions[i]->enter_f) != NO_CALLBACK)
|
||||
(void) (*callbacks[f_indx])(g.regions[i], (genericptr_t) 0);
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
@@ -480,38 +476,38 @@ xchar x, y;
|
||||
int i, f_indx;
|
||||
|
||||
/* First check if we can do the move */
|
||||
for (i = 0; i < n_regions; i++) {
|
||||
if (inside_region(regions[i], x, y) && !mon_in_region(regions[i], mon)
|
||||
&& regions[i]->attach_2_m != mon->m_id) {
|
||||
if ((f_indx = regions[i]->can_enter_f) != NO_CALLBACK)
|
||||
if (!(*callbacks[f_indx])(regions[i], mon))
|
||||
for (i = 0; i < g.n_regions; i++) {
|
||||
if (inside_region(g.regions[i], x, y) && !mon_in_region(g.regions[i], mon)
|
||||
&& g.regions[i]->attach_2_m != mon->m_id) {
|
||||
if ((f_indx = g.regions[i]->can_enter_f) != NO_CALLBACK)
|
||||
if (!(*callbacks[f_indx])(g.regions[i], mon))
|
||||
return FALSE;
|
||||
} else if (mon_in_region(regions[i], mon)
|
||||
&& !inside_region(regions[i], x, y)
|
||||
&& regions[i]->attach_2_m != mon->m_id) {
|
||||
if ((f_indx = regions[i]->can_leave_f) != NO_CALLBACK)
|
||||
if (!(*callbacks[f_indx])(regions[i], mon))
|
||||
} else if (mon_in_region(g.regions[i], mon)
|
||||
&& !inside_region(g.regions[i], x, y)
|
||||
&& g.regions[i]->attach_2_m != mon->m_id) {
|
||||
if ((f_indx = g.regions[i]->can_leave_f) != NO_CALLBACK)
|
||||
if (!(*callbacks[f_indx])(g.regions[i], mon))
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
/* Callbacks for the regions we do leave */
|
||||
for (i = 0; i < n_regions; i++)
|
||||
if (mon_in_region(regions[i], mon)
|
||||
&& regions[i]->attach_2_m != mon->m_id
|
||||
&& !inside_region(regions[i], x, y)) {
|
||||
remove_mon_from_reg(regions[i], mon);
|
||||
if ((f_indx = regions[i]->leave_f) != NO_CALLBACK)
|
||||
(void) (*callbacks[f_indx])(regions[i], mon);
|
||||
for (i = 0; i < g.n_regions; i++)
|
||||
if (mon_in_region(g.regions[i], mon)
|
||||
&& g.regions[i]->attach_2_m != mon->m_id
|
||||
&& !inside_region(g.regions[i], x, y)) {
|
||||
remove_mon_from_reg(g.regions[i], mon);
|
||||
if ((f_indx = g.regions[i]->leave_f) != NO_CALLBACK)
|
||||
(void) (*callbacks[f_indx])(g.regions[i], mon);
|
||||
}
|
||||
|
||||
/* Callbacks for the regions we do enter */
|
||||
for (i = 0; i < n_regions; i++)
|
||||
if (!hero_inside(regions[i]) && !regions[i]->attach_2_u
|
||||
&& inside_region(regions[i], x, y)) {
|
||||
add_mon_to_reg(regions[i], mon);
|
||||
if ((f_indx = regions[i]->enter_f) != NO_CALLBACK)
|
||||
(void) (*callbacks[f_indx])(regions[i], mon);
|
||||
for (i = 0; i < g.n_regions; i++)
|
||||
if (!hero_inside(g.regions[i]) && !g.regions[i]->attach_2_u
|
||||
&& inside_region(g.regions[i], x, y)) {
|
||||
add_mon_to_reg(g.regions[i], mon);
|
||||
if ((f_indx = g.regions[i]->enter_f) != NO_CALLBACK)
|
||||
(void) (*callbacks[f_indx])(g.regions[i], mon);
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
@@ -524,11 +520,11 @@ update_player_regions()
|
||||
{
|
||||
register int i;
|
||||
|
||||
for (i = 0; i < n_regions; i++)
|
||||
if (!regions[i]->attach_2_u && inside_region(regions[i], u.ux, u.uy))
|
||||
set_hero_inside(regions[i]);
|
||||
for (i = 0; i < g.n_regions; i++)
|
||||
if (!g.regions[i]->attach_2_u && inside_region(g.regions[i], u.ux, u.uy))
|
||||
set_hero_inside(g.regions[i]);
|
||||
else
|
||||
clear_hero_inside(regions[i]);
|
||||
clear_hero_inside(g.regions[i]);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -540,13 +536,13 @@ struct monst *mon;
|
||||
{
|
||||
register int i;
|
||||
|
||||
for (i = 0; i < n_regions; i++) {
|
||||
if (inside_region(regions[i], mon->mx, mon->my)) {
|
||||
if (!mon_in_region(regions[i], mon))
|
||||
add_mon_to_reg(regions[i], mon);
|
||||
for (i = 0; i < g.n_regions; i++) {
|
||||
if (inside_region(g.regions[i], mon->mx, mon->my)) {
|
||||
if (!mon_in_region(g.regions[i], mon))
|
||||
add_mon_to_reg(g.regions[i], mon);
|
||||
} else {
|
||||
if (mon_in_region(regions[i], mon))
|
||||
remove_mon_from_reg(regions[i], mon);
|
||||
if (mon_in_region(g.regions[i], mon))
|
||||
remove_mon_from_reg(g.regions[i], mon);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -555,7 +551,7 @@ struct monst *mon;
|
||||
/* not yet used */
|
||||
|
||||
/*
|
||||
* Change monster pointer in regions
|
||||
* Change monster pointer in g.regions
|
||||
* This happens, for instance, when a monster grows and
|
||||
* need a new structure (internally that is).
|
||||
*/
|
||||
@@ -565,10 +561,10 @@ struct monst *monold, *monnew;
|
||||
{
|
||||
register int i;
|
||||
|
||||
for (i = 0; i < n_regions; i++)
|
||||
if (mon_in_region(regions[i], monold)) {
|
||||
remove_mon_from_reg(regions[i], monold);
|
||||
add_mon_to_reg(regions[i], monnew);
|
||||
for (i = 0; i < g.n_regions; i++)
|
||||
if (mon_in_region(g.regions[i], monold)) {
|
||||
remove_mon_from_reg(g.regions[i], monold);
|
||||
add_mon_to_reg(g.regions[i], monnew);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -581,9 +577,9 @@ struct monst *mon;
|
||||
{
|
||||
register int i;
|
||||
|
||||
for (i = 0; i < n_regions; i++)
|
||||
if (mon_in_region(regions[i], mon))
|
||||
remove_mon_from_reg(regions[i], mon);
|
||||
for (i = 0; i < g.n_regions; i++)
|
||||
if (mon_in_region(g.regions[i], mon))
|
||||
remove_mon_from_reg(g.regions[i], mon);
|
||||
}
|
||||
|
||||
#endif /*0*/
|
||||
@@ -598,10 +594,10 @@ xchar x, y;
|
||||
{
|
||||
register int i;
|
||||
|
||||
for (i = 0; i < n_regions; i++)
|
||||
if (inside_region(regions[i], x, y) && regions[i]->visible
|
||||
&& regions[i]->ttl != -2L)
|
||||
return regions[i];
|
||||
for (i = 0; i < g.n_regions; i++)
|
||||
if (inside_region(g.regions[i], x, y) && g.regions[i]->visible
|
||||
&& g.regions[i]->ttl != -2L)
|
||||
return g.regions[i];
|
||||
return (NhRegion *) 0;
|
||||
}
|
||||
|
||||
@@ -628,43 +624,43 @@ int mode;
|
||||
goto skip_lots;
|
||||
|
||||
bwrite(fd, (genericptr_t) &g.moves, sizeof(g.moves)); /* timestamp */
|
||||
bwrite(fd, (genericptr_t) &n_regions, sizeof(n_regions));
|
||||
for (i = 0; i < n_regions; i++) {
|
||||
bwrite(fd, (genericptr_t) ®ions[i]->bounding_box, sizeof(NhRect));
|
||||
bwrite(fd, (genericptr_t) ®ions[i]->nrects, sizeof(short));
|
||||
for (j = 0; j < regions[i]->nrects; j++)
|
||||
bwrite(fd, (genericptr_t) ®ions[i]->rects[j], sizeof(NhRect));
|
||||
bwrite(fd, (genericptr_t) ®ions[i]->attach_2_u, sizeof(boolean));
|
||||
bwrite(fd, (genericptr_t) &g.n_regions, sizeof(g.n_regions));
|
||||
for (i = 0; i < g.n_regions; i++) {
|
||||
bwrite(fd, (genericptr_t) &g.regions[i]->bounding_box, sizeof(NhRect));
|
||||
bwrite(fd, (genericptr_t) &g.regions[i]->nrects, sizeof(short));
|
||||
for (j = 0; j < g.regions[i]->nrects; j++)
|
||||
bwrite(fd, (genericptr_t) &g.regions[i]->rects[j], sizeof(NhRect));
|
||||
bwrite(fd, (genericptr_t) &g.regions[i]->attach_2_u, sizeof(boolean));
|
||||
n = 0;
|
||||
bwrite(fd, (genericptr_t) ®ions[i]->attach_2_m, sizeof(unsigned));
|
||||
n = regions[i]->enter_msg != (const char *) 0
|
||||
? strlen(regions[i]->enter_msg)
|
||||
bwrite(fd, (genericptr_t) &g.regions[i]->attach_2_m, sizeof(unsigned));
|
||||
n = g.regions[i]->enter_msg != (const char *) 0
|
||||
? strlen(g.regions[i]->enter_msg)
|
||||
: 0;
|
||||
bwrite(fd, (genericptr_t) &n, sizeof n);
|
||||
if (n > 0)
|
||||
bwrite(fd, (genericptr_t) regions[i]->enter_msg, n);
|
||||
n = regions[i]->leave_msg != (const char *) 0
|
||||
? strlen(regions[i]->leave_msg)
|
||||
bwrite(fd, (genericptr_t) g.regions[i]->enter_msg, n);
|
||||
n = g.regions[i]->leave_msg != (const char *) 0
|
||||
? strlen(g.regions[i]->leave_msg)
|
||||
: 0;
|
||||
bwrite(fd, (genericptr_t) &n, sizeof n);
|
||||
if (n > 0)
|
||||
bwrite(fd, (genericptr_t) regions[i]->leave_msg, n);
|
||||
bwrite(fd, (genericptr_t) ®ions[i]->ttl, sizeof(long));
|
||||
bwrite(fd, (genericptr_t) ®ions[i]->expire_f, sizeof(short));
|
||||
bwrite(fd, (genericptr_t) ®ions[i]->can_enter_f, sizeof(short));
|
||||
bwrite(fd, (genericptr_t) ®ions[i]->enter_f, sizeof(short));
|
||||
bwrite(fd, (genericptr_t) ®ions[i]->can_leave_f, sizeof(short));
|
||||
bwrite(fd, (genericptr_t) ®ions[i]->leave_f, sizeof(short));
|
||||
bwrite(fd, (genericptr_t) ®ions[i]->inside_f, sizeof(short));
|
||||
bwrite(fd, (genericptr_t) ®ions[i]->player_flags,
|
||||
bwrite(fd, (genericptr_t) g.regions[i]->leave_msg, n);
|
||||
bwrite(fd, (genericptr_t) &g.regions[i]->ttl, sizeof(long));
|
||||
bwrite(fd, (genericptr_t) &g.regions[i]->expire_f, sizeof(short));
|
||||
bwrite(fd, (genericptr_t) &g.regions[i]->can_enter_f, sizeof(short));
|
||||
bwrite(fd, (genericptr_t) &g.regions[i]->enter_f, sizeof(short));
|
||||
bwrite(fd, (genericptr_t) &g.regions[i]->can_leave_f, sizeof(short));
|
||||
bwrite(fd, (genericptr_t) &g.regions[i]->leave_f, sizeof(short));
|
||||
bwrite(fd, (genericptr_t) &g.regions[i]->inside_f, sizeof(short));
|
||||
bwrite(fd, (genericptr_t) &g.regions[i]->player_flags,
|
||||
sizeof(unsigned int));
|
||||
bwrite(fd, (genericptr_t) ®ions[i]->n_monst, sizeof(short));
|
||||
for (j = 0; j < regions[i]->n_monst; j++)
|
||||
bwrite(fd, (genericptr_t) ®ions[i]->monsters[j],
|
||||
bwrite(fd, (genericptr_t) &g.regions[i]->n_monst, sizeof(short));
|
||||
for (j = 0; j < g.regions[i]->n_monst; j++)
|
||||
bwrite(fd, (genericptr_t) &g.regions[i]->monsters[j],
|
||||
sizeof(unsigned));
|
||||
bwrite(fd, (genericptr_t) ®ions[i]->visible, sizeof(boolean));
|
||||
bwrite(fd, (genericptr_t) ®ions[i]->glyph, sizeof(int));
|
||||
bwrite(fd, (genericptr_t) ®ions[i]->arg, sizeof(anything));
|
||||
bwrite(fd, (genericptr_t) &g.regions[i]->visible, sizeof(boolean));
|
||||
bwrite(fd, (genericptr_t) &g.regions[i]->glyph, sizeof(int));
|
||||
bwrite(fd, (genericptr_t) &g.regions[i]->arg, sizeof(anything));
|
||||
}
|
||||
|
||||
skip_lots:
|
||||
@@ -688,79 +684,79 @@ boolean ghostly; /* If a bones file restore */
|
||||
tmstamp = 0;
|
||||
else
|
||||
tmstamp = (g.moves - tmstamp);
|
||||
mread(fd, (genericptr_t) &n_regions, sizeof(n_regions));
|
||||
max_regions = n_regions;
|
||||
if (n_regions > 0)
|
||||
regions = (NhRegion **) alloc(sizeof(NhRegion *) * n_regions);
|
||||
for (i = 0; i < n_regions; i++) {
|
||||
regions[i] = (NhRegion *) alloc(sizeof(NhRegion));
|
||||
mread(fd, (genericptr_t) ®ions[i]->bounding_box, sizeof(NhRect));
|
||||
mread(fd, (genericptr_t) ®ions[i]->nrects, sizeof(short));
|
||||
mread(fd, (genericptr_t) &g.n_regions, sizeof(g.n_regions));
|
||||
g.max_regions = g.n_regions;
|
||||
if (g.n_regions > 0)
|
||||
g.regions = (NhRegion **) alloc(sizeof(NhRegion *) * g.n_regions);
|
||||
for (i = 0; i < g.n_regions; i++) {
|
||||
g.regions[i] = (NhRegion *) alloc(sizeof(NhRegion));
|
||||
mread(fd, (genericptr_t) &g.regions[i]->bounding_box, sizeof(NhRect));
|
||||
mread(fd, (genericptr_t) &g.regions[i]->nrects, sizeof(short));
|
||||
|
||||
if (regions[i]->nrects > 0)
|
||||
regions[i]->rects =
|
||||
(NhRect *) alloc(sizeof(NhRect) * regions[i]->nrects);
|
||||
for (j = 0; j < regions[i]->nrects; j++)
|
||||
mread(fd, (genericptr_t) ®ions[i]->rects[j], sizeof(NhRect));
|
||||
mread(fd, (genericptr_t) ®ions[i]->attach_2_u, sizeof(boolean));
|
||||
mread(fd, (genericptr_t) ®ions[i]->attach_2_m, sizeof(unsigned));
|
||||
if (g.regions[i]->nrects > 0)
|
||||
g.regions[i]->rects =
|
||||
(NhRect *) alloc(sizeof(NhRect) * g.regions[i]->nrects);
|
||||
for (j = 0; j < g.regions[i]->nrects; j++)
|
||||
mread(fd, (genericptr_t) &g.regions[i]->rects[j], sizeof(NhRect));
|
||||
mread(fd, (genericptr_t) &g.regions[i]->attach_2_u, sizeof(boolean));
|
||||
mread(fd, (genericptr_t) &g.regions[i]->attach_2_m, sizeof(unsigned));
|
||||
|
||||
mread(fd, (genericptr_t) &n, sizeof n);
|
||||
if (n > 0) {
|
||||
msg_buf = (char *) alloc(n + 1);
|
||||
mread(fd, (genericptr_t) msg_buf, n);
|
||||
msg_buf[n] = '\0';
|
||||
regions[i]->enter_msg = (const char *) msg_buf;
|
||||
g.regions[i]->enter_msg = (const char *) msg_buf;
|
||||
} else
|
||||
regions[i]->enter_msg = (const char *) 0;
|
||||
g.regions[i]->enter_msg = (const char *) 0;
|
||||
|
||||
mread(fd, (genericptr_t) &n, sizeof n);
|
||||
if (n > 0) {
|
||||
msg_buf = (char *) alloc(n + 1);
|
||||
mread(fd, (genericptr_t) msg_buf, n);
|
||||
msg_buf[n] = '\0';
|
||||
regions[i]->leave_msg = (const char *) msg_buf;
|
||||
g.regions[i]->leave_msg = (const char *) msg_buf;
|
||||
} else
|
||||
regions[i]->leave_msg = (const char *) 0;
|
||||
g.regions[i]->leave_msg = (const char *) 0;
|
||||
|
||||
mread(fd, (genericptr_t) ®ions[i]->ttl, sizeof(long));
|
||||
mread(fd, (genericptr_t) &g.regions[i]->ttl, sizeof(long));
|
||||
/* check for expired region */
|
||||
if (regions[i]->ttl >= 0L)
|
||||
regions[i]->ttl =
|
||||
(regions[i]->ttl > tmstamp) ? regions[i]->ttl - tmstamp : 0L;
|
||||
mread(fd, (genericptr_t) ®ions[i]->expire_f, sizeof(short));
|
||||
mread(fd, (genericptr_t) ®ions[i]->can_enter_f, sizeof(short));
|
||||
mread(fd, (genericptr_t) ®ions[i]->enter_f, sizeof(short));
|
||||
mread(fd, (genericptr_t) ®ions[i]->can_leave_f, sizeof(short));
|
||||
mread(fd, (genericptr_t) ®ions[i]->leave_f, sizeof(short));
|
||||
mread(fd, (genericptr_t) ®ions[i]->inside_f, sizeof(short));
|
||||
mread(fd, (genericptr_t) ®ions[i]->player_flags,
|
||||
if (g.regions[i]->ttl >= 0L)
|
||||
g.regions[i]->ttl =
|
||||
(g.regions[i]->ttl > tmstamp) ? g.regions[i]->ttl - tmstamp : 0L;
|
||||
mread(fd, (genericptr_t) &g.regions[i]->expire_f, sizeof(short));
|
||||
mread(fd, (genericptr_t) &g.regions[i]->can_enter_f, sizeof(short));
|
||||
mread(fd, (genericptr_t) &g.regions[i]->enter_f, sizeof(short));
|
||||
mread(fd, (genericptr_t) &g.regions[i]->can_leave_f, sizeof(short));
|
||||
mread(fd, (genericptr_t) &g.regions[i]->leave_f, sizeof(short));
|
||||
mread(fd, (genericptr_t) &g.regions[i]->inside_f, sizeof(short));
|
||||
mread(fd, (genericptr_t) &g.regions[i]->player_flags,
|
||||
sizeof(unsigned int));
|
||||
if (ghostly) { /* settings pertained to old player */
|
||||
clear_hero_inside(regions[i]);
|
||||
clear_heros_fault(regions[i]);
|
||||
clear_hero_inside(g.regions[i]);
|
||||
clear_heros_fault(g.regions[i]);
|
||||
}
|
||||
mread(fd, (genericptr_t) ®ions[i]->n_monst, sizeof(short));
|
||||
if (regions[i]->n_monst > 0)
|
||||
regions[i]->monsters =
|
||||
(unsigned *) alloc(sizeof(unsigned) * regions[i]->n_monst);
|
||||
mread(fd, (genericptr_t) &g.regions[i]->n_monst, sizeof(short));
|
||||
if (g.regions[i]->n_monst > 0)
|
||||
g.regions[i]->monsters =
|
||||
(unsigned *) alloc(sizeof(unsigned) * g.regions[i]->n_monst);
|
||||
else
|
||||
regions[i]->monsters = (unsigned int *) 0;
|
||||
regions[i]->max_monst = regions[i]->n_monst;
|
||||
for (j = 0; j < regions[i]->n_monst; j++)
|
||||
mread(fd, (genericptr_t) ®ions[i]->monsters[j],
|
||||
g.regions[i]->monsters = (unsigned int *) 0;
|
||||
g.regions[i]->max_monst = g.regions[i]->n_monst;
|
||||
for (j = 0; j < g.regions[i]->n_monst; j++)
|
||||
mread(fd, (genericptr_t) &g.regions[i]->monsters[j],
|
||||
sizeof(unsigned));
|
||||
mread(fd, (genericptr_t) ®ions[i]->visible, sizeof(boolean));
|
||||
mread(fd, (genericptr_t) ®ions[i]->glyph, sizeof(int));
|
||||
mread(fd, (genericptr_t) ®ions[i]->arg, sizeof(anything));
|
||||
mread(fd, (genericptr_t) &g.regions[i]->visible, sizeof(boolean));
|
||||
mread(fd, (genericptr_t) &g.regions[i]->glyph, sizeof(int));
|
||||
mread(fd, (genericptr_t) &g.regions[i]->arg, sizeof(anything));
|
||||
}
|
||||
/* remove expired regions, do not trigger the expire_f callback (yet!);
|
||||
also update monster lists if this data is coming from a bones file */
|
||||
for (i = n_regions - 1; i >= 0; i--)
|
||||
if (regions[i]->ttl == 0L)
|
||||
remove_region(regions[i]);
|
||||
else if (ghostly && regions[i]->n_monst > 0)
|
||||
reset_region_mids(regions[i]);
|
||||
for (i = g.n_regions - 1; i >= 0; i--)
|
||||
if (g.regions[i]->ttl == 0L)
|
||||
remove_region(g.regions[i]);
|
||||
else if (ghostly && g.regions[i]->n_monst > 0)
|
||||
reset_region_mids(g.regions[i]);
|
||||
}
|
||||
|
||||
/* to support '#stats' wizard-mode command */
|
||||
@@ -775,10 +771,10 @@ long *count, *size;
|
||||
|
||||
/* other stats formats take one parameter; this takes two */
|
||||
Sprintf(hdrbuf, hdrfmt, (long) sizeof (NhRegion), (long) sizeof (NhRect));
|
||||
*count = (long) n_regions; /* might be 0 even though max_regions isn't */
|
||||
*size = (long) max_regions * (long) sizeof (NhRegion);
|
||||
for (i = 0; i < n_regions; ++i) {
|
||||
rg = regions[i];
|
||||
*count = (long) g.n_regions; /* might be 0 even though g.max_regions isn't */
|
||||
*size = (long) g.max_regions * (long) sizeof (NhRegion);
|
||||
for (i = 0; i < g.n_regions; ++i) {
|
||||
rg = g.regions[i];
|
||||
*size += (long) rg->nrects * (long) sizeof (NhRect);
|
||||
if (rg->enter_msg)
|
||||
*size += (long) (strlen(rg->enter_msg) + 1);
|
||||
@@ -1056,11 +1052,11 @@ region_danger()
|
||||
{
|
||||
int i, f_indx, n = 0;
|
||||
|
||||
for (i = 0; i < n_regions; i++) {
|
||||
for (i = 0; i < g.n_regions; i++) {
|
||||
/* only care about regions that hero is in */
|
||||
if (!hero_inside(regions[i]))
|
||||
if (!hero_inside(g.regions[i]))
|
||||
continue;
|
||||
f_indx = regions[i]->inside_f;
|
||||
f_indx = g.regions[i]->inside_f;
|
||||
/* the only type of region we understand is gas_cloud */
|
||||
if (f_indx == INSIDE_GAS_CLOUD) {
|
||||
/* completely harmless if you don't need to breathe */
|
||||
@@ -1084,15 +1080,15 @@ region_safety()
|
||||
NhRegion *r = 0;
|
||||
int i, f_indx, n = 0;
|
||||
|
||||
for (i = 0; i < n_regions; i++) {
|
||||
for (i = 0; i < g.n_regions; i++) {
|
||||
/* only care about regions that hero is in */
|
||||
if (!hero_inside(regions[i]))
|
||||
if (!hero_inside(g.regions[i]))
|
||||
continue;
|
||||
f_indx = regions[i]->inside_f;
|
||||
f_indx = g.regions[i]->inside_f;
|
||||
/* the only type of region we understand is gas_cloud */
|
||||
if (f_indx == INSIDE_GAS_CLOUD) {
|
||||
if (!n++ && regions[i]->ttl >= 0)
|
||||
r = regions[i];
|
||||
if (!n++ && g.regions[i]->ttl >= 0)
|
||||
r = g.regions[i];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user