diff options
Diffstat (limited to 'crawl-ref/source/newgame.cc')
-rw-r--r-- | crawl-ref/source/newgame.cc | 170 |
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; |