diff options
Diffstat (limited to 'stone_soup/crawl-ref/source/transfor.cc')
-rw-r--r-- | stone_soup/crawl-ref/source/transfor.cc | 574 |
1 files changed, 0 insertions, 574 deletions
diff --git a/stone_soup/crawl-ref/source/transfor.cc b/stone_soup/crawl-ref/source/transfor.cc deleted file mode 100644 index 144a838bb2..0000000000 --- a/stone_soup/crawl-ref/source/transfor.cc +++ /dev/null @@ -1,574 +0,0 @@ -/* - * File: transfor.cc - * Summary: Misc function related to player transformations. - * Written by: Linley Henzell - * - * Change History (most recent first): - * - * <2> 5/26/99 JDJ transform() and untransform() set you.wield_change so - * the weapon line updates. - * <1> -/--/-- LRH Created - */ - -#include "AppHdr.h" -#include "transfor.h" - -#include <stdio.h> -#include <string.h> - -#include "externs.h" - -#include "it_use2.h" -#include "itemname.h" -#include "items.h" -#include "misc.h" -#include "player.h" -#include "skills2.h" -#include "stuff.h" - -extern unsigned char your_sign; // defined in view.cc -extern unsigned char your_colour; // defined in view.cc -void drop_everything(void); -void extra_hp(int amount_extra); - -bool remove_equipment(FixedVector < char, 8 > &remove_stuff) -{ - char str_pass[ ITEMNAME_SIZE ]; - - // if we're removing body armour, the cloak will come off as well -- bwr - if (remove_stuff[EQ_BODY_ARMOUR] == 1 && you.equip[EQ_BODY_ARMOUR] != -1) - remove_stuff[EQ_CLOAK] = 1; - - // if we're removing gloves, the weapon will come off as well -- bwr - if (remove_stuff[EQ_GLOVES] == 1 && you.equip[EQ_GLOVES] != -1) - remove_stuff[EQ_WEAPON] = 1; - - if (remove_stuff[EQ_WEAPON] == 1 && you.equip[EQ_WEAPON] != -1) - { - unwield_item(you.equip[EQ_WEAPON]); - you.equip[EQ_WEAPON] = -1; - mpr("You are empty-handed."); - you.wield_change = true; - } - - for (int i = EQ_CLOAK; i < EQ_LEFT_RING; i++) - { - if (remove_stuff[i] == 0 || you.equip[i] == -1) - continue; - - in_name( you.equip[i], DESC_CAP_YOUR, str_pass ); - - snprintf( info, INFO_SIZE, "%s falls away.", str_pass ); - mpr(info); - - unwear_armour( you.equip[i] ); - you.equip[i] = -1; - } - - return true; -} // end remove_equipment() - -// Returns true if any piece of equipment that has to be removed is cursed. -// Useful for keeping low level transformations from being too useful. -static bool check_for_cursed_equipment( FixedVector < char, 8 > &remove_stuff ) -{ - for (int i = EQ_WEAPON; i < EQ_LEFT_RING; i++) - { - if (remove_stuff[i] == 0 || you.equip[i] == -1) - continue; - - if (item_cursed( you.inv[ you.equip[i] ] )) - { - mpr( "Your cursed equipment won't allow you to complete the " - "transformation." ); - - return (true); - } - } - - return (false); -} // end check_for_cursed_equipment() - -bool transform(int pow, char which_trans) -{ - if (you.species == SP_MERFOLK && player_is_swimming() - && which_trans != TRAN_DRAGON) - { - // This might by overkill, but it's okay because obviously - // whatever magical ability that let's them walk on land is - // removed when they're in water (in this case, their natural - // form is completely over-riding any other... goes well with - // the forced transform when entering water)... but merfolk can - // transform into dragons, because dragons fly. -- bwr - mpr("You cannot transform out of your normal form while in water."); - return (false); - } - - // This must occur before the untransform() and the is_undead check. - if (you.attribute[ATTR_TRANSFORMATION] == which_trans) - { - if (you.duration[DUR_TRANSFORMATION] < 100) - { - mpr( "You extend your transformation's duration." ); - you.duration[DUR_TRANSFORMATION] += random2(pow); - - if (you.duration[DUR_TRANSFORMATION] > 100) - you.duration[DUR_TRANSFORMATION] = 100; - - return (true); - } - else - { - mpr( "You cannot extend your transformation any further!" ); - return (false); - } - } - - if (you.attribute[ATTR_TRANSFORMATION] != TRAN_NONE) - untransform(); - - if (you.is_undead) - { - mpr("Your unliving flesh cannot be transformed in this way."); - return (false); - } - - //jmf: silently discard this enchantment - you.duration[DUR_STONESKIN] = 0; - - FixedVector < char, 8 > rem_stuff; - - for (int i = EQ_WEAPON; i < EQ_RIGHT_RING; i++) - rem_stuff[i] = 1; - - you.redraw_evasion = 1; - you.redraw_armour_class = 1; - you.wield_change = true; - - /* Remember, it can still fail in the switch below... */ - switch (which_trans) - { - case TRAN_SPIDER: // also AC +3, ev +3, fast_run - if (check_for_cursed_equipment( rem_stuff )) - return (false); - - mpr("You turn into a venomous arachnid creature."); - remove_equipment( rem_stuff ); - - you.attribute[ATTR_TRANSFORMATION] = TRAN_SPIDER; - you.duration[DUR_TRANSFORMATION] = 10 + random2(pow) + random2(pow); - - if (you.duration[DUR_TRANSFORMATION] > 60) - you.duration[DUR_TRANSFORMATION] = 60; - - modify_stat( STAT_DEXTERITY, 5, true ); - - your_sign = 's'; - your_colour = BROWN; - return (true); - - case TRAN_ICE_BEAST: // also AC +3, cold +3, fire -1, pois +1 - mpr( "You turn into a creature of crystalline ice." ); - - rem_stuff[ EQ_CLOAK ] = 0; - - remove_equipment( rem_stuff ); - - you.attribute[ATTR_TRANSFORMATION] = TRAN_ICE_BEAST; - you.duration[DUR_TRANSFORMATION] = 30 + random2(pow) + random2(pow); - - if (you.duration[ DUR_TRANSFORMATION ] > 100) - you.duration[ DUR_TRANSFORMATION ] = 100; - - extra_hp(12); // must occur after attribute set - - if (you.duration[DUR_ICY_ARMOUR]) - mpr( "Your new body merges with your icy armour." ); - - your_sign = 'I'; - your_colour = WHITE; - return (true); - - case TRAN_BLADE_HANDS: - rem_stuff[EQ_CLOAK] = 0; - rem_stuff[EQ_HELMET] = 0; - rem_stuff[EQ_BOOTS] = 0; - rem_stuff[EQ_BODY_ARMOUR] = 0; - - if (check_for_cursed_equipment( rem_stuff )) - return (false); - - mpr("Your hands turn into razor-sharp scythe blades."); - remove_equipment( rem_stuff ); - - you.attribute[ATTR_TRANSFORMATION] = TRAN_BLADE_HANDS; - you.duration[DUR_TRANSFORMATION] = 10 + random2(pow); - - if (you.duration[ DUR_TRANSFORMATION ] > 100) - you.duration[ DUR_TRANSFORMATION ] = 100; - return (true); - - case TRAN_STATUE: // also AC +20, ev -5, elec +1, pois +1, neg +1, slow - if (you.species == SP_GNOME && coinflip()) - mpr( "Look, a garden gnome. How cute!" ); - else if (player_genus(GENPC_DWARVEN) && one_chance_in(10)) - mpr( "You inwardly fear your resemblance to a lawn ornament." ); - else - mpr( "You turn into a living statue of rough stone." ); - - rem_stuff[ EQ_WEAPON ] = 0; /* can still hold a weapon */ - rem_stuff[ EQ_CLOAK ] = 0; - rem_stuff[ EQ_HELMET ] = 0; - rem_stuff[ EQ_BOOTS ] = 0; - // too stiff to make use of shields, gloves, or armour -- bwr - - remove_equipment( rem_stuff ); - - you.attribute[ATTR_TRANSFORMATION] = TRAN_STATUE; - you.duration[DUR_TRANSFORMATION] = 20 + random2(pow) + random2(pow); - - if (you.duration[ DUR_TRANSFORMATION ] > 100) - you.duration[ DUR_TRANSFORMATION ] = 100; - - modify_stat( STAT_DEXTERITY, -2, true ); - modify_stat( STAT_STRENGTH, 2, true ); - extra_hp(15); // must occur after attribute set - - if (you.duration[DUR_STONEMAIL] || you.duration[DUR_STONESKIN]) - mpr( "Your new body merges with your stone armour." ); - - your_sign = '8'; - your_colour = LIGHTGREY; - return (true); - - case TRAN_DRAGON: // also AC +10, ev -3, cold -1, fire +2, pois +1, flight - if (you.species == SP_MERFOLK && player_is_swimming()) - mpr("You fly out of the water as you turn into a fearsome dragon!"); - else - mpr("You turn into a fearsome dragon!"); - - remove_equipment(rem_stuff); - - you.attribute[ATTR_TRANSFORMATION] = TRAN_DRAGON; - you.duration[DUR_TRANSFORMATION] = 20 + random2(pow) + random2(pow); - - if (you.duration[ DUR_TRANSFORMATION ] > 100) - you.duration[ DUR_TRANSFORMATION ] = 100; - - modify_stat( STAT_STRENGTH, 10, true ); - extra_hp(16); // must occur after attribute set - - your_sign = 'D'; - your_colour = GREEN; - return (true); - - case TRAN_LICH: - // also AC +3, cold +1, neg +3, pois +1, is_undead, res magic +50, - // spec_death +1, and drain attack (if empty-handed) - if (you.deaths_door) - { - mpr( "The transformation conflicts with an enchantment " - "already in effect." ); - - return (false); - } - - mpr("Your body is suffused with negative energy!"); - - // undead cannot regenerate -- bwr - if (you.duration[DUR_REGENERATION]) - { - mpr( "You stop regenerating.", MSGCH_DURATION ); - you.duration[DUR_REGENERATION] = 0; - } - - // silently removed since undead automatically resist poison -- bwr - you.duration[DUR_RESIST_POISON] = 0; - - /* no remove_equip */ - you.attribute[ATTR_TRANSFORMATION] = TRAN_LICH; - you.duration[DUR_TRANSFORMATION] = 20 + random2(pow) + random2(pow); - - if (you.duration[ DUR_TRANSFORMATION ] > 100) - you.duration[ DUR_TRANSFORMATION ] = 100; - - modify_stat( STAT_STRENGTH, 3, true ); - your_sign = 'L'; - your_colour = LIGHTGREY; - you.is_undead = US_UNDEAD; - you.hunger_state = HS_SATIATED; // no hunger effects while transformed - set_redraw_status( REDRAW_HUNGER ); - return (true); - - case TRAN_AIR: - // also AC 20, ev +20, regen/2, no hunger, fire -2, cold -2, air +2, - // pois +1, spec_earth -1 - mpr( "You feel diffuse..." ); - - remove_equipment(rem_stuff); - - drop_everything(); - - you.attribute[ATTR_TRANSFORMATION] = TRAN_AIR; - you.duration[DUR_TRANSFORMATION] = 35 + random2(pow) + random2(pow); - - if (you.duration[ DUR_TRANSFORMATION ] > 150) - you.duration[ DUR_TRANSFORMATION ] = 150; - - modify_stat( STAT_DEXTERITY, 8, true ); - your_sign = '#'; - your_colour = DARKGREY; - return (true); - - case TRAN_SERPENT_OF_HELL: - // also AC +10, ev -5, fire +2, pois +1, life +2, slow - mpr( "You transform into a huge demonic serpent!" ); - - remove_equipment(rem_stuff); - - you.attribute[ATTR_TRANSFORMATION] = TRAN_SERPENT_OF_HELL; - you.duration[DUR_TRANSFORMATION] = 20 + random2(pow) + random2(pow); - - if (you.duration[ DUR_TRANSFORMATION ] > 120) - you.duration[ DUR_TRANSFORMATION ] = 120; - - modify_stat( STAT_STRENGTH, 13, true ); - extra_hp(17); // must occur after attribute set - - your_sign = 'S'; - your_colour = RED; - return (true); - } - - return (false); -} // end transform() - -void untransform(void) -{ - FixedVector < char, 8 > rem_stuff; - - for (int i = EQ_WEAPON; i < EQ_RIGHT_RING; i++) - rem_stuff[i] = 0; - - you.redraw_evasion = 1; - you.redraw_armour_class = 1; - you.wield_change = true; - - your_sign = '@'; - your_colour = LIGHTGREY; - - // must be unset first or else infinite loops might result -- bwr - const int old_form = you.attribute[ ATTR_TRANSFORMATION ]; - you.attribute[ ATTR_TRANSFORMATION ] = TRAN_NONE; - you.duration[ DUR_TRANSFORMATION ] = 0; - - switch (old_form) - { - case TRAN_SPIDER: - mpr("Your transformation has ended.", MSGCH_DURATION); - modify_stat( STAT_DEXTERITY, -5, true ); - break; - - case TRAN_BLADE_HANDS: - mpr( "Your hands revert to their normal proportions.", MSGCH_DURATION ); - you.wield_change = true; - break; - - case TRAN_STATUE: - mpr( "You revert to your normal fleshy form.", MSGCH_DURATION ); - modify_stat( STAT_DEXTERITY, 2, true ); - modify_stat( STAT_STRENGTH, -2, true ); - - // Note: if the core goes down, the combined effect soon disappears, - // but the reverse isn't true. -- bwr - if (you.duration[DUR_STONEMAIL]) - you.duration[DUR_STONEMAIL] = 1; - - if (you.duration[DUR_STONESKIN]) - you.duration[DUR_STONESKIN] = 1; - break; - - case TRAN_ICE_BEAST: - mpr( "You warm up again.", MSGCH_DURATION ); - - // Note: if the core goes down, the combined effect soon disappears, - // but the reverse isn't true. -- bwr - if (you.duration[DUR_ICY_ARMOUR]) - you.duration[DUR_ICY_ARMOUR] = 1; - break; - - case TRAN_DRAGON: - mpr( "Your transformation has ended.", MSGCH_DURATION ); - modify_stat(STAT_STRENGTH, -10, true); - - if (!player_is_levitating() - && (grd[you.x_pos][you.y_pos] == DNGN_LAVA - || grd[you.x_pos][you.y_pos] == DNGN_DEEP_WATER - || grd[you.x_pos][you.y_pos] == DNGN_SHALLOW_WATER)) - { - if (you.species == SP_MERFOLK - && grd[you.x_pos][you.y_pos] != DNGN_LAVA) - { - mpr("You dive into the water and return to your normal form."); - merfolk_start_swimming(); - } - - if (grd[you.x_pos][you.y_pos] != DNGN_SHALLOW_WATER) - fall_into_a_pool( true, grd[you.x_pos][you.y_pos] ); - } - break; - - case TRAN_LICH: - mpr( "You feel yourself come back to life.", MSGCH_DURATION ); - modify_stat(STAT_STRENGTH, -3, true); - you.is_undead = US_ALIVE; - break; - - case TRAN_AIR: - mpr( "Your body solidifies.", MSGCH_DURATION ); - modify_stat(STAT_DEXTERITY, -8, true); - break; - - case TRAN_SERPENT_OF_HELL: - mpr( "Your transformation has ended.", MSGCH_DURATION ); - modify_stat(STAT_STRENGTH, -13, true); - break; - } - - // If nagas wear boots while transformed, they fall off again afterwards: - // I don't believe this is currently possible, and if it is we - // probably need something better to cover all possibilities. -bwr - if ((you.species == SP_NAGA || you.species == SP_CENTAUR) - && you.equip[ EQ_BOOTS ] != -1 - && you.inv[ you.equip[EQ_BOOTS] ].sub_type != ARM_NAGA_BARDING) - { - rem_stuff[EQ_BOOTS] = 1; - remove_equipment(rem_stuff); - } - - calc_hp(); -} // end untransform() - -// XXX: This whole system is a mess as it still relies on special -// cases to handle a large number of things (see wear_armour()) -- bwr -bool can_equip( equipment_type use_which ) -{ - - // if more cases are added to this if must also change in - // item_use for naga barding - if (!player_is_shapechanged()) - /* or a transformation which doesn't change overall shape */ - { - if (use_which == EQ_BOOTS) - { - switch (you.species) - { - case SP_NAGA: - case SP_CENTAUR: - case SP_KENKU: - return (false); - default: - break; - } - } - else if (use_which == EQ_HELMET) - { - switch (you.species) - { - case SP_MINOTAUR: - case SP_KENKU: - return (false); - default: - break; - } - } - } - - if (use_which == EQ_HELMET && you.mutation[MUT_HORNS]) - return (false); - - if (use_which == EQ_BOOTS && you.mutation[MUT_HOOVES]) - return (false); - - if (use_which == EQ_GLOVES && you.mutation[MUT_CLAWS] >= 3) - return (false); - - switch (you.attribute[ATTR_TRANSFORMATION]) - { - case TRAN_NONE: - case TRAN_LICH: - return (true); - - case TRAN_BLADE_HANDS: - return (use_which != EQ_WEAPON - && use_which != EQ_GLOVES - && use_which != EQ_SHIELD); - - case TRAN_STATUE: - return (use_which == EQ_WEAPON - || use_which == EQ_CLOAK - || use_which == EQ_HELMET); - - case TRAN_ICE_BEAST: - return (use_which == EQ_CLOAK); - - default: - return (false); - } - - return (true); -} // end can_equip() - -// raw comparison of an item, must use check_armour_shape for full version -bool transform_can_equip_type( int eq_slot ) -{ - // FIXME FIXME FIXME - return (false); - - // const int form = you.attribute[ATTR_TRANSFORMATION]; - // return (!must_remove( Trans[form].rem_stuff, eq_slot )); -} - -void extra_hp(int amount_extra) // must also set in calc_hp -{ - calc_hp(); - - you.hp *= amount_extra; - you.hp /= 10; - - deflate_hp(you.hp_max, false); -} // end extra_hp() - -void drop_everything(void) -{ - int i = 0; - - if (inv_count() < 1) - return; - - mpr( "You find yourself unable to carry your possessions!" ); - - for (i = 0; i < ENDOFPACK; i++) - { - if (is_valid_item( you.inv[i] )) - { - copy_item_to_grid( you.inv[i], you.x_pos, you.y_pos ); - you.inv[i].quantity = 0; - } - } - - return; -} // end drop_everything() - -// Used to mark transformations which override species/mutation intrinsics. -// If phys_scales is true then we're checking to see if the form keeps -// the physical (AC/EV) properties from scales... the special intrinsic -// features (resistances, etc) are lost in those forms however. -bool transform_changed_physiology( bool phys_scales ) -{ - return (you.attribute[ATTR_TRANSFORMATION] != TRAN_NONE - && you.attribute[ATTR_TRANSFORMATION] != TRAN_BLADE_HANDS - && (!phys_scales - || (you.attribute[ATTR_TRANSFORMATION] != TRAN_LICH - && you.attribute[ATTR_TRANSFORMATION] != TRAN_STATUE))); -} |