home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 2 / Apprentice-Release2.iso / Source Code / C / Games / NetHack 3.1.3 / source / src / u_init.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-08-01  |  18.2 KB  |  681 lines  |  [TEXT/R*ch]

  1. /*    SCCS Id: @(#)u_init.c    3.1    93/07/07    */
  2. /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
  3. /* NetHack may be freely redistributed.  See license for details. */
  4.  
  5. #include "hack.h"
  6.  
  7. struct trobj {
  8.     unsigned short int trotyp;
  9.     schar trspe;
  10.     char trclass;
  11.     Bitfield(trquan,6);
  12.     Bitfield(trknown,1);
  13.     Bitfield(trbless,2);
  14. };
  15.  
  16. static void FDECL(ini_inv, (struct trobj *));
  17. static void FDECL(knows_object,(int));
  18. static void FDECL(knows_class,(CHAR_P));
  19. static int FDECL(role_index,(CHAR_P));
  20.  
  21. #define    UNDEF_TYP    0
  22. #define    UNDEF_SPE    '\177'
  23. #define    UNDEF_BLESS    2
  24.  
  25. static boolean random_role = FALSE;
  26.  
  27. /* all roles must all have distinct first letter */
  28. const char *roles[] = {    /* also used in options.c and winxxx.c */
  29.             /* roles[2] and [6] are changed for females */
  30.             /* in all cases, the corresponding male and female */
  31.             /* roles must start with the same letter */
  32.     "Archeologist", "Barbarian", "Caveman", "Elf", "Healer", "Knight",
  33.     "Priest", "Rogue", "Samurai",
  34. #ifdef TOURIST
  35.     "Tourist",
  36. #endif
  37.     "Valkyrie", "Wizard", 0
  38. };
  39.  
  40. static struct trobj Cave_man[] = {
  41. #define C_ARROWS    2
  42.     { CLUB, 1, WEAPON_CLASS, 1, 1, UNDEF_BLESS },
  43.     { BOW, 1, WEAPON_CLASS, 1, 1, UNDEF_BLESS },
  44.     { ARROW, 0, WEAPON_CLASS, 25, 1, UNDEF_BLESS },    /* quan is variable */
  45.     { LEATHER_ARMOR, 0, ARMOR_CLASS, 1, 1, UNDEF_BLESS },
  46.     { 0, 0, 0, 0, 0, 0 }
  47. };
  48.  
  49. static struct trobj Barbarian[] = {
  50. #define B_MAJOR 0    /* two-handed sword or battle-axe  */
  51. #define B_MINOR 1    /* matched with axe or short sword */
  52.     { TWO_HANDED_SWORD, 0, WEAPON_CLASS, 1, 1, UNDEF_BLESS },
  53.     { AXE, 0, WEAPON_CLASS, 1, 1, UNDEF_BLESS },
  54.     { RING_MAIL, 0, ARMOR_CLASS, 1, 1, UNDEF_BLESS },
  55.     { FOOD_RATION, 0, FOOD_CLASS, 1, 1, 0 },
  56.     { 0, 0, 0, 0, 0, 0 }
  57. };
  58.  
  59. static struct trobj Knight[] = {
  60.     { LONG_SWORD, 0, WEAPON_CLASS, 1, 1, UNDEF_BLESS },
  61.     { SPEAR, 2, WEAPON_CLASS, 1, 1, UNDEF_BLESS },
  62.     { RING_MAIL, 1, ARMOR_CLASS, 1, 1, UNDEF_BLESS },
  63.     { HELMET, 0, ARMOR_CLASS, 1, 1, UNDEF_BLESS },
  64.     { SMALL_SHIELD, 0, ARMOR_CLASS, 1, 1, UNDEF_BLESS },
  65.     { LEATHER_GLOVES, 0, ARMOR_CLASS, 1, 1, UNDEF_BLESS },
  66.     { 0, 0, 0, 0, 0, 0 }
  67. };
  68.  
  69. static struct trobj Elf[] = {
  70. #define E_ARROWS    2
  71. #define E_ARMOR        3
  72.     { ELVEN_SHORT_SWORD, 0, WEAPON_CLASS, 1, 1, UNDEF_BLESS },
  73.     { ELVEN_BOW, 0, WEAPON_CLASS, 1, 1, UNDEF_BLESS },
  74.     { ELVEN_ARROW, 0, WEAPON_CLASS, 25, 1, UNDEF_BLESS },
  75.     { UNDEF_TYP, 0, ARMOR_CLASS, 1, 1, UNDEF_BLESS },
  76.     { LEMBAS_WAFER, 0, FOOD_CLASS, 2, 1, 0 },
  77.     { 0, 0, 0, 0, 0, 0 }
  78. };
  79.  
  80. static struct trobj Valkyrie[] = {
  81.     { LONG_SWORD, 1, WEAPON_CLASS, 1, 1, UNDEF_BLESS },
  82.     { DAGGER, 0, WEAPON_CLASS, 1, 1, UNDEF_BLESS },
  83.     { SMALL_SHIELD, 3, ARMOR_CLASS, 1, 1, UNDEF_BLESS },
  84.     { FOOD_RATION, 0, FOOD_CLASS, 1, 1, 0 },
  85.     { 0, 0, 0, 0, 0, 0 }
  86. };
  87.  
  88. static struct trobj Healer[] = {
  89.     { SCALPEL, 0, WEAPON_CLASS, 1, 1, UNDEF_BLESS },
  90.     { LEATHER_GLOVES, 1, ARMOR_CLASS, 1, 1, UNDEF_BLESS },
  91.     { STETHOSCOPE, 0, TOOL_CLASS, 1, 1, 0 },
  92.     { POT_HEALING, 0, POTION_CLASS, 4, 1, UNDEF_BLESS },
  93.     { POT_EXTRA_HEALING, 0, POTION_CLASS, 4, 1, UNDEF_BLESS },
  94.     { WAN_SLEEP, UNDEF_SPE, WAND_CLASS, 1, 1, UNDEF_BLESS },
  95.     /* always blessed, so it's guaranteed readable */
  96.     { SPE_HEALING, 0, SPBOOK_CLASS, 1, 1, 1 },
  97.     { SPE_EXTRA_HEALING, 0, SPBOOK_CLASS, 1, 1, 1 },
  98.     { APPLE, 0, FOOD_CLASS, 5, 1, 0 },
  99.     { 0, 0, 0, 0, 0, 0 }
  100. };
  101.  
  102. static struct trobj Archeologist[] = {
  103.     /* if adventure has a name...  idea from tan@uvm-gen */
  104.     { BULLWHIP, 2, WEAPON_CLASS, 1, 1, UNDEF_BLESS },
  105.     { LEATHER_JACKET, 0, ARMOR_CLASS, 1, 1, UNDEF_BLESS },
  106.     { FEDORA, 0, ARMOR_CLASS, 1, 1, UNDEF_BLESS },
  107.     { FOOD_RATION, 0, FOOD_CLASS, 3, 1, 0 },
  108.     { PICK_AXE, UNDEF_SPE, TOOL_CLASS, 1, 1, UNDEF_BLESS },
  109.     { TINNING_KIT, 0, TOOL_CLASS, 1, 1, UNDEF_BLESS },
  110.     { SACK, 0, TOOL_CLASS, 1, 0, 0 },
  111.     { 0, 0, 0, 0, 0, 0 }
  112. };
  113.  
  114. static struct trobj Tinopener[] = {
  115.     { TIN_OPENER, 0, TOOL_CLASS, 1, 1, 0 },
  116.     { 0, 0, 0, 0, 0, 0 }
  117. };
  118.  
  119. static struct trobj Magicmarker[] = {
  120.     { MAGIC_MARKER, UNDEF_SPE, TOOL_CLASS, 1, 1, 0 },
  121.     { 0, 0, 0, 0, 0, 0 }
  122. };
  123.  
  124. static struct trobj Lamp[] = {
  125.     { OIL_LAMP, 1, TOOL_CLASS, 1, 1, 0 },
  126.     { 0, 0, 0, 0, 0, 0 }
  127. };
  128.  
  129. #ifdef TOURIST
  130. # ifdef WALKIES
  131. static struct trobj Leash[] = {
  132.     { LEASH, 0, TOOL_CLASS, 1, 1, 0 },
  133.     { 0, 0, 0, 0, 0, 0 }
  134. };
  135. # endif
  136.  
  137. static struct trobj Towel[] = {
  138.     { TOWEL, 0, TOOL_CLASS, 1, 1, 0 },
  139.     { 0, 0, 0, 0, 0, 0 }
  140. };
  141. #endif
  142.  
  143. #ifdef EXPLORE_MODE
  144. static struct trobj Wishing[] = {
  145.     { WAN_WISHING, 3, WAND_CLASS, 1, 1, 0 },
  146.     { 0, 0, 0, 0, 0, 0 }
  147. };
  148. #endif
  149.  
  150. static struct trobj Instrument[] = {
  151.     { WOODEN_FLUTE, 0, TOOL_CLASS, 1, 1, 0 },
  152.     { 0, 0, 0, 0, 0, 0 }
  153. };
  154.  
  155. static struct trobj Blindfold[] = {
  156.     { BLINDFOLD, 0, TOOL_CLASS, 1, 1, 0 },
  157.     { 0, 0, 0, 0, 0, 0 }
  158. };
  159.  
  160. #ifdef TOURIST
  161. static struct trobj Tourist[] = {
  162. #define    T_DARTS        0
  163.     { DART, 2, WEAPON_CLASS, 25, 1, UNDEF_BLESS },    /* quan is variable */
  164.     { UNDEF_TYP, UNDEF_SPE, FOOD_CLASS, 10, 1, 0 },
  165.     { POT_EXTRA_HEALING, 0, POTION_CLASS, 2, 1, UNDEF_BLESS },
  166.     { SCR_MAGIC_MAPPING, 0, SCROLL_CLASS, 4, 1, UNDEF_BLESS },
  167.     { HAWAIIAN_SHIRT, 0, ARMOR_CLASS, 1, 1, UNDEF_BLESS },
  168.     { EXPENSIVE_CAMERA, 0, TOOL_CLASS, 1, 1, 0 },
  169.     { CREDIT_CARD, 0, TOOL_CLASS, 1, 1, 0 },
  170.     { 0, 0, 0, 0, 0, 0 }
  171. };
  172. #endif
  173.  
  174. static struct trobj Rogue[] = {
  175. #define R_DAGGERS    1
  176.     { SHORT_SWORD, 0, WEAPON_CLASS, 1, 1, UNDEF_BLESS },
  177.     { DAGGER, 0, WEAPON_CLASS, 10, 1, 0 },    /* quan is variable */
  178.     { LEATHER_ARMOR, 1, ARMOR_CLASS, 1, 1, UNDEF_BLESS },
  179.     { POT_SICKNESS, 0, POTION_CLASS, 1, 1, 0 },
  180.     { LOCK_PICK, 9, TOOL_CLASS, 1, 1, 0 },
  181.     { SACK, 0, TOOL_CLASS, 1, 0, 0 },
  182.     { 0, 0, 0, 0, 0, 0 }
  183. };
  184.  
  185. static struct trobj Wizard[] = {
  186. #define W_MULTSTART    2
  187. #define W_MULTEND    6
  188.     { ATHAME, 1, WEAPON_CLASS, 1, 1, 1 },    /* for dealing with ghosts */
  189.     { CLOAK_OF_MAGIC_RESISTANCE, 0, ARMOR_CLASS, 1, 1, UNDEF_BLESS },
  190.     { UNDEF_TYP, UNDEF_SPE, WAND_CLASS, 1, 1, UNDEF_BLESS },
  191.     { UNDEF_TYP, UNDEF_SPE, RING_CLASS, 2, 1, UNDEF_BLESS },
  192.     { UNDEF_TYP, UNDEF_SPE, POTION_CLASS, 3, 1, UNDEF_BLESS },
  193.     { UNDEF_TYP, UNDEF_SPE, SCROLL_CLASS, 3, 1, UNDEF_BLESS },
  194.     { UNDEF_TYP, UNDEF_SPE, SPBOOK_CLASS, 1, 1, UNDEF_BLESS },
  195.     { 0, 0, 0, 0, 0, 0 }
  196. };
  197.  
  198. static struct trobj Samurai[] = {
  199. #define S_ARROWS    3
  200.     { KATANA, 0, WEAPON_CLASS, 1, 1, UNDEF_BLESS },
  201.     { SHORT_SWORD, 0, WEAPON_CLASS, 1, 1, UNDEF_BLESS }, /* wakizashi */
  202.     { YUMI, 0, WEAPON_CLASS, 1, 1, UNDEF_BLESS },
  203.     { YA, 0, WEAPON_CLASS, 25, 1, UNDEF_BLESS }, /* variable quan */
  204.     { SPLINT_MAIL, 0, ARMOR_CLASS, 1, 1, UNDEF_BLESS },
  205.     { FORTUNE_COOKIE, 0, FOOD_CLASS, 3, 1, 0 },
  206.     { 0, 0, 0, 0, 0, 0 }
  207. };
  208.  
  209. static struct trobj Priest[] = {
  210.     { MACE, 1, WEAPON_CLASS, 1, 1, 1 },
  211.     { CHAIN_MAIL, 0, ARMOR_CLASS, 1, 1, UNDEF_BLESS },
  212.     { SMALL_SHIELD, 0, ARMOR_CLASS, 1, 1, UNDEF_BLESS },
  213.     { POT_WATER, 0, POTION_CLASS, 4, 1, 1 },    /* holy water */
  214.     { CLOVE_OF_GARLIC, 0, FOOD_CLASS, 1, 1, 0 },
  215.     { SPRIG_OF_WOLFSBANE, 0, FOOD_CLASS, 1, 1, 0 },
  216.     { UNDEF_TYP, UNDEF_SPE, SPBOOK_CLASS, 2, 1, UNDEF_BLESS },
  217.     { 0, 0, 0, 0, 0, 0 }
  218. };
  219.  
  220. static void
  221. knows_object(obj)
  222. register int obj;
  223. {
  224.     makeknown(obj);
  225.     objects[obj].oc_descr_idx = 0;        /* not a "discovery" */
  226. }
  227.  
  228. /* Know ordinary (non-magical) objects of a certain class,
  229.  * like all gems except the loadstone and luckstone.
  230.  */
  231. static void
  232. knows_class(sym)
  233. register char sym;
  234. {
  235.     register int ct;
  236.     for (ct = 1; ct <= NROFOBJECTS; ct++)
  237.         if (objects[ct].oc_class == sym && !objects[ct].oc_magic)
  238.             knows_object(ct);
  239. }
  240.  
  241. static int
  242. role_index(pc)
  243. char pc;
  244. {
  245.     register const char *cp;
  246.  
  247.     if ((cp = index(pl_classes, pc)) != 0)
  248.         return(cp - pl_classes);
  249.     return(-1);
  250. }
  251.  
  252. void
  253. u_init()
  254. {
  255.     register int i;
  256.     char pc;
  257.  
  258.     pc = pl_character[0];
  259.     if(pc == '\0') {
  260.         /* should be unnecessary now */
  261.         exit_nhwindows(NULL);
  262.         terminate(0);
  263.     }
  264.     i = role_index(pc);
  265.     if (random_role) {
  266.         pline("This game you will be %s.", an(roles[i]));
  267.         display_nhwindow(WIN_MESSAGE, TRUE);
  268.     }
  269.  
  270.     (void) strncpy(pl_character, roles[i], PL_CSIZ-1);
  271.     pl_character[PL_CSIZ-1] = 0;
  272.     flags.beginner = 1;
  273.  
  274.     /* zero u, including pointer values --
  275.      * necessary when aborting from a failed restore */
  276.     (void) memset((genericptr_t)&u, 0, sizeof(u));
  277.     u.ustuck = (struct monst *)0;
  278.     u.usick_cause = NULL;
  279.  
  280. #if 0    /* documentation of more zero values as desirable */
  281.     u.uluck  = u.moreluck = 0;
  282. # ifdef TOURIST
  283.     uarmu = 0;
  284. # endif
  285.     uarm = uarmc = uarmh = uarms = uarmg = uarmf = 0;
  286.     uwep = uball = uchain = uleft = uright = 0;
  287.     u.ublessed = 0;                /* not worthy yet */
  288.     u.ugangr   = 0;                /* gods not angry */
  289. # ifdef ELBERETH
  290.     u.uevent.uhand_of_elbereth = 0;
  291. # endif
  292.     u.uevent.uheard_tune = 0;
  293.     u.uevent.uopened_dbridge = 0;
  294.     u.uevent.udemigod = 0;        /* not a demi-god yet... */
  295.     u.udg_cnt = 0;
  296. # ifdef POLYSELF
  297.     u.mh = u.mhmax = u.mtimedone = 0;
  298. # endif
  299.     u.uz.dnum = u.uz0.dnum = 0;
  300.     u.utotype = 0;
  301. #endif    /* 0 */
  302.     u.uz.dlevel = u.uz0.dlevel = 1;
  303.     u.utolev = u.uz;
  304.  
  305.     u.usym = S_HUMAN;
  306.     u.umoved = FALSE;
  307.     u.umortality = 0;
  308.     u.ugrave_arise = -1;
  309.  
  310.     u.ulevel = 0;    /* set up some of the initial attributes */
  311.     u.uhp = u.uhpmax = newhp();
  312.     adjabil(0,1);
  313.     u.ulevel = 1;
  314.  
  315.     init_uhunger();
  316.     u.uen = u.uenmax = 1;
  317.     for (i = 0; i <= MAXSPELL; i++) spl_book[i].sp_id = NO_SPELL;
  318.     u.ublesscnt = 300;            /* no prayers just yet */
  319. #ifdef POLYSELF
  320.     u.umonnum = -1;
  321.     u.ulycn = -1;
  322.     set_uasmon();
  323. #endif
  324.  
  325. #ifdef BSD
  326.     (void) time((long *)&u.ubirthday);
  327. #else
  328.     (void) time(&u.ubirthday);
  329. #endif
  330.  
  331.     /*
  332.      *  For now, everyone starts out with a night vision range of 1 and
  333.      *  their xray range disabled.
  334.      */
  335.     u.nv_range   =  1;
  336.     u.xray_range = -1;
  337.  
  338.  
  339.     switch(pc) {
  340.     /* pc will always be in uppercase by this point */
  341.     case 'A':
  342.         u.umonster = PM_ARCHEOLOGIST;
  343.         ini_inv(Archeologist);
  344.         if(!rn2(10)) ini_inv(Tinopener);
  345.         else if(!rn2(4)) ini_inv(Lamp);
  346.         else if(!rn2(10)) ini_inv(Magicmarker);
  347.         knows_class(GEM_CLASS);
  348.         knows_object(SACK);
  349.         /* We can't set trknown for it, then it'd be "uncursed"
  350.          * sack...
  351.          */
  352.         break;
  353.     case 'B':
  354.         u.umonster = PM_BARBARIAN;
  355.         if (rn2(100) >= 50) {    /* see Elf comment */
  356.             Barbarian[B_MAJOR].trotyp = BATTLE_AXE;
  357.             Barbarian[B_MINOR].trotyp = SHORT_SWORD;
  358.         }
  359.         ini_inv(Barbarian);
  360.         if(!rn2(6)) ini_inv(Lamp);
  361.         knows_class(WEAPON_CLASS);
  362.         knows_class(ARMOR_CLASS);
  363.         break;
  364.     case 'C':
  365.         u.umonster = PM_CAVEMAN;
  366.         Cave_man[C_ARROWS].trquan = rn1(30, 13);
  367.         ini_inv(Cave_man);
  368.         break;
  369.     case 'E':
  370.         u.umonster = PM_ELF;
  371.         Elf[E_ARROWS].trquan = rn1(20, 16);
  372.         Elf[E_ARMOR].trotyp = ((rn2(100) >= 50)
  373.                  ? ELVEN_MITHRIL_COAT : ELVEN_CLOAK);
  374.             /* rn2(100) > 50 necessary because some random number
  375.              * generators are bad enough to seriously skew the
  376.              * results if we use rn2(2)...  --KAA
  377.              */
  378.         ini_inv(Elf);
  379.         /*
  380.          * Elves are people of music and song, or they are warriors.
  381.          * Warriors get mithril coats; non-warriors MAY get an
  382.          * instrument.  We use a kludge to get only non-magic
  383.          * instruments.
  384.          */
  385.         if (Elf[E_ARMOR].trotyp == ELVEN_CLOAK && !rn2(5)) {
  386.             static int trotyp[] = {
  387.             WOODEN_FLUTE, TOOLED_HORN, WOODEN_HARP,
  388.             BELL, BUGLE, LEATHER_DRUM
  389.             };
  390.             Instrument[0].trotyp = trotyp[rn2(SIZE(trotyp))];
  391.             ini_inv(Instrument);
  392.         }
  393.         if(!rn2(5)) ini_inv(Blindfold);
  394.         else if(!rn2(6)) ini_inv(Lamp);
  395.         knows_object(ELVEN_SHORT_SWORD);
  396.         knows_object(ELVEN_ARROW);
  397.         knows_object(ELVEN_BOW);
  398.         knows_object(ELVEN_SPEAR);
  399.         knows_object(ELVEN_DAGGER);
  400.         knows_object(ELVEN_BROADSWORD);
  401.         knows_object(ELVEN_MITHRIL_COAT);
  402.         knows_object(ELVEN_LEATHER_HELM);
  403.         knows_object(ELVEN_SHIELD);
  404.         knows_object(ELVEN_BOOTS);
  405.         knows_object(ELVEN_CLOAK);
  406.         break;
  407.     case 'H':
  408.         u.umonster = PM_HEALER;
  409.         u.ugold = u.ugold0 = rn1(1000, 1001);
  410.         ini_inv(Healer);
  411.         if(!rn2(25)) ini_inv(Lamp);
  412.         break;
  413.     case 'K':
  414.         u.umonster = PM_KNIGHT;
  415.         ini_inv(Knight);
  416.         knows_class(WEAPON_CLASS);
  417.         knows_class(ARMOR_CLASS);
  418.         /* give knights chess-like mobility
  419.          * -- idea from wooledge@skybridge.scl.cwru.edu */
  420.         Jumping |= FROMOUTSIDE;
  421.         break;
  422.     case 'P':
  423.         u.umonster = PM_PRIEST;
  424.         u.uen = u.uenmax += rn2(4);
  425.         ini_inv(Priest);
  426.         if(!rn2(10)) ini_inv(Magicmarker);
  427.         else if(!rn2(10)) ini_inv(Lamp);
  428.         knows_object(POT_WATER);
  429.         break;
  430.     case 'R':
  431.         u.umonster = PM_ROGUE;
  432.         Rogue[R_DAGGERS].trquan = rn1(10, 6);
  433.         u.ugold = u.ugold0 = 0;
  434.         ini_inv(Rogue);
  435.         if(!rn2(5)) ini_inv(Blindfold);
  436.         knows_object(SACK);
  437.         break;
  438.     case 'S':
  439.         u.umonster = PM_SAMURAI;
  440.         Samurai[S_ARROWS].trquan = rn1(20, 26);
  441.         ini_inv(Samurai);
  442.         if(!rn2(5)) ini_inv(Blindfold);
  443.         knows_class(WEAPON_CLASS);
  444.         knows_class(ARMOR_CLASS);
  445.         break;
  446. #ifdef TOURIST
  447.     case 'T':
  448.         u.umonster = PM_TOURIST;
  449.         Tourist[T_DARTS].trquan = rn1(20, 21);
  450.         u.ugold = u.ugold0 = rnd(1000);
  451.         ini_inv(Tourist);
  452.         if(!rn2(25)) ini_inv(Tinopener);
  453. #ifdef WALKIES
  454.         else if(!rn2(25)) ini_inv(Leash);
  455. #endif
  456.         else if(!rn2(25)) ini_inv(Towel);
  457.         else if(!rn2(25)) ini_inv(Magicmarker);
  458.         break;
  459. #endif
  460.     case 'V':
  461.         u.umonster = PM_VALKYRIE;
  462.         flags.female = TRUE;
  463.         ini_inv(Valkyrie);
  464.         if(!rn2(6)) ini_inv(Lamp);
  465.         knows_class(WEAPON_CLASS);
  466.         knows_class(ARMOR_CLASS);
  467.         break;
  468.     case 'W':
  469.         u.umonster = PM_WIZARD;
  470.         u.uen = u.uenmax += rn2(4);
  471.         ini_inv(Wizard);
  472.         if(!rn2(5)) ini_inv(Magicmarker);
  473.         if(!rn2(5)) ini_inv(Blindfold);
  474.         break;
  475.  
  476.     default:    /* impossible */
  477.         break;
  478.     }
  479. #ifdef EXPLORE_MODE
  480.     if (discover)
  481.         ini_inv(Wishing);
  482. #endif
  483.     u.ugold0 += hidden_gold();    /* in case sack has gold in it */
  484.  
  485.     find_ac();            /* get initial ac value */
  486.     init_attr(75);            /* init attribute values */
  487.     max_rank_sz();            /* set max str size for class ranks */
  488. /*
  489.  *    Do we really need this?
  490.  */
  491.     for(i = 0; i < A_MAX; i++)
  492.         if(!rn2(20)) {
  493.         register int xd = rn2(7) - 2;    /* biased variation */
  494.         (void) adjattrib(i, xd, TRUE);
  495.         if (ABASE(i) < AMAX(i)) AMAX(i) = ABASE(i);
  496.         }
  497.  
  498.     /* make sure you can carry all you have - especially for Tourists */
  499.     while(inv_weight() > 0 && ACURR(A_STR) < 118)
  500.         (void) adjattrib(A_STR, 1, TRUE);
  501.  
  502.     u.ualignbase[0] = u.ualignbase[1] = u.ualign.type;
  503. }
  504.  
  505. static void
  506. ini_inv(trop)
  507. register struct trobj *trop;
  508. {
  509.     struct obj *obj;
  510.     while(trop->trclass) {
  511.         boolean undefined = (trop->trotyp == UNDEF_TYP);
  512.  
  513.         if (!undefined)
  514.             obj = mksobj((int)trop->trotyp, TRUE, FALSE);
  515.         else obj = mkobj(trop->trclass,FALSE);
  516.  
  517.         /* For random objects, do not create certain overly powerful
  518.          * items: wand of wishing, ring of levitation, or the
  519.          * polymorph/polymorph control combination.  Specific objects,
  520.          * i.e. the discovery wishing, are still OK.
  521.          * Also, don't get a couple of really useless items.  (Note:
  522.          * punishment isn't "useless".  Some players who start out with
  523.          * one will immediately read it and use the iron ball as a
  524.          * weapon.)
  525.          */
  526.         if (undefined) {
  527. #ifdef POLYSELF
  528.             static NEARDATA unsigned nocreate = STRANGE_OBJECT;
  529.             static NEARDATA unsigned nocreate2 = STRANGE_OBJECT;
  530. #endif
  531.             static NEARDATA unsigned nocreate3 = STRANGE_OBJECT;
  532.  
  533.             while(obj->otyp == WAN_WISHING
  534. #ifdef POLYSELF
  535.                 || obj->otyp == nocreate
  536.                 || obj->otyp == nocreate2
  537. #endif
  538.                 || obj->otyp == nocreate3
  539. #ifdef ELBERETH
  540.                 || obj->otyp == RIN_LEVITATION
  541. #endif
  542.                 /* 'useless' items */
  543.                 || obj->otyp == POT_HALLUCINATION
  544.                 || obj->otyp == SCR_AMNESIA
  545.                 || obj->otyp == SCR_FIRE
  546.                 || obj->otyp == RIN_AGGRAVATE_MONSTER
  547.                 || obj->otyp == RIN_HUNGER
  548.                 || obj->otyp == WAN_NOTHING
  549.                 /* powerful spells are either useless to
  550.                    low level players or unbalancing */
  551.                 || (obj->oclass == SPBOOK_CLASS &&
  552.                     objects[obj->otyp].oc_level > 3)
  553.                             ) {
  554.                 dealloc_obj(obj);
  555.                 obj = mkobj(trop->trclass, FALSE);
  556.             }
  557.  
  558.             /* Don't start with +0 or negative rings */
  559.             if(objects[obj->otyp].oc_charged && obj->spe <= 0)
  560.                 obj->spe = rne(3);
  561.  
  562.             /* Heavily relies on the fact that 1) we create wands
  563.              * before rings, 2) that we create rings before
  564.              * spellbooks, and that 3) not more than 1 object of a
  565.              * particular symbol is to be prohibited.  (For more
  566.              * objects, we need more nocreate variables...)
  567.              */
  568. #ifdef POLYSELF
  569.             switch (obj->otyp) {
  570.                 case WAN_POLYMORPH:
  571.                 case RIN_POLYMORPH:
  572.                 nocreate = RIN_POLYMORPH_CONTROL;
  573.                 break;
  574.                 case RIN_POLYMORPH_CONTROL:
  575.                 nocreate = RIN_POLYMORPH;
  576.                 nocreate2 = SPE_POLYMORPH;
  577.             }
  578. #endif /* POLYSELF */
  579.             /* Don't have 2 of the same ring */
  580.             if (obj->oclass == RING_CLASS)
  581.                 nocreate3 = obj->otyp;
  582.         }
  583.  
  584.         obj->bknown = trop->trknown;
  585.         if(objects[obj->otyp].oc_uses_known) obj->known = trop->trknown;
  586.         /* not obj->dknown = 1; - let him look at it at least once */
  587.         obj->cursed = 0;
  588.         if(obj->oclass == WEAPON_CLASS || obj->oclass == TOOL_CLASS) {
  589.             obj->quan = (long) trop->trquan;
  590.             trop->trquan = 1;
  591.         }
  592.         if(obj->oclass == FOOD_CLASS && undefined) {
  593.             obj->known = 1;
  594.             /* needed for tins and eggs; harmless otherwise */
  595.             obj->bknown = 1;
  596.         }
  597.         /*
  598.          * The below lines not needed because they don't correspond
  599.          * to any actual inventory; nobody gets random tools.
  600.         else if(obj->oclass == TOOL_CLASS && undefined) {
  601.             obj->bknown = (obj->otyp != BAG_OF_TRICKS
  602.                 && obj->otyp != SACK
  603.                 && obj->otyp != CHEST
  604.                 && obj->otyp != LARGE_BOX
  605.                 && obj->otyp != ICE_BOX);
  606.         }
  607.         */
  608.         if(trop->trspe != UNDEF_SPE)
  609.             obj->spe = trop->trspe;
  610.         if(trop->trbless != UNDEF_BLESS)
  611.             obj->blessed = trop->trbless;
  612.  
  613.         /* defined after setting otyp+quan + blessedness */
  614.         obj->owt = weight(obj);
  615.         obj = addinv(obj);
  616.  
  617.         /* Make the type known if necessary */
  618.         if (OBJ_DESCR(objects[obj->otyp]) && obj->known)
  619.             makeknown(obj->otyp);
  620.  
  621.         if(obj->oclass == ARMOR_CLASS){
  622.             if (is_shield(obj) && !uarms)
  623.                 setworn(obj, W_ARMS);
  624.             else if (is_helmet(obj) && !uarmh)
  625.                 setworn(obj, W_ARMH);
  626.             else if (is_gloves(obj) && !uarmg)
  627.                 setworn(obj, W_ARMG);
  628. #ifdef TOURIST
  629.             else if (obj->otyp == HAWAIIAN_SHIRT && !uarmu)
  630.                 setworn(obj, W_ARMU);
  631. #endif
  632.             else if (is_cloak(obj) && !uarmc)
  633.                 setworn(obj, W_ARMC);
  634.             else if (is_boots(obj) && !uarmf)
  635.                 setworn(obj, W_ARMF);
  636.             else if (!uarm)
  637.                 setworn(obj, W_ARM);
  638.         }
  639.         /* below changed by GAN 01/09/87 to allow wielding of
  640.          * pick-axe or can-opener if there is no weapon
  641.          */
  642.         if(obj->oclass == WEAPON_CLASS || obj->otyp == PICK_AXE ||
  643.            obj->otyp == TIN_OPENER)
  644.             if(!uwep) setuwep(obj);
  645. #if !defined(PYRAMID_BUG) && !defined(MAC)
  646.         if(--trop->trquan) continue;    /* make a similar object */
  647. #else
  648.         if(trop->trquan) {        /* check if zero first */
  649.             --trop->trquan;
  650.             if(trop->trquan)
  651.                 continue;    /* make a similar object */
  652.         }
  653. #endif
  654.         trop++;
  655.     }
  656. }
  657.  
  658. void
  659. plnamesuffix()
  660. {
  661.     register char *p;
  662.     if ((p = rindex(plname, '-')) != 0) {
  663.         *p = '\0';
  664.         pl_character[0] = p[1];
  665.         pl_character[1] = '\0';
  666.         random_role = FALSE;
  667.         if(!plname[0]) {
  668.             askname();
  669.             plnamesuffix();
  670.         }
  671.     }
  672.     if (pl_character[0] == '@') {    /* explicit request for random class */
  673.         int i = rn2((int)strlen(pl_classes));
  674.         pl_character[0] = pl_classes[i];
  675.         pl_character[1] = '\0';
  676.         random_role = TRUE;
  677.     }
  678. }
  679.  
  680. /*u_init.c*/
  681.