Merge branch 'NetHack-3.6.2-beta01' into NetHack-3.6.2

This commit is contained in:
nhmall
2019-04-13 22:27:32 -04:00
8 changed files with 93 additions and 46 deletions
+4 -4
View File
@@ -4584,7 +4584,7 @@ Allowed colors are {\it black}, {\it red}, {\it green}, {\it brown},
{\it blue}, {\it magenta}, {\it cyan}, {\it gray}, {\it orange}, {\it blue}, {\it magenta}, {\it cyan}, {\it gray}, {\it orange},
{\it light-green}, {\it yellow}, {\it light-blue}, {\it light-magenta}, {\it light-green}, {\it yellow}, {\it light-blue}, {\it light-magenta},
{\it light-cyan}, and {\it white}. {\it light-cyan}, and {\it white}.
And {\itno-color}, the default foreground color, which isn't necessarily And {\it no-color}, the default foreground color, which isn't necessarily
the same as any of the other colors. the same as any of the other colors.
%.lp "" %.lp ""
@@ -4675,9 +4675,9 @@ the hitpoints field to display in the color red if your hitpoints
drop to or below a threshold of 30%:\\ drop to or below a threshold of 30%:\\
\begin{verbatim} \begin{verbatim}
OPTION=hilite_status:hitpoints/<=30%/red/normal OPTION=hilite_status:hitpoints/<=30%/red/normal
\end{verbatim}\\ \end{verbatim}
(That example is actually specifying {\tt red\&normal} for <=30\% (That example is actually specifying {\tt red\&normal} for {\tt <=30\%}
and {\tt no-color\&normal} for >30\%.)\\ and {\tt no-color\&normal} for {\tt >30\%}.)\\
For another example, the following line in your configuration file will cause For another example, the following line in your configuration file will cause
wisdom to be displayed red if it drops and green if it rises:\\ wisdom to be displayed red if it drops and green if it rises:\\
+6 -1
View File
@@ -1,4 +1,4 @@
$NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.300 $ $NHDT-Date: 1554841009 2019/04/09 20:16:49 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.303 $ $NHDT-Date: 1555201701 2019/04/14 00:28:21 $
This fixes36.2 file is here to capture information about updates in the 3.6.x This fixes36.2 file is here to capture information about updates in the 3.6.x
lineage following the release of 3.6.1 in April 2018. Please note, however, lineage following the release of 3.6.1 in April 2018. Please note, however,
@@ -409,6 +409,8 @@ once a status highlight for a temporary rule ('up', 'down', 'changed') timed
if a migrating long worm couldn't be placed, or some other monster was given if a migrating long worm couldn't be placed, or some other monster was given
an existing long worm's place and it couldn't be put somewhere else, an existing long worm's place and it couldn't be put somewhere else,
a "trying to place monster at <0,0>" warning would occur a "trying to place monster at <0,0>" warning would occur
if hero throws a pick-axe into a shop and shopkeeper catches it, shk will say
"get out of my way, scum" even if there's no monster at pick-axe spot
Fixes to Post-3.6.1 Problems that Were Exposed Via git Repository Fixes to Post-3.6.1 Problems that Were Exposed Via git Repository
@@ -465,6 +467,8 @@ when engulfed while in a shop, dropping an item into the engulfer and then
using ':' to look at current location could cause a crash using ':' to look at current location could cause a crash
when items were on the floor just inside a shop's door where the shopkeeper when items were on the floor just inside a shop's door where the shopkeeper
doesn't buy and sell stuff, those items showed a 'for sale' price doesn't buy and sell stuff, those items showed a 'for sale' price
probing a monster inside a shop (including shopkeeper) showed 'for sale'
price for items in monster's minvent
applying a container while inside a shop and initiating a put-in operation applying a container while inside a shop and initiating a put-in operation
would show non-empty containers in inventory--including the one being would show non-empty containers in inventory--including the one being
applied--with "for sale" amounts for the prices of their contents applied--with "for sale" amounts for the prices of their contents
@@ -681,6 +685,7 @@ include isaac64 for pseudo random number generation
core prng and display prng use different contexts core prng and display prng use different contexts
when healing magic other than unicorn horn cures blindness, cure deafness too when healing magic other than unicorn horn cures blindness, cure deafness too
do less status updating when the 'time' option is on do less status updating when the 'time' option is on
slightly more thorough feedback when shop damage is repaired in hero's presence
curses: status display substantially revamped for both horizontal (via curses: status display substantially revamped for both horizontal (via
'align_status:bottom' or 'top') and vertical (via 'align_status:left' 'align_status:bottom' or 'top') and vertical (via 'align_status:left'
or 'right'); 3-line horizontal layout (via 'statuslines:3') added or 'right'); 3-line horizontal layout (via 'statuslines:3') added
+4 -3
View File
@@ -1,4 +1,4 @@
/* NetHack 3.6 extern.h $NHDT-Date: 1554857123 2019/04/10 00:45:23 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.700 $ */ /* NetHack 3.6 extern.h $NHDT-Date: 1555201698 2019/04/14 00:28:18 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.702 $ */
/* Copyright (c) Steve Creps, 1988. */ /* Copyright (c) Steve Creps, 1988. */
/* NetHack may be freely redistributed. See license for details. */ /* NetHack may be freely redistributed. See license for details. */
@@ -1411,7 +1411,7 @@ E void FDECL(mon_to_stone, (struct monst *));
E void FDECL(m_into_limbo, (struct monst *)); E void FDECL(m_into_limbo, (struct monst *));
E void FDECL(mnexto, (struct monst *)); E void FDECL(mnexto, (struct monst *));
E void FDECL(maybe_mnexto, (struct monst *)); E void FDECL(maybe_mnexto, (struct monst *));
E boolean FDECL(mnearto, (struct monst *, XCHAR_P, XCHAR_P, BOOLEAN_P)); E int FDECL(mnearto, (struct monst *, XCHAR_P, XCHAR_P, BOOLEAN_P));
E void FDECL(m_respond, (struct monst *)); E void FDECL(m_respond, (struct monst *));
E void FDECL(setmangry, (struct monst *, BOOLEAN_P)); E void FDECL(setmangry, (struct monst *, BOOLEAN_P));
E void FDECL(wakeup, (struct monst *, BOOLEAN_P)); E void FDECL(wakeup, (struct monst *, BOOLEAN_P));
@@ -2247,7 +2247,8 @@ E void FDECL(sellobj, (struct obj *, XCHAR_P, XCHAR_P));
E int FDECL(doinvbill, (int)); E int FDECL(doinvbill, (int));
E struct monst *FDECL(shkcatch, (struct obj *, XCHAR_P, XCHAR_P)); E struct monst *FDECL(shkcatch, (struct obj *, XCHAR_P, XCHAR_P));
E void FDECL(add_damage, (XCHAR_P, XCHAR_P, long)); E void FDECL(add_damage, (XCHAR_P, XCHAR_P, long));
E int FDECL(repair_damage, (struct monst *, struct damage *, BOOLEAN_P)); E int FDECL(repair_damage, (struct monst *, struct damage *, int *,
BOOLEAN_P));
E int FDECL(shk_move, (struct monst *)); E int FDECL(shk_move, (struct monst *));
E void FDECL(after_shk_move, (struct monst *)); E void FDECL(after_shk_move, (struct monst *));
E boolean FDECL(is_fshk, (struct monst *)); E boolean FDECL(is_fshk, (struct monst *));
+7 -2
View File
@@ -1,4 +1,4 @@
/* NetHack 3.6 invent.c $NHDT-Date: 1549075239 2019/02/02 02:40:39 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.252 $ */ /* NetHack 3.6 invent.c $NHDT-Date: 1555196229 2019/04/13 22:57:09 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.253 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/*-Copyright (c) Derek S. Ray, 2015. */ /*-Copyright (c) Derek S. Ray, 2015. */
/* NetHack may be freely redistributed. See license for details. */ /* NetHack may be freely redistributed. See license for details. */
@@ -4303,12 +4303,17 @@ char *title;
* displaying 'weapon in claw', etc. properly. * displaying 'weapon in claw', etc. properly.
*/ */
youmonst.data = mon->data; youmonst.data = mon->data;
/* in case inside a shop, don't append "for sale" prices */
iflags.suppress_price++;
n = query_objlist(title ? title : tmp, &(mon->minvent), n = query_objlist(title ? title : tmp, &(mon->minvent),
(INVORDER_SORT | (incl_hero ? INCLUDE_HERO : 0)), (INVORDER_SORT | (incl_hero ? INCLUDE_HERO : 0)),
&selected, pickings, &selected, pickings,
do_all ? allow_all : worn_wield_only); do_all ? allow_all : worn_wield_only);
set_uasmon();
iflags.suppress_price--;
/* was 'set_uasmon();' but that potentially has side-effects */
youmonst.data = &mons[u.umonnum]; /* most basic part of set_uasmon */
} else { } else {
invdisp_nothing(title ? title : tmp, "(none)"); invdisp_nothing(title ? title : tmp, "(none)");
n = 0; n = 0;
+2 -1
View File
@@ -1,4 +1,4 @@
/* NetHack 3.6 mkmaze.c $NHDT-Date: 1543185071 2018/11/25 22:31:11 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.67 $ */ /* NetHack 3.6 mkmaze.c $NHDT-Date: 1555022325 2019/04/11 22:38:45 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.68 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/*-Copyright (c) Pasi Kallinen, 2018. */ /*-Copyright (c) Pasi Kallinen, 2018. */
/* NetHack may be freely redistributed. See license for details. */ /* NetHack may be freely redistributed. See license for details. */
@@ -1878,6 +1878,7 @@ boolean ini;
case CONS_MON: { case CONS_MON: {
struct monst *mon = (struct monst *) cons->list; struct monst *mon = (struct monst *) cons->list;
(void) mnearto(mon, cons->x, cons->y, TRUE); (void) mnearto(mon, cons->x, cons->y, TRUE);
break; break;
} }
+18 -17
View File
@@ -1,4 +1,4 @@
/* NetHack 3.6 mon.c $NHDT-Date: 1554580625 2019/04/06 19:57:05 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.280 $ */ /* NetHack 3.6 mon.c $NHDT-Date: 1555022326 2019/04/11 22:38:46 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.281 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/*-Copyright (c) Derek S. Ray, 2015. */ /*-Copyright (c) Derek S. Ray, 2015. */
/* NetHack may be freely redistributed. See license for details. */ /* NetHack may be freely redistributed. See license for details. */
@@ -2636,10 +2636,15 @@ struct monst *mtmp;
/* mnearto() /* mnearto()
* Put monster near (or at) location if possible. * Put monster near (or at) location if possible.
* Returns: * Returns:
* true if relocation was successful * 2 if another monster was moved out of this one's way;
* false otherwise * 1 if relocation was successful (without moving another one);
* 0 otherwise.
* Note: if already at the target spot, result is 1 rather than 0.
*
* Might be called recursively if 'move_other' is True; if so, that argument
* will be False on the nested call so there won't be any further recursion.
*/ */
boolean int
mnearto(mtmp, x, y, move_other) mnearto(mtmp, x, y, move_other)
register struct monst *mtmp; register struct monst *mtmp;
xchar x, y; xchar x, y;
@@ -2648,15 +2653,18 @@ boolean move_other; /* make sure mtmp gets to x, y! so move m_at(x, y) */
struct monst *othermon = (struct monst *) 0; struct monst *othermon = (struct monst *) 0;
xchar newx, newy; xchar newx, newy;
coord mm; coord mm;
int res = 1;
if (mtmp->mx == x && mtmp->my == y && m_at(x, y) == mtmp) if (mtmp->mx == x && mtmp->my == y && m_at(x, y) == mtmp)
return TRUE; return res;
if (move_other && (othermon = m_at(x, y)) != 0) { if (move_other && (othermon = m_at(x, y)) != 0) {
if (othermon->wormno) if (othermon->wormno)
remove_worm(othermon); remove_worm(othermon);
else else
remove_monster(x, y); remove_monster(x, y);
othermon->mx = othermon->my = 0; /* 'othermon' is not on the map */
} }
newx = x; newx = x;
@@ -2667,28 +2675,21 @@ boolean move_other; /* make sure mtmp gets to x, y! so move m_at(x, y) */
* no end of trouble. * no end of trouble.
*/ */
if (!enexto(&mm, newx, newy, mtmp->data)) if (!enexto(&mm, newx, newy, mtmp->data))
return FALSE; return 0;
if (!isok(mm.x, mm.y)) if (!isok(mm.x, mm.y))
return FALSE; return 0;
newx = mm.x; newx = mm.x;
newy = mm.y; newy = mm.y;
} }
rloc_to(mtmp, newx, newy); rloc_to(mtmp, newx, newy);
if (move_other && othermon) { if (move_other && othermon) {
xchar oldx = othermon->mx, oldy = othermon->my; res = 2; /* moving another monster out of the way */
if (!mnearto(othermon, x, y, FALSE)) /* no 'move_other' this time */
othermon->mx = othermon->my = 0;
(void) mnearto(othermon, x, y, FALSE);
if (othermon->mx == 0 && othermon->my == 0) {
/* reloc failed */
othermon->mx = oldx;
othermon->my = oldy;
m_into_limbo(othermon); m_into_limbo(othermon);
}
} }
return TRUE; return res;
} }
/* monster responds to player action; not the same as a passive attack; /* monster responds to player action; not the same as a passive attack;
+2 -2
View File
@@ -1,4 +1,4 @@
/* NetHack 3.6 restore.c $NHDT-Date: 1543972193 2018/12/05 01:09:53 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.128 $ */ /* NetHack 3.6 restore.c $NHDT-Date: 1555201698 2019/04/14 00:28:18 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.129 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/*-Copyright (c) Michael Allison, 2009. */ /*-Copyright (c) Michael Allison, 2009. */
/* NetHack may be freely redistributed. See license for details. */ /* NetHack may be freely redistributed. See license for details. */
@@ -192,7 +192,7 @@ boolean ghostly;
struct monst *shkp = shop_keeper(*shp); struct monst *shkp = shop_keeper(*shp);
if (shkp && inhishop(shkp) if (shkp && inhishop(shkp)
&& repair_damage(shkp, tmp_dam, TRUE)) && repair_damage(shkp, tmp_dam, (int *) 0, TRUE))
break; break;
} }
} }
+50 -16
View File
@@ -1,4 +1,4 @@
/* NetHack 3.6 shk.c $NHDT-Date: 1551738135 2019/03/04 22:22:15 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.157 $ */ /* NetHack 3.6 shk.c $NHDT-Date: 1555201699 2019/04/14 00:28:19 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.159 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/*-Copyright (c) Robert Patrick Rankin, 2012. */ /*-Copyright (c) Robert Patrick Rankin, 2012. */
/* NetHack may be freely redistributed. See license for details. */ /* NetHack may be freely redistributed. See license for details. */
@@ -3397,7 +3397,7 @@ register xchar x, y;
&& dist2(shkp->mx, shkp->my, x, y) < 3 && dist2(shkp->mx, shkp->my, x, y) < 3
/* if it is the shk's pos, you hit and anger him */ /* if it is the shk's pos, you hit and anger him */
&& (shkp->mx != x || shkp->my != y)) { && (shkp->mx != x || shkp->my != y)) {
if (mnearto(shkp, x, y, TRUE) && !Deaf && !muteshk(shkp)) if (mnearto(shkp, x, y, TRUE) == 2 && !Deaf && !muteshk(shkp))
verbalize("Out of my way, scum!"); verbalize("Out of my way, scum!");
if (cansee(x, y)) { if (cansee(x, y)) {
pline("%s nimbly%s catches %s.", Shknam(shkp), pline("%s nimbly%s catches %s.", Shknam(shkp),
@@ -3469,11 +3469,13 @@ struct monst *shkp;
boolean croaked; boolean croaked;
{ {
struct damage *tmp_dam, *tmp2_dam; struct damage *tmp_dam, *tmp2_dam;
struct obj *shk_inv = shkp->minvent;
boolean did_repair = FALSE, saw_door = FALSE, saw_floor = FALSE, boolean did_repair = FALSE, saw_door = FALSE, saw_floor = FALSE,
stop_picking = FALSE, doorway_trap = FALSE; stop_picking = FALSE, doorway_trap = FALSE, skip_msg = FALSE;
int saw_walls = 0, saw_untrap = 0; int saw_walls = 0, saw_untrap = 0, feedback;
char trapmsg[BUFSZ]; char trapmsg[BUFSZ];
feedback = !croaked; /* 1 => give feedback, 0 => don't or already did */
tmp_dam = level.damagelist; tmp_dam = level.damagelist;
tmp2_dam = 0; tmp2_dam = 0;
while (tmp_dam) { while (tmp_dam) {
@@ -3491,12 +3493,12 @@ boolean croaked;
if (croaked) { if (croaked) {
disposition = (shops[1]) ? 0 : 1; disposition = (shops[1]) ? 0 : 1;
} else if (stop_picking) { } else if (stop_picking) {
disposition = repair_damage(shkp, tmp_dam, FALSE); disposition = repair_damage(shkp, tmp_dam, &feedback, FALSE);
} else { } else {
/* Defer the stop_occupation() until after repair msgs */ /* Defer the stop_occupation() until after repair msgs */
if (closed_door(x, y)) if (closed_door(x, y))
stop_picking = picking_at(x, y); stop_picking = picking_at(x, y);
disposition = repair_damage(shkp, tmp_dam, FALSE); disposition = repair_damage(shkp, tmp_dam, &feedback, FALSE);
if (!disposition) if (!disposition)
stop_picking = FALSE; stop_picking = FALSE;
} }
@@ -3539,7 +3541,16 @@ boolean croaked;
if (!did_repair) if (!did_repair)
return; return;
if (saw_untrap) { trapmsg[0] = '\0'; /* not just lint suppression... */
shk_inv = (shkp->minvent != shk_inv) ? shkp->minvent : 0;
if (saw_untrap == 1 && shk_inv
&& (shk_inv->otyp == BEARTRAP || shk_inv->otyp == LAND_MINE)
&& canseemon(shkp)) {
pline("%s untraps %s.", Shknam(shkp), ansimpleoname(shk_inv));
/* we've already reported this trap (and know it's the only one) */
saw_untrap = 0;
skip_msg = !(saw_walls || saw_door || saw_floor);
} else if (saw_untrap) {
Sprintf(trapmsg, "%s trap%s", Sprintf(trapmsg, "%s trap%s",
(saw_untrap > 3) ? "several" : (saw_untrap > 1) ? "some" (saw_untrap > 3) ? "several" : (saw_untrap > 1) ? "some"
: "a", : "a",
@@ -3547,10 +3558,11 @@ boolean croaked;
Sprintf(eos(trapmsg), " %s", vtense(trapmsg, "are")); Sprintf(eos(trapmsg), " %s", vtense(trapmsg, "are"));
Sprintf(eos(trapmsg), " removed from the %s", Sprintf(eos(trapmsg), " removed from the %s",
(doorway_trap && saw_untrap == 1) ? "doorway" : "floor"); (doorway_trap && saw_untrap == 1) ? "doorway" : "floor");
} else }
trapmsg[0] = '\0'; /* not just lint suppression... */
if (saw_walls) { if (skip_msg) {
; /* already gave an untrap message which covered the only repair */
} else if (saw_walls) {
char wallbuf[BUFSZ]; char wallbuf[BUFSZ];
Sprintf(wallbuf, "section%s", plur(saw_walls)); Sprintf(wallbuf, "section%s", plur(saw_walls));
@@ -3572,6 +3584,10 @@ boolean croaked;
saw_floor ? "the floor damage is gone" : "", saw_floor ? "the floor damage is gone" : "",
((saw_door || saw_floor) && *trapmsg) ? " and " : "", ((saw_door || saw_floor) && *trapmsg) ? " and " : "",
trapmsg); trapmsg);
/* FIXME:
* these messages aren't right if the unseen repairs were only
* for trap removal (except for hole and possibly trap door).
*/
else if (inside_shop(u.ux, u.uy) == ESHK(shkp)->shoproom) else if (inside_shop(u.ux, u.uy) == ESHK(shkp)->shoproom)
You_feel("more claustrophobic than before."); You_feel("more claustrophobic than before.");
else if (!Deaf && !rn2(10)) else if (!Deaf && !rn2(10))
@@ -3586,9 +3602,10 @@ boolean croaked;
* 3: untrap * 3: untrap
*/ */
int int
repair_damage(shkp, tmp_dam, catchup) repair_damage(shkp, tmp_dam, once, catchup)
struct monst *shkp; struct monst *shkp;
struct damage *tmp_dam; struct damage *tmp_dam;
int *once;
boolean catchup; /* restoring a level */ boolean catchup; /* restoring a level */
{ {
xchar x, y; xchar x, y;
@@ -3607,13 +3624,30 @@ boolean catchup; /* restoring a level */
if (!IS_ROOM(tmp_dam->typ)) { if (!IS_ROOM(tmp_dam->typ)) {
if ((x == u.ux && y == u.uy && !Passes_walls) if ((x == u.ux && y == u.uy && !Passes_walls)
|| (x == shkp->mx && y == shkp->my) || (x == shkp->mx && y == shkp->my)
|| ((mtmp = m_at(x, y)) && !passes_walls(mtmp->data))) || ((mtmp = m_at(x, y)) != 0 && !passes_walls(mtmp->data)))
return 0; return 0;
} }
if ((ttmp = t_at(x, y)) != 0) { ttmp = t_at(x, y);
if (x == u.ux && y == u.uy && !Passes_walls) if (ttmp && x == u.ux && y == u.uy && !Passes_walls)
return 0; return 0;
if (ttmp->ttyp == LANDMINE || ttmp->ttyp == BEAR_TRAP) {
if (once && *once) {
boolean shk_closeby = (distu(shkp->mx, shkp->my)
<= (BOLT_LIM / 2) * (BOLT_LIM / 2));
/* this is suboptimal if we eventually give a "shk untraps"
message for the only repair, but perhaps the shop repair
incantation means that shk's untrap attempt will never fail */
if (canseemon(shkp))
pline("%s whispers %s.", Shknam(shkp),
shk_closeby ? "an incantation" : "something");
else if (!Deaf && shk_closeby)
You_hear("someone muttering an incantation.");
*once = 0;
}
if (ttmp) {
if ((ttmp->ttyp == LANDMINE || ttmp->ttyp == BEAR_TRAP)
&& dist2(x, y, shkp->mx, shkp->my) <= 2) {
/* convert to an object */ /* convert to an object */
otmp = mksobj((ttmp->ttyp == LANDMINE) ? LAND_MINE : BEARTRAP, otmp = mksobj((ttmp->ttyp == LANDMINE) ? LAND_MINE : BEARTRAP,
TRUE, FALSE); TRUE, FALSE);