diff options
author | j-p-e-g <j-p-e-g@c06c8d41-db1a-0410-9941-cceddc491573> | 2008-06-30 14:32:21 +0000 |
---|---|---|
committer | j-p-e-g <j-p-e-g@c06c8d41-db1a-0410-9941-cceddc491573> | 2008-06-30 14:32:21 +0000 |
commit | 0e65534b50e40a32611842551af39a089eff48af (patch) | |
tree | bd03973481f7ac07748fc1d15a119d680982f0ac /crawl-ref/source/abyss.cc | |
parent | f69da63b88187593335b68ac29356b561662997c (diff) | |
download | crawl-ref-0e65534b50e40a32611842551af39a089eff48af.tar.gz crawl-ref-0e65534b50e40a32611842551af39a089eff48af.zip |
Enable Chaos Knights of Lugonu starting out in the Abyss.
I've marked these characters with GDT_GAME_START, so that
* the player starts out on an altar to Lugonu
* there's an exit back to the Dungeon near-by
* returning into the Dungeon always places them into the entry vault on
level 1
* no abyssal runes are ever generated
* item generation matches that of level 1
* monster spawn rates are that of the orb run to enforce a quick return
into the Dungeon
Once the player returns to the Dungeon (via an exit or with Lugonu's
first power) char_direction is properly set to GDT_DESCENDING and from
then on the game continues as if they had started in the Dungeon.
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@6245 c06c8d41-db1a-0410-9941-cceddc491573
Diffstat (limited to 'crawl-ref/source/abyss.cc')
-rw-r--r-- | crawl-ref/source/abyss.cc | 74 |
1 files changed, 52 insertions, 22 deletions
diff --git a/crawl-ref/source/abyss.cc b/crawl-ref/source/abyss.cc index 416515d1e9..14ab8056bd 100644 --- a/crawl-ref/source/abyss.cc +++ b/crawl-ref/source/abyss.cc @@ -90,11 +90,24 @@ void generate_abyss() : DNGN_CLOSED_DOOR); // 1 in 4000 } - grd[45][35] = DNGN_FLOOR; - if (one_chance_in(5)) + // If we're starting out in the Abyss, make sure the starting grid is + // an altar to Lugonu and there's an exit near-by. + // Otherwise, we start out on floor and there's a chance there's an + // altar near-by. + if (you.char_direction == GDT_GAME_START) { + grd[45][35] = DNGN_ALTAR_LUGONU; _place_feature_near( coord_def(45, 35), LOS_RADIUS, - DNGN_FLOOR, DNGN_ALTAR_LUGONU, 50 ); + DNGN_FLOOR, DNGN_EXIT_ABYSS, 50 ); + } + else + { + grd[45][35] = DNGN_FLOOR; + if (one_chance_in(5)) + { + _place_feature_near( coord_def(45, 35), LOS_RADIUS, + DNGN_FLOOR, DNGN_ALTAR_LUGONU, 50 ); + } } } @@ -209,6 +222,7 @@ static void _generate_area(int gx1, int gy1, int gx2, int gy2, if (items_placed < 150 && one_chance_in(200)) { if (!placed_abyssal_rune && abyssal_rune_roll != -1 + && you.char_direction != GDT_GAME_START && one_chance_in(abyssal_rune_roll)) { thing_created = items(1, OBJ_MISCELLANY, @@ -220,8 +234,19 @@ static void _generate_area(int gx1, int gy1, int gx2, int gy2, } else { - thing_created = items(1, OBJ_RANDOM, - OBJ_RANDOM, true, 51, 250); + if (you.char_direction == GDT_GAME_START) + { + // Number and level of items as that on level 1. + const int num_items = 3 + roll_dice( 3, 11 ); + const int items_level = 0; + thing_created = items(1, OBJ_RANDOM, OBJ_RANDOM, + true, items_level, num_items); + } + else + { + thing_created = items(1, OBJ_RANDOM, + OBJ_RANDOM, true, 51, 250); + } } move_item_to_grid( &thing_created, i, j ); @@ -254,29 +279,34 @@ static void _generate_area(int gx1, int gy1, int gx2, int gy2, #endif } - if (one_chance_in(10000)) // Place an altar. - altars_wanted++; - - // Don't place altars under items. - if (altars_wanted > 0 && igrd[i][j] == NON_ITEM) + // Except for the altar on the starting position, don't place + // any altars. + if (you.char_direction != GDT_GAME_START) { - do + if (one_chance_in(10000)) // Place an altar. + altars_wanted++; + + // Don't place altars under items. + if (altars_wanted > 0 && igrd[i][j] == NON_ITEM) { - grd[i][j] = static_cast<dungeon_feature_type>( - DNGN_ALTAR_ZIN + random2(NUM_GODS-1) ); - } - while (grd[i][j] == DNGN_ALTAR_ZIN - || grd[i][j] == DNGN_ALTAR_SHINING_ONE - || grd[i][j] == DNGN_ALTAR_ELYVILON); + do + { + grd[i][j] = static_cast<dungeon_feature_type>( + DNGN_ALTAR_ZIN + random2(NUM_GODS-1) ); + } + while (grd[i][j] == DNGN_ALTAR_ZIN + || grd[i][j] == DNGN_ALTAR_SHINING_ONE + || grd[i][j] == DNGN_ALTAR_ELYVILON); - // Lugonu has a flat 50% chance of corrupting the altar. - if (coinflip()) - grd[i][j] = DNGN_ALTAR_LUGONU; + // Lugonu has a flat 50% chance of corrupting the altar. + if (coinflip()) + grd[i][j] = DNGN_ALTAR_LUGONU; - altars_wanted--; + altars_wanted--; #if DEBUG_ABYSS - mpr("Placing altar.", MSGCH_DIAGNOSTICS); + mpr("Placing altar.", MSGCH_DIAGNOSTICS); #endif + } } } |