Merge branch 'NetHack-3.6'
This commit is contained in:
94
src/region.c
94
src/region.c
@@ -1,4 +1,4 @@
|
||||
/* NetHack 3.6 region.c $NHDT-Date: 1543455828 2018/11/29 01:43:48 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.43 $ */
|
||||
/* NetHack 3.6 region.c $NHDT-Date: 1573933605 2019/11/16 19:46:45 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.44 $ */
|
||||
/* Copyright (c) 1996 by Jean-Christophe Collet */
|
||||
/* NetHack may be freely redistributed. See license for details. */
|
||||
|
||||
@@ -428,24 +428,25 @@ xchar x, y;
|
||||
{
|
||||
int i, f_indx;
|
||||
|
||||
/* First check if we can do the move */
|
||||
/* First check if hero can do the move */
|
||||
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(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;
|
||||
if (g.regions[i]->attach_2_u)
|
||||
continue;
|
||||
if (inside_region(g.regions[i], x, y)
|
||||
? (!hero_inside(g.regions[i])
|
||||
&& (f_indx = g.regions[i]->can_enter_f) != NO_CALLBACK)
|
||||
: (hero_inside(g.regions[i])
|
||||
&& (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 < g.n_regions; i++)
|
||||
if (hero_inside(g.regions[i]) && !g.regions[i]->attach_2_u
|
||||
/* Callbacks for the regions hero does leave */
|
||||
for (i = 0; i < g.n_regions; i++) {
|
||||
if (g.regions[i]->attach_2_u)
|
||||
continue;
|
||||
if (hero_inside(g.regions[i])
|
||||
&& !inside_region(g.regions[i], x, y)) {
|
||||
clear_hero_inside(g.regions[i]);
|
||||
if (g.regions[i]->leave_msg != (const char *) 0)
|
||||
@@ -453,10 +454,13 @@ xchar x, y;
|
||||
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 < g.n_regions; i++)
|
||||
if (!hero_inside(g.regions[i]) && !g.regions[i]->attach_2_u
|
||||
/* Callbacks for the regions hero does enter */
|
||||
for (i = 0; i < g.n_regions; i++) {
|
||||
if (g.regions[i]->attach_2_u)
|
||||
continue;
|
||||
if (!hero_inside(g.regions[i])
|
||||
&& inside_region(g.regions[i], x, y)) {
|
||||
set_hero_inside(g.regions[i]);
|
||||
if (g.regions[i]->enter_msg != (const char *) 0)
|
||||
@@ -464,12 +468,14 @@ xchar x, y;
|
||||
if ((f_indx = g.regions[i]->enter_f) != NO_CALLBACK)
|
||||
(void) (*callbacks[f_indx])(g.regions[i], (genericptr_t) 0);
|
||||
}
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/*
|
||||
* check whether a monster enters/leaves one or more region.
|
||||
*/
|
||||
* check whether a monster enters/leaves one or more regions.
|
||||
*/
|
||||
boolean
|
||||
m_in_out_region(mon, x, y)
|
||||
struct monst *mon;
|
||||
@@ -477,40 +483,44 @@ xchar x, y;
|
||||
{
|
||||
int i, f_indx;
|
||||
|
||||
/* First check if we can do the move */
|
||||
/* First check if mon can do the move */
|
||||
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(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;
|
||||
if (g.regions[i]->attach_2_m == mon->m_id)
|
||||
continue;
|
||||
if (inside_region(g.regions[i], x, y)
|
||||
? (!mon_in_region(g.regions[i], mon)
|
||||
&& (f_indx = g.regions[i]->can_enter_f) != NO_CALLBACK)
|
||||
: (mon_in_region(g.regions[i], mon)
|
||||
&& (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 < g.n_regions; i++)
|
||||
/* Callbacks for the regions mon does leave */
|
||||
for (i = 0; i < g.n_regions; i++) {
|
||||
if (g.regions[i]->attach_2_m == mon->m_id)
|
||||
continue;
|
||||
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 < g.n_regions; i++)
|
||||
if (!hero_inside(g.regions[i]) && !g.regions[i]->attach_2_u
|
||||
/* Callbacks for the regions mon does enter */
|
||||
for (i = 0; i < g.n_regions; i++) {
|
||||
if (g.regions[i]->attach_2_m == mon->m_id)
|
||||
continue;
|
||||
if (!mon_in_region(g.regions[i], mon)
|
||||
&& 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;
|
||||
}
|
||||
|
||||
@@ -596,10 +606,12 @@ xchar x, y;
|
||||
{
|
||||
register int 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)
|
||||
for (i = 0; i < g.n_regions; i++) {
|
||||
if (!g.regions[i]->visible || g.regions[i]->ttl == -2L)
|
||||
continue;
|
||||
if (inside_region(g.regions[i], x, y))
|
||||
return g.regions[i];
|
||||
}
|
||||
return (NhRegion *) 0;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user