diff options
Diffstat (limited to 'crawl-ref/source/mstuff2.cc')
-rw-r--r-- | crawl-ref/source/mstuff2.cc | 374 |
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 |