@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";
else
beam_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 walls
beam.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 walls
beam.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");