Now lists:
An example output:
A fire vortex
A swirling cloud of flame.
It is extremely resistant to fire, very resistant to electricity, and resistant to poison. It is susceptible to cold. It is immune to magical enchantments. It is fast. It can levitate.
I also removed all those symbol/quote/etc. checks from the database lookup. Instead describe_monster() is now called directly, so the descriptions are now identical when (v)iewing a monster and when searching the database.
In other news, I removed Eringya's Surprising Bouquet since I doubt we'll ever get it implemented, disagree balance-wise, and it was shamelessly nicked from Pratchett in the first place. Breaks saves.
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@8411 c06c8d41-db1a-0410-9941-cceddc491573
7OC5HCGLN26GDA5SQTWKBSUZYZDZJXWIVMJ4NKKXREOEEPUGQ4YQC
JWJGOMVBPZRSP2VSHLFFFDIF2CS6UPBA6AHL7DAJWGBCHAV3PJDQC
N7CKO4LATD44HNNA6747FY7M4BA4UKTMSJRL7KXONYADP5VMHROAC
TCDSXYLHENEA62EUBLQ7NPBSOG3QKDYJC4WFGIC2MS5DNWYTQX2QC
4IE6LVHAQEALNGRIXCQZ7RINKLZ62TMCCKKD74Q7MCDSXLZOA2UQC
K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC
RPOZZWKG5GLPHVZZ7ZKMKS64ZMV2LDCQSARBJFJ6FZOTOKCQO7FAC
NQMXQ6OQVUSC7Y7F7IL252QW4A5JED224EECNHWAM4ZZYVNY745AC
PR2XIEELO6UJWT3EXDHWCJZGIZCCF3D6KF6LC67R6RWWAVNWEHWAC
SUWIERONPDATHPDMZRYO6GYIXSW6XIS5V5MK5IV23DWQH2LL7VIAC
ZEFGFQHN6J2S6EIPX7EPDG22C5YXTI6DMKQHHRCLWN5MQC44KY3AC
DDU4A3JGN5IUIPP5IASOODKPR2WBHSDSV4FITZ6HNXNSXXQACWAQC
CHO4U5JC3RNTLXVIDXXJYZMOBZJ4VXW2GVJWDOTBRKK3AJ36LDLQC
JZCODQCOUBBBPPR4TLOAPIB4BQLDY3ORTJXTWEQSUJVJ7DMK7FVAC
4JNV6RTRY2UR3PZFMCNPRGCBSUAB7QTXYJCSYBIUAFMCCYVGN6PQC
HPE7PVDIOJDELSCDLCMFYFSDKOEJN35IZPWT57U3AIAPU45QOP6QC
KHVK7HH7OIYOBZY52WQGGLC2O4SXTWQS2XAHNJZZ7JZ3QTOUTLNAC
JI4NDSOXGGZ7QHXXFB3ZTHAKHABXYBZXPDGLUFV5SKYEOL5FT7JQC
BGJ7P65JV2OFVXMGAJDHV5Y36TR7JOFDWJUZJBHUBD7SCQMDRBEAC
ZIFFVCQ72K35WGIUMZYN3KOXIUXF2CNXWKG6ZWEZ6LT3NSF3XOQAC
DF5LOTJFSXOT7UBDHLBDLGA22OY4L7ZF6CVFP6H3KL4N5CHB5C5QC
VRFQK6S2TXOFFO5K5HRDXPR7QEKKAZAVCASSIJVPWQ4GE26UOGTQC
IU2CR2KXWJ6QGCVGNCXUWKK2HDUYYVR5IU4D65WVPLV7KWS6PASAC
B4T5LFXNCR6YTS3CRTHOAUAPD52RFFSK4WN6XZ5TRP2JNY3LLPRAC
NGDLKK45NREMXETWADSYSC6NNAGN4X5BZDJXHLL432WTAJKCG36AC
KVPP3CYPEFADQCL5Y56ELSUBA47SFNAJNCSVCSOK2GF67DHVMBCQC
GOPBXMJ7EKKPDSDXCANWW6ARWGNLOQ5DK7WI4UPD7K2GCDSK2HXAC
KEANRIMF5CGFVZ2XJYNFPOAKLXOSOJUOVA73IWBWOG576265ERHAC
SPELL_ERINGYAS_SURPRISING_BOUQUET, "Eringya's Surprising Bouquet",
SPTYP_TRANSMIGRATION | SPTYP_EARTH,
SPFLAG_NONE,
4,
0,
-1, -1,
0,
NULL,
false,
false
},
{
static const char* _get_resist_name(mon_resist_flags res_type)
{
switch (res_type)
{
case MR_RES_ELEC:
return "electricity";
case MR_RES_POISON:
return "poison";
case MR_RES_FIRE:
return "fire";
case MR_RES_STEAM:
return "steam";
case MR_RES_COLD:
return "cold";
case MR_RES_ACID:
return "acid";
default:
return "buggy resistance";
}
}
static int _get_resist_level(const mon_resist_def resist,
mon_resist_flags res_type)
{
switch (res_type)
{
case MR_RES_ELEC:
return resist.elec;
case MR_RES_POISON:
return resist.poison;
case MR_RES_FIRE:
return resist.fire;
case MR_RES_STEAM:
return resist.steam;
case MR_RES_COLD:
return resist.cold;
case MR_RES_ACID:
return resist.acid;
default:
return (0);
}
}
// Describe a monster's (intrinsic) resistances, speed and a few other
// attributes.
static std::string _monster_stat_description(const monsters& mon)
{
const char* modifiers[] = {
"susceptible", // -1
"resistant", // +1
"very resistant", // +2
"extremely resistant" // +3
};
const mon_resist_def resist = get_mons_resists(&mon);
std::vector<mon_resist_flags> resists;
resists.push_back(MR_RES_ELEC);
resists.push_back(MR_RES_POISON);
resists.push_back(MR_RES_FIRE);
resists.push_back(MR_RES_STEAM);
resists.push_back(MR_RES_COLD);
resists.push_back(MR_RES_ACID);
std::vector<std::string> extreme_resists;
std::vector<std::string> high_resists;
std::vector<std::string> base_resists;
std::vector<std::string> suscept;
for (unsigned int i = 0; i < resists.size(); ++i)
{
int level = _get_resist_level(resist, resists[i]);
const char* attackname = _get_resist_name(resists[i]);
if (level != 0)
{
const int offset = (level < 0) ? 0 : std::min(level, 3);
switch (offset)
{
case 0:
suscept.push_back(attackname);
break;
case 1:
base_resists.push_back(attackname);
break;
case 2:
high_resists.push_back(attackname);
break;
case 3:
extreme_resists.push_back(attackname);
break;
}
}
}
std::string result = "";
const char* pronoun = mons_pronoun(static_cast<monster_type>(mon.type),
PRONOUN_CAP, true);
std::vector<std::string> all_resists;
if (!extreme_resists.empty())
{
result = modifiers[3];
result += " to ";
result += comma_separated_line(extreme_resists.begin(),
extreme_resists.end(),
" and ", ", ");
all_resists.push_back(result);
}
if (!high_resists.empty())
{
result = modifiers[2];
result += " to ";
result += comma_separated_line(high_resists.begin(),
high_resists.end(),
" and ", ", ");
all_resists.push_back(result);
}
if (!base_resists.empty())
{
result = modifiers[1];
result += " to ";
result += comma_separated_line(base_resists.begin(),
base_resists.end(),
" and ", ", ");
all_resists.push_back(result);
}
if (!all_resists.empty())
{
result = pronoun;
result += " is ";
result += comma_separated_line(all_resists.begin(),
all_resists.end(),
", and ", ", ");
result += ".$";
}
// Is monster susceptible to anything? (On a new line.)
if (!suscept.empty())
{
result += pronoun;
result += " is ";
result += modifiers[0];
result += " to ";
result += comma_separated_line(suscept.begin(),
suscept.end(),
" and ", ", ");
result += ".$";
}
// Magic resistance at MAG_IMMUNE.
if (mons_immune_magic(&mon))
{
result += pronoun;
result += " is immune to magical enchantments.$";
}
// Seeing/sensing invisible.
if (mons_class_flag(mon.type, M_SEE_INVIS))
{
result += pronoun;
result += " can see invisible.$";
}
else if (mons_class_flag(mon.type, M_SENSE_INVIS))
{
result += pronoun;
result += " can sense the presence of invisible creatures.$";
}
// Unusual monster speed.
const int speed = mons_speed(mon.type);
if (speed < 10 || speed > 10)
{
result += pronoun;
result += " is ";
if (speed < 7)
result += "very slow";
else if (speed < 10)
result += "slow";
else if (speed > 20)
result += "extremely fast";
else if (speed > 15)
result += "very fast";
else if (speed > 10)
result += "fast";
result += ".$";
}
// Can the monster fly/levitate?
const flight_type fly = mons_class_flies(mon.type);
if (fly != FL_NONE)
{
result += pronoun;
result += " can ";
result += (fly == FL_FLY ? "fly" : "levitate");
result += ".$";
}
return result;
}
/*
std::string symbol = "";
symbol += get_monster_data(mon_num)->showchar;
if (isupper(symbol[0]))
symbol = "cap-" + symbol;
std::string symbol_prefix = "__";
symbol_prefix += symbol;
symbol_prefix += "_prefix";
prefix = getLongDescription(symbol_prefix);
quote += getQuoteString(symbol_prefix);
std::string symbol_suffix = "__";
symbol_suffix += symbol;
symbol_suffix += "_suffix";
suffix += getLongDescription(symbol_suffix);
suffix += getLongDescription(symbol_suffix + "_lookup");
quote += getQuoteString(symbol_suffix);
const monsters m = mon;
describe_monsters(m);
return (false);