Split trap victim generation into separate function
This commit is contained in:
225
src/mklev.c
225
src/mklev.c
@@ -22,6 +22,7 @@ void clear_level_structures(void);
|
|||||||
static void fill_ordinary_room(struct mkroom *);
|
static void fill_ordinary_room(struct mkroom *);
|
||||||
static void makelevel(void);
|
static void makelevel(void);
|
||||||
static boolean bydoor(coordxy, coordxy);
|
static boolean bydoor(coordxy, coordxy);
|
||||||
|
static void mktrap_victim(struct trap *);
|
||||||
static struct mkroom *find_branch_room(coord *);
|
static struct mkroom *find_branch_room(coord *);
|
||||||
static struct mkroom *pos_to_room(coordxy, coordxy);
|
static struct mkroom *pos_to_room(coordxy, coordxy);
|
||||||
static boolean place_niche(struct mkroom *, coordxy *, coordxy *, coordxy *);
|
static boolean place_niche(struct mkroom *, coordxy *, coordxy *, coordxy *);
|
||||||
@@ -1390,6 +1391,122 @@ occupied(coordxy x, coordxy y)
|
|||||||
|| invocation_pos(x, y));
|
|| invocation_pos(x, y));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* generate a corpse and some items on top of a trap */
|
||||||
|
static void
|
||||||
|
mktrap_victim(struct trap *ttmp)
|
||||||
|
{
|
||||||
|
/* Object generated by the trap; initially NULL, stays NULL if
|
||||||
|
we fail to generate an object or if the trap doesn't
|
||||||
|
generate objects. */
|
||||||
|
struct obj *otmp = NULL;
|
||||||
|
int victim_mnum; /* race of the victim */
|
||||||
|
unsigned lvl = level_difficulty();
|
||||||
|
int kind = ttmp->ttyp;
|
||||||
|
coordxy x = ttmp->tx, y = ttmp->ty;
|
||||||
|
|
||||||
|
/* Not all trap types have special handling here; only the ones
|
||||||
|
that kill in a specific way that's obvious after the fact. */
|
||||||
|
switch (kind) {
|
||||||
|
case ARROW_TRAP:
|
||||||
|
otmp = mksobj(ARROW, TRUE, FALSE);
|
||||||
|
otmp->opoisoned = 0;
|
||||||
|
/* don't adjust the quantity; maybe the trap shot multiple
|
||||||
|
times, there was an untrapping attempt, etc... */
|
||||||
|
break;
|
||||||
|
case DART_TRAP:
|
||||||
|
otmp = mksobj(DART, TRUE, FALSE);
|
||||||
|
break;
|
||||||
|
case ROCKTRAP:
|
||||||
|
otmp = mksobj(ROCK, TRUE, FALSE);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
/* no item dropped by the trap */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (otmp) {
|
||||||
|
place_object(otmp, x, y);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* now otmp is reused for other items we're placing */
|
||||||
|
|
||||||
|
/* Place a random possession. This could be a weapon, tool,
|
||||||
|
food, or gem, i.e. the item classes that are typically
|
||||||
|
nonmagical and not worthless. */
|
||||||
|
do {
|
||||||
|
int poss_class = RANDOM_CLASS; /* init => lint suppression */
|
||||||
|
|
||||||
|
switch (rn2(4)) {
|
||||||
|
case 0:
|
||||||
|
poss_class = WEAPON_CLASS;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
poss_class = TOOL_CLASS;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
poss_class = FOOD_CLASS;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
poss_class = GEM_CLASS;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
otmp = mkobj(poss_class, FALSE);
|
||||||
|
/* these items are always cursed, both for flavour (owned
|
||||||
|
by a dead adventurer, bones-pile-style) and for balance
|
||||||
|
(less useful to use, and encourage pets to avoid the trap) */
|
||||||
|
if (otmp) {
|
||||||
|
otmp->blessed = 0;
|
||||||
|
otmp->cursed = 1;
|
||||||
|
otmp->owt = weight(otmp);
|
||||||
|
place_object(otmp, x, y);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 20% chance of placing an additional item, recursively */
|
||||||
|
} while (!rn2(5));
|
||||||
|
|
||||||
|
/* Place a corpse. */
|
||||||
|
switch (rn2(15)) {
|
||||||
|
case 0:
|
||||||
|
/* elf corpses are the rarest as they're the most useful */
|
||||||
|
victim_mnum = PM_ELF;
|
||||||
|
/* elven adventurers get sleep resistance early; so don't
|
||||||
|
generate elf corpses on sleeping gas traps unless a)
|
||||||
|
we're on dlvl 2 (1 is impossible) and b) we pass a coin
|
||||||
|
flip */
|
||||||
|
if (kind == SLP_GAS_TRAP && !(lvl <= 2 && rn2(2)))
|
||||||
|
victim_mnum = PM_HUMAN;
|
||||||
|
break;
|
||||||
|
case 1: case 2:
|
||||||
|
victim_mnum = PM_DWARF;
|
||||||
|
break;
|
||||||
|
case 3: case 4: case 5:
|
||||||
|
victim_mnum = PM_ORC;
|
||||||
|
break;
|
||||||
|
case 6: case 7: case 8: case 9:
|
||||||
|
/* more common as they could have come from the Mines */
|
||||||
|
victim_mnum = PM_GNOME;
|
||||||
|
/* 10% chance of a candle too */
|
||||||
|
if (!rn2(10)) {
|
||||||
|
otmp = mksobj(rn2(4) ? TALLOW_CANDLE : WAX_CANDLE,
|
||||||
|
TRUE, FALSE);
|
||||||
|
otmp->quan = 1;
|
||||||
|
otmp->blessed = 0;
|
||||||
|
otmp->cursed = 1;
|
||||||
|
otmp->owt = weight(otmp);
|
||||||
|
place_object(otmp, x, y);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
/* the most common race */
|
||||||
|
victim_mnum = PM_HUMAN;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
otmp = mkcorpstat(CORPSE, NULL, &mons[victim_mnum], x, y,
|
||||||
|
CORPSTAT_INIT);
|
||||||
|
if (otmp)
|
||||||
|
otmp->age -= (TAINT_AGE + 1); /* died too long ago to eat */
|
||||||
|
}
|
||||||
|
|
||||||
/* make a trap somewhere (in croom if mazeflag = 0 && !tm) */
|
/* make a trap somewhere (in croom if mazeflag = 0 && !tm) */
|
||||||
/* if tm != null, make trap at that location */
|
/* if tm != null, make trap at that location */
|
||||||
void
|
void
|
||||||
@@ -1561,113 +1678,7 @@ mktrap(
|
|||||||
&& !(kind == ROLLING_BOULDER_TRAP
|
&& !(kind == ROLLING_BOULDER_TRAP
|
||||||
&& t->launch.x == t->tx && t->launch.y == t->ty)
|
&& t->launch.x == t->tx && t->launch.y == t->ty)
|
||||||
&& !is_pit(kind) && kind < HOLE) {
|
&& !is_pit(kind) && kind < HOLE) {
|
||||||
/* Object generated by the trap; initially NULL, stays NULL if
|
mktrap_victim(t);
|
||||||
we fail to generate an object or if the trap doesn't
|
|
||||||
generate objects. */
|
|
||||||
struct obj *otmp = NULL;
|
|
||||||
int victim_mnum; /* race of the victim */
|
|
||||||
|
|
||||||
/* Not all trap types have special handling here; only the ones
|
|
||||||
that kill in a specific way that's obvious after the fact. */
|
|
||||||
switch (kind) {
|
|
||||||
case ARROW_TRAP:
|
|
||||||
otmp = mksobj(ARROW, TRUE, FALSE);
|
|
||||||
otmp->opoisoned = 0;
|
|
||||||
/* don't adjust the quantity; maybe the trap shot multiple
|
|
||||||
times, there was an untrapping attempt, etc... */
|
|
||||||
break;
|
|
||||||
case DART_TRAP:
|
|
||||||
otmp = mksobj(DART, TRUE, FALSE);
|
|
||||||
break;
|
|
||||||
case ROCKTRAP:
|
|
||||||
otmp = mksobj(ROCK, TRUE, FALSE);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
/* no item dropped by the trap */
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (otmp) {
|
|
||||||
place_object(otmp, m.x, m.y);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* now otmp is reused for other items we're placing */
|
|
||||||
|
|
||||||
/* Place a random possession. This could be a weapon, tool,
|
|
||||||
food, or gem, i.e. the item classes that are typically
|
|
||||||
nonmagical and not worthless. */
|
|
||||||
do {
|
|
||||||
int poss_class = RANDOM_CLASS; /* init => lint suppression */
|
|
||||||
|
|
||||||
switch (rn2(4)) {
|
|
||||||
case 0:
|
|
||||||
poss_class = WEAPON_CLASS;
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
poss_class = TOOL_CLASS;
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
poss_class = FOOD_CLASS;
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
poss_class = GEM_CLASS;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
otmp = mkobj(poss_class, FALSE);
|
|
||||||
/* these items are always cursed, both for flavour (owned
|
|
||||||
by a dead adventurer, bones-pile-style) and for balance
|
|
||||||
(less useful to use, and encourage pets to avoid the trap) */
|
|
||||||
if (otmp) {
|
|
||||||
otmp->blessed = 0;
|
|
||||||
otmp->cursed = 1;
|
|
||||||
otmp->owt = weight(otmp);
|
|
||||||
place_object(otmp, m.x, m.y);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 20% chance of placing an additional item, recursively */
|
|
||||||
} while (!rn2(5));
|
|
||||||
|
|
||||||
/* Place a corpse. */
|
|
||||||
switch (rn2(15)) {
|
|
||||||
case 0:
|
|
||||||
/* elf corpses are the rarest as they're the most useful */
|
|
||||||
victim_mnum = PM_ELF;
|
|
||||||
/* elven adventurers get sleep resistance early; so don't
|
|
||||||
generate elf corpses on sleeping gas traps unless a)
|
|
||||||
we're on dlvl 2 (1 is impossible) and b) we pass a coin
|
|
||||||
flip */
|
|
||||||
if (kind == SLP_GAS_TRAP && !(lvl <= 2 && rn2(2)))
|
|
||||||
victim_mnum = PM_HUMAN;
|
|
||||||
break;
|
|
||||||
case 1: case 2:
|
|
||||||
victim_mnum = PM_DWARF;
|
|
||||||
break;
|
|
||||||
case 3: case 4: case 5:
|
|
||||||
victim_mnum = PM_ORC;
|
|
||||||
break;
|
|
||||||
case 6: case 7: case 8: case 9:
|
|
||||||
/* more common as they could have come from the Mines */
|
|
||||||
victim_mnum = PM_GNOME;
|
|
||||||
/* 10% chance of a candle too */
|
|
||||||
if (!rn2(10)) {
|
|
||||||
otmp = mksobj(rn2(4) ? TALLOW_CANDLE : WAX_CANDLE,
|
|
||||||
TRUE, FALSE);
|
|
||||||
otmp->quan = 1;
|
|
||||||
otmp->blessed = 0;
|
|
||||||
otmp->cursed = 1;
|
|
||||||
otmp->owt = weight(otmp);
|
|
||||||
place_object(otmp, m.x, m.y);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
/* the most common race */
|
|
||||||
victim_mnum = PM_HUMAN;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
otmp = mkcorpstat(CORPSE, NULL, &mons[victim_mnum], m.x, m.y,
|
|
||||||
CORPSTAT_INIT);
|
|
||||||
if (otmp)
|
|
||||||
otmp->age -= (TAINT_AGE + 1); /* died too long ago to eat */
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user