summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source/newgame.cc
diff options
context:
space:
mode:
authorj-p-e-g <j-p-e-g@c06c8d41-db1a-0410-9941-cceddc491573>2008-06-26 13:41:10 +0000
committerj-p-e-g <j-p-e-g@c06c8d41-db1a-0410-9941-cceddc491573>2008-06-26 13:41:10 +0000
commitd6db41124871b21f6da082e80d976a71495b6996 (patch)
treeec1a93fb80830dcf3b73a65d86e7657aa7a3bfbf /crawl-ref/source/newgame.cc
parent61cae4a761c2f72cda44ae269c7007b37a0c14a7 (diff)
downloadcrawl-ref-d6db41124871b21f6da082e80d976a71495b6996.tar.gz
crawl-ref-d6db41124871b21f6da082e80d976a71495b6996.zip
Fix the character selecting omitting letters for restricted classes (as
opposed to banned ones). Tweak the code to enforce wearable body armour and shield types for all species. I'm afraid the skills need to be adjusted as well, probably in more detail, but I'm rather clueless on that account. git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@6147 c06c8d41-db1a-0410-9941-cceddc491573
Diffstat (limited to 'crawl-ref/source/newgame.cc')
-rw-r--r--crawl-ref/source/newgame.cc170
1 files changed, 86 insertions, 84 deletions
diff --git a/crawl-ref/source/newgame.cc b/crawl-ref/source/newgame.cc
index 439e91a98b..06e30a2c70 100644
--- a/crawl-ref/source/newgame.cc
+++ b/crawl-ref/source/newgame.cc
@@ -3026,10 +3026,13 @@ static void _make_rod(item_def &item, stave_type rod_type)
init_rod_mp(item);
}
+// Creates an item of a given base and sub type.
+// replacement is used when handing out armour that is not be wearable for
+// some species; otherwise use -1.
static void _newgame_make_item(int slot, equipment_type eqslot,
object_class_type base,
- int sub_type, int qty = 1,
- int plus = 0, int plus2 = 0)
+ int sub_type, int replacement = -1,
+ int qty = 1, int plus = 0, int plus2 = 0)
{
if (slot == -1)
{
@@ -3052,6 +3055,19 @@ static void _newgame_make_item(int slot, equipment_type eqslot,
item.plus2 = plus2;
item.special = 0;
+ // If the character is restricted in wearing armour of equipment slot
+ // eqslot, hand out replacement instead.
+ if (item.base_type == OBJ_ARMOUR && replacement != -1
+ && !you_can_wear(eqslot))
+ {
+ // Don't replace shields with bucklers for draconians and ogres.
+ if (sub_type != ARM_SHIELD
+ || !player_genus(GENPC_OGRE) && !player_genus(GENPC_DRACONIAN))
+ {
+ item.sub_type = replacement;
+ }
+ }
+
if (eqslot != EQ_NONE)
you.equip[eqslot] = slot;
}
@@ -3178,9 +3194,8 @@ static void _create_wanderer( void )
you.skills[SK_INVOCATIONS] = 0;
}
- // Ogres and draconians cannot wear armour.
- if ((you.species == SP_OGRE_MAGE || player_genus(GENPC_DRACONIAN))
- && you.skills[ SK_ARMOUR ])
+ // Some species cannot wear real armour.
+ if (you.skills[ SK_ARMOUR ] && !you_can_wear(EQ_BODY_ARMOUR))
{
do
{
@@ -3253,9 +3268,8 @@ static void _create_wanderer( void )
}
else if (you.skills[SK_SHIELDS] && wpn_skill != SK_STAVES)
{
- _newgame_make_item(4, EQ_SHIELD, OBJ_ARMOUR,
- (player_genus(GENPC_DRACONIAN) || you.species == SP_OGRE_MAGE) ?
- ARM_SHIELD : ARM_BUCKLER);
+ _newgame_make_item(4, EQ_SHIELD, OBJ_ARMOUR, ARM_SHIELD,
+ ARM_BUCKLER);
you.inv[3].quantity = 0; // remove potion
}
else
@@ -3600,7 +3614,7 @@ job_query:
int j = 0;
job_type which_job;
- bool good_choice = false;
+ bool good_choice;
for (int i = 0; i < num_classes; i++)
{
which_job = _get_class(i);
@@ -3614,14 +3628,13 @@ job_query:
&& _class_allowed(you.species, which_job) == CC_UNRESTRICTED)
{
textcolor(LIGHTGREY);
- good_choice = true;
}
else
textcolor(DARKGREY);
// Show banned classes but omit letter.
char letter;
- if (!good_choice)
+ if (_class_allowed(you.species, which_job) == CC_BANNED)
letter = ' ';
else
letter = index_to_letter(i);
@@ -3826,15 +3839,7 @@ bool _give_items_skills()
if (you.species == SP_OGRE)
_newgame_make_item(0, EQ_WEAPON, OBJ_WEAPONS, WPN_ANKUS);
else if (you.species == SP_TROLL)
- _newgame_clear_item(0);
- }
- else if (player_genus(GENPC_DRACONIAN))
- {
- if (!_choose_weapon())
- return (false);
-
- _newgame_make_item(1, EQ_BODY_ARMOUR, OBJ_ARMOUR, ARM_ROBE);
- _newgame_make_item(2, EQ_SHIELD, OBJ_ARMOUR, ARM_SHIELD);
+ _newgame_clear_item(0); // Trolls go unarmed.
}
else if (you.species == SP_HALFLING || you.species == SP_KOBOLD
|| you.species == SP_GNOME || you.species == SP_VAMPIRE)
@@ -3845,19 +3850,23 @@ bool _give_items_skills()
_newgame_make_item(1, EQ_BODY_ARMOUR, OBJ_ARMOUR,
ARM_LEATHER_ARMOUR);
- if (you.species != SP_VAMPIRE)
- {
- _newgame_make_item(2, EQ_NONE, OBJ_MISSILES, MI_DART,
- 10 + roll_dice( 2, 10 ));
- }
}
else
{
if (!_choose_weapon())
return (false);
- _newgame_make_item(1, EQ_BODY_ARMOUR, OBJ_ARMOUR, ARM_SCALE_MAIL);
- _newgame_make_item(2, EQ_SHIELD, OBJ_ARMOUR, ARM_SHIELD);
+ _newgame_make_item(1, EQ_BODY_ARMOUR, OBJ_ARMOUR, ARM_SCALE_MAIL,
+ ARM_ROBE);
+ _newgame_make_item(2, EQ_SHIELD, OBJ_ARMOUR, ARM_SHIELD,
+ ARM_BUCKLER);
+ }
+
+ // For small species, hand out some darts.
+ if (player_size(PSIZE_BODY) < SIZE_MEDIUM)
+ {
+ _newgame_make_item(2, EQ_NONE, OBJ_MISSILES, MI_DART, -1,
+ 10 + roll_dice( 2, 10 ));
}
you.skills[SK_FIGHTING] = 3;
@@ -3910,9 +3919,9 @@ bool _give_items_skills()
case JOB_WIZARD:
_newgame_make_item(0, EQ_WEAPON, OBJ_WEAPONS,
- you.species == SP_OGRE_MAGE? WPN_QUARTERSTAFF :
- player_genus(GENPC_DWARVEN)? WPN_HAMMER :
- WPN_DAGGER);
+ you.species == SP_OGRE_MAGE ? WPN_QUARTERSTAFF :
+ player_genus(GENPC_DWARVEN) ? WPN_HAMMER
+ : WPN_DAGGER);
_newgame_make_item(1, EQ_BODY_ARMOUR, OBJ_ARMOUR, ARM_ROBE);
@@ -3961,7 +3970,10 @@ bool _give_items_skills()
you.piety = 45;
if (you.species == SP_KOBOLD || you.species == SP_HALFLING)
- _newgame_make_item(0, EQ_WEAPON, OBJ_WEAPONS, WPN_KNIFE, 1, 1, 1);
+ {
+ _newgame_make_item(0, EQ_WEAPON, OBJ_WEAPONS, WPN_KNIFE, -1,
+ 1, 1, 1);
+ }
else
{
_newgame_make_item(0, EQ_WEAPON, OBJ_WEAPONS,
@@ -3972,7 +3984,7 @@ bool _give_items_skills()
_newgame_make_item(1, EQ_BODY_ARMOUR, OBJ_ARMOUR, ARM_ROBE);
if (you.is_undead != US_UNDEAD)
- _newgame_make_item(2, EQ_NONE, OBJ_POTIONS, POT_HEALING, 2);
+ _newgame_make_item(2, EQ_NONE, OBJ_POTIONS, POT_HEALING, -1, 2);
you.skills[SK_FIGHTING] = 2;
you.skills[SK_DODGING] = 1;
@@ -4121,7 +4133,7 @@ bool _give_items_skills()
_newgame_make_item(1, EQ_NONE, OBJ_WEAPONS, WPN_DAGGER);
_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,
+ _newgame_make_item(4, EQ_NONE, OBJ_MISSILES, MI_DART, -1,
10 + roll_dice( 2, 10 ));
you.skills[SK_FIGHTING] = 1;
@@ -4141,21 +4153,16 @@ bool _give_items_skills()
if (!_choose_weapon())
return (false);
- if (player_genus(GENPC_DRACONIAN) || you.species == SP_OGRE)
- {
- _newgame_make_item(1, EQ_BODY_ARMOUR, OBJ_ARMOUR, ARM_ANIMAL_SKIN);
- _newgame_make_item(2, EQ_SHIELD, OBJ_ARMOUR, ARM_SHIELD);
- }
- else
- {
- _newgame_make_item(1, EQ_BODY_ARMOUR, OBJ_ARMOUR,
- ARM_LEATHER_ARMOUR);
- _newgame_make_item(2, EQ_SHIELD, OBJ_ARMOUR, ARM_BUCKLER);
- }
+ _newgame_make_item(1, EQ_BODY_ARMOUR, OBJ_ARMOUR,
+ ARM_LEATHER_ARMOUR, ARM_ANIMAL_SKIN);
+
+ _newgame_make_item(2, EQ_SHIELD, OBJ_ARMOUR, ARM_SHIELD,
+ ARM_BUCKLER);
if (you.species != SP_KOBOLD)
{
- _newgame_make_item(3, EQ_NONE, OBJ_MISSILES, MI_THROWING_NET, 4);
+ _newgame_make_item(3, EQ_NONE, OBJ_MISSILES, MI_THROWING_NET, -1,
+ 4);
you.skills[SK_THROWING] = 1;
}
else
@@ -4189,7 +4196,7 @@ bool _give_items_skills()
_newgame_make_item(0, EQ_WEAPON, OBJ_WEAPONS, WPN_FALCHION);
_newgame_make_item(1, EQ_BODY_ARMOUR, OBJ_ARMOUR, ARM_ROBE);
- _newgame_make_item(2, EQ_SHIELD, OBJ_ARMOUR, ARM_SHIELD);
+ _newgame_make_item(2, EQ_SHIELD, OBJ_ARMOUR, ARM_SHIELD, ARM_BUCKLER);
_newgame_make_item(3, EQ_NONE, OBJ_POTIONS, POT_HEALING);
you.skills[SK_FIGHTING] = 2;
@@ -4202,8 +4209,8 @@ bool _give_items_skills()
break;
case JOB_ASSASSIN:
- _newgame_make_item(0, EQ_WEAPON, OBJ_WEAPONS, WPN_DAGGER, 1,
- 1 + to_hit_bonus, 1 + (2 - to_hit_bonus));
+ _newgame_make_item(0, EQ_WEAPON, OBJ_WEAPONS, WPN_DAGGER, -1,
+ 1, 1 + to_hit_bonus, 1 + (2 - to_hit_bonus));
_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);
@@ -4214,16 +4221,16 @@ bool _give_items_skills()
if (you.species == SP_DEEP_ELF)
{
you.inv[1].sub_type = WPN_HAND_CROSSBOW;
- _newgame_make_item(4, EQ_NONE, OBJ_MISSILES, MI_DART,
+ _newgame_make_item(4, EQ_NONE, OBJ_MISSILES, MI_DART, -1,
10 + roll_dice( 2, 10 ));
set_item_ego_type( you.inv[4], OBJ_MISSILES, SPMSL_POISONED );
}
else
{
- _newgame_make_item(4, EQ_NONE, OBJ_MISSILES, MI_NEEDLE,
+ _newgame_make_item(4, EQ_NONE, OBJ_MISSILES, MI_NEEDLE, -1,
5 + roll_dice(2, 5));
set_item_ego_type(you.inv[4], OBJ_MISSILES, SPMSL_POISONED);
- _newgame_make_item(5, EQ_NONE, OBJ_MISSILES, MI_NEEDLE,
+ _newgame_make_item(5, EQ_NONE, OBJ_MISSILES, MI_NEEDLE, -1,
1 + random2(4));
set_item_ego_type(you.inv[5], OBJ_MISSILES, SPMSL_CURARE);
}
@@ -4251,7 +4258,7 @@ bool _give_items_skills()
if (you.species == SP_OGRE)
_newgame_make_item(0, EQ_WEAPON, OBJ_WEAPONS, WPN_ANKUS);
else if (you.species == SP_TROLL)
- you.equip[EQ_WEAPON] = -1;
+ you.equip[EQ_WEAPON] = -1; // Trolls fight unarmed.
else
{
_newgame_make_item(0, EQ_WEAPON, OBJ_WEAPONS, WPN_HAND_AXE);
@@ -4260,9 +4267,8 @@ bool _give_items_skills()
}
// ARMOUR
- _newgame_make_item(1, EQ_BODY_ARMOUR, OBJ_ARMOUR, ARM_LEATHER_ARMOUR);
- if (!can_wear_armour(you.inv[1], false, true))
- you.inv[1].sub_type = ARM_ANIMAL_SKIN;
+ _newgame_make_item(1, EQ_BODY_ARMOUR, OBJ_ARMOUR, ARM_LEATHER_ARMOUR,
+ ARM_ANIMAL_SKIN);
// SKILLS
you.skills[SK_FIGHTING] = 2;
@@ -4271,7 +4277,7 @@ bool _give_items_skills()
{
// no wep - give them unarmed.
you.skills[SK_FIGHTING] += 3;
- you.skills[SK_DODGING] = 2;
+ you.skills[SK_DODGING] = 2;
you.skills[SK_UNARMED_COMBAT] = 2;
}
else if (you.species == SP_OGRE)
@@ -4281,21 +4287,18 @@ bool _give_items_skills()
}
else
{
- you.skills[SK_AXES] = 3;
- you.skills[SK_ARMOUR] = 2;
- you.skills[SK_DODGING] = 2;
+ you.skills[SK_AXES] = 3;
+ you.skills[SK_ARMOUR] = 2;
+ you.skills[SK_DODGING] = 2;
you.skills[SK_THROWING] = 2;
}
break;
case JOB_HUNTER:
_newgame_make_item(0, EQ_WEAPON, OBJ_WEAPONS, WPN_DAGGER);
- _newgame_make_item(2, EQ_BODY_ARMOUR, OBJ_ARMOUR, ARM_LEATHER_ARMOUR);
- if (!can_wear_armour(you.inv[2], false, true))
- {
- you.inv[2].sub_type =
- player_genus(GENPC_DRACONIAN)? ARM_ROBE : ARM_ANIMAL_SKIN;
- }
+ _newgame_make_item(2, EQ_BODY_ARMOUR, OBJ_ARMOUR, ARM_LEATHER_ARMOUR,
+ (player_genus(GENPC_DRACONIAN) ? ARM_ROBE
+ : ARM_ANIMAL_SKIN));
if (you.species == SP_MERFOLK)
{
@@ -4409,7 +4412,7 @@ bool _give_items_skills()
_newgame_make_item(2, EQ_NONE, OBJ_BOOKS, BOOK_CALLINGS);
you.skills[SK_SUMMONINGS] = 4;
// Gets some darts - this class is difficult to start off with.
- _newgame_make_item(3, EQ_NONE, OBJ_MISSILES, MI_DART,
+ _newgame_make_item(3, EQ_NONE, OBJ_MISSILES, MI_DART, -1,
8 + roll_dice( 2, 8 ));
break;
@@ -4423,7 +4426,7 @@ bool _give_items_skills()
you.skills[SK_ENCHANTMENTS] = 4;
// Gets some darts - this class is difficult to start off with.
- _newgame_make_item(3, EQ_NONE, OBJ_MISSILES, MI_DART,
+ _newgame_make_item(3, EQ_NONE, OBJ_MISSILES, MI_DART, -1,
8 + roll_dice( 2, 8 ), 1);
if (you.species == SP_SPRIGGAN)
@@ -4452,7 +4455,7 @@ bool _give_items_skills()
case JOB_EARTH_ELEMENTALIST:
_newgame_make_item(2, EQ_NONE, OBJ_BOOKS, BOOK_GEOMANCY);
- _newgame_make_item(3, EQ_NONE, OBJ_MISSILES, MI_STONE, 20);
+ _newgame_make_item(3, EQ_NONE, OBJ_MISSILES, MI_STONE, -1, 20);
if (you.species == SP_GNOME)
{
@@ -4522,14 +4525,14 @@ bool _give_items_skills()
case JOB_TRANSMUTER:
// Some sticks for sticks to snakes.
- _newgame_make_item(1, EQ_NONE, OBJ_MISSILES, MI_ARROW,
+ _newgame_make_item(1, EQ_NONE, OBJ_MISSILES, MI_ARROW, -1,
6 + roll_dice( 3, 4 ));
_newgame_make_item(2, EQ_BODY_ARMOUR, OBJ_ARMOUR, ARM_ROBE);
_newgame_make_item(3, EQ_NONE, OBJ_BOOKS, BOOK_CHANGES);
// A little bit of starting ammo for evaporate... don't need too
// much now that the character can make their own. -- bwr
- _newgame_make_item(4, EQ_NONE, OBJ_POTIONS, POT_CONFUSION, 2);
+ _newgame_make_item(4, EQ_NONE, OBJ_POTIONS, POT_CONFUSION, -1, 2);
_newgame_make_item(5, EQ_NONE, OBJ_POTIONS, POT_POISON);
you.equip[EQ_WEAPON] = -1;
@@ -4562,6 +4565,7 @@ bool _give_items_skills()
else
{
_newgame_make_item(0, EQ_WEAPON, OBJ_WEAPONS, WPN_SHORT_SWORD);
+
if (you.species == SP_OGRE_MAGE)
you.inv[0].sub_type = WPN_QUARTERSTAFF;
@@ -4569,18 +4573,14 @@ bool _give_items_skills()
you.skills[SK_FIGHTING] = 1;
}
- _newgame_make_item(1, EQ_BODY_ARMOUR, OBJ_ARMOUR, ARM_LEATHER_ARMOUR);
- if (you.species == SP_SPRIGGAN || you.species == SP_OGRE_MAGE
- || player_genus(GENPC_DRACONIAN))
- {
- you.inv[1].sub_type = ARM_ROBE;
- }
+ _newgame_make_item(1, EQ_BODY_ARMOUR, OBJ_ARMOUR, ARM_LEATHER_ARMOUR,
+ ARM_ROBE);
_newgame_make_item(2, EQ_NONE, OBJ_BOOKS, BOOK_SPATIAL_TRANSLOCATIONS);
// One free escape.
_newgame_make_item(3, EQ_NONE, OBJ_SCROLLS, SCR_BLINKING);
- _newgame_make_item(4, EQ_NONE, OBJ_MISSILES, MI_DART,
+ _newgame_make_item(4, EQ_NONE, OBJ_MISSILES, MI_DART, -1,
10 + roll_dice( 2, 10 ));
you.skills[SK_THROWING] = 1;
@@ -4767,8 +4767,8 @@ bool _give_items_skills()
break;
case JOB_CHAOS_KNIGHT:
- _newgame_make_item(0, EQ_WEAPON, OBJ_WEAPONS, WPN_SHORT_SWORD, 1,
- random2(3), random2(3));
+ _newgame_make_item(0, EQ_WEAPON, OBJ_WEAPONS, WPN_SHORT_SWORD, -1,
+ 1, random2(3), random2(3));
if (one_chance_in(5))
set_equip_desc( you.inv[0], ISFLAG_RUNED );
@@ -4780,8 +4780,8 @@ bool _give_items_skills()
return (false);
weap_skill = 2;
- _newgame_make_item(1, EQ_BODY_ARMOUR, OBJ_ARMOUR, ARM_ROBE, 1,
- random2(3));
+ _newgame_make_item(1, EQ_BODY_ARMOUR, OBJ_ARMOUR, ARM_ROBE, -1,
+ 1, random2(3));
you.skills[SK_FIGHTING] = 3;
you.skills[SK_ARMOUR] = 1;
@@ -4958,6 +4958,7 @@ bool _give_items_skills()
weap_skill = 3;
_newgame_make_item(1, EQ_BODY_ARMOUR, OBJ_ARMOUR, ARM_ROBE);
+
if (!_choose_book( you.inv[2], BOOK_CONJURATIONS_I, 2 ))
return (false);
@@ -4971,8 +4972,8 @@ bool _give_items_skills()
case JOB_STALKER:
to_hit_bonus = random2(3);
- _newgame_make_item(0, EQ_WEAPON, OBJ_WEAPONS, WPN_DAGGER, 1,
- 1 + to_hit_bonus, 1 + (2 - to_hit_bonus));
+ _newgame_make_item(0, EQ_WEAPON, OBJ_WEAPONS, WPN_DAGGER, -1,
+ 1, 1 + to_hit_bonus, 1 + (2 - to_hit_bonus));
_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);
@@ -4989,8 +4990,9 @@ bool _give_items_skills()
break;
case JOB_MONK:
+ you.equip[EQ_WEAPON] = -1; // Monks fight unarmed.
+
_newgame_make_item(0, EQ_BODY_ARMOUR, OBJ_ARMOUR, ARM_ROBE);
- you.equip[EQ_WEAPON] = -1;
you.skills[SK_FIGHTING] = 3;
you.skills[SK_UNARMED_COMBAT] = 4;