void Character::mutation_effect( const trait_id &mut ) { if( mut == "GLASSJAW" ) { recalc_hp(); } else if (mut == trait_STR_ALPHA) { ///\EFFECT_STR_MAX determines bonus from STR mutation if (str_max <= 6) { str_max = 8; } else if (str_max <= 7) { str_max = 11; } else if (str_max <= 14) { str_max = 15; } else { str_max = 18; } recalc_hp(); } else if (mut == trait_DEX_ALPHA) { ///\EFFECT_DEX_MAX determines bonus from DEX mutation if (dex_max <= 6) { dex_max = 8; } else if (dex_max <= 7) { dex_max = 11; } else if (dex_max <= 14) { dex_max = 15; } else { dex_max = 18; } } else if (mut == trait_INT_ALPHA) { ///\EFFECT_INT_MAX determines bonus from INT mutation if (int_max <= 6) { int_max = 8; } else if (int_max <= 7) { int_max = 11; } else if (int_max <= 14) { int_max = 15; } else { int_max = 18; } } else if (mut == trait_INT_SLIME) { int_max *= 2; // Now, can you keep it? :-) } else if (mut == trait_PER_ALPHA) { ///\EFFECT_PER_MAX determines bonus from PER mutation if (per_max <= 6) { per_max = 8; } else if (per_max <= 7) { per_max = 11; } else if (per_max <= 14) { per_max = 15; } else { per_max = 18; } } else { apply_mods(mut, true); } const auto &branch = mut.obj(); if( branch.hp_modifier != 0.0f || branch.hp_modifier_secondary != 0.0f || branch.hp_adjustment != 0.0f ) { recalc_hp(); } remove_worn_items_with( [&]( item& armor ) { static const std::string mutation_safe = "OVERSIZE"; if( armor.has_flag( mutation_safe ) ) { return false; } if( !branch.conflicts_with_item( armor ) ) { return false; } if( branch.destroys_gear ) { add_msg_player_or_npc( m_bad, _("Your %s is destroyed!"), _("<npcname>'s %s is destroyed!"), armor.tname().c_str() ); for( item& remain : armor.contents ) { g->m.add_item_or_charges( pos(), remain ); } } else { add_msg_player_or_npc( m_bad, _("Your %s is pushed off!"), _("<npcname>'s %s is pushed off!"), armor.tname().c_str() ); g->m.add_item_or_charges( pos(), armor ); } return true; } ); if( branch.starts_active ) { my_mutations[mut].powered = true; } on_mutation_gain( mut ); }
void Character::mutation_effect(std::string mut) { bool destroy = false; std::vector<body_part> bps; if (mut == "TOUGH" || mut == "TOUGH2" || mut == "TOUGH3" || mut == "GLASSJAW" || mut == "FLIMSY" || mut == "FLIMSY2" || mut == "FLIMSY3" || mut == "MUT_TOUGH" || mut == "MUT_TOUGH2" || mut == "MUT_TOUGH3") { recalc_hp(); } else if (mut == "WEBBED" || mut == "PAWS" || mut == "PAWS_LARGE" || mut == "ARM_TENTACLES" || mut == "ARM_TENTACLES_4" || mut == "ARM_TENTACLES_8") { // Push off gloves bps.push_back(bp_hand_l); bps.push_back(bp_hand_r); } else if (mut == "TALONS") { // Destroy gloves destroy = true; bps.push_back(bp_hand_l); bps.push_back(bp_hand_r); } else if (mut == "BEAK" || mut == "BEAK_PECK" || mut == "BEAK_HUM" || mut == "MANDIBLES" || mut == "SABER_TEETH") { // Destroy mouthwear destroy = true; bps.push_back(bp_mouth); } else if (mut == "MINOTAUR" || mut == "MUZZLE" || mut == "MUZZLE_BEAR" || mut == "MUZZLE_LONG" || mut == "PROBOSCIS" || mut == "MUZZLE_RAT") { // Push off mouthwear bps.push_back(bp_mouth); } else if (mut == "HOOVES" || mut == "RAP_TALONS") { // Destroy footwear destroy = true; bps.push_back(bp_foot_l); bps.push_back(bp_foot_r); } else if (mut == "SHELL") { // Destroy torsowear destroy = true; bps.push_back(bp_torso); } else if ( (mut == "INSECT_ARMS") || (mut == "ARACHNID_ARMS") || (mut == "WINGS_BUTTERFLY") ) { // Push off torsowear bps.push_back(bp_torso); } else if (mut == "HORNS_CURLED" || mut == "CHITIN3") { // Push off all helmets bps.push_back(bp_head); } else if (mut == "HORNS_POINTED" || mut == "ANTENNAE" || mut == "ANTLERS") { // Push off non-cloth helmets bps.push_back(bp_head); } else if (mut == "HUGE") { // And there goes your clothing; by now you shouldn't need it anymore add_msg(m_bad, _("You rip out of your clothing!")); destroy = true; bps.push_back(bp_torso); bps.push_back(bp_leg_l); bps.push_back(bp_leg_r); bps.push_back(bp_arm_l); bps.push_back(bp_arm_r); bps.push_back(bp_hand_l); bps.push_back(bp_hand_r); bps.push_back(bp_head); bps.push_back(bp_foot_l); bps.push_back(bp_foot_r); } else if (mut == "STR_ALPHA") { if (str_max <= 6) { str_max = 8; } else if (str_max <= 7) { str_max = 11; } else if (str_max <= 14) { str_max = 15; } else { str_max = 18; } recalc_hp(); } else if (mut == "DEX_ALPHA") { if (dex_max <= 6) { dex_max = 8; } else if (dex_max <= 7) { dex_max = 11; } else if (dex_max <= 14) { dex_max = 15; } else { dex_max = 18; } } else if (mut == "INT_ALPHA") { if (int_max <= 6) { int_max = 8; } else if (int_max <= 7) { int_max = 11; } else if (int_max <= 14) { int_max = 15; } else { int_max = 18; } } else if (mut == "INT_SLIME") { int_max *= 2; // Now, can you keep it? :-) } else if (mut == "PER_ALPHA") { if (per_max <= 6) { per_max = 8; } else if (per_max <= 7) { per_max = 11; } else if (per_max <= 14) { per_max = 15; } else { per_max = 18; } } else { apply_mods(mut, true); } const auto covers_any = [&bps]( const item& armor ) { for( auto &bp : bps ) { if( armor.covers( bp ) ) { return true; } } return false; }; remove_worn_items_with( [&]( item& armor ) { static const std::string mutation_safe = "OVERSIZE"; if( armor.has_flag( mutation_safe ) ) { return false; } if( !covers_any( armor ) ) { return false; } if( destroy ) { add_msg_if_player( m_bad, _("Your %s is destroyed!"), armor.tname().c_str() ); for( item& remain : armor.contents ) { g->m.add_item_or_charges( pos(), remain ); } } else { add_msg_if_player( m_bad, _("Your %s is pushed off."), armor.tname().c_str() ); g->m.add_item_or_charges( pos(), armor ); } return true; } ); }