diff options
-rw-r--r-- | crawl-ref/source/acr.cc | 16 | ||||
-rw-r--r-- | crawl-ref/source/dat/database/monspeak.txt | 4 | ||||
-rw-r--r-- | crawl-ref/source/enum.h | 5 | ||||
-rw-r--r-- | crawl-ref/source/itemprop.cc | 8 | ||||
-rw-r--r-- | crawl-ref/source/mon-util.cc | 71 | ||||
-rw-r--r-- | crawl-ref/source/monstuff.cc | 37 | ||||
-rw-r--r-- | crawl-ref/source/mstuff2.cc | 963 | ||||
-rw-r--r-- | crawl-ref/source/shopping.cc | 4 |
8 files changed, 582 insertions, 526 deletions
diff --git a/crawl-ref/source/acr.cc b/crawl-ref/source/acr.cc index 5587dd31da..9f7a8c79f2 100644 --- a/crawl-ref/source/acr.cc +++ b/crawl-ref/source/acr.cc @@ -416,6 +416,13 @@ static void _startup_tutorial() } #ifdef WIZARD +// returns whether an item of this type can be an artefact, or cursed +static bool _item_type_can_be_artefact( int type) +{ + return (type == OBJ_WEAPONS || type == OBJ_ARMOUR || type == OBJ_JEWELLERY); +} + + static void _handle_wizard_command( void ) { int wiz_command, i, j, tmp; @@ -552,9 +559,7 @@ static void _handle_wizard_command( void ) break; } - if (you.inv[i].base_type != OBJ_WEAPONS - && you.inv[i].base_type != OBJ_ARMOUR - && you.inv[i].base_type != OBJ_JEWELLERY) + if (!_item_type_can_be_artefact(you.inv[i].base_type)) { mpr("That item cannot be turned into an artefact."); break; @@ -663,11 +668,8 @@ static void _handle_wizard_command( void ) if (item_cursed(item)) do_uncurse_item(item); - else if (item.base_type == OBJ_WEAPONS || item.base_type == OBJ_ARMOUR - || item.base_type == OBJ_JEWELLERY) - { + else if (_item_type_can_be_artefact(item.base_type)) do_curse_item(item); - } else mpr("That item cannot be cursed."); break; diff --git a/crawl-ref/source/dat/database/monspeak.txt b/crawl-ref/source/dat/database/monspeak.txt index 3ccefbba50..2f5d4d8887 100644 --- a/crawl-ref/source/dat/database/monspeak.txt +++ b/crawl-ref/source/dat/database/monspeak.txt @@ -2112,7 +2112,7 @@ maim related beogh orc # hostile orcs shouldn't be too talkative -w:70 +w:80 __NONE w:30 @@ -2174,7 +2174,7 @@ VISUAL:@The_monster@ stares at you quizzically. friendly related beogh orc # As they'll be constantly around you, don't let them talk too much. -w:30 +w:50 __NONE # general friendly speech diff --git a/crawl-ref/source/enum.h b/crawl-ref/source/enum.h index 4e4b8885f2..0d44153e1d 100644 --- a/crawl-ref/source/enum.h +++ b/crawl-ref/source/enum.h @@ -1287,8 +1287,9 @@ enum item_status_flag_type // per item flags: ie. ident status, cursed status ISFLAG_NOTED_ID = 0x08000000, ISFLAG_NOTED_GET = 0x10000000, - ISFLAG_BEEN_IN_INV = 0x20000000, // Item has been in inventory - ISFLAG_SUMMONED = 0x40000000 // Item generated on a summon + ISFLAG_BEEN_IN_INV = 0x20000000, // Item has been in inventory + ISFLAG_SUMMONED = 0x40000000, // Item generated on a summon + ISFLAG_DROPPED_BY_ALLY = 0x80000000 // Item was dropped by an ally }; enum job_type diff --git a/crawl-ref/source/itemprop.cc b/crawl-ref/source/itemprop.cc index adf95714fe..1313107109 100644 --- a/crawl-ref/source/itemprop.cc +++ b/crawl-ref/source/itemprop.cc @@ -137,10 +137,12 @@ static armour_def Armour_prop[NUM_ARMOURS] = // and shapeshift status. { ARM_BOOTS, "boots", 1, 0, 30, true, EQ_BOOTS, SIZE_SMALL, SIZE_MEDIUM }, + // Changed max. barding size to large to allow for the appropriate + // monsters that don't differentiate between torso and general. { ARM_CENTAUR_BARDING, "centaur barding", 4, -2, 100, - true, EQ_BOOTS, SIZE_MEDIUM, SIZE_MEDIUM }, + true, EQ_BOOTS, SIZE_MEDIUM, SIZE_LARGE }, { ARM_NAGA_BARDING, "naga barding", 4, -2, 100, - true, EQ_BOOTS, SIZE_MEDIUM, SIZE_MEDIUM }, + true, EQ_BOOTS, SIZE_MEDIUM, SIZE_LARGE }, // Note: shields use ac-value as sh-value, EV pen is used for heavy_shield { ARM_BUCKLER, "buckler", 3, 0, 90, @@ -767,7 +769,7 @@ void set_equip_race( item_def &item, unsigned long flags ) } break; case OBJ_ARMOUR: - if ((get_armour_slot(item) == EQ_HELMET && !is_hard_helmet(item)) + if (get_armour_slot(item) == EQ_HELMET && !is_hard_helmet(item) || item.sub_type == ARM_ROBE || item.sub_type == ARM_LEATHER_ARMOUR) { diff --git a/crawl-ref/source/mon-util.cc b/crawl-ref/source/mon-util.cc index 5e38dab998..4a1184fbc4 100644 --- a/crawl-ref/source/mon-util.cc +++ b/crawl-ref/source/mon-util.cc @@ -51,6 +51,7 @@ #include "player.h" #include "randart.h" #include "religion.h" +#include "shopping.h" // for item values #include "spells3.h" #include "spl-util.h" #include "stuff.h" @@ -1955,7 +1956,7 @@ int mons_base_damage_brand(const monsters *m) return (SPWPN_NORMAL); } -int mons_size(const monsters *m) +size_type mons_size(const monsters *m) { return m->body_size(); } @@ -1968,7 +1969,7 @@ bool mons_friendly(const monsters *m) bool mons_neutral(const monsters *m) { return (m->attitude == ATT_NEUTRAL || m->has_ench(ENCH_NEUTRAL) - || m->attitude == ATT_GOOD_NEUTRAL); + || m->attitude == ATT_GOOD_NEUTRAL); } bool mons_good_neutral(const monsters *m) @@ -2046,7 +2047,7 @@ bool mons_looks_distracted(const monsters *m) { return (mons_behaviour_perceptible(m) && !mons_friendly(m) - && ((m->foe != MHITYOU && !mons_is_batty(m) && !mons_neutral(m)) + && (m->foe != MHITYOU && !mons_is_batty(m) && !mons_neutral(m) || mons_is_confused(m) || mons_is_fleeing(m) || mons_is_caught(m))); @@ -3240,6 +3241,9 @@ bool monsters::drop_item(int eslot, int near) return (false); } + if (mons_friendly(this)) + mitm[index].flags |= ISFLAG_DROPPED_BY_ALLY; + if (need_message(near)) mprf("%s drops %s.", name(DESC_CAP_THE).c_str(), iname.c_str()); @@ -3386,11 +3390,22 @@ bool monsters::wants_weapon(const item_def &weap) const return (true); } +static bool _item_race_matches_monster(const item_def &item, monsters *mons) +{ + return (get_equip_race(item) == ISFLAG_ELVEN + && mons_genus(mons->type) == MONS_ELF + || get_equip_race(item) == ISFLAG_ORCISH + && mons_genus(mons->type) == MONS_ORC); +} + +// FIXME: Need monster body-size handling. bool monsters::wants_armour(const item_def &item) const { - // FIXME: Need monster body-size handling. For now, never attempt to - // change armour. - return (!mslot_item(MSLOT_ARMOUR)); + // Returns whether this armour is the monster's size. + return (check_armour_size(item, mons_size(this))); + +// For now, never attempt to change armour. +// return (!mslot_item(MSLOT_ARMOUR)); } static mon_inv_type _equip_slot_to_mslot(equipment_type eq) @@ -3436,7 +3451,6 @@ bool monsters::pickup_armour(item_def &item, int near, bool force) return false; // XXX: Monsters can only equip body armour and shields (as of 0.4). - // They can still be forced to wear stuff - this is needed for bardings. if (!force && eq != EQ_BODY_ARMOUR && eq != EQ_SHIELD) return (false); @@ -3444,13 +3458,37 @@ bool monsters::pickup_armour(item_def &item, int near, bool force) if (mslot == NUM_MONSTER_SLOTS) return false; - // XXX: Very simplistic armour evaluation for the moment. - // Because of the way wants_armour() is handled above, this armour exchange - // currently only takes place if forced by wizard mode. + int newAC = item.armour_rating(); + // no armour yet -> get this one + if (!mslot_item(mslot) && newAC > 0) + return pickup(item, mslot, near); + + // XXX: Very simplistic armour evaluation (AC comparison) for the moment. + // This should take resistances into account. if (const item_def *existing_armour = slot_item(eq)) { - if (!force && existing_armour->armour_rating() >= item.armour_rating()) - return (false); + if (!force) + { + int oldAC = existing_armour->armour_rating(); + if (oldAC > newAC) + return (false); + + if (oldAC == newAC) + { + // compare item value (uses resistances and such) + int oldval = item_value(*existing_armour); + int newval = item_value(item); + + // vastly prefer matching racial type + if (_item_race_matches_monster(*existing_armour, this)) + oldval *= 2; + if (_item_race_matches_monster(item, this)) + newval *= 2; + + if (oldval >= newval) + return (false); + } + } if (!drop_item(mslot, near)) return (false); @@ -3623,9 +3661,16 @@ bool monsters::pickup_item(item_def &item, int near, bool force) return false; } + // Friendlies may only pick up stuff dropped by (other) allies. + if (mons_friendly(this) + && !testbits(item.flags, ISFLAG_DROPPED_BY_ALLY)) + { + return false; + } + // These are not important enough for pickup when seeking, fleeing etc. const int itype = item.base_type; - if (!wandering + if (!wandering && (!mons_friendly(this) || foe != MHITYOU) && (itype == OBJ_ARMOUR || itype == OBJ_CORPSES || itype == OBJ_MISCELLANY || itype == OBJ_GOLD)) { diff --git a/crawl-ref/source/monstuff.cc b/crawl-ref/source/monstuff.cc index 7d8f7f130d..f7265307ec 100644 --- a/crawl-ref/source/monstuff.cc +++ b/crawl-ref/source/monstuff.cc @@ -293,11 +293,13 @@ static void _monster_drop_ething(monsters *monster, } else { + if (mons_friendly(monster) && is_valid_item(mitm[item])) + mitm[item].flags |= ISFLAG_DROPPED_BY_ALLY; + move_item_to_grid( &item, monster->x, monster->y ); + if (mark_item_origins && is_valid_item(mitm[item])) - { origin_set_monster(mitm[item], monster); - } } monster->inv[i] = NON_ITEM; @@ -716,12 +718,13 @@ void monster_die(monsters *monster, killer_type killer, int i, bool silent) update_beholders(monster, true); const int monster_killed = monster_index(monster); - bool death_message - = !silent && mons_near(monster) && player_monster_visible(monster); - bool in_transit = false; - const bool hard_reset = testbits(monster->flags, MF_HARD_RESET); - bool drop_items = !hard_reset; - const bool gives_xp = !monster->has_ench(ENCH_ABJ); + const bool hard_reset = testbits(monster->flags, MF_HARD_RESET); + const bool gives_xp = !monster->has_ench(ENCH_ABJ); + + bool death_message = !silent && mons_near(monster) + && player_monster_visible(monster); + bool in_transit = false; + bool drop_items = !hard_reset; #ifdef DGL_MILESTONES _check_kill_milestone(monster, killer, i); @@ -3664,8 +3667,8 @@ static bool _handle_wand(monsters *monster, bolt &beem) return (false); // set up the beam - int power = 30 + monster->hit_dice; - bolt theBeam = mons_spells(mzap, power); + int power = 30 + monster->hit_dice; + bolt theBeam = mons_spells(mzap, power); beem.name = theBeam.name; beem.beam_source = monster_index(monster); @@ -4493,8 +4496,10 @@ static bool _handle_throw(monsters *monster, bolt & beem) // completely useless, so bail out if (mitm[mon_item].base_type == OBJ_MISSILES && mitm[mon_item].sub_type == MI_THROWING_NET - && (beem.target_x == you.x_pos && beem.target_y == you.y_pos - && you.caught())) + && ( beem.target_x == you.x_pos && beem.target_y == you.y_pos + && you.caught() + || mgrd[beem.target_x][beem.target_y] != NON_MONSTER + && mons_is_caught(&menv[mgrd[beem.target_x][beem.target_y]]) )) { return (false); } @@ -4813,8 +4818,8 @@ static void _handle_monster_move(int i, monsters *monster) || monster->type == MONS_NECROPHAGE || monster->type == MONS_GHOUL)) { - // keep permanent friendlies from picking up stuff - if (monster->attitude != ATT_FRIENDLY) + // keep neutral and charmed monsters from picking up stuff + if (!mons_neutral(monster) && !monster->has_ench(ENCH_CHARM)) { if (_handle_pickup(monster)) { @@ -5165,6 +5170,10 @@ static bool _handle_pickup(monsters *monster) if (mons_itemuse(monster->type) == MONUSE_EATS_ITEMS) { + // Friendly jellies won't eat. + if (monster->attitude != ATT_HOSTILE) + return (false); + int midx = monster_index(monster); int hps_gained = 0; int max_eat = roll_dice( 1, 10 ); diff --git a/crawl-ref/source/mstuff2.cc b/crawl-ref/source/mstuff2.cc index e33cb73b7f..65bc682b2d 100644 --- a/crawl-ref/source/mstuff2.cc +++ b/crawl-ref/source/mstuff2.cc @@ -48,7 +48,7 @@ #include "traps.h" #include "view.h" -static int monster_abjuration(const monsters *mons, bool test); +static int _monster_abjuration(const monsters *mons, bool test); // XXX: must fix species abils to not use duration 15 // -- ummm ... who wrote this? {dlb} @@ -433,19 +433,19 @@ void mons_trap(struct monsters *monster) return; } // end mons_trap() -static bool mons_abjured(monsters *monster, bool nearby) +static bool _mons_abjured(monsters *monster, bool nearby) { - if (nearby && monster_abjuration(monster, true) > 0 + if (nearby && _monster_abjuration(monster, true) > 0 && coinflip()) { - monster_abjuration(monster, false); + _monster_abjuration(monster, false); return (true); } return (false); } -static monster_type pick_random_wraith() +static monster_type _pick_random_wraith() { static monster_type wraiths[] = { @@ -455,13 +455,13 @@ static monster_type pick_random_wraith() return wraiths[ random2(sizeof(wraiths) / sizeof(*wraiths)) ]; } -static monster_type pick_horrible_thing() +static monster_type _pick_horrible_thing() { return (one_chance_in(4)? MONS_TENTACLED_MONSTROSITY : MONS_ABOMINATION_LARGE); } -static monster_type pick_undead_summon() +static monster_type _pick_undead_summon() { int summonik = MONS_PROGRAM_BUG; @@ -475,11 +475,11 @@ static monster_type pick_undead_summon() return static_cast<monster_type>(summonik); } -static void do_high_level_summon(monsters *monster, bool monsterNearby, - monster_type (*mpicker)(), - int nsummons) +static void _do_high_level_summon(monsters *monster, bool monsterNearby, + monster_type (*mpicker)(), + int nsummons) { - if (mons_abjured(monster, monsterNearby)) + if (_mons_abjured(monster, monsterNearby)) return; const int duration = std::min(2 + monster->hit_dice / 5, 6); @@ -584,7 +584,7 @@ void mons_cast(monsters *monster, bolt &pbolt, spell_type spell_cast) return; case SPELL_SHADOW_CREATURES: // summon anything appropriate for level - if (mons_abjured(monster, monsterNearby)) + if (_mons_abjured(monster, monsterNearby)) return; sumcount2 = 1 + random2(4) + random2( monster->hit_dice / 7 + 1 ); @@ -610,7 +610,7 @@ void mons_cast(monsters *monster, bolt &pbolt, spell_type spell_cast) case SPELL_SUMMON_DEMON: // class 2-4 demons case SPELL_SUMMON_UGLY_THING: - if (mons_abjured(monster, monsterNearby)) + if (_mons_abjured(monster, monsterNearby)) return; sumcount2 = 1 + random2(2) + random2( monster->hit_dice / 10 + 1 ); @@ -681,7 +681,7 @@ void mons_cast(monsters *monster, bolt &pbolt, spell_type spell_cast) return; case SPELL_SUMMON_MUSHROOMS: // Summon swarms of icky crawling fungi. - if (mons_abjured(monster, monsterNearby)) + if (_mons_abjured(monster, monsterNearby)) return; sumcount2 = 1 + random2(2) + random2( monster->hit_dice / 4 + 1 ); @@ -698,19 +698,19 @@ void mons_cast(monsters *monster, bolt &pbolt, spell_type spell_cast) return; case SPELL_SUMMON_WRAITHS: - do_high_level_summon(monster, monsterNearby, pick_random_wraith, - random_range(3, 6)); + _do_high_level_summon(monster, monsterNearby, _pick_random_wraith, + random_range(3, 6)); return; case SPELL_SUMMON_HORRIBLE_THINGS: - do_high_level_summon(monster, monsterNearby, pick_horrible_thing, - random_range(3, 5)); + _do_high_level_summon(monster, monsterNearby, _pick_horrible_thing, + random_range(3, 5)); return; case SPELL_SUMMON_UNDEAD: // summon undead around player - do_high_level_summon(monster, monsterNearby, pick_undead_summon, - 2 + random2(2) - + random2( monster->hit_dice / 4 + 1 )); + _do_high_level_summon(monster, monsterNearby, _pick_undead_summon, + 2 + random2(2) + + random2( monster->hit_dice / 4 + 1 )); return; case SPELL_SYMBOL_OF_TORMENT: @@ -723,7 +723,7 @@ void mons_cast(monsters *monster, bolt &pbolt, spell_type spell_cast) return; case SPELL_SUMMON_GREATER_DEMON: - if (mons_abjured(monster, monsterNearby)) + if (_mons_abjured(monster, monsterNearby)) return; sumcount2 = 1 + random2( monster->hit_dice / 10 + 1 ); @@ -739,7 +739,7 @@ void mons_cast(monsters *monster, bolt &pbolt, spell_type spell_cast) // Journey -- Added in Summon Lizards and Draconian case SPELL_SUMMON_DRAKES: - if (mons_abjured(monster, monsterNearby)) + if (_mons_abjured(monster, monsterNearby)) return; sumcount2 = 1 + random2(3) + random2( monster->hit_dice / 5 + 1 ); @@ -1154,17 +1154,17 @@ bool mons_throw(struct monsters *monster, struct bolt &pbolt, int hand_used) // XXX: ugly hack, but avoids adding dynamic allocation to this code char throw_buff[ ITEMNAME_SIZE ]; - bool returning = (get_weapon_brand(mitm[hand_used]) == SPWPN_RETURNING || - get_ammo_brand(mitm[hand_used]) == SPMSL_RETURNING); + bool returning = (get_weapon_brand(mitm[hand_used]) == SPWPN_RETURNING + || get_ammo_brand(mitm[hand_used]) == SPMSL_RETURNING); int baseHit = 0, baseDam = 0; // from thrown or ammo int ammoHitBonus = 0, ammoDamBonus = 0; // from thrown or ammo int lnchHitBonus = 0, lnchDamBonus = 0; // special add from launcher - int exHitBonus = 0, exDamBonus = 0; // 'extra' bonus from skill/dex/str - int lnchBaseDam = 0; + int exHitBonus = 0, exDamBonus = 0; // 'extra' bonus from skill/dex/str + int lnchBaseDam = 0; - int hitMult = 0; - int damMult = 0; + int hitMult = 0; + int damMult = 0; int diceMult = 100; // some initial convenience & initializations @@ -1182,14 +1182,15 @@ bool mons_throw(struct monsters *monster, struct bolt &pbolt, int hand_used) // Dropping item copy, since the launched item might be different. item_def item = mitm[hand_used]; item.quantity = 1; + if (mons_friendly(monster)) + item.flags |= ISFLAG_DROPPED_BY_ALLY; - pbolt.range = 9; + pbolt.range = 9; pbolt.beam_source = monster_index(monster); - - pbolt.type = dchar_glyph(DCHAR_FIRED_MISSILE); - pbolt.colour = item.colour; - pbolt.flavour = BEAM_MISSILE; - pbolt.thrower = KILL_MON_MISSILE; + pbolt.type = dchar_glyph(DCHAR_FIRED_MISSILE); + pbolt.colour = item.colour; + pbolt.flavour = BEAM_MISSILE; + pbolt.thrower = KILL_MON_MISSILE; pbolt.aux_source.clear(); const launch_retval projected = @@ -1245,7 +1246,7 @@ bool mons_throw(struct monsters *monster, struct bolt &pbolt, int hand_used) if (wepType == MI_DART || wepType == MI_STONE || wepType == MI_SLING_BULLET) { - baseDam = div_rand_round(baseDam, 2); + baseDam = div_rand_round(baseDam, 2); } } @@ -1341,39 +1342,38 @@ bool mons_throw(struct monsters *monster, struct bolt &pbolt, int hand_used) diceMult = diceMult * 130 / 100; // WEAPON or AMMO of FIRE - if ((bow_brand == SPWPN_FLAME || ammo_brand == SPMSL_FLAME) - && bow_brand != SPWPN_FROST && ammo_brand != SPMSL_ICE) + if (bow_brand == SPWPN_FLAME && ammo_brand != SPMSL_ICE + || ammo_brand == SPMSL_FLAME && bow_brand != SPWPN_FROST) { baseHit += 2; exDamBonus += 6; - pbolt.flavour = BEAM_FIRE; - pbolt.name = "bolt of "; + pbolt.flavour = BEAM_FIRE; + pbolt.name = "bolt of "; if (poison) pbolt.name += "poison "; - pbolt.name += "flame"; - pbolt.colour = RED; - pbolt.type = dchar_glyph(DCHAR_FIRED_ZAP); + pbolt.name += "flame"; + pbolt.colour = RED; + pbolt.type = dchar_glyph(DCHAR_FIRED_ZAP); } - // WEAPON or AMMO of FROST - if ((bow_brand == SPWPN_FROST || ammo_brand == SPMSL_ICE) - && bow_brand != SPWPN_FLAME && ammo_brand != SPMSL_FLAME) + else if (bow_brand == SPWPN_FROST && ammo_brand != SPMSL_FLAME + || ammo_brand == SPMSL_ICE && bow_brand != SPWPN_FLAME) { baseHit += 2; exDamBonus += 6; - pbolt.flavour = BEAM_COLD; - pbolt.name = "bolt of "; + pbolt.flavour = BEAM_COLD; + pbolt.name = "bolt of "; if (poison) pbolt.name += "poison "; - pbolt.name += "frost"; - pbolt.colour = WHITE; - pbolt.type = dchar_glyph(DCHAR_FIRED_ZAP); + pbolt.name += "frost"; + pbolt.colour = WHITE; + pbolt.type = dchar_glyph(DCHAR_FIRED_ZAP); } // Note: we already have throw_energy taken off. -- bwr @@ -1381,17 +1381,23 @@ bool mons_throw(struct monsters *monster, struct bolt &pbolt, int hand_used) if (lnchType == WPN_CROSSBOW) { if (bow_brand == SPWPN_SPEED) + { // Speed crossbows take 50% less time to use than // ordinary crossbows. speed_delta = div_rand_round(throw_energy * 2, 5); + } else + { // Ordinary crossbows take 20% more time to use // than ordinary bows. speed_delta = -div_rand_round(throw_energy, 5); + } } else if (bow_brand == SPWPN_SPEED) + { // Speed bows take 50% time to use than ordinary bows. speed_delta = div_rand_round(throw_energy, 2); + } monster->speed_increment += speed_delta; } @@ -1510,10 +1516,8 @@ bool mons_throw(struct monsters *monster, struct bolt &pbolt, int hand_used) if (!is_artefact(item)) set_ident_flags(mitm[hand_used], ISFLAG_KNOW_TYPE); } - - if ( !really_returns ) - if (dec_mitm_item_quantity( hand_used, 1 )) - monster->inv[returning ? MSLOT_WEAPON : MSLOT_MISSILE] = NON_ITEM; + else if (dec_mitm_item_quantity( hand_used, 1 )) + monster->inv[returning ? MSLOT_WEAPON : MSLOT_MISSILE] = NON_ITEM; return (true); } // end mons_throw() @@ -1523,8 +1527,8 @@ bool mons_thrown_object_destroyed( item_def *item, int x, int y, { ASSERT( item != NULL ); - bool destroyed = ((item->base_type == OBJ_MISSILES && - item->sub_type != MI_THROWING_NET) && coinflip()); + bool destroyed = (item->base_type == OBJ_MISSILES + && item->sub_type != MI_THROWING_NET && coinflip()); bool hostile_grid = grid_destroys_items(grd[x][y]); // Non-returning items thrown into item-destroying grids are always @@ -1552,13 +1556,13 @@ void spore_goes_pop(struct monsters *monster) if (monster == NULL) return; - beam.is_tracer = false; + beam.is_tracer = false; beam.is_explosion = true; - beam.beam_source = monster_index(monster); - beam.type = dchar_glyph(DCHAR_FIRED_BURST); - beam.target_x = monster->x; - beam.target_y = monster->y; - beam.thrower = KILL_MON; // someone else's explosion + beam.beam_source = monster_index(monster); + beam.type = dchar_glyph(DCHAR_FIRED_BURST); + beam.target_x = monster->x; + beam.target_y = monster->y; + beam.thrower = KILL_MON; // someone else's explosion beam.aux_source.clear(); const char* msg = NULL; @@ -1566,18 +1570,18 @@ void spore_goes_pop(struct monsters *monster) if (type == MONS_GIANT_SPORE) { beam.flavour = BEAM_SPORE; - beam.name = "explosion of spores"; - beam.colour = LIGHTGREY; - beam.damage = dice_def( 3, 15 ); + beam.name = "explosion of spores"; + beam.colour = LIGHTGREY; + beam.damage = dice_def( 3, 15 ); beam.ex_size = 2; msg = "The giant spore explodes!"; } else if (type == MONS_BALL_LIGHTNING) { beam.flavour = BEAM_ELECTRICITY; - beam.name = "blast of lightning"; - beam.colour = LIGHTCYAN; - beam.damage = dice_def( 3, 20 ); + beam.name = "blast of lightning"; + beam.colour = LIGHTCYAN; + beam.damage = dice_def( 3, 20 ); beam.ex_size = coinflip() ? 3 : 2; msg = "The ball lightning explodes!"; } @@ -1606,599 +1610,591 @@ bolt mons_spells( int spell_cast, int power ) bolt beam; - beam.name = "****"; // initialize to some bogus values so we can catch problems - beam.colour = 1000; - beam.range = beam.rangeMax = 8; - beam.hit = -1; - beam.damage = dice_def( 1, 0 ); - beam.ench_power = -1; - beam.type = 0; - beam.flavour = BEAM_NONE; - beam.thrower = KILL_MISC; - beam.is_beam = false; + // Initialize to some bogus values so we can catch problems. + beam.name = "****"; + beam.colour = 1000; + beam.range = beam.rangeMax = 8; + beam.hit = -1; + beam.damage = dice_def( 1, 0 ); + beam.ench_power = -1; + beam.type = 0; + beam.flavour = BEAM_NONE; + beam.thrower = KILL_MISC; + beam.is_beam = false; beam.is_explosion = false; switch (spell_cast) { case SPELL_MAGIC_DART: - beam.colour = LIGHTMAGENTA; //inv_colour [throw_2]; - beam.name = "magic dart"; // inv_name [throw_2]); - beam.range = 6; + beam.colour = LIGHTMAGENTA; // inv_colour [throw_2]; + beam.name = "magic dart"; // inv_name [throw_2]); + beam.range = 6; beam.rangeMax = 10; - beam.damage = dice_def( 3, 4 + (power / 100) ); - beam.hit = AUTOMATIC_HIT; - beam.type = dchar_glyph(DCHAR_FIRED_ZAP); - beam.thrower = KILL_MON_MISSILE; - beam.flavour = BEAM_MMISSILE; - beam.is_beam = false; + beam.damage = dice_def( 3, 4 + (power / 100) ); + beam.hit = AUTOMATIC_HIT; + beam.type = dchar_glyph(DCHAR_FIRED_ZAP); + beam.thrower = KILL_MON_MISSILE; + beam.flavour = BEAM_MMISSILE; + beam.is_beam = false; break; case SPELL_THROW_FLAME: - beam.colour = RED; - beam.name = "puff of flame"; - beam.range = 6; + beam.colour = RED; + beam.name = "puff of flame"; + beam.range = 6; beam.rangeMax = 10; // should this be the same as magic missile? // No... magic missile is special in that it has a really // high to-hit value, so these should do more damage -- bwr - beam.damage = dice_def( 3, 5 + (power / 40) ); + beam.damage = dice_def( 3, 5 + (power / 40) ); - beam.hit = 25 + power / 40; - beam.type = dchar_glyph(DCHAR_FIRED_ZAP); - beam.thrower = KILL_MON_MISSILE; - beam.flavour = BEAM_FIRE; - beam.is_beam = false; + beam.hit = 25 + power / 40; + beam.type = dchar_glyph(DCHAR_FIRED_ZAP); + beam.thrower = KILL_MON_MISSILE; + beam.flavour = BEAM_FIRE; + beam.is_beam = false; break; case SPELL_THROW_FROST: - beam.colour = WHITE; - beam.name = "puff of frost"; - beam.range = 6; + beam.colour = WHITE; + beam.name = "puff of frost"; + beam.range = 6; beam.rangeMax = 10; // should this be the same as magic missile? // see SPELL_FLAME -- bwr - beam.damage = dice_def( 3, 5 + (power / 40) ); + beam.damage = dice_def( 3, 5 + (power / 40) ); - beam.hit = 25 + power / 40; - beam.type = dchar_glyph(DCHAR_FIRED_ZAP); - beam.thrower = KILL_MON_MISSILE; - beam.flavour = BEAM_COLD; - beam.is_beam = false; + beam.hit = 25 + power / 40; + beam.type = dchar_glyph(DCHAR_FIRED_ZAP); + beam.thrower = KILL_MON_MISSILE; + beam.flavour = BEAM_COLD; + beam.is_beam = false; break; case SPELL_DISPEL_UNDEAD: - beam.name = "0"; - beam.flavour = BEAM_DISPEL_UNDEAD; - beam.thrower = KILL_MON_MISSILE; - beam.range = 7 + random2(8); + beam.name = "0"; + beam.flavour = BEAM_DISPEL_UNDEAD; + beam.thrower = KILL_MON_MISSILE; + beam.range = 7 + random2(8); beam.rangeMax = 9; - beam.damage = dice_def( 3, std::min(6 + power / 7, 40) ); - beam.is_beam = true; + beam.damage = dice_def( 3, std::min(6 + power / 7, 40) ); + beam.is_beam = true; break; case SPELL_PARALYSE: - beam.name = "0"; - beam.range = 5; + beam.name = "0"; + beam.range = 5; beam.rangeMax = 9; - beam.type = 0; - beam.flavour = BEAM_PARALYSIS; - beam.thrower = KILL_MON_MISSILE; - beam.is_beam = true; + beam.type = 0; + beam.flavour = BEAM_PARALYSIS; + beam.thrower = KILL_MON_MISSILE; + beam.is_beam = true; break; case SPELL_SLOW: - beam.name = "0"; - beam.range = 5; + beam.name = "0"; + beam.range = 5; beam.rangeMax = 9; - beam.type = 0; - beam.flavour = BEAM_SLOW; - beam.thrower = KILL_MON_MISSILE; - beam.is_beam = true; + beam.type = 0; + beam.flavour = BEAM_SLOW; + beam.thrower = KILL_MON_MISSILE; + beam.is_beam = true; break; case SPELL_HASTE: // (self) - beam.name = "0"; - beam.range = 5; + beam.name = "0"; + beam.range = 5; beam.rangeMax = 9; - beam.type = 0; - beam.flavour = BEAM_HASTE; - beam.thrower = KILL_MON_MISSILE; - beam.is_beam = true; + beam.type = 0; + beam.flavour = BEAM_HASTE; + beam.thrower = KILL_MON_MISSILE; + beam.is_beam = true; break; case SPELL_BACKLIGHT: - beam.name = "0"; - beam.range = 5; + beam.name = "0"; + beam.range = 5; beam.rangeMax = 9; - beam.type = 0; - beam.flavour = BEAM_BACKLIGHT; - beam.thrower = KILL_MON_MISSILE; - beam.is_beam = true; + beam.type = 0; + beam.flavour = BEAM_BACKLIGHT; + beam.thrower = KILL_MON_MISSILE; + beam.is_beam = true; break; case SPELL_CONFUSE: - beam.name = "0"; - beam.range = 5; + beam.name = "0"; + beam.range = 5; beam.rangeMax = 9; - beam.type = 0; - beam.flavour = BEAM_CONFUSION; - beam.thrower = KILL_MON_MISSILE; - beam.is_beam = true; + beam.type = 0; + beam.flavour = BEAM_CONFUSION; + beam.thrower = KILL_MON_MISSILE; + beam.is_beam = true; break; case SPELL_SLEEP: - beam.name = "0"; - beam.range = 5; + beam.name = "0"; + beam.range = 5; beam.rangeMax = 9; - beam.type = 0; - beam.flavour = BEAM_SLEEP; - beam.thrower = KILL_MON_MISSILE; - beam.is_beam = true; + beam.type = 0; + beam.flavour = BEAM_SLEEP; + beam.thrower = KILL_MON_MISSILE; + beam.is_beam = true; break; case SPELL_POLYMORPH_OTHER: - beam.name = "0"; - beam.range = 6; + beam.name = "0"; + beam.range = 6; beam.rangeMax = 9; - beam.type = 0; - beam.flavour = BEAM_POLYMORPH; - beam.thrower = KILL_MON_MISSILE; - beam.is_beam = true; + beam.type = 0; + beam.flavour = BEAM_POLYMORPH; + beam.thrower = KILL_MON_MISSILE; + beam.is_beam = true; break; case SPELL_VENOM_BOLT: - beam.name = "bolt of poison"; - beam.range = 7; + beam.name = "bolt of poison"; + beam.range = 7; beam.rangeMax = 16; - beam.damage = dice_def( 3, 6 + power / 13 ); - beam.colour = LIGHTGREEN; - beam.type = dchar_glyph(DCHAR_FIRED_ZAP); - beam.thrower = KILL_MON; - beam.flavour = BEAM_POISON; - beam.hit = 19 + power / 20; - beam.is_beam = true; + beam.damage = dice_def( 3, 6 + power / 13 ); + beam.colour = LIGHTGREEN; + beam.type = dchar_glyph(DCHAR_FIRED_ZAP); + beam.thrower = KILL_MON; + beam.flavour = BEAM_POISON; + beam.hit = 19 + power / 20; + beam.is_beam = true; break; case SPELL_POISON_ARROW: - beam.name = "poison arrow"; - beam.damage = dice_def( 3, 7 + power / 12 ); - beam.colour = LIGHTGREEN; - beam.type = dchar_glyph(DCHAR_FIRED_MISSILE); - beam.thrower = KILL_MON; - beam.flavour = BEAM_POISON_ARROW; - beam.hit = 20 + power / 25; - beam.range = beam.rangeMax = 8; + beam.name = "poison arrow"; + beam.damage = dice_def( 3, 7 + power / 12 ); + beam.colour = LIGHTGREEN; + beam.type = dchar_glyph(DCHAR_FIRED_MISSILE); + beam.thrower = KILL_MON; + beam.flavour = BEAM_POISON_ARROW; + beam.hit = 20 + power / 25; + beam.range = beam.rangeMax = 8; break; case SPELL_BOLT_OF_MAGMA: - beam.name = "bolt of magma"; - beam.range = 5; + beam.name = "bolt of magma"; + beam.range = 5; beam.rangeMax = 13; - beam.damage = dice_def( 3, 8 + power / 11 ); - beam.colour = RED; - beam.type = dchar_glyph(DCHAR_FIRED_ZAP); - beam.thrower = KILL_MON; - beam.flavour = BEAM_LAVA; - beam.hit = 17 + power / 25; - beam.is_beam = true; + beam.damage = dice_def( 3, 8 + power / 11 ); + beam.colour = RED; + beam.type = dchar_glyph(DCHAR_FIRED_ZAP); + beam.thrower = KILL_MON; + beam.flavour = BEAM_LAVA; + beam.hit = 17 + power / 25; + beam.is_beam = true; break; case SPELL_BOLT_OF_FIRE: - beam.name = "bolt of fire"; - beam.range = 5; + beam.name = "bolt of fire"; + beam.range = 5; beam.rangeMax = 13; - beam.damage = dice_def( 3, 8 + power / 11 ); - beam.colour = RED; - beam.type = dchar_glyph(DCHAR_FIRED_ZAP); - beam.thrower = KILL_MON; - beam.flavour = BEAM_FIRE; - beam.hit = 17 + power / 25; - beam.is_beam = true; + beam.damage = dice_def( 3, 8 + power / 11 ); + beam.colour = RED; + beam.type = dchar_glyph(DCHAR_FIRED_ZAP); + beam.thrower = KILL_MON; + beam.flavour = BEAM_FIRE; + beam.hit = 17 + power / 25; + beam.is_beam = true; break; case SPELL_ICE_BOLT: - beam.name = "bolt of ice"; - beam.range = 5; + beam.name = "bolt of ice"; + beam.range = 5; beam.rangeMax = 13; - beam.damage = dice_def( 3, 8 + power / 11 ); - beam.colour = WHITE; - beam.type = dchar_glyph(DCHAR_FIRED_ZAP); - beam.thrower = KILL_MON; - beam.flavour = BEAM_ICE; - beam.hit = 17 + power / 25; - beam.is_beam = true; + beam.damage = dice_def( 3, 8 + power / 11 ); + beam.colour = WHITE; + beam.type = dchar_glyph(DCHAR_FIRED_ZAP); + beam.thrower = KILL_MON; + beam.flavour = BEAM_ICE; + beam.hit = 17 + power / 25; + beam.is_beam = true; break; case SPELL_BOLT_OF_COLD: - beam.name = "bolt of cold"; - beam.range = 5; + beam.name = "bolt of cold"; + beam.range = 5; beam.rangeMax = 13; - beam.damage = dice_def( 3, 8 + power / 11 ); - beam.colour = WHITE; - beam.type = dchar_glyph(DCHAR_FIRED_ZAP); - beam.thrower = KILL_MON; - beam.flavour = BEAM_COLD; - beam.hit = 17 + power / 25; - beam.is_beam = true; + beam.damage = dice_def( 3, 8 + power / 11 ); + beam.colour = WHITE; + beam.type = dchar_glyph(DCHAR_FIRED_ZAP); + beam.thrower = KILL_MON; + beam.flavour = BEAM_COLD; + beam.hit = 17 + power / 25; + beam.is_beam = true; break; case SPELL_FREEZING_CLOUD: - beam.name = "freezing blast"; - beam.range = 5; + beam.name = "freezing blast"; + beam.range = 5; beam.rangeMax = 12; - beam.damage = dice_def( 2, 9 + power / 11 ); - beam.colour = WHITE; - beam.type = dchar_glyph(DCHAR_FIRED_ZAP); - beam.thrower = KILL_MON; - beam.flavour = BEAM_COLD; - beam.hit = 17 + power / 25; - beam.is_beam = true; + beam.damage = dice_def( 2, 9 + power / 11 ); + beam.colour = WHITE; + beam.type = dchar_glyph(DCHAR_FIRED_ZAP); + beam.thrower = KILL_MON; + beam.flavour = BEAM_COLD; + beam.hit = 17 + power / 25; + beam.is_beam = true; beam.is_big_cloud = true; break; case SPELL_SHOCK: - beam.name = "zap"; - beam.range = 8; + beam.name = "zap"; + beam.range = 8; beam.rangeMax = 16; - beam.damage = dice_def( 1, 8 + (power / 20) ); - beam.colour = LIGHTCYAN; - beam.type = dchar_glyph(DCHAR_FIRED_ZAP); - beam.thrower = KILL_MON; - beam.flavour = BEAM_ELECTRICITY; - beam.hit = 17 + power / 20; - beam.is_beam = true; + beam.damage = dice_def( 1, 8 + (power / 20) ); + beam.colour = LIGHTCYAN; + beam.type = dchar_glyph(DCHAR_FIRED_ZAP); + beam.thrower = KILL_MON; + beam.flavour = BEAM_ELECTRICITY; + beam.hit = 17 + power / 20; + beam.is_beam = true; break; case SPELL_LIGHTNING_BOLT: - beam.name = "bolt of lightning"; - beam.range = 7; + beam.name = "bolt of lightning"; + beam.range = 7; beam.rangeMax = 16; - beam.damage = dice_def( 3, 10 + power / 17 ); - beam.colour = LIGHTCYAN; - beam.type = dchar_glyph(DCHAR_FIRED_ZAP); - beam.thrower = KILL_MON; - beam.flavour = BEAM_ELECTRICITY; - beam.hit = 16 + power / 40; - beam.is_beam = true; + beam.damage = dice_def( 3, 10 + power / 17 ); + beam.colour = LIGHTCYAN; + beam.type = dchar_glyph(DCHAR_FIRED_ZAP); + beam.thrower = KILL_MON; + beam.flavour = BEAM_ELECTRICITY; + beam.hit = 16 + power / 40; + beam.is_beam = true; break; case SPELL_INVISIBILITY: - beam.name = "0"; - beam.range = 5; + beam.name = "0"; + beam.range = 5; beam.rangeMax = 9; - beam.type = 0; - beam.flavour = BEAM_INVISIBILITY; - beam.thrower = KILL_MON; - beam.is_beam = true; + beam.type = 0; + beam.flavour = BEAM_INVISIBILITY; + beam.thrower = KILL_MON; + beam.is_beam = true; break; case SPELL_FIREBALL: - beam.colour = RED; - beam.name = "fireball"; - beam.range = 6; + beam.colour = RED; + beam.name = "fireball"; + beam.range = 6; beam.rangeMax = 10; - beam.damage = dice_def( 3, 7 + power / 10 ); - beam.hit = 40; - beam.type = dchar_glyph(DCHAR_FIRED_ZAP); - beam.thrower = KILL_MON; - beam.flavour = BEAM_FIRE; // why not BEAM_FIRE? {dlb} - beam.is_beam = false; + beam.damage = dice_def( 3, 7 + power / 10 ); + beam.hit = 40; + beam.type = dchar_glyph(DCHAR_FIRED_ZAP); + beam.thrower = KILL_MON; + beam.flavour = BEAM_FIRE; // why not BEAM_FIRE? {dlb} + beam.is_beam = false; beam.is_explosion = true; break; case SPELL_LESSER_HEALING: - beam.name = "0"; - beam.range = 5; + beam.name = "0"; + beam.range = 5; beam.rangeMax = 9; - beam.type = 0; - beam.flavour = BEAM_HEALING; - beam.thrower = KILL_MON; - beam.hit = 25 + (power / 5); - beam.is_beam = true; + beam.type = 0; + beam.flavour = BEAM_HEALING; + beam.thrower = KILL_MON; + beam.hit = 25 + (power / 5); + beam.is_beam = true; break; case SPELL_TELEPORT_SELF: - beam.name = "0"; - beam.range = 5; + beam.name = "0"; + beam.range = 5; beam.rangeMax = 9; - beam.type = 0; - beam.flavour = BEAM_TELEPORT; // 6 is used by digging - beam.thrower = KILL_MON; - beam.is_beam = true; + beam.type = 0; + beam.flavour = BEAM_TELEPORT; // 6 is used by digging + beam.thrower = KILL_MON; + beam.is_beam = true; break; case SPELL_TELEPORT_OTHER: - beam.name = "0"; - beam.range = 5; + beam.name = "0"; + beam.range = 5; beam.rangeMax = 9; - beam.type = 0; - beam.flavour = BEAM_TELEPORT; // 6 is used by digging - beam.thrower = KILL_MON; - beam.is_beam = true; + beam.type = 0; + beam.flavour = BEAM_TELEPORT; // 6 is used by digging + beam.thrower = KILL_MON; + beam.is_beam = true; break; case SPELL_BLINK: - beam.is_beam = false; + beam.is_beam = false; break; case SPELL_LEHUDIBS_CRYSTAL_SPEAR: // was splinters - beam.name = "crystal spear"; - beam.range = 7; + beam.name = "crystal spear"; + beam.range = 7; beam.rangeMax = 16; - beam.damage = dice_def( 3, 16 + power / 10 ); - beam.colour = WHITE; - beam.type = dchar_glyph(DCHAR_FIRED_MISSILE); - beam.thrower = KILL_MON; - beam.flavour = BEAM_MMISSILE; - beam.hit = 22 + power / 20; - beam.is_beam = false; + beam.damage = dice_def( 3, 16 + power / 10 ); + beam.colour = WHITE; + beam.type = dchar_glyph(DCHAR_FIRED_MISSILE); + beam.thrower = KILL_MON; + beam.flavour = BEAM_MMISSILE; + beam.hit = 22 + power / 20; + beam.is_beam = false; break; case SPELL_DIG: - beam.name = "0"; - beam.range = 3; + beam.name = "0"; + beam.range = 3; beam.rangeMax = 7 + random2(power) / 10; - beam.type = 0; - beam.flavour = BEAM_DIGGING; - beam.thrower = KILL_MON; - beam.is_beam = true; + beam.type = 0; + beam.flavour = BEAM_DIGGING; + beam.thrower = KILL_MON; + beam.is_beam = true; break; case SPELL_BOLT_OF_DRAINING: // negative energy - beam.name = "bolt of negative energy"; - beam.range = 7; + beam.name = "bolt of negative energy"; + beam.range = 7; beam.rangeMax = 16; - beam.damage = dice_def( 3, 6 + power / 13 ); - beam.colour = DARKGREY; - beam.type = dchar_glyph(DCHAR_FIRED_ZAP); - beam.thrower = KILL_MON; - beam.flavour = BEAM_NEG; - beam.hit = 16 + power / 35; - beam.is_beam = true; + beam.damage = dice_def( 3, 6 + power / 13 ); + beam.colour = DARKGREY; + beam.type = dchar_glyph(DCHAR_FIRED_ZAP); + beam.thrower = KILL_MON; + beam.flavour = BEAM_NEG; + beam.hit = 16 + power / 35; + beam.is_beam = true; break; - // 20, 21 are used - case SPELL_ISKENDERUNS_MYSTIC_BLAST: // mystic blast - beam.colour = LIGHTMAGENTA; - beam.name = "orb of energy"; - beam.range = 6; + beam.colour = LIGHTMAGENTA; + beam.name = "orb of energy"; + beam.range = 6; beam.rangeMax = 10; - beam.damage = dice_def( 3, 7 + (power / 14) ); - beam.hit = 20 + (power / 20); - beam.type = dchar_glyph(DCHAR_FIRED_ZAP); - beam.thrower = KILL_MON_MISSILE; - beam.flavour = BEAM_MMISSILE; - beam.is_beam = false; + beam.damage = dice_def( 3, 7 + (power / 14) ); + beam.hit = 20 + (power / 20); + beam.type = dchar_glyph(DCHAR_FIRED_ZAP); + beam.thrower = KILL_MON_MISSILE; + beam.flavour = BEAM_MMISSILE; + beam.is_beam = false; break; - // 23 is brain feed - case SPELL_STEAM_BALL: - beam.colour = LIGHTGREY; - beam.name = "ball of steam"; - beam.range = 6; + beam.colour = LIGHTGREY; + beam.name = "ball of steam"; + beam.range = 6; beam.rangeMax = 10; - beam.damage = dice_def( 3, 7 + (power / 15) ); - beam.hit = 20 + power / 20; - beam.type = dchar_glyph(DCHAR_FIRED_ZAP); - beam.thrower = KILL_MON_MISSILE; - beam.flavour = BEAM_STEAM; - beam.is_beam = false; + beam.damage = dice_def( 3, 7 + (power / 15) ); + beam.hit = 20 + power / 20; + beam.type = dchar_glyph(DCHAR_FIRED_ZAP); + beam.thrower = KILL_MON_MISSILE; + beam.flavour = BEAM_STEAM; + beam.is_beam = false; break; - // 27 is summon devils - // 28 is animate dead - case SPELL_PAIN: - beam.name = "0"; - beam.range = 7; - beam.rangeMax = 14; - beam.type = 0; - beam.flavour = BEAM_PAIN; // pain - beam.thrower = KILL_MON; + beam.name = "0"; + beam.range = 7; + beam.rangeMax = 14; + beam.type = 0; + beam.flavour = BEAM_PAIN; // pain + beam.thrower = KILL_MON; // beam.damage = dice_def( 1, 50 ); - beam.damage = dice_def( 1, 7 + (power / 20) ); + beam.damage = dice_def( 1, 7 + (power / 20) ); beam.ench_power = 50; - beam.is_beam = true; + beam.is_beam = true; break; - // 30 is smiting - case SPELL_STICKY_FLAME: - beam.colour = RED; - beam.name = "sticky flame"; - beam.range = 6; + beam.colour = RED; + beam.name = "sticky flame"; + beam.range = 6; beam.rangeMax = 10; - beam.damage = dice_def( 3, 3 + power / 50 ); - beam.hit = 18 + power / 15; - beam.type = dchar_glyph(DCHAR_FIRED_ZAP); - beam.thrower = KILL_MON_MISSILE; - beam.flavour = BEAM_FIRE; - beam.is_beam = false; + beam.damage = dice_def( 3, 3 + power / 50 ); + beam.hit = 18 + power / 15; + beam.type = dchar_glyph(DCHAR_FIRED_ZAP); + beam.thrower = KILL_MON_MISSILE; + beam.flavour = BEAM_FIRE; + beam.is_beam = false; break; case SPELL_POISONOUS_CLOUD: // demon - beam.name = "blast of poison"; - beam.range = 7; + beam.name = "blast of poison"; + beam.range = 7; beam.rangeMax = 16; - beam.damage = dice_def( 3, 3 + power / 25 ); - beam.colour = LIGHTGREEN; - beam.type = dchar_glyph(DCHAR_FIRED_ZAP); - beam.thrower = KILL_MON; - beam.flavour = BEAM_POISON; - beam.hit = 18 + power / 25; - beam.is_beam = true; + beam.damage = dice_def( 3, 3 + power / 25 ); + beam.colour = LIGHTGREEN; + beam.type = dchar_glyph(DCHAR_FIRED_ZAP); + beam.thrower = KILL_MON; + beam.flavour = BEAM_POISON; + beam.hit = 18 + power / 25; + beam.is_beam = true; beam.is_big_cloud = true; break; case SPELL_ENERGY_BOLT: // eye of devastation - beam.colour = YELLOW; - beam.name = "bolt of energy"; - beam.range = 9; + beam.colour = YELLOW; + beam.name = "bolt of energy"; + beam.range = 9; beam.rangeMax = 23; - beam.damage = dice_def( 3, 20 ); - beam.hit = 15 + power / 30; - beam.type = dchar_glyph(DCHAR_FIRED_ZAP); - beam.thrower = KILL_MON_MISSILE; - beam.flavour = BEAM_NUKE; // a magical missile which destroys walls - beam.is_beam = true; + beam.damage = dice_def( 3, 20 ); + beam.hit = 15 + power / 30; + beam.type = dchar_glyph(DCHAR_FIRED_ZAP); + beam.thrower = KILL_MON_MISSILE; + beam.flavour = BEAM_NUKE; // a magical missile which destroys walls + beam.is_beam = true; break; case SPELL_STING: // sting - beam.colour = GREEN; - beam.name = "sting"; - beam.range = 8; + beam.colour = GREEN; + beam.name = "sting"; + beam.range = 8; beam.rangeMax = 12; - beam.damage = dice_def( 1, 6 + power / 25 ); - beam.hit = 60; - beam.type = dchar_glyph(DCHAR_FIRED_ZAP); - beam.thrower = KILL_MON_MISSILE; - beam.flavour = BEAM_POISON; - beam.is_beam = false; + beam.damage = dice_def( 1, 6 + power / 25 ); + beam.hit = 60; + beam.type = dchar_glyph(DCHAR_FIRED_ZAP); + beam.thrower = KILL_MON_MISSILE; + beam.flavour = BEAM_POISON; + beam.is_beam = false; break; case SPELL_BOLT_OF_IRON: - beam.colour = LIGHTCYAN; - beam.name = "iron bolt"; - beam.range = 4; + beam.colour = LIGHTCYAN; + beam.name = "iron bolt"; + beam.range = 4; beam.rangeMax = 8; - beam.damage = dice_def( 3, 8 + (power / 9) ); - beam.hit = 20 + (power / 25); - beam.type = dchar_glyph(DCHAR_FIRED_MISSILE); - beam.thrower = KILL_MON_MISSILE; - beam.flavour = BEAM_MMISSILE; // similarly unresisted thing - beam.is_beam = false; + beam.damage = dice_def( 3, 8 + (power / 9) ); + beam.hit = 20 + (power / 25); + beam.type = dchar_glyph(DCHAR_FIRED_MISSILE); + beam.thrower = KILL_MON_MISSILE; + beam.flavour = BEAM_MMISSILE; // similarly unresisted thing + beam.is_beam = false; break; case SPELL_STONE_ARROW: - beam.colour = LIGHTGREY; - beam.name = "stone arrow"; - beam.range = 8; + beam.colour = LIGHTGREY; + beam.name = "stone arrow"; + beam.range = 8; beam.rangeMax = 12; - beam.damage = dice_def( 3, 5 + (power / 10) ); - beam.hit = 14 + power / 35; - beam.type = dchar_glyph(DCHAR_FIRED_MISSILE); - beam.thrower = KILL_MON_MISSILE; - beam.flavour = BEAM_MMISSILE; // similarly unresisted thing - beam.is_beam = false; + beam.damage = dice_def( 3, 5 + (power / 10) ); + beam.hit = 14 + power / 35; + beam.type = dchar_glyph(DCHAR_FIRED_MISSILE); + beam.thrower = KILL_MON_MISSILE; + beam.flavour = BEAM_MMISSILE; // similarly unresisted thing + beam.is_beam = false; break; case SPELL_POISON_SPLASH: - beam.colour = GREEN; - beam.name = "splash of poison"; - beam.range = 5; + beam.colour = GREEN; + beam.name = "splash of poison"; + beam.range = 5; beam.rangeMax = 10; - beam.damage = dice_def( 1, 4 + power / 10 ); - beam.hit = 16 + power / 20; - beam.type = dchar_glyph(DCHAR_FIRED_ZAP); - beam.thrower = KILL_MON_MISSILE; - beam.flavour = BEAM_POISON; - beam.is_beam = false; + beam.damage = dice_def( 1, 4 + power / 10 ); + beam.hit = 16 + power / 20; + beam.type = dchar_glyph(DCHAR_FIRED_ZAP); + beam.thrower = KILL_MON_MISSILE; + beam.flavour = BEAM_POISON; + beam.is_beam = false; break; case SPELL_DISINTEGRATE: - beam.name = "0"; - beam.range = 7; - beam.rangeMax = 14; - beam.type = 0; - beam.flavour = BEAM_DISINTEGRATION; - beam.thrower = KILL_MON; + beam.name = "0"; + beam.range = 7; + beam.rangeMax = 14; + beam.type = 0; + beam.flavour = BEAM_DISINTEGRATION; + beam.thrower = KILL_MON; beam.ench_power = 50; // beam.hit = 30 + (power / 10); - beam.damage = dice_def( 1, 30 + (power / 10) ); - beam.is_beam = true; + beam.damage = dice_def( 1, 30 + (power / 10) ); + beam.is_beam = true; break; case SPELL_MEPHITIC_CLOUD: // swamp drake - beam.name = "foul vapour"; - beam.range = 7; + beam.name = "foul vapour"; + beam.range = 7; beam.rangeMax = 16; - beam.damage = dice_def( 3, 2 + power / 25 ); - beam.colour = GREEN; - beam.type = dchar_glyph(DCHAR_FIRED_ZAP); - beam.thrower = KILL_MON; - beam.flavour = BEAM_POISON; - beam.hit = 14 + power / 30; - beam.is_beam = true; + beam.damage = dice_def( 3, 2 + power / 25 ); + beam.colour = GREEN; + beam.type = dchar_glyph(DCHAR_FIRED_ZAP); + beam.thrower = KILL_MON; + beam.flavour = BEAM_POISON; + beam.hit = 14 + power / 30; + beam.is_beam = true; beam.is_big_cloud = true; break; case SPELL_MIASMA: // death drake - beam.name = "foul vapour"; - beam.damage = dice_def( 3, 5 + power / 24 ); - beam.colour = DARKGREY; - beam.type = dchar_glyph(DCHAR_FIRED_ZAP); - beam.thrower = KILL_MON; - beam.flavour = BEAM_MIASMA; - beam.hit = 17 + power / 20; - beam.is_beam = true; + beam.name = "foul vapour"; + beam.range = beam.rangeMax = 8; + beam.damage = dice_def( 3, 5 + power / 24 ); + beam.colour = DARKGREY; + beam.type = dchar_glyph(DCHAR_FIRED_ZAP); + beam.thrower = KILL_MON; + beam.flavour = BEAM_MIASMA; + beam.hit = 17 + power / 20; + beam.is_beam = true; beam.is_big_cloud = true; - beam.range = beam.rangeMax = 8; break; case SPELL_QUICKSILVER_BOLT: // Quicksilver dragon - beam.colour = random_colour(); - beam.name = "bolt of energy"; - beam.range = 9; + beam.colour = random_colour(); + beam.name = "bolt of energy"; + beam.range = 9; beam.rangeMax = 23; - beam.damage = dice_def( 3, 25 ); - beam.hit = 16 + power / 25; - beam.type = dchar_glyph(DCHAR_FIRED_ZAP); - beam.thrower = KILL_MON_MISSILE; - beam.flavour = BEAM_MMISSILE; - beam.is_beam = false; + beam.damage = dice_def( 3, 25 ); + beam.hit = 16 + power / 25; + beam.type = dchar_glyph(DCHAR_FIRED_ZAP); + beam.thrower = KILL_MON_MISSILE; + beam.flavour = BEAM_MMISSILE; + beam.is_beam = false; break; case SPELL_HELLFIRE: // fiend's hellfire - beam.name = "hellfire"; - beam.aux_source = "blast of hellfire"; - beam.colour = RED; - beam.range = 4; - beam.rangeMax = 13; - beam.damage = dice_def( 3, 25 ); - beam.hit = 24; - beam.type = dchar_glyph(DCHAR_FIRED_ZAP); - beam.thrower = KILL_MON; - beam.flavour = BEAM_HELLFIRE; - beam.is_beam = true; + beam.name = "hellfire"; + beam.aux_source = "blast of hellfire"; + beam.colour = RED; + beam.range = 4; + beam.rangeMax = 13; + beam.damage = dice_def( 3, 25 ); + beam.hit = 24; + beam.type = dchar_glyph(DCHAR_FIRED_ZAP); + beam.thrower = KILL_MON; + beam.flavour = BEAM_HELLFIRE; + beam.is_beam = true; beam.is_explosion = true; break; case SPELL_METAL_SPLINTERS: - beam.name = "spray of metal splinters"; - beam.range = 7; + beam.name = "spray of metal splinters"; + beam.range = 7; beam.rangeMax = 16; - beam.damage = dice_def( 3, 20 + power / 20 ); - beam.colour = CYAN; - beam.type = dchar_glyph(DCHAR_FIRED_ZAP); - beam.thrower = KILL_MON; - beam.flavour = BEAM_FRAG; - beam.hit = 19 + power / 30; - beam.is_beam = true; + beam.damage = dice_def( 3, 20 + power / 20 ); + beam.colour = CYAN; + beam.type = dchar_glyph(DCHAR_FIRED_ZAP); + beam.thrower = KILL_MON; + beam.flavour = BEAM_FRAG; + beam.hit = 19 + power / 30; + beam.is_beam = true; break; case SPELL_BANISHMENT: - beam.name = "0"; - beam.range = 5; + beam.name = "0"; + beam.range = 5; beam.rangeMax = 9; - beam.type = 0; - beam.flavour = BEAM_BANISH; - beam.thrower = KILL_MON_MISSILE; - beam.is_beam = true; + beam.type = 0; + beam.flavour = BEAM_BANISH; + beam.thrower = KILL_MON_MISSILE; + beam.is_beam = true; break; case SPELL_BLINK_OTHER: - beam.name = "0"; - beam.type = 0; - beam.flavour = BEAM_BLINK; - beam.thrower = KILL_MON; - beam.is_beam = true; + beam.name = "0"; + beam.type = 0; + beam.flavour = BEAM_BLINK; + beam.thrower = KILL_MON; + beam.is_beam = true; beam.is_enchant = true; - beam.range = 8; - beam.rangeMax = 8; + beam.range = 8; + beam.rangeMax = 8; break; default: @@ -2208,9 +2204,9 @@ bolt mons_spells( int spell_cast, int power ) return (beam); } // end mons_spells() -static int monster_abjure_square(const coord_def &pos, - int power, int test_only, - int wont_attack) +static int _monster_abjure_square(const coord_def &pos, + int power, int test_only, + int wont_attack) { const int mindex = mgrd(pos); if (mindex == NON_MONSTER) @@ -2236,13 +2232,13 @@ static int monster_abjure_square(const coord_def &pos, if (!target->lose_ench_duration(abj, power)) simple_monster_message(target, " shudders."); + return (1); } -static int apply_radius_around_square( - const coord_def &c, int radius, - int (*fn)(const coord_def &, int, int, int), - int pow, int par1, int par2) +static int _apply_radius_around_square( const coord_def &c, int radius, + int (*fn)(const coord_def &, int, int, int), + int pow, int par1, int par2) { int res = 0; for (int yi = -radius; yi <= radius; ++yi) @@ -2267,7 +2263,7 @@ static int apply_radius_around_square( return (res); } -static int monster_abjuration(const monsters *caster, bool test) +static int _monster_abjuration(const monsters *caster, bool test) { const bool wont_attack = mons_wont_attack(caster); int maffected = 0; @@ -2281,9 +2277,9 @@ static int monster_abjuration(const monsters *caster, bool test) for (int rad = 1; rad < 5 && pow >= 30; ++rad) { int number_hit = - apply_radius_around_square( - caster->pos(), rad, monster_abjure_square, - pow, test, wont_attack); + _apply_radius_around_square( caster->pos(), rad, + _monster_abjure_square, + pow, test, wont_attack); maffected += number_hit; @@ -2322,7 +2318,7 @@ bool silver_statue_effects(monsters *mons) bool orange_statue_effects(monsters *mons) { if ((mons_player_visible(mons) || one_chance_in(3)) - && !one_chance_in(3)) + && !one_chance_in(3)) { mpr("A hostile presence attacks your mind!", MSGCH_WARN); @@ -2373,16 +2369,16 @@ bool orc_battle_cry(monsters *chief) } else { - mons->add_ench( - mon_enchant(ENCH_BATTLE_FRENZY, level, - KC_OTHER, - dur)); + mons->add_ench( mon_enchant(ENCH_BATTLE_FRENZY, level, + KC_OTHER, dur) ); } affected.push_back(mons); if (mons->asleep()) + { behaviour_event( mons, ME_DISTURB, MHITNOT, chief->x, chief->y ); + } } } } @@ -2390,8 +2386,10 @@ bool orc_battle_cry(monsters *chief) if (!affected.empty()) { if (you.can_see(chief) && player_can_hear(chief->x, chief->y)) + { mprf(MSGCH_SOUND, "%s roars a battle-cry!", chief->name(DESC_CAP_THE).c_str()); + } // The yell happens whether you happen to see it or not. noisy(15, chief->x, chief->y); @@ -2400,16 +2398,14 @@ bool orc_battle_cry(monsters *chief) #ifdef ANNOUNCE_BATTLE_FRENZY std::map<std::string, int> names; for (int i = 0, size = affected.size(); i < size; ++i) - { if (you.can_see(affected[i])) names[affected[i]->name(DESC_PLAIN)]++; - } for (std::map<std::string,int>::const_iterator i = names.begin(); i != names.end(); ++i) { - const std::string s = - i->second> 1? pluralise(i->first) : i->first; + const std::string s = i->second > 1 ? pluralise(i->first) + : i->first; mprf("The %s go%s into a battle-frenzy!", s.c_str(), i->second == 1? "es" : ""); } @@ -2420,7 +2416,7 @@ bool orc_battle_cry(monsters *chief) return (false); } -static bool make_monster_angry(const monsters *mon, monsters *targ) +static bool _make_monster_angry(const monsters *mon, monsters *targ) { if (mons_friendly(mon) != mons_friendly(targ)) return (false); @@ -2450,10 +2446,11 @@ static bool make_monster_angry(const monsters *mon, monsters *targ) if (victim.distance_from(targ->pos()) > victim.distance_from(mon->pos())) return (false); - const bool need_message = mons_near(mon) && player_monster_visible(mon); - if (need_message) + if (mons_near(mon) && player_monster_visible(mon)) + { mprf("%s goads %s on!", mon->name(DESC_CAP_THE).c_str(), targ->name(DESC_NOCAP_THE).c_str()); + } targ->go_berserk(false); @@ -2476,7 +2473,7 @@ bool moth_incite_monsters(const monsters *mon) if (targ->type == MONS_MOTH_OF_WRATH) continue; - if (make_monster_angry(mon, targ) && !one_chance_in(3 * ++goaded)) + if (_make_monster_angry(mon, targ) && !one_chance_in(3 * ++goaded)) return (true); } diff --git a/crawl-ref/source/shopping.cc b/crawl-ref/source/shopping.cc index 217d0b0b9c..c988df87a5 100644 --- a/crawl-ref/source/shopping.cc +++ b/crawl-ref/source/shopping.cc @@ -771,7 +771,7 @@ unsigned int item_value( item_def item, bool ident ) valued += 50; } else if (item_type_known(item) - && get_equip_desc(item) != 0) + && get_equip_desc(item) != 0) { valued += 20; } @@ -992,7 +992,7 @@ unsigned int item_value( item_def item, bool ident ) } if (get_equip_race(item) == ISFLAG_ELVEN - || get_equip_race(item) == ISFLAG_DWARVEN) + || get_equip_race(item) == ISFLAG_DWARVEN) { valued *= 12; valued /= 10; |