summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--crawl-ref/source/newgame.cc185
-rw-r--r--crawl-ref/source/player.cc6
2 files changed, 93 insertions, 98 deletions
diff --git a/crawl-ref/source/newgame.cc b/crawl-ref/source/newgame.cc
index 0833efcb87..6130639a52 100644
--- a/crawl-ref/source/newgame.cc
+++ b/crawl-ref/source/newgame.cc
@@ -67,7 +67,7 @@ REVISION("$Rev$");
extern std::string init_file_error;
-#define MIN_START_STAT 1
+#define MIN_START_STAT 3
enum char_choice_restriction
{
@@ -966,29 +966,44 @@ static void _reassess_starting_skills()
}
}
-// Randomly boost stats a number of times.
-static void _assign_remaining_stats(int points_left)
+// Make sure no stats are unacceptably low
+// (currently possible only for GhBe -- 1KB)
+static void _unfocus_stats()
{
- // First spend points to get us to the minimum allowed value. -- bwr
- if (you.strength < MIN_START_STAT)
+ int needed;
+
+ if ((needed = MIN_START_STAT - you.strength) > 0)
{
- points_left -= (MIN_START_STAT - you.strength);
+ if (you.intel > you.dex)
+ you.intel -= needed;
+ else
+ you.dex -= needed;
+
you.strength = MIN_START_STAT;
}
-
- if (you.intel < MIN_START_STAT)
+ if ((needed = MIN_START_STAT - you.intel) > 0)
{
- points_left -= (MIN_START_STAT - you.intel);
+ if (you.strength > you.dex)
+ you.strength -= needed;
+ else
+ you.dex -= needed;
+
you.intel = MIN_START_STAT;
}
-
- if (you.dex < MIN_START_STAT)
+ if ((needed = MIN_START_STAT - you.dex) > 0)
{
- points_left -= (MIN_START_STAT - you.dex);
+ if (you.strength > you.intel)
+ you.strength -= needed;
+ else
+ you.intel -= needed;
+
you.dex = MIN_START_STAT;
}
+}
- // Now randomly assign the remaining points. -- bwr
+// Randomly boost stats a number of times.
+static void _wanderer_assign_remaining_stats(int points_left)
+{
while (points_left > 0)
{
// Stats that are already high will be chosen half as often.
@@ -1292,8 +1307,7 @@ game_start:
_jobs_stat_init( you.char_class );
_give_last_paycheck( you.char_class );
- _assign_remaining_stats((you.species == SP_DEMIGOD ||
- you.species == SP_DEMONSPAWN) ? 15 : 8);
+ _unfocus_stats();
// Needs to be done before handing out food.
give_basic_mutations(you.species);
@@ -2734,17 +2748,17 @@ static void _give_last_paycheck(job_type which_job)
{
case JOB_HEALER:
case JOB_THIEF:
- you.gold = roll_dice(2, 100);
+ you.gold = 100;
break;
case JOB_WANDERER:
case JOB_WARPER:
case JOB_ASSASSIN:
- you.gold = roll_dice(2, 50);
+ you.gold = 50;
break;
default:
- you.gold = roll_dice(2, 20);
+ you.gold = 20;
break;
case JOB_PALADIN:
@@ -2766,14 +2780,13 @@ static void _species_stat_init(species_type which_species)
// Note: The stats in in this list aren't intended to sum the same
// for all races. The fact that Mummies and Ghouls are really low
// is considered acceptable (Mummies don't have to eat, and Ghouls
- // are supposed to be a really hard race). Also note that Demigods
- // and Demonspawn get seven more random points added later. -- bwr
+ // are supposed to be a really hard race). -- bwr
switch (which_species)
{
default: sb = 6; ib = 6; db = 6; break; // 18
case SP_HUMAN: sb = 6; ib = 6; db = 6; break; // 18
- case SP_DEMIGOD: sb = 7; ib = 7; db = 7; break; // 21+7
- case SP_DEMONSPAWN: sb = 4; ib = 4; db = 4; break; // 12+7
+ case SP_DEMIGOD: sb = 9; ib = 10; db = 9; break; // 28
+ case SP_DEMONSPAWN: sb = 6; ib = 7; db = 6; break; // 19
case SP_HIGH_ELF: sb = 5; ib = 9; db = 8; break; // 22
case SP_DEEP_ELF: sb = 3; ib = 10; db = 8; break; // 21
@@ -2813,7 +2826,7 @@ static void _species_stat_init(species_type which_species)
case SP_BASE_DRACONIAN: sb = 9; ib = 6; db = 2; break; // 17
}
- modify_all_stats( sb, ib, db );
+ modify_all_stats( sb+2, ib+2, db+2 );
}
static void _jobs_stat_init(job_type which_job)
@@ -2827,52 +2840,48 @@ static void _jobs_stat_init(job_type which_job)
// Note: Wanderers are correct, they're a challenging class. -- bwr
switch (which_job)
{
- case JOB_FIGHTER: s = 7; i = 0; d = 3; hp = 15; mp = 0; break;
- case JOB_BERSERKER: s = 7; i = -1; d = 4; hp = 15; mp = 0; break;
- case JOB_GLADIATOR: s = 6; i = 0; d = 4; hp = 14; mp = 0; break;
- case JOB_PALADIN: s = 6; i = 2; d = 2; hp = 14; mp = 0; break;
+ case JOB_FIGHTER: s = 8; i = 0; d = 4; hp = 15; mp = 0; break;
+ case JOB_BERSERKER: s = 9; i = -1; d = 4; hp = 15; mp = 0; break;
+ case JOB_GLADIATOR: s = 7; i = 0; d = 5; hp = 14; mp = 0; break;
+ case JOB_PALADIN: s = 7; i = 2; d = 3; hp = 14; mp = 0; break;
- case JOB_CRUSADER: s = 4; i = 3; d = 3; hp = 13; mp = 1; break;
- case JOB_DEATH_KNIGHT: s = 4; i = 3; d = 3; hp = 13; mp = 1; break;
- case JOB_CHAOS_KNIGHT: s = 4; i = 3; d = 3; hp = 13; mp = 1; break;
+ case JOB_CRUSADER: s = 4; i = 4; d = 4; hp = 13; mp = 1; break;
+ case JOB_DEATH_KNIGHT: s = 5; i = 3; d = 4; hp = 13; mp = 1; break;
+ case JOB_CHAOS_KNIGHT: s = 4; i = 4; d = 4; hp = 13; mp = 1; break;
- case JOB_REAVER: s = 4; i = 4; d = 2; hp = 13; mp = 1; break;
- case JOB_HEALER: s = 4; i = 4; d = 2; hp = 13; mp = 1; break;
- case JOB_PRIEST: s = 4; i = 4; d = 2; hp = 12; mp = 1; break;
+ case JOB_REAVER: s = 5; i = 5; d = 2; hp = 13; mp = 1; break;
+ case JOB_HEALER: s = 5; i = 5; d = 2; hp = 13; mp = 1; break;
+ case JOB_PRIEST: s = 5; i = 4; d = 3; hp = 12; mp = 1; break;
- case JOB_ASSASSIN: s = 2; i = 2; d = 6; hp = 12; mp = 0; break;
- case JOB_THIEF: s = 3; i = 2; d = 5; hp = 13; mp = 0; break;
- case JOB_STALKER: s = 2; i = 3; d = 5; hp = 12; mp = 1; break;
+ case JOB_ASSASSIN: s = 3; i = 3; d = 6; hp = 12; mp = 0; break;
+ case JOB_THIEF: s = 4; i = 2; d = 6; hp = 13; mp = 0; break;
+ case JOB_STALKER: s = 2; i = 4; d = 6; hp = 12; mp = 1; break;
- case JOB_HUNTER: s = 3; i = 3; d = 4; hp = 13; mp = 0; break;
- case JOB_WARPER: s = 3; i = 4; d = 3; hp = 12; mp = 1; break;
+ case JOB_HUNTER: s = 4; i = 3; d = 5; hp = 13; mp = 0; break;
+ case JOB_WARPER: s = 3; i = 5; d = 4; hp = 12; mp = 1; break;
- case JOB_MONK: s = 2; i = 2; d = 6; hp = 13; mp = 0; break;
- case JOB_TRANSMUTER: s = 2; i = 4; d = 4; hp = 12; mp = 1; break;
+ case JOB_MONK: s = 3; i = 2; d = 7; hp = 13; mp = 0; break;
+ case JOB_TRANSMUTER: s = 2; i = 5; d = 5; hp = 12; mp = 1; break;
- case JOB_WIZARD: s = -1; i = 8; d = 3; hp = 8; mp = 5; break;
- case JOB_CONJURER: s = 0; i = 6; d = 4; hp = 10; mp = 3; break;
- case JOB_ENCHANTER: s = 0; i = 6; d = 4; hp = 10; mp = 3; break;
- case JOB_FIRE_ELEMENTALIST: s = 0; i = 6; d = 4; hp = 10; mp = 3; break;
- case JOB_ICE_ELEMENTALIST: s = 0; i = 6; d = 4; hp = 10; mp = 3; break;
- case JOB_AIR_ELEMENTALIST: s = 0; i = 6; d = 4; hp = 10; mp = 3; break;
- case JOB_EARTH_ELEMENTALIST:s = 0; i = 6; d = 4; hp = 10; mp = 3; break;
- case JOB_SUMMONER: s = 0; i = 6; d = 4; hp = 10; mp = 3; break;
- case JOB_VENOM_MAGE: s = 0; i = 6; d = 4; hp = 10; mp = 3; break;
- case JOB_NECROMANCER: s = 0; i = 6; d = 4; hp = 10; mp = 3; break;
+ case JOB_WIZARD: s = -1; i = 10; d = 3; hp = 8; mp = 5; break;
+ case JOB_CONJURER: s = 0; i = 7; d = 5; hp = 10; mp = 3; break;
+ case JOB_ENCHANTER: s = 0; i = 7; d = 5; hp = 10; mp = 3; break;
+ case JOB_FIRE_ELEMENTALIST: s = 0; i = 7; d = 5; hp = 10; mp = 3; break;
+ case JOB_ICE_ELEMENTALIST: s = 0; i = 7; d = 5; hp = 10; mp = 3; break;
+ case JOB_AIR_ELEMENTALIST: s = 0; i = 7; d = 5; hp = 10; mp = 3; break;
+ case JOB_EARTH_ELEMENTALIST:s = 0; i = 7; d = 5; hp = 10; mp = 3; break;
+ case JOB_SUMMONER: s = 0; i = 7; d = 5; hp = 10; mp = 3; break;
+ case JOB_VENOM_MAGE: s = 0; i = 7; d = 5; hp = 10; mp = 3; break;
+ case JOB_NECROMANCER: s = 0; i = 7; d = 5; hp = 10; mp = 3; break;
case JOB_WANDERER:
{
- // Wanderers get 2 points per stat as a baseline, and 4 more are
- // randomly distributed.
- s = 2; i = 2; d = 2;
-
- _assign_remaining_stats(4);
-
+ // Wanderers get their stats randomly distributed.
+ _wanderer_assign_remaining_stats(12);
hp = 11; mp = 1; break;
}
- case JOB_ARTIFICER: s = 2; i = 3; d = 4; hp = 13; mp = 1; break;
+ case JOB_ARTIFICER: s = 3; i = 4; d = 5; hp = 13; mp = 1; break;
default: s = 0; i = 0; d = 0; hp = 10; mp = 0; break;
}
@@ -5250,7 +5259,6 @@ bool _give_items_skills()
{
char keyn;
int weap_skill = 0;
- int to_hit_bonus = 0; // used for assigning primary weapons {dlb}
int choice; // used for third-screen choices
switch (you.char_class)
@@ -5305,8 +5313,7 @@ bool _give_items_skills()
// Small races get stones, the others nets.
if (player_size(PSIZE_BODY) < SIZE_MEDIUM)
{
- _newgame_make_item(curr, EQ_NONE, OBJ_MISSILES, MI_STONE, -1,
- 10 + roll_dice( 2, 10 ));
+ _newgame_make_item(curr, EQ_NONE, OBJ_MISSILES, MI_STONE, -1, 20);
}
else
{
@@ -5570,7 +5577,7 @@ bool _give_items_skills()
case JOB_CHAOS_KNIGHT:
{
_newgame_make_item(0, EQ_WEAPON, OBJ_WEAPONS, WPN_SHORT_SWORD, -1,
- 1, 1 + random2(3));
+ 1, 2);
if (!_choose_weapon())
return (false);
@@ -5728,13 +5735,15 @@ bool _give_items_skills()
you.inv[0].plus2 = 4 - you.inv[0].plus;
_newgame_make_item(1, EQ_BODY_ARMOUR, OBJ_ARMOUR, ARM_LEATHER_ARMOUR,
- ARM_ROBE, 1, you.religion == GOD_XOM ? 1 + random2(3)
- : 0);
+ ARM_ROBE, 1, you.religion == GOD_XOM ? 2 : 0);
you.skills[SK_FIGHTING] = 3;
you.skills[SK_ARMOUR] = 1;
you.skills[SK_DODGING] = 1;
- you.skills[(coinflip() ? SK_ARMOUR : SK_DODGING)]++;
+ if (species_skills( SK_ARMOUR, you.species ) > species_skills( SK_DODGING, you.species ))
+ you.skills[SK_DODGING]++;
+ else
+ you.skills[SK_ARMOUR]++;
weap_skill = 2;
if (you.religion == GOD_XOM)
@@ -5916,8 +5925,8 @@ bool _give_items_skills()
case DK_YREDELEMNUL:
you.religion = GOD_YREDELEMNUL;
you.piety = 28;
- you.inv[0].plus = 1 + random2(2);
- you.inv[0].plus2 = 3 - you.inv[0].plus;
+ you.inv[0].plus = 2;
+ you.inv[0].plus2 = 2;
you.skills[SK_INVOCATIONS] = 3;
break;
}
@@ -6003,8 +6012,7 @@ bool _give_items_skills()
// One free escape.
_newgame_make_item(3, EQ_NONE, OBJ_SCROLLS, SCR_BLINKING);
- _newgame_make_item(4, EQ_NONE, OBJ_MISSILES, MI_DART, -1,
- 10 + roll_dice( 2, 10 ));
+ _newgame_make_item(4, EQ_NONE, OBJ_MISSILES, MI_DART, -1, 20);
you.skills[SK_FIGHTING] = 1;
you.skills[SK_ARMOUR] = 1;
@@ -6068,7 +6076,7 @@ bool _give_items_skills()
// Gets some darts - this class is difficult to start off with.
_newgame_make_item(3, EQ_NONE, OBJ_MISSILES, MI_DART, -1,
- 8 + roll_dice( 2, 8 ), 1);
+ 16, 1);
// Spriggans used to get a rod of striking, but now that anyone
// can get one when playing an Artificer, this is no longer
@@ -6108,8 +6116,7 @@ bool _give_items_skills()
you.equip[EQ_WEAPON] = -1;
// Some sticks for sticks to snakes.
- _newgame_make_item(1, EQ_NONE, OBJ_MISSILES, MI_ARROW, -1,
- 6 + roll_dice( 3, 4 ));
+ _newgame_make_item(1, EQ_NONE, OBJ_MISSILES, MI_ARROW, -1, 12);
_newgame_make_item(2, EQ_BODY_ARMOUR, OBJ_ARMOUR, ARM_ROBE);
_newgame_make_item(3, EQ_NONE, OBJ_BOOKS, BOOK_CHANGES);
@@ -6187,9 +6194,8 @@ bool _give_items_skills()
break;
case JOB_STALKER:
- to_hit_bonus = random2(3);
_newgame_make_item(0, EQ_WEAPON, OBJ_WEAPONS, WPN_DAGGER, -1,
- 1, 1 + to_hit_bonus, 1 + (2 - to_hit_bonus));
+ 1, 2, 2);
_newgame_make_item(1, EQ_BODY_ARMOUR, OBJ_ARMOUR, ARM_ROBE);
_newgame_make_item(2, EQ_CLOAK, OBJ_ARMOUR, ARM_CLOAK);
_newgame_make_item(3, EQ_NONE, OBJ_BOOKS, BOOK_STALKING);
@@ -6197,10 +6203,9 @@ bool _give_items_skills()
you.skills[SK_FIGHTING] = 1;
you.skills[SK_SHORT_BLADES] = 1;
you.skills[SK_POISON_MAGIC] = 1;
- you.skills[SK_DODGING] = 1;
+ you.skills[SK_DODGING] = 2;
you.skills[SK_STEALTH] = 2;
you.skills[SK_STABBING] = 2;
- you.skills[SK_DODGING + random2(3)]++;
you.skills[SK_SPELLCASTING] = 1;
you.skills[SK_ENCHANTMENTS] = 1;
break;
@@ -6212,8 +6217,7 @@ bool _give_items_skills()
_newgame_make_item(2, EQ_BODY_ARMOUR, OBJ_ARMOUR, ARM_ROBE);
_newgame_make_item(3, EQ_CLOAK, OBJ_ARMOUR, ARM_CLOAK);
- _newgame_make_item(4, EQ_NONE, OBJ_MISSILES, MI_DART, -1,
- 10 + roll_dice( 2, 10 ));
+ _newgame_make_item(4, EQ_NONE, OBJ_MISSILES, MI_DART, -1, 20);
// Spriggans used to get a rod of striking, but now that anyone
// can get one when playing an Artificer, this is no longer
@@ -6225,24 +6229,20 @@ bool _give_items_skills()
you.skills[SK_FIGHTING] = 1;
you.skills[SK_DODGING] = 2;
you.skills[SK_STEALTH] = 2;
- you.skills[SK_STABBING] = 1;
- // Increase one of Dodging/Stealth/Stabbing by 1.
- you.skills[SK_DODGING + random2(3)]++;
+ you.skills[SK_STABBING] = 2;
you.skills[SK_TRAPS_DOORS] = 2;
you.skills[SK_CROSSBOWS] = 1;
break;
case JOB_ASSASSIN:
_newgame_make_item(0, EQ_WEAPON, OBJ_WEAPONS, WPN_DAGGER, -1,
- 1, 1 + to_hit_bonus, 1 + (2 - to_hit_bonus));
+ 1, 2, 2);
_newgame_make_item(1, EQ_NONE, OBJ_WEAPONS, WPN_BLOWGUN);
_newgame_make_item(2, EQ_BODY_ARMOUR, OBJ_ARMOUR, ARM_ROBE);
_newgame_make_item(3, EQ_CLOAK, OBJ_ARMOUR, ARM_CLOAK);
- _newgame_make_item(4, EQ_NONE, OBJ_MISSILES, MI_NEEDLE, -1,
- 5 + roll_dice(2, 5));
+ _newgame_make_item(4, EQ_NONE, OBJ_MISSILES, MI_NEEDLE, -1, 10);
set_item_ego_type(you.inv[4], OBJ_MISSILES, SPMSL_POISONED);
- _newgame_make_item(5, EQ_NONE, OBJ_MISSILES, MI_NEEDLE, -1,
- 1 + random2(4));
+ _newgame_make_item(5, EQ_NONE, OBJ_MISSILES, MI_NEEDLE, -1, 3);
set_item_ego_type(you.inv[5], OBJ_MISSILES, SPMSL_CURARE);
you.skills[SK_SHORT_BLADES] = 2;
@@ -6280,21 +6280,18 @@ bool _give_items_skills()
case SP_HILL_ORC:
case SP_MERFOLK:
_newgame_make_item(1, EQ_NONE, OBJ_MISSILES, MI_JAVELIN, -1, 6);
- _newgame_make_item(2, EQ_NONE, OBJ_MISSILES, MI_THROWING_NET, -1,
- 2);
+ _newgame_make_item(2, EQ_NONE, OBJ_MISSILES, MI_THROWING_NET, -1, 2);
break;
case SP_TROLL:
case SP_OGRE:
_newgame_make_item(1, EQ_NONE, OBJ_MISSILES, MI_LARGE_ROCK, -1, 5);
- _newgame_make_item(2, EQ_NONE, OBJ_MISSILES, MI_THROWING_NET, -1,
- 3);
+ _newgame_make_item(2, EQ_NONE, OBJ_MISSILES, MI_THROWING_NET, -1, 3);
break;
case SP_HALFLING:
case SP_KOBOLD:
_newgame_make_item(1, EQ_NONE, OBJ_WEAPONS, WPN_SLING);
- _newgame_make_item(2, EQ_NONE, OBJ_MISSILES, MI_SLING_BULLET, -1,
- 15 + random2avg(21, 5) + random2avg(15, 2));
+ _newgame_make_item(2, EQ_NONE, OBJ_MISSILES, MI_SLING_BULLET, -1, 30);
// Wield the sling instead.
you.equip[EQ_WEAPON] = 1;
@@ -6303,8 +6300,7 @@ bool _give_items_skills()
case SP_MOUNTAIN_DWARF:
case SP_DEEP_DWARF:
_newgame_make_item(1, EQ_NONE, OBJ_WEAPONS, WPN_CROSSBOW);
- _newgame_make_item(2, EQ_NONE, OBJ_MISSILES, MI_BOLT, -1,
- 15 + random2avg(21, 5));
+ _newgame_make_item(2, EQ_NONE, OBJ_MISSILES, MI_BOLT, -1, 25);
// Wield the crossbow instead.
you.equip[EQ_WEAPON] = 1;
@@ -6312,8 +6308,7 @@ bool _give_items_skills()
default:
_newgame_make_item(1, EQ_NONE, OBJ_WEAPONS, WPN_BOW);
- _newgame_make_item(2, EQ_NONE, OBJ_MISSILES, MI_ARROW, -1,
- 15 + random2avg(21, 5));
+ _newgame_make_item(2, EQ_NONE, OBJ_MISSILES, MI_ARROW, -1, 25);
// Wield the bow instead.
you.equip[EQ_WEAPON] = 1;
diff --git a/crawl-ref/source/player.cc b/crawl-ref/source/player.cc
index 049302d608..66610c33dd 100644
--- a/crawl-ref/source/player.cc
+++ b/crawl-ref/source/player.cc
@@ -3122,11 +3122,11 @@ void level_change(bool skip_attribute_increase)
int brek = 0;
if (new_exp > 21)
- brek = (coinflip() ? 3 : 2);
+ brek = 2 + new_exp % 2;
else if (new_exp > 12)
- brek = 3 + random2(3); // up from 2 + rand(3) -- bwr
+ brek = 4; // up from 2 + rand(3) -- bwr
else
- brek = 4 + random2(4); // up from 3 + rand(4) -- bwr
+ brek = 5 + new_exp % 2; // up from 3 + rand(4) -- bwr
you.experience_level = new_exp;
inc_hp(brek, true);