summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source/mstuff2.cc
diff options
context:
space:
mode:
Diffstat (limited to 'crawl-ref/source/mstuff2.cc')
-rw-r--r--crawl-ref/source/mstuff2.cc374
1 files changed, 0 insertions, 374 deletions
diff --git a/crawl-ref/source/mstuff2.cc b/crawl-ref/source/mstuff2.cc
index 5eeaaf3c1a..773e4433cf 100644
--- a/crawl-ref/source/mstuff2.cc
+++ b/crawl-ref/source/mstuff2.cc
@@ -42,380 +42,6 @@
static int _monster_abjuration(const monsters *caster, bool actual);
-// NB: only works because grid location already verified
-// to be some sort of trap prior to function call: {dlb}
-void mons_trap(monsters *monster)
-{
- if (!is_trap_square(grd(monster->pos())))
- return;
-
- // single calculation permissible {dlb}
- bool monsterNearby = mons_near(monster);
-
- const int which_trap = trap_at_xy(monster->pos());
- if (which_trap == -1)
- return;
-
- trap_struct& trap(env.trap[which_trap]);
-
- bool trapKnown = (grd(monster->pos()) != DNGN_UNDISCOVERED_TRAP);
- bool revealTrap = false; // more sophisticated trap uncovering {dlb}
- bool projectileFired = false; // <sigh> I had to do it, I swear {dlb}
- int damage_taken = -1; // must initialize at -1 for this f(x) {dlb}
-
- bolt beem;
-
-
- // flying monsters neatly avoid mechanical traps
- // and may actually exit this function early: {dlb}
- if (mons_flies(monster))
- {
- if (trap_category(trap.type) == DNGN_TRAP_MECHANICAL)
- {
- if (trapKnown)
- simple_monster_message(monster, " flies safely over a trap.");
-
- return; // early return {dlb}
- }
- }
-
- // Trap damage to monsters is not a function of level, because they
- // are fairly stupid and tend to have fewer hp than players -- this
- // choice prevents traps from easily killing large monsters fairly
- // deep within the dungeon.
- switch (trap.type)
- {
- case TRAP_DART:
- projectileFired = true;
- beem.name = " dart";
- beem.damage = dice_def( 1, 4 );
- beem.colour = OBJ_MISSILES;
- beem.type = MI_DART;
- break;
- case TRAP_NEEDLE:
- projectileFired = true;
- beem.name = " needle";
- beem.damage = dice_def( 1, 0 );
- beem.colour = OBJ_MISSILES;
- beem.type = MI_NEEDLE;
- break;
- case TRAP_ARROW:
- projectileFired = true;
- beem.name = "n arrow";
- beem.damage = dice_def( 1, 7 );
- beem.colour = OBJ_MISSILES;
- beem.type = MI_ARROW;
- break;
- case TRAP_SPEAR:
- projectileFired = true;
- beem.name = " spear";
- beem.damage = dice_def( 1, 10 );
- beem.colour = OBJ_WEAPONS;
- beem.type = WPN_SPEAR;
- break;
- case TRAP_BOLT:
- projectileFired = true;
- beem.name = " bolt";
- beem.damage = dice_def( 1, 13 );
- beem.colour = OBJ_MISSILES;
- beem.type = MI_BOLT;
- break;
- case TRAP_AXE:
- projectileFired = true;
- beem.name = "n axe";
- beem.damage = dice_def( 1, 15 );
- beem.colour = OBJ_WEAPONS;
- beem.type = WPN_HAND_AXE;
- break;
- // teleport traps are *never* revealed through
- // the triggering action of a monster, as any
- // number of factors could have been in play: {dlb}
- case TRAP_TELEPORT:
- monster_teleport(monster, true);
- break;
- // Alarm traps aren't set off by hostile monsters, because that would
- // be way too nasty for the player.
- case TRAP_ALARM:
- if (!mons_friendly(monster) || silenced(monster->pos()))
- {
- if (trapKnown && you.can_see(monster) && !silenced(you.pos()))
- {
- mpr("The alarm trap makes no noise.");
- }
- return;
- }
-
- noisy(12, monster->pos());
-
- if (!silenced(you.pos()))
- {
- if (monsterNearby)
- {
- mpr("You hear a blaring wail!", MSGCH_SOUND);
- if (you.can_see(monster))
- revealTrap = true;
- }
- else
- mpr("You hear a distant blaring wail!", MSGCH_SOUND);
- }
-
- break;
- // blade traps sometimes fail to trigger altogether,
- // resulting in an "early return" from this f(x) for
- // some - otherwise, blade *always* revealed: {dlb}
- case TRAP_BLADE:
- if (one_chance_in(5)
- || trapKnown && intelligent_ally(monster) && coinflip())
- {
- if (trapKnown)
- {
- simple_monster_message(monster,
- " fails to trigger a blade trap.");
- }
- return; // early return {dlb}
- }
-
- if (random2(monster->ev) > 8
- || trapKnown && intelligent_ally(monster)
- && random2(monster->ev) > 8)
- {
- if (monsterNearby && !simple_monster_message(monster,
- " avoids a huge, swinging blade."))
- {
- mpr("A huge blade swings out!");
- }
-
- damage_taken = -1; // just to be certain {dlb}
- }
- else
- {
- if (monsterNearby)
- {
- std::string msg = "A huge blade swings out";
- if (player_monster_visible( monster ))
- {
- msg += " and slices into ";
- msg += monster->name(DESC_NOCAP_THE);
- }
- msg += "!";
- mpr(msg.c_str());
- }
-
- damage_taken = 10 + random2avg(29, 2);
- damage_taken -= random2(1 + monster->ac);
-
- if (damage_taken < 0)
- damage_taken = 0;
-
- if (!mons_is_summoned(monster))
- {
- bleed_onto_floor(monster->pos(), monster->type,
- damage_taken, true);
- }
- }
-
- revealTrap = true;
- break;
-
- case TRAP_NET:
- {
- if (one_chance_in(3)
- || trapKnown && intelligent_ally(monster) && coinflip())
- {
- if (trapKnown)
- {
- simple_monster_message(monster,
- " fails to trigger a net trap.");
- }
- return;
- }
-
- if (random2(monster->ev) > 8
- || trapKnown && intelligent_ally(monster)
- && random2(monster->ev) > 8)
- {
- if (monsterNearby && !simple_monster_message(monster,
- " nimbly jumps out of the way of a falling net."))
- {
- mpr("A large net falls down!");
- }
- }
- else
- {
- if (monsterNearby)
- {
- std::string msg = "A large net falls down";
- if (player_monster_visible( monster ))
- {
- msg += " onto ";
- msg += monster->name(DESC_NOCAP_THE);
- }
- msg += "!";
- mpr(msg.c_str());
- monster_caught_in_net(monster, beem);
- }
- }
- trap_item( OBJ_MISSILES, MI_THROWING_NET, trap.pos );
-
- if (mons_is_caught(monster))
- mark_net_trapping(monster->pos());
-
- grd(trap.pos) = DNGN_FLOOR;
- trap.type = TRAP_UNASSIGNED;
- break;
- }
- // zot traps are out to get *the player*! Hostile monsters
- // benefit and friendly monsters suffer - such is life - on
- // rare occasion, the trap affects nearby players, triggering
- // an "early return" - zot traps are *never* revealed - instead,
- // enchantment messages serve as clues to the trap's presence: {dlb}
- case TRAP_ZOT:
- if (mons_friendly(monster) || mons_good_neutral(monster))
- {
- MiscastEffect( monster, ZOT_TRAP_MISCAST, SPTYP_RANDOM,
- 3, "the power of Zot" );
- return; // early return
- }
- else if (monsterNearby)
- {
- if (one_chance_in(5))
- {
- mpr("The power of Zot is invoked against you!");
- MiscastEffect( &you, ZOT_TRAP_MISCAST, SPTYP_RANDOM,
- 3, "the power of Zot" );
-
- return; // early return {dlb}
- }
- }
-
- // output triggering message to player, where appropriate: {dlb}
- if (!silenced(monster->pos()) && !silenced(you.pos()))
- {
- if (monsterNearby)
- mpr("You hear a loud \"Zot\"!", MSGCH_SOUND);
- else
- mpr("You hear a distant \"Zot\"!", MSGCH_SOUND);
- }
-
- // XXX: It seem that back when a beam's colour determined its
- // flavour that Zot traps would heal, haste or make invisible
- // hostile monsters. The code has been fixed to work but
- // commented out.
-#if 0
- if (!mons_friendly(monster) && !mons_good_neutral(monster))
- {
- int temp_rand = random2(16);
-
- beem.thrower = KILL_MON; // probably unnecessary
- beem.aux_source.clear();
- beem.flavour = ((temp_rand < 3) ? BEAM_HASTE : // 3 in 16 {dlb}
- (temp_rand < 7) ? BEAM_INVISIBILITY //4 in 16 {dlb}
- : BEAM_HEALING); // 9 in 16 {dlb}
- mons_ench_f2(monster, beem);
- }
-#endif
-
- damage_taken = 0; // just to be certain {dlb}
- break;
-
- case TRAP_SHAFT:
- // Paranoia
- if (!is_valid_shaft_level())
- {
- if (trapKnown && monsterNearby)
- mpr("The shaft disappears in a puff of logic!");
-
- grd(trap.pos) = DNGN_FLOOR;
- trap.type = TRAP_UNASSIGNED;
- return;
- }
-
- if (!monster->will_trigger_shaft()
- || trapKnown && intelligent_ally(monster))
- {
- if (trapKnown && !monster->airborne())
- simple_monster_message(monster,
- " doesn't fall through the shaft.");
- return;
- }
-
- if (monster->do_shaft())
- revealTrap = true;
- break;
-
- default:
- break;
- }
-
-
- // go back and handle projectile traps: {dlb}
- bool apply_poison = false;
-
- if (projectileFired)
- {
- // projectile traps *always* revealed after "firing": {dlb}
- revealTrap = true;
-
- // determine whether projectile hits, calculate damage: {dlb}
- if (((20 + (you.your_level * 2)) * random2(200)) / 100
- >= monster->ev)
- {
- damage_taken = roll_dice( beem.damage );
- damage_taken -= random2(1 + monster->ac);
-
- if (damage_taken < 0)
- damage_taken = 0;
-
- if (beem.colour == OBJ_MISSILES
- && beem.type == MI_NEEDLE
- && x_chance_in_y(50 - (3 * monster->ac)/ 2, 100))
- {
- apply_poison = true;
- }
- }
- else
- {
- damage_taken = -1; // negative damage marks a miss
- }
-
- if (monsterNearby)
- {
- mprf("A%s %s %s%s!",
- beem.name.c_str(),
- (damage_taken >= 0) ? "hits" : "misses",
- monster->name(DESC_NOCAP_THE).c_str(),
- (damage_taken == 0) ? ", but does no damage" : "");
- }
-
- if (apply_poison)
- poison_monster( monster, KC_OTHER );
-
- // Generate "fallen" projectile, where appropriate. {dlb}
- if (x_chance_in_y(7, 10))
- {
- beem.target = monster->pos();
- itrap(beem, which_trap);
- }
- }
-
-
- // reveal undiscovered traps, where appropriate: {dlb}
- if (monsterNearby && !trapKnown && revealTrap)
- grd(trap.pos) = trap_category(trap.type);
-
- // apply damage and handle death, where appropriate: {dlb}
- if (damage_taken > 0)
- {
- hurt_monster(monster, damage_taken);
-
- if (monster->hit_points < 1)
- {
- monster_die(monster, KILL_MISC, NON_MONSTER);
- monster->speed_increment = 1;
- }
- }
-}
-
static bool _mons_abjured(monsters *monster, bool nearby)
{
if (nearby && _monster_abjuration(monster, false) > 0