home *** CD-ROM | disk | FTP | other *** search
/ Frozen Fish 1: Amiga / FrozenFish-Apr94.iso / bbs / alib / d1xx / d190 / nethack.lha / NetHack / twee.zoo / u_init.c < prev    next >
C/C++ Source or Header  |  1988-07-26  |  14KB  |  596 lines

  1. /*    SCCS Id: @(#)u_init.c   2.3     88/01/21
  2. /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
  3.  
  4. #include <stdio.h>
  5. #include <signal.h>
  6. #include "hack.h"
  7. #ifdef GENIX
  8. #define void    int
  9. #endif
  10.  
  11. #define Strcpy    (void) strcpy
  12. #define Strcat    (void) strcat
  13. #define UNDEF_TYP    0
  14. #define UNDEF_SPE    '\177'
  15. extern struct obj *addinv();
  16. extern char *eos();
  17. extern char plname[];
  18. #define IS_MAGIC(x)     ((x)->olet == WAND_SYM || (x)->olet == POTION_SYM || \
  19.              (x)->olet == RING_SYM || (x)->olet == SCROLL_SYM || \
  20.              (x)->olet == SPBOOK_SYM)
  21.  
  22. struct you zerou;
  23. char pl_character[PL_CSIZ];
  24. char *(roles[]) = {     /* must all have distinct first letter */
  25.             /* roles[4] & [7] may be changed for females */
  26.     "Archeologist", "Tourist", "Barbarian", "Knight", "Cave-man",
  27. #ifdef NEWCLASS
  28.     "Samurai", "Ninja", "Priest",
  29. #endif
  30. #ifdef KAA
  31.     "Valkyrie", "Elf", "Healer",
  32. #endif
  33.     "Wizard"
  34. };
  35. #define NR_OF_ROLES    SIZE(roles)
  36. char rolesyms[NR_OF_ROLES + 1];     /* filled by u_init() */
  37.  
  38. struct trobj {
  39.     unsigned short trotyp;
  40.     schar trspe;
  41.     char trolet;
  42.     Bitfield(trquan,6);
  43.     Bitfield(trknown,1);
  44. };
  45.  
  46. #ifdef WIZARD
  47. struct trobj Extra_objs[] = {
  48.     { 0, 0, 0, 0, 0 },
  49.     { 0, 0, 0, 0, 0 }
  50. };
  51. #endif
  52.  
  53. struct trobj Cave_man[] = {
  54. #define C_ARROWS    2
  55.     { CLUB, 1, WEAPON_SYM, 1, 1 },
  56.     { BOW, 1, WEAPON_SYM, 1, 1 },
  57.     { ARROW, 0, WEAPON_SYM, 25, 1 },    /* quan is variable */
  58.     { LEATHER_ARMOR, 0, ARMOR_SYM, 1, 1 },
  59.     { 0, 0, 0, 0, 0}
  60. };
  61.  
  62. struct trobj Barbarian[] = {
  63.     { TWO_HANDED_SWORD, 0, WEAPON_SYM, 1, 1 },
  64.     { RING_MAIL, 0, ARMOR_SYM, 1, 1 },
  65.     { 0, 0, 0, 0, 0 }
  66. };
  67.  
  68. struct trobj Knight[] = {
  69.     { LONG_SWORD, 0, WEAPON_SYM, 1, 1 },
  70.     { SPEAR, 2, WEAPON_SYM, 1, 1 },
  71.     { RING_MAIL, 1, ARMOR_SYM, 1, 1 },
  72.     { HELMET, 0, ARMOR_SYM, 1, 1 },
  73.     { SHIELD, 0, ARMOR_SYM, 1, 1 },
  74.     { PAIR_OF_GLOVES, 0, ARMOR_SYM, 1, 1 },
  75.     { 0, 0, 0, 0, 0 }
  76. };
  77.  
  78. #ifdef KAA
  79. struct trobj Elf[] = {
  80. #define E_ARROWS    2
  81. #define E_ARMOR     3
  82.     { SHORT_SWORD, 0, WEAPON_SYM, 1, 1 },
  83.     { BOW, 0, WEAPON_SYM, 1, 1 },
  84.     { ARROW, 0, WEAPON_SYM, 25, 1 },
  85.     { UNDEF_TYP, 0, ARMOR_SYM, 1, 1 },
  86.     { 0, 0, 0, 0, 0 }
  87. };
  88.  
  89. struct trobj Valkyrie[] = {
  90.     { LONG_SWORD, 1, WEAPON_SYM, 1, 1 },
  91.     { SHIELD, 3, ARMOR_SYM, 1, 1 },
  92.     { FOOD_RATION, 0, FOOD_SYM, 1, 1 },
  93.     { 0, 0, 0, 0, 0 }
  94. };
  95.  
  96. struct trobj Healer[] = {
  97.     { STETHOSCOPE, 0, TOOL_SYM, 1, 0 },
  98.     { POT_HEALING, 0, POTION_SYM, 4, 1 },
  99.     { POT_EXTRA_HEALING, 0, POTION_SYM, 4, 1 },
  100.     { APPLE, 0, FOOD_SYM, 5, 0 },
  101.     { 0, 0, 0, 0, 0}
  102. };
  103. #endif /* KAA /**/
  104.  
  105. struct trobj Archeologist[] = {
  106.     { STUDDED_LEATHER_ARMOR, 0, ARMOR_SYM, 1, 1 },
  107.     { UNDEF_TYP, 0, POTION_SYM, 2, 0 },
  108.     { FOOD_RATION, 0, FOOD_SYM, 3, 1 },
  109.     { PICK_AXE, UNDEF_SPE, TOOL_SYM, 1, 0 },
  110.     { ICE_BOX, 0, TOOL_SYM, 1, 0 },
  111.     { 0, 0, 0, 0, 0}
  112. };
  113.  
  114. struct trobj Tinopener[] = {
  115.     { CAN_OPENER, 0, TOOL_SYM, 1, 1 },
  116.     { 0, 0, 0, 0, 0 }
  117. };
  118.  
  119. #ifdef MARKER
  120. struct trobj Magicmarker[] = {
  121.     { MAGIC_MARKER, 50, TOOL_SYM, 1, 0 },
  122.     { 0, 0, 0, 0, 0 }
  123. };
  124. #endif
  125.  
  126. struct trobj Lamp[] = {
  127.     { LAMP, 5, TOOL_SYM, 1, 0 },
  128.     { 0, 0, 0, 0, 0 }
  129. };
  130.  
  131. #ifdef WALKIES
  132. struct trobj Leash[] = {
  133.     { LEASH, 0, TOOL_SYM, 1, 0 },
  134.     { 0, 0, 0, 0, 0 }
  135. };
  136. #endif
  137.  
  138. struct trobj Blindfold[] = {
  139.     { BLINDFOLD, 0, TOOL_SYM, 1, 0 },
  140.     { 0, 0, 0, 0, 0 }
  141. };
  142.  
  143. struct trobj Tourist[] = {
  144. #define T_DARTS     3
  145.     { UNDEF_TYP, 0, FOOD_SYM, 10, 1 },
  146.     { POT_EXTRA_HEALING, 0, POTION_SYM, 2, 0 },
  147.     { EXPENSIVE_CAMERA, 0, TOOL_SYM, 1, 1 },
  148.     { DART, 2, WEAPON_SYM, 25, 1 }, /* quan is variable */
  149. #ifdef SHIRT
  150.     { HAWAIIAN_SHIRT, 0, ARMOR_SYM, 1, 1 },
  151. #endif
  152.     { 0, 0, 0, 0, 0 }
  153. };
  154.  
  155. struct trobj Wizard[] = {
  156. #define W_MULTSTART    2
  157. #define W_MULTEND    6
  158.     { ELVEN_CLOAK, 0, ARMOR_SYM, 1, 1 },
  159.     { DAGGER, 0, WEAPON_SYM, 1, 1 },    /* for dealing with ghosts */
  160.     { UNDEF_TYP, UNDEF_SPE, WAND_SYM, 2, 1 },
  161.     { UNDEF_TYP, UNDEF_SPE, RING_SYM, 2, 1 },
  162.     { UNDEF_TYP, UNDEF_SPE, POTION_SYM, 2, 1 },
  163.     { UNDEF_TYP, UNDEF_SPE, SCROLL_SYM, 3, 1 },
  164. #ifdef SPELLS
  165.     { UNDEF_TYP, UNDEF_SPE, SPBOOK_SYM, 3, 1 },
  166. #endif
  167.     { 0, 0, 0, 0, 0 }
  168. };
  169.  
  170. #ifdef NEWCLASS
  171. struct    trobj    Samurai[] = {
  172. #define S_ARROWS    3
  173.     { KATANA, 0, WEAPON_SYM, 1, 1 },
  174.     { SHORT_SWORD, 0, WEAPON_SYM, 1, 1 },    /* the wakizashi */
  175.     { BOW,      1, WEAPON_SYM, 1, 1 },
  176.     { ARROW,  0, WEAPON_SYM, 25, 1 },    /* quan is variable */
  177.     { SPLINT_MAIL, 0, ARMOR_SYM, 1, 1},
  178.     { 0, 0, 0, 0, 0 }
  179. };
  180.  
  181. struct    trobj    Ninja[] = {
  182. #define N_SHURIKEN    1
  183.     { KATANA, 0, WEAPON_SYM, 1, 1 },
  184.     { SHURIKEN, 0, WEAPON_SYM, 25, 1 },    /* quan is variable */
  185.     { LEATHER_ARMOR, 1, ARMOR_SYM, 1, 1},
  186.     { 0, 0, 0, 0, 0 }
  187. };
  188.  
  189. struct    trobj    Priest[] = {
  190.     { CHAIN_MAIL, 0, ARMOR_SYM, 1, 1 },
  191.     { SHIELD, 0, ARMOR_SYM, 1, 1 },
  192.     { MACE, 1, WEAPON_SYM, 1, 1 },
  193.     { POT_HOLY_WATER, 0, POTION_SYM, 4, 1 },
  194. #ifdef SPELLS
  195.     { UNDEF_TYP, UNDEF_SPE, SPBOOK_SYM, 2, 0 },
  196. #endif
  197.     { 0, 0, 0, 0, 0 }
  198. };
  199. #endif /* NEWCLASS /**/
  200.  
  201. u_init(){
  202. register int i;
  203. char exper = 'y', pc;
  204. extern char readchar();
  205.     if(flags.female)  {     /* should have been set in HACKOPTIONS */
  206.         roles[4] = "Cave-woman";
  207. #ifdef NEWCLASS
  208.         roles[7] = "Priestess";
  209. #endif
  210.     }
  211.     for(i = 0; i < NR_OF_ROLES; i++)
  212.         rolesyms[i] = roles[i][0];
  213.     rolesyms[i] = 0;
  214.  
  215.     if(pc = pl_character[0]) {
  216.         if('a' <= pc && pc <= 'z') pc += 'A'-'a';
  217.         if((i = role_index(pc)) >= 0)
  218.             goto got_suffix;    /* implies experienced */
  219.         printf("\nUnknown role: %c\n", pc);
  220.         pl_character[0] = pc = 0;
  221.     }
  222.  
  223.     printf("\nShall I pick a character for you (yes, no, or quit) ? [ynq] ");
  224.  
  225.     while(!index("yYnNqQ", (exper = readchar())))   bell();
  226.  
  227.     printf("%c\n", exper);          /* echo */
  228.  
  229.     if (index("qQ", exper)) {
  230.         clearlocks();
  231.         settty((char *) 0);
  232.         exit(0);
  233.     }
  234.  
  235.     if(index("Yy", exper)) {
  236.         exper = 0;
  237.         goto beginner;
  238.     }
  239.  
  240.     printf("\n Tell me what kind of character you are:\n");
  241.     printf(" Are you");
  242.     for(i = 0; i < NR_OF_ROLES; i++) {
  243.         printf(" %s %s", index("AEIOU",roles[i][0]) ? "an" : "a", roles[i]);
  244.         if((((i + 1) % 4) == 0) && (i != NR_OF_ROLES -1)) printf(",\n        ");
  245.         else if(i < NR_OF_ROLES - 2)    printf(",");
  246.         if(i == NR_OF_ROLES - 2)        printf(" or");
  247.     }
  248.     printf("? [%s or q(quit)] ", rolesyms);
  249.  
  250.     while(pc = readchar()) {
  251.         if (pc == 'q' || pc == 'Q') {
  252.  
  253.             clearlocks();
  254.             settty((char *) 0);
  255.             exit(0);
  256.         }
  257.         if('a' <= pc && pc <= 'z') pc += 'A'-'a';
  258.         if((i = role_index(pc)) >= 0) {
  259.             printf("%c\n", pc);     /* echo */
  260.             (void) fflush(stdout);  /* should be seen */
  261.             break;
  262.         }
  263.         if(pc == '\n') break;
  264.         bell();
  265.     }
  266.     if(pc == '\n')  pc = 0;
  267.  
  268. beginner:
  269.     if(!pc) {
  270.         i = rn2(NR_OF_ROLES);
  271.         pc = rolesyms[i];
  272.         printf("\nThis game you will be %s %s%s.\n",
  273.             (exper || index("AEIOU", roles[i][0])) ? "an" : "a",
  274.             exper ? "experienced " : "", roles[i]);
  275.         getret();
  276.         /* give him some feedback in case mklev takes much time */
  277.         (void) putchar('\n');
  278.         (void) fflush(stdout);
  279.     }
  280.     if(exper) {
  281.         roles[i][0] = pc;
  282.     }
  283.  
  284. got_suffix:
  285.  
  286.     (void) strncpy(pl_character, roles[i], PL_CSIZ-1);
  287.     pl_character[PL_CSIZ-1] = 0;
  288.     flags.beginner = 1;
  289.     u = zerou;
  290.     u.usym = '@';
  291.     u.ulevel = 1;
  292.     u.uluck  = 0;
  293.     init_uhunger();
  294.     uarm = uarm2 = uarmh = uarms = uarmg = uwep =
  295. #ifdef SHIRT
  296.     uarmu =
  297. #endif
  298.     uball = uchain = uleft = uright = 0;
  299.  
  300. #ifdef SPELLS
  301.     u.uen = u.uenmax = 1;
  302.     for (i = 0; i <= MAXSPELL; i++) spl_book[i].sp_id = NO_SPELL;
  303. #endif
  304. #ifdef PRAYERS
  305.     u.ublesscnt = 300;            /* no prayers just yet */
  306.     u.ublessed = 0;             /* not worthy yet */
  307.     u.ugangr   = 0;             /* gods not angry */
  308. #endif
  309. #ifdef HARD
  310.     u.udemigod = u.udg_cnt = 0;        /* not a demi-god yet... */
  311. #endif
  312. #ifdef KAA
  313.     u.mh = u.mhmax = u.umonnum = u.mtimedone = 0;
  314. #endif
  315. #ifdef QUEST
  316.     u.uhorizon = 6;
  317. #endif
  318. /*
  319.  *  On the AMIGA, this switch would produce a jump table that is too
  320.  *  large for pc-relative addressing... Besides, pc is in uppercase.
  321.  */
  322.     switch(pc) {
  323.     /* case 'c': */
  324.     case 'C':
  325.         Cave_man[C_ARROWS].trquan = 12 + rnd(9)*rnd(9);
  326.         u.uhp = u.uhpmax = 16;
  327.         u.ustr = u.ustrmax = 18;
  328.         ini_inv(Cave_man);
  329.         break;
  330.     /* case 't': */
  331.     case 'T':
  332. #ifdef KAA
  333.         objects[POT_EXTRA_HEALING].oc_name_known=1;
  334. #endif
  335.         Tourist[T_DARTS].trquan = 20 + rnd(20);
  336.         u.ugold = u.ugold0 = rnd(1000);
  337.         u.uhp = u.uhpmax = 10;
  338.         u.ustr = u.ustrmax = 8;
  339.         ini_inv(Tourist);
  340.         if(!rn2(25)) ini_inv(Tinopener);
  341.         else if(!rn2(4)) ini_inv(Lamp);
  342. #ifdef MARKER
  343.         else if(!rn2(25)) ini_inv(Magicmarker);
  344. #endif
  345. #ifdef WALKIES
  346.         else if(!rn2(25)) ini_inv(Leash);
  347. #endif
  348.         break;
  349.     /* case 'w': */
  350.     case 'W':
  351.         for(i = W_MULTSTART; i <= W_MULTEND; i++)
  352.             if(!rn2(5))
  353.             Wizard[i].trquan += rn2(3) - 1;
  354.         u.uhp = u.uhpmax = 15;
  355.         u.ustr = u.ustrmax = 16;
  356. #ifdef SPELLS
  357.         u.uen = u.uenmax += rn2(4);
  358. #endif
  359.         ini_inv(Wizard);
  360. #ifdef MARKER
  361.         if(!rn2(5)) ini_inv(Magicmarker);
  362. #endif
  363.         if(!rn2(5)) ini_inv(Blindfold);
  364.         break;
  365.     /* case 'a': */
  366.     case 'A':
  367.         Fast = INTRINSIC;
  368.         Stealth = INTRINSIC;
  369.         u.uhp = u.uhpmax = 12;
  370.         u.ustr = u.ustrmax = 10;
  371.         ini_inv(Archeologist);
  372.         if(!rn2(10)) ini_inv(Tinopener);
  373. #ifdef MARKER
  374.         else if(!rn2(10)) ini_inv(Magicmarker);
  375. #endif
  376.         break;
  377. #ifdef KAA
  378.     /* case 'e': */
  379.     case 'E':
  380.         Elf[E_ARROWS].trquan = 15+rnd(20);
  381.         Elf[E_ARMOR].trotyp = (rn2(2) ? ELFIN_CHAIN_MAIL : ELVEN_CLOAK);
  382.         Fast = INTRINSIC;
  383.         HSee_invisible = INTRINSIC;
  384.         u.uhp = u.uhpmax = 16;
  385.         u.ustr = u.ustrmax = 16;
  386.         ini_inv(Elf);
  387.         if(!rn2(5)) ini_inv(Blindfold);
  388.         else if(!rn2(6)) ini_inv(Lamp);
  389.         break;
  390.     /* case 'v': */
  391.     case 'V':
  392.         Stealth = INTRINSIC;
  393.         HCold_resistance = INTRINSIC;
  394.         flags.female = TRUE;
  395.         u.uhp = u.uhpmax = 16;
  396.         u.ustr = u.ustrmax = 17;
  397.         ini_inv(Valkyrie);
  398.         if(!rn2(6)) ini_inv(Lamp);
  399.         break;
  400.     /* case 'h': */
  401.     case 'H':
  402.         objects[POT_HEALING].oc_name_known=1;
  403.         objects[POT_EXTRA_HEALING].oc_name_known=1;
  404.         HPoison_resistance = INTRINSIC;
  405.         u.uhp = u.uhpmax = 16;
  406.         u.ustr = u.ustrmax = 15;
  407.         ini_inv(Healer);
  408.         if(!rn2(25)) ini_inv(Lamp);
  409.         break;
  410. #endif
  411.     /* case 'k': */
  412.     case 'K':
  413.         u.uhp = u.uhpmax = 12;
  414.         u.ustr = u.ustrmax = 10;
  415.         ini_inv(Knight);
  416.         break;
  417.     /* case 'b': */
  418.     case 'B':
  419.         u.uhp = u.uhpmax = 14;
  420.         u.ustr = u.ustrmax = 17;
  421.         ini_inv(Barbarian);
  422.         if(!rn2(6)) ini_inv(Lamp);
  423.         break;
  424. #ifdef NEWCLASS
  425.     /* case 's': */
  426.     case 'S':
  427.         Fast = INTRINSIC;
  428.         u.uhp = u.uhpmax = 16;
  429.         u.ustr = u.ustrmax = 16;
  430.         Samurai[S_ARROWS].trquan = 12 + rnd(9)*rnd(9);
  431.         ini_inv(Samurai);
  432.         break;
  433.     /* case 'n': */
  434.     case 'N':
  435.         Fast = INTRINSIC;
  436.         Stealth = INTRINSIC;
  437.         u.uhp = u.uhpmax = 15;
  438.         u.ustr = u.ustrmax = 10;
  439.         Ninja[N_SHURIKEN].trquan = 12 + rnd(9)*rnd(9);
  440.         ini_inv(Ninja);
  441.         if(!rn2(5)) ini_inv(Blindfold);
  442.         break;
  443.     /* case 'p': */
  444.     case 'P':
  445.         u.uhp = u.uhpmax = 13;
  446.         u.ustr = u.ustrmax = 15;
  447. # ifdef SPELLS
  448.         u.uen = u.uenmax += rn2(4);
  449. # endif
  450.         ini_inv(Priest);
  451. # ifdef KAA
  452.         uwep->dknown = 1;    /* bless his primary weapon */
  453. # endif
  454. # ifdef MARKER
  455.         if(!rn2(10)) ini_inv(Magicmarker);
  456. # endif
  457.         else if(!rn2(10)) ini_inv(Lamp);
  458.         objects[POT_HOLY_WATER].oc_name_known = 1;
  459.         break;
  460. #endif /* NEWCLASS /**/
  461.     default:    /* impossible */
  462.         u.uhp = u.uhpmax = 12;
  463.         u.ustr = u.ustrmax = 16;
  464.     }
  465.     find_ac();
  466.     if(!rn2(20)) {
  467.         register int d = rn2(7) - 2;    /* biased variation */
  468.         u.ustr += d;
  469.         u.ustrmax += d;
  470.     }
  471.  
  472. #ifdef WIZARD
  473.     if (wizard)
  474.         wiz_inv();
  475. #endif
  476.     /* make sure he can carry all he has - especially for T's */
  477.     while(inv_weight() > 0 && u.ustr < 118)
  478.         u.ustr++, u.ustrmax++;
  479. }
  480.  
  481. ini_inv(trop) register struct trobj *trop; {
  482. register struct obj *obj;
  483. extern struct obj *mkobj();
  484.     while(trop->trolet) {
  485.         obj = mkobj(trop->trolet);
  486.         obj->known = trop->trknown;
  487.         /* not obj->dknown = 1; - let him look at it at least once */
  488.         obj->cursed = 0;
  489.         if(obj->olet == WEAPON_SYM){
  490.             obj->quan = trop->trquan;
  491.             trop->trquan = 1;
  492.         }
  493.         if(trop->trspe != UNDEF_SPE)
  494.             obj->spe = trop->trspe;
  495.         if(trop->trotyp != UNDEF_TYP)
  496.             obj->otyp = trop->trotyp;
  497.         else
  498.             if(obj->otyp == WAN_WISHING)    /* gitpyr!robert */
  499.                 obj->otyp = WAN_DEATH;
  500.         obj->owt = weight(obj); /* defined after setting otyp+quan */
  501.         obj = addinv(obj);
  502.  
  503.         /*
  504.          * if a magic item's 'known' bit is on, set its name known
  505.          */
  506.         if (IS_MAGIC(obj) && obj->known)
  507.             objects[obj->otyp].oc_name_known=1;
  508.  
  509.         if(obj->olet == ARMOR_SYM){
  510.             switch(obj->otyp){
  511.             case SHIELD:
  512.                 if(!uarms) setworn(obj, W_ARMS);
  513.                 break;
  514.             case HELMET:
  515.                 if(!uarmh) setworn(obj, W_ARMH);
  516.                 break;
  517.             case PAIR_OF_GLOVES:
  518.                 if(!uarmg) setworn(obj, W_ARMG);
  519.                 break;
  520. #ifdef SHIRT
  521.             case HAWAIIAN_SHIRT:
  522.                 if(!uarmu) setworn(obj, W_ARMU);
  523.                 break;
  524. #endif
  525.             case ELVEN_CLOAK:
  526.                 if(!uarm2)
  527.                     setworn(obj, W_ARM);
  528.                 break;
  529.             default:
  530.                 if(!uarm) setworn(obj, W_ARM);
  531.             }
  532.         }
  533.         /* below changed by GAN 01/09/87 to allow wielding of
  534.          * pick-axe or can-opener if there is no weapon
  535.          */
  536.         if(obj->olet == WEAPON_SYM || obj->otyp == PICK_AXE ||
  537.            obj->otyp == CAN_OPENER)
  538.             if(!uwep) setuwep(obj);
  539. #ifndef PYRAMID_BUG
  540.         if(--trop->trquan) continue;    /* make a similar object */
  541. #else
  542.         if(trop->trquan) {              /* check if zero first */
  543.             --trop->trquan;
  544.             if(trop->trquan)
  545.                 continue;    /* make a similar object */
  546.         }
  547. #endif
  548.         trop++;
  549.     }
  550. }
  551.  
  552. #ifdef WIZARD
  553. wiz_inv(){
  554. register struct trobj *trop = &Extra_objs[0];
  555. extern char *getenv();
  556. register char *ep = getenv("INVENT");
  557. register int type;
  558.     while(ep && *ep) {
  559.         type = atoi(ep);
  560.         ep = index(ep, ',');
  561.         if(ep) while(*ep == ',' || *ep == ' ') ep++;
  562.         if(type <= 0 || type > NROFOBJECTS) continue;
  563.         trop->trotyp = type;
  564.         trop->trolet = objects[type].oc_olet;
  565.         trop->trspe = 4;
  566.         trop->trknown = 1;
  567.         trop->trquan = 1;
  568.         ini_inv(trop);
  569.     }
  570. }
  571. #endif /* WIZARD /**/
  572.  
  573. plnamesuffix() {
  574. register char *p;
  575.     if(p = rindex(plname, '-')) {
  576.         *p = 0;
  577.         pl_character[0] = p[1];
  578.         pl_character[1] = 0;
  579.         if(!plname[0]) {
  580.             askname();
  581.             plnamesuffix();
  582.         }
  583.     }
  584. }
  585.  
  586. role_index(pc)
  587. char pc;
  588. {        /* must be called only from u_init() */
  589.         /* so that rolesyms[] is defined */
  590.     register char *cp;
  591.  
  592.     if(cp = index(rolesyms, pc))
  593.         return(cp - rolesyms);
  594.     return(-1);
  595. }
  596.