@target@." instead of merely "breathes."
If an invisible monster on a square visible to the player fires a visible beam then give a message to the player about it.
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@7829 c06c8d41-db1a-0410-9941-cceddc491573
AJHVP42Y67SB4NKFMZB24524PGX2XA5WLFNEFV52MIGTS47ALMVQC AYU5OVG2HZO46KDAPKUWAVHS5HTYFKUWIMIRMTHAXVVFEDJE7YPAC G4JG3FO33BHRNLU7GOOXZ3NLNO6RC5IJQD3AYPVIYMGKR2HETY5AC JWJGOMVBPZRSP2VSHLFFFDIF2CS6UPBA6AHL7DAJWGBCHAV3PJDQC K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC ZEFGFQHN6J2S6EIPX7EPDG22C5YXTI6DMKQHHRCLWN5MQC44KY3AC SG76BPJKTQGDFNP5QFMAVR6H72FMMAYCECVGSWWSCLMAVQX7E3FQC DDU4A3JGN5IUIPP5IASOODKPR2WBHSDSV4FITZ6HNXNSXXQACWAQC Y2NYY7HWFZ2LQDK3ACSLGS37F2J2IJ5LRGCIMZYXLEOSVPD3A4DAC SVY2PTCLXR3KNPQAWXVXTTGCC5DR334HOAKHYO3VDDRWM2BWMALAC 5FHWTG7M6FW4B3I33YI7QSM3OZIB6ZGC6TI6JISSLY5Y43HI56VAC CDFS7Z74W5HKPQIHQICOG442KQFXUSBGGLDDQLE3MG74T44YU6AQC RPOZZWKG5GLPHVZZ7ZKMKS64ZMV2LDCQSARBJFJ6FZOTOKCQO7FAC FLAGBNUNSIQNFDN53CDWABJRTTFWDL4PG34AI474ZKPXDEPYHOAQC 7YUGK5Q64KG5O7GJGTUBRRLHAHBCJ5YOE23YUPT6UBKUSB67CYAQC NRMSQFTORG3GC7HQBIN5DHB5GLWXM6IQO6PTXD4C7LBQWJIHYIGAC TQLWCGVXVZ75H7MDBJD3DJDUFNW62WOAEDJUVKCHQTAXKBP47CSAC PONOTAV3NEDNVGEJNPMLC5AY2BPV5E3ZHWDLNQCKCEBVKPBIY7QQC YMLVBQ6M27MECUVMU3BQP3WSGR7GW4XJMQIHLGHHWMVXHMMIXOYAC // Don't check for pbolt.seen, since we get called before the beam is// fired.std::string beam_name;if (pbolt.flavour <= BEAM_NONE|| pbolt.flavour >= NUM_BEAMS|| pbolt.name.empty()){beam_name = "INVALID BEAM";}else if (pbolt.type == 0 || pbolt.name[0] == '0')beam_name = "INVISIBLE BEAM";elsebeam_name = pbolt.get_short_name();msg = replace_all(msg, "@beam@", beam_name);
beam.colour = LIGHTMAGENTA;beam.name = "orb of energy";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.colour = LIGHTMAGENTA;beam.name = "orb of energy";beam.short_name = "energy";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.colour = YELLOW;beam.name = "bolt of energy";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 wallsbeam.is_beam = true;
beam.colour = YELLOW;beam.name = "bolt of energy";beam.short_name = "energy";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 wallsbeam.is_beam = true;
beam.colour = random_colour();beam.name = "bolt of energy";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.colour = random_colour();beam.name = "bolt of energy";beam.short_name = "energy";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.name = "spray of metal splinters";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.name = "spray of metal splinters";beam.short_name = "metal splinters";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.name = "blast of cold";beam.aux_source = "blast of icy breath";beam.damage = dice_def( 3, (mons->hit_dice * 2) );beam.colour = WHITE;beam.type = dchar_glyph(DCHAR_FIRED_ZAP);beam.thrower = KILL_MON;beam.hit = 30;beam.flavour = BEAM_COLD;beam.is_beam = true;
beam.name = "blast of cold";beam.aux_source = "blast of icy breath";beam.short_name = "frost";beam.damage = dice_def( 3, (mons->hit_dice * 2) );beam.colour = WHITE;beam.type = dchar_glyph(DCHAR_FIRED_ZAP);beam.thrower = KILL_MON;beam.hit = 30;beam.flavour = BEAM_COLD;beam.is_beam = true;
// pbolt.seen might be set by caller to supress this.if (!pbolt.seen && see_grid(pbolt.source) && pbolt.range > 0&& pbolt.type != 0 && pbolt.name[0] != '0'){pbolt.seen = true;int midx = mgrd(pbolt.source);if (!pbolt.is_tracer && !YOU_KILL(pbolt.thrower)&& !crawl_state.is_god_acting()&& (midx == NON_MONSTER || !you.can_see(&menv[midx]))){mprf("%s appears from out of thin air!",article_a(pbolt.name, false).c_str());}}
const bool was_seen = pbolt.seen;if (!was_seen && pbolt.range > 0 && pbolt.type != 0&& pbolt.name[0] != '0' && see_grid(testpos)){pbolt.seen = true;}if (!was_seen && pbolt.seen && !pbolt.is_tracer){mprf("%s appears from out of your range of vision.",article_a(pbolt.name, false).c_str());}
range_used(0), is_tracer(false), aimed_at_feet(false),msg_generated(false), in_explosion_phase(false),smart_monster(false), can_see_invis(false),attitude(ATT_HOSTILE), foe_ratio(0), chose_ray(false),beam_cancelled(false), dont_stop_foe(false),
seen(false), range_used(0), is_tracer(false),aimed_at_feet(false), msg_generated(false),in_explosion_phase(false), smart_monster(false),can_see_invis(false), attitude(ATT_HOSTILE), foe_ratio(0),chose_ray(false), beam_cancelled(false), dont_stop_foe(false),
}std::string bolt::get_short_name(){if (!short_name.empty())return (short_name);if (item != NULL && is_valid_item(*item))return item->name(DESC_NOCAP_A, false, false, false, false,ISFLAG_IDENT_MASK | ISFLAG_COSMETIC_MASK| ISFLAG_RACIAL_MASK);if (real_flavour == BEAM_RANDOM || real_flavour == BEAM_CHAOS)flavour = real_flavour;if (flavour == BEAM_FIRE && name == "sticky fire")return ("sticky fire");if (flavour == BEAM_ELECTRICITY && is_beam)return ("lightning");if (flavour == BEAM_NONE || flavour == BEAM_MISSILE|| flavour == BEAM_MMISSILE){return (name);}return beam_type_name(flavour);}std::string beam_type_name(beam_type type){switch(type){case BEAM_NONE: return("none");case BEAM_MISSILE: return("missile");case BEAM_MMISSILE: return("magic missile");case BEAM_POTION_FIRE:case BEAM_FIRE: return("fire");case BEAM_POTION_COLD:case BEAM_COLD: return("cold");case BEAM_MAGIC: return("magic");case BEAM_ELECTRICITY: return("electricity");case BEAM_POTION_STINKING_CLOUD:case BEAM_POTION_POISON:case BEAM_POISON: return("poison");case BEAM_NEG: return("negative energy");case BEAM_ACID: return("acid");case BEAM_MIASMA:case BEAM_POTION_MIASMA: return("miasma");case BEAM_SPORE: return("spores");case BEAM_POISON_ARROW: return("poison arrow");case BEAM_HELLFIRE: return("hellfire");case BEAM_NAPALM: return("sticky fire");case BEAM_POTION_STEAM:case BEAM_STEAM: return("steam");case BEAM_HELLFROST: return("hellfrost");case BEAM_ENERGY: return("energy");case BEAM_HOLY: return("holy power");case BEAM_FRAG: return("fragments");case BEAM_LAVA: return("magma");case BEAM_ICE: return("ice");case BEAM_NUKE: return("nuke");case BEAM_RANDOM: return("random");case BEAM_CHAOS: return("chaos");case BEAM_SLOW: return("slow");case BEAM_HASTE: return("haste");case BEAM_HEALING: return("healing");case BEAM_PARALYSIS: return("paralysis");case BEAM_CONFUSION: return("confusion");case BEAM_INVISIBILITY: return("invisibility");case BEAM_DIGGING: return("digging");case BEAM_TELEPORT: return("teleportation");case BEAM_POLYMORPH: return("polymorph");case BEAM_CHARM: return("enslave");case BEAM_BANISH: return("banishment");case BEAM_DEGENERATE: return("degenration");case BEAM_ENSLAVE_UNDEAD: return("enslave undead");case BEAM_ENSLAVE_SOUL: return("enslave soul");case BEAM_PAIN: return("pain");case BEAM_DISPEL_UNDEAD: return("dispel undead");case BEAM_DISINTEGRATION: return("disintegration");case BEAM_ENSLAVE_DEMON: return("enlsave demon");case BEAM_BLINK: return("blink");case BEAM_PETRIFY: return("petrify");case BEAM_BACKLIGHT: return("backlight");case BEAM_SLEEP: return("sleep");case BEAM_POTION_BLACK_SMOKE: return("black smoke");case BEAM_POTION_GREY_SMOKE: return("grey smoke");case BEAM_POTION_BLUE_SMOKE: return("blue smoke");case BEAM_POTION_PURP_SMOKE: return("purple smoke");case BEAM_POTION_RANDOM: return("random potion");case BEAM_TORMENT_DAMAGE: return("torment damage");case BEAM_STEAL_FOOD: return("steal food");case BEAM_LINE_OF_SIGHT: return("line of sight");case NUM_BEAMS:DEBUGSTR("invalid beam type");return("INVALID");}DEBUGSTR("unknown beam type");return("UNKNOWN");