Split kicking non-door terrain out of dokick
This commit is contained in:
570
src/dokick.c
570
src/dokick.c
@@ -23,6 +23,7 @@ static boolean watchman_door_damage(struct monst *,
|
|||||||
static void kick_dumb(coordxy, coordxy);
|
static void kick_dumb(coordxy, coordxy);
|
||||||
static void kick_ouch(coordxy, coordxy, const char *) NONNULLARG3;
|
static void kick_ouch(coordxy, coordxy, const char *) NONNULLARG3;
|
||||||
static void kick_door(coordxy, coordxy, int);
|
static void kick_door(coordxy, coordxy, int);
|
||||||
|
static int kick_nondoor(coordxy, coordxy, int);
|
||||||
static void otransit_msg(struct obj *, boolean, boolean, long);
|
static void otransit_msg(struct obj *, boolean, boolean, long);
|
||||||
static void drop_to(coord *, schar, coordxy, coordxy) NONNULLARG1;
|
static void drop_to(coord *, schar, coordxy, coordxy) NONNULLARG1;
|
||||||
|
|
||||||
@@ -897,6 +898,7 @@ kick_ouch(coordxy x, coordxy y, const char *kickobjnam)
|
|||||||
hurtle(-u.dx, -u.dy, rn1(2, 4), TRUE); /* assume it's heavy */
|
hurtle(-u.dx, -u.dy, rn1(2, 4), TRUE); /* assume it's heavy */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* kick a door */
|
||||||
static void
|
static void
|
||||||
kick_door(coordxy x, coordxy y, int avrg_attrib)
|
kick_door(coordxy x, coordxy y, int avrg_attrib)
|
||||||
{
|
{
|
||||||
@@ -955,6 +957,289 @@ kick_door(coordxy x, coordxy y, int avrg_attrib)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* kick non-door terrain */
|
||||||
|
static int
|
||||||
|
kick_nondoor(coordxy x, coordxy y, int avrg_attrib)
|
||||||
|
{
|
||||||
|
if (gm.maploc->typ == SDOOR) {
|
||||||
|
if (!Levitation && rn2(30) < avrg_attrib) {
|
||||||
|
cvt_sdoor_to_door(gm.maploc); /* ->typ = DOOR */
|
||||||
|
Soundeffect(se_crash_door, 40);
|
||||||
|
pline("Crash! %s a secret door!",
|
||||||
|
/* don't "kick open" when it's locked
|
||||||
|
unless it also happens to be trapped */
|
||||||
|
((gm.maploc->doormask & (D_LOCKED | D_TRAPPED))
|
||||||
|
== D_LOCKED) ? "Your kick uncovers" : "You kick open");
|
||||||
|
exercise(A_DEX, TRUE);
|
||||||
|
if (gm.maploc->doormask & D_TRAPPED) {
|
||||||
|
gm.maploc->doormask = D_NODOOR;
|
||||||
|
b_trapped("door", FOOT);
|
||||||
|
} else if (gm.maploc->doormask != D_NODOOR
|
||||||
|
&& !(gm.maploc->doormask & D_LOCKED))
|
||||||
|
gm.maploc->doormask = D_ISOPEN;
|
||||||
|
feel_newsym(x, y); /* we know it's gone */
|
||||||
|
if (gm.maploc->doormask == D_ISOPEN
|
||||||
|
|| gm.maploc->doormask == D_NODOOR)
|
||||||
|
unblock_point(x, y); /* vision */
|
||||||
|
return ECMD_TIME;
|
||||||
|
} else {
|
||||||
|
kick_ouch(x, y, "");
|
||||||
|
return ECMD_TIME;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (gm.maploc->typ == SCORR) {
|
||||||
|
if (!Levitation && rn2(30) < avrg_attrib) {
|
||||||
|
Soundeffect(se_crash_door, 40);
|
||||||
|
pline("Crash! You kick open a secret passage!");
|
||||||
|
exercise(A_DEX, TRUE);
|
||||||
|
gm.maploc->typ = CORR;
|
||||||
|
feel_newsym(x, y); /* we know it's gone */
|
||||||
|
unblock_point(x, y); /* vision */
|
||||||
|
return ECMD_TIME;
|
||||||
|
} else {
|
||||||
|
kick_ouch(x, y, "");
|
||||||
|
return ECMD_TIME;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (IS_THRONE(gm.maploc->typ)) {
|
||||||
|
register int i;
|
||||||
|
if (Levitation) {
|
||||||
|
kick_dumb(x, y);
|
||||||
|
return ECMD_TIME;
|
||||||
|
}
|
||||||
|
if ((Luck < 0 || gm.maploc->looted) && !rn2(3)) {
|
||||||
|
gm.maploc->looted = 0; /* don't leave loose ends.. */
|
||||||
|
gm.maploc->typ = ROOM;
|
||||||
|
(void) mkgold((long) rnd(200), x, y);
|
||||||
|
Soundeffect(se_crash_throne_destroyed, 60);
|
||||||
|
if (Blind)
|
||||||
|
pline("CRASH! You destroy it.");
|
||||||
|
else {
|
||||||
|
pline("CRASH! You destroy the throne.");
|
||||||
|
newsym(x, y);
|
||||||
|
}
|
||||||
|
exercise(A_DEX, TRUE);
|
||||||
|
return ECMD_TIME;
|
||||||
|
} else if (Luck > 0 && !rn2(3) && !gm.maploc->looted) {
|
||||||
|
(void) mkgold((long) rn1(201, 300), x, y);
|
||||||
|
i = Luck + 1;
|
||||||
|
if (i > 6)
|
||||||
|
i = 6;
|
||||||
|
while (i--)
|
||||||
|
(void) mksobj_at(
|
||||||
|
rnd_class(DILITHIUM_CRYSTAL, LUCKSTONE - 1), x, y,
|
||||||
|
FALSE, TRUE);
|
||||||
|
if (Blind)
|
||||||
|
You("kick %s loose!", something);
|
||||||
|
else {
|
||||||
|
You("kick loose some ornamental coins and gems!");
|
||||||
|
newsym(x, y);
|
||||||
|
}
|
||||||
|
/* prevent endless milking */
|
||||||
|
gm.maploc->looted = T_LOOTED;
|
||||||
|
return ECMD_TIME;
|
||||||
|
} else if (!rn2(4)) {
|
||||||
|
if (dunlev(&u.uz) < dunlevs_in_dungeon(&u.uz)) {
|
||||||
|
fall_through(FALSE, 0);
|
||||||
|
return ECMD_TIME;
|
||||||
|
} else {
|
||||||
|
kick_ouch(x, y, "");
|
||||||
|
return ECMD_TIME;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
kick_ouch(x, y, "");
|
||||||
|
return ECMD_TIME;
|
||||||
|
}
|
||||||
|
if (IS_ALTAR(gm.maploc->typ)) {
|
||||||
|
if (Levitation) {
|
||||||
|
kick_dumb(x, y);
|
||||||
|
return ECMD_TIME;
|
||||||
|
}
|
||||||
|
You("kick %s.", (Blind ? something : "the altar"));
|
||||||
|
altar_wrath(x, y);
|
||||||
|
if (!rn2(3)) {
|
||||||
|
kick_ouch(x, y, "");
|
||||||
|
return ECMD_TIME;
|
||||||
|
}
|
||||||
|
exercise(A_DEX, TRUE);
|
||||||
|
return ECMD_TIME;
|
||||||
|
}
|
||||||
|
if (IS_FOUNTAIN(gm.maploc->typ)) {
|
||||||
|
if (Levitation) {
|
||||||
|
kick_dumb(x, y);
|
||||||
|
return ECMD_TIME;
|
||||||
|
}
|
||||||
|
You("kick %s.", (Blind ? something : "the fountain"));
|
||||||
|
if (!rn2(3)) {
|
||||||
|
kick_ouch(x, y, "");
|
||||||
|
return ECMD_TIME;
|
||||||
|
}
|
||||||
|
/* make metal boots rust */
|
||||||
|
if (uarmf && rn2(3))
|
||||||
|
if (water_damage(uarmf, "metal boots", TRUE) == ER_NOTHING) {
|
||||||
|
Your("boots get wet.");
|
||||||
|
/* could cause short-lived fumbling here */
|
||||||
|
}
|
||||||
|
exercise(A_DEX, TRUE);
|
||||||
|
return ECMD_TIME;
|
||||||
|
}
|
||||||
|
if (IS_GRAVE(gm.maploc->typ)) {
|
||||||
|
if (Levitation) {
|
||||||
|
kick_dumb(x, y);
|
||||||
|
} else if (rn2(4)) {
|
||||||
|
/* minor injury */
|
||||||
|
kick_ouch(x, y, "");
|
||||||
|
} else if (!gm.maploc->disturbed && !rn2(2)) {
|
||||||
|
/* disturb the grave: summon a ghoul (once only), same as
|
||||||
|
when engraving */
|
||||||
|
disturb_grave(x, y);
|
||||||
|
} else {
|
||||||
|
/* destroy the headstone, implicitly destroying any
|
||||||
|
not-yet-created contents (including zombie or mummy);
|
||||||
|
any already created contents will still be buried here */
|
||||||
|
exercise(A_WIS, FALSE);
|
||||||
|
if (Role_if(PM_ARCHEOLOGIST) || Role_if(PM_SAMURAI)
|
||||||
|
|| (u.ualign.type == A_LAWFUL && u.ualign.record > -10))
|
||||||
|
adjalign(-sgn(u.ualign.type));
|
||||||
|
gm.maploc->typ = ROOM;
|
||||||
|
gm.maploc->emptygrave = 0; /* clear 'flags' */
|
||||||
|
gm.maploc->disturbed = 0; /* clear 'horizontal' */
|
||||||
|
(void) mksobj_at(ROCK, x, y, TRUE, FALSE);
|
||||||
|
del_engr_at(x, y);
|
||||||
|
if (Blind) {
|
||||||
|
/* [feel this happen if Deaf?] */
|
||||||
|
pline("Crack! %s broke!", Something);
|
||||||
|
} else {
|
||||||
|
pline_The("headstone topples over and breaks!");
|
||||||
|
newsym(x, y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ECMD_TIME;
|
||||||
|
}
|
||||||
|
if (gm.maploc->typ == IRONBARS) {
|
||||||
|
kick_ouch(x, y, "");
|
||||||
|
return ECMD_TIME;
|
||||||
|
}
|
||||||
|
if (IS_TREE(gm.maploc->typ)) {
|
||||||
|
struct obj *treefruit;
|
||||||
|
|
||||||
|
/* nothing, fruit or trouble? 75:23.5:1.5% */
|
||||||
|
if (rn2(3)) {
|
||||||
|
if (!rn2(6) && !(gm.mvitals[PM_KILLER_BEE].mvflags & G_GONE))
|
||||||
|
You_hear("a low buzzing."); /* a warning */
|
||||||
|
kick_ouch(x, y, "");
|
||||||
|
return ECMD_TIME;
|
||||||
|
}
|
||||||
|
if (rn2(15) && !(gm.maploc->looted & TREE_LOOTED)
|
||||||
|
&& (treefruit = rnd_treefruit_at(x, y))) {
|
||||||
|
long nfruit = 8L - rnl(7), nfall;
|
||||||
|
short frtype = treefruit->otyp;
|
||||||
|
|
||||||
|
treefruit->quan = nfruit;
|
||||||
|
treefruit->owt = weight(treefruit);
|
||||||
|
if (is_plural(treefruit))
|
||||||
|
pline("Some %s fall from the tree!", xname(treefruit));
|
||||||
|
else
|
||||||
|
pline("%s falls from the tree!", An(xname(treefruit)));
|
||||||
|
nfall = scatter(x, y, 2, MAY_HIT, treefruit);
|
||||||
|
if (nfall != nfruit) {
|
||||||
|
/* scatter left some in the tree, but treefruit
|
||||||
|
* may not refer to the correct object */
|
||||||
|
treefruit = mksobj(frtype, TRUE, FALSE);
|
||||||
|
treefruit->quan = nfruit - nfall;
|
||||||
|
pline("%ld %s got caught in the branches.",
|
||||||
|
nfruit - nfall, xname(treefruit));
|
||||||
|
dealloc_obj(treefruit);
|
||||||
|
}
|
||||||
|
exercise(A_DEX, TRUE);
|
||||||
|
exercise(A_WIS, TRUE); /* discovered a new food source! */
|
||||||
|
newsym(x, y);
|
||||||
|
gm.maploc->looted |= TREE_LOOTED;
|
||||||
|
return ECMD_TIME;
|
||||||
|
} else if (!(gm.maploc->looted & TREE_SWARM)) {
|
||||||
|
int cnt = rnl(4) + 2;
|
||||||
|
int made = 0;
|
||||||
|
coord mm;
|
||||||
|
|
||||||
|
mm.x = x;
|
||||||
|
mm.y = y;
|
||||||
|
while (cnt--) {
|
||||||
|
if (enexto(&mm, mm.x, mm.y, &mons[PM_KILLER_BEE])
|
||||||
|
&& makemon(&mons[PM_KILLER_BEE], mm.x, mm.y,
|
||||||
|
MM_ANGRY|MM_NOMSG))
|
||||||
|
made++;
|
||||||
|
}
|
||||||
|
if (made)
|
||||||
|
pline("You've attracted the tree's former occupants!");
|
||||||
|
else
|
||||||
|
You("smell stale honey.");
|
||||||
|
gm.maploc->looted |= TREE_SWARM;
|
||||||
|
return ECMD_TIME;
|
||||||
|
}
|
||||||
|
kick_ouch(x, y, "");
|
||||||
|
return ECMD_TIME;
|
||||||
|
}
|
||||||
|
if (IS_SINK(gm.maploc->typ)) {
|
||||||
|
int gend = poly_gender();
|
||||||
|
|
||||||
|
if (Levitation) {
|
||||||
|
kick_dumb(x, y);
|
||||||
|
return ECMD_TIME;
|
||||||
|
}
|
||||||
|
if (rn2(5)) {
|
||||||
|
Soundeffect(se_klunk_pipe, 60);
|
||||||
|
if (!Deaf)
|
||||||
|
pline("Klunk! The pipes vibrate noisily.");
|
||||||
|
else
|
||||||
|
pline("Klunk!");
|
||||||
|
exercise(A_DEX, TRUE);
|
||||||
|
return ECMD_TIME;
|
||||||
|
} else if (!(gm.maploc->looted & S_LPUDDING) && !rn2(3)
|
||||||
|
&& !(gm.mvitals[PM_BLACK_PUDDING].mvflags & G_GONE)) {
|
||||||
|
Soundeffect(se_gushing_sound, 100);
|
||||||
|
if (Blind) {
|
||||||
|
if (!Deaf)
|
||||||
|
You_hear("a gushing sound.");
|
||||||
|
} else {
|
||||||
|
pline("A %s ooze gushes up from the drain!",
|
||||||
|
hcolor(NH_BLACK));
|
||||||
|
}
|
||||||
|
(void) makemon(&mons[PM_BLACK_PUDDING], x, y, MM_NOMSG);
|
||||||
|
exercise(A_DEX, TRUE);
|
||||||
|
newsym(x, y);
|
||||||
|
gm.maploc->looted |= S_LPUDDING;
|
||||||
|
return ECMD_TIME;
|
||||||
|
} else if (!(gm.maploc->looted & S_LDWASHER) && !rn2(3)
|
||||||
|
&& !(gm.mvitals[PM_AMOROUS_DEMON].mvflags & G_GONE)) {
|
||||||
|
/* can't resist... */
|
||||||
|
pline("%s returns!", (Blind ? Something : "The dish washer"));
|
||||||
|
if (makemon(&mons[PM_AMOROUS_DEMON], x, y,
|
||||||
|
MM_NOMSG | ((gend == 1 || (gend == 2 && rn2(2)))
|
||||||
|
? MM_MALE : MM_FEMALE)))
|
||||||
|
newsym(x, y);
|
||||||
|
gm.maploc->looted |= S_LDWASHER;
|
||||||
|
exercise(A_DEX, TRUE);
|
||||||
|
return ECMD_TIME;
|
||||||
|
} else if (!rn2(3)) {
|
||||||
|
sink_backs_up(x, y);
|
||||||
|
return ECMD_TIME;
|
||||||
|
}
|
||||||
|
kick_ouch(x, y, "");
|
||||||
|
return ECMD_TIME;
|
||||||
|
}
|
||||||
|
if (gm.maploc->typ == STAIRS || gm.maploc->typ == LADDER
|
||||||
|
|| IS_STWALL(gm.maploc->typ)) {
|
||||||
|
if (!IS_STWALL(gm.maploc->typ) && gm.maploc->ladder == LA_DOWN) {
|
||||||
|
kick_dumb(x, y);
|
||||||
|
return ECMD_TIME;
|
||||||
|
}
|
||||||
|
kick_ouch(x, y, "");
|
||||||
|
return ECMD_TIME;
|
||||||
|
}
|
||||||
|
kick_dumb(x, y);
|
||||||
|
return ECMD_TIME;
|
||||||
|
}
|
||||||
|
|
||||||
/* the #kick command */
|
/* the #kick command */
|
||||||
int
|
int
|
||||||
dokick(void)
|
dokick(void)
|
||||||
@@ -1163,287 +1448,10 @@ dokick(void)
|
|||||||
return ECMD_TIME;
|
return ECMD_TIME;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!IS_DOOR(gm.maploc->typ)) {
|
if (IS_DOOR(gm.maploc->typ))
|
||||||
if (gm.maploc->typ == SDOOR) {
|
kick_door(x, y, avrg_attrib);
|
||||||
if (!Levitation && rn2(30) < avrg_attrib) {
|
else
|
||||||
cvt_sdoor_to_door(gm.maploc); /* ->typ = DOOR */
|
return kick_nondoor(x, y, avrg_attrib);
|
||||||
Soundeffect(se_crash_door, 40);
|
|
||||||
pline("Crash! %s a secret door!",
|
|
||||||
/* don't "kick open" when it's locked
|
|
||||||
unless it also happens to be trapped */
|
|
||||||
((gm.maploc->doormask & (D_LOCKED | D_TRAPPED))
|
|
||||||
== D_LOCKED) ? "Your kick uncovers" : "You kick open");
|
|
||||||
exercise(A_DEX, TRUE);
|
|
||||||
if (gm.maploc->doormask & D_TRAPPED) {
|
|
||||||
gm.maploc->doormask = D_NODOOR;
|
|
||||||
b_trapped("door", FOOT);
|
|
||||||
} else if (gm.maploc->doormask != D_NODOOR
|
|
||||||
&& !(gm.maploc->doormask & D_LOCKED))
|
|
||||||
gm.maploc->doormask = D_ISOPEN;
|
|
||||||
feel_newsym(x, y); /* we know it's gone */
|
|
||||||
if (gm.maploc->doormask == D_ISOPEN
|
|
||||||
|| gm.maploc->doormask == D_NODOOR)
|
|
||||||
unblock_point(x, y); /* vision */
|
|
||||||
return ECMD_TIME;
|
|
||||||
} else {
|
|
||||||
kick_ouch(x, y, "");
|
|
||||||
return ECMD_TIME;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (gm.maploc->typ == SCORR) {
|
|
||||||
if (!Levitation && rn2(30) < avrg_attrib) {
|
|
||||||
Soundeffect(se_crash_door, 40);
|
|
||||||
pline("Crash! You kick open a secret passage!");
|
|
||||||
exercise(A_DEX, TRUE);
|
|
||||||
gm.maploc->typ = CORR;
|
|
||||||
feel_newsym(x, y); /* we know it's gone */
|
|
||||||
unblock_point(x, y); /* vision */
|
|
||||||
return ECMD_TIME;
|
|
||||||
} else {
|
|
||||||
kick_ouch(x, y, "");
|
|
||||||
return ECMD_TIME;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (IS_THRONE(gm.maploc->typ)) {
|
|
||||||
register int i;
|
|
||||||
if (Levitation) {
|
|
||||||
kick_dumb(x, y);
|
|
||||||
return ECMD_TIME;
|
|
||||||
}
|
|
||||||
if ((Luck < 0 || gm.maploc->looted) && !rn2(3)) {
|
|
||||||
gm.maploc->looted = 0; /* don't leave loose ends.. */
|
|
||||||
gm.maploc->typ = ROOM;
|
|
||||||
(void) mkgold((long) rnd(200), x, y);
|
|
||||||
Soundeffect(se_crash_throne_destroyed, 60);
|
|
||||||
if (Blind)
|
|
||||||
pline("CRASH! You destroy it.");
|
|
||||||
else {
|
|
||||||
pline("CRASH! You destroy the throne.");
|
|
||||||
newsym(x, y);
|
|
||||||
}
|
|
||||||
exercise(A_DEX, TRUE);
|
|
||||||
return ECMD_TIME;
|
|
||||||
} else if (Luck > 0 && !rn2(3) && !gm.maploc->looted) {
|
|
||||||
(void) mkgold((long) rn1(201, 300), x, y);
|
|
||||||
i = Luck + 1;
|
|
||||||
if (i > 6)
|
|
||||||
i = 6;
|
|
||||||
while (i--)
|
|
||||||
(void) mksobj_at(
|
|
||||||
rnd_class(DILITHIUM_CRYSTAL, LUCKSTONE - 1), x, y,
|
|
||||||
FALSE, TRUE);
|
|
||||||
if (Blind)
|
|
||||||
You("kick %s loose!", something);
|
|
||||||
else {
|
|
||||||
You("kick loose some ornamental coins and gems!");
|
|
||||||
newsym(x, y);
|
|
||||||
}
|
|
||||||
/* prevent endless milking */
|
|
||||||
gm.maploc->looted = T_LOOTED;
|
|
||||||
return ECMD_TIME;
|
|
||||||
} else if (!rn2(4)) {
|
|
||||||
if (dunlev(&u.uz) < dunlevs_in_dungeon(&u.uz)) {
|
|
||||||
fall_through(FALSE, 0);
|
|
||||||
return ECMD_TIME;
|
|
||||||
} else {
|
|
||||||
kick_ouch(x, y, "");
|
|
||||||
return ECMD_TIME;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
kick_ouch(x, y, "");
|
|
||||||
return ECMD_TIME;
|
|
||||||
}
|
|
||||||
if (IS_ALTAR(gm.maploc->typ)) {
|
|
||||||
if (Levitation) {
|
|
||||||
kick_dumb(x, y);
|
|
||||||
return ECMD_TIME;
|
|
||||||
}
|
|
||||||
You("kick %s.", (Blind ? something : "the altar"));
|
|
||||||
altar_wrath(x, y);
|
|
||||||
if (!rn2(3)) {
|
|
||||||
kick_ouch(x, y, "");
|
|
||||||
return ECMD_TIME;
|
|
||||||
}
|
|
||||||
exercise(A_DEX, TRUE);
|
|
||||||
return ECMD_TIME;
|
|
||||||
}
|
|
||||||
if (IS_FOUNTAIN(gm.maploc->typ)) {
|
|
||||||
if (Levitation) {
|
|
||||||
kick_dumb(x, y);
|
|
||||||
return ECMD_TIME;
|
|
||||||
}
|
|
||||||
You("kick %s.", (Blind ? something : "the fountain"));
|
|
||||||
if (!rn2(3)) {
|
|
||||||
kick_ouch(x, y, "");
|
|
||||||
return ECMD_TIME;
|
|
||||||
}
|
|
||||||
/* make metal boots rust */
|
|
||||||
if (uarmf && rn2(3))
|
|
||||||
if (water_damage(uarmf, "metal boots", TRUE) == ER_NOTHING) {
|
|
||||||
Your("boots get wet.");
|
|
||||||
/* could cause short-lived fumbling here */
|
|
||||||
}
|
|
||||||
exercise(A_DEX, TRUE);
|
|
||||||
return ECMD_TIME;
|
|
||||||
}
|
|
||||||
if (IS_GRAVE(gm.maploc->typ)) {
|
|
||||||
if (Levitation) {
|
|
||||||
kick_dumb(x, y);
|
|
||||||
} else if (rn2(4)) {
|
|
||||||
/* minor injury */
|
|
||||||
kick_ouch(x, y, "");
|
|
||||||
} else if (!gm.maploc->disturbed && !rn2(2)) {
|
|
||||||
/* disturb the grave: summon a ghoul (once only), same as
|
|
||||||
when engraving */
|
|
||||||
disturb_grave(x, y);
|
|
||||||
} else {
|
|
||||||
/* destroy the headstone, implicitly destroying any
|
|
||||||
not-yet-created contents (including zombie or mummy);
|
|
||||||
any already created contents will still be buried here */
|
|
||||||
exercise(A_WIS, FALSE);
|
|
||||||
if (Role_if(PM_ARCHEOLOGIST) || Role_if(PM_SAMURAI)
|
|
||||||
|| (u.ualign.type == A_LAWFUL && u.ualign.record > -10))
|
|
||||||
adjalign(-sgn(u.ualign.type));
|
|
||||||
gm.maploc->typ = ROOM;
|
|
||||||
gm.maploc->emptygrave = 0; /* clear 'flags' */
|
|
||||||
gm.maploc->disturbed = 0; /* clear 'horizontal' */
|
|
||||||
(void) mksobj_at(ROCK, x, y, TRUE, FALSE);
|
|
||||||
del_engr_at(x, y);
|
|
||||||
if (Blind) {
|
|
||||||
/* [feel this happen if Deaf?] */
|
|
||||||
pline("Crack! %s broke!", Something);
|
|
||||||
} else {
|
|
||||||
pline_The("headstone topples over and breaks!");
|
|
||||||
newsym(x, y);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return ECMD_TIME;
|
|
||||||
}
|
|
||||||
if (gm.maploc->typ == IRONBARS) {
|
|
||||||
kick_ouch(x, y, "");
|
|
||||||
return ECMD_TIME;
|
|
||||||
}
|
|
||||||
if (IS_TREE(gm.maploc->typ)) {
|
|
||||||
struct obj *treefruit;
|
|
||||||
|
|
||||||
/* nothing, fruit or trouble? 75:23.5:1.5% */
|
|
||||||
if (rn2(3)) {
|
|
||||||
if (!rn2(6) && !(gm.mvitals[PM_KILLER_BEE].mvflags & G_GONE))
|
|
||||||
You_hear("a low buzzing."); /* a warning */
|
|
||||||
kick_ouch(x, y, "");
|
|
||||||
return ECMD_TIME;
|
|
||||||
}
|
|
||||||
if (rn2(15) && !(gm.maploc->looted & TREE_LOOTED)
|
|
||||||
&& (treefruit = rnd_treefruit_at(x, y))) {
|
|
||||||
long nfruit = 8L - rnl(7), nfall;
|
|
||||||
short frtype = treefruit->otyp;
|
|
||||||
|
|
||||||
treefruit->quan = nfruit;
|
|
||||||
treefruit->owt = weight(treefruit);
|
|
||||||
if (is_plural(treefruit))
|
|
||||||
pline("Some %s fall from the tree!", xname(treefruit));
|
|
||||||
else
|
|
||||||
pline("%s falls from the tree!", An(xname(treefruit)));
|
|
||||||
nfall = scatter(x, y, 2, MAY_HIT, treefruit);
|
|
||||||
if (nfall != nfruit) {
|
|
||||||
/* scatter left some in the tree, but treefruit
|
|
||||||
* may not refer to the correct object */
|
|
||||||
treefruit = mksobj(frtype, TRUE, FALSE);
|
|
||||||
treefruit->quan = nfruit - nfall;
|
|
||||||
pline("%ld %s got caught in the branches.",
|
|
||||||
nfruit - nfall, xname(treefruit));
|
|
||||||
dealloc_obj(treefruit);
|
|
||||||
}
|
|
||||||
exercise(A_DEX, TRUE);
|
|
||||||
exercise(A_WIS, TRUE); /* discovered a new food source! */
|
|
||||||
newsym(x, y);
|
|
||||||
gm.maploc->looted |= TREE_LOOTED;
|
|
||||||
return ECMD_TIME;
|
|
||||||
} else if (!(gm.maploc->looted & TREE_SWARM)) {
|
|
||||||
int cnt = rnl(4) + 2;
|
|
||||||
int made = 0;
|
|
||||||
coord mm;
|
|
||||||
|
|
||||||
mm.x = x;
|
|
||||||
mm.y = y;
|
|
||||||
while (cnt--) {
|
|
||||||
if (enexto(&mm, mm.x, mm.y, &mons[PM_KILLER_BEE])
|
|
||||||
&& makemon(&mons[PM_KILLER_BEE], mm.x, mm.y,
|
|
||||||
MM_ANGRY|MM_NOMSG))
|
|
||||||
made++;
|
|
||||||
}
|
|
||||||
if (made)
|
|
||||||
pline("You've attracted the tree's former occupants!");
|
|
||||||
else
|
|
||||||
You("smell stale honey.");
|
|
||||||
gm.maploc->looted |= TREE_SWARM;
|
|
||||||
return ECMD_TIME;
|
|
||||||
}
|
|
||||||
kick_ouch(x, y, "");
|
|
||||||
return ECMD_TIME;
|
|
||||||
}
|
|
||||||
if (IS_SINK(gm.maploc->typ)) {
|
|
||||||
int gend = poly_gender();
|
|
||||||
|
|
||||||
if (Levitation) {
|
|
||||||
kick_dumb(x, y);
|
|
||||||
return ECMD_TIME;
|
|
||||||
}
|
|
||||||
if (rn2(5)) {
|
|
||||||
Soundeffect(se_klunk_pipe, 60);
|
|
||||||
if (!Deaf)
|
|
||||||
pline("Klunk! The pipes vibrate noisily.");
|
|
||||||
else
|
|
||||||
pline("Klunk!");
|
|
||||||
exercise(A_DEX, TRUE);
|
|
||||||
return ECMD_TIME;
|
|
||||||
} else if (!(gm.maploc->looted & S_LPUDDING) && !rn2(3)
|
|
||||||
&& !(gm.mvitals[PM_BLACK_PUDDING].mvflags & G_GONE)) {
|
|
||||||
Soundeffect(se_gushing_sound, 100);
|
|
||||||
if (Blind) {
|
|
||||||
if (!Deaf)
|
|
||||||
You_hear("a gushing sound.");
|
|
||||||
} else {
|
|
||||||
pline("A %s ooze gushes up from the drain!",
|
|
||||||
hcolor(NH_BLACK));
|
|
||||||
}
|
|
||||||
(void) makemon(&mons[PM_BLACK_PUDDING], x, y, MM_NOMSG);
|
|
||||||
exercise(A_DEX, TRUE);
|
|
||||||
newsym(x, y);
|
|
||||||
gm.maploc->looted |= S_LPUDDING;
|
|
||||||
return ECMD_TIME;
|
|
||||||
} else if (!(gm.maploc->looted & S_LDWASHER) && !rn2(3)
|
|
||||||
&& !(gm.mvitals[PM_AMOROUS_DEMON].mvflags & G_GONE)) {
|
|
||||||
/* can't resist... */
|
|
||||||
pline("%s returns!", (Blind ? Something : "The dish washer"));
|
|
||||||
if (makemon(&mons[PM_AMOROUS_DEMON], x, y,
|
|
||||||
MM_NOMSG | ((gend == 1 || (gend == 2 && rn2(2)))
|
|
||||||
? MM_MALE : MM_FEMALE)))
|
|
||||||
newsym(x, y);
|
|
||||||
gm.maploc->looted |= S_LDWASHER;
|
|
||||||
exercise(A_DEX, TRUE);
|
|
||||||
return ECMD_TIME;
|
|
||||||
} else if (!rn2(3)) {
|
|
||||||
sink_backs_up(x, y);
|
|
||||||
return ECMD_TIME;
|
|
||||||
}
|
|
||||||
kick_ouch(x, y, "");
|
|
||||||
return ECMD_TIME;
|
|
||||||
}
|
|
||||||
if (gm.maploc->typ == STAIRS || gm.maploc->typ == LADDER
|
|
||||||
|| IS_STWALL(gm.maploc->typ)) {
|
|
||||||
if (!IS_STWALL(gm.maploc->typ) && gm.maploc->ladder == LA_DOWN) {
|
|
||||||
kick_dumb(x, y);
|
|
||||||
return ECMD_TIME;
|
|
||||||
}
|
|
||||||
kick_ouch(x, y, "");
|
|
||||||
return ECMD_TIME;
|
|
||||||
}
|
|
||||||
kick_dumb(x, y);
|
|
||||||
return ECMD_TIME;
|
|
||||||
}
|
|
||||||
|
|
||||||
kick_door(x, y, avrg_attrib);
|
|
||||||
return ECMD_TIME;
|
return ECMD_TIME;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user