Fix 2426301: melding not working properly for Merfolk transformation. Colour melded equipment darkgrey on the % screen.
Disallow Merfolk slipping out of their boots if doing so would kill the player due to stat loss. (Falling into water when flying will still kill them.) When this is the case, deep water is regarded as unsafe for travel. TODO: Ending a transformation should likewise be impossible if doing so would cause stat loss due to unmelding of items.
Add a stat_colour option to highlight the stats when they're below a given threshold. By default, lightred at 1, red at 2-3. You could argue for setting the default to 7 but that would mean colouring almost all stats for each beginning character. (FR 2022232) Tidy up the stat colouring methods.
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@8004 c06c8d41-db1a-0410-9941-cceddc491573
X55CKEKNO5RD2JMQ4MYX6PXQLDMLH4U4PPKSBK5EQ622J5HOPD2AC
7P2MFAHMRBRV7HEQCB64XGQTSZYBTQX5KFNJF4WTBBJJG2VIMGXQC
KSQRI2UQ7VDW4IJ7T4WHVI4TEN3PQWEPLVLBVZTYDUIZJLIKLBIAC
6XMOQXYVIJURESDEO4OO2ISV6GPIW72ZR2EAF4YIZW3JNJJF73NAC
RWY2PVZAPQO4QAY5VLTP3WDL3P5KLJGUWC5BBJNGVPYCQ2ZJEFOQC
7VCVH6XKT4L4PSCBF6XRYV3WQQDVGDMA73RHPV6IOWMQ2S7B5XAQC
EYYWIH7377INOKPRABJUATNQ2YWKLOVHZKQIY55POX2YXVMDDWAAC
OELSU5HUOEW6D2AAZJUYB5G25OOGR3YU7UZKNA57EJG5HRMCQ7UAC
K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC
6CZYPP67SB2M3SQS3QIPJWHZY7PJIRTTBH5CLORV3AALVTJIL5MQC
H5BVKRORNXTCJKFXQPTFWDURKSUFW24CGSJXBGZCJUP4DHMSVDBQC
IP4A3VRYFYIVLRUAU4DF4KDNP6E4UISWJX3LI2F4EGSSMIJYRJXAC
CIPVRZGLOZHCERK6YPOBV3P2E4IAB4H6D5EHLRQE2O5E4P4VCBUAC
7F5A7R3P2V3SPUNNJMOEG5ISKKANHC5C5G34YV77QCLQP2T3BV2QC
RPOZZWKG5GLPHVZZ7ZKMKS64ZMV2LDCQSARBJFJ6FZOTOKCQO7FAC
VXSORUQOM2VZA4CAZDC6KPAY373NQIN3UT7CXQXTRCYXO2WM62DAC
I5N4EIR6SCLLRGKRBUKW5FKUVYK62EA5DOWIAS5XFIHZQKMCXWBAC
TGJZXTUIAKCFZQJ54ZQEBGFBVZSJCAX6AWDRSH3TP7UJRLGUM5SAC
NWUWP5QCMJ7ZZMLCVB74PW7HDEFB6ICEQHNDHCGG7UWDQNNLGVMQC
7ZMJTRJP6PQW4OLFDNTYLMVAZLYQ3IEBIQZVBZN2BSRJEADHUZ7AC
R22TTMI6WXWULC7ODKFF3QCB7MOTETQQ6IR4BUCUPOCQKQNCTT5AC
DS2GZKISEP2DM2VU6EJ525Q7W3WVOKJXG5PY2OY4VNFCLBHVVOTAC
EB33TUEEJFHMEO6YHEXSYX3MBXHNPEFNMZL2VA75GOGKY6POSF2AC
LS2FPEQQPF3L6AG6NCI2EMBQYWB7POZQBAUCNCGXG4H3Z3ACZG5AC
YIIILIV4ZPRIPWWT4GL7YWSJCUVH6RJJLXV4XIHY6SF3H7Y3EAYAC
3VWSZUGYL36SO5AOZRASGK3VHFCFZUGGCGRT3R7BZB36IZPN7OSQC
QYUAYEGK7WPBJLZRSWZVDWD5SMNAWWIJSQPWYA7BEYXMEBD2SDKAC
NY5JJY33IHF5EKTLPDFVYTN3PFNKV4A3MAH5MRQ3AWH53L2HFIQQC
IXW2IM5ITYDCXDB3ORDDVAR5XUSPVQ3BWLP3Q6TRXNTIKGMZTHXAC
Q263OF72GJOH2VQHGCF5IYZ5UHKV5DNX3J3WTCEONPN3WGGNZOUQC
YWYXUCZKGNIAWAUKUESIPFCAL5HZOKOEWHUEUW7X4DMAX2HG2FSAC
GQLLYETI5KID6MXQ6YJ5TZJYN5V3QDFOUQIKBVDYGVARNWBCMOSAC
4RMDJ2EE4TFOQPO27F4XKZNUWMXINHZCC2566IXYXMRDK24ZLIIAC
PNIUNDZ5EU2BP673QTWVFQFQJAAI2MAFIVEQAZMDBIMD4ZDWWXTQC
OMSSJON5IE4LBXJ7CZE52IZRZS7ZICS23SKP4AGLHH3QNCRMEFVAC
TUKBRR44ONNRAUYHTQTQIYIQPFK752EGWEZ5A5PULTTQDEDD7DRAC
UVJBHQ5KGUIEFRHKTYQPKSXYDUDKTRAXINUXGJJJ6QGNCR6JO7ZAC
CJZ3R6IPU766AVGO2QHTEHY6BGM375IUL4W2XA33F2G2SGIAD2KQC
EXHPY35NEM77IOLYIVBK5UV5NHEH6SRDJUI3F7IIDB6RDLBTBGTQC
5BJPWUPLJFS34FUTFJVKA4A52YMIGV6EWDXLNSDCWBJWBGVSQFGQC
SIDH2P7NBIG5KEOE27XHD3ZT2NQ2OJZFN6VZXWNWYFFY5YVXSSVQC
W7KGGF2VUXLD6YH55EPIRQ5SF5VKVKT33P6RNKCFCVQ4QXOLQE7AC
TO43FWKHNIA5MVDOFXYHQODTLBQYEZKX5UIUGID57436UF7G2EXQC
4UXFU3FZOCBSLDQ4S7MJKAE2H7VUHCNRDQMIY6NJ3PHYXWNGISDQC
VNIAJEGE3PYE6F6EAMCQDWMAS52EQTKJUPAFXK7ARCITZ326WTTQC
ASLW3Z5PAVZSWJEMMMVZT226P44EKSAD47QS72JIFJESAI3RPN3AC
UEI5JAVCMN7Y2SACTEZPZSNFJWOJTC55G24Q6LKQCT4XNDH5ZQIAC
5XNQ3SSNBFXFNWA6DPM74W6FH65NX665P3DMH6YCWVFOPZTJSYCQC
YXY47WGHSW2UMFCUOHFPGRX4LKRSFVUTWUCIOL6OTZPS3C7ZHLNAC
QGUV5IINCOK6AXWQ2QTZMPDJTEZPON5O565ANT2EE236I5OAPAVAC
EOMCPVNQLX3IMLC46EAO67DPBH5KEG2FQTPBLGU62HIRWA3UQ7XQC
CH7JECYYH35H4TRHRNRTRJCQTQLZ2WRH62TKV72SUIU2RTK5OH7AC
RVST2QHYJ757ZHK4AUJ5NGPDZ44AD6RVFVXYPKQIBJXZBDNUCHXQC
THEWZBBFONK266AMYIIFQ4SFGZMTMU62ZO2Y43UMCDD6DDBSDYKAC
GSPHLNMEIUY5KSOV2LPKQLGJVBPGHXZENIXSJELA6ZBT74F5ZGRQC
bool remove_equipment( std::set<equipment_type> remove_stuff );
bool remove_one_equip(equipment_type eq);
bool remove_equipment(std::set<equipment_type> remove_stuff, bool meld = true);
bool remove_one_equip(equipment_type eq, bool meld = true);
bool unmeld_one_equip(equipment_type eq);
// XXX: at some point we're going to need to fix the swimming
// code to handle burden states.
if (is_grid_dangerous(new_grid))
bool merfolk_check = false;
if (you.species == SP_MERFOLK)
canned_msg(MSG_UNTHINKING_ACT);
return (false);
}
// Check for fatal stat loss due to transforming.
// Also handles the warning message.
if (!merfolk_change_is_safe())
{
stop_running();
you.turn_is_over = false;
return (false);
}
viewwindow( true, false );
// If true, we were shifted and so we're done.
if (fall_into_a_pool( entry, allow_shift, new_grid ))
return (true);
merfolk_start_swimming();
}
else if (!grid_is_water(new_grid) && grid_is_water(old_grid))
{
unmeld_one_equip(EQ_BOOTS);
you.redraw_evasion = true;
}
// Safer water effects.
if (you.species == SP_MERFOLK)
// XXX: at some point we're going to need to fix the swimming
// code to handle burden states.
if (is_grid_dangerous(new_grid))
if (old_grid != DNGN_SHALLOW_WATER
&& old_grid != DNGN_DEEP_WATER)
// Lava and dangerous deep water (ie not merfolk).
const coord_def entry = (stepped) ? you.pos() : p;
if (stepped && !force && !you.confused())
short _get_stat_colour(stat_type stat)
{
int val = 0, max_val = 0;
switch (stat)
{
case STAT_STRENGTH:
val = you.strength;
max_val = you.max_strength;
break;
case STAT_INTELLIGENCE:
val = you.intel;
max_val = you.max_intel;
break;
case STAT_DEXTERITY:
val = you.dex;
max_val = you.max_dex;
break;
default:
ASSERT(false);
}
// Check the stat_colour option for warning thresholds.
for (unsigned int i = 0; i < Options.stat_colour.size(); ++i)
if (val <= Options.stat_colour[i].first)
return (Options.stat_colour[i].second);
// Stat is magically increased.
if (you.duration[DUR_DIVINE_STAMINA]
|| stat == STAT_STRENGTH && you.duration[DUR_MIGHT])
{
return (LIGHTBLUE); // no end of effect warning
}
// Stat is degenerated.
if (val < max_val)
return (YELLOW);
return (HUD_VALUE_COLOUR);
}
if (you.duration[DUR_MIGHT] || you.duration[DUR_DIVINE_STAMINA])
textcolor(LIGHTBLUE); // no end of effect warning
else if (you.strength < you.max_strength)
textcolor(YELLOW);
else
textcolor(HUD_VALUE_COLOR);
textcolor(_get_stat_colour(STAT_STRENGTH));
void merfolk_start_swimming(void)
std::set<equipment_type> r;
r.insert(EQ_BOOTS);
if (!player_light_armour())
r.insert(EQ_BODY_ARMOUR);
if (check_transformation_stat_loss(r, quiet))
return (false);
return (true);
}
void merfolk_start_swimming()
else if (key == "stat_colour" || key == "stat_color")
{
stat_colour.clear();
std::vector<std::string> thesplit = split_string(",", field);
for (unsigned i = 0; i < thesplit.size(); ++i)
{
std::vector<std::string> insplit = split_string(":", thesplit[i]);
if (insplit.size() == 0 || insplit.size() > 2
|| insplit.size() == 1 && i != 0)
{
crawl_state.add_startup_error(
make_stringf("Bad stat_colour string: %s\n", field.c_str()));
break;
}
int stat_limit = 1;
if (insplit.size() == 2 )
stat_limit = atoi(insplit[0].c_str());
int scolour = str_to_colour(insplit[(insplit.size() == 1) ? 0 : 1]);
stat_colour.push_back(std::pair<int, int>(stat_limit, scolour));
}
}