Unify landmines

This commit is contained in:
Pasi Kallinen
2020-12-10 19:04:30 +02:00
parent 5dcd6b2e17
commit 97a9bcf9c5
+64 -52
View File
@@ -29,7 +29,7 @@ static int FDECL(trapeffect_statue_trap, (struct monst *, struct trap *, unsigne
static int FDECL(trapeffect_magic_trap, (struct monst *, struct trap *, unsigned)); static int FDECL(trapeffect_magic_trap, (struct monst *, struct trap *, unsigned));
static int FDECL(trapeffect_anti_magic, (struct monst *, struct trap *, unsigned)); static int FDECL(trapeffect_anti_magic, (struct monst *, struct trap *, unsigned));
static int FDECL(trapeffect_poly_trap, (struct monst *, struct trap *, unsigned)); static int FDECL(trapeffect_poly_trap, (struct monst *, struct trap *, unsigned));
static void FDECL(trapeffect_landmine, (struct trap *, unsigned)); static int FDECL(trapeffect_landmine, (struct monst *, struct trap *, unsigned));
static void FDECL(trapeffect_rolling_boulder_trap, (struct trap *, unsigned)); static void FDECL(trapeffect_rolling_boulder_trap, (struct trap *, unsigned));
static void FDECL(trapeffect_magic_portal, (struct trap *, unsigned)); static void FDECL(trapeffect_magic_portal, (struct trap *, unsigned));
static char *FDECL(trapnote, (struct trap *, BOOLEAN_P)); static char *FDECL(trapnote, (struct trap *, BOOLEAN_P));
@@ -2095,11 +2095,13 @@ unsigned trflags;
return 0; return 0;
} }
static void static int
trapeffect_landmine(trap, trflags) trapeffect_landmine(mtmp, trap, trflags)
struct monst *mtmp;
struct trap *trap; struct trap *trap;
unsigned trflags; unsigned trflags;
{ {
if (mtmp == &g.youmonst) {
boolean already_seen = trap->tseen; boolean already_seen = trap->tseen;
boolean forcetrap = ((trflags & FORCETRAP) != 0 boolean forcetrap = ((trflags & FORCETRAP) != 0
|| (trflags & FAILEDUNTRAP) != 0); || (trflags & FAILEDUNTRAP) != 0);
@@ -2109,13 +2111,13 @@ unsigned trflags;
if ((Levitation || Flying) && !forcetrap) { if ((Levitation || Flying) && !forcetrap) {
if (!already_seen && rn2(3)) if (!already_seen && rn2(3))
return; return 0;
feeltrap(trap); feeltrap(trap);
pline("%s %s in a pile of soil below you.", pline("%s %s in a pile of soil below you.",
already_seen ? "There is" : "You discover", already_seen ? "There is" : "You discover",
trap->madeby_u ? "the trigger of your mine" : "a trigger"); trap->madeby_u ? "the trigger of your mine" : "a trigger");
if (already_seen && rn2(3)) if (already_seen && rn2(3))
return; return 0;
pline("KAABLAMM!!! %s %s%s off!", pline("KAABLAMM!!! %s %s%s off!",
forcebungle ? "Your inept attempt sets" forcebungle ? "Your inept attempt sets"
: "The air currents set", : "The air currents set",
@@ -2129,7 +2131,7 @@ unsigned trflags;
static boolean recursive_mine = FALSE; static boolean recursive_mine = FALSE;
if (recursive_mine) if (recursive_mine)
return; return 0;
feeltrap(trap); feeltrap(trap);
pline("KAABLAMM!!! You triggered %s land mine!", pline("KAABLAMM!!! You triggered %s land mine!",
a_your[trap->madeby_u]); a_your[trap->madeby_u]);
@@ -2152,6 +2154,60 @@ unsigned trflags;
if ((trap = t_at(u.ux, u.uy)) != 0) if ((trap = t_at(u.ux, u.uy)) != 0)
dotrap(trap, RECURSIVETRAP); dotrap(trap, RECURSIVETRAP);
fill_pit(u.ux, u.uy); fill_pit(u.ux, u.uy);
} else {
boolean trapkilled = FALSE;
boolean in_sight = canseemon(mtmp) || (mtmp == u.usteed);
struct permonst *mptr = mtmp->data;
xchar tx = trap->tx, ty = trap->ty;
if (rn2(3))
return 0; /* monsters usually don't set it off */
if (is_flyer(mptr)) {
boolean already_seen = trap->tseen;
if (in_sight && !already_seen) {
pline("A trigger appears in a pile of soil below %s.",
mon_nam(mtmp));
seetrap(trap);
}
if (rn2(3))
return 0;
if (in_sight) {
newsym(mtmp->mx, mtmp->my);
pline_The("air currents set %s off!",
already_seen ? "a land mine" : "it");
}
} else if (in_sight) {
newsym(mtmp->mx, mtmp->my);
pline("%s%s triggers %s land mine!",
!Deaf ? "KAABLAMM!!! " : "", Monnam(mtmp),
a_your[trap->madeby_u]);
}
if (!in_sight && !Deaf)
pline("Kaablamm! %s an explosion in the distance!",
"You hear"); /* Deaf-aware */
blow_up_landmine(trap);
/* explosion might have destroyed a drawbridge; don't
dish out more damage if monster is already dead */
if (DEADMONSTER(mtmp)
|| thitm(0, mtmp, (struct obj *) 0, rnd(16), FALSE)) {
trapkilled = TRUE;
} else {
/* monsters recursively fall into new pit */
if (mintrap(mtmp) == 2)
trapkilled = TRUE;
}
/* a boulder may fill the new pit, crushing monster */
fill_pit(tx, ty); /* thitm may have already destroyed the trap */
if (DEADMONSTER(mtmp))
trapkilled = TRUE;
if (unconscious()) {
g.multi = -1;
g.nomovemsg = "The explosion awakens you!";
}
return trapkilled ? 2 : mtmp->mtrapped;
}
return 0;
} }
static void static void
@@ -2321,7 +2377,7 @@ unsigned trflags;
break; break;
case LANDMINE: case LANDMINE:
trapeffect_landmine(trap, trflags); (void) trapeffect_landmine(&g.youmonst, trap, trflags);
break; break;
case ROLLING_BOULDER_TRAP: case ROLLING_BOULDER_TRAP:
@@ -3019,51 +3075,7 @@ register struct monst *mtmp;
return trapeffect_anti_magic(mtmp, trap, 0); return trapeffect_anti_magic(mtmp, trap, 0);
break; break;
case LANDMINE: case LANDMINE:
if (rn2(3)) return trapeffect_landmine(mtmp, trap, 0);
break; /* monsters usually don't set it off */
if (is_flyer(mptr)) {
boolean already_seen = trap->tseen;
if (in_sight && !already_seen) {
pline("A trigger appears in a pile of soil below %s.",
mon_nam(mtmp));
seetrap(trap);
}
if (rn2(3))
break;
if (in_sight) {
newsym(mtmp->mx, mtmp->my);
pline_The("air currents set %s off!",
already_seen ? "a land mine" : "it");
}
} else if (in_sight) {
newsym(mtmp->mx, mtmp->my);
pline("%s%s triggers %s land mine!",
!Deaf ? "KAABLAMM!!! " : "", Monnam(mtmp),
a_your[trap->madeby_u]);
}
if (!in_sight && !Deaf)
pline("Kaablamm! %s an explosion in the distance!",
"You hear"); /* Deaf-aware */
blow_up_landmine(trap);
/* explosion might have destroyed a drawbridge; don't
dish out more damage if monster is already dead */
if (DEADMONSTER(mtmp)
|| thitm(0, mtmp, (struct obj *) 0, rnd(16), FALSE)) {
trapkilled = TRUE;
} else {
/* monsters recursively fall into new pit */
if (mintrap(mtmp) == 2)
trapkilled = TRUE;
}
/* a boulder may fill the new pit, crushing monster */
fill_pit(tx, ty); /* thitm may have already destroyed the trap */
if (DEADMONSTER(mtmp))
trapkilled = TRUE;
if (unconscious()) {
g.multi = -1;
g.nomovemsg = "The explosion awakens you!";
}
break; break;
case POLY_TRAP: case POLY_TRAP:
return trapeffect_poly_trap(mtmp, trap, 0); return trapeffect_poly_trap(mtmp, trap, 0);