diff options
Diffstat (limited to 'stone_soup/crawl-ref/source/misc.cc')
-rw-r--r-- | stone_soup/crawl-ref/source/misc.cc | 1962 |
1 files changed, 0 insertions, 1962 deletions
diff --git a/stone_soup/crawl-ref/source/misc.cc b/stone_soup/crawl-ref/source/misc.cc deleted file mode 100644 index 4fd3083df2..0000000000 --- a/stone_soup/crawl-ref/source/misc.cc +++ /dev/null @@ -1,1962 +0,0 @@ -/* - * File: misc.cc - * Summary: Misc functions. - * Written by: Linley Henzell - * - * Change History (most recent first): - * - * <3> 11/14/99 cdl evade with random40(ev) vice random2(ev) - * <2> 5/20/99 BWR Multi-user support, new berserk code. - * <1> -/--/-- LRH Created - */ - - -#include "AppHdr.h" -#include "misc.h" - -#include <string.h> -#if !(defined(__IBMCPP__) || defined(__BCPLUSPLUS__)) -#include <unistd.h> -#endif - -#ifdef __MINGW32__ -#include <io.h> -#endif - -#include <stdlib.h> -#include <stdio.h> - -#ifdef DOS -#include <conio.h> -#endif - -#include "externs.h" - -#include "cloud.h" -#include "delay.h" -#include "fight.h" -#include "files.h" -#include "food.h" -#include "it_use2.h" -#include "items.h" -#include "itemname.h" -#include "lev-pand.h" -#include "macro.h" -#include "monplace.h" -#include "mon-util.h" -#include "monstuff.h" -#include "ouch.h" -#include "player.h" -#include "shopping.h" -#include "skills.h" -#include "skills2.h" -#include "spells3.h" -#include "spl-cast.h" -#include "stuff.h" -#include "transfor.h" -#include "travel.h" -#include "view.h" - - -bool scramble(void); -bool trap_item(char base_type, char sub_type, char beam_x, char beam_y); -static void dart_trap(bool trap_known, int trapped, struct bolt &pbolt, bool poison); - -// void place_chunks(int mcls, unsigned char rot_status, unsigned char chx, -// unsigned char chy, unsigned char ch_col) -void turn_corpse_into_chunks( item_def &item ) -{ - const int mons_class = item.plus; - const int max_chunks = mons_weight( mons_class ) / 150; - - ASSERT( item.base_type == OBJ_CORPSES ); - - item.base_type = OBJ_FOOD; - item.sub_type = FOOD_CHUNK; - item.quantity = 1 + random2( max_chunks ); - - item.quantity = stepdown_value( item.quantity, 4, 4, 12, 12 ); - - // seems to me that this should come about only - // after the corpse has been butchered ... {dlb} - if (monster_descriptor( mons_class, MDSC_LEAVES_HIDE ) && !one_chance_in(3)) - { - int o = get_item_slot( 100 + random2(200) ); - if (o == NON_ITEM) - return; - - mitm[o].quantity = 1; - - // these values are common to all: {dlb} - mitm[o].base_type = OBJ_ARMOUR; - mitm[o].plus = 0; - mitm[o].plus2 = 0; - mitm[o].special = 0; - mitm[o].flags = 0; - mitm[o].colour = mons_colour( mons_class ); - - // these values cannot be set by a reasonable formula: {dlb} - switch (mons_class) - { - case MONS_DRAGON: - mitm[o].sub_type = ARM_DRAGON_HIDE; - break; - case MONS_TROLL: - mitm[o].sub_type = ARM_TROLL_HIDE; - break; - case MONS_ICE_DRAGON: - mitm[o].sub_type = ARM_ICE_DRAGON_HIDE; - break; - case MONS_STEAM_DRAGON: - mitm[o].sub_type = ARM_STEAM_DRAGON_HIDE; - break; - case MONS_MOTTLED_DRAGON: - mitm[o].sub_type = ARM_MOTTLED_DRAGON_HIDE; - break; - case MONS_STORM_DRAGON: - mitm[o].sub_type = ARM_STORM_DRAGON_HIDE; - break; - case MONS_GOLDEN_DRAGON: - mitm[o].sub_type = ARM_GOLD_DRAGON_HIDE; - break; - case MONS_SWAMP_DRAGON: - mitm[o].sub_type = ARM_SWAMP_DRAGON_HIDE; - break; - default: - // future implementation {dlb} - mitm[o].sub_type = ARM_ANIMAL_SKIN; - break; - } - - move_item_to_grid( &o, item.x, item.y ); - } -} // end place_chunks() - -bool grid_is_opaque( int grid ) -{ - return (grid < MINSEE && grid != DNGN_ORCISH_IDOL); -} - -bool grid_is_solid( int grid ) -{ - return (grid < MINMOVE); -} - -bool grid_is_water( int grid ) -{ - return (grid == DNGN_SHALLOW_WATER || grid == DNGN_DEEP_WATER); -} - -bool grid_destroys_items( int grid ) -{ - return (grid == DNGN_LAVA || grid == DNGN_DEEP_WATER); -} - -const char *grid_item_destruction_message( unsigned char grid ) -{ - return grid == DNGN_DEEP_WATER? "You hear a splash." - : grid == DNGN_LAVA ? "You hear a sizzling splash." - : "You hear an empty echo."; -} - -void search_around(void) -{ - char srx = 0; - char sry = 0; - int i; - - // Never if doing something else... this prevents a slight asymetry - // where using autopickup was giving free searches in comparison to - // not using autopickup. -- bwr - if (you_are_delayed()) - return; - - for (srx = you.x_pos - 1; srx < you.x_pos + 2; srx++) - { - for (sry = you.y_pos - 1; sry < you.y_pos + 2; sry++) - { - // don't exclude own square; may be levitating - if (grd[srx][sry] == DNGN_SECRET_DOOR - && random2(17) <= 1 + you.skills[SK_TRAPS_DOORS]) - { - grd[srx][sry] = DNGN_CLOSED_DOOR; - mpr("You found a secret door!"); - exercise(SK_TRAPS_DOORS, ((coinflip())? 2 : 1)); - } - - if (grd[srx][sry] == DNGN_UNDISCOVERED_TRAP - && random2(17) <= 1 + you.skills[SK_TRAPS_DOORS]) - { - i = trap_at_xy(srx, sry); - - if (i != -1) - grd[srx][sry] = trap_category(env.trap[i].type); - - mpr("You found a trap!"); - } - } - } - - return; -} // end search_around() - -void in_a_cloud(void) -{ - int cl = env.cgrid[you.x_pos][you.y_pos]; - int hurted = 0; - int resist; - - if (you.duration[DUR_CONDENSATION_SHIELD] > 0) - { - mpr("Your icy shield dissipates!", MSGCH_DURATION); - you.duration[DUR_CONDENSATION_SHIELD] = 0; - you.redraw_armour_class = 1; - } - - switch (env.cloud[cl].type) - { - case CLOUD_FIRE: - case CLOUD_FIRE_MON: - if (you.fire_shield) - return; - - mpr("You are engulfed in roaring flames!"); - - resist = player_res_fire(); - - if (resist <= 0) - { - hurted += ((random2avg(23, 3) + 10) * you.time_taken) / 10; - - if (resist < 0) - hurted += ((random2avg(14, 2) + 3) * you.time_taken) / 10; - - hurted -= random2(player_AC()); - - if (hurted < 1) - hurted = 0; - else - ouch( hurted, cl, KILLED_BY_CLOUD, "flame" ); - } - else - { - canned_msg(MSG_YOU_RESIST); - hurted += ((random2avg(23, 3) + 10) * you.time_taken) / 10; - hurted /= (1 + resist * resist); - ouch( hurted, cl, KILLED_BY_CLOUD, "flame" ); - } - scrolls_burn(7, OBJ_SCROLLS); - break; - - case CLOUD_STINK: - case CLOUD_STINK_MON: - // If you don't have to breathe, unaffected - mpr("You are engulfed in noxious fumes!"); - if (player_res_poison()) - break; - - hurted += (random2(3) * you.time_taken) / 10; - if (hurted < 1) - hurted = 0; - else - ouch( (hurted * you.time_taken) / 10, cl, KILLED_BY_CLOUD, - "noxious fumes" ); - - if (1 + random2(27) >= you.experience_level) - { - mpr("You choke on the stench!"); - confuse_player( (coinflip() ? 3 : 2) ); - } - break; - - case CLOUD_COLD: - case CLOUD_COLD_MON: - mpr("You are engulfed in freezing vapours!"); - - resist = player_res_cold(); - - if (resist <= 0) - { - hurted += ((random2avg(23, 3) + 10) * you.time_taken) / 10; - - if (resist < 0) - hurted += ((random2avg(14, 2) + 3) * you.time_taken) / 10; - - hurted -= random2(player_AC()); - if (hurted < 0) - hurted = 0; - - ouch( (hurted * you.time_taken) / 10, cl, KILLED_BY_CLOUD, - "freezing vapour" ); - } - else - { - canned_msg(MSG_YOU_RESIST); - hurted += ((random2avg(23, 3) + 10) * you.time_taken) / 10; - hurted /= (1 + resist * resist); - ouch( hurted, cl, KILLED_BY_CLOUD, "freezing vapour" ); - } - scrolls_burn(7, OBJ_POTIONS); - break; - - case CLOUD_POISON: - case CLOUD_POISON_MON: - // If you don't have to breathe, unaffected - mpr("You are engulfed in poison gas!"); - if (!player_res_poison()) - { - ouch( (random2(10) * you.time_taken) / 10, cl, KILLED_BY_CLOUD, - "poison gas" ); - poison_player(1); - } - break; - - case CLOUD_GREY_SMOKE: - case CLOUD_BLUE_SMOKE: - case CLOUD_PURP_SMOKE: - case CLOUD_BLACK_SMOKE: - case CLOUD_GREY_SMOKE_MON: - case CLOUD_BLUE_SMOKE_MON: - case CLOUD_PURP_SMOKE_MON: - case CLOUD_BLACK_SMOKE_MON: - mpr("You are engulfed in a cloud of smoke!"); - break; - - case CLOUD_STEAM: - case CLOUD_STEAM_MON: - mpr("You are engulfed in a cloud of scalding steam!"); - if (you.species == SP_PALE_DRACONIAN && you.experience_level > 5) - { - mpr("It doesn't seem to affect you."); - return; - } - - if (player_equip( EQ_BODY_ARMOUR, ARM_STEAM_DRAGON_ARMOUR )) - { - mpr("It doesn't seem to affect you."); - return; - } - - hurted += (random2(6) * you.time_taken) / 10; - if (hurted < 0 || player_res_fire() > 0) - hurted = 0; - - ouch( (hurted * you.time_taken) / 10, cl, KILLED_BY_CLOUD, "poison gas" ); - break; - - case CLOUD_MIASMA: - case CLOUD_MIASMA_MON: - mpr("You are engulfed in a dark miasma."); - - if (player_prot_life() > random2(3)) - return; - - poison_player(1); - - hurted += (random2avg(12, 3) * you.time_taken) / 10; // 3 - - if (hurted < 0) - hurted = 0; - - ouch( hurted, cl, KILLED_BY_CLOUD, "foul pestilence" ); - potion_effect(POT_SLOWING, 5); - - if (you.hp_max > 4 && coinflip()) - rot_hp(1); - - break; - } - - return; -} // end in_a_cloud() - -void curare_hits_player(int agent, int degree) -{ - const bool res_poison = player_res_poison(); - - poison_player(degree); - - if (!player_res_asphyx()) - { - int hurted = roll_dice(2, 6); - // Note that the hurtage is halved by poison resistance. - if (res_poison) - hurted /= 2; - - if (hurted) - { - mpr("You feel difficulty breathing."); - ouch( hurted, agent, KILLED_BY_CURARE, "curare-induced apnoea" ); - } - potion_effect(POT_SLOWING, 2 + random2(4 + degree)); - } -} - -void merfolk_start_swimming(void) -{ - FixedVector < char, 8 > removed; - - if (you.attribute[ATTR_TRANSFORMATION] != TRAN_NONE) - untransform(); - - for (int i = EQ_WEAPON; i < EQ_RIGHT_RING; i++) - { - removed[i] = 0; - } - - if (you.equip[EQ_BOOTS] != -1) - removed[EQ_BOOTS] = 1; - - // 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()) - { - // Can't slide out of just the body armour, cloak comes off -- bwr - if (you.equip[EQ_CLOAK]) - removed[EQ_CLOAK] = 1; - - removed[EQ_BODY_ARMOUR] = 1; - } - - remove_equipment(removed); -} - -void up_stairs(void) -{ - unsigned char stair_find = grd[you.x_pos][you.y_pos]; - char old_where = you.where_are_you; - bool was_a_labyrinth = false; - - if (stair_find == DNGN_ENTER_SHOP) - { - shop(); - return; - } - - // probably still need this check here (teleportation) -- bwr - if ((stair_find < DNGN_STONE_STAIRS_UP_I - || stair_find > DNGN_ROCK_STAIRS_UP) - && (stair_find < DNGN_RETURN_FROM_ORCISH_MINES || stair_find >= 150)) - { - mpr("You can't go up here."); - return; - } - - // Since the overloaded message set turn_is_over, I'm assuming that - // the overloaded character makes an attempt... so we're doing this - // check before that one. -- bwr - if (!player_is_levitating() - && you.conf - && (stair_find >= DNGN_STONE_STAIRS_UP_I - && stair_find <= DNGN_ROCK_STAIRS_UP) - && random2(100) > you.dex) - { - mpr("In your confused state, you trip and fall back down the stairs."); - - ouch( roll_dice( 3 + you.burden_state, 5 ), 0, - KILLED_BY_FALLING_DOWN_STAIRS ); - - you.turn_is_over = 1; - return; - } - - if (you.burden_state == BS_OVERLOADED) - { - mpr("You are carrying too much to climb upwards."); - you.turn_is_over = 1; - return; - } - - if (you.your_level == 0 - && !yesno("Are you sure you want to leave the Dungeon?", false, 'n')) - { - mpr("Alright, then stay!"); - return; - } - - unsigned char old_level = you.your_level; - - // Interlevel travel data: - bool collect_travel_data = you.level_type != LEVEL_LABYRINTH - && you.level_type != LEVEL_ABYSS - && you.level_type != LEVEL_PANDEMONIUM; - - level_id old_level_id = level_id::get_current_level_id(); - LevelInfo &old_level_info = travel_cache.get_level_info(old_level_id); - int stair_x = you.x_pos, stair_y = you.y_pos; - if (collect_travel_data) - old_level_info.update(); - - // Make sure we return to our main dungeon level... labyrinth entrances - // in the abyss or pandemonium a bit trouble (well the labyrinth does - // provide a way out of those places, its really not that bad I suppose) - if (you.level_type == LEVEL_LABYRINTH) - { - you.level_type = LEVEL_DUNGEON; - was_a_labyrinth = true; - } - - you.your_level--; - - int i = 0; - - if (you.your_level < 0) - { - mpr("You have escaped!"); - - for (i = 0; i < ENDOFPACK; i++) - { - if (is_valid_item( you.inv[i] ) - && you.inv[i].base_type == OBJ_ORBS) - { - ouch(-9999, 0, KILLED_BY_WINNING); - } - } - - ouch(-9999, 0, KILLED_BY_LEAVING); - } - - mpr("Entering..."); - you.prev_targ = MHITNOT; - you.pet_target = MHITNOT; - - if (player_in_branch( BRANCH_VESTIBULE_OF_HELL )) - { - mpr("Thank you for visiting Hell. Please come again soon."); - you.where_are_you = BRANCH_MAIN_DUNGEON; - you.your_level = you.hell_exit; - stair_find = DNGN_STONE_STAIRS_UP_I; - } - - if (player_in_hell()) - { - you.where_are_you = BRANCH_VESTIBULE_OF_HELL; - you.your_level = 27; - } - - switch (stair_find) - { - case DNGN_RETURN_FROM_ORCISH_MINES: - case DNGN_RETURN_FROM_HIVE: - case DNGN_RETURN_FROM_LAIR: - case DNGN_RETURN_FROM_VAULTS: - case DNGN_RETURN_FROM_TEMPLE: - case DNGN_RETURN_FROM_ZOT: - mpr("Welcome back to the Dungeon!"); - you.where_are_you = BRANCH_MAIN_DUNGEON; - break; - case DNGN_RETURN_FROM_SLIME_PITS: - case DNGN_RETURN_FROM_SNAKE_PIT: - case DNGN_RETURN_FROM_SWAMP: - mpr("Welcome back to the Lair of Beasts!"); - you.where_are_you = BRANCH_LAIR; - break; - case DNGN_RETURN_FROM_CRYPT: - case DNGN_RETURN_FROM_HALL_OF_BLADES: - mpr("Welcome back to the Vaults!"); - you.where_are_you = BRANCH_VAULTS; - break; - case DNGN_RETURN_FROM_TOMB: - mpr("Welcome back to the Crypt!"); - you.where_are_you = BRANCH_CRYPT; - break; - case DNGN_RETURN_FROM_ELVEN_HALLS: - mpr("Welcome back to the Orcish Mines!"); - you.where_are_you = BRANCH_ORCISH_MINES; - break; - } - - unsigned char stair_taken = stair_find; - - if (player_is_levitating()) - { - if (you.duration[DUR_CONTROLLED_FLIGHT]) - mpr("You fly upwards."); - else - mpr("You float upwards... And bob straight up to the ceiling!"); - } - else - mpr("You climb upwards."); - - load(stair_taken, LOAD_ENTER_LEVEL, was_a_labyrinth, old_level, old_where); - - you.turn_is_over = 1; - - save_game(false); - - new_level(); - - viewwindow(1, true); - - if (you.skills[SK_TRANSLOCATIONS] > 0 && !allow_control_teleport( true )) - mpr( "You sense a powerful magical force warping space.", MSGCH_WARN ); - - // Tell the travel code that we're now on a new level - travel_init_new_level(); - if (collect_travel_data) - { - // Update stair information for the stairs we just ascended, and the - // down stairs we're currently on. - level_id new_level_id = level_id::get_current_level_id(); - - if (you.level_type != LEVEL_PANDEMONIUM && - you.level_type != LEVEL_ABYSS && - you.level_type != LEVEL_LABYRINTH) - { - LevelInfo &new_level_info = - travel_cache.get_level_info(new_level_id); - new_level_info.update(); - - // First we update the old level's stair. - level_pos lp; - lp.id = new_level_id; - lp.pos.x = you.x_pos; - lp.pos.y = you.y_pos; - - bool guess = false; - // Ugly hack warning: - // The stairs in the Vestibule of Hell exhibit special behaviour: - // they always lead back to the dungeon level that the player - // entered the Vestibule from. This means that we need to pretend - // we don't know where the upstairs from the Vestibule go each time - // we take it. If we don't, interlevel travel may try to use portals - // to Hell as shortcuts between dungeon levels, which won't work, - // and will confuse the dickens out of the player (well, it confused - // the dickens out of me when it happened). - if (new_level_id.branch == BRANCH_MAIN_DUNGEON && - old_level_id.branch == BRANCH_VESTIBULE_OF_HELL) - { - lp.id.depth = -1; - lp.pos.x = lp.pos.y = -1; - guess = true; - } - - old_level_info.update_stair(stair_x, stair_y, lp, guess); - - // We *guess* that going up a staircase lands us on a downstair, - // and that we can descend that downstair and get back to where we - // came from. This assumption is guaranteed false when climbing out - // of one of the branches of Hell. - if (new_level_id.branch != BRANCH_VESTIBULE_OF_HELL) - { - // Set the new level's stair, assuming arbitrarily that going - // downstairs will land you on the same upstairs you took to - // begin with (not necessarily true). - lp.id = old_level_id; - lp.pos.x = stair_x; - lp.pos.y = stair_y; - new_level_info.update_stair(you.x_pos, you.y_pos, lp, true); - } - } - } -} // end up_stairs() - -void down_stairs( bool remove_stairs, int old_level, bool force ) -{ - int i; - char old_level_type = you.level_type; - bool was_a_labyrinth = false; - const unsigned char stair_find = grd[you.x_pos][you.y_pos]; - - //int old_level = you.your_level; - bool leave_abyss_pan = false; - char old_where = you.where_are_you; - -#ifdef SHUT_LABYRINTH - if (stair_find == DNGN_ENTER_LABYRINTH) - { - mpr("Sorry, this section of the dungeon is closed for fumigation."); - mpr("Try again next release."); - return; - } -#endif - - // probably still need this check here (teleportation) -- bwr - if ((stair_find < DNGN_ENTER_LABYRINTH - || stair_find > DNGN_ROCK_STAIRS_DOWN) - && stair_find != DNGN_ENTER_HELL - && ((stair_find < DNGN_ENTER_DIS - || stair_find > DNGN_TRANSIT_PANDEMONIUM) - && stair_find != DNGN_STONE_ARCH) - && !(stair_find >= DNGN_ENTER_ORCISH_MINES - && stair_find < DNGN_RETURN_FROM_ORCISH_MINES)) - { - mpr( "You can't go down here!" ); - return; - } - - if (stair_find >= DNGN_ENTER_LABYRINTH - && stair_find <= DNGN_ROCK_STAIRS_DOWN - && player_in_branch( BRANCH_VESTIBULE_OF_HELL )) - { - mpr("A mysterious force prevents you from descending the staircase."); - return; - } /* down stairs in vestibule are one-way */ - - if (stair_find == DNGN_STONE_ARCH) - { - mpr("You can't go down here!"); - return; - } - - if (!force && player_is_levitating() - && !wearing_amulet(AMU_CONTROLLED_FLIGHT)) - { - mpr("You're floating high up above the floor!"); - return; - } - - if (stair_find == DNGN_ENTER_ZOT) - { - int num_runes = 0; - - for (i = 0; i < ENDOFPACK; i++) - { - if (is_valid_item( you.inv[i] ) - && you.inv[i].base_type == OBJ_MISCELLANY - && you.inv[i].sub_type == MISC_RUNE_OF_ZOT) - { - num_runes += you.inv[i].quantity; - } - } - - if (num_runes < NUMBER_OF_RUNES_NEEDED) - { - switch (NUMBER_OF_RUNES_NEEDED) - { - case 1: - mpr("You need a Rune to enter this place."); - break; - - default: - snprintf( info, INFO_SIZE, - "You need at least %d Runes to enter this place.", - NUMBER_OF_RUNES_NEEDED ); - - mpr(info); - } - return; - } - } - - // Interlevel travel data: - bool collect_travel_data = you.level_type != LEVEL_LABYRINTH - && you.level_type != LEVEL_ABYSS - && you.level_type != LEVEL_PANDEMONIUM; - - level_id old_level_id = level_id::get_current_level_id(); - LevelInfo &old_level_info = travel_cache.get_level_info(old_level_id); - int stair_x = you.x_pos, stair_y = you.y_pos; - if (collect_travel_data) - old_level_info.update(); - - - if (you.level_type == LEVEL_PANDEMONIUM - && stair_find == DNGN_TRANSIT_PANDEMONIUM) - { - was_a_labyrinth = true; - } - else - { - if (you.level_type != LEVEL_DUNGEON) - was_a_labyrinth = true; - - you.level_type = LEVEL_DUNGEON; - } - - mpr("Entering..."); - you.prev_targ = MHITNOT; - you.pet_target = MHITNOT; - - if (stair_find == DNGN_ENTER_HELL) - { - you.where_are_you = BRANCH_VESTIBULE_OF_HELL; - you.hell_exit = you.your_level; - - mpr("Welcome to Hell!"); - mpr("Please enjoy your stay."); - - // Kill -more- prompt if we're traveling. - if (!you.running) - more(); - - you.your_level = 26; // = 59; - } - - if ((stair_find >= DNGN_ENTER_DIS - && stair_find <= DNGN_ENTER_TARTARUS) - || (stair_find >= DNGN_ENTER_ORCISH_MINES - && stair_find < DNGN_RETURN_FROM_ORCISH_MINES)) - { - // no idea why such a huge switch and not 100-grd[][] - // planning ahead for re-organizaing grd[][] values - 13jan2000 {dlb} - strcpy( info, "Welcome to " ); - switch (stair_find) - { - case DNGN_ENTER_DIS: - strcat(info, "the Iron City of Dis!"); - you.where_are_you = BRANCH_DIS; - you.your_level = 26; - break; - case DNGN_ENTER_GEHENNA: - strcat(info, "Gehenna!"); - you.where_are_you = BRANCH_GEHENNA; - you.your_level = 26; - break; - case DNGN_ENTER_COCYTUS: - strcat(info, "Cocytus!"); - you.where_are_you = BRANCH_COCYTUS; - you.your_level = 26; - break; - case DNGN_ENTER_TARTARUS: - strcat(info, "Tartarus!"); - you.where_are_you = BRANCH_TARTARUS; - you.your_level = 26; - break; - case DNGN_ENTER_ORCISH_MINES: - strcat(info, "the Orcish Mines!"); - you.where_are_you = BRANCH_ORCISH_MINES; - break; - case DNGN_ENTER_HIVE: - strcpy(info, "You hear a buzzing sound coming from all directions."); - you.where_are_you = BRANCH_HIVE; - break; - case DNGN_ENTER_LAIR: - strcat(info, "the Lair of Beasts!"); - you.where_are_you = BRANCH_LAIR; - break; - case DNGN_ENTER_SLIME_PITS: - strcat(info, "the Pits of Slime!"); - you.where_are_you = BRANCH_SLIME_PITS; - break; - case DNGN_ENTER_VAULTS: - strcat(info, "the Vaults!"); - you.where_are_you = BRANCH_VAULTS; - break; - case DNGN_ENTER_CRYPT: - strcat(info, "the Crypt!"); - you.where_are_you = BRANCH_CRYPT; - break; - case DNGN_ENTER_HALL_OF_BLADES: - strcat(info, "the Hall of Blades!"); - you.where_are_you = BRANCH_HALL_OF_BLADES; - break; - case DNGN_ENTER_ZOT: - strcat(info, "the Hall of Zot!"); - you.where_are_you = BRANCH_HALL_OF_ZOT; - break; - case DNGN_ENTER_TEMPLE: - strcat(info, "the Ecumenical Temple!"); - you.where_are_you = BRANCH_ECUMENICAL_TEMPLE; - break; - case DNGN_ENTER_SNAKE_PIT: - strcat(info, "the Snake Pit!"); - you.where_are_you = BRANCH_SNAKE_PIT; - break; - case DNGN_ENTER_ELVEN_HALLS: - strcat(info, "the Elven Halls!"); - you.where_are_you = BRANCH_ELVEN_HALLS; - break; - case DNGN_ENTER_TOMB: - strcat(info, "the Tomb!"); - you.where_are_you = BRANCH_TOMB; - break; - case DNGN_ENTER_SWAMP: - strcat(info, "the Swamp!"); - you.where_are_you = BRANCH_SWAMP; - break; - } - - mpr(info); - } - else if (stair_find == DNGN_ENTER_LABYRINTH) - { - you.level_type = LEVEL_LABYRINTH; - grd[you.x_pos][you.y_pos] = DNGN_FLOOR; - } - else if (stair_find == DNGN_ENTER_ABYSS) - { - you.level_type = LEVEL_ABYSS; - } - else if (stair_find == DNGN_ENTER_PANDEMONIUM) - { - you.level_type = LEVEL_PANDEMONIUM; - } - - if (you.level_type == LEVEL_LABYRINTH || you.level_type == LEVEL_ABYSS - || you.level_type == LEVEL_PANDEMONIUM) - { - char glorpstr[kFileNameSize]; - char del_file[kFileNameSize]; - int sysg; - -#ifdef SAVE_DIR_PATH - snprintf( glorpstr, sizeof(glorpstr), - SAVE_DIR_PATH "%s%d", you.your_name, (int) getuid() ); -#else - strncpy(glorpstr, you.your_name, kFileNameLen); - - // glorpstr [strlen(glorpstr)] = 0; - // This is broken. Length is not valid yet! We have to check if we got - // a trailing NULL; if not, write one: - /* is name 6 chars or more? */ - if (strlen(you.your_name) > kFileNameLen - 1) - glorpstr[kFileNameLen] = '\0'; -#endif - - strcpy(del_file, glorpstr); - strcat(del_file, ".lab"); - -#ifdef DOS - strupr(del_file); -#endif - sysg = unlink(del_file); - -#if DEBUG_DIAGNOSTICS - strcpy( info, "Deleting: " ); - strcat( info, del_file ); - mpr( info, MSGCH_DIAGNOSTICS ); - more(); -#endif - } - - if (stair_find == DNGN_EXIT_ABYSS || stair_find == DNGN_EXIT_PANDEMONIUM) - { - leave_abyss_pan = true; - mpr("You pass through the gate, and find yourself at the top of a staircase."); - more(); - } - - if (!player_is_levitating() - && you.conf - && (stair_find >= DNGN_STONE_STAIRS_DOWN_I - && stair_find <= DNGN_ROCK_STAIRS_DOWN) - && random2(100) > you.dex) - { - mpr("In your confused state, you trip and fall down the stairs."); - - // Nastier than when climbing stairs, but you'll aways get to - // your destination, -- bwr - ouch( roll_dice( 6 + you.burden_state, 10 ), 0, - KILLED_BY_FALLING_DOWN_STAIRS ); - } - - if (you.level_type == LEVEL_DUNGEON) - you.your_level++; - - int stair_taken = stair_find; - - //unsigned char save_old = 1; - - if (you.level_type == LEVEL_LABYRINTH || you.level_type == LEVEL_ABYSS) - stair_taken = DNGN_FLOOR; //81; - - if (you.level_type == LEVEL_PANDEMONIUM) - stair_taken = DNGN_TRANSIT_PANDEMONIUM; - - if (remove_stairs) - grd[you.x_pos][you.y_pos] = DNGN_FLOOR; - - switch (you.level_type) - { - case LEVEL_LABYRINTH: - mpr("You enter a dark and forbidding labyrinth."); - break; - - case LEVEL_ABYSS: - mpr("You enter the Abyss!"); - mpr("To return, you must find a gate leading back."); - break; - - case LEVEL_PANDEMONIUM: - if (old_level_type == LEVEL_PANDEMONIUM) - mpr("You pass into a different region of Pandemonium."); - else - { - mpr("You enter the halls of Pandemonium!"); - mpr("To return, you must find a gate leading back."); - } - break; - - default: - mpr("You climb downwards."); - break; - } - - load(stair_taken, LOAD_ENTER_LEVEL, was_a_labyrinth, old_level, old_where); - - unsigned char pc = 0; - unsigned char pt = random2avg(28, 3); - - switch (you.level_type) - { - case LEVEL_LABYRINTH: - you.your_level++; - break; - - case LEVEL_ABYSS: - grd[you.x_pos][you.y_pos] = DNGN_FLOOR; - - if (old_level_type != LEVEL_PANDEMONIUM) - you.your_level--; // Linley-suggested addition 17jan2000 {dlb} - - init_pandemonium(); /* colours only */ - - if (player_in_hell()) - { - you.where_are_you = BRANCH_MAIN_DUNGEON; - you.your_level = you.hell_exit - 1; - } - break; - - case LEVEL_PANDEMONIUM: - if (old_level_type == LEVEL_PANDEMONIUM) - { - init_pandemonium(); - for (pc = 0; pc < pt; pc++) - pandemonium_mons(); - } - else - { - // Linley-suggested addition 17jan2000 {dlb} - if (old_level_type != LEVEL_ABYSS) - you.your_level--; - - init_pandemonium(); - - for (pc = 0; pc < pt; pc++) - pandemonium_mons(); - - if (player_in_hell()) - { - you.where_are_you = BRANCH_MAIN_DUNGEON; - you.hell_exit = 26; - you.your_level = 26; - } - } - break; - - default: - break; - } - - you.turn_is_over = 1; - - save_game(false); - - new_level(); - - viewwindow(1, true); - - if (you.skills[SK_TRANSLOCATIONS] > 0 && !allow_control_teleport( true )) - mpr( "You sense a powerful magical force warping space.", MSGCH_WARN ); - - travel_init_new_level(); - if (collect_travel_data) - { - // Update stair information for the stairs we just descended, and the - // upstairs we're currently on. - level_id new_level_id = level_id::get_current_level_id(); - - if (you.level_type != LEVEL_PANDEMONIUM && - you.level_type != LEVEL_ABYSS && - you.level_type != LEVEL_LABYRINTH) - { - LevelInfo &new_level_info = - travel_cache.get_level_info(new_level_id); - new_level_info.update(); - - // First we update the old level's stair. - level_pos lp; - lp.id = new_level_id; - lp.pos.x = you.x_pos; - lp.pos.y = you.y_pos; - - old_level_info.update_stair(stair_x, stair_y, lp); - - // Then the new level's stair, assuming arbitrarily that going - // upstairs will land you on the same downstairs you took to begin - // with (not necessarily true). - lp.id = old_level_id; - lp.pos.x = stair_x; - lp.pos.y = stair_y; - new_level_info.update_stair(you.x_pos, you.y_pos, lp, true); - } - } -} // end down_stairs() - -void new_level(void) -{ - int curr_subdungeon_level = you.your_level + 1; - - textcolor(LIGHTGREY); - - // maybe last part better expresssed as <= PIT {dlb} - if (player_in_hell() || player_in_branch( BRANCH_VESTIBULE_OF_HELL )) - curr_subdungeon_level = you.your_level - 26; - - /* Remember, must add this to the death_string in ouch */ - if (you.where_are_you >= BRANCH_ORCISH_MINES - && you.where_are_you <= BRANCH_SWAMP) - { - curr_subdungeon_level = you.your_level - - you.branch_stairs[you.where_are_you - 10]; - } - - gotoxy(46, 12); - -#if DEBUG_DIAGNOSTICS - cprintf( "(%d) ", you.your_level + 1 ); -#endif - - env.floor_colour = LIGHTGREY; - env.rock_colour = BROWN; - - if (you.level_type == LEVEL_PANDEMONIUM) - { - cprintf("- Pandemonium "); - - env.floor_colour = (mcolour[env.mons_alloc[9]] == BLACK) - ? LIGHTGREY : mcolour[env.mons_alloc[9]]; - - env.rock_colour = (mcolour[env.mons_alloc[8]] == BLACK) - ? LIGHTGREY : mcolour[env.mons_alloc[8]]; - } - else if (you.level_type == LEVEL_ABYSS) - { - cprintf("- The Abyss "); - - env.floor_colour = (mcolour[env.mons_alloc[9]] == BLACK) - ? LIGHTGREY : mcolour[env.mons_alloc[9]]; - - env.rock_colour = (mcolour[env.mons_alloc[8]] == BLACK) - ? LIGHTGREY : mcolour[env.mons_alloc[8]]; - } - else if (you.level_type == LEVEL_LABYRINTH) - { - cprintf("- a Labyrinth "); - } - else - { - // level_type == LEVEL_DUNGEON - if (!player_in_branch( BRANCH_VESTIBULE_OF_HELL )) - cprintf( "%d", curr_subdungeon_level ); - - switch (you.where_are_you) - { - case BRANCH_MAIN_DUNGEON: - cprintf(" of the Dungeon "); - break; - case BRANCH_DIS: - env.floor_colour = CYAN; - env.rock_colour = CYAN; - cprintf(" of Dis "); - break; - case BRANCH_GEHENNA: - env.floor_colour = DARKGREY; - env.rock_colour = RED; - cprintf(" of Gehenna "); - break; - case BRANCH_VESTIBULE_OF_HELL: - env.floor_colour = LIGHTGREY; - env.rock_colour = LIGHTGREY; - cprintf("- the Vestibule of Hell "); - break; - case BRANCH_COCYTUS: - env.floor_colour = LIGHTBLUE; - env.rock_colour = LIGHTCYAN; - cprintf(" of Cocytus "); - break; - case BRANCH_TARTARUS: - env.floor_colour = DARKGREY; - env.rock_colour = DARKGREY; - cprintf(" of Tartarus "); - break; - case BRANCH_INFERNO: - env.floor_colour = LIGHTRED; - env.rock_colour = RED; - cprintf(" of the Inferno "); - break; - case BRANCH_THE_PIT: - env.floor_colour = RED; - env.rock_colour = DARKGREY; - cprintf(" of the Pit "); - break; - case BRANCH_ORCISH_MINES: - env.floor_colour = BROWN; - env.rock_colour = BROWN; - cprintf(" of the Orcish Mines "); - break; - case BRANCH_HIVE: - env.floor_colour = YELLOW; - env.rock_colour = BROWN; - cprintf(" of the Hive "); - break; - case BRANCH_LAIR: - env.floor_colour = GREEN; - env.rock_colour = BROWN; - cprintf(" of the Lair "); - break; - case BRANCH_SLIME_PITS: - env.floor_colour = GREEN; - env.rock_colour = LIGHTGREEN; - cprintf(" of the Slime Pits "); - break; - case BRANCH_VAULTS: - env.floor_colour = LIGHTGREY; - env.rock_colour = BROWN; - cprintf(" of the Vaults "); - break; - case BRANCH_CRYPT: - env.floor_colour = LIGHTGREY; - env.rock_colour = LIGHTGREY; - cprintf(" of the Crypt "); - break; - case BRANCH_HALL_OF_BLADES: - env.floor_colour = LIGHTGREY; - env.rock_colour = LIGHTGREY; - cprintf(" of the Hall of Blades "); - break; - - case BRANCH_HALL_OF_ZOT: - if (you.your_level - you.branch_stairs[7] <= 1) - { - env.floor_colour = LIGHTGREY; - env.rock_colour = LIGHTGREY; - } - else - { - switch (you.your_level - you.branch_stairs[7]) - { - case 2: - env.rock_colour = LIGHTGREY; - env.floor_colour = BLUE; - break; - case 3: - env.rock_colour = BLUE; - env.floor_colour = LIGHTBLUE; - break; - case 4: - env.rock_colour = LIGHTBLUE; - env.floor_colour = MAGENTA; - break; - case 5: - env.rock_colour = MAGENTA; - env.floor_colour = LIGHTMAGENTA; - break; - } - } - cprintf(" of the Realm of Zot "); - break; - - case BRANCH_ECUMENICAL_TEMPLE: - env.floor_colour = LIGHTGREY; - env.rock_colour = LIGHTGREY; - cprintf(" of the Temple "); - break; - case BRANCH_SNAKE_PIT: - env.floor_colour = LIGHTGREEN; - env.rock_colour = YELLOW; - cprintf(" of the Snake Pit "); - break; - case BRANCH_ELVEN_HALLS: - env.floor_colour = DARKGREY; - env.rock_colour = LIGHTGREY; - cprintf(" of the Elven Halls "); - break; - case BRANCH_TOMB: - env.floor_colour = YELLOW; - env.rock_colour = LIGHTGREY; - cprintf(" of the Tomb "); - break; - case BRANCH_SWAMP: - env.floor_colour = BROWN; - env.rock_colour = BROWN; - cprintf(" of the Swamp "); - break; - } - } // end else -} // end new_level() - -static void dart_trap( bool trap_known, int trapped, struct bolt &pbolt, - bool poison ) -{ - int damage_taken = 0; - int trap_hit, your_dodge; - - if (random2(10) < 2 || (trap_known && !one_chance_in(4))) - { - snprintf( info, INFO_SIZE, "You avoid triggering a%s trap.", - pbolt.beam_name ); - mpr(info); - return; - } - - if (you.equip[EQ_SHIELD] != -1 && one_chance_in(3)) - exercise( SK_SHIELDS, 1 ); - - snprintf( info, INFO_SIZE, "A%s shoots out and ", pbolt.beam_name ); - - if (random2( 20 + 5 * you.shield_blocks * you.shield_blocks ) - < player_shield_class()) - { - you.shield_blocks++; - strcat( info, "hits your shield." ); - mpr(info); - goto out_of_trap; - } - - // note that this uses full ( not random2limit(foo,40) ) player_evasion. - trap_hit = (20 + (you.your_level * 2)) * random2(200) / 100; - - your_dodge = player_evasion() + random2(you.dex) / 3 - - 2 + (you.duration[DUR_REPEL_MISSILES] * 10); - - if (trap_hit >= your_dodge && you.duration[DUR_DEFLECT_MISSILES] == 0) - { - strcat( info, "hits you!" ); - mpr(info); - - if (poison && random2(100) < 50 - (3 * player_AC()) / 2 - && !player_res_poison()) - { - poison_player( 1 + random2(3) ); - } - - damage_taken = roll_dice( pbolt.damage ); - damage_taken -= random2( player_AC() + 1 ); - - if (damage_taken > 0) - ouch( damage_taken, 0, KILLED_BY_TRAP, pbolt.beam_name ); - } - else - { - strcat( info, "misses you." ); - mpr(info); - } - - if (player_light_armour() && coinflip()) - exercise( SK_DODGING, 1 ); - - out_of_trap: - - pbolt.target_x = you.x_pos; - pbolt.target_y = you.y_pos; - - if (coinflip()) - itrap( pbolt, trapped ); -} // end dart_trap() - -// -// itrap takes location from target_x, target_y of bolt strcture. -// - -void itrap( struct bolt &pbolt, int trapped ) -{ - int base_type = OBJ_MISSILES; - int sub_type = MI_DART; - - switch (env.trap[trapped].type) - { - case TRAP_DART: - base_type = OBJ_MISSILES; - sub_type = MI_DART; - break; - case TRAP_ARROW: - base_type = OBJ_MISSILES; - sub_type = MI_ARROW; - break; - case TRAP_BOLT: - base_type = OBJ_MISSILES; - sub_type = MI_BOLT; - break; - case TRAP_SPEAR: - base_type = OBJ_WEAPONS; - sub_type = WPN_SPEAR; - break; - case TRAP_AXE: - base_type = OBJ_WEAPONS; - sub_type = WPN_HAND_AXE; - break; - case TRAP_NEEDLE: - base_type = OBJ_MISSILES; - sub_type = MI_NEEDLE; - break; - default: - return; - } - - trap_item( base_type, sub_type, pbolt.target_x, pbolt.target_y ); - - return; -} // end itrap() - -void handle_traps(char trt, int i, bool trap_known) -{ - struct bolt beam; - - switch (trt) - { - case TRAP_DART: - strcpy(beam.beam_name, " dart"); - beam.damage = dice_def( 1, 4 + (you.your_level / 2) ); - dart_trap(trap_known, i, beam, false); - break; - - case TRAP_NEEDLE: - strcpy(beam.beam_name, " needle"); - beam.damage = dice_def( 1, 0 ); - dart_trap(trap_known, i, beam, true); - break; - - case TRAP_ARROW: - strcpy(beam.beam_name, "n arrow"); - beam.damage = dice_def( 1, 7 + you.your_level ); - dart_trap(trap_known, i, beam, false); - break; - - case TRAP_BOLT: - strcpy(beam.beam_name, " bolt"); - beam.damage = dice_def( 1, 13 + you.your_level ); - dart_trap(trap_known, i, beam, false); - break; - - case TRAP_SPEAR: - strcpy(beam.beam_name, " spear"); - beam.damage = dice_def( 1, 10 + you.your_level ); - dart_trap(trap_known, i, beam, false); - break; - - case TRAP_AXE: - strcpy(beam.beam_name, "n axe"); - beam.damage = dice_def( 1, 15 + you.your_level ); - dart_trap(trap_known, i, beam, false); - break; - - case TRAP_TELEPORT: - mpr("You enter a teleport trap!"); - - if (scan_randarts(RAP_PREVENT_TELEPORTATION)) - mpr("You feel a weird sense of stasis."); - else - you_teleport2( true ); - break; - - case TRAP_AMNESIA: - mpr("You feel momentarily disoriented."); - if (!wearing_amulet(AMU_CLARITY)) - forget_map(random2avg(100, 2)); - break; - - case TRAP_BLADE: - if (trap_known && one_chance_in(3)) - mpr("You avoid triggering a blade trap."); - else if (random2limit(player_evasion(), 40) - + (random2(you.dex) / 3) + (trap_known ? 3 : 0) > 8) - { - mpr("A huge blade swings just past you!"); - } - else - { - mpr("A huge blade swings out and slices into you!"); - ouch( (you.your_level * 2) + random2avg(29, 2) - - random2(1 + player_AC()), 0, KILLED_BY_TRAP, " blade" ); - } - break; - - case TRAP_ZOT: - default: - mpr((trap_known) ? "You enter the Zot trap." - : "Oh no! You have blundered into a Zot trap!"); - miscast_effect( SPTYP_RANDOM, random2(30) + you.your_level, - 75 + random2(100), 3, "a Zot trap" ); - break; - } -} // end handle_traps() - -void disarm_trap( struct dist &disa ) -{ - if (you.berserker) - { - canned_msg(MSG_TOO_BERSERK); - return; - } - - int i, j; - - for (i = 0; i < MAX_TRAPS; i++) - { - if (env.trap[i].x == you.x_pos + disa.dx - && env.trap[i].y == you.y_pos + disa.dy) - { - break; - } - - if (i == MAX_TRAPS - 1) - { - mpr("Error - couldn't find that trap."); - return; - } - } - - if (trap_category(env.trap[i].type) == DNGN_TRAP_MAGICAL) - { - mpr("You can't disarm that trap."); - return; - } - - if (random2(you.skills[SK_TRAPS_DOORS] + 2) <= random2(you.your_level + 5)) - { - mpr("You failed to disarm the trap."); - - you.turn_is_over = 1; - - if (random2(you.dex) > 5 + random2(5 + you.your_level)) - exercise(SK_TRAPS_DOORS, 1 + random2(you.your_level / 5)); - else - { - handle_traps(env.trap[i].type, i, false); - - if (coinflip()) - exercise(SK_TRAPS_DOORS, 1); - } - - return; - } - - mpr("You have disarmed the trap."); - - struct bolt beam; - - beam.target_x = you.x_pos + disa.dx; - beam.target_y = you.y_pos + disa.dy; - - if (env.trap[i].type != TRAP_BLADE - && trap_category(env.trap[i].type) == DNGN_TRAP_MECHANICAL) - { - for (j = 0; j < 20; j++) - { - // places items (eg darts), which will automatically stack - itrap(beam, i); - - if (j > 10 && one_chance_in(3)) - break; - } - } - - grd[you.x_pos + disa.dx][you.y_pos + disa.dy] = DNGN_FLOOR; - env.trap[i].type = TRAP_UNASSIGNED; - you.turn_is_over = 1; - - // reduced from 5 + random2(5) - exercise(SK_TRAPS_DOORS, 1 + random2(5) + (you.your_level / 5)); -} // end disarm_trap() - -void manage_clouds(void) -{ - // amount which cloud dissipates - must be unsigned! {dlb} - unsigned int dissipate = 0; - - for (unsigned char cc = 0; cc < MAX_CLOUDS; cc++) - { - if (env.cloud[cc].type == CLOUD_NONE) // no cloud -> next iteration - continue; - - dissipate = you.time_taken; - - // water -> flaming clouds: - // lava -> freezing clouds: - if ((env.cloud[cc].type == CLOUD_FIRE - || env.cloud[cc].type == CLOUD_FIRE_MON) - && grd[env.cloud[cc].x][env.cloud[cc].y] == DNGN_DEEP_WATER) - { - dissipate *= 4; - } - else if ((env.cloud[cc].type == CLOUD_COLD - || env.cloud[cc].type == CLOUD_COLD_MON) - && grd[env.cloud[cc].x][env.cloud[cc].y] == DNGN_LAVA) - { - dissipate *= 4; - } - - // double the amount when slowed - must be applied last(!): - if (you.slow) - dissipate *= 2; - - // apply calculated rate to the actual cloud: - env.cloud[cc].decay -= dissipate; - - // check for total dissipatation and handle accordingly: - if (env.cloud[cc].decay < 1) - delete_cloud( cc ); - } - - return; -} // end manage_clouds() - -void weird_writing(char stringy[40]) -{ - int temp_rand = 0; // for probability determinations {dlb} - - temp_rand = random2(15); - - // you'll see why later on {dlb} - strcpy(stringy, (temp_rand == 0) ? "writhing" : - (temp_rand == 1) ? "bold" : - (temp_rand == 2) ? "faint" : - (temp_rand == 3) ? "spidery" : - (temp_rand == 4) ? "blocky" : - (temp_rand == 5) ? "angular" : - (temp_rand == 6) ? "shimmering" : - (temp_rand == 7) ? "glowing" : ""); - - if (temp_rand < 8) - strcat(stringy, " "); // see above for reasoning {dlb} - - temp_rand = random2(14); - - strcat(stringy, (temp_rand == 0) ? "yellow" : - (temp_rand == 1) ? "brown" : - (temp_rand == 2) ? "black" : - (temp_rand == 3) ? "purple" : - (temp_rand == 4) ? "orange" : - (temp_rand == 5) ? "lime-green" : - (temp_rand == 6) ? "blue" : - (temp_rand == 7) ? "grey" : - (temp_rand == 8) ? "silver" : - (temp_rand == 9) ? "gold" : - (temp_rand == 10) ? "umber" : - (temp_rand == 11) ? "charcoal" : - (temp_rand == 12) ? "pastel" : - (temp_rand == 13) ? "mauve" - : "colourless"); - - strcat(stringy, " "); - - temp_rand = random2(14); - - strcat(stringy, (temp_rand == 0) ? "writing" : - (temp_rand == 1) ? "scrawl" : - (temp_rand == 2) ? "sigils" : - (temp_rand == 3) ? "runes" : - (temp_rand == 4) ? "hieroglyphics" : - (temp_rand == 5) ? "scrawl" : - (temp_rand == 6) ? "print-out" : - (temp_rand == 7) ? "binary code" : - (temp_rand == 8) ? "glyphs" : - (temp_rand == 9) ? "symbols" - : "text"); - - return; -} // end weird_writing() - -// must be a better name than 'place' for the first parameter {dlb} -void fall_into_a_pool(bool place, unsigned char terrain) -{ - bool escape = false; - FixedVector< char, 2 > empty; - - if (you.species == SP_MERFOLK && terrain == DNGN_DEEP_WATER) - { - // These can happen when we enter deep water directly -- bwr - merfolk_start_swimming(); - return; - } - - strcpy(info, "You fall into the "); - - strcat(info, (terrain == DNGN_LAVA) ? "lava" : - (terrain == DNGN_DEEP_WATER) ? "water" - : "programming rift"); - - strcat(info, "!"); - mpr(info); - - more(); - mesclr(); - - if (terrain == DNGN_LAVA) - { - const int resist = player_res_fire(); - - if (resist <= 0) - { - mpr( "The lava burns you to a cinder!" ); - ouch( -9999, 0, KILLED_BY_LAVA ); - } - else - { - // should boost # of bangs per damage in the future {dlb} - mpr( "The lava burns you!" ); - ouch( (10 + random2avg(100, 2)) / resist, 0, KILLED_BY_LAVA ); - } - - if (you.duration[DUR_CONDENSATION_SHIELD] > 0) - { - mpr("Your icy shield dissipates!", MSGCH_DURATION); - you.duration[DUR_CONDENSATION_SHIELD] = 0; - you.redraw_armour_class = 1; - } - } - - // a distinction between stepping and falling from you.levitation - // prevents stepping into a thin stream of lava to get to the other side. - if (scramble()) - { - if (place) - { - if (empty_surrounds(you.x_pos, you.y_pos, DNGN_FLOOR, false, empty)) - { - you.x_pos = empty[0]; - you.y_pos = empty[1]; - escape = true; - } - else - escape = false; - } - else - escape = true; - } - else - { - // that is, don't display following when fall from levitating - if (!place) - mpr("You try to escape, but your burden drags you down!"); - } - - if (escape) - { - mpr("You manage to scramble free!"); - - if (terrain == DNGN_LAVA) - scrolls_burn(10, OBJ_SCROLLS); - - return; - } - - mpr("You drown..."); - - if (terrain == DNGN_LAVA) - ouch(-9999, 0, KILLED_BY_LAVA); - else if (terrain == DNGN_DEEP_WATER) - ouch(-9999, 0, KILLED_BY_WATER); - - // Okay, so you don't trigger a trap when you scramble onto it. - //I really can't be bothered right now. -} // end fall_into_a_pool() - -bool scramble(void) -{ - int max_carry = carrying_capacity(); - - if ((max_carry / 2) + random2(max_carry / 2) <= you.burden) - return false; - else - return true; -} // end scramble() - -void weird_colours(unsigned char coll, char wc[30]) -{ - unsigned char coll_div16 = coll / 16; // conceivable max is then 16 {dlb} - - // Must start with a consonant! - strcpy(wc, (coll_div16 == 0 || coll_div16 == 7) ? "brilliant" : - (coll_div16 == 1 || coll_div16 == 8) ? "pale" : - (coll_div16 == 2 || coll_div16 == 9) ? "mottled" : - (coll_div16 == 3 || coll_div16 == 10) ? "shimmering" : - (coll_div16 == 4 || coll_div16 == 11) ? "bright" : - (coll_div16 == 5 || coll_div16 == 12) ? "dark" : - (coll_div16 == 6 || coll_div16 == 13) ? "shining" - : "faint"); - - strcat(wc, " "); - - while (coll > 17) - coll -= 10; - - strcat(wc, (coll == 0) ? "red" : - (coll == 1) ? "purple" : - (coll == 2) ? "green" : - (coll == 3) ? "orange" : - (coll == 4) ? "magenta" : - (coll == 5) ? "black" : - (coll == 6) ? "grey" : - (coll == 7) ? "silver" : - (coll == 8) ? "gold" : - (coll == 9) ? "pink" : - (coll == 10) ? "yellow" : - (coll == 11) ? "white" : - (coll == 12) ? "brown" : - (coll == 13) ? "aubergine" : - (coll == 14) ? "ochre" : - (coll == 15) ? "leaf green" : - (coll == 16) ? "mauve" : - (coll == 17) ? "azure" - : "colourless"); - - return; -} // end weird_colours() - -bool go_berserk(bool intentional) -{ - if (you.berserker) - { - if (intentional) - mpr("You're already berserk!"); - // or else you won't notice -- no message here. - return false; - } - - if (you.exhausted) - { - if (intentional) - mpr("You're too exhausted to go berserk."); - // or else they won't notice -- no message here - return false; - } - - if (you.is_undead) - { - if (intentional) - mpr("You cannot raise a blood rage in your lifeless body."); - // or else you won't notice -- no message here - return false; - } - - mpr("A red film seems to cover your vision as you go berserk!"); - mpr("You feel yourself moving faster!"); - mpr("You feel mighty!"); - - you.berserker += 20 + random2avg(19, 2); - - calc_hp(); - you.hp *= 15; - you.hp /= 10; - - deflate_hp(you.hp_max, false); - - if (!you.might) - modify_stat( STAT_STRENGTH, 5, true ); - - you.might += you.berserker; - haste_player( you.berserker ); - - if (you.berserk_penalty != NO_BERSERK_PENALTY) - you.berserk_penalty = 0; - - return true; -} // end go_berserk() - -bool trap_item(char base_type, char sub_type, char beam_x, char beam_y) -{ - item_def item; - - item.base_type = base_type; - item.sub_type = sub_type; - item.plus = 0; - item.plus2 = 0; - item.flags = 0; - item.special = 0; - item.quantity = 1; - item.colour = LIGHTCYAN; - - if (base_type == OBJ_MISSILES) - { - if (sub_type == MI_NEEDLE) - { - set_item_ego_type( item, OBJ_MISSILES, SPMSL_POISONED ); - item.colour = WHITE; - } - else - { - set_item_ego_type( item, OBJ_MISSILES, SPMSL_NORMAL ); - - if (sub_type == MI_ARROW) - item.colour = BROWN; - } - } - else - { - set_item_ego_type( item, OBJ_WEAPONS, SPWPN_NORMAL ); - } - - if (igrd[beam_x][beam_y] != NON_ITEM) - { - if (items_stack( item, mitm[ igrd[beam_x][beam_y] ] )) - { - inc_mitm_item_quantity( igrd[beam_x][beam_y], 1 ); - return (false); - } - - // don't want to go overboard here. Will only generate up to three - // separate trap items, or less if there are other items present. - if (mitm[ igrd[beam_x][beam_y] ].link != NON_ITEM) - { - if (mitm[ mitm[ igrd[beam_x][beam_y] ].link ].link != NON_ITEM) - return (false); - } - } // end of if igrd != NON_ITEM - - return (!copy_item_to_grid( item, beam_x, beam_y, 1 )); -} // end trap_item() - -// returns appropriate trap symbol for a given trap type {dlb} -unsigned char trap_category(unsigned char trap_type) -{ - switch (trap_type) - { - case TRAP_TELEPORT: - case TRAP_AMNESIA: - case TRAP_ZOT: - return (DNGN_TRAP_MAGICAL); - - case TRAP_DART: - case TRAP_ARROW: - case TRAP_SPEAR: - case TRAP_AXE: - case TRAP_BLADE: - case TRAP_BOLT: - case TRAP_NEEDLE: - default: // what *would* be the default? {dlb} - return (DNGN_TRAP_MECHANICAL); - } -} // end trap_category() - -// returns index of the trap for a given (x,y) coordinate pair {dlb} -int trap_at_xy(int which_x, int which_y) -{ - - for (int which_trap = 0; which_trap < MAX_TRAPS; which_trap++) - { - if (env.trap[which_trap].x == which_x - && env.trap[which_trap].y == which_y) - { - return (which_trap); - } - } - - // no idea how well this will be handled elsewhere: {dlb} - return (-1); -} // end trap_at_xy() - -// A constructor for bolt to help guarantee that we start clean (this has -// caused way too many bugs). Putting it here since there's no good place to -// put it, and it doesn't do anything other than initialize it's members. -// -// TODO: Eventually it'd be nice to have a proper factory for these things -// (extended from setup_mons_cast() and zapping() which act as limited ones). -bolt::bolt() : range(0), rangeMax(0), type(SYM_ZAP), colour(BLACK), - flavour(BEAM_MAGIC), source_x(0), source_y(0), damage(0,0), - ench_power(0), hit(0), target_x(0), target_y(0), - thrower(KILL_MISC), ex_size(0), beam_source(MHITNOT), - beam_name(), - is_beam(false), is_explosion(false), is_big_cloud(false), - is_enchant(false), is_energy(false), - is_launched(false), is_thrown(false), target_first(false), - aux_source(NULL), obvious_effect(false), - fr_count(0), foe_count(0), fr_power(0), foe_power(0), - is_tracer(false), aimed_at_feet(false), msg_generated(false), - in_explosion_phase(false), smart_monster(false), - can_see_invis(false), is_friendly(false), foe_ratio(0) -{ } |