summaryrefslogtreecommitdiffstats
path: root/stone_soup/crawl-ref/source/newgame.cc
diff options
context:
space:
mode:
Diffstat (limited to 'stone_soup/crawl-ref/source/newgame.cc')
-rw-r--r--stone_soup/crawl-ref/source/newgame.cc4849
1 files changed, 0 insertions, 4849 deletions
diff --git a/stone_soup/crawl-ref/source/newgame.cc b/stone_soup/crawl-ref/source/newgame.cc
deleted file mode 100644
index 3a4a4e7a3d..0000000000
--- a/stone_soup/crawl-ref/source/newgame.cc
+++ /dev/null
@@ -1,4849 +0,0 @@
-/*
- * File: newgame.cc
- * Summary: Functions used when starting a new game.
- * Written by: Linley Henzell
- *
- * Modified for Crawl Reference by $Author$ on $Date$
- *
- * Change History (most recent first):
- *
- * <16> 19-Jun-2000 GDL changed handle to FILE *
- * <15> 06-Mar-2000 bwr changes to berserer, paladin, enchanter
- * <14> 10-Jan-2000 DLB class_allowed() lists excluded
- * species for all but hunters
- * some clean-up of init_player()
- * <13> 1/10/2000 BCR Made ogre berserkers get club
- * skill, Trolls get unarmed skill
- * Halflings can be assasins and
- * warpers
- * <12> 12/4/99 jmf Gave Paladins more armour skill + a
- * long sword (to compensate for
- * their inability to use poison).
- * Allowed Spriggan Stalkers (since
- * that's basically just a venom mage
- * + assassin, both of which are now
- * legal).
- * <11> 11/22/99 LRH Er, re-un-capitalised class
- * names (makes them distinguish-
- * able in score list)
- * <10> 10/31/99 CDL Allow Spriggan Assassins
- * Remove some old comments
- * <9> 10/12/99 BCR Made sure all the classes are
- * capitalized correctly.
- * <8> 9/09/99 BWR Changed character selection
- * screens look (added sub-species
- * menus from Dustin Ragan)
- * <7> 7/13/99 BWR Changed assassins to use
- * hand crossbows, changed
- * rangers into hunters.
- * <6> 6/22/99 BWR Added new rangers/slingers
- * <5> 6/17/99 BCR Removed some Linux/Mac filename
- * weirdness
- * <4> 6/13/99 BWR SysEnv support
- * <3> 6/11/99 DML Removed tmpfile purging.
- * <2> 5/20/99 BWR CRAWL_NAME, new berserk, upped
- * troll food consumption, added
- * demonspawn transmuters.
- * <1> -/--/-- LRH Created
- */
-
-#include "AppHdr.h"
-#include "newgame.h"
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <ctype.h>
-#include <time.h>
-
-#ifdef DOS
-#include <conio.h>
-#endif
-
-#ifdef UNIX
-#include <sys/types.h>
-#include <fcntl.h>
-#include <unistd.h>
-#endif
-
-#ifdef USE_EMX
-#include <sys/types.h>
-#include <fcntl.h>
-#include <unistd.h>
-#endif
-
-#ifdef OS9
-#include <stat.h>
-#else
-#include <sys/stat.h>
-#endif
-
-#include "externs.h"
-
-#include "abl-show.h"
-#include "dungeon.h"
-#include "files.h"
-#include "fight.h"
-#include "initfile.h"
-#include "itemname.h"
-#include "itemprop.h"
-#include "items.h"
-#include "macro.h"
-#include "player.h"
-#include "randart.h"
-#include "skills.h"
-#include "skills2.h"
-#include "spl-util.h"
-#include "stuff.h"
-#include "version.h"
-#include "wpn-misc.h"
-
-
-#define MIN_START_STAT 1
-
-bool class_allowed(unsigned char speci, int char_class);
-bool verifyPlayerName(void);
-void choose_weapon(void);
-void enterPlayerName(bool blankOK);
-void give_basic_knowledge(int which_job);
-void give_basic_spells(int which_job);
-void give_last_paycheck(int which_job);
-void init_player(void);
-void jobs_stat_init(int which_job);
-void openingScreen(void);
-void species_stat_init(unsigned char which_species);
-
-#if 0
-// currently unused -- bwr
-static void give_random_wand( int slot );
-static void give_random_scroll( int slot );
-#endif
-
-static void give_random_potion( int slot );
-static void give_random_secondary_armour( int slot );
-static bool give_wanderer_weapon( int slot, int wpn_skill );
-static void create_wanderer(void);
-static void give_items_skills(void);
-static bool choose_race(void);
-static bool choose_class(void);
-static char letter_to_species(int keyn);
-static char letter_to_class(int keyn);
-
-////////////////////////////////////////////////////////////////////////
-// Remember player's startup options
-//
-
-static char ng_race, ng_cls;
-static bool ng_random;
-static int ng_ck, ng_dk, ng_pr;
-static int ng_weapon;
-
-static void reset_newgame_options(void)
-{
- ng_race = ng_cls = 0;
- ng_random = false;
- ng_ck = GOD_NO_GOD;
- ng_dk = DK_NO_SELECTION;
- ng_pr = GOD_NO_GOD;
- ng_weapon = WPN_UNKNOWN;
-}
-
-static void save_newgame_options(void)
-{
- // Note that we store race and class directly here, whereas up until
- // now we've been storing the hotkey.
- Options.prev_race = ng_race;
- Options.prev_cls = ng_cls;
- Options.prev_randpick = ng_random;
- Options.prev_ck = ng_ck;
- Options.prev_dk = ng_dk;
- Options.prev_pr = ng_pr;
- Options.prev_weapon = ng_weapon;
-
- write_newgame_options_file();
-}
-
-static void set_startup_options(void)
-{
- Options.race = Options.prev_race;
- Options.cls = Options.prev_cls;
- Options.weapon = Options.prev_weapon;
- Options.death_knight = Options.prev_dk;
- Options.chaos_knight = Options.prev_ck;
- Options.priest = Options.prev_pr;
-}
-
-static bool prev_startup_options_set(void)
-{
- // Are these two enough? They should be, in theory, since we'll
- // remember the player's weapon and god choices.
- return Options.prev_race && Options.prev_cls;
-}
-
-static std::string get_opt_race_name(char race)
-{
- int prace = letter_to_species(race);
- return prace? species_name(prace, 1) : "Random";
-}
-
-static std::string get_opt_class_name(char oclass)
-{
- int pcls = letter_to_class(oclass);
- return pcls != JOB_UNKNOWN? get_class_name(pcls) : "Random";
-}
-
-static std::string prev_startup_description(void)
-{
- if (Options.prev_race == '?' && Options.prev_cls == '?')
- Options.prev_randpick = true;
-
- if (Options.prev_randpick)
- return "Random character";
-
- if (Options.prev_cls == '?')
- return "Random " + get_opt_race_name(Options.prev_race);
- return get_opt_race_name(Options.prev_race) + " " +
- get_opt_class_name(Options.prev_cls);
-}
-
-int give_first_conjuration_book()
-{
- // Assume the fire/earth book, as conjurations is strong with fire -- bwr
- int book = BOOK_CONJURATIONS_I;
-
- // Conjuration books are largely Fire or Ice, so we'll use
- // that as the primary condition, and air/earth to break ties. -- bwr
- if (you.skills[SK_ICE_MAGIC] > you.skills[SK_FIRE_MAGIC]
- || (you.skills[SK_FIRE_MAGIC] == you.skills[SK_ICE_MAGIC]
- && you.skills[SK_AIR_MAGIC] > you.skills[SK_EARTH_MAGIC]))
- {
- book = BOOK_CONJURATIONS_II;
- }
- else if (you.skills[SK_FIRE_MAGIC] == 0 && you.skills[SK_EARTH_MAGIC] == 0)
- {
- // If we're here its because we were going to default to the
- // fire/earth book... but we don't have those skills. So we
- // choose randomly based on the species weighting, again
- // ignoring air/earth which are secondary in these books. -- bwr
- if (random2( species_skills( SK_ICE_MAGIC, you.species ) )
- < random2( species_skills( SK_FIRE_MAGIC, you.species ) ))
- {
- book = BOOK_CONJURATIONS_II;
- }
- }
-
- return (book);
-}
-
-static void pick_random_species_and_class( void )
-{
- //
- // We pick both species and class at the same time to give each
- // valid possibility a fair chance. For proof that this will
- // work correctly see the proof in religion.cc:handle_god_time().
- //
- int job_count = 0;
-
- int species = -1;
- int job = -1;
-
- // for each valid (species, class) choose one randomly
- for (int sp = SP_HUMAN; sp < NUM_SPECIES; sp++)
- {
- // we only want draconians counted once in this loop...
- // we'll add the variety lower down -- bwr
- if (sp >= SP_WHITE_DRACONIAN && sp <= SP_BASE_DRACONIAN)
- continue;
-
- for (int cl = JOB_FIGHTER; cl < NUM_JOBS; cl++)
- {
- if (class_allowed(sp, cl))
- {
- job_count++;
- if (one_chance_in( job_count ))
- {
- species = sp;
- job = cl;
- }
- }
- }
- }
-
- // at least one job must exist in the game else we're in big trouble
- ASSERT( species != -1 && job != -1 );
-
- // return draconian variety here
- if (species == SP_RED_DRACONIAN)
- you.species = SP_RED_DRACONIAN + random2(9);
- else
- you.species = species;
-
- you.char_class = job;
-}
-
-static bool check_saved_game(void)
-{
- FILE *handle;
- char char_fil[kFileNameSize];
-
-#ifdef LOAD_UNPACKAGE_CMD
- // Create the file name base
- char name_buff[kFileNameLen];
-
- snprintf( name_buff, sizeof(name_buff),
- SAVE_DIR_PATH "%s%d", you.your_name, (int) getuid() );
-
- char zip_buff[kFileNameLen];
-
- strcpy(zip_buff, name_buff);
- strcat(zip_buff, PACKAGE_SUFFIX);
-
- // Create save dir name
- strcpy(char_fil, name_buff);
- strcat(char_fil, ".sav");
-
- handle = fopen(zip_buff, "rb+");
- if (handle != NULL)
- {
- cprintf(EOL "Loading game..." EOL);
-
- // Create command
- char cmd_buff[1024];
-
- snprintf( cmd_buff, sizeof(cmd_buff), LOAD_UNPACKAGE_CMD, name_buff );
-
- if (system( cmd_buff ) != 0)
- {
- cprintf( EOL "Warning: Zip command (LOAD_UNPACKAGE_CMD) returned non-zero value!" EOL );
- }
-
- fclose(handle);
-
- // Remove save game package
- unlink(zip_buff);
- }
- else
- {
-#ifdef DO_ANTICHEAT_CHECKS
- // Simple security patch -- must have zip file otherwise invalidate
- // the character. Right now this just renames the .sav file to
- // .bak, allowing anyone with the appropriate permissions to
- // fix a character in the case of a bug. This could be changed
- // to unlinking the file(s) which would remove the character.
- strcat(name_buff, ".bak");
- rename(char_fil, name_buff);
-#endif
- }
-
-#else
- strcpy(char_fil, "");
- strncat(char_fil, you.your_name, kFileNameLen);
- strcat(char_fil, ".sav");
-#endif
-
- handle = fopen(char_fil, "rb+");
-
- if (handle != NULL)
- {
- fclose(handle);
- return true;
- }
- return false;
-}
-
-bool new_game(void)
-{
- int i, j; // loop variables {dlb}
-
- //jmf: NEW ASSERTS: we ought to do a *lot* of these
- ASSERT(NUM_SPELLS < SPELL_NO_SPELL);
- ASSERT(NUM_JOBS < JOB_UNKNOWN);
- ASSERT(NUM_ATTRIBUTES >= 30);
-
- init_player();
-
- you.exp_available = 25; // now why is this all the way up here? {dlb}
-
- textcolor(LIGHTGREY);
-
- // copy name into you.your_name if set from environment --
- // note that you.your_name could already be set from init.txt
- // this, clearly, will overwrite such information {dlb}
- if (SysEnv.crawl_name)
- {
- strncpy( you.your_name, SysEnv.crawl_name, kNameLen );
- you.your_name[ kNameLen - 1 ] = '\0';
- }
-
- openingScreen();
- enterPlayerName(true);
-
- if (you.your_name[0] != '\0')
- {
- if (check_saved_game())
- {
- textcolor( BROWN );
- cprintf( EOL "Welcome back, " );
- textcolor( YELLOW );
- cprintf( you.your_name );
- cprintf( "!" );
- textcolor( LIGHTGREY );
-
- save_player_name();
- return (false);
- }
- }
-
- reset_newgame_options();
- if (Options.random_pick)
- {
- pick_random_species_and_class();
- ng_random = true;
- }
- else
- {
- while (choose_race() && !choose_class());
- }
-
- strcpy( you.class_name, get_class_name( you.char_class ) );
-
- // new: pick name _after_ race and class choices
- if (you.your_name[0] == '\0')
- {
- clrscr();
-
- char spec_buff[80];
- strncpy(spec_buff, species_name(you.species, you.experience_level), 80);
-
- snprintf( info, INFO_SIZE, "You are a%s %s %s." EOL,
- (is_vowel( spec_buff[0] )) ? "n" : "", spec_buff,
- you.class_name );
-
- cprintf( info );
-
- enterPlayerName(false);
-
- if (check_saved_game())
- {
- cprintf(EOL "Do you really want to overwrite your old game?");
- char c = getch();
- if (!(c == 'Y' || c == 'y'))
- {
- textcolor( BROWN );
- cprintf(EOL EOL "Welcome back, ");
- textcolor( YELLOW );
- cprintf(you.your_name);
- cprintf("!");
- textcolor( LIGHTGREY );
-
- return (false);
- }
- }
- }
-
-
-// ************ round-out character statistics and such ************
-
- species_stat_init( you.species ); // must be down here {dlb}
-
- you.is_undead = ((you.species == SP_MUMMY) ? US_UNDEAD :
- (you.species == SP_GHOUL) ? US_HUNGRY_DEAD : US_ALIVE);
-
- // before we get into the inventory init, set light radius based
- // on species vision. currently, all species see out to 8 squares.
- you.normal_vision = 8;
- you.current_vision = 8;
-
- jobs_stat_init( you.char_class );
- give_last_paycheck( you.char_class );
-
- // randomly boost stats a number of times based on species
- // - should be a function {dlb}
- unsigned char points_left = (you.species == SP_DEMIGOD
- || you.species == SP_DEMONSPAWN) ? 15 : 8;
-
- // first spend points to get us to the minimum allowed value -- bwr
- if (you.strength < MIN_START_STAT)
- {
- points_left -= (MIN_START_STAT - you.strength);
- you.strength = MIN_START_STAT;
- }
-
- if (you.intel < MIN_START_STAT)
- {
- points_left -= (MIN_START_STAT - you.intel);
- you.intel = MIN_START_STAT;
- }
-
- if (you.dex < MIN_START_STAT)
- {
- points_left -= (MIN_START_STAT - you.dex);
- you.dex = MIN_START_STAT;
- }
-
- // now randomly assign the remaining points --bwr
- while (points_left > 0)
- {
- switch (random2( NUM_STATS ))
- {
- case STAT_STRENGTH:
- if (you.strength > 17 && coinflip())
- continue;
-
- you.strength++;
- break;
-
- case STAT_DEXTERITY:
- if (you.dex > 17 && coinflip())
- continue;
-
- you.dex++;
- break;
-
- case STAT_INTELLIGENCE:
- if (you.intel > 17 && coinflip())
- continue;
-
- you.intel++;
- break;
- }
-
- points_left--;
- }
-
- // this function depends on stats being finalized
- give_items_skills();
-
- // then: adjust hp_max by species {dlb}
- if (player_genus(GENPC_DRACONIAN) || player_genus(GENPC_DWARVEN))
- inc_max_hp(1);
- else
- {
- switch (you.species)
- {
- case SP_CENTAUR:
- case SP_OGRE:
- case SP_TROLL:
- inc_max_hp(3);
- break;
-
- case SP_GHOUL:
- case SP_MINOTAUR:
- case SP_NAGA:
- case SP_OGRE_MAGE:
- case SP_DEMIGOD:
- inc_max_hp(2);
- break;
-
- case SP_HILL_ORC:
- case SP_MUMMY:
- case SP_MERFOLK:
- inc_max_hp(1);
- break;
-
- case SP_ELF:
- case SP_GREY_ELF:
- case SP_HIGH_ELF:
- dec_max_hp(1);
- break;
-
- case SP_DEEP_ELF:
- case SP_GNOME:
- case SP_HALFLING:
- case SP_KENKU:
- case SP_KOBOLD:
- case SP_SPRIGGAN:
- dec_max_hp(2);
- break;
-
- default:
- break;
- }
- }
-
- // then: adjust max_magic_points by species {dlb}
- switch (you.species)
- {
- case SP_SPRIGGAN:
- case SP_DEMIGOD:
- case SP_GREY_ELF:
- case SP_DEEP_ELF:
- inc_max_mp(1);
- break;
-
- default:
- break;
- }
-
- // these need to be set above using functions!!! {dlb}
- you.max_dex = you.dex;
- you.max_strength = you.strength;
- you.max_intel = you.intel;
-
- if (!you.is_undead)
- {
- for (i = 0; i < ENDOFPACK; i++)
- {
- if (!you.inv[i].quantity)
- {
- you.inv[i].quantity = 1;
- you.inv[i].base_type = OBJ_FOOD;
- you.inv[i].sub_type = FOOD_BREAD_RATION;
-
- if (you.species == SP_HILL_ORC || you.species == SP_KOBOLD
- || you.species == SP_OGRE || you.species == SP_TROLL)
- {
- you.inv[i].sub_type = FOOD_MEAT_RATION;
- }
-
- you.inv[i].colour = BROWN;
- break;
- }
- }
- }
-
- for (i = 0; i < ENDOFPACK; i++)
- {
- if (you.inv[i].quantity)
- {
- if (you.inv[i].base_type == OBJ_BOOKS)
- {
- you.had_book[you.inv[i].sub_type] = 1;
- if (you.inv[i].sub_type == BOOK_MINOR_MAGIC_I
- || you.inv[i].sub_type == BOOK_MINOR_MAGIC_II
- || you.inv[i].sub_type == BOOK_MINOR_MAGIC_III)
- {
- you.had_book[BOOK_MINOR_MAGIC_I] = 1;
- you.had_book[BOOK_MINOR_MAGIC_II] = 1;
- you.had_book[BOOK_MINOR_MAGIC_III] = 1;
- }
- if (you.inv[i].sub_type == BOOK_CONJURATIONS_I
- || you.inv[i].sub_type == BOOK_CONJURATIONS_II)
- {
- you.had_book[BOOK_CONJURATIONS_I] = 1;
- you.had_book[BOOK_CONJURATIONS_II] = 1;
- }
- }
-
- // don't change object type modifier unless it starts plain
- if (you.inv[i].base_type <= OBJ_ARMOUR
- && get_equip_race(you.inv[i]) == 0 ) // == DARM_PLAIN
- {
- // now add appropriate species type mod:
- switch (you.species)
- {
- case SP_ELF:
- case SP_HIGH_ELF:
- case SP_GREY_ELF:
- case SP_DEEP_ELF:
- case SP_SLUDGE_ELF:
- set_equip_race( you.inv[i], ISFLAG_ELVEN );
- break;
-
- case SP_HILL_DWARF:
- case SP_MOUNTAIN_DWARF:
- set_equip_race( you.inv[i], ISFLAG_DWARVEN );
- if (you.inv[i].colour == LIGHTCYAN)
- you.inv[i].colour = CYAN;
- break;
-
- case SP_HILL_ORC:
- set_equip_race( you.inv[i], ISFLAG_ORCISH );
- break;
- }
- }
- }
- }
-
- // must remember to check for already existing colours/combinations
- for (i = 0; i < 4; i++)
- {
- for (j = 0; j < 50; j++)
- {
- you.item_description[i][j] = 255;
- }
- }
-
- you.item_description[IDESC_POTIONS][POT_PORRIDGE] = 153; // "gluggy white"
- you.item_description[IDESC_POTIONS][POT_WATER] = 0; // "clear"
-
- int passout;
-
- for (i = 0; i < 4; i++)
- {
- for (j = 0; j < 50; j++)
- {
- if (you.item_description[i][j] != 255)
- continue;
-
- do
- {
- passout = 1;
-
- switch (i)
- {
- case IDESC_WANDS: // wands
- you.item_description[i][j] = random2( 16 * 12 );
- if (coinflip())
- you.item_description[i][j] %= 12;
- break;
-
- case IDESC_POTIONS: // potions
- you.item_description[i][j] = random2( 15 * 14 );
- if (coinflip())
- you.item_description[i][j] %= 14;
- break;
-
- case IDESC_SCROLLS: // scrolls
- you.item_description[i][j] = random2(151);
- you.item_description[IDESC_SCROLLS_II][j] = random2(151);
- break;
-
- case IDESC_RINGS: // rings
- you.item_description[i][j] = random2( 13 * 13 );
- if (coinflip())
- you.item_description[i][j] %= 13;
- break;
- }
-
- // don't have p < j because some are preassigned
- for (int p = 0; p < 50; p++)
- {
- if (you.item_description[i][p] == you.item_description[i][j]
- && j != p)
- {
- passout = 0;
- }
- }
- }
- while (passout == 0);
- }
- }
-
- for (i = 0; i < 50; i++)
- {
- if (!you.skills[i])
- continue;
-
- // Start with the amount of skill points required for a human...
- const int points = skill_exp_needed( you.skills[i] + 1 );
-
- you.skill_points[i] = points + 1;
-
- if (i == SK_SPELLCASTING)
- you.skill_points[i] = (points * 130) / 100 + 1;
- else if (i == SK_INVOCATIONS || i == SK_EVOCATIONS)
- you.skill_points[i] = (points * 75) / 100 + 1;
-
- // ...and find out what level that earns this character.
- const int sp_diff = species_skills( i, you.species );
- you.skills[i] = 0;
-
- for (int lvl = 1; lvl <= 8; lvl++)
- {
- if (you.skill_points[i] > (skill_exp_needed(lvl+1) * sp_diff) / 100)
- you.skills[i] = lvl;
- else
- break;
- }
- }
-
- calc_total_skill_points();
-
- for (i = 0; i < ENDOFPACK; i++)
- {
- if (you.inv[i].base_type != OBJ_WEAPONS)
- {
- set_ident_type( you.inv[i].base_type,
- you.inv[i].sub_type, ID_KNOWN_TYPE );
- }
-
- if (you.inv[i].base_type == OBJ_POTIONS
- || you.inv[i].base_type == OBJ_WANDS
- || you.inv[i].base_type == OBJ_JEWELLERY)
- {
- item_colour( you.inv[i] ); // set correct special and colour
- }
-
- if (is_valid_item(you.inv[i]))
- {
- you.inv[i].slot = index_to_letter(you.inv[i].link);
- }
- }
- // Brand items as original equipment.
- origin_set_inventory(origin_set_startequip);
-
- // we calculate hp and mp here; all relevant factors should be
- // finalized by now (GDL)
- calc_hp();
- calc_mp();
-
- // make sure the starting player is fully charged up
- set_hp( you.hp_max, false );
- set_mp( you.max_magic_points, false );
-
- give_basic_spells(you.char_class);
- give_basic_knowledge(you.char_class);
-
- // tmpfile purging removed in favour of marking
- for (int lvl = 0; lvl < MAX_LEVELS; lvl++)
- {
- for (int dng = 0; dng < MAX_BRANCHES; dng++)
- {
- tmp_file_pairs[lvl][dng] = false;
- }
- }
-
- // places staircases to the branch levels:
- for (i = 0; i < 30; i++)
- {
- you.branch_stairs[i] = 100;
- }
-
- you.branch_stairs[STAIRS_ECUMENICAL_TEMPLE] = 3 + random2(4); // avg: 4.5
-
- you.branch_stairs[STAIRS_ORCISH_MINES] = 5 + random2(6); // avg: 7.5
-
- you.branch_stairs[STAIRS_ELVEN_HALLS] =
- you.branch_stairs[STAIRS_ORCISH_MINES] + (coinflip() ? 4 : 3); // 11.0
-
- you.branch_stairs[STAIRS_LAIR] = 7 + random2(6); // avg: 9.5
-
- you.branch_stairs[STAIRS_HIVE] = 10 + random2(6); // avg: 12.5
-
- you.branch_stairs[STAIRS_SLIME_PITS] =
- you.branch_stairs[STAIRS_LAIR] + 3 + random2(4); // avg: 14.0
-
- you.branch_stairs[STAIRS_SWAMP] =
- you.branch_stairs[STAIRS_LAIR] + 2 + random2(6); // avg: 14.0
-
- you.branch_stairs[STAIRS_SNAKE_PIT] =
- you.branch_stairs[STAIRS_LAIR] + (coinflip() ? 7 : 6); // avg: 16.0
-
- you.branch_stairs[STAIRS_VAULTS] = 13 + random2(6); // avg: 15.5
-
- you.branch_stairs[STAIRS_CRYPT] =
- you.branch_stairs[STAIRS_VAULTS] + 2 + random2(3); // avg: 18.5
-
- you.branch_stairs[STAIRS_HALL_OF_BLADES] =
- you.branch_stairs[STAIRS_VAULTS] + 4; // avg: 19.5
-
- you.branch_stairs[STAIRS_TOMB] =
- you.branch_stairs[STAIRS_CRYPT] + ((coinflip()) ? 3 : 2); // avg: 20.0
-
- you.branch_stairs[STAIRS_HALL_OF_ZOT] = 26; // always 26
-
- save_newgame_options();
- return (true);
-} // end of new_game()
-
-static bool species_is_undead( unsigned char speci )
-{
- return (speci == SP_MUMMY || speci == SP_GHOUL);
-}
-
-bool class_allowed( unsigned char speci, int char_class )
-{
- switch (char_class)
- {
- case JOB_FIGHTER:
- switch (speci)
- {
- case SP_OGRE_MAGE:
- case SP_SPRIGGAN:
- return false;
- }
- return true;
-
- case JOB_WIZARD:
- if (species_is_undead( speci ))
- return false;
-
- switch (speci)
- {
- case SP_GNOME:
- case SP_HALFLING:
- case SP_HILL_DWARF:
- case SP_HILL_ORC:
- case SP_KENKU:
- case SP_KOBOLD:
- case SP_MINOTAUR:
- case SP_OGRE:
- case SP_SPRIGGAN:
- case SP_TROLL:
- return false;
- }
- return true;
-
- case JOB_PRIEST:
- if (player_genus(GENPC_DRACONIAN, speci))
- return false;
- if (species_is_undead( speci ))
- return false;
-
- switch (speci)
- {
- case SP_CENTAUR:
- case SP_DEMIGOD:
- case SP_DEMONSPAWN:
- case SP_GNOME:
- case SP_HALFLING:
- case SP_KENKU:
- case SP_KOBOLD:
- case SP_MINOTAUR:
- case SP_NAGA:
- case SP_OGRE:
- case SP_OGRE_MAGE:
- case SP_SPRIGGAN:
- case SP_TROLL:
- return false;
- }
- return true;
-
- case JOB_THIEF:
- if (species_is_undead( speci ))
- return false;
-
- switch (speci)
- {
- case SP_CENTAUR:
- case SP_KENKU:
- case SP_MINOTAUR:
- case SP_OGRE:
- case SP_OGRE_MAGE:
- case SP_SPRIGGAN:
- case SP_TROLL:
- return false;
- }
- return true;
-
- case JOB_GLADIATOR:
- if (player_genus(GENPC_ELVEN, speci))
- return false;
- if (species_is_undead( speci ))
- return false;
-
- switch (speci)
- {
- case SP_GNOME:
- case SP_HALFLING:
- case SP_KOBOLD:
- case SP_NAGA:
- case SP_OGRE:
- case SP_OGRE_MAGE:
- case SP_SPRIGGAN:
- case SP_TROLL:
- return false;
- }
- return true;
-
- case JOB_NECROMANCER:
- if (player_genus(GENPC_DWARVEN, speci))
- return false;
- if (player_genus(GENPC_DRACONIAN, speci))
- return false;
-
- switch (speci)
- {
- case SP_CENTAUR:
- case SP_ELF:
- case SP_GHOUL:
- case SP_GNOME:
- case SP_GREY_ELF:
- case SP_HALFLING:
- case SP_HIGH_ELF:
- case SP_MINOTAUR:
- case SP_OGRE:
- case SP_SPRIGGAN:
- case SP_TROLL:
- case SP_MERFOLK:
- return false;
- }
- return true;
-
- case JOB_PALADIN:
- switch (speci)
- {
- case SP_HUMAN:
- case SP_MOUNTAIN_DWARF:
- case SP_HIGH_ELF:
- return true;
- }
- return false;
-
- case JOB_ASSASSIN:
- if (player_genus(GENPC_DWARVEN, speci))
- return false;
- if (player_genus(GENPC_DRACONIAN, speci))
- return false;
-
- switch (speci)
- {
- case SP_CENTAUR:
- case SP_GHOUL:
- case SP_GNOME:
- case SP_MINOTAUR:
- case SP_OGRE:
- case SP_OGRE_MAGE:
- case SP_TROLL:
- return false;
- }
- return true;
-
- case JOB_BERSERKER:
- if (player_genus(GENPC_ELVEN, speci))
- return false;
- if (player_genus(GENPC_DRACONIAN, speci))
- return false;
- if (species_is_undead( speci ))
- return false;
-
- switch (speci)
- {
- case SP_DEMIGOD:
- case SP_GNOME:
- case SP_HALFLING:
- case SP_KENKU:
- case SP_KOBOLD:
- case SP_MOUNTAIN_DWARF:
- case SP_NAGA:
- case SP_OGRE_MAGE:
- case SP_SPRIGGAN:
- case SP_MERFOLK:
- return false;
- }
- return true;
-
- case JOB_HUNTER:
- if (player_genus(GENPC_DRACONIAN, speci)) // use bows
- return true;
- if (player_genus(GENPC_DWARVEN, speci)) // use xbows
- return true;
-
- switch (speci)
- {
- // bows --
- case SP_CENTAUR:
- case SP_DEMIGOD:
- case SP_DEMONSPAWN:
- case SP_ELF:
- case SP_GREY_ELF:
- case SP_HIGH_ELF:
- case SP_HUMAN:
- case SP_KENKU:
- case SP_MINOTAUR:
- case SP_NAGA:
- case SP_SLUDGE_ELF:
- // xbows --
- case SP_HILL_ORC:
- // slings --
- case SP_GNOME:
- case SP_HALFLING:
- // spear
- case SP_MERFOLK:
- return true;
- }
- return false;
-
- case JOB_CONJURER:
- if (species_is_undead( speci ))
- return false;
-
- switch (speci)
- {
- case SP_CENTAUR:
- case SP_GNOME:
- case SP_HALFLING:
- case SP_KOBOLD:
- case SP_MINOTAUR:
- case SP_OGRE:
- case SP_SPRIGGAN:
- case SP_TROLL:
- case SP_MERFOLK:
- case SP_SLUDGE_ELF:
- return false;
- }
- return true;
-
- case JOB_ENCHANTER:
- if (player_genus(GENPC_DRACONIAN, speci))
- return false;
- if (species_is_undead( speci ))
- return false;
-
- switch (speci)
- {
- case SP_GNOME:
- case SP_HILL_ORC:
- case SP_KENKU:
- case SP_KOBOLD:
- case SP_MINOTAUR:
- case SP_OGRE:
- case SP_TROLL:
- case SP_SLUDGE_ELF:
- return false;
- }
- return true;
-
- case JOB_FIRE_ELEMENTALIST:
- if (player_genus(GENPC_DRACONIAN, speci))
- return false;
- if (species_is_undead( speci ))
- return false;
-
- switch (speci)
- {
- case SP_GNOME:
- case SP_GREY_ELF:
- case SP_HALFLING:
- case SP_KOBOLD:
- case SP_MINOTAUR:
- case SP_NAGA:
- case SP_OGRE:
- case SP_SPRIGGAN:
- case SP_TROLL:
- case SP_MERFOLK:
- return false;
- }
- return true;
-
- case JOB_ICE_ELEMENTALIST:
- if (player_genus(GENPC_DWARVEN, speci))
- return false;
- if (player_genus(GENPC_DRACONIAN, speci))
- return false;
- if (species_is_undead( speci ))
- return false;
-
- switch (speci)
- {
- case SP_GNOME:
- case SP_GREY_ELF:
- case SP_HALFLING:
- case SP_HILL_ORC:
- case SP_KENKU:
- case SP_KOBOLD:
- case SP_MINOTAUR:
- case SP_NAGA:
- case SP_OGRE:
- case SP_SPRIGGAN:
- case SP_TROLL:
- return false;
- }
- return true;
-
- case JOB_SUMMONER:
- if (player_genus(GENPC_DWARVEN, speci))
- return false;
- if (species_is_undead( speci ))
- return false;
-
- switch (speci)
- {
- case SP_CENTAUR:
- case SP_GNOME:
- case SP_HALFLING:
- case SP_MINOTAUR:
- case SP_OGRE:
- case SP_SPRIGGAN:
- case SP_TROLL:
- return false;
- }
- return true;
-
- case JOB_AIR_ELEMENTALIST:
- if (player_genus(GENPC_DWARVEN, speci))
- return false;
- if (player_genus(GENPC_DRACONIAN, speci))
- return false;
- if (species_is_undead( speci ))
- return false;
-
- switch (speci)
- {
- case SP_GNOME:
- case SP_HALFLING:
- case SP_HILL_ORC:
- case SP_KOBOLD:
- case SP_MINOTAUR:
- case SP_NAGA:
- case SP_OGRE:
- case SP_SPRIGGAN:
- case SP_TROLL:
- case SP_MERFOLK:
- return false;
- }
- return true;
-
- case JOB_EARTH_ELEMENTALIST:
- if (player_genus(GENPC_DRACONIAN, speci))
- return false;
- if (species_is_undead( speci ))
- return false;
-
- switch (speci)
- {
- case SP_ELF:
- case SP_GREY_ELF:
- case SP_HALFLING:
- case SP_HIGH_ELF:
- case SP_KENKU:
- case SP_KOBOLD:
- case SP_MINOTAUR:
- case SP_NAGA:
- case SP_OGRE:
- case SP_SPRIGGAN:
- case SP_TROLL:
- case SP_MERFOLK:
- return false;
- }
- return true;
-
- case JOB_CRUSADER:
- if (player_genus(GENPC_DWARVEN, speci))
- return false;
- if (species_is_undead( speci ))
- return false;
- if (player_genus(GENPC_DRACONIAN, speci))
- return false;
-
- switch (speci)
- {
- case SP_GNOME:
- //case SP_HALFLING: //jmf: they're such good enchanters...
- case SP_KENKU:
- case SP_KOBOLD:
- case SP_MINOTAUR:
- case SP_NAGA:
- case SP_OGRE:
- case SP_SPRIGGAN:
- case SP_TROLL:
- case SP_MERFOLK:
- case SP_SLUDGE_ELF:
- return false;
- }
- return true;
-
- case JOB_DEATH_KNIGHT:
- if (player_genus(GENPC_DWARVEN, speci))
- return false;
-
- switch (speci)
- {
- case SP_ELF:
- case SP_GHOUL:
- case SP_GNOME:
- case SP_GREY_ELF:
- case SP_HALFLING:
- case SP_HIGH_ELF:
- // case SP_KOBOLD:
- case SP_MINOTAUR:
- case SP_OGRE:
- case SP_OGRE_MAGE:
- case SP_SPRIGGAN:
- case SP_TROLL:
- case SP_MERFOLK:
- return false;
- }
- return true;
-
- case JOB_VENOM_MAGE:
- if (player_genus(GENPC_DWARVEN, speci))
- return false;
- if (species_is_undead( speci ))
- return false;
-
- switch (speci)
- {
- case SP_CENTAUR:
- case SP_ELF:
- case SP_GNOME:
- case SP_GREY_ELF:
- case SP_HALFLING:
- case SP_HIGH_ELF:
- case SP_MINOTAUR:
- case SP_OGRE:
- case SP_TROLL:
- return false;
- }
- return true;
-
- case JOB_CHAOS_KNIGHT:
- if (player_genus(GENPC_DWARVEN, speci))
- return false;
- if (species_is_undead( speci ))
- return false;
-
- switch (speci)
- {
- case SP_DEMIGOD:
- case SP_GNOME:
- case SP_GREY_ELF:
- case SP_HALFLING:
- case SP_KENKU:
- case SP_OGRE:
- case SP_OGRE_MAGE:
- case SP_SPRIGGAN:
- case SP_TROLL:
- case SP_MERFOLK:
- return false;
- }
- return true;
-
- case JOB_TRANSMUTER:
- if (species_is_undead( speci ))
- return false;
-
- switch (speci)
- {
- case SP_HALFLING:
- case SP_HILL_DWARF:
- case SP_HILL_ORC:
- case SP_KENKU:
- case SP_MINOTAUR:
- case SP_OGRE:
- case SP_TROLL:
- return false;
- }
- return true;
-
- case JOB_HEALER:
- if (player_genus(GENPC_DRACONIAN, speci))
- return false;
- if (species_is_undead( speci ))
- return false;
-
- switch (speci)
- {
- case SP_DEMIGOD:
- case SP_DEMONSPAWN:
- case SP_GNOME:
- case SP_HALFLING:
- case SP_KENKU:
- case SP_KOBOLD:
- case SP_MINOTAUR:
- case SP_NAGA:
- case SP_OGRE:
- case SP_OGRE_MAGE:
- case SP_SPRIGGAN:
- case SP_TROLL:
- return false;
- }
- return true;
-
- case JOB_REAVER:
- if (species_is_undead( speci ))
- return false;
-
- switch (speci)
- {
- case SP_GNOME:
- case SP_GREY_ELF:
- case SP_HALFLING:
- case SP_HILL_DWARF:
- case SP_MINOTAUR:
- case SP_MOUNTAIN_DWARF:
- case SP_OGRE:
- case SP_OGRE_MAGE:
- case SP_SPRIGGAN:
- case SP_TROLL:
- case SP_MERFOLK:
- case SP_SLUDGE_ELF:
- return false;
- }
- return true;
-
- case JOB_STALKER:
- if (player_genus(GENPC_DWARVEN, speci))
- return false;
- if (player_genus(GENPC_DRACONIAN, speci))
- return false;
- if (species_is_undead( speci ))
- return false;
-
- switch (speci)
- {
- case SP_CENTAUR:
- case SP_GNOME:
- case SP_HALFLING:
- case SP_MINOTAUR:
- case SP_OGRE:
- case SP_OGRE_MAGE:
- case SP_TROLL:
- return false;
- }
- return true;
-
- case JOB_MONK:
- if (species_is_undead( speci ))
- return false;
-
- switch (speci)
- {
- case SP_CENTAUR:
- case SP_GNOME:
- case SP_HILL_DWARF:
- case SP_KOBOLD:
- case SP_NAGA:
- case SP_OGRE:
- case SP_OGRE_MAGE:
- case SP_SPRIGGAN:
- case SP_TROLL:
- return false;
- }
- return true;
-
- case JOB_WARPER:
- if (player_genus(GENPC_DWARVEN, speci))
- return false;
- if (player_genus(GENPC_DRACONIAN, speci))
- return false;
- if (species_is_undead( speci ))
- return false;
-
- switch (speci)
- {
- case SP_CENTAUR:
- case SP_GNOME:
- case SP_HILL_ORC:
- case SP_HALFLING:
- case SP_KENKU:
- case SP_MINOTAUR:
- case SP_OGRE:
- case SP_TROLL:
- case SP_MERFOLK:
- return false;
- }
- return true;
-
- case JOB_WANDERER:
- switch (speci)
- {
- case SP_HUMAN:
- case SP_DEMIGOD:
- case SP_DEMONSPAWN:
- case SP_GHOUL:
- return true;
- }
- return false;
-
- case JOB_QUITTER: // shouldn't happen since 'x' is handled specially
- default:
- return false;
- }
-} // end class_allowed()
-
-static char startwep[5] = { WPN_SHORT_SWORD, WPN_MACE,
- WPN_HAND_AXE, WPN_SPEAR, WPN_TRIDENT };
-
-void choose_weapon( void )
-{
- char wepName[ ITEMNAME_SIZE ];
- unsigned char keyin = 0;
- int num_choices = 4;
- int temp_rand; // probability determination {dlb}
-
- if (you.char_class == JOB_CHAOS_KNIGHT)
- {
- temp_rand = random2(4);
-
- you.inv[0].sub_type = ((temp_rand == 0) ? WPN_SHORT_SWORD :
- (temp_rand == 1) ? WPN_MACE :
- (temp_rand == 2) ? WPN_HAND_AXE : WPN_SPEAR);
- return;
- }
-
- if (you.char_class == JOB_GLADIATOR || you.species == SP_MERFOLK)
- num_choices = 5;
-
- if (Options.weapon != WPN_UNKNOWN && Options.weapon != WPN_RANDOM
- && (Options.weapon != WPN_TRIDENT || num_choices == 5))
- {
- you.inv[0].sub_type = Options.weapon;
- ng_weapon = Options.weapon;
- return;
- }
-
- if (!Options.random_pick && Options.weapon != WPN_RANDOM)
- {
- clrscr();
-
- textcolor( CYAN );
- cprintf(EOL " You have a choice of weapons:" EOL);
- textcolor( LIGHTGREY );
-
- bool prevmatch = false;
- for(int i=0; i<num_choices; i++)
- {
- int x = effective_stat_bonus(startwep[i]);
- standard_name_weap(startwep[i], wepName);
-
- snprintf( info, INFO_SIZE, "%c - %s%s" EOL, 'a' + i, wepName,
- (x <= -4) ? " (not ideal)" : "" );
-
- cprintf(info);
-
- if (Options.prev_weapon == startwep[i])
- prevmatch = true;
- }
- if (!prevmatch && Options.prev_weapon != WPN_RANDOM)
- Options.prev_weapon = WPN_UNKNOWN;
-
- textcolor(BROWN);
- cprintf(EOL "? - Random" );
- if (Options.prev_weapon != WPN_UNKNOWN)
- {
- char weapbuf[ITEMNAME_SIZE];
- if (Options.prev_weapon != WPN_RANDOM)
- standard_name_weap(Options.prev_weapon, weapbuf);
- cprintf("; Enter - %s",
- Options.prev_weapon == WPN_RANDOM? "Random" :
- weapbuf);
- }
- cprintf(EOL);
-
- do
- {
- textcolor( CYAN );
- cprintf(EOL "Which weapon? ");
- textcolor( LIGHTGREY );
-
- keyin = get_ch();
- }
- while (keyin != '?' &&
- ((keyin != '\r' && keyin != '\n')
- || Options.prev_weapon == WPN_UNKNOWN) &&
- (keyin < 'a' || keyin > ('a' + num_choices)));
-
- if (keyin == '\r' || keyin == '\n')
- {
- if (Options.prev_weapon == WPN_RANDOM)
- keyin = '?';
- else
- {
- for (int i = 0; i < num_choices; ++i)
- if (startwep[i] == Options.prev_weapon)
- keyin = 'a' + i;
- }
- }
-
- if (keyin != '?' && effective_stat_bonus(startwep[keyin-'a']) > -4)
- cprintf(EOL "A fine choice. " EOL);
- }
-
- if (Options.random_pick || Options.weapon == WPN_RANDOM || keyin == '?')
- {
- Options.weapon = WPN_RANDOM;
- // 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';
- }
-
- you.inv[0].sub_type = startwep[keyin-'a'];
- ng_weapon = (Options.random_pick ||
- Options.weapon == WPN_RANDOM ||
- keyin == '?')
- ? WPN_RANDOM : you.inv[0].sub_type;
-}
-
-void init_player(void)
-{
- unsigned char i = 0; // loop variable
-
- you.birth_time = time( NULL );
- you.real_time = 0;
- you.num_turns = 0;
-
-#ifdef WIZARD
- you.wizard = (Options.wiz_mode == WIZ_YES) ? true : false;
-#else
- you.wizard = false;
-#endif
-
- you.activity = ACT_NONE;
- you.berserk_penalty = 0;
- you.berserker = 0;
- you.conf = 0;
- you.confusing_touch = 0;
- you.deaths_door = 0;
- you.disease = 0;
- you.elapsed_time = 0;
- you.exhausted = 0;
- you.haste = 0;
- you.invis = 0;
- you.levitation = 0;
- you.might = 0;
- you.paralysis = 0;
- you.poison = 0;
- you.rotting = 0;
- you.fire_shield = 0;
- you.slow = 0;
- you.special_wield = SPWLD_NONE;
- you.sure_blade = 0;
- you.synch_time = 0;
-
- you.base_hp = 5000;
- you.base_hp2 = 5000;
- you.base_magic_points = 5000;
- you.base_magic_points2 = 5000;
-
- you.magic_points_regeneration = 0;
- you.strength = 0;
- you.max_strength = 0;
- you.intel = 0;
- you.max_intel = 0;
- you.dex = 0;
- you.max_dex = 0;
- you.experience = 0;
- you.experience_level = 1;
- you.max_level = 1;
- you.char_class = JOB_UNKNOWN;
-
- you.hunger = 6000;
- you.hunger_state = HS_SATIATED;
-
- you.gold = 0;
- // you.speed = 10; // 0.75; // unused
-
- you.burden = 0;
- you.burden_state = BS_UNENCUMBERED;
-
- you.spell_no = 0;
-
- you.your_level = 0;
- you.level_type = LEVEL_DUNGEON;
- you.where_are_you = BRANCH_MAIN_DUNGEON;
- you.char_direction = DIR_DESCENDING;
-
- you.prev_targ = MHITNOT;
- you.pet_target = MHITNOT;
-
- you.x_pos = 0;
- you.y_pos = 0;
-
- you.running = 0;
- you.run_x = 0;
- you.run_y = 0;
- you.travel_x = 0;
- you.travel_y = 0;
-
- for (i = 0; i < 3; i++)
- {
- you.run_check[i].grid = 0;
- you.run_check[i].dx = 0;
- you.run_check[i].dy = 0;
- }
-
- you.religion = GOD_NO_GOD;
- you.piety = 0;
-
- you.gift_timeout = 0;
-
- for (i = 0; i < MAX_NUM_GODS; i++)
- {
- you.penance[i] = 0;
- you.worshipped[i] = 0;
- you.num_gifts[i] = 0;
- }
-
- ghost.name[0] = '\0';
-
- for (i = 0; i < NUM_GHOST_VALUES; i++)
- ghost.values[i] = 0;
-
- for (i = EQ_WEAPON; i < NUM_EQUIP; i++)
- you.equip[i] = -1;
-
- for (i = 0; i < 25; i++)
- you.spells[i] = SPELL_NO_SPELL;
-
- for (i = 0; i < 52; i++)
- {
- you.spell_letter_table[i] = -1;
- you.ability_letter_table[i] = ABIL_NON_ABILITY;
- }
-
- for (i = 0; i < 100; i++)
- you.mutation[i] = 0;
-
- for (i = 0; i < 100; i++)
- you.demon_pow[i] = 0;
-
- for (i = 0; i < 50; i++)
- you.had_book[i] = 0;
-
- for (i = 0; i < 50; i++)
- you.unique_items[i] = UNIQ_NOT_EXISTS;
-
- for (i = 0; i < NO_UNRANDARTS; i++)
- set_unrandart_exist(i, 0);
-
- for (i = 0; i < 50; i++)
- {
- you.skills[i] = 0;
- you.skill_points[i] = 0;
- you.skill_order[i] = MAX_SKILL_ORDER;
- you.practise_skill[i] = 1;
- }
-
- you.skill_cost_level = 1;
- you.total_skill_points = 0;
-
- for (i = 0; i < 30; i++)
- you.attribute[i] = 0;
-
- for (i = 0; i < ENDOFPACK; i++)
- {
- you.inv[i].quantity = 0;
- you.inv[i].base_type = OBJ_WEAPONS;
- you.inv[i].sub_type = WPN_CLUB;
- you.inv[i].plus = 0;
- you.inv[i].plus2 = 0;
- you.inv[i].special = 0;
- you.inv[i].colour = 0;
- set_ident_flags( you.inv[i], ISFLAG_IDENT_MASK );
-
- you.inv[i].x = -1;
- you.inv[i].y = -1;
- you.inv[i].link = i;
- }
-
- for (i = 0; i < NUM_DURATIONS; i++)
- you.duration[i] = 0;
-}
-
-void give_last_paycheck(int which_job)
-{
- switch (which_job)
- {
- case JOB_HEALER:
- case JOB_THIEF:
- you.gold = roll_dice( 2, 100 );
- break;
-
- case JOB_WANDERER:
- case JOB_WARPER:
- case JOB_ASSASSIN:
- you.gold = roll_dice( 2, 50 );
- break;
-
- default:
- you.gold = roll_dice( 2, 20 );
- break;
-
- case JOB_PALADIN:
- case JOB_MONK:
- you.gold = 0;
- break;
- }
-}
-
-// requires stuff::modify_all_stats() and works because
-// stats zeroed out by newgame::init_player()... recall
-// that demonspawn & demingods get more later on {dlb}
-void species_stat_init(unsigned char which_species)
-{
- int sb = 0; // strength base
- int ib = 0; // intelligence base
- int db = 0; // dexterity base
-
- // 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 supposted to be a really hard race). Also note that Demigods
- // and Demonspawn get seven more random points added later. -- 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_ELF: sb = 5; ib = 8; db = 8; break; // 21
- case SP_HIGH_ELF: sb = 5; ib = 9; db = 8; break; // 22
- case SP_GREY_ELF: sb = 4; ib = 9; db = 8; break; // 21
- case SP_DEEP_ELF: sb = 3; ib = 10; db = 8; break; // 21
- case SP_SLUDGE_ELF: sb = 6; ib = 7; db = 7; break; // 20
-
- case SP_HILL_DWARF: sb = 10; ib = 3; db = 4; break; // 17
- case SP_MOUNTAIN_DWARF: sb = 9; ib = 4; db = 5; break; // 18
-
- case SP_TROLL: sb = 13; ib = 2; db = 3; break; // 18
- case SP_OGRE: sb = 12; ib = 3; db = 3; break; // 18
- case SP_OGRE_MAGE: sb = 9; ib = 7; db = 3; break; // 19
-
- case SP_MINOTAUR: sb = 10; ib = 3; db = 3; break; // 16
- case SP_HILL_ORC: sb = 9; ib = 3; db = 4; break; // 16
- case SP_CENTAUR: sb = 8; ib = 5; db = 2; break; // 15
- case SP_NAGA: sb = 8; ib = 6; db = 4; break; // 18
-
- case SP_GNOME: sb = 6; ib = 6; db = 7; break; // 19
- case SP_MERFOLK: sb = 6; ib = 5; db = 7; break; // 18
- case SP_KENKU: sb = 6; ib = 6; db = 7; break; // 19
-
- case SP_KOBOLD: sb = 5; ib = 4; db = 8; break; // 17
- case SP_HALFLING: sb = 3; ib = 6; db = 9; break; // 18
- case SP_SPRIGGAN: sb = 2; ib = 7; db = 9; break; // 18
-
- case SP_MUMMY: sb = 7; ib = 3; db = 3; break; // 13
- case SP_GHOUL: sb = 9; ib = 1; db = 2; break; // 13
-
- case SP_RED_DRACONIAN:
- case SP_WHITE_DRACONIAN:
- case SP_GREEN_DRACONIAN:
- case SP_GOLDEN_DRACONIAN:
- case SP_GREY_DRACONIAN:
- case SP_BLACK_DRACONIAN:
- case SP_PURPLE_DRACONIAN:
- case SP_MOTTLED_DRACONIAN:
- case SP_PALE_DRACONIAN:
- case SP_UNK0_DRACONIAN:
- case SP_UNK1_DRACONIAN:
- case SP_BASE_DRACONIAN: sb = 9; ib = 6; db = 2; break; // 17
- }
-
- modify_all_stats( sb, ib, db );
-}
-
-void jobs_stat_init(int which_job)
-{
- int s = 0; // strength mod
- int i = 0; // intelligence mod
- int d = 0; // dexterity mod
- int hp = 0; // HP base
- int mp = 0; // MP base
-
- // 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_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_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_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_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_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_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_WANDERER: s = 2; i = 2; d = 2; hp = 11; mp = 1; break;
- default: s = 0; i = 0; d = 0; hp = 10; mp = 0; break;
- }
-
- modify_all_stats( s, i, d );
-
- set_hp( hp, true );
- set_mp( mp, true );
-}
-
-void give_basic_knowledge(int which_job)
-{
- switch (which_job)
- {
- case JOB_PRIEST:
- case JOB_PALADIN:
- set_ident_type( OBJ_POTIONS, POT_HEALING, ID_KNOWN_TYPE );
- break;
-
- case JOB_HEALER:
- set_ident_type( OBJ_POTIONS, POT_HEALING, ID_KNOWN_TYPE );
- set_ident_type( OBJ_POTIONS, POT_HEAL_WOUNDS, ID_KNOWN_TYPE );
- break;
-
- case JOB_ASSASSIN:
- case JOB_STALKER:
- case JOB_VENOM_MAGE:
- set_ident_type( OBJ_POTIONS, POT_POISON, ID_KNOWN_TYPE );
- break;
-
- case JOB_WARPER:
- set_ident_type( OBJ_SCROLLS, SCR_BLINKING, ID_KNOWN_TYPE );
- break;
-
- case JOB_TRANSMUTER:
- set_ident_type( OBJ_POTIONS, POT_WATER, ID_KNOWN_TYPE );
- set_ident_type( OBJ_POTIONS, POT_CONFUSION, ID_KNOWN_TYPE );
- set_ident_type( OBJ_POTIONS, POT_POISON, ID_KNOWN_TYPE );
- break;
-
- default:
- break;
- }
-
- return;
-} // end give_basic_knowledge()
-
-void give_basic_spells(int which_job)
-{
- // wanderers may or may not already have a spell -- bwr
- if (which_job == JOB_WANDERER)
- return;
-
- unsigned char which_spell = SPELL_NO_SPELL;
-
- switch (which_job)
- {
- case JOB_CONJURER:
- case JOB_REAVER:
- case JOB_WIZARD:
- which_spell = SPELL_MAGIC_DART;
- break;
- case JOB_STALKER:
- case JOB_VENOM_MAGE:
- which_spell = SPELL_STING;
- break;
- case JOB_SUMMONER:
- which_spell = SPELL_SUMMON_SMALL_MAMMAL;
- break;
- case JOB_ICE_ELEMENTALIST:
- which_spell = SPELL_FREEZE;
- break;
- case JOB_NECROMANCER:
- which_spell = SPELL_PAIN;
- break;
- case JOB_ENCHANTER:
- which_spell = SPELL_BACKLIGHT;
- break;
- case JOB_FIRE_ELEMENTALIST:
- which_spell = SPELL_FLAME_TONGUE;
- break;
- case JOB_AIR_ELEMENTALIST:
- which_spell = SPELL_SHOCK;
- break;
- case JOB_EARTH_ELEMENTALIST:
- which_spell = SPELL_SANDBLAST;
- break;
- case JOB_DEATH_KNIGHT:
- if (you.species == SP_DEMIGOD || you.religion != GOD_YREDELEMNUL)
- which_spell = SPELL_PAIN;
- break;
-
- default:
- break;
- }
-
- if (which_spell != SPELL_NO_SPELL)
- add_spell_to_memory( which_spell );
-
- return;
-} // end give_basic_spells()
-
-
-/* ************************************************************************
-
-// MAKE INTO FUNCTION!!! {dlb}
-// randomly boost stats a number of times based on species {dlb}
- unsigned char points_left = ( you.species == SP_DEMIGOD || you.species == SP_DEMONSPAWN ) ? 15 : 8;
-
- do
- {
- switch ( random2(NUM_STATS) )
- {
- case STAT_STRENGTH:
- if ( you.strength > 17 && coinflip() )
- continue;
- you.strength++;
- break;
- case STAT_DEXTERITY:
- if ( you.dex > 17 && coinflip() )
- continue;
- you.dex++;
- break;
- case STAT_INTELLIGENCE:
- if ( you.intel > 17 && coinflip() )
- continue;
- you.intel++;
- break;
- }
- points_left--;
- }
- while (points_left > 0);
-
-************************************************************************ */
-
-
-// eventually, this should be something more grand {dlb}
-void openingScreen(void)
-{
-/* **********************************************
-// this does not work just yet ... {dlb}:
- cprintf(EOL "Hello, ");
-
- if ( you.your_name[0] != '\0' )
- {
- cprintf(you.your_name); // better be less than 31 characters :P {dlb}
- // of course, invalid names will appear {dlb}
- cprintf(", ");
- }
-********************************************** */
-
- textcolor( YELLOW );
- cprintf("Hello, welcome to Dungeon Crawl Stone Soup " VERSION "!");
- textcolor( BROWN );
- cprintf(EOL "(c) Copyright 1997-2002 Linley Henzell");
- cprintf(EOL "Please consult crawl.txt for instructions and legal details."
- EOL);
- textcolor( LIGHTGREY );
-
- return;
-} // end openingScreen()
-
-
-void enterPlayerName(bool blankOK)
-{
- // temporary 'til copyover to you.your_name {dlb}
- // made this rediculously long so that the game doesn't
- // crash if a really really long name is entered (argh). {gdl}
- char name_entered[200];
-
- // anything to avoid goto statements {dlb}
- bool acceptable_name = false;
- bool first_time = true;
-
- // first time -- names set through init.txt/environment assumed ok {dlb}
- if (you.your_name[0] != '\0')
- acceptable_name = true;
-
- do
- {
- // prompt for a new name if current one unsatisfactory {dlb}:
- if (!acceptable_name)
- {
- textcolor( CYAN );
- if (blankOK && first_time)
- {
- if (Options.prev_name.length() && Options.remember_name)
- cprintf(EOL "Press <Enter> for \"%s\"." EOL,
- Options.prev_name.c_str());
- else
- cprintf(EOL
- "Press <Enter> to answer this after race and "
- "class are chosen." EOL);
- }
-
- first_time = false;
-
- cprintf(EOL "What is your name today? ");
- textcolor( LIGHTGREY );
- get_input_line( name_entered, sizeof( name_entered ) );
-
- strncpy( you.your_name, name_entered, kNameLen );
- you.your_name[ kNameLen - 1 ] = '\0';
- }
-
- if (!*you.your_name && blankOK && Options.prev_name.length() &&
- Options.remember_name)
- {
- strncpy(you.your_name, Options.prev_name.c_str(), kNameLen);
- you.your_name[kNameLen - 1] = 0;
- }
-
- // '.', '?' and '*' are blanked.
- if (!you.your_name[1] && (*you.your_name == '.' ||
- *you.your_name == '*' ||
- *you.your_name == '?'))
- {
- *you.your_name = 0;
- }
-
- // verification begins here {dlb}:
- if (you.your_name[0] == '\0')
- {
- if (blankOK)
- return;
-
- cprintf(EOL "That's a silly name!" EOL);
- acceptable_name = false;
- }
-
- // if SAVE_DIR_PATH is defined, userid will be tacked onto the end
- // of each character's files, making bones a valid player name.
-#ifndef SAVE_DIR_PATH
- // this would cause big probs with ghosts
- // what would? {dlb}
- // ... having the name "bones" of course! The problem comes from
- // the fact that bones files would have the exact same filename
- // as level files for a character named "bones". -- bwr
- else if (stricmp(you.your_name, "bones") == 0)
- {
- cprintf(EOL "That's a silly name!" EOL);
- acceptable_name = false;
- }
-#endif
- else
- acceptable_name = verifyPlayerName();
-
- }
- while (!acceptable_name);
-} // end enterPlayerName()
-
-bool verifyPlayerName(void)
-{
-#if defined(DOS) || defined(WIN32CONSOLE)
- static int william_tanksley_asked_for_this = 2;
-
- // quick check for CON -- blows up real good under DOS/Windows
- if (stricmp(you.your_name, "con") == 0)
- {
- cprintf(EOL "Sorry, that name gives your OS a headache." EOL);
- return (false);
- }
-
- // quick check for LPTx -- thank you, Mr. Tanksley! ;-)
- if (strnicmp(you.your_name, "LPT", 3) == 0)
- {
- switch (william_tanksley_asked_for_this)
- {
- case 2:
- cprintf(EOL "Hello, William! How is work on Omega going?" EOL);
- break;
- case 1:
- cprintf(EOL "Look, it's just not a legal name." EOL);
- break;
- case 0:
- strcpy(you.your_name, "William");
- return (true);
- } // end switch
-
- william_tanksley_asked_for_this --;
- return (false);
- }
-#endif
-
- const size_t len = strlen( you.your_name );
- for (unsigned int i = 0; i < len; i++)
- {
-#if MAC
- // the only bad character on Macs is the path seperator
- if (you.your_name[i] == ':')
- {
- cprintf(EOL "No colons, please." EOL);
- return (false);
- }
-#else
- // Note that this includes systems which may be using the
- // packaging system. The packaging system is very simple
- // and doesn't take the time to escape every characters that
- // might be a problem for some random shell or OS... so we
- // play it very conservative here. -- bwr
- if (!isalnum( you.your_name[i] ) && you.your_name[i] != '_')
- {
- cprintf( EOL "Alpha-numerics and underscores only, please." EOL );
- return (false);
- }
-#endif
- }
-
-#ifdef SAVE_DIR_PATH
- // Until we have a better way to handle the fact that this could lead
- // to some confusion with where the name ends and the uid begins. -- bwr
- if (isdigit( you.your_name[ len - 1 ] ))
- {
- cprintf( EOL "Sorry, your name cannot end with a digit." EOL );
- return (false);
- }
-#endif
-
- return (true);
-} // end verifyPlayerName()
-
-#if 0
-// currently unused
-static void give_random_scroll( int slot )
-{
- you.inv[ slot ].quantity = 1;
- you.inv[ slot ].base_type = OBJ_SCROLLS;
- you.inv[ slot ].plus = 0;
- you.inv[ slot ].special = 0;
- you.inv[ slot ].colour = WHITE;
-
- switch (random2(8))
- {
- case 0:
- you.inv[ slot ].sub_type = SCR_DETECT_CURSE;
- break;
-
- case 1:
- you.inv[ slot ].sub_type = SCR_IDENTIFY;
- break;
-
- case 2:
- case 3:
- you.inv[ slot ].sub_type = SCR_BLINKING;
- break;
-
- case 4:
- you.inv[ slot ].sub_type = SCR_FEAR;
- break;
-
- case 5:
- you.inv[ slot ].sub_type = SCR_SUMMONING;
- break;
-
- case 6:
- case 7:
- default:
- you.inv[ slot ].sub_type = SCR_TELEPORTATION;
- break;
- }
-}
-#endif
-
-static void give_random_potion( int slot )
-{
- you.inv[ slot ].quantity = 1;
- you.inv[ slot ].base_type = OBJ_POTIONS;
- you.inv[ slot ].plus = 0;
- you.inv[ slot ].plus2 = 0;
-
- switch (random2(8))
- {
- case 0:
- case 1:
- case 2:
- you.inv[ slot ].sub_type = POT_HEALING;
- break;
- case 3:
- case 4:
- you.inv[ slot ].sub_type = POT_HEAL_WOUNDS;
- break;
- case 5:
- you.inv[ slot ].sub_type = POT_SPEED;
- break;
- case 6:
- you.inv[ slot ].sub_type = POT_MIGHT;
- break;
- case 7:
- you.inv[ slot ].sub_type = POT_BERSERK_RAGE;
- break;
- }
-}
-
-#if 0
-// currently unused
-static void give_random_wand( int slot )
-{
- you.inv[ slot ].quantity = 1;
- you.inv[ slot ].base_type = OBJ_WANDS;
- you.inv[ slot ].special = 0;
- you.inv[ slot ].plus2 = 0;
- you.inv[ slot ].colour = random_colour();
-
- switch (random2(4))
- {
- case 0:
- you.inv[ slot ].sub_type = WAND_SLOWING;
- you.inv[ slot ].plus = 7 + random2(5);
- break;
- case 1:
- you.inv[ slot ].sub_type = WAND_PARALYSIS;
- you.inv[ slot ].plus = 5 + random2(4);
- break;
- case 2:
- you.inv[ slot ].sub_type = coinflip() ? WAND_FROST : WAND_FLAME;
- you.inv[ slot ].plus = 6 + random2(4);
- break;
- case 3:
- you.inv[ slot ].sub_type = WAND_TELEPORTATION;
- you.inv[ slot ].plus = 3 + random2(4);
- break;
- }
-}
-#endif
-
-static void give_random_secondary_armour( int slot )
-{
- you.inv[ slot ].quantity = 1;
- you.inv[ slot ].base_type = OBJ_ARMOUR;
- you.inv[ slot ].special = 0;
- you.inv[ slot ].plus = 0;
- you.inv[ slot ].plus2 = 0;
- you.inv[ slot ].colour = BROWN;
-
- switch (random2(4))
- {
- case 0:
- you.inv[ slot ].sub_type = ARM_CLOAK;
- you.equip[EQ_CLOAK] = slot;
- break;
- case 1:
- you.inv[ slot ].sub_type = ARM_BOOTS;
- you.equip[EQ_BOOTS] = slot;
- break;
- case 2:
- you.inv[ slot ].sub_type = ARM_GLOVES;
- you.equip[EQ_GLOVES] = slot;
- break;
- case 3:
- you.inv[ slot ].sub_type = ARM_HELMET;
- you.equip[EQ_HELMET] = slot;
- break;
- }
-}
-
-// Returns true if a "good" weapon is given
-static bool give_wanderer_weapon( int slot, int wpn_skill )
-{
- bool ret = false;
-
- // Slot's always zero, but we pass it anyways.
-
- // We'll also re-fill the template, all this for later possible
- // safe reuse of code in the future.
- you.inv[ slot ].quantity = 1;
- you.inv[ slot ].base_type = OBJ_WEAPONS;
- you.inv[ slot ].colour = LIGHTCYAN;
- you.inv[ slot ].plus = 0;
- you.inv[ slot ].plus2 = 0;
- you.inv[ slot ].special = 0;
-
- // Now fill in the type according to the random wpn_skill
- switch (wpn_skill)
- {
- case SK_MACES_FLAILS:
- you.inv[ slot ].sub_type = WPN_CLUB;
- you.inv[ slot ].colour = BROWN;
- break;
-
- case SK_POLEARMS:
- you.inv[ slot ].sub_type = WPN_SPEAR;
- break;
-
- case SK_SHORT_BLADES:
- you.inv[ slot ].sub_type = WPN_DAGGER;
- break;
-
- case SK_AXES:
- you.inv[ slot ].sub_type = WPN_HAND_AXE;
- ret = true;
- break;
-
- case SK_STAVES:
- you.inv[ slot ].sub_type = WPN_QUARTERSTAFF;
- you.inv[ slot ].colour = BROWN;
- ret = true;
- break;
-
- case SK_LONG_SWORDS:
- default:
- // all long swords are too good for a starting character...
- // especially this class where we have to be careful about
- // giving away anything good at all.
- // We default here if the character only has fighting skill -- bwr
- you.inv[ slot ].sub_type = WPN_SHORT_SWORD;
- ret = true;
- break;
- }
-
- return (ret);
-}
-
-//
-// The idea behind wanderers is a class that has various different
-// random skills that's a challenge to play... not a class that can
-// be continually rerolled to gain the ideal character. To maintain
-// this, we have to try and make sure that they typically get worse
-// equipment than any other class... this for certain means no
-// spellbooks ever, and the bows and xbows down below might be too
-// much... so pretty much things should be removed rather than
-// added here. -- bwr
-//
-static void create_wanderer( void )
-{
- const int util_skills[] =
- { SK_DARTS, SK_RANGED_COMBAT, SK_ARMOUR, SK_DODGING, SK_STEALTH,
- SK_STABBING, SK_SHIELDS, SK_TRAPS_DOORS, SK_UNARMED_COMBAT,
- SK_INVOCATIONS, SK_EVOCATIONS };
- const int num_util_skills = sizeof(util_skills) / sizeof(int);
-
- // Long swords is missing to increae it's rarity because we
- // can't give out a long sword to a starting character (they're
- // all too good)... Staves is also removed because it's not
- // one of the fighter options.-- bwr
- const int fight_util_skills[] =
- { SK_FIGHTING, SK_SHORT_BLADES, SK_AXES,
- SK_MACES_FLAILS, SK_POLEARMS,
- SK_DARTS, SK_RANGED_COMBAT, SK_ARMOUR, SK_DODGING, SK_STEALTH,
- SK_STABBING, SK_SHIELDS, SK_TRAPS_DOORS, SK_UNARMED_COMBAT,
- SK_INVOCATIONS, SK_EVOCATIONS };
- const int num_fight_util_skills = sizeof(fight_util_skills) / sizeof(int);
-
- const int not_rare_skills[] =
- { SK_SLINGS, SK_BOWS, SK_CROSSBOWS,
- SK_SPELLCASTING, SK_CONJURATIONS, SK_ENCHANTMENTS,
- SK_FIRE_MAGIC, SK_ICE_MAGIC, SK_AIR_MAGIC, SK_EARTH_MAGIC,
- SK_FIGHTING, SK_SHORT_BLADES, SK_LONG_SWORDS, SK_AXES,
- SK_MACES_FLAILS, SK_POLEARMS, SK_STAVES,
- SK_DARTS, SK_RANGED_COMBAT, SK_ARMOUR, SK_DODGING, SK_STEALTH,
- SK_STABBING, SK_SHIELDS, SK_TRAPS_DOORS, SK_UNARMED_COMBAT,
- SK_INVOCATIONS, SK_EVOCATIONS };
- const int num_not_rare_skills = sizeof(not_rare_skills) / sizeof(int);
-
- const int all_skills[] =
- { SK_SUMMONINGS, SK_NECROMANCY, SK_TRANSLOCATIONS, SK_TRANSMIGRATION,
- SK_DIVINATIONS, SK_POISON_MAGIC,
- SK_SLINGS, SK_BOWS, SK_CROSSBOWS,
- SK_SPELLCASTING, SK_CONJURATIONS, SK_ENCHANTMENTS,
- SK_FIRE_MAGIC, SK_ICE_MAGIC, SK_AIR_MAGIC, SK_EARTH_MAGIC,
- SK_FIGHTING, SK_SHORT_BLADES, SK_LONG_SWORDS, SK_AXES,
- SK_MACES_FLAILS, SK_POLEARMS, SK_STAVES,
- SK_DARTS, SK_RANGED_COMBAT, SK_ARMOUR, SK_DODGING, SK_STEALTH,
- SK_STABBING, SK_SHIELDS, SK_TRAPS_DOORS, SK_UNARMED_COMBAT,
- SK_INVOCATIONS, SK_EVOCATIONS };
- const int num_all_skills = sizeof(all_skills) / sizeof(int);
-
- int skill;
-
- for (int i = 0; i < 2; i++)
- {
- do
- {
- skill = random2( num_util_skills );
- }
- while (you.skills[ util_skills[ skill ]] >= 2);
-
- you.skills[ util_skills[ skill ]] += 1;
- }
-
- for (int i = 0; i < 3; i++)
- {
- do
- {
- skill = random2( num_fight_util_skills );
- }
- while (you.skills[ fight_util_skills[ skill ]] >= 2);
-
- you.skills[ fight_util_skills[ skill ]] += 1;
- }
-
- // Spell skills are possible past this point, but we won't
- // allow two levels of any of them -- bwr
- for (int i = 0; i < 3; i++)
- {
- do
- {
- skill = random2( num_not_rare_skills );
- }
- while (you.skills[ not_rare_skills[ skill ]] >= 2
- || (not_rare_skills[ skill ] >= SK_SPELLCASTING
- && you.skills[ not_rare_skills[ skill ]]));
-
- you.skills[ not_rare_skills[ skill ]] += 1;
- }
-
- for (int i = 0; i < 2; i++)
- {
- do
- {
- skill = random2( num_all_skills );
- }
- while (you.skills[all_skills[ skill ]] >= 2
- || (all_skills[ skill ] >= SK_SPELLCASTING
- && you.skills[ all_skills[ skill ]]));
-
- you.skills[ all_skills[ skill ]] += 1;
- }
-
- // Demigods can't use invocations so we'll swap it for something else
- if (you.species == SP_DEMIGOD && you.skills[ SK_INVOCATIONS ])
- {
- you.skills[ SK_INVOCATIONS ] = 0;
-
- do
- {
- skill = random2( num_all_skills );
- }
- while (skill == SK_INVOCATIONS && you.skills[all_skills[ skill ]]);
-
- you.skills[ skill ] = 1;
- }
-
- int wpn_skill = SK_FIGHTING; // prefered weapon type
- int wpn_skill_size = 0; // level of skill in prefered weapon type
- int num_wpn_skills = 0; // used to choose prefered weapon
- int total_wpn_skills = 0; // used to choose template
-
- // This algorithm is the same as the one used to pick a random
- // angry god for retribution, except that whenever a higher skill
- // is found than the current one, we automatically take it and
- // only consider skills at that level or higher from that point on,
- // This should give a random wpn skill from the set of skills with
- // the highest value. -- bwr
- for (int i = SK_SHORT_BLADES; i <= SK_STAVES; i++)
- {
- if (you.skills[i] > 0)
- {
- total_wpn_skills++;
-
- if (you.skills[i] > wpn_skill_size)
- {
- // switch to looking in the new set of better skills
- num_wpn_skills = 1; // reset to one, because it's a new set
- wpn_skill = i;
- wpn_skill_size = you.skills[i];
- }
- else if (you.skills[i] == wpn_skill_size)
- {
- // still looking at the old level
- num_wpn_skills++;
- if (one_chance_in( num_wpn_skills ))
- {
- wpn_skill = i;
- wpn_skill_size = you.skills[i];
- }
- }
- }
- }
-
- // Let's try to make an appropriate weapon
- // Start with a template for a weapon
- you.inv[0].quantity = 1;
- you.inv[0].base_type = OBJ_WEAPONS;
- you.inv[0].sub_type = WPN_KNIFE;
- you.inv[0].colour = LIGHTCYAN;
- you.inv[0].plus = 0;
- you.inv[0].plus2 = 0;
- you.inv[0].special = 0;
-
- // And a default armour template for a robe (leaving slot 1 open for
- // a secondary weapon).
- you.inv[2].quantity = 1;
- you.inv[2].base_type = OBJ_ARMOUR;
- you.inv[2].sub_type = ARM_ROBE;
- you.inv[2].colour = BROWN;
- you.inv[2].plus = 0;
- you.inv[2].special = 0;
-
- // Wanderers have at least seen one type of potion, and if they
- // don't get anything else good, they'll get to keep this one...
- // Note: even if this is taken away, the knowledge of the potion
- // type is still given to the character.
- give_random_potion(3);
-
- if (you.skills[SK_FIGHTING] || total_wpn_skills >= 3)
- {
- // Fighter style wanderer
- if (you.skills[SK_ARMOUR])
- {
- you.inv[2].sub_type = ARM_RING_MAIL;
- you.inv[2].colour = LIGHTCYAN;
-
- you.inv[3].quantity = 0; // remove potion
- }
- else if (you.skills[SK_SHIELDS] && wpn_skill != SK_STAVES)
- {
- you.inv[4].quantity = 1;
- you.inv[4].base_type = OBJ_ARMOUR;
- you.inv[4].sub_type = ARM_BUCKLER;
- you.inv[4].plus = 0;
- you.inv[4].special = 0;
- you.inv[4].colour = LIGHTCYAN;
- you.equip[EQ_SHIELD] = 4;
-
- you.inv[3].quantity = 0; // remove potion
- }
- else
- {
- give_random_secondary_armour(5);
- }
-
- // remove potion if good weapon is given:
- if (give_wanderer_weapon( 0, wpn_skill ))
- you.inv[3].quantity = 0;
- }
-#ifdef USE_SPELLCASTER_AND_RANGER_WANDERER_TEMPLATES
- else if (you.skills[ SK_SPELLCASTING ])
- {
- // Spellcaster style wanderer
-
- // Could only have learned spells in common schools...
- const int school_list[5] =
- { SK_CONJURATIONS,
- SK_ENCHANTMENTS, SK_ENCHANTMENTS,
- SK_TRANSLOCATIONS, SK_NECROMANCY };
-
- //jmf: Two of those spells are gone due to their munchkinicity.
- // crush() and arc() are like having good melee capability.
- // Therefore giving them to "harder" class makes less-than-
- // zero sense, and they're now gone.
- const int spell_list[5] =
- { SPELL_MAGIC_DART,
- SPELL_CONFUSING_TOUCH, SPELL_BACKLIGHT,
- SPELL_APPORTATION, SPELL_ANIMATE_SKELETON };
-
- // Choose one of the schools we have at random.
- int school = SK_SPELLCASTING;
- int num_schools = 0;
- for (int i = 0; i < 5; i++)
- {
- if (you.skills[ school_list[ i ]])
- {
- num_schools++;
- if (one_chance_in( num_schools ))
- school = i;
- }
- }
-
- // Magic dart is quite a good spell, so if the player only has
- // spellcasting and conjurations, we sometimes hold off... and
- // treat them like an unskilled spellcaster.
- if (school == SK_SPELLCASTING
- || (num_schools == 1 && school == SK_CONJURATIONS && coinflip()))
- {
- // Not much melee potential and no common spell school,
- // we'll give the player a dagger.
- you.inv[0].sub_type = WPN_DAGGER;
-
- // ... and a random scroll
- give_random_scroll(4);
-
- // ... and knowledge of another
- give_random_scroll(5);
- you.inv[5].quantity = 0;
-
- // ... and a wand.
- give_random_wand(6);
- }
- else
- {
- // Give them an appropriate spell
- add_spell_to_memory( spell_list[ school ] );
- }
- }
- else if (you.skills[ SK_RANGED_COMBAT ] && one_chance_in(3)) // these are rare
- {
- // Ranger style wanderer
- // Rare since starting with a throwing weapon is very good
-
- // Create a default launcher template, but the
- // quantity may be reset to 0 if we don't want one -- bwr
- // thorwing weapons are lowered to -1 to make them
- // not as good as the one's hunters get, ammo is
- // also much smaller -- bwr
- you.inv[1].quantity = 1;
- you.inv[1].base_type = OBJ_WEAPONS;
- you.inv[1].sub_type = WPN_BOW;
- you.inv[1].plus = -1;
- you.inv[1].plus2 = -1;
- you.inv[1].special = 0;
- you.inv[1].colour = BROWN;
-
- // Create default ammo template (darts) (armour is slot 2)
- you.inv[4].base_type = OBJ_MISSILES;
- you.inv[4].sub_type = MI_DART;
- you.inv[4].quantity = 10 + roll_dice( 2, 6 );
- you.inv[4].plus = 0;
- you.inv[4].plus2 = 0;
- you.inv[4].special = 0;
- you.inv[4].colour = LIGHTCYAN;
-
- if (you.skills[ SK_SLINGS ])
- {
- // slingers get some extra ammo
- you.inv[4].quantity += random2avg(20,5);
- you.inv[4].sub_type = MI_STONE;
- you.inv[4].colour = BROWN;
- you.inv[1].sub_type = WPN_SLING;
- you.inv[1].plus = 0; // slings aren't so good
- you.inv[1].plus2 = 0; // so we'll make them +0
-
- you.inv[3].quantity = 0; // remove potion
- you.inv[3].base_type = 0; // forget potion
- you.inv[3].sub_type = 0;
- }
- else if (you.skills[ SK_BOWS ])
- {
- you.inv[4].sub_type = MI_ARROW;
- you.inv[4].colour = BROWN;
- you.inv[1].sub_type = WPN_BOW;
-
- you.inv[3].quantity = 0; // remove potion
- you.inv[3].base_type = 0; // forget potion
- you.inv[3].sub_type = 0;
- }
- else if (you.skills[ SK_CROSSBOWS ])
- {
- // Hand crossbows want the darts.
- you.inv[1].sub_type = WPN_HAND_CROSSBOW;
-
- you.inv[3].quantity = 0; // remove potion
- you.inv[3].base_type = 0; // forget potion
- you.inv[3].sub_type = 0;
- }
- else
- {
- // little extra poisoned darts for throwers
- you.inv[4].quantity += random2avg(10,5);
- set_item_ego_type( you.inv[4], OBJ_MISSILES, SPMSL_POISONED );
-
- you.inv[0].sub_type = WPN_DAGGER; // up knife to dagger
- you.inv[1].quantity = 0; // remove bow
- }
- }
-#endif
- else
- {
- // Generic wanderer
- give_wanderer_weapon( 0, wpn_skill );
- give_random_secondary_armour(5);
- }
-
- you.equip[EQ_WEAPON] = 0;
- you.equip[EQ_BODY_ARMOUR] = 2;
-}
-
-static char letter_to_class(int keyn)
-{
- if (keyn == 'a')
- return JOB_FIGHTER;
- else if (keyn == 'b')
- return JOB_WIZARD;
- else if (keyn == 'c')
- return JOB_PRIEST;
- else if (keyn == 'd')
- return JOB_THIEF;
- else if (keyn == 'e')
- return JOB_GLADIATOR;
- else if (keyn == 'f')
- return JOB_NECROMANCER;
- else if (keyn == 'g')
- return JOB_PALADIN;
- else if (keyn == 'h')
- return JOB_ASSASSIN;
- else if (keyn == 'i')
- return JOB_BERSERKER;
- else if (keyn == 'j')
- return JOB_HUNTER;
- else if (keyn == 'k')
- return JOB_CONJURER;
- else if (keyn == 'l')
- return JOB_ENCHANTER;
- else if (keyn == 'm')
- return JOB_FIRE_ELEMENTALIST;
- else if (keyn == 'n')
- return JOB_ICE_ELEMENTALIST;
- else if (keyn == 'o')
- return JOB_SUMMONER;
- else if (keyn == 'p')
- return JOB_AIR_ELEMENTALIST;
- else if (keyn == 'q')
- return JOB_EARTH_ELEMENTALIST;
- else if (keyn == 'r')
- return JOB_CRUSADER;
- else if (keyn == 's')
- return JOB_DEATH_KNIGHT;
- else if (keyn == 't')
- return JOB_VENOM_MAGE;
- else if (keyn == 'u')
- return JOB_CHAOS_KNIGHT;
- else if (keyn == 'v')
- return JOB_TRANSMUTER;
- else if (keyn == 'w')
- return JOB_HEALER;
- else if (keyn == 'y')
- return JOB_REAVER;
- else if (keyn == 'z')
- return JOB_STALKER;
- else if (keyn == 'A')
- return JOB_MONK;
- else if (keyn == 'B')
- return JOB_WARPER;
- else if (keyn == 'C')
- return JOB_WANDERER;
- return JOB_UNKNOWN;
-}
-
-static char letter_to_species(int keyn)
-{
- switch (keyn)
- {
- case 'a':
- return SP_HUMAN;
- case 'b':
- return SP_ELF;
- case 'c':
- return SP_HIGH_ELF;
- case 'd':
- return SP_GREY_ELF;
- case 'e':
- return SP_DEEP_ELF;
- case 'f':
- return SP_SLUDGE_ELF;
- case 'g':
- return SP_HILL_DWARF;
- case 'h':
- return SP_MOUNTAIN_DWARF;
- case 'i':
- return SP_HALFLING;
- case 'j':
- return SP_HILL_ORC;
- case 'k':
- return SP_KOBOLD;
- case 'l':
- return SP_MUMMY;
- case 'm':
- return SP_NAGA;
- case 'n':
- return SP_GNOME;
- case 'o':
- return SP_OGRE;
- case 'p':
- return SP_TROLL;
- case 'q':
- return SP_OGRE_MAGE;
- case 'r': // draconian
- return SP_RED_DRACONIAN + random2(9); // random drac
- case 's':
- return SP_CENTAUR;
- case 't':
- return SP_DEMIGOD;
- case 'u':
- return SP_SPRIGGAN;
- case 'v':
- return SP_MINOTAUR;
- case 'w':
- return SP_DEMONSPAWN;
- case 'x':
- return SP_GHOUL;
- case 'y':
- return SP_KENKU;
- case 'z':
- return SP_MERFOLK;
- default:
- return 0;
- }
-}
-
-static char species_to_letter(int spec)
-{
- if (spec > SP_RED_DRACONIAN && spec <= SP_BASE_DRACONIAN)
- spec = SP_RED_DRACONIAN;
- else if (spec > SP_BASE_DRACONIAN)
- spec -= SP_BASE_DRACONIAN - SP_RED_DRACONIAN;
- return 'a' + spec - 1;
-}
-
-// choose_race returns true if the player should also pick a class.
-// This is done because of the '*' option which will pick a random
-// character, obviating the necessity of choosing a class.
-
-bool choose_race()
-{
- char keyn;
-
- bool printed = false;
-
- if (Options.cls)
- {
- you.char_class = letter_to_class(Options.cls);
- ng_cls = Options.cls;
- }
-
- if (Options.race != 0)
- printed = true;
-
-spec_query:
- bool prevraceok = Options.prev_race == '?';
- if (!printed)
- {
- clrscr();
-
- if (you.char_class != JOB_UNKNOWN)
- {
- textcolor( BROWN );
- bool shortgreet = false;
- if (strlen(you.your_name) || you.char_class != JOB_UNKNOWN)
- cprintf("Welcome, ");
- else
- {
- cprintf("Welcome.");
- shortgreet = true;
- }
-
- textcolor( YELLOW );
- if (strlen(you.your_name) > 0)
- {
- cprintf(you.your_name);
- if (you.char_class != JOB_UNKNOWN)
- cprintf(" the ");
- }
- if (you.char_class != JOB_UNKNOWN)
- cprintf(get_class_name(you.char_class));
-
- if (!shortgreet)
- cprintf(".");
- }
- else
- {
- textcolor( WHITE );
- cprintf("You must be new here!");
- }
- cprintf(EOL EOL);
- textcolor( CYAN );
- cprintf("You can be:");
- cprintf(EOL EOL);
-
- textcolor( LIGHTGREY );
-
- int linec = 0;
- char linebuf[200];
- *linebuf = 0;
- for (int i = SP_HUMAN; i < NUM_SPECIES; ++i)
- {
- if (i > SP_RED_DRACONIAN && i <= SP_BASE_DRACONIAN)
- continue;
-
- if (you.char_class != JOB_UNKNOWN &&
- !class_allowed(i, you.char_class))
- continue;
-
- char buf[100];
- char sletter = species_to_letter(i);
- snprintf(buf, sizeof buf, "%c - %-26s",
- sletter,
- species_name(i, 1));
- if (sletter == Options.prev_race)
- prevraceok = true;
- strncat(linebuf, buf, sizeof linebuf);
- if (++linec >= 2)
- {
- cprintf("%s" EOL, linebuf);
- *linebuf = 0;
- linec = 0;
- }
- }
-
- if (linec)
- cprintf("%s" EOL, linebuf);
-
- textcolor( BROWN );
-
- if (you.char_class == JOB_UNKNOWN)
- cprintf(EOL "SPACE - Choose class first; "
- "? - Random Species; * - Random Character; X - Quit"
- EOL);
- else
- cprintf(EOL "? - Random; Bksp - Back to class selection; X - Quit"
- EOL);
-
- if (Options.prev_race)
- {
- if (prevraceok)
- cprintf("Enter - %s", get_opt_race_name(Options.prev_race).c_str());
- if (prev_startup_options_set())
- cprintf("%sTAB - %s",
- prevraceok? "; " : "",
- prev_startup_description().c_str());
- cprintf(EOL);
- }
-
- textcolor( CYAN );
- cprintf(EOL "Which one? ");
- textcolor( LIGHTGREY );
-
- printed = true;
- }
-
- if (Options.race != 0)
- {
- keyn = Options.race;
- }
- else
- {
- keyn = c_getch();
- }
-
- if ((keyn == '\r' || keyn == '\n') && Options.prev_race && prevraceok)
- keyn = Options.prev_race;
-
- if (keyn == '\t' && prev_startup_options_set())
- {
- if (Options.prev_randpick ||
- (Options.prev_race == '?' && Options.prev_cls == '?'))
- {
- Options.random_pick = true;
- ng_random = true;
- pick_random_species_and_class();
- return false;
- }
- set_startup_options();
- you.species = 0;
- you.char_class = JOB_UNKNOWN;
- return true;
- }
-
- if (keyn == CK_BKSP || keyn == ' ')
- {
- you.species = 0;
- Options.race = 0;
- return true;
- }
-
- bool randrace = (keyn == '?');
- if (keyn == '?')
- {
- do
- keyn = 'a' + random2(26);
- while (you.char_class != JOB_UNKNOWN &&
- !class_allowed(letter_to_species(keyn), you.char_class));
- }
- else if (keyn == '*')
- {
- pick_random_species_and_class();
- Options.random_pick = true; // used to give random weapon/god as well
- ng_random = true;
- return false;
- }
-
- if (!(you.species = letter_to_species(keyn)))
- {
- switch (keyn)
- {
- case 'X':
- cprintf(EOL "Goodbye!");
- end(0);
- break;
- default:
- if (Options.race != 0)
- {
- Options.race = 0;
- printed = false;
- }
- goto spec_query;
- }
- }
- if (you.species && you.char_class != JOB_UNKNOWN
- && !class_allowed(you.species, you.char_class))
- goto spec_query;
-
- // set to 0 in case we come back from choose_class()
- Options.race = 0;
- ng_race = randrace? '?' : keyn;
-
- return true;
-}
-
-// returns true if a class was chosen, false if we should go back to
-// race selection.
-
-bool choose_class(void)
-{
- char keyn;
- int i,j;
-
- bool printed = false;
- if (Options.cls != 0)
- printed = true;
-
- if (you.species && you.char_class != JOB_UNKNOWN)
- return true;
-
- ng_cls = 0;
-
-job_query:
- bool prevclassok = Options.prev_cls == '?';
- if (!printed)
- {
- clrscr();
-
- if (you.species)
- {
- textcolor( BROWN );
- bool shortgreet = false;
- if (strlen(you.your_name) || you.species)
- cprintf("Welcome, ");
- else
- {
- cprintf("Welcome.");
- shortgreet = true;
- }
-
- textcolor( YELLOW );
- if (strlen(you.your_name) > 0)
- {
- cprintf(you.your_name);
- if (you.species)
- cprintf(" the ");
- }
- if (you.species)
- cprintf(species_name(you.species,you.experience_level));
-
- if (!shortgreet)
- cprintf(".");
- }
- else
- {
- textcolor( WHITE );
- cprintf("You must be new here!");
- }
-
- cprintf(EOL EOL);
- textcolor( CYAN );
- cprintf("You can be:");
- cprintf(EOL EOL);
-
- textcolor( LIGHTGREY );
-
- j = 0; // used within for loop to determine newline {dlb}
-
- for (i = 0; i < NUM_JOBS; i++)
- {
- if (you.species? !class_allowed(you.species, i) : i == JOB_QUITTER)
- continue;
-
- char letter = index_to_letter(i);
-
- if (letter == Options.prev_cls)
- prevclassok = true;
-
- putch( letter );
- cprintf( " - " );
- cprintf( get_class_name(i) );
-
- if (j % 2)
- cprintf(EOL);
- else
- gotoxy(31, wherey());
-
- j++;
- }
-
- if (j % 2)
- cprintf(EOL);
-
- textcolor( BROWN );
- if (!you.species)
- cprintf(EOL "SPACE - Choose species first; "
- "? - Random Class; * - Random Character; X - Quit"
- EOL);
- else
- cprintf(EOL "? - Random; Bksp - Back to species selection; X - Quit"
- EOL);
-
- if (Options.prev_cls)
- {
- if (prevclassok)
- cprintf("Enter - %s", get_opt_class_name(Options.prev_cls).c_str());
- if (prev_startup_options_set())
- cprintf("%sTAB - %s",
- prevclassok? "; " : "",
- prev_startup_description().c_str());
- cprintf(EOL);
- }
-
- textcolor( CYAN );
- cprintf(EOL "Which one? ");
- textcolor( LIGHTGREY );
-
- printed = true;
- }
-
- if (Options.cls != 0)
- {
- keyn = Options.cls;
- }
- else
- {
- keyn = c_getch();
- }
-
- if ((keyn == '\r' || keyn == '\n') && Options.prev_cls && prevclassok)
- keyn = Options.prev_cls;
-
- if (keyn == '\t' && prev_startup_options_set())
- {
- if (Options.prev_randpick ||
- (Options.prev_race == '?' && Options.prev_cls == '?'))
- {
- Options.random_pick = true;
- ng_random = true;
- pick_random_species_and_class();
- return true;
- }
- set_startup_options();
-
- // Toss out old species selection, if any.
- you.species = 0;
- you.char_class = JOB_UNKNOWN;
-
- return false;
- }
-
- if ((you.char_class = letter_to_class(keyn)) == JOB_UNKNOWN)
- {
- if (keyn == '?')
- {
- // pick a job at random... see god retribution for proof this
- // is uniform. -- bwr
- int job_count = 0;
- int job = -1;
-
- for (i = 0; i < NUM_JOBS; i++)
- {
- if (!you.species || class_allowed(you.species, i))
- {
- job_count++;
- if (one_chance_in( job_count ))
- job = i;
- }
- }
-
- ASSERT( job != -1 ); // at least one class should have been allowed
- you.char_class = job;
-
- ng_cls = '?';
- }
- else if (keyn == '*')
- {
- pick_random_species_and_class();
- // used to give random weapon/god as well
- Options.random_pick = true;
- ng_random = true;
- return true;
- }
- else if ((keyn == ' ' && !you.species) ||
- keyn == 'x' || keyn == ESCAPE || keyn == CK_BKSP)
- {
- you.char_class = JOB_UNKNOWN;
- return false;
- }
- else if (keyn == 'X')
- {
- cprintf(EOL "Goodbye!");
- end(0);
- }
- else
- {
- if (Options.cls != 0)
- {
- Options.cls = 0;
- printed = false;
- }
- goto job_query;
- }
- }
-
- if (you.species && !class_allowed(you.species, you.char_class))
- {
- if (Options.cls != 0)
- {
- Options.cls = 0;
- printed = false;
- }
- goto job_query;
- }
-
- if (ng_cls != '?')
- ng_cls = keyn;
-
- return you.char_class != JOB_UNKNOWN && you.species;
-}
-
-
-void give_items_skills()
-{
- char keyn;
- int weap_skill = 0;
- int to_hit_bonus; // used for assigning primary weapons {dlb}
- int choice; // used for third-screen choices
- int tmp;
-
- switch (you.char_class)
- {
- case JOB_FIGHTER:
- you.inv[0].quantity = 1;
- you.inv[0].base_type = OBJ_WEAPONS;
- you.inv[0].sub_type = WPN_SHORT_SWORD;
- you.inv[0].plus = 0;
- you.inv[0].plus2 = 0;
- you.inv[0].special = 0;
- you.inv[0].colour = LIGHTCYAN;
-
- if (you.species == SP_OGRE || you.species == SP_TROLL
- || player_genus(GENPC_DRACONIAN))
- {
- you.inv[1].quantity = 1;
- you.inv[1].base_type = OBJ_ARMOUR;
- you.inv[1].sub_type = ARM_ANIMAL_SKIN;
- you.inv[1].plus = 0;
- you.inv[1].special = 0;
- you.inv[1].colour = BROWN;
-
- if (you.species == SP_OGRE)
- {
- you.inv[0].quantity = 1;
- you.inv[0].base_type = OBJ_WEAPONS;
- you.inv[0].sub_type = WPN_CLUB;
- you.inv[0].plus = 0;
- you.inv[0].special = 0;
- you.inv[0].colour = BROWN;
-
- }
- else if (you.species == SP_TROLL)
- {
- you.inv[0].quantity = 0;
- you.inv[0].base_type = OBJ_WEAPONS;
- you.inv[0].sub_type = WPN_CLUB;
- you.inv[0].plus = 0;
- you.inv[0].special = 0;
- you.inv[0].colour = BROWN;
-
- }
- else if (player_genus(GENPC_DRACONIAN))
- {
- you.inv[2].quantity = 1;
- you.inv[2].base_type = OBJ_ARMOUR;
- you.inv[2].sub_type = ARM_SHIELD;
- you.inv[2].plus = 0;
- you.inv[2].special = 0;
- you.inv[2].colour = LIGHTCYAN;
- }
- }
- else if (you.species == SP_GHOUL || you.species == SP_MUMMY)
- {
- you.inv[1].quantity = 1;
- you.inv[1].base_type = OBJ_ARMOUR;
- you.inv[1].sub_type = ARM_ROBE;
- you.inv[1].plus = 0;
- you.inv[1].special = 0;
- you.inv[1].colour = WHITE; // grave shroud
-
- if (you.species == SP_MUMMY)
- {
- you.inv[2].quantity = 1;
- you.inv[2].base_type = OBJ_ARMOUR;
- you.inv[2].sub_type = ARM_SHIELD;
- you.inv[2].plus = 0;
- you.inv[2].special = 0;
- you.inv[2].colour = LIGHTCYAN;
- }
- }
- else if (you.species == SP_KOBOLD)
- {
- you.inv[1].quantity = 1;
- you.inv[1].base_type = OBJ_ARMOUR;
- you.inv[1].sub_type = ARM_LEATHER_ARMOUR;
- you.inv[1].plus = 0;
- you.inv[1].special = 0;
- you.inv[1].colour = BROWN;
-
- you.inv[2].base_type = OBJ_MISSILES;
- you.inv[2].sub_type = MI_DART;
- you.inv[2].quantity = 10 + roll_dice( 2, 10 );
- you.inv[2].plus = 0;
- you.inv[2].special = 0;
- you.inv[2].colour = LIGHTCYAN;
-
- }
- else
- {
- you.inv[1].quantity = 1;
- you.inv[1].base_type = OBJ_ARMOUR;
- you.inv[1].sub_type = ARM_SCALE_MAIL;
- you.inv[1].plus = 0;
- you.inv[1].special = 0;
- you.inv[1].colour = LIGHTCYAN;
-
- you.inv[2].quantity = 1;
- you.inv[2].base_type = OBJ_ARMOUR;
- you.inv[2].sub_type = ARM_SHIELD;
- you.inv[2].plus = 0;
- you.inv[2].special = 0;
- you.inv[2].colour = LIGHTCYAN;
-
- choose_weapon();
- }
-
- if (you.species != SP_TROLL)
- you.equip[EQ_WEAPON] = 0;
-
- you.equip[EQ_BODY_ARMOUR] = 1;
-
- if (you.species != SP_KOBOLD && you.species != SP_OGRE
- && you.species != SP_TROLL && you.species != SP_GHOUL)
- {
- you.equip[EQ_SHIELD] = 2;
- }
-
- you.skills[SK_FIGHTING] = 3;
-
- weap_skill = 2;
-
- if (you.species == SP_KOBOLD)
- {
- you.skills[SK_RANGED_COMBAT] = 1;
- you.skills[SK_DARTS] = 1;
- you.skills[SK_DODGING] = 1;
- you.skills[SK_STEALTH] = 1;
- you.skills[SK_STABBING] = 1;
- you.skills[SK_DODGING + random2(3)] += 1;
- }
- else if (you.species == SP_OGRE || you.species == SP_TROLL)
- {
- if (you.species == SP_TROLL) //jmf: these guys get no weapon!
- you.skills[SK_UNARMED_COMBAT] += 3;
- else
- you.skills[SK_FIGHTING] += 2;
-
- // BWR sez Ogres & Trolls should probably start w/ Dodge 2 -- GDL
- you.skills[SK_DODGING] = 3;
- }
- else
- {
- // Players get dodging or armour skill depending on their
- // starting armour now (note: the armour has to be quiped
- // for this function to work)
-
- you.skills[(player_light_armour()? SK_DODGING : SK_ARMOUR)] = 2;
-
- you.skills[SK_SHIELDS] = 2;
- you.skills[SK_RANGED_COMBAT] = 2;
- you.skills[(coinflip() ? SK_STABBING : SK_SHIELDS)]++;
- }
- break;
-
- case JOB_WIZARD:
- you.inv[0].quantity = 1;
- you.inv[0].base_type = OBJ_WEAPONS;
-
- if (you.species == SP_OGRE_MAGE)
- {
- you.inv[0].sub_type = WPN_QUARTERSTAFF;
- you.inv[0].colour = BROWN;
- }
- else if (player_genus(GENPC_DWARVEN))
- {
- you.inv[0].sub_type = WPN_HAMMER;
- you.inv[0].colour = CYAN;
- }
- else
- {
- you.inv[0].sub_type = WPN_DAGGER;
- you.inv[0].colour = LIGHTCYAN;
- }
-
- you.inv[0].plus = 0;
- you.inv[0].plus2 = 0;
- you.inv[0].special = 0;
-
- you.inv[1].quantity = 1;
- you.inv[1].base_type = OBJ_ARMOUR;
- you.inv[1].sub_type = ARM_ROBE;
- you.inv[1].plus = 0;
-
- switch (random2(7))
- {
- case 0:
- case 1:
- default:
- set_equip_desc( you.inv[1], ISFLAG_EMBROIDERED_SHINY );
- break;
- case 2:
- case 3:
- set_equip_desc( you.inv[1], ISFLAG_GLOWING );
- break;
- case 4:
- case 5:
- set_equip_desc( you.inv[1], ISFLAG_RUNED );
- break;
- case 6:
- set_equip_race( you.inv[1], ISFLAG_ELVEN );
- break;
- }
-
-
- you.inv[1].colour = random_colour();
- you.equip[EQ_WEAPON] = 0;
- you.equip[EQ_BODY_ARMOUR] = 1;
-
- // extra items being tested:
- you.inv[2].base_type = OBJ_BOOKS;
- you.inv[2].sub_type = BOOK_MINOR_MAGIC_I + random2(3);
- you.inv[2].quantity = 1;
- you.inv[2].plus = 0; // = 127
- you.inv[2].special = 1;
- you.inv[2].colour = CYAN;
-
- you.skills[SK_DODGING] = 1;
- you.skills[SK_STEALTH] = 1;
- you.skills[(coinflip() ? SK_DODGING : SK_STEALTH)]++;
- you.skills[SK_SPELLCASTING] = 2;
- you.skills[SK_CONJURATIONS] = 1;
- you.skills[SK_ENCHANTMENTS] = 1;
- you.skills[SK_SPELLCASTING + random2(3)]++;
- you.skills[SK_SUMMONINGS + random2(5)]++;
-
- if (player_genus(GENPC_DWARVEN))
- you.skills[SK_MACES_FLAILS] = 1;
- else
- you.skills[SK_SHORT_BLADES] = 1;
-
- you.skills[SK_STAVES] = 1;
- break;
-
- case JOB_PRIEST:
- you.piety = 45;
-
- you.inv[0].quantity = 1;
- you.inv[0].base_type = OBJ_WEAPONS;
- you.inv[0].sub_type = WPN_MACE; //jmf: moved from "case 'b'" below
- you.inv[0].plus = 0;
- you.inv[0].plus2 = 0;
- you.inv[0].special = 0;
- you.inv[0].colour = LIGHTCYAN;
-
- you.inv[1].quantity = 1;
- you.inv[1].base_type = OBJ_ARMOUR;
- you.inv[1].sub_type = ARM_ROBE;
- you.inv[1].plus = 0;
- you.inv[1].special = 0;
- you.inv[1].colour = WHITE;
-
- you.inv[2].base_type = OBJ_POTIONS;
- you.inv[2].sub_type = POT_HEALING;
- you.inv[2].quantity = 2;
- you.inv[2].plus = 0;
-
- you.equip[EQ_WEAPON] = 0;
-
- you.equip[EQ_BODY_ARMOUR] = 1;
-
- you.skills[SK_FIGHTING] = 2;
- you.skills[SK_DODGING] = 1;
- you.skills[SK_SHIELDS] = 1;
- you.skills[SK_MACES_FLAILS] = 2;
- you.skills[SK_STAVES] = 1;
-
- you.skills[SK_INVOCATIONS] = 4;
-
- if (Options.priest != GOD_NO_GOD && Options.priest != GOD_RANDOM)
- ng_pr = you.religion = Options.priest;
- else if (Options.random_pick || Options.priest == GOD_RANDOM)
- {
- you.religion = coinflip() ? GOD_YREDELEMNUL : GOD_ZIN;
- ng_pr = GOD_RANDOM;
- }
- else
- {
- clrscr();
-
- textcolor( CYAN );
- cprintf(EOL " Which god do you wish to serve?" EOL);
-
- textcolor( LIGHTGREY );
- cprintf("a - Zin (for traditional priests)" EOL);
- cprintf("b - Yredelemnul (for priests of death)" EOL);
-
- if (Options.prev_pr != GOD_NO_GOD)
- {
- textcolor(BROWN);
- cprintf(EOL "Enter - %s" EOL,
- Options.prev_pr == GOD_ZIN? "Zin" :
- Options.prev_pr == GOD_YREDELEMNUL? "Yredelemnul" :
- "Random");
- }
-
- getkey:
- keyn = get_ch();
-
- if ((keyn == '\r' || keyn == '\n')
- && Options.prev_pr != GOD_NO_GOD)
- {
- keyn = Options.prev_pr == GOD_ZIN? 'a' :
- Options.prev_pr == GOD_YREDELEMNUL? 'b' :
- '?';
-
- }
-
- switch (keyn)
- {
- case '?':
- you.religion = coinflip()? GOD_ZIN : GOD_YREDELEMNUL;
- break;
- case 'a':
- you.religion = GOD_ZIN;
- break;
- case 'b':
- you.religion = GOD_YREDELEMNUL;
- break;
- default:
- goto getkey;
- }
-
- ng_pr = keyn == '?'? GOD_RANDOM : you.religion;
- }
- break;
-
- case JOB_THIEF:
- you.inv[0].quantity = 1;
- you.inv[0].base_type = OBJ_WEAPONS;
- you.inv[0].sub_type = WPN_SHORT_SWORD;
-
- you.inv[0].plus = 0;
- you.inv[0].plus2 = 0;
- you.inv[0].special = 0;
- you.inv[0].colour = LIGHTCYAN;
-
- you.inv[1].quantity = 1;
- you.inv[1].base_type = OBJ_WEAPONS;
- you.inv[1].sub_type = WPN_DAGGER;
-
- you.inv[1].plus = 0;
- you.inv[1].plus2 = 0;
- you.inv[1].special = 0;
- you.inv[1].colour = LIGHTCYAN;
-
- you.inv[2].quantity = 1;
- you.inv[2].base_type = OBJ_ARMOUR;
- you.inv[2].sub_type = ARM_ROBE;
- you.inv[2].plus = 0;
- you.inv[2].special = 0;
- you.inv[2].colour = BROWN;
-
- you.inv[3].quantity = 1;
- you.inv[3].base_type = OBJ_ARMOUR;
- you.inv[3].sub_type = ARM_CLOAK;
- you.inv[3].plus = 0;
- you.inv[3].special = 0;
- you.inv[3].colour = DARKGREY;
-
- you.inv[4].base_type = OBJ_MISSILES;
- you.inv[4].sub_type = MI_DART;
- you.inv[4].quantity = 10 + roll_dice( 2, 10 );
- you.inv[4].plus = 0;
- you.inv[4].special = 0;
- you.inv[4].colour = LIGHTCYAN;
-
- you.equip[EQ_WEAPON] = 0;
- you.equip[EQ_BODY_ARMOUR] = 2;
- you.equip[EQ_CLOAK] = 3;
-
- you.skills[SK_FIGHTING] = 1;
- you.skills[SK_SHORT_BLADES] = 2;
- you.skills[SK_DODGING] = 2;
- you.skills[SK_STEALTH] = 2;
- you.skills[SK_STABBING] = 1;
- you.skills[SK_DODGING + random2(3)]++;
- you.skills[SK_RANGED_COMBAT] = 1;
- you.skills[SK_DARTS] = 1;
- you.skills[SK_TRAPS_DOORS] = 2;
- break;
-
- case JOB_GLADIATOR:
- you.inv[0].quantity = 1;
- you.inv[0].base_type = OBJ_WEAPONS;
- you.inv[0].sub_type = WPN_SHORT_SWORD;
- choose_weapon();
-
- you.inv[0].plus = 0;
- you.inv[0].plus2 = 0;
- you.inv[0].special = 0;
- you.inv[0].colour = LIGHTCYAN;
-
- if (player_genus(GENPC_DRACONIAN))
- {
- you.inv[1].quantity = 1;
- you.inv[1].base_type = OBJ_ARMOUR;
- you.inv[1].sub_type = ARM_ANIMAL_SKIN;
- you.inv[1].plus = 0;
- you.inv[1].special = 0;
- you.inv[1].colour = BROWN;
-
- you.inv[2].quantity = 1;
- you.inv[2].base_type = OBJ_ARMOUR;
- you.inv[2].sub_type = ARM_SHIELD;
- you.inv[2].plus = 0;
- you.inv[2].special = 0;
- you.inv[2].colour = LIGHTCYAN;
- }
- else
- {
- you.inv[1].quantity = 1;
- you.inv[1].base_type = OBJ_ARMOUR;
- you.inv[1].sub_type = ARM_RING_MAIL;
- you.inv[1].plus = 0;
- you.inv[1].special = 0;
- you.inv[1].colour = LIGHTCYAN;
-
- you.inv[2].quantity = 1;
- you.inv[2].base_type = OBJ_ARMOUR;
- you.inv[2].sub_type = ARM_BUCKLER;
- you.inv[2].plus = 0;
- you.inv[2].special = 0;
- you.inv[2].colour = LIGHTCYAN;
- }
-
- you.equip[EQ_WEAPON] = 0;
- you.equip[EQ_BODY_ARMOUR] = 1;
- you.equip[EQ_SHIELD] = 2;
-
- you.skills[SK_FIGHTING] = 3;
- weap_skill = 3;
-
- if (player_genus(GENPC_DRACONIAN))
- you.skills[SK_DODGING] = 2;
- else
- you.skills[SK_ARMOUR] = 2;
-
- you.skills[SK_SHIELDS] = 1;
- you.skills[SK_UNARMED_COMBAT] = 2;
- break;
-
-
- case JOB_NECROMANCER:
- you.inv[0].quantity = 1;
- you.inv[0].base_type = OBJ_WEAPONS;
- you.inv[0].sub_type = WPN_DAGGER;
- you.inv[0].plus = 0;
- you.inv[0].plus2 = 0;
- you.inv[0].special = 0;
- you.inv[0].colour = LIGHTCYAN;
- you.inv[1].quantity = 1;
- you.inv[1].base_type = OBJ_ARMOUR;
- you.inv[1].sub_type = ARM_ROBE;
- you.inv[1].plus = 0;
- you.inv[1].special = 0;
- you.inv[1].colour = DARKGREY;
- you.equip[EQ_WEAPON] = 0;
- you.equip[EQ_BODY_ARMOUR] = 1;
-
- you.inv[2].base_type = OBJ_BOOKS;
- you.inv[2].sub_type = BOOK_NECROMANCY;
- you.inv[2].quantity = 1;
- you.inv[2].plus = 0; // = 127
- you.inv[2].special = 0; // = 1;
- you.inv[2].colour = DARKGREY;
-
- you.skills[SK_DODGING] = 1;
- you.skills[SK_STEALTH] = 1;
- you.skills[(coinflip()? SK_DODGING : SK_STEALTH)]++;
- you.skills[SK_SPELLCASTING] = 1;
- you.skills[SK_NECROMANCY] = 4;
- you.skills[SK_SHORT_BLADES] = 1;
- you.skills[SK_STAVES] = 1;
- break;
-
- case JOB_PALADIN:
- you.religion = GOD_SHINING_ONE;
- you.piety = 28;
-
- you.inv[0].quantity = 1;
- you.inv[0].base_type = OBJ_WEAPONS;
- you.inv[0].sub_type = WPN_FALCHION;
- you.inv[0].plus = 0;
- you.inv[0].plus2 = 0;
- you.inv[0].special = 0;
- you.inv[0].colour = LIGHTCYAN;
-
- you.inv[1].quantity = 1;
- you.inv[1].base_type = OBJ_ARMOUR;
- you.inv[1].sub_type = ARM_ROBE;
- you.inv[1].plus = 0;
- you.inv[1].special = 0;
- you.inv[1].colour = WHITE;
-
- you.inv[2].quantity = 1;
- you.inv[2].base_type = OBJ_ARMOUR;
- you.inv[2].sub_type = ARM_SHIELD;
- you.inv[2].plus = 0;
- you.inv[2].special = 0;
- you.inv[2].colour = LIGHTCYAN;
-
- you.equip[EQ_WEAPON] = 0;
- you.equip[EQ_BODY_ARMOUR] = 1;
- you.equip[EQ_SHIELD] = 2;
-
- you.inv[3].base_type = OBJ_POTIONS;
- you.inv[3].sub_type = POT_HEALING;
- you.inv[3].quantity = 1;
- you.inv[3].plus = 0;
-
- you.skills[SK_FIGHTING] = 2;
- you.skills[SK_ARMOUR] = 1;
- you.skills[SK_DODGING] = 1;
- you.skills[(coinflip()? SK_ARMOUR : SK_DODGING)]++;
- you.skills[SK_SHIELDS] = 2;
- you.skills[SK_LONG_SWORDS] = 3;
- you.skills[SK_INVOCATIONS] = 2;
- break;
-
- case JOB_ASSASSIN:
- you.inv[0].quantity = 1;
- you.inv[0].base_type = OBJ_WEAPONS;
- you.inv[0].sub_type = WPN_DAGGER;
- to_hit_bonus = random2(3);
- you.inv[0].plus = 1 + to_hit_bonus;
- you.inv[0].plus2 = 1 + (2 - to_hit_bonus);
- you.inv[0].special = 0;
- you.inv[0].colour = LIGHTCYAN;
-
- you.inv[1].quantity = 1;
- you.inv[1].base_type = OBJ_WEAPONS;
- you.inv[1].sub_type = WPN_BLOWGUN;
- you.inv[1].plus = 0;
- you.inv[1].plus2 = 0;
- you.inv[1].special = 0;
- you.inv[1].colour = LIGHTGREY;
-
- you.inv[2].quantity = 1;
- you.inv[2].base_type = OBJ_ARMOUR;
- you.inv[2].sub_type = ARM_ROBE;
- you.inv[2].plus = 0;
- you.inv[2].special = 0;
- you.inv[2].colour = DARKGREY;
-
- you.inv[3].quantity = 1;
- you.inv[3].base_type = OBJ_ARMOUR;
- you.inv[3].sub_type = ARM_CLOAK;
- you.inv[3].plus = 0;
- you.inv[3].special = 0;
- you.inv[3].colour = DARKGREY;
-
- you.inv[4].base_type = OBJ_MISSILES;
- you.inv[4].sub_type = MI_NEEDLE;
- you.inv[4].quantity = 10 + roll_dice( 2, 10 );
- you.inv[4].plus = 0;
- you.inv[4].colour = WHITE;
- set_item_ego_type( you.inv[4], OBJ_MISSILES, SPMSL_POISONED );
-
- // deep elves get hand crossbows, everyone else gets blowguns
- // (deep elves tend to suck at melee and need something that
- // can do ranged damage)
- if (you.species == SP_DEEP_ELF)
- {
- you.inv[1].sub_type = WPN_HAND_CROSSBOW;
- you.inv[1].colour = BROWN;
-
- you.inv[4].sub_type = MI_DART;
- you.inv[4].colour = LIGHTCYAN;
- }
-
-
- you.equip[EQ_WEAPON] = 0;
- you.equip[EQ_BODY_ARMOUR] = 2;
- you.equip[EQ_CLOAK] = 3;
-
- you.skills[SK_FIGHTING] = 2;
- you.skills[SK_SHORT_BLADES] = 2;
- you.skills[SK_DODGING] = 1;
- you.skills[SK_STEALTH] = 3;
- you.skills[SK_STABBING] = 2;
- you.skills[SK_RANGED_COMBAT] = 1;
- you.skills[SK_DARTS] = 1;
- if (you.species == SP_DEEP_ELF)
- you.skills[SK_CROSSBOWS] = 1;
- else
- you.skills[SK_RANGED_COMBAT] += 1;
-
- break;
-
- case JOB_BERSERKER:
- you.religion = GOD_TROG;
- you.piety = 35;
-
- // WEAPONS
- if (you.species == SP_OGRE)
- {
- you.inv[0].quantity = 1;
- you.inv[0].base_type = OBJ_WEAPONS;
- you.inv[0].sub_type = WPN_CLUB;
- you.inv[0].plus = 0;
- you.inv[0].plus2 = 0;
- you.inv[0].special = 0;
- you.inv[0].colour = BROWN;
- you.equip[EQ_WEAPON] = 0;
- }
- else if (you.species == SP_TROLL)
- {
- you.equip[EQ_WEAPON] = -1;
- }
- else
- {
- you.inv[0].quantity = 1;
- you.inv[0].base_type = OBJ_WEAPONS;
- you.inv[0].sub_type = WPN_HAND_AXE;
- you.inv[0].plus = 0;
- you.inv[0].plus2 = 0;
- you.inv[0].special = 0;
- you.inv[0].colour = LIGHTCYAN;
- you.equip[EQ_WEAPON] = 0;
-
- for (unsigned char i = 1; i <= 3; i++)
- {
- you.inv[i].quantity = 1;
- you.inv[i].base_type = OBJ_WEAPONS;
- you.inv[i].sub_type = WPN_SPEAR;
- you.inv[i].plus = 0;
- you.inv[i].plus2 = 0;
- you.inv[i].special = 0;
- you.inv[i].colour = LIGHTCYAN;
- }
- }
-
- // ARMOUR
-
- if (you.species == SP_OGRE || you.species == SP_TROLL
- || player_genus(GENPC_DRACONIAN))
- {
- you.inv[1].quantity = 1;
- you.inv[1].base_type = OBJ_ARMOUR;
- you.inv[1].sub_type = ARM_ANIMAL_SKIN;
- you.inv[1].plus = 0;
- you.inv[1].special = 0;
- you.inv[1].colour = BROWN;
- you.equip[EQ_BODY_ARMOUR] = 1;
- }
- else
- {
- you.inv[4].quantity = 1;
- you.inv[4].base_type = OBJ_ARMOUR;
- you.inv[4].sub_type = ARM_LEATHER_ARMOUR;
- you.inv[4].plus = 0;
- you.inv[4].special = 0;
- you.inv[4].colour = BROWN;
- you.equip[EQ_BODY_ARMOUR] = 4;
- }
-
- // SKILLS
- you.skills[SK_FIGHTING] = 2;
-
- if (you.species == SP_TROLL)
- {
- // no wep - give them unarmed.
- you.skills[SK_FIGHTING] += 3;
- you.skills[SK_DODGING] = 2;
- you.skills[SK_UNARMED_COMBAT] = 2;
- }
- else if (you.species == SP_OGRE)
- {
- you.skills[SK_FIGHTING] += 3;
- you.skills[SK_AXES] = 1;
- you.skills[SK_MACES_FLAILS] = 3;
- }
- else
- {
- you.skills[SK_AXES] = 3;
- you.skills[SK_POLEARMS] = 1;
- you.skills[SK_ARMOUR] = 2;
- you.skills[SK_DODGING] = 2;
- you.skills[SK_RANGED_COMBAT] = 2;
- }
- break;
-
- case JOB_HUNTER:
- you.inv[0].quantity = 1;
- you.inv[0].base_type = OBJ_WEAPONS;
- you.inv[0].sub_type = WPN_DAGGER;
- you.inv[0].plus = 0;
- you.inv[0].plus2 = 0;
- you.inv[0].special = 0;
- you.inv[0].colour = LIGHTCYAN;
-
- you.inv[4].quantity = 1;
- you.inv[4].base_type = OBJ_ARMOUR;
- you.inv[4].sub_type = ARM_LEATHER_ARMOUR;
- you.inv[4].plus = 0;
- you.inv[4].special = 0;
- you.inv[4].colour = BROWN;
-
- if (you.species != SP_MERFOLK)
- {
- you.inv[2].quantity = 15 + random2avg(21, 5);
- you.inv[2].base_type = OBJ_MISSILES;
- you.inv[2].sub_type = MI_ARROW;
- you.inv[2].plus = 0;
- you.inv[2].plus2 = 0;
- you.inv[2].special = 0;
- you.inv[2].colour = BROWN;
-
- you.inv[1].quantity = 1;
- you.inv[1].base_type = OBJ_WEAPONS;
- you.inv[1].sub_type = WPN_BOW;
- you.inv[1].plus = 0;
- you.inv[1].plus2 = 0;
- you.inv[1].special = 0;
- you.inv[1].colour = BROWN;
- }
- else
- {
- // Merfolk are spear hunters -- clobber bow, give three spears
- for (unsigned char i = 1; i <= 3; i++)
- {
- you.inv[i].quantity = 1;
- you.inv[i].base_type = OBJ_WEAPONS;
- you.inv[i].sub_type = WPN_SPEAR;
- you.inv[i].plus = 0;
- you.inv[i].plus2 = 0;
- you.inv[i].special = 0;
- you.inv[i].colour = LIGHTCYAN;
- }
- }
-
- if (player_genus(GENPC_DRACONIAN))
- {
- you.inv[4].sub_type = ARM_ROBE;
- you.inv[4].colour = GREEN;
- }
-
- you.equip[EQ_WEAPON] = 0;
- you.equip[EQ_BODY_ARMOUR] = 4;
-
- you.skills[SK_FIGHTING] = 2;
- you.skills[SK_RANGED_COMBAT] = 3;
-
- // Removing spellcasting -- bwr
- // you.skills[SK_SPELLCASTING] = 1;
-
- switch (you.species)
- {
- case SP_HALFLING:
- case SP_GNOME:
- you.inv[2].quantity += random2avg(15, 2);
- you.inv[2].sub_type = MI_STONE;
- you.inv[2].colour = BROWN;
- you.inv[1].sub_type = WPN_SLING;
-
- you.skills[SK_DODGING] = 2;
- you.skills[SK_STEALTH] = 2;
- you.skills[SK_SLINGS] = 2;
- break;
-
- case SP_HILL_DWARF:
- case SP_MOUNTAIN_DWARF:
- case SP_HILL_ORC:
- you.inv[2].sub_type = MI_BOLT;
- you.inv[2].colour = LIGHTCYAN;
- you.inv[1].sub_type = WPN_CROSSBOW;
-
- if (you.species == SP_HILL_ORC)
- {
- you.inv[0].sub_type = WPN_SHORT_SWORD;
- you.skills[SK_SHORT_BLADES] = 1;
- }
- else
- {
- you.inv[0].sub_type = WPN_HAND_AXE;
- you.skills[SK_AXES] = 1;
- }
-
- you.skills[SK_DODGING] = 1;
- you.skills[SK_SHIELDS] = 1;
- you.skills[SK_CROSSBOWS] = 2;
- break;
-
- case SP_MERFOLK:
- you.inv[0].sub_type = WPN_TRIDENT;
-
- you.skills[SK_POLEARMS] = 2;
- you.skills[SK_DODGING] = 2;
- you.skills[SK_RANGED_COMBAT] += 1;
- break;
-
- default:
- you.skills[SK_DODGING] = 1;
- you.skills[SK_STEALTH] = 1;
- you.skills[(coinflip() ? SK_STABBING : SK_SHIELDS)]++;
- you.skills[SK_BOWS] = 2;
- break;
- }
- break;
-
- case JOB_CONJURER:
- case JOB_ENCHANTER:
- case JOB_SUMMONER:
- case JOB_FIRE_ELEMENTALIST:
- case JOB_ICE_ELEMENTALIST:
- case JOB_AIR_ELEMENTALIST:
- case JOB_EARTH_ELEMENTALIST:
- case JOB_VENOM_MAGE:
- you.inv[0].quantity = 1;
- you.inv[0].base_type = OBJ_WEAPONS;
- you.inv[0].sub_type = WPN_DAGGER;
- you.inv[0].colour = LIGHTCYAN;
- you.inv[0].plus = 0;
- you.inv[0].plus2 = 0;
- you.inv[0].special = 0;
-
- you.inv[1].quantity = 1;
- you.inv[1].base_type = OBJ_ARMOUR;
- you.inv[1].sub_type = ARM_ROBE;
- you.inv[1].plus = 0;
-
- if (you.char_class == JOB_ENCHANTER)
- {
- you.inv[0].plus = 1;
- you.inv[0].plus2 = 1;
- you.inv[1].plus = 1;
- }
-
- you.inv[1].special = 0;
-
- you.equip[EQ_WEAPON] = 0;
- you.equip[EQ_BODY_ARMOUR] = 1;
- you.inv[2].base_type = OBJ_BOOKS;
- you.inv[2].sub_type = give_first_conjuration_book();
- you.inv[2].plus = 0;
-
- switch (you.char_class)
- {
- case JOB_SUMMONER:
- you.inv[2].sub_type = BOOK_CALLINGS;
-
- you.skills[SK_SUMMONINGS] = 4;
-
- // gets some darts - this class is difficult to start off with
- you.inv[3].base_type = OBJ_MISSILES;
- you.inv[3].sub_type = MI_DART;
- you.inv[3].quantity = 8 + roll_dice( 2, 8 );
- you.inv[3].plus = 0;
- you.inv[3].special = 0;
- you.inv[3].colour = LIGHTCYAN;
- break;
-
- case JOB_CONJURER:
- you.skills[SK_CONJURATIONS] = 4;
- break;
-
- case JOB_ENCHANTER:
- you.inv[2].sub_type = BOOK_CHARMS;
-
- you.skills[SK_ENCHANTMENTS] = 4;
-
- // gets some darts - this class is difficult to start off with
- you.inv[3].base_type = OBJ_MISSILES;
- you.inv[3].sub_type = MI_DART;
- you.inv[3].quantity = 8 + roll_dice( 2, 8 );
- you.inv[3].plus = 1;
- you.inv[3].special = 0;
- you.inv[3].colour = LIGHTCYAN;
-
- if (you.species == SP_SPRIGGAN)
- {
- you.inv[0].base_type = OBJ_STAVES;
- you.inv[0].sub_type = STAFF_STRIKING;
- you.inv[0].colour = BROWN;
- }
- break;
-
- case JOB_FIRE_ELEMENTALIST:
- you.inv[2].sub_type = BOOK_FLAMES;
-
- you.skills[SK_CONJURATIONS] = 1;
- you.skills[SK_FIRE_MAGIC] = 3;
- //you.skills [SK_ENCHANTMENTS] = 1;
- break;
-
- case JOB_ICE_ELEMENTALIST:
- you.inv[2].sub_type = BOOK_FROST;
-
- you.skills[SK_CONJURATIONS] = 1;
- you.skills[SK_ICE_MAGIC] = 3;
- //you.skills [SK_ENCHANTMENTS] = 1;
- break;
-
- case JOB_AIR_ELEMENTALIST:
- you.inv[2].sub_type = BOOK_AIR;
-
- you.skills[SK_CONJURATIONS] = 1;
- you.skills[SK_AIR_MAGIC] = 3;
- //you.skills [SK_ENCHANTMENTS] = 1;
- break;
-
- case JOB_EARTH_ELEMENTALIST:
- you.inv[2].sub_type = BOOK_GEOMANCY;
-
- you.inv[3].quantity = random2avg(12, 2) + 6;
- you.inv[3].base_type = OBJ_MISSILES;
- you.inv[3].sub_type = MI_STONE;
- you.inv[3].plus = 0;
- you.inv[3].plus2 = 0;
- you.inv[3].special = 0;
- you.inv[3].colour = BROWN;
-
- if (you.species == SP_GNOME)
- {
- you.inv[1].quantity = 1;
- you.inv[1].base_type = OBJ_WEAPONS;
- you.inv[1].sub_type = WPN_SLING;
- you.inv[1].plus = 0;
- you.inv[1].plus2 = 0;
- you.inv[1].special = 0;
- you.inv[1].colour = BROWN;
-
- you.inv[4].quantity = 1;
- you.inv[4].base_type = OBJ_ARMOUR;
- you.inv[4].sub_type = ARM_ROBE;
- you.inv[4].plus = 0;
- you.inv[4].plus2 = 0;
- you.inv[4].special = 0;
- you.inv[4].colour = BROWN;
- you.equip[EQ_BODY_ARMOUR] = 4;
-
- }
- you.skills[SK_TRANSMIGRATION] = 1;
- you.skills[SK_EARTH_MAGIC] = 3;
- break;
-
- case JOB_VENOM_MAGE:
- you.inv[2].sub_type = BOOK_YOUNG_POISONERS;
- you.skills[SK_POISON_MAGIC] = 4;
- break;
- }
-
- if (you.species == SP_OGRE_MAGE)
- {
- you.inv[0].sub_type = WPN_QUARTERSTAFF;
- you.inv[0].colour = BROWN;
- }
- else if (player_genus(GENPC_DWARVEN))
- {
- you.inv[0].sub_type = WPN_HAMMER;
- you.inv[0].colour = CYAN;
- }
-
- you.inv[2].quantity = 1;
- you.inv[2].special = 0;
-
- switch (you.char_class)
- {
- case JOB_FIRE_ELEMENTALIST: tmp = RED; break;
- case JOB_ICE_ELEMENTALIST: tmp = LIGHTCYAN; break;
- case JOB_AIR_ELEMENTALIST: tmp = LIGHTBLUE; break;
- case JOB_EARTH_ELEMENTALIST: tmp = BROWN; break;
- case JOB_VENOM_MAGE: tmp = GREEN; break;
- default: tmp = random_colour(); break;
- }
-
- you.inv[1].colour = tmp; // robe
- you.inv[2].colour = tmp; // book
-
- you.skills[SK_SPELLCASTING] = 1;
-
- // These summoner races start with polearms and should they
- // get their hands on a polearm of reaching they should have
- // lots of fun... -- bwr
- if (you.char_class == JOB_SUMMONER
- && (you.species == SP_MERFOLK || you.species == SP_HILL_ORC ||
- you.species == SP_KENKU || you.species == SP_MINOTAUR))
- {
- if (you.species == SP_MERFOLK)
- you.inv[0].sub_type = WPN_TRIDENT;
- else
- you.inv[0].sub_type = WPN_SPEAR;
-
- you.skills[SK_POLEARMS] = 1;
- }
- else if (player_genus(GENPC_DWARVEN))
- {
- you.skills[SK_MACES_FLAILS] = 1;
- }
- else if (you.char_class == JOB_ENCHANTER && you.species == SP_SPRIGGAN)
- {
- you.skills[SK_EVOCATIONS] = 1;
- }
- else
- {
- you.skills[SK_SHORT_BLADES] = 1;
- }
-
- if (you.species == SP_GNOME)
- you.skills[SK_SLINGS]++;
- else
- you.skills[SK_STAVES]++;
-
- you.skills[SK_DODGING] = 1;
- you.skills[SK_STEALTH] = 1;
-
- if (you.species == SP_GNOME && you.char_class == JOB_EARTH_ELEMENTALIST)
- you.skills[SK_RANGED_COMBAT]++;
- else
- you.skills[ coinflip() ? SK_DODGING : SK_STEALTH ]++;
- break;
-
- case JOB_TRANSMUTER:
- // some sticks for sticks to snakes:
- you.inv[1].quantity = 6 + roll_dice( 3, 4 );
- you.inv[1].base_type = OBJ_MISSILES;
- you.inv[1].sub_type = MI_ARROW;
- you.inv[1].plus = 0;
- you.inv[1].plus2 = 0;
- you.inv[1].special = 0;
- you.inv[1].colour = BROWN;
-
- you.inv[2].base_type = OBJ_ARMOUR;
- you.inv[2].sub_type = ARM_ROBE;
- you.inv[2].plus = 0;
- you.inv[2].special = 0;
- you.inv[2].quantity = 1;
- you.inv[2].colour = BROWN;
-
- you.inv[3].base_type = OBJ_BOOKS;
- you.inv[3].sub_type = BOOK_CHANGES;
- you.inv[3].quantity = 1;
- you.inv[3].plus = 0;
- you.inv[3].special = 0;
- you.inv[3].colour = random_colour();
-
- // A little bit of starting ammo for evaporate... don't need too
- // much now that the character can make their own. -- bwr
- //
- // some ammo for evaporate:
- you.inv[4].base_type = OBJ_POTIONS;
- you.inv[4].sub_type = POT_CONFUSION;
- you.inv[4].quantity = 2;
- you.inv[4].plus = 0;
-
- // some more ammo for evaporate:
- you.inv[5].base_type = OBJ_POTIONS;
- you.inv[5].sub_type = POT_POISON;
- you.inv[5].quantity = 1;
- you.inv[5].plus = 0;
-
- you.equip[EQ_WEAPON] = -1;
- you.equip[EQ_BODY_ARMOUR] = 2;
-
- you.skills[SK_FIGHTING] = 1;
- you.skills[SK_UNARMED_COMBAT] = 3;
- you.skills[SK_RANGED_COMBAT] = 2;
- you.skills[SK_DODGING] = 2;
- you.skills[SK_SPELLCASTING] = 2;
- you.skills[SK_TRANSMIGRATION] = 2;
-
- if (you.species == SP_SPRIGGAN)
- {
- you.inv[0].base_type = OBJ_STAVES;
- you.inv[0].sub_type = STAFF_STRIKING;
- you.inv[0].quantity = 1;
- you.inv[0].plus = 0;
- you.inv[0].plus2 = 0;
- you.inv[0].special = 0;
- you.inv[0].colour = BROWN;
-
- you.skills[SK_EVOCATIONS] = 2;
- you.skills[SK_FIGHTING] = 0;
-
- you.equip[EQ_WEAPON] = 0;
- }
- break;
-
- case JOB_WARPER:
- you.inv[0].quantity = 1;
- you.inv[0].plus = 0;
- you.inv[0].plus2 = 0;
- you.inv[0].special = 0;
- you.inv[0].colour = LIGHTCYAN;
-
- if (you.species == SP_SPRIGGAN)
- {
- you.inv[0].base_type = OBJ_STAVES;
- you.inv[0].sub_type = STAFF_STRIKING;
- you.inv[0].colour = BROWN;
-
- you.skills[SK_EVOCATIONS] = 3;
- }
- else
- {
- you.inv[0].base_type = OBJ_WEAPONS;
- you.inv[0].sub_type = WPN_SHORT_SWORD;
-
- if (you.species == SP_OGRE_MAGE)
- {
- you.inv[0].sub_type = WPN_QUARTERSTAFF;
- you.inv[0].colour = BROWN;
- }
-
- weap_skill = 2;
- you.skills[SK_FIGHTING] = 1;
- }
-
- you.inv[1].base_type = OBJ_ARMOUR;
- you.inv[1].sub_type = ARM_LEATHER_ARMOUR;
- you.inv[1].quantity = 1;
- you.inv[1].plus = 0;
- you.inv[1].special = 0;
- you.inv[1].colour = BROWN;
-
- if (you.species == SP_SPRIGGAN || you.species == SP_OGRE_MAGE)
- you.inv[1].sub_type = ARM_ROBE;
-
- you.inv[2].base_type = OBJ_BOOKS;
- you.inv[2].sub_type = BOOK_SPATIAL_TRANSLOCATIONS;
- you.inv[2].quantity = 1;
- you.inv[2].plus = 0;
- you.inv[2].special = 0;
- you.inv[2].colour = random_colour();
-
- // one free escape:
- you.inv[3].base_type = OBJ_SCROLLS;
- you.inv[3].sub_type = SCR_BLINKING;
- you.inv[3].quantity = 1;
- you.inv[3].plus = 0;
- you.inv[3].special = 0;
- you.inv[3].colour = WHITE;
-
- you.inv[4].base_type = OBJ_MISSILES;
- you.inv[4].sub_type = MI_DART;
- you.inv[4].quantity = 10 + roll_dice( 2, 10 );
- you.inv[4].plus = 0;
- you.inv[4].special = 0;
- you.inv[4].colour = LIGHTCYAN;
-
- you.equip[EQ_WEAPON] = 0;
- you.equip[EQ_BODY_ARMOUR] = 1;
-
- you.skills[SK_RANGED_COMBAT] = 1;
- you.skills[SK_DARTS] = 2;
- you.skills[SK_DODGING] = 2;
- you.skills[SK_STEALTH] = 1;
- you.skills[SK_SPELLCASTING] = 2;
- you.skills[SK_TRANSLOCATIONS] = 2;
- break;
-
- case JOB_CRUSADER:
- you.inv[0].quantity = 1;
- you.inv[0].base_type = OBJ_WEAPONS;
- you.inv[0].sub_type = WPN_SHORT_SWORD;
-
- //if (you.species == SP_OGRE_MAGE) you.inv_sub_type [0] = WPN_GLAIVE;
-
- you.inv[0].plus = 0;
- you.inv[0].plus2 = 0;
- you.inv[0].special = 0;
- you.inv[0].colour = LIGHTCYAN;
- choose_weapon();
- weap_skill = 2;
- you.inv[1].quantity = 1;
- you.inv[1].base_type = OBJ_ARMOUR;
- you.inv[1].sub_type = ARM_ROBE;
- you.inv[1].plus = 0;
- you.inv[1].special = 0;
- you.inv[1].colour = random_colour();
-
- you.inv[2].base_type = OBJ_BOOKS;
- you.inv[2].sub_type = BOOK_WAR_CHANTS;
- you.inv[2].quantity = 1;
- you.inv[2].plus = 0;
- you.inv[2].special = 0;
- you.inv[2].colour = random_colour();
-
- you.equip[EQ_WEAPON] = 0;
- you.equip[EQ_BODY_ARMOUR] = 1;
-
- you.skills[SK_FIGHTING] = 3;
- you.skills[SK_ARMOUR] = 1;
- you.skills[SK_DODGING] = 1;
- you.skills[SK_STEALTH] = 1;
- you.skills[SK_SPELLCASTING] = 2;
- you.skills[SK_ENCHANTMENTS] = 2;
- break;
-
-
- case JOB_DEATH_KNIGHT:
- you.inv[0].quantity = 1;
- you.inv[0].base_type = OBJ_WEAPONS;
- you.inv[0].sub_type = WPN_SHORT_SWORD;
- you.inv[0].plus = 0;
- you.inv[0].plus2 = 0;
- you.inv[0].special = 0;
- you.inv[0].colour = LIGHTCYAN;
- choose_weapon();
- weap_skill = 2;
-
- you.inv[1].quantity = 1;
- you.inv[1].base_type = OBJ_ARMOUR;
- you.inv[1].sub_type = ARM_ROBE;
- you.inv[1].plus = 0;
- you.inv[1].special = 0;
- you.inv[1].colour = DARKGREY;
-
- you.inv[2].base_type = OBJ_BOOKS;
- you.inv[2].sub_type = BOOK_NECROMANCY;
- you.inv[2].quantity = 1;
- you.inv[2].plus = 0;
- you.inv[2].special = 0;
- you.inv[2].colour = DARKGREY;
-
- you.equip[EQ_WEAPON] = 0;
- you.equip[EQ_BODY_ARMOUR] = 1;
-
- choice = DK_NO_SELECTION;
-
- // order is important here -- bwr
- if (you.species == SP_DEMIGOD)
- choice = DK_NECROMANCY;
- else if (Options.death_knight != DK_NO_SELECTION
- && Options.death_knight != DK_RANDOM)
- {
- ng_dk = choice = Options.death_knight;
- }
- else if (Options.random_pick || Options.death_knight == DK_RANDOM)
- {
- choice = (coinflip() ? DK_NECROMANCY : DK_YREDELEMNUL);
- ng_dk = DK_RANDOM;
- }
- else
- {
- clrscr();
-
- textcolor( CYAN );
- cprintf(EOL " From where do you draw your power?" EOL);
-
- textcolor( LIGHTGREY );
- cprintf("a - Necromantic magic" EOL);
- cprintf("b - the god Yredelemnul" EOL);
-
- if (Options.prev_dk != DK_NO_SELECTION)
- {
- textcolor(BROWN);
- cprintf(EOL "Enter - %s" EOL,
- Options.prev_dk == DK_NECROMANCY? "Necromancy" :
- Options.prev_dk == DK_YREDELEMNUL? "Yredelemnul" :
- "Random");
- }
-
- getkey1:
- keyn = get_ch();
-
- if ((keyn == '\r' || keyn == '\n')
- && Options.prev_dk != DK_NO_SELECTION)
- {
- keyn = Options.prev_dk == DK_NECROMANCY? 'a' :
- Options.prev_dk == DK_YREDELEMNUL? 'b' :
- '?';
- }
-
- switch (keyn)
- {
- case '?':
- choice = coinflip()? DK_NECROMANCY : DK_YREDELEMNUL;
- break;
- case 'a':
- cprintf(EOL "Very well.");
- choice = DK_NECROMANCY;
- break;
- case 'b':
- choice = DK_YREDELEMNUL;
- break;
- default:
- goto getkey1;
- }
-
- ng_dk = keyn == '?'? DK_RANDOM : choice;
- }
-
- switch (choice)
- {
- default: // this shouldn't happen anyways -- bwr
- case DK_NECROMANCY:
- you.skills[SK_SPELLCASTING] = 1;
- you.skills[SK_NECROMANCY] = 2;
- break;
- case DK_YREDELEMNUL:
- you.religion = GOD_YREDELEMNUL;
- you.piety = 28;
- you.inv[0].plus = 1;
- you.inv[0].plus2 = 1;
- you.inv[2].quantity = 0;
- you.skills[SK_INVOCATIONS] = 3;
- break;
- }
-
- you.skills[SK_FIGHTING] = 2;
- you.skills[SK_ARMOUR] = 1;
- you.skills[SK_DODGING] = 1;
- you.skills[SK_STEALTH] = 1;
- //you.skills [SK_SHORT_BLADES] = 2;
- you.skills[SK_STABBING] = 1;
- break;
-
- case JOB_CHAOS_KNIGHT:
- you.piety = 25; // irrelevant for Xom, of course
- you.inv[0].quantity = 1;
- you.inv[0].base_type = OBJ_WEAPONS;
- you.inv[0].sub_type = WPN_SHORT_SWORD;
- you.inv[0].plus = random2(3);
- you.inv[0].plus2 = random2(3);
- you.inv[0].special = 0;
-
- if (one_chance_in(5))
- set_equip_desc( you.inv[0], ISFLAG_RUNED );
-
- if (one_chance_in(5))
- set_equip_desc( you.inv[0], ISFLAG_GLOWING );
-
- you.inv[0].colour = LIGHTCYAN;
- choose_weapon();
- weap_skill = 2;
- you.inv[1].quantity = 1;
- you.inv[1].base_type = OBJ_ARMOUR;
- you.inv[1].sub_type = ARM_ROBE;
- you.inv[1].plus = random2(3);
- you.inv[1].special = 0;
- you.inv[1].colour = random_colour();
-
- you.equip[EQ_WEAPON] = 0;
- you.equip[EQ_BODY_ARMOUR] = 1;
-
- you.skills[SK_FIGHTING] = 3;
- you.skills[SK_ARMOUR] = 1;
- you.skills[SK_DODGING] = 1;
- you.skills[(coinflip()? SK_ARMOUR : SK_DODGING)]++;
- you.skills[SK_STABBING] = 1;
-
- if (Options.chaos_knight != GOD_NO_GOD
- && Options.chaos_knight != GOD_RANDOM)
- {
- ng_ck = you.religion = Options.chaos_knight;
- }
- else if (Options.random_pick || Options.chaos_knight == GOD_RANDOM)
- {
- you.religion = coinflip() ? GOD_XOM : GOD_MAKHLEB;
- ng_ck = GOD_RANDOM;
- }
- else
- {
- clrscr();
-
- textcolor( CYAN );
- cprintf(EOL " Which god of chaos do you wish to serve?" EOL);
-
- textcolor( LIGHTGREY );
- cprintf("a - Xom of Chaos" EOL);
- cprintf("b - Makhleb the Destroyer" EOL);
-
- if (Options.prev_ck != GOD_NO_GOD)
- {
- textcolor(BROWN);
- cprintf(EOL "Enter - %s" EOL,
- Options.prev_ck == GOD_XOM? "Xom" :
- Options.prev_ck == GOD_MAKHLEB? "Makhleb" :
- "Random");
- textcolor(LIGHTGREY);
- }
-
- getkey2:
-
- keyn = get_ch();
-
- if ((keyn == '\r' || keyn == '\n')
- && Options.prev_ck != GOD_NO_GOD)
- {
- keyn = Options.prev_ck == GOD_XOM? 'a' :
- Options.prev_ck == GOD_MAKHLEB? 'b' :
- '?';
- }
-
- switch (keyn)
- {
- case '?':
- you.religion = coinflip()? GOD_XOM : GOD_MAKHLEB;
- break;
- case 'a':
- you.religion = GOD_XOM;
- break;
- case 'b':
- you.religion = GOD_MAKHLEB;
- break;
- default:
- goto getkey2;
- }
-
- ng_ck = keyn == '?'? GOD_RANDOM : you.religion;
- }
-
- if (you.religion == GOD_XOM)
- you.skills[SK_FIGHTING]++;
- else // you.religion == GOD_MAKHLEB
- you.skills[SK_INVOCATIONS] = 2;
-
- break;
-
- case JOB_HEALER:
- you.religion = GOD_ELYVILON;
- you.piety = 45;
-
- you.inv[0].quantity = 1;
- you.inv[0].base_type = OBJ_WEAPONS;
- you.inv[0].sub_type = WPN_QUARTERSTAFF;
- you.inv[0].colour = BROWN;
- you.inv[0].plus = 0;
- you.inv[0].plus2 = 0;
- you.inv[0].special = 0;
-
- // Robe
- you.inv[1].quantity = 1;
- you.inv[1].base_type = OBJ_ARMOUR;
- you.inv[1].sub_type = ARM_ROBE;
- you.inv[1].plus = 0;
- you.inv[1].special = 0;
- you.inv[1].colour = WHITE;
-
- you.inv[2].base_type = OBJ_POTIONS;
- you.inv[2].sub_type = POT_HEALING;
- you.inv[2].quantity = 1;
- you.inv[2].plus = 0;
-
- you.inv[3].base_type = OBJ_POTIONS;
- you.inv[3].sub_type = POT_HEAL_WOUNDS;
- you.inv[3].quantity = 1;
- you.inv[3].plus = 0;
-
- you.equip[EQ_WEAPON] = 0;
- you.equip[EQ_BODY_ARMOUR] = 1;
-
- you.skills[SK_FIGHTING] = 2;
- you.skills[SK_DODGING] = 1;
- you.skills[SK_SHIELDS] = 1;
- you.skills[SK_RANGED_COMBAT] = 2;
- you.skills[SK_STAVES] = 3;
- you.skills[SK_INVOCATIONS] = 2;
- break;
-
- case JOB_REAVER:
- you.inv[0].quantity = 1;
- you.inv[0].base_type = OBJ_WEAPONS;
- you.inv[0].sub_type = WPN_SHORT_SWORD;
- you.inv[0].plus = 0;
- you.inv[0].plus2 = 0;
- you.inv[0].special = 0;
- you.inv[0].colour = LIGHTCYAN;
- choose_weapon();
- weap_skill = 3;
-
- you.inv[1].quantity = 1;
- you.inv[1].base_type = OBJ_ARMOUR;
- you.inv[1].sub_type = ARM_ROBE;
- you.inv[1].plus = 0;
- you.inv[1].special = 0;
- you.inv[1].colour = RED;
-
- you.inv[2].base_type = OBJ_BOOKS;
- you.inv[2].sub_type = give_first_conjuration_book();
- you.inv[2].quantity = 1;
- you.inv[2].plus = 0; // = 127
- you.inv[2].special = 0;
- you.inv[2].colour = RED;
-
- you.equip[EQ_WEAPON] = 0;
- you.equip[EQ_BODY_ARMOUR] = 1;
-
- you.skills[SK_FIGHTING] = 2;
- you.skills[SK_ARMOUR] = 1;
- you.skills[SK_DODGING] = 1;
-
- you.skills[SK_SPELLCASTING] = 1;
- you.skills[SK_CONJURATIONS] = 2;
- break;
-
- case JOB_STALKER:
- you.inv[0].quantity = 1;
- you.inv[0].base_type = OBJ_WEAPONS;
- you.inv[0].sub_type = WPN_DAGGER;
- to_hit_bonus = random2(3);
- you.inv[0].plus = 1 + to_hit_bonus;
- you.inv[0].plus2 = 1 + (2 - to_hit_bonus);
- you.inv[0].special = 0;
- you.inv[0].colour = LIGHTCYAN;
-
- you.inv[1].quantity = 1;
- you.inv[1].base_type = OBJ_ARMOUR;
- you.inv[1].sub_type = ARM_ROBE;
- you.inv[1].plus = 0;
- you.inv[1].special = 0;
- you.inv[1].colour = GREEN;
-
- you.inv[2].quantity = 1;
- you.inv[2].base_type = OBJ_ARMOUR;
- you.inv[2].sub_type = ARM_CLOAK;
- you.inv[2].plus = 0;
- you.inv[2].special = 0;
- you.inv[2].colour = DARKGREY;
-
- you.inv[3].base_type = OBJ_BOOKS;
- //you.inv[3].sub_type = BOOK_YOUNG_POISONERS;
- you.inv[3].sub_type = BOOK_STALKING; //jmf: new book!
- you.inv[3].quantity = 1;
- you.inv[3].plus = 0;
- you.inv[3].special = 0;
- you.inv[3].colour = GREEN;
-
- you.equip[EQ_WEAPON] = 0;
- you.equip[EQ_BODY_ARMOUR] = 1;
- you.equip[EQ_CLOAK] = 2;
-
- 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_STEALTH] = 2;
- you.skills[SK_STABBING] = 2;
- you.skills[SK_DODGING + random2(3)]++;
- //you.skills[SK_RANGED_COMBAT] = 1; //jmf: removed these, added magic below
- //you.skills[SK_DARTS] = 1;
- you.skills[SK_SPELLCASTING] = 1;
- you.skills[SK_ENCHANTMENTS] = 1;
- break;
-
- case JOB_MONK:
- you.inv[0].base_type = OBJ_ARMOUR;
- you.inv[0].sub_type = ARM_ROBE;
- you.inv[0].plus = 0;
- you.inv[0].special = 0;
- you.inv[0].quantity = 1;
- you.inv[0].colour = BROWN;
-
- you.equip[EQ_WEAPON] = -1;
- you.equip[EQ_BODY_ARMOUR] = 0;
-
- you.skills[SK_FIGHTING] = 3;
- you.skills[SK_UNARMED_COMBAT] = 4;
- you.skills[SK_DODGING] = 3;
- you.skills[SK_STEALTH] = 2;
- break;
-
- case JOB_WANDERER:
- create_wanderer();
- break;
- }
-
- if (weap_skill)
- you.skills[weapon_skill(OBJ_WEAPONS, you.inv[0].sub_type)] = weap_skill;
-
- init_skill_order();
-
- if (you.religion != GOD_NO_GOD)
- {
- you.worshipped[you.religion] = 1;
- set_god_ability_slots();
- }
-}