diff options
-rw-r--r-- | crawl-ref/source/newgame.cc | 148 | ||||
-rw-r--r-- | crawl-ref/source/player.cc | 6 |
2 files changed, 105 insertions, 49 deletions
diff --git a/crawl-ref/source/newgame.cc b/crawl-ref/source/newgame.cc index 4a074ee570..d81abcaedb 100644 --- a/crawl-ref/source/newgame.cc +++ b/crawl-ref/source/newgame.cc @@ -2041,7 +2041,7 @@ static bool _choose_book( item_def& book, int firstbook, int numbooks ) } textcolor(BROWN); - cprintf(EOL "* - Random choice; " + cprintf(EOL "* - Random choice; + - Good random choice; " "Bksp - Back to species and class selection; " "X - Quit" EOL); @@ -2087,16 +2087,36 @@ static bool _choose_book( item_def& book, int firstbook, int numbooks ) break; } } - while (keyin != '*' && (keyin < 'a' || keyin >= ('a' + numbooks))); + while (keyin != '*' && keyin != '+' + && (keyin < 'a' || keyin >= ('a' + numbooks))); } - if (Options.random_pick || Options.book == SBT_RANDOM || keyin == '*') + if (Options.random_pick || Options.book == SBT_RANDOM || keyin == '*' + || keyin == '+') + { ng_book = SBT_RANDOM; + } else ng_book = keyin - 'a' + 1; - if (Options.random_pick || keyin == '*') - keyin = random2(numbooks) + 'a'; + if (Options.random_pick || keyin == '*' || keyin == '+') + { + int good_choices = 0; + if (keyin == '+' || Options.random_pick && Options.good_random) + { + for (int i = 0; i < numbooks; i++) + { + if (_book_restriction(i, summons_too) == CC_UNRESTRICTED + && one_chance_in(++good_choices)) + { + keyin = i; + } + } + } + + if (!good_choices) + keyin = random2(numbooks) + 'a'; + } book.sub_type = firstbook + keyin - 'a'; return (true); @@ -2128,10 +2148,8 @@ static char_choice_restriction _weapon_restriction(weapon_type wpn) return (CC_UNRESTRICTED); default: - if (player_genus(GENPC_DRACONIAN)) - return (CC_UNRESTRICTED); - else - return (CC_RESTRICTED); + return (player_genus(GENPC_DRACONIAN) ? CC_UNRESTRICTED + : CC_RESTRICTED); } // Mace and hand axe, usually the same aptitude. @@ -2155,10 +2173,8 @@ static char_choice_restriction _weapon_restriction(weapon_type wpn) return (CC_UNRESTRICTED); default: - if (player_genus(GENPC_DRACONIAN)) - return (CC_UNRESTRICTED); - else - return (CC_RESTRICTED); + return (player_genus(GENPC_DRACONIAN) ? CC_UNRESTRICTED + : CC_RESTRICTED); } case WPN_SPEAR: @@ -2174,13 +2190,10 @@ static char_choice_restriction _weapon_restriction(weapon_type wpn) case SP_MINOTAUR: case SP_KENKU: return (CC_UNRESTRICTED); - break; default: - if (player_genus(GENPC_DRACONIAN)) - return (CC_UNRESTRICTED); - else - return (CC_RESTRICTED); + return (player_genus(GENPC_DRACONIAN) ? CC_UNRESTRICTED + : CC_RESTRICTED); } case WPN_TRIDENT: @@ -2252,7 +2265,7 @@ static bool _choose_weapon() Options.prev_weapon = WPN_UNKNOWN; textcolor(BROWN); - cprintf(EOL "* - Random choice; " + cprintf(EOL "* - Random choice; + - Good random choice; " "Bksp - Back to species and class selection; " "X - Quit" EOL); @@ -2297,30 +2310,50 @@ static bool _choose_weapon() } } } - while (keyin != '*' && (keyin < 'a' || keyin > ('a' + num_choices)) + while (keyin != '*' && keyin != '+' + && (keyin < 'a' || keyin > ('a' + num_choices)) || startwep_restrictions[keyin - 'a'] == CC_BANNED); - if (keyin != '*' && effective_stat_bonus(startwep[keyin - 'a']) > -4) + if (keyin != '*' && keyin != '+' + && effective_stat_bonus(startwep[keyin - 'a']) > -4) { cprintf(EOL "A fine choice. " EOL); delay(1000); } } - if (Options.random_pick || Options.weapon == WPN_RANDOM || keyin == '*') + if (Options.random_pick || Options.weapon == WPN_RANDOM || keyin == '*' + || keyin == '+') { Options.weapon = WPN_RANDOM; - // Try to choose a decent weapon. - for (int times = 0; times < 50; times++) + ng_weapon = WPN_RANDOM; + + int good_choices = 0; + if (keyin == '+' || Options.good_random && keyin != '*') { - keyin = random2(num_choices); - int x = effective_stat_bonus(startwep[keyin]); - if (x > -2) - break; + for (int i = 0; i < num_choices; i++) + { + if (_weapon_restriction(startwep[keyin]) == CC_UNRESTRICTED + && one_chance_in(++good_choices)) + { + keyin = i; + } + } + } + + if (!good_choices) + { + // Still try to choose a decent weapon. + for (int times = 0; times < 50; times++) + { + keyin = random2(num_choices); + int x = effective_stat_bonus(startwep[keyin]); + if (x > -2) + break; + } + keyin += 'a'; } - keyin += 'a'; - ng_weapon = WPN_RANDOM; } else ng_weapon = startwep[keyin - 'a']; @@ -2355,6 +2388,28 @@ static bool _is_valid_religion(god_type god) } } +static bool _has_good_necromancy_apts() +{ + switch (you.species) + { + case SP_HUMAN: + case SP_DEEP_ELF: + case SP_SLUDGE_ELF: + case SP_KOBOLD: + case SP_NAGA: + case SP_OGRE_MAGE: + case SP_KENKU: + case SP_DEMONSPAWN: + case SP_MUMMY: + case SP_GHOUL: + case SP_VAMPIRE: + return (true); + + default: + return (player_genus(GENPC_DRACONIAN)); + } +} + static void _init_player(void) { you.init(); @@ -4705,8 +4760,12 @@ bool _give_items_skills() } else if (Options.random_pick || Options.death_knight == DK_RANDOM) { - choice = (coinflip() ? DK_NECROMANCY : DK_YREDELEMNUL); - ng_dk = DK_RANDOM; + ng_dk = DK_RANDOM; + + if (Options.good_random && !_has_good_necromancy_apts()) + choice = DK_YREDELEMNUL; + else + choice = (coinflip() ? DK_NECROMANCY : DK_YREDELEMNUL); } else { @@ -4715,24 +4774,11 @@ bool _give_items_skills() textcolor( CYAN ); cprintf(EOL "From where do you draw your power?" EOL); - switch (you.species) - { - case SP_HUMAN: - case SP_DEEP_ELF: - case SP_SLUDGE_ELF: - case SP_KOBOLD: - case SP_NAGA: - case SP_OGRE_MAGE: - case SP_KENKU: - case SP_DEMONSPAWN: - case SP_MUMMY: - case SP_GHOUL: - case SP_VAMPIRE: + if (_has_good_necromancy_apts()) textcolor(LIGHTGREY); - break; - default: - textcolor(player_genus(GENPC_DRACONIAN) ? LIGHTGREY : DARKGREY); - } + else + textcolor(DARKGREY); + cprintf("a - Necromantic magic" EOL); // Yredelemnul is an okay choice for everyone. @@ -4779,6 +4825,10 @@ bool _give_items_skills() } keyn = '*'; // for ng_dk setting // fall-through for random + case '+': + if (keyn == '+' && !_has_good_necromancy_apts()) + choice = DK_YREDELEMNUL; + // fall-through for random case '*': choice = coinflip()? DK_NECROMANCY : DK_YREDELEMNUL; break; diff --git a/crawl-ref/source/player.cc b/crawl-ref/source/player.cc index 32f1763554..90466a5011 100644 --- a/crawl-ref/source/player.cc +++ b/crawl-ref/source/player.cc @@ -5055,6 +5055,12 @@ bool slow_player( int amount ) if (wearing_amulet( AMU_RESIST_SLOW )) { mpr("You feel momentarily lethargic."); + + // Identify amulet. + item_def amu = you.inv[you.equip[EQ_AMULET]]; + if (!item_type_known(amu)) + set_ident_type( amu, ID_KNOWN_TYPE ); + return (false); } else if (you.duration[DUR_SLOW] >= 100) |