summaryrefslogtreecommitdiffstats
path: root/crawl-ref
diff options
context:
space:
mode:
authorj-p-e-g <j-p-e-g@c06c8d41-db1a-0410-9941-cceddc491573>2008-12-28 14:09:26 +0000
committerj-p-e-g <j-p-e-g@c06c8d41-db1a-0410-9941-cceddc491573>2008-12-28 14:09:26 +0000
commit90d0e8c3f9d3fdcd0aa0ef1a479ad178ca3ad7e2 (patch)
tree0b0c8adc8bd00bc67b00f9e76e5db073339792e0 /crawl-ref
parent971e4ca792042d987cd898ae8144f849da188f2f (diff)
downloadcrawl-ref-90d0e8c3f9d3fdcd0aa0ef1a479ad178ca3ad7e2.tar.gz
crawl-ref-90d0e8c3f9d3fdcd0aa0ef1a479ad178ca3ad7e2.zip
Fix 2471146: equipment being melded due to mutations.
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
Diffstat (limited to 'crawl-ref')
-rw-r--r--crawl-ref/docs/options_guide.txt9
-rw-r--r--crawl-ref/settings/init.txt1
-rw-r--r--crawl-ref/source/directn.cc2
-rw-r--r--crawl-ref/source/externs.h1
-rw-r--r--crawl-ref/source/initfile.cc27
-rw-r--r--crawl-ref/source/misc.cc31
-rw-r--r--crawl-ref/source/misc.h1
-rw-r--r--crawl-ref/source/mutation.cc6
-rw-r--r--crawl-ref/source/output.cc107
-rw-r--r--crawl-ref/source/player.cc85
-rw-r--r--crawl-ref/source/transfor.cc28
-rw-r--r--crawl-ref/source/transfor.h5
12 files changed, 207 insertions, 96 deletions
diff --git a/crawl-ref/docs/options_guide.txt b/crawl-ref/docs/options_guide.txt
index 2896881009..30ee80e321 100644
--- a/crawl-ref/docs/options_guide.txt
+++ b/crawl-ref/docs/options_guide.txt
@@ -61,7 +61,7 @@ The contents of this text are:
prompt_for_swap, easy_quit_item_prompts, easy_exit_menu,
sort_menus
4-j Message and Display Improvements.
- hp_warning, mp_warning, hp_colour, mp_colour,
+ hp_warning, mp_warning, hp_colour, mp_colour, stat_colour,
status_caption_colour, delay_message_clear,
message_colour, show_inventory_weights, show_gold_turns,
show_beam, item_stack_summary_minimum, list_rotten,
@@ -1152,6 +1152,13 @@ hp_colour = 50:yellow, 25:red
mp_colour = 50:yellow, 25:red
mp_colour does to Magic what hp_colour does to Health.
+stat_colour = 1:lightred, 3:red
+ stat_colour colours your stats if they drop below a given value,
+ in the order of their definition. This check takes place before
+ the ones for e.g. Might or degeneration.
+ For normal grey colouring, set it to
+ stat_colour = 7
+
status_caption_colour = brown
Sets the colour that is used to display the captions in the status
area (for instance the "Health:" in "Health: 10/10").
diff --git a/crawl-ref/settings/init.txt b/crawl-ref/settings/init.txt
index 668ecdf6b3..debc523c6c 100644
--- a/crawl-ref/settings/init.txt
+++ b/crawl-ref/settings/init.txt
@@ -232,6 +232,7 @@ sort_menus = inv: true : equipped
# mp_warning = 0
# hp_colour = 50:yellow, 25:red
# mp_colour = 50:yellow, 25:red
+# stat_colour = 1:lightred, 3:red
# status_caption_colour = yellow
# classic_hud = true
diff --git a/crawl-ref/source/directn.cc b/crawl-ref/source/directn.cc
index 3750b72eb4..c6bb78faaf 100644
--- a/crawl-ref/source/directn.cc
+++ b/crawl-ref/source/directn.cc
@@ -2265,7 +2265,7 @@ void describe_floor()
msg_channel_type channel = MSGCH_EXAMINE;
- // Water is not terribly important if you don't mind it-
+ // Water is not terribly important if you don't mind it.
if ((grd(you.pos()) == DNGN_DEEP_WATER
|| grd(you.pos()) == DNGN_SHALLOW_WATER)
&& player_likes_water())
diff --git a/crawl-ref/source/externs.h b/crawl-ref/source/externs.h
index 301b663592..520d7f08b1 100644
--- a/crawl-ref/source/externs.h
+++ b/crawl-ref/source/externs.h
@@ -1996,6 +1996,7 @@ public:
std::vector<std::pair<int, int> > hp_colour;
std::vector<std::pair<int, int> > mp_colour;
+ std::vector<std::pair<int, int> > stat_colour;
std::string map_file_name; // name of mapping file to use
std::vector<std::pair<text_pattern, bool> > force_autopickup;
diff --git a/crawl-ref/source/initfile.cc b/crawl-ref/source/initfile.cc
index 856b35d5c5..14e9e69f57 100644
--- a/crawl-ref/source/initfile.cc
+++ b/crawl-ref/source/initfile.cc
@@ -895,6 +895,9 @@ void game_options::reset_options()
mp_colour.clear();
mp_colour.push_back(std::pair<int, int>(50, YELLOW));
mp_colour.push_back(std::pair<int, int>(25, RED));
+ stat_colour.clear();
+ stat_colour.push_back(std::pair<int, int>(1, LIGHTRED));
+ stat_colour.push_back(std::pair<int, int>(3, RED));
force_autopickup.clear();
note_monsters.clear();
@@ -2486,6 +2489,30 @@ void game_options::read_option_line(const std::string &str, bool runscript)
mp_colour.push_back(std::pair<int, int>(mp_percent, scolour));
}
}
+ 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));
+ }
+ }
else if (key == "note_skill_levels")
{
std::vector<std::string> thesplit = split_string(",", field);
diff --git a/crawl-ref/source/misc.cc b/crawl-ref/source/misc.cc
index 0c3ae915f3..b28934a945 100644
--- a/crawl-ref/source/misc.cc
+++ b/crawl-ref/source/misc.cc
@@ -1242,11 +1242,9 @@ void search_around( bool only_adjacent )
// Traps and doors stepdown skill:
// skill/(2x-1) for squares at distance x
int max_dist = (you.skills[SK_TRAPS_DOORS] + 1) / 2;
- if ( max_dist > 5 )
+ if (max_dist > 5)
max_dist = 5;
- if ( max_dist > 1 && only_adjacent )
- max_dist = 1;
- if ( max_dist < 1 )
+ if (only_adjacent && max_dist > 1 || max_dist < 1)
max_dist = 1;
for (radius_iterator ri(you.pos(), max_dist); ri; ++ri )
@@ -1297,21 +1295,36 @@ void search_around( bool only_adjacent )
}
}
-void merfolk_start_swimming(void)
+bool merfolk_change_is_safe(bool quiet)
+{
+ // If already transformed, no subsequent transformation necessary.
+ if (!player_is_airborne() && grid_is_water(grd(you.pos())))
+ return (true);
+
+ 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()
{
if (you.attribute[ATTR_TRANSFORMATION] != TRAN_NONE)
untransform();
- std::set<equipment_type> removed;
- removed.insert(EQ_BOOTS);
+ remove_one_equip(EQ_BOOTS);
// Perhaps a bit to easy for the player, but we allow merfolk
// to slide out of heavy body armour freely when entering water,
// rather than handling emcumbered swimming. -- bwr
if (!player_light_armour())
- removed.insert(EQ_BODY_ARMOUR);
+ remove_one_equip(EQ_BODY_ARMOUR, false);
- remove_equipment(removed);
you.redraw_evasion = true;
}
diff --git a/crawl-ref/source/misc.h b/crawl-ref/source/misc.h
index 5394cea642..762f548c06 100644
--- a/crawl-ref/source/misc.h
+++ b/crawl-ref/source/misc.h
@@ -20,6 +20,7 @@ void search_around( bool only_adjacent = false );
void down_stairs(int old_level,
dungeon_feature_type force_stair = DNGN_UNSEEN,
entry_cause_type entry_cause = EC_UNKNOWN);
+bool merfolk_change_is_safe(bool quiet = false);
void merfolk_start_swimming();
void new_level();
void trackers_init_new_level(bool transit);
diff --git a/crawl-ref/source/mutation.cc b/crawl-ref/source/mutation.cc
index 97ecc63231..ddd5d3e57c 100644
--- a/crawl-ref/source/mutation.cc
+++ b/crawl-ref/source/mutation.cc
@@ -2182,7 +2182,7 @@ bool mutate(mutation_type which_mutation, bool failMsg,
// Hooves and talons force boots off.
if (you_tran_can_wear(EQ_BOOTS))
- remove_one_equip(EQ_BOOTS);
+ remove_one_equip(EQ_BOOTS, false);
break;
case MUT_CLAWS:
@@ -2194,7 +2194,7 @@ bool mutate(mutation_type which_mutation, bool failMsg,
// mutation yet, so we have to check for level 2 or higher claws
// here.
if (you.mutation[mutat] >= 2 && you_tran_can_wear(EQ_GLOVES))
- remove_one_equip(EQ_GLOVES);
+ remove_one_equip(EQ_GLOVES, false);
break;
case MUT_HORNS:
@@ -2206,7 +2206,7 @@ bool mutate(mutation_type which_mutation, bool failMsg,
&& is_hard_helmet(you.inv[you.equip[EQ_HELMET]])
&& you_tran_can_wear(EQ_HELMET))
{
- remove_one_equip(EQ_HELMET);
+ remove_one_equip(EQ_HELMET, false);
}
break;
diff --git a/crawl-ref/source/output.cc b/crawl-ref/source/output.cc
index ec6343346b..22a9e1a186 100644
--- a/crawl-ref/source/output.cc
+++ b/crawl-ref/source/output.cc
@@ -53,8 +53,8 @@
// Color for captions like 'Health:', 'Str:', etc.
#define HUD_CAPTION_COLOR Options.status_caption_colour
-// Color for values, which come after captions.
-static const short HUD_VALUE_COLOR = LIGHTGREY;
+// Colour for values, which come after captions.
+static const short HUD_VALUE_COLOUR = LIGHTGREY;
// ----------------------------------------------------------------------
// colour_bar
@@ -227,7 +227,7 @@ void update_turn_count()
cgotoxy(19+6, 8, GOTO_STAT);
// Show the turn count starting from 1. You can still quit on turn 0.
- textcolor(HUD_VALUE_COLOR);
+ textcolor(HUD_VALUE_COLOUR);
cprintf("%ld", you.num_turns);
textcolor(LIGHTGREY);
}
@@ -280,20 +280,21 @@ static const char* _describe_hunger(int& color)
static void _print_stats_mp(int x, int y)
{
// Calculate colour
- short mp_colour = HUD_VALUE_COLOR;
+ short mp_colour = HUD_VALUE_COLOUR;
{
int mp_percent = (you.max_magic_points == 0
? 100
: (you.magic_points * 100) / you.max_magic_points);
- for ( unsigned int i = 0; i < Options.mp_colour.size(); ++i )
- if ( mp_percent <= Options.mp_colour[i].first )
+
+ for (unsigned int i = 0; i < Options.mp_colour.size(); ++i)
+ if (mp_percent <= Options.mp_colour[i].first)
mp_colour = Options.mp_colour[i].second;
}
cgotoxy(x+8, y, GOTO_STAT);
textcolor(mp_colour);
cprintf("%d", you.magic_points);
- textcolor(HUD_VALUE_COLOR);
+ textcolor(HUD_VALUE_COLOUR);
cprintf("/%d", you.max_magic_points );
int col = _count_digits(you.magic_points)
@@ -310,7 +311,7 @@ static void _print_stats_hp(int x, int y)
const int max_max_hp = get_real_hp(true, true);
// Calculate colour
- short hp_colour = HUD_VALUE_COLOR;
+ short hp_colour = HUD_VALUE_COLOUR;
{
const int hp_percent =
(you.hp * 100) / (max_max_hp ? max_max_hp : you.hp);
@@ -327,7 +328,7 @@ static void _print_stats_hp(int x, int y)
cprintf(max_max_hp != you.hp_max ? "HP: " : "Health: ");
textcolor(hp_colour);
cprintf( "%d", you.hp );
- textcolor(HUD_VALUE_COLOR);
+ textcolor(HUD_VALUE_COLOUR);
cprintf( "/%d", you.hp_max );
if (max_max_hp != you.hp_max)
cprintf( " (%d)", max_max_hp );
@@ -336,10 +337,50 @@ static void _print_stats_hp(int x, int y)
for (int i = 18-col; i > 0; i--)
cprintf(" ");
- if (! Options.classic_hud)
+ if (!Options.classic_hud)
HP_Bar.draw(19, y, you.hp, you.hp_max);
}
+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);
+}
+
// XXX: alters state! Does more than just print!
static void _print_stats_str(int x, int y)
{
@@ -353,13 +394,7 @@ static void _print_stats_str(int x, int y)
cgotoxy(x+5, y, GOTO_STAT);
- 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));
cprintf( "%d", you.strength );
if (you.strength != you.max_strength)
@@ -382,13 +417,7 @@ static void _print_stats_int(int x, int y)
cgotoxy(x+5, y, GOTO_STAT);
- if (you.duration[DUR_DIVINE_STAMINA])
- textcolor(LIGHTBLUE); // no end of effect warning
- else if (you.intel < you.max_intel)
- textcolor(YELLOW);
- else
- textcolor(HUD_VALUE_COLOR);
-
+ textcolor(_get_stat_colour(STAT_INTELLIGENCE));
cprintf( "%d", you.intel );
if (you.intel != you.max_intel)
@@ -409,13 +438,7 @@ static void _print_stats_dex(int x, int y)
cgotoxy(x+5, y, GOTO_STAT);
- if (you.duration[DUR_DIVINE_STAMINA])
- textcolor(LIGHTBLUE); // no end of effect warning
- else if (you.dex < you.max_dex)
- textcolor(YELLOW);
- else
- textcolor(HUD_VALUE_COLOR);
-
+ textcolor(_get_stat_colour(STAT_DEXTERITY));
cprintf( "%d", you.dex );
if (you.dex != you.max_dex)
@@ -433,7 +456,7 @@ static void _print_stats_ac(int x, int y)
else if (you.duration[DUR_ICY_ARMOUR] || you.duration[DUR_STONESKIN])
textcolor( LIGHTBLUE );
else
- textcolor( HUD_VALUE_COLOR );
+ textcolor( HUD_VALUE_COLOUR );
cprintf( "%2d ", player_AC() );
// SH: (two lines lower)
@@ -441,14 +464,14 @@ static void _print_stats_ac(int x, int y)
if (you.duration[DUR_CONDENSATION_SHIELD] || you.duration[DUR_DIVINE_SHIELD])
textcolor( LIGHTBLUE );
else
- textcolor( HUD_VALUE_COLOR );
+ textcolor( HUD_VALUE_COLOUR );
cprintf( "%2d ", player_shield_class() );
}
static void _print_stats_ev(int x, int y)
{
cgotoxy(x+4, y, GOTO_STAT);
- textcolor(you.duration[DUR_FORESCRY] ? LIGHTBLUE : HUD_VALUE_COLOR);
+ textcolor(you.duration[DUR_FORESCRY] ? LIGHTBLUE : HUD_VALUE_COLOUR);
cprintf( "%2d ", player_evasion() );
}
@@ -834,7 +857,7 @@ void print_stats(void)
// Increase y-value for all following lines.
yhack = 1;
cgotoxy(1+6, 8, GOTO_STAT);
- textcolor(HUD_VALUE_COLOR);
+ textcolor(HUD_VALUE_COLOUR);
cprintf("%d", you.gold);
}
@@ -843,7 +866,7 @@ void print_stats(void)
cgotoxy(1,8 + yhack, GOTO_STAT);
textcolor(Options.status_caption_colour);
cprintf("Exp Pool: ");
- textcolor(HUD_VALUE_COLOR);
+ textcolor(HUD_VALUE_COLOUR);
#if DEBUG_DIAGNOSTICS
cprintf("%d/%d (%d) ",
you.skill_cost_level, you.exp_available, you.experience);
@@ -935,7 +958,7 @@ void print_stats_level()
textcolor(HUD_CAPTION_COLOR);
cprintf("Place: ");
- textcolor(HUD_VALUE_COLOR);
+ textcolor(HUD_VALUE_COLOUR);
#if DEBUG_DIAGNOSTICS
cprintf( "(%d) ", you.your_level + 1 );
#endif
@@ -1658,14 +1681,20 @@ static void _print_overview_screen_equip(column_composer& cols,
{
const int item_idx = you.equip[e_order[i]];
const item_def& item = you.inv[item_idx];
- const char* colname = colour_to_str(item.colour).c_str();
+
+ // Colour melded equipment dark grey.
+ const char* colname =
+ player_wearing_slot(e_order[i]) ?
+ colour_to_str(item.colour).c_str() : "darkgrey";
+
const char equip_char = index_to_letter(item_idx);
snprintf(buf, sizeof buf,
- "%s<w>%c</w> - <%s>%s</%s>",
+ "%s<w>%c</w> - <%s>%s%s</%s>",
slot,
equip_char,
colname,
+ !player_wearing_slot(e_order[i]) ? "melded " : "",
item.name(DESC_PLAIN, true).substr(0,42).c_str(),
colname);
equip_chars.push_back(equip_char);
diff --git a/crawl-ref/source/player.cc b/crawl-ref/source/player.cc
index ae98021ff6..526e6358eb 100644
--- a/crawl-ref/source/player.cc
+++ b/crawl-ref/source/player.cc
@@ -223,48 +223,64 @@ bool move_player_to_grid( const coord_def& p, bool stepped, bool allow_shift,
// Only consider terrain if player is not levitating.
if (!player_is_airborne())
{
- // 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)
{
- // lava and dangerous deep water (ie not merfolk)
- const coord_def entry = (stepped) ? you.pos() : p;
+ if (grid_is_water(new_grid))
+ merfolk_check = true;
- if (stepped && !force && !you.confused())
+ // Safer water effects.
+ if (grid_is_water(new_grid) && !grid_is_water(old_grid))
{
- canned_msg(MSG_UNTHINKING_ACT);
- return (false);
- }
-
- // Have to move now so fall_into_a_pool will work.
- you.moveto(p);
+ // 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 (stepped)
+ mpr("Your legs become a tail as you enter the water.");
+ else
+ mpr("Your legs become a tail as you dive into the water.");
- // 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;
+ }
}
- else if (new_grid == DNGN_SHALLOW_WATER || new_grid == DNGN_DEEP_WATER)
+
+ if (!merfolk_check)
{
- // 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)
- {
- if (stepped)
- mpr("Your legs become a tail as you enter the water.");
- else
- mpr("Your legs become a tail as you dive into the water.");
+ // Lava and dangerous deep water (ie not merfolk).
+ const coord_def entry = (stepped) ? you.pos() : p;
- merfolk_start_swimming();
+ if (stepped && !force && !you.confused())
+ {
+ canned_msg(MSG_UNTHINKING_ACT);
+ return (false);
}
+
+ // Have to move now so fall_into_a_pool will work.
+ you.moveto(p);
+
+ 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);
}
- else if (!player_likes_water())
+ else if (new_grid == DNGN_SHALLOW_WATER && !player_likes_water())
{
- ASSERT( new_grid != DNGN_DEEP_WATER );
-
if (!stepped)
noisy(SL_SPLASH, you.pos(), "Splash!");
@@ -283,11 +299,6 @@ bool move_player_to_grid( const coord_def& p, bool stepped, bool allow_shift,
}
}
}
- else if (!grid_is_water(new_grid) && grid_is_water(old_grid)
- && you.species == SP_MERFOLK)
- {
- you.redraw_evasion = true;
- }
}
// Move the player to new location.
@@ -5886,7 +5897,9 @@ bool player::in_water() const
bool player::can_swim() const
{
- return (species == SP_MERFOLK);
+ // Transforming could be fatal if it would cause unequipment of
+ // stat-boosting boots or heavy armour.
+ return (species == SP_MERFOLK && merfolk_change_is_safe(true));
}
bool player::swimming() const
diff --git a/crawl-ref/source/transfor.cc b/crawl-ref/source/transfor.cc
index f891c90804..43fea5e51e 100644
--- a/crawl-ref/source/transfor.cc
+++ b/crawl-ref/source/transfor.cc
@@ -90,7 +90,7 @@ static void _init_equipment_removal(std::set<equipment_type> &rem_stuff,
}
}
-bool remove_equipment(std::set<equipment_type> removed)
+bool remove_equipment(std::set<equipment_type> removed, bool meld)
{
if (removed.find(EQ_WEAPON) != removed.end()
&& you.equip[EQ_WEAPON] != -1)
@@ -109,8 +109,11 @@ bool remove_equipment(std::set<equipment_type> removed)
if (e == EQ_WEAPON || you.equip[e] == -1)
continue;
- mprf("%s melds into your body.",
- you.inv[you.equip[e]].name(DESC_CAP_YOUR).c_str());
+ if (meld)
+ {
+ mprf("%s melds into your body.",
+ you.inv[you.equip[e]].name(DESC_CAP_YOUR).c_str());
+ }
if (e == EQ_LEFT_RING || e == EQ_RIGHT_RING || e == EQ_AMULET)
{
@@ -121,6 +124,14 @@ bool remove_equipment(std::set<equipment_type> removed)
{
unwear_armour( you.equip[e] );
}
+
+ if (!meld)
+ {
+ mprf("%s falls away!",
+ you.inv[you.equip[e]].name(DESC_CAP_YOUR).c_str());
+
+ you.equip[e] = -1;
+ }
}
return (true);
@@ -197,11 +208,18 @@ static bool _unmeld_equipment(std::set<equipment_type> melded)
return (true);
}
-bool remove_one_equip(equipment_type eq)
+bool unmeld_one_equip(equipment_type eq)
+{
+ std::set<equipment_type> e;
+ e.insert(eq);
+ return _unmeld_equipment(e);
+}
+
+bool remove_one_equip(equipment_type eq, bool meld)
{
std::set<equipment_type> r;
r.insert(eq);
- return remove_equipment(r);
+ return remove_equipment(r, meld);
}
static bool _tran_may_meld_cursed(int transformation)
diff --git a/crawl-ref/source/transfor.h b/crawl-ref/source/transfor.h
index f7d8361e02..86a7d9c5ce 100644
--- a/crawl-ref/source/transfor.h
+++ b/crawl-ref/source/transfor.h
@@ -60,8 +60,9 @@ bool transform(int pow, transformation_type which_trans, bool quiet = false);
/* ***********************************************************************
* called from: mutation - transfor
* *********************************************************************** */
-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);
bool transform_changed_physiology( bool phys_scales = false );