split making pits on do_earthquake() into a separate function
This commit is contained in:
236
src/music.c
236
src/music.c
@@ -34,6 +34,7 @@ staticfn void put_monsters_to_sleep(int);
|
|||||||
staticfn void charm_snakes(int);
|
staticfn void charm_snakes(int);
|
||||||
staticfn void calm_nymphs(int);
|
staticfn void calm_nymphs(int);
|
||||||
staticfn void charm_monsters(int);
|
staticfn void charm_monsters(int);
|
||||||
|
staticfn void do_pit(coordxy, coordxy, unsigned);
|
||||||
staticfn void do_earthquake(int);
|
staticfn void do_earthquake(int);
|
||||||
staticfn const char *generic_lvl_desc(void);
|
staticfn const char *generic_lvl_desc(void);
|
||||||
staticfn int do_improvisation(struct obj *);
|
staticfn int do_improvisation(struct obj *);
|
||||||
@@ -215,6 +216,126 @@ charm_monsters(int distance)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
staticfn void
|
||||||
|
do_pit(coordxy x, coordxy y, unsigned tu_pit)
|
||||||
|
{
|
||||||
|
struct monst *mtmp;
|
||||||
|
struct obj *otmp;
|
||||||
|
struct trap *chasm;
|
||||||
|
schar filltype;
|
||||||
|
|
||||||
|
chasm = maketrap(x, y, PIT);
|
||||||
|
if (!chasm)
|
||||||
|
return; /* no pit if portal at that location */
|
||||||
|
chasm->tseen = 1;
|
||||||
|
|
||||||
|
mtmp = m_at(x, y); /* (redundant?) */
|
||||||
|
if ((otmp = sobj_at(BOULDER, x, y)) != 0) {
|
||||||
|
if (cansee(x, y))
|
||||||
|
pline("KADOOM! The boulder falls into a chasm%s!",
|
||||||
|
u_at(x, y) ? " below you" : "");
|
||||||
|
if (mtmp)
|
||||||
|
mtmp->mtrapped = 0;
|
||||||
|
obj_extract_self(otmp);
|
||||||
|
(void) flooreffects(otmp, x, y, "");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Let liquid flow into the newly created chasm.
|
||||||
|
Adjust corresponding code in apply.c for exploding
|
||||||
|
wand of digging if you alter this sequence. */
|
||||||
|
filltype = fillholetyp(x, y, FALSE);
|
||||||
|
if (filltype != ROOM) {
|
||||||
|
set_levltyp(x, y, filltype); /* levl[x][y] = filltype; */
|
||||||
|
liquid_flow(x, y, filltype, chasm, (char *) 0);
|
||||||
|
/* liquid_flow() deletes trap, might kill mtmp */
|
||||||
|
if ((chasm = t_at(x, y)) == NULL)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* We have to check whether monsters or hero falls into a
|
||||||
|
new pit.... Note: if we get here, chasm is non-Null. */
|
||||||
|
if (mtmp) {
|
||||||
|
if (!is_flyer(mtmp->data) && !is_clinger(mtmp->data)) {
|
||||||
|
boolean m_already_trapped = mtmp->mtrapped;
|
||||||
|
|
||||||
|
mtmp->mtrapped = 1;
|
||||||
|
if (!m_already_trapped) { /* suppress messages */
|
||||||
|
if (cansee(x, y)) {
|
||||||
|
pline("%s falls into a chasm!", Monnam(mtmp));
|
||||||
|
} else if (humanoid(mtmp->data)) {
|
||||||
|
Soundeffect(se_scream, 50);
|
||||||
|
You_hear("a scream!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* Falling is okay for falling down
|
||||||
|
within a pit from jostling too */
|
||||||
|
mselftouch(mtmp, "Falling, ", TRUE);
|
||||||
|
if (!DEADMONSTER(mtmp)) {
|
||||||
|
mtmp->mhp -= rnd(m_already_trapped ? 4 : 6);
|
||||||
|
if (DEADMONSTER(mtmp)) {
|
||||||
|
if (!cansee(x, y)) {
|
||||||
|
pline("It is destroyed!");
|
||||||
|
} else {
|
||||||
|
You("destroy %s!",
|
||||||
|
mtmp->mtame
|
||||||
|
? x_monnam(mtmp, ARTICLE_THE, "poor",
|
||||||
|
has_mgivenname(mtmp)
|
||||||
|
? SUPPRESS_SADDLE : 0,
|
||||||
|
FALSE)
|
||||||
|
: mon_nam(mtmp));
|
||||||
|
}
|
||||||
|
xkilled(mtmp, XKILL_NOMSG);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (u_at(x, y)) {
|
||||||
|
if (u.utrap && u.utraptype == TT_BURIEDBALL) {
|
||||||
|
/* Note: the chain should break if a pit gets
|
||||||
|
created at the buried ball's location, which
|
||||||
|
is not necessarily here. But if we don't do
|
||||||
|
things this way, entering the new pit below
|
||||||
|
will override current trap anyway, but too
|
||||||
|
late to get Lev and Fly handling. */
|
||||||
|
Your("chain breaks!");
|
||||||
|
reset_utrap(TRUE);
|
||||||
|
}
|
||||||
|
if (Levitation || Flying || is_clinger(gy.youmonst.data)) {
|
||||||
|
if (!tu_pit) { /* no pit here previously */
|
||||||
|
pline("A chasm opens up under you!");
|
||||||
|
You("don't fall in!");
|
||||||
|
}
|
||||||
|
} else if (!tu_pit || !u.utrap || u.utraptype != TT_PIT) {
|
||||||
|
/* no pit here previously, or you were
|
||||||
|
not in it even if there was */
|
||||||
|
You("fall into a chasm!");
|
||||||
|
set_utrap(rn1(6, 2), TT_PIT);
|
||||||
|
losehp(Maybe_Half_Phys(rnd(6)),
|
||||||
|
"fell into a chasm", NO_KILLER_PREFIX);
|
||||||
|
selftouch("Falling, you");
|
||||||
|
} else if (u.utrap && u.utraptype == TT_PIT) {
|
||||||
|
boolean keepfooting =
|
||||||
|
(!(Fumbling && rn2(5))
|
||||||
|
&& (!(rnl(Role_if(PM_ARCHEOLOGIST) ? 3 : 9))
|
||||||
|
|| ((ACURR(A_DEX) > 7) && rn2(5))));
|
||||||
|
|
||||||
|
You("are jostled around violently!");
|
||||||
|
set_utrap(rn1(6, 2), TT_PIT);
|
||||||
|
losehp(Maybe_Half_Phys(rnd(keepfooting ? 2 : 4)),
|
||||||
|
"hurt in a chasm", NO_KILLER_PREFIX);
|
||||||
|
if (keepfooting)
|
||||||
|
exercise(A_DEX, TRUE);
|
||||||
|
else
|
||||||
|
selftouch((Upolyd && (slithy(gy.youmonst.data)
|
||||||
|
|| nolimbs(gy.youmonst.data)))
|
||||||
|
? "Shaken, you"
|
||||||
|
: "Falling down, you");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
newsym(x, y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Generate earthquake :-) of desired force.
|
/* Generate earthquake :-) of desired force.
|
||||||
* That is: create random chasms (pits).
|
* That is: create random chasms (pits).
|
||||||
*/
|
*/
|
||||||
@@ -224,11 +345,9 @@ do_earthquake(int force)
|
|||||||
static const char into_a_chasm[] = " into a chasm";
|
static const char into_a_chasm[] = " into a chasm";
|
||||||
coordxy x, y;
|
coordxy x, y;
|
||||||
struct monst *mtmp;
|
struct monst *mtmp;
|
||||||
struct obj *otmp;
|
struct trap *trap_at_u = t_at(u.ux, u.uy);
|
||||||
struct trap *chasm, *trap_at_u = t_at(u.ux, u.uy);
|
|
||||||
int start_x, start_y, end_x, end_y, amsk;
|
int start_x, start_y, end_x, end_y, amsk;
|
||||||
aligntyp algn;
|
aligntyp algn;
|
||||||
schar filltype;
|
|
||||||
unsigned tu_pit = 0;
|
unsigned tu_pit = 0;
|
||||||
|
|
||||||
if (trap_at_u)
|
if (trap_at_u)
|
||||||
@@ -322,116 +441,7 @@ do_earthquake(int force)
|
|||||||
case CORR:
|
case CORR:
|
||||||
case ROOM: /* Try to make a pit. */
|
case ROOM: /* Try to make a pit. */
|
||||||
do_pit:
|
do_pit:
|
||||||
chasm = maketrap(x, y, PIT);
|
do_pit(x, y, tu_pit);
|
||||||
if (!chasm)
|
|
||||||
break; /* no pit if portal at that location */
|
|
||||||
chasm->tseen = 1;
|
|
||||||
|
|
||||||
mtmp = m_at(x, y); /* (redundant?) */
|
|
||||||
if ((otmp = sobj_at(BOULDER, x, y)) != 0) {
|
|
||||||
if (cansee(x, y))
|
|
||||||
pline("KADOOM! The boulder falls into a chasm%s!",
|
|
||||||
u_at(x, y) ? " below you" : "");
|
|
||||||
if (mtmp)
|
|
||||||
mtmp->mtrapped = 0;
|
|
||||||
obj_extract_self(otmp);
|
|
||||||
(void) flooreffects(otmp, x, y, "");
|
|
||||||
break; /* from switch, not loop */
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Let liquid flow into the newly created chasm.
|
|
||||||
Adjust corresponding code in apply.c for exploding
|
|
||||||
wand of digging if you alter this sequence. */
|
|
||||||
filltype = fillholetyp(x, y, FALSE);
|
|
||||||
if (filltype != ROOM) {
|
|
||||||
set_levltyp(x, y, filltype); /* levl[x][y] = filltype; */
|
|
||||||
liquid_flow(x, y, filltype, chasm, (char *) 0);
|
|
||||||
/* liquid_flow() deletes trap, might kill mtmp */
|
|
||||||
if ((chasm = t_at(x, y)) == NULL)
|
|
||||||
break; /* from switch, not loop */
|
|
||||||
}
|
|
||||||
|
|
||||||
/* We have to check whether monsters or hero falls into a
|
|
||||||
new pit.... Note: if we get here, chasm is non-Null. */
|
|
||||||
if (mtmp) {
|
|
||||||
if (!is_flyer(mtmp->data) && !is_clinger(mtmp->data)) {
|
|
||||||
boolean m_already_trapped = mtmp->mtrapped;
|
|
||||||
|
|
||||||
mtmp->mtrapped = 1;
|
|
||||||
if (!m_already_trapped) { /* suppress messages */
|
|
||||||
if (cansee(x, y)) {
|
|
||||||
pline("%s falls into a chasm!", Monnam(mtmp));
|
|
||||||
} else if (humanoid(mtmp->data)) {
|
|
||||||
Soundeffect(se_scream, 50);
|
|
||||||
You_hear("a scream!");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/* Falling is okay for falling down
|
|
||||||
within a pit from jostling too */
|
|
||||||
mselftouch(mtmp, "Falling, ", TRUE);
|
|
||||||
if (!DEADMONSTER(mtmp)) {
|
|
||||||
mtmp->mhp -= rnd(m_already_trapped ? 4 : 6);
|
|
||||||
if (DEADMONSTER(mtmp)) {
|
|
||||||
if (!cansee(x, y)) {
|
|
||||||
pline("It is destroyed!");
|
|
||||||
} else {
|
|
||||||
You("destroy %s!",
|
|
||||||
mtmp->mtame
|
|
||||||
? x_monnam(mtmp, ARTICLE_THE, "poor",
|
|
||||||
has_mgivenname(mtmp)
|
|
||||||
? SUPPRESS_SADDLE : 0,
|
|
||||||
FALSE)
|
|
||||||
: mon_nam(mtmp));
|
|
||||||
}
|
|
||||||
xkilled(mtmp, XKILL_NOMSG);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (u_at(x, y)) {
|
|
||||||
if (u.utrap && u.utraptype == TT_BURIEDBALL) {
|
|
||||||
/* Note: the chain should break if a pit gets
|
|
||||||
created at the buried ball's location, which
|
|
||||||
is not necessarily here. But if we don't do
|
|
||||||
things this way, entering the new pit below
|
|
||||||
will override current trap anyway, but too
|
|
||||||
late to get Lev and Fly handling. */
|
|
||||||
Your("chain breaks!");
|
|
||||||
reset_utrap(TRUE);
|
|
||||||
}
|
|
||||||
if (Levitation || Flying || is_clinger(gy.youmonst.data)) {
|
|
||||||
if (!tu_pit) { /* no pit here previously */
|
|
||||||
pline("A chasm opens up under you!");
|
|
||||||
You("don't fall in!");
|
|
||||||
}
|
|
||||||
} else if (!tu_pit || !u.utrap || u.utraptype != TT_PIT) {
|
|
||||||
/* no pit here previously, or you were
|
|
||||||
not in it even if there was */
|
|
||||||
You("fall into a chasm!");
|
|
||||||
set_utrap(rn1(6, 2), TT_PIT);
|
|
||||||
losehp(Maybe_Half_Phys(rnd(6)),
|
|
||||||
"fell into a chasm", NO_KILLER_PREFIX);
|
|
||||||
selftouch("Falling, you");
|
|
||||||
} else if (u.utrap && u.utraptype == TT_PIT) {
|
|
||||||
boolean keepfooting =
|
|
||||||
(!(Fumbling && rn2(5))
|
|
||||||
&& (!(rnl(Role_if(PM_ARCHEOLOGIST) ? 3 : 9))
|
|
||||||
|| ((ACURR(A_DEX) > 7) && rn2(5))));
|
|
||||||
|
|
||||||
You("are jostled around violently!");
|
|
||||||
set_utrap(rn1(6, 2), TT_PIT);
|
|
||||||
losehp(Maybe_Half_Phys(rnd(keepfooting ? 2 : 4)),
|
|
||||||
"hurt in a chasm", NO_KILLER_PREFIX);
|
|
||||||
if (keepfooting)
|
|
||||||
exercise(A_DEX, TRUE);
|
|
||||||
else
|
|
||||||
selftouch((Upolyd && (slithy(gy.youmonst.data)
|
|
||||||
|| nolimbs(gy.youmonst.data)))
|
|
||||||
? "Shaken, you"
|
|
||||||
: "Falling down, you");
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
newsym(x, y);
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case SDOOR:
|
case SDOOR:
|
||||||
cvt_sdoor_to_door(&levl[x][y]); /* .typ = DOOR */
|
cvt_sdoor_to_door(&levl[x][y]); /* .typ = DOOR */
|
||||||
|
|||||||
Reference in New Issue
Block a user