diff options
author | zelgadis <zelgadis@c06c8d41-db1a-0410-9941-cceddc491573> | 2007-12-05 06:23:30 +0000 |
---|---|---|
committer | zelgadis <zelgadis@c06c8d41-db1a-0410-9941-cceddc491573> | 2007-12-05 06:23:30 +0000 |
commit | 28b3dd9db78b3d98762e5be3ff80256aea60759a (patch) | |
tree | 57b9dd919d5e292d7bebe35c6fc57c19a5ba0fa9 /crawl-ref/source/describe.cc | |
parent | df45205d9a9bc427963f2343935ca3b424ee8a5c (diff) | |
download | crawl-ref-28b3dd9db78b3d98762e5be3ff80256aea60759a.tar.gz crawl-ref-28b3dd9db78b3d98762e5be3ff80256aea60759a.zip |
Fixed some randart auto-inscription bugs.
For jewellery randarts, the properties of the randart's basetype are
included in the auto-inscription.
Auto-inscribe unidentified randarts if the the player has learned
some of its properties via equiping it.
If an unidentified randart is autoinscribed, is subsequently identified,
and the identification reveals more of its properties, then remove the
old atuo-inscription string before adding the new one.
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@3000 c06c8d41-db1a-0410-9941-cceddc491573
Diffstat (limited to 'crawl-ref/source/describe.cc')
-rw-r--r-- | crawl-ref/source/describe.cc | 124 |
1 files changed, 117 insertions, 7 deletions
diff --git a/crawl-ref/source/describe.cc b/crawl-ref/source/describe.cc index 25f9928145..f045567659 100644 --- a/crawl-ref/source/describe.cc +++ b/crawl-ref/source/describe.cc @@ -161,11 +161,11 @@ struct property_descriptors int spell_out; // 0: "+3", 1: "+++", 2: value doesn't matter }; -static std::string randart_auto_inscription( const item_def& item ) +static std::vector<std::string> randart_propnames( const item_def& item ) { randart_properties_t proprt; randart_known_props_t known; - randart_desc_properties( item, proprt, known ); + randart_desc_properties( item, proprt, known, true ); std::vector<std::string> propnames; @@ -182,7 +182,7 @@ static std::string randart_auto_inscription( const item_def& item ) { "RE", RAP_ELECTRICITY, 1 }, { "RP", RAP_POISON, 1 }, { "RN", RAP_NEGATIVE_ENERGY, 1 }, - { "MP", RAP_MAGICAL_POWER, 1 }, + { "MP", RAP_MAGICAL_POWER, 0 }, { "MR", RAP_MAGIC, 2 }, { "SInv", RAP_EYESIGHT, 2 }, { "Stl", RAP_STEALTH, 2 }, @@ -202,6 +202,80 @@ static std::string randart_auto_inscription( const item_def& item ) { "Map", RAP_MAPPING, 2 }, }; + // For randart jewellry, note the base jewelery type if it's not + // covered by randart_desc_properties() + if (item.base_type == OBJ_JEWELLERY + && item_ident( item, ISFLAG_KNOW_PROPERTIES )) + { + std::string type = ""; + + switch(item.sub_type) + { + case RING_REGENERATION: + type = "Regen"; + break; + + case RING_SUSTAIN_ABILITIES: + type = "SustAbil"; + break; + + case RING_SUSTENANCE: + type = "Susten"; + break; + + case RING_WIZARDRY: + type = "Wiz"; + break; + + case RING_FIRE: + type = "F-Mag"; + break; + + case RING_ICE: + type = "I-Mag"; + break; + + case RING_TELEPORT_CONTROL: + type = "T-Cont"; + break; + + case AMU_RESIST_SLOW: + type = "RSlow"; + break; + + case AMU_CLARITY: + type = "Clar"; + break; + + case AMU_WARDING: + type = "Ward"; + break; + + case AMU_RESIST_CORROSION: + type = "RAcid"; + break; + + case AMU_THE_GOURMAND: + type = "Gourm"; + break; + + case AMU_CONSERVATION: + type = "Conserv"; + break; + + case AMU_CONTROLLED_FLIGHT: + type = "C-Fly"; + break; + + case AMU_RESIST_MUTATION: + type = "RMut"; + break; + } + if (type != "") + propnames.push_back(type); + } + + for ( unsigned i = 0; i < ARRAYSIZE(propdescs); ++i ) { if (known_proprt(propdescs[i].prop)) @@ -211,7 +285,7 @@ static std::string randart_auto_inscription( const item_def& item ) switch ( propdescs[i].spell_out ) { case 0: - work << std::ios::showpos << val << ' ' << propdescs[i].name; + work << val << ' ' << propdescs[i].name; break; case 1: { @@ -227,11 +301,39 @@ static std::string randart_auto_inscription( const item_def& item ) propnames.push_back(work.str()); } } + + return propnames; +} + +static std::string randart_auto_inscription( const item_def& item ) +{ + std::vector<std::string> propnames = randart_propnames(item); + return comma_separated_line(propnames.begin(), propnames.end(), ", ", ", "); - } +// Remove randart auto-inscription. Do it once for each property +// string, rather than the return value of randart_auto_inscription(), +// in case more information about the randart has been learned since +// the last auto-inscription. +static void trim_randart_inscrip( item_def& item ) +{ + std::vector<std::string> propnames = randart_propnames(item); + + for (unsigned int i = 0, size = propnames.size(); i < size; i++) + { + std::string prop = propnames[i] + ","; + item.inscription = replace_all(item.inscription, prop, ""); + + prop = propnames[i]; + item.inscription = replace_all(item.inscription, prop, ""); + } + + trim_string(item.inscription); +} + + static std::string randart_descrip( const item_def &item ) { std::string description; @@ -3602,8 +3704,9 @@ void describe_item( item_def &item, bool allow_inscribe ) // when we don't need to. const bool allow_autoinscribe = is_random_artefact(item) && - item_ident(item, ISFLAG_KNOW_PROPERTIES) && - (item.inscription != randart_auto_inscription(item)); + (randart_auto_inscription(item) != "") && + (item.inscription.find(randart_auto_inscription(item)) + == std::string::npos); if ( allow_autoinscribe ) { @@ -3627,7 +3730,14 @@ void describe_item( item_def &item, bool allow_inscribe ) item.inscription = buf; } else if (toupper(keyin) == 'A' && allow_autoinscribe) + { + // Remove previous randart inscription + trim_randart_inscrip(item); + + if (item.inscription != "") + item.inscription += " "; item.inscription += randart_auto_inscription(item); + } } else if (getch() == 0) getch(); |