home *** CD-ROM | disk | FTP | other *** search
- /* SCCS Id: @(#)u_init.c 3.1 92/11/13 */
- /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
- /* NetHack may be freely redistributed. See license for details. */
-
- #include "hack.h"
-
- struct trobj {
- unsigned short int trotyp;
- schar trspe;
- char trclass;
- Bitfield(trquan,6);
- Bitfield(trknown,1);
- Bitfield(trbless,2);
- };
-
- static void FDECL(ini_inv, (struct trobj *));
- static void FDECL(knows_object,(int));
- static void FDECL(knows_class,(CHAR_P));
- static int FDECL(role_index,(CHAR_P));
-
- #define UNDEF_TYP 0
- #define UNDEF_SPE '\177'
- #define UNDEF_BLESS 2
-
- /* all roles must all have distinct first letter */
- const char *roles[] = { /* also used in options.c and winxxx.c */
- /* roles[2] and [6] are changed for females */
- /* in all cases, the corresponding male and female */
- /* roles must start with the same letter */
- "Archeologist", "Barbarian", "Caveman", "Elf", "Healer", "Knight",
- "Priest", "Rogue", "Samurai",
- #ifdef TOURIST
- "Tourist",
- #endif
- "Valkyrie", "Wizard", 0
- };
-
- static struct trobj Cave_man[] = {
- #define C_ARROWS 2
- { CLUB, 1, WEAPON_CLASS, 1, 1, UNDEF_BLESS },
- { BOW, 1, WEAPON_CLASS, 1, 1, UNDEF_BLESS },
- { ARROW, 0, WEAPON_CLASS, 25, 1, UNDEF_BLESS }, /* quan is variable */
- { LEATHER_ARMOR, 0, ARMOR_CLASS, 1, 1, UNDEF_BLESS },
- { 0, 0, 0, 0, 0, 0 }
- };
-
- static struct trobj Barbarian[] = {
- #define B_MAJOR 0 /* two-handed sword or battle-axe */
- #define B_MINOR 1 /* matched with axe or short sword */
- { TWO_HANDED_SWORD, 0, WEAPON_CLASS, 1, 1, UNDEF_BLESS },
- { AXE, 0, WEAPON_CLASS, 1, 1, UNDEF_BLESS },
- { RING_MAIL, 0, ARMOR_CLASS, 1, 1, UNDEF_BLESS },
- { FOOD_RATION, 0, FOOD_CLASS, 1, 1, 0 },
- { 0, 0, 0, 0, 0, 0 }
- };
-
- static struct trobj Knight[] = {
- { LONG_SWORD, 0, WEAPON_CLASS, 1, 1, UNDEF_BLESS },
- { SPEAR, 2, WEAPON_CLASS, 1, 1, UNDEF_BLESS },
- { RING_MAIL, 1, ARMOR_CLASS, 1, 1, UNDEF_BLESS },
- { HELMET, 0, ARMOR_CLASS, 1, 1, UNDEF_BLESS },
- { SMALL_SHIELD, 0, ARMOR_CLASS, 1, 1, UNDEF_BLESS },
- { LEATHER_GLOVES, 0, ARMOR_CLASS, 1, 1, UNDEF_BLESS },
- { 0, 0, 0, 0, 0, 0 }
- };
-
- static struct trobj Elf[] = {
- #define E_ARROWS 2
- #define E_ARMOR 3
- { ELVEN_SHORT_SWORD, 0, WEAPON_CLASS, 1, 1, UNDEF_BLESS },
- { ELVEN_BOW, 0, WEAPON_CLASS, 1, 1, UNDEF_BLESS },
- { ELVEN_ARROW, 0, WEAPON_CLASS, 25, 1, UNDEF_BLESS },
- { UNDEF_TYP, 0, ARMOR_CLASS, 1, 1, UNDEF_BLESS },
- { LEMBAS_WAFER, 0, FOOD_CLASS, 2, 1, 0 },
- { 0, 0, 0, 0, 0, 0 }
- };
-
- static struct trobj Valkyrie[] = {
- { LONG_SWORD, 1, WEAPON_CLASS, 1, 1, UNDEF_BLESS },
- { DAGGER, 0, WEAPON_CLASS, 1, 1, UNDEF_BLESS },
- { SMALL_SHIELD, 3, ARMOR_CLASS, 1, 1, UNDEF_BLESS },
- { FOOD_RATION, 0, FOOD_CLASS, 1, 1, 0 },
- { 0, 0, 0, 0, 0, 0 }
- };
-
- static struct trobj Healer[] = {
- { SCALPEL, 0, WEAPON_CLASS, 1, 1, UNDEF_BLESS },
- { LEATHER_GLOVES, 1, ARMOR_CLASS, 1, 1, UNDEF_BLESS },
- { STETHOSCOPE, 0, TOOL_CLASS, 1, 1, 0 },
- { POT_HEALING, 0, POTION_CLASS, 4, 1, UNDEF_BLESS },
- { POT_EXTRA_HEALING, 0, POTION_CLASS, 4, 1, UNDEF_BLESS },
- { WAN_SLEEP, UNDEF_SPE, WAND_CLASS, 1, 1, UNDEF_BLESS },
- /* always blessed, so it's guaranteed readable */
- { SPE_HEALING, 0, SPBOOK_CLASS, 1, 1, 1 },
- { SPE_EXTRA_HEALING, 0, SPBOOK_CLASS, 1, 1, 1 },
- { APPLE, 0, FOOD_CLASS, 5, 1, 0 },
- { 0, 0, 0, 0, 0, 0 }
- };
-
- static struct trobj Archeologist[] = {
- /* if adventure has a name... idea from tan@uvm-gen */
- { BULLWHIP, 2, WEAPON_CLASS, 1, 1, UNDEF_BLESS },
- { LEATHER_JACKET, 0, ARMOR_CLASS, 1, 1, UNDEF_BLESS },
- { FEDORA, 0, ARMOR_CLASS, 1, 1, UNDEF_BLESS },
- { FOOD_RATION, 0, FOOD_CLASS, 3, 1, 0 },
- { PICK_AXE, UNDEF_SPE, TOOL_CLASS, 1, 1, UNDEF_BLESS },
- { TINNING_KIT, 0, TOOL_CLASS, 1, 1, UNDEF_BLESS },
- { SACK, 0, TOOL_CLASS, 1, 0, 0 },
- { 0, 0, 0, 0, 0, 0 }
- };
-
- static struct trobj Tinopener[] = {
- { TIN_OPENER, 0, TOOL_CLASS, 1, 1, 0 },
- { 0, 0, 0, 0, 0, 0 }
- };
-
- static struct trobj Magicmarker[] = {
- { MAGIC_MARKER, UNDEF_SPE, TOOL_CLASS, 1, 1, 0 },
- { 0, 0, 0, 0, 0, 0 }
- };
-
- static struct trobj Lamp[] = {
- { OIL_LAMP, 1, TOOL_CLASS, 1, 1, 0 },
- { 0, 0, 0, 0, 0, 0 }
- };
-
- #ifdef TOURIST
- # ifdef WALKIES
- static struct trobj Leash[] = {
- { LEASH, 0, TOOL_CLASS, 1, 1, 0 },
- { 0, 0, 0, 0, 0, 0 }
- };
- # endif
-
- static struct trobj Towel[] = {
- { TOWEL, 0, TOOL_CLASS, 1, 1, 0 },
- { 0, 0, 0, 0, 0, 0 }
- };
- #endif
-
- #ifdef EXPLORE_MODE
- static struct trobj Wishing[] = {
- { WAN_WISHING, 3, WAND_CLASS, 1, 1, 0 },
- { 0, 0, 0, 0, 0, 0 }
- };
- #endif
-
- static struct trobj Instrument[] = {
- { WOODEN_FLUTE, 0, TOOL_CLASS, 1, 1, 0 },
- { 0, 0, 0, 0, 0, 0 }
- };
-
- static struct trobj Blindfold[] = {
- { BLINDFOLD, 0, TOOL_CLASS, 1, 1, 0 },
- { 0, 0, 0, 0, 0, 0 }
- };
-
- #ifdef TOURIST
- static struct trobj Tourist[] = {
- #define T_DARTS 0
- { DART, 2, WEAPON_CLASS, 25, 1, UNDEF_BLESS }, /* quan is variable */
- { UNDEF_TYP, UNDEF_SPE, FOOD_CLASS, 10, 1, 0 },
- { POT_EXTRA_HEALING, 0, POTION_CLASS, 2, 1, UNDEF_BLESS },
- { SCR_MAGIC_MAPPING, 0, SCROLL_CLASS, 4, 1, UNDEF_BLESS },
- { HAWAIIAN_SHIRT, 0, ARMOR_CLASS, 1, 1, UNDEF_BLESS },
- { EXPENSIVE_CAMERA, 0, TOOL_CLASS, 1, 1, 0 },
- { CREDIT_CARD, 0, TOOL_CLASS, 1, 1, 0 },
- { 0, 0, 0, 0, 0, 0 }
- };
- #endif
-
- static struct trobj Rogue[] = {
- #define R_DAGGERS 1
- { SHORT_SWORD, 0, WEAPON_CLASS, 1, 1, UNDEF_BLESS },
- { DAGGER, 0, WEAPON_CLASS, 10, 1, 0 }, /* quan is variable */
- { LEATHER_ARMOR, 1, ARMOR_CLASS, 1, 1, UNDEF_BLESS },
- { POT_SICKNESS, 0, POTION_CLASS, 1, 1, 0 },
- { LOCK_PICK, 9, TOOL_CLASS, 1, 1, 0 },
- { SACK, 0, TOOL_CLASS, 1, 0, 0 },
- { 0, 0, 0, 0, 0, 0 }
- };
-
- static struct trobj Wizard[] = {
- #define W_MULTSTART 2
- #define W_MULTEND 6
- { ATHAME, 1, WEAPON_CLASS, 1, 1, 1 }, /* for dealing with ghosts */
- { CLOAK_OF_MAGIC_RESISTANCE, 0, ARMOR_CLASS, 1, 1, UNDEF_BLESS },
- { UNDEF_TYP, UNDEF_SPE, WAND_CLASS, 1, 1, UNDEF_BLESS },
- { UNDEF_TYP, UNDEF_SPE, RING_CLASS, 2, 1, UNDEF_BLESS },
- { UNDEF_TYP, UNDEF_SPE, POTION_CLASS, 3, 1, UNDEF_BLESS },
- { UNDEF_TYP, UNDEF_SPE, SCROLL_CLASS, 3, 1, UNDEF_BLESS },
- { UNDEF_TYP, UNDEF_SPE, SPBOOK_CLASS, 1, 1, UNDEF_BLESS },
- { 0, 0, 0, 0, 0, 0 }
- };
-
- static struct trobj Samurai[] = {
- #define S_ARROWS 3
- { KATANA, 0, WEAPON_CLASS, 1, 1, UNDEF_BLESS },
- { SHORT_SWORD, 0, WEAPON_CLASS, 1, 1, UNDEF_BLESS }, /* wakizashi */
- { YUMI, 0, WEAPON_CLASS, 1, 1, UNDEF_BLESS },
- { YA, 0, WEAPON_CLASS, 25, 1, UNDEF_BLESS }, /* variable quan */
- { SPLINT_MAIL, 0, ARMOR_CLASS, 1, 1, UNDEF_BLESS },
- { FORTUNE_COOKIE, 0, FOOD_CLASS, 3, 1, 0 },
- { 0, 0, 0, 0, 0, 0 }
- };
-
- static struct trobj Priest[] = {
- { MACE, 1, WEAPON_CLASS, 1, 1, 1 },
- { CHAIN_MAIL, 0, ARMOR_CLASS, 1, 1, UNDEF_BLESS },
- { SMALL_SHIELD, 0, ARMOR_CLASS, 1, 1, UNDEF_BLESS },
- { POT_WATER, 0, POTION_CLASS, 4, 1, 1 }, /* holy water */
- { CLOVE_OF_GARLIC, 0, FOOD_CLASS, 1, 1, 0 },
- { SPRIG_OF_WOLFSBANE, 0, FOOD_CLASS, 1, 1, 0 },
- { UNDEF_TYP, UNDEF_SPE, SPBOOK_CLASS, 2, 1, UNDEF_BLESS },
- { 0, 0, 0, 0, 0, 0 }
- };
-
- static void
- knows_object(obj)
- register int obj;
- {
- makeknown(obj);
- objects[obj].oc_descr_idx = 0; /* not a "discovery" */
- }
-
- /* Know ordinary (non-magical) objects of a certain class,
- * like all gems except the loadstone and luckstone.
- */
- static void
- knows_class(sym)
- register char sym;
- {
- register int ct;
- for (ct = 1; ct <= NROFOBJECTS; ct++)
- if (objects[ct].oc_class == sym && !objects[ct].oc_magic)
- knows_object(ct);
- }
-
- static int
- role_index(pc)
- char pc;
- {
- register const char *cp;
-
- if ((cp = index(pl_classes, pc)) != 0)
- return(cp - pl_classes);
- return(-1);
- }
-
- void
- u_init()
- {
- register int i;
- char pc;
-
- pc = pl_character[0];
- if(pc == '\0') {
- /* should be unnecessary now */
- exit_nhwindows(NULL);
- terminate(0);
- }
- i = role_index(pc);
-
- (void) strncpy(pl_character, roles[i], PL_CSIZ-1);
- pl_character[PL_CSIZ-1] = 0;
- flags.beginner = 1;
-
- /* zero u, including pointer values --
- * necessary when aborting from a failed restore */
- (void) memset((genericptr_t)&u, 0, sizeof(u));
- for (i = 0; i < LAST_PROP+1; i++) u.uprops[i].p_tofn = 0;
- u.ustuck = (struct monst *)0;
-
- #if 0 /* documentation of more zero values as desirable */
- u.uluck = u.moreluck = 0;
- # ifdef TOURIST
- uarmu = 0;
- # endif
- uarm = uarmc = uarmh = uarms = uarmg = uarmf = 0;
- uwep = uball = uchain = uleft = uright = 0;
- u.ublessed = 0; /* not worthy yet */
- u.ugangr = 0; /* gods not angry */
- # ifdef ELBERETH
- u.uevent.uhand_of_elbereth = 0;
- # endif
- u.uevent.uheard_tune = 0;
- u.uevent.uopened_dbridge = 0;
- u.uevent.udemigod = 0; /* not a demi-god yet... */
- u.udg_cnt = 0;
- # ifdef POLYSELF
- u.mh = u.mhmax = u.mtimedone = 0;
- # endif
- u.uz.dnum = u.uz0.dnum = 0;
- u.utotype = 0;
- #endif /* 0 */
- u.uz.dlevel = u.uz0.dlevel = 1;
- u.utolev = u.uz;
-
- u.usym = S_HUMAN;
- u.umoved = FALSE;
- u.ugrave_arise = -1;
-
- u.ulevel = 0; /* set up some of the initial attributes */
- u.uhp = u.uhpmax = newhp();
- adjabil(0,1);
- u.ulevel = 1;
-
- init_uhunger();
- u.uen = u.uenmax = 1;
- for (i = 0; i <= MAXSPELL; i++) spl_book[i].sp_id = NO_SPELL;
- u.ublesscnt = 300; /* no prayers just yet */
- #ifdef POLYSELF
- u.umonnum = -1;
- u.ulycn = -1;
- set_uasmon();
- #endif
-
- /*
- * For now, everyone starts out with a night vision range of 1 and
- * their xray range disabled.
- */
- u.nv_range = 1;
- u.xray_range = -1;
-
-
- switch(pc) {
- /* pc will always be in uppercase by this point */
- case 'A':
- u.umonster = PM_ARCHEOLOGIST;
- ini_inv(Archeologist);
- if(!rn2(10)) ini_inv(Tinopener);
- else if(!rn2(4)) ini_inv(Lamp);
- else if(!rn2(10)) ini_inv(Magicmarker);
- knows_class(GEM_CLASS);
- knows_object(SACK);
- /* We can't set trknown for it, then it'd be "uncursed"
- * sack...
- */
- break;
- case 'B':
- u.umonster = PM_BARBARIAN;
- if (rn2(100) >= 50) { /* see Elf comment */
- Barbarian[B_MAJOR].trotyp = BATTLE_AXE;
- Barbarian[B_MINOR].trotyp = SHORT_SWORD;
- }
- ini_inv(Barbarian);
- if(!rn2(6)) ini_inv(Lamp);
- knows_class(WEAPON_CLASS);
- knows_class(ARMOR_CLASS);
- break;
- case 'C':
- u.umonster = PM_CAVEMAN;
- Cave_man[C_ARROWS].trquan = rn1(30, 13);
- ini_inv(Cave_man);
- break;
- case 'E':
- u.umonster = PM_ELF;
- Elf[E_ARROWS].trquan = rn1(20, 16);
- Elf[E_ARMOR].trotyp = ((rn2(100) >= 50)
- ? ELVEN_MITHRIL_COAT : ELVEN_CLOAK);
- /* rn2(100) > 50 necessary because some random number
- * generators are bad enough to seriously skew the
- * results if we use rn2(2)... --KAA
- */
-
- /*
- * Elves are people of music and song, or they are warriors.
- * Warriors get mithril coats; non-warriors MAY get an
- * instrument. We use a kludge to get only non-magic
- * instruments.
- */
- if (Elf[E_ARMOR].trotyp == ELVEN_CLOAK) {
- if (!rn2(5)) {
- static int trotyp[] = {
- WOODEN_FLUTE, TOOLED_HORN, WOODEN_HARP,
- BELL, BUGLE, LEATHER_DRUM
- };
-
- Instrument[0].trotyp = trotyp[rn2(SIZE(trotyp))];
- #ifdef DEBUG
- debugpline("Elf got instrument %d",
- Instrument[0].trotyp);
- #endif
- ini_inv(Instrument);
- }
- }
- ini_inv(Elf);
- if(!rn2(5)) ini_inv(Blindfold);
- else if(!rn2(6)) ini_inv(Lamp);
- knows_object(ELVEN_SHORT_SWORD);
- knows_object(ELVEN_ARROW);
- knows_object(ELVEN_BOW);
- knows_object(ELVEN_SPEAR);
- knows_object(ELVEN_DAGGER);
- knows_object(ELVEN_BROADSWORD);
- knows_object(ELVEN_MITHRIL_COAT);
- knows_object(ELVEN_LEATHER_HELM);
- knows_object(ELVEN_SHIELD);
- knows_object(ELVEN_BOOTS);
- knows_object(ELVEN_CLOAK);
- break;
- case 'H':
- u.umonster = PM_HEALER;
- u.ugold = u.ugold0 = rn1(1000, 1001);
- ini_inv(Healer);
- if(!rn2(25)) ini_inv(Lamp);
- break;
- case 'K':
- u.umonster = PM_KNIGHT;
- ini_inv(Knight);
- knows_class(WEAPON_CLASS);
- knows_class(ARMOR_CLASS);
- /* give knights chess-like mobility
- * -- idea from wooledge@skybridge.scl.cwru.edu */
- Jumping |= FROMOUTSIDE;
- break;
- case 'P':
- u.umonster = PM_PRIEST;
- u.uen = u.uenmax += rn2(4);
- ini_inv(Priest);
- if(!rn2(10)) ini_inv(Magicmarker);
- else if(!rn2(10)) ini_inv(Lamp);
- knows_object(POT_WATER);
- break;
- case 'R':
- u.umonster = PM_ROGUE;
- Rogue[R_DAGGERS].trquan = rn1(10, 6);
- u.ugold = u.ugold0 = 0;
- ini_inv(Rogue);
- if(!rn2(5)) ini_inv(Blindfold);
- knows_object(SACK);
- break;
- case 'S':
- u.umonster = PM_SAMURAI;
- Samurai[S_ARROWS].trquan = rn1(20, 26);
- ini_inv(Samurai);
- if(!rn2(5)) ini_inv(Blindfold);
- knows_class(WEAPON_CLASS);
- knows_class(ARMOR_CLASS);
- break;
- #ifdef TOURIST
- case 'T':
- u.umonster = PM_TOURIST;
- Tourist[T_DARTS].trquan = rn1(20, 21);
- u.ugold = u.ugold0 = rnd(1000);
- ini_inv(Tourist);
- if(!rn2(25)) ini_inv(Tinopener);
- #ifdef WALKIES
- else if(!rn2(25)) ini_inv(Leash);
- #endif
- else if(!rn2(25)) ini_inv(Towel);
- else if(!rn2(25)) ini_inv(Magicmarker);
- break;
- #endif
- case 'V':
- u.umonster = PM_VALKYRIE;
- flags.female = TRUE;
- ini_inv(Valkyrie);
- if(!rn2(6)) ini_inv(Lamp);
- knows_class(WEAPON_CLASS);
- knows_class(ARMOR_CLASS);
- break;
- case 'W':
- u.umonster = PM_WIZARD;
- u.uen = u.uenmax += rn2(4);
- ini_inv(Wizard);
- if(!rn2(5)) ini_inv(Magicmarker);
- if(!rn2(5)) ini_inv(Blindfold);
- break;
-
- default: /* impossible */
- break;
- }
- #ifdef EXPLORE_MODE
- if (discover)
- ini_inv(Wishing);
- #endif
- find_ac(); /* get initial ac value */
- init_attr(75); /* init attribute values */
- max_rank_sz(); /* set max str size for class ranks */
- /*
- * Do we really need this?
- */
- for(i = 0; i < A_MAX; i++)
- if(!rn2(20)) {
- register int xd = rn2(7) - 2; /* biased variation */
- (void) adjattrib(i, xd, TRUE);
- if (ABASE(i) < AMAX(i)) AMAX(i) = ABASE(i);
- }
-
- /* make sure you can carry all you have - especially for Tourists */
- while(inv_weight() > 0 && ACURR(A_STR) < 118)
- (void) adjattrib(A_STR, 1, TRUE);
-
- u.ualignbase[0] = u.ualignbase[1] = u.ualign.type;
- }
-
- static void
- ini_inv(trop)
- register struct trobj *trop;
- {
- struct obj *obj;
- while(trop->trclass) {
- boolean undefined = (trop->trotyp == UNDEF_TYP);
-
- if (!undefined)
- obj = mksobj((int)trop->trotyp, TRUE, FALSE);
- else obj = mkobj(trop->trclass,FALSE);
-
- /* For random objects, do not create certain overly powerful
- * items: wand of wishing, ring of levitation, or the
- * polymorph/polymorph control combination. Specific objects,
- * i.e. the discovery wishing, are still OK.
- * Also, don't get a couple of really useless items. (Note:
- * punishment isn't "useless". Some players who start out with
- * one will immediately read it and use the iron ball as a
- * weapon.)
- */
- if (undefined) {
- #ifdef POLYSELF
- static unsigned NEARDATA nocreate = STRANGE_OBJECT;
- static unsigned NEARDATA nocreate2 = STRANGE_OBJECT;
- #endif
- static unsigned NEARDATA nocreate3 = STRANGE_OBJECT;
-
- while(obj->otyp == WAN_WISHING
- #ifdef POLYSELF
- || obj->otyp == nocreate
- || obj->otyp == nocreate2
- #endif
- || obj->otyp == nocreate3
- #ifdef ELBERETH
- || obj->otyp == RIN_LEVITATION
- #endif
- /* 'useless' items */
- || obj->otyp == POT_HALLUCINATION
- || obj->otyp == SCR_AMNESIA
- || obj->otyp == SCR_FIRE
- || obj->otyp == RIN_AGGRAVATE_MONSTER
- || obj->otyp == RIN_HUNGER
- || obj->otyp == WAN_NOTHING
- /* powerful spells are either useless to
- low level players or unbalancing */
- || (obj->oclass == SPBOOK_CLASS &&
- objects[obj->otyp].oc_level > 3)
- ) {
- dealloc_obj(obj);
- obj = mkobj(trop->trclass, FALSE);
- }
-
- /* Don't start with +0 or negative rings */
- if(objects[obj->otyp].oc_charged && obj->spe <= 0)
- obj->spe = rne(3);
-
- /* Heavily relies on the fact that 1) we create wands
- * before rings, 2) that we create rings before
- * spellbooks, and that 3) not more than 1 object of a
- * particular symbol is to be prohibited. (For more
- * objects, we need more nocreate variables...)
- */
- #ifdef POLYSELF
- switch (obj->otyp) {
- case WAN_POLYMORPH:
- case RIN_POLYMORPH:
- nocreate = RIN_POLYMORPH_CONTROL;
- break;
- case RIN_POLYMORPH_CONTROL:
- nocreate = RIN_POLYMORPH;
- nocreate2 = SPE_POLYMORPH;
- }
- #endif /* POLYSELF */
- /* Don't have 2 of the same ring */
- if (obj->oclass == RING_CLASS)
- nocreate3 = obj->otyp;
- }
-
- obj->bknown = trop->trknown;
- if(objects[obj->otyp].oc_uses_known) obj->known = trop->trknown;
- /* not obj->dknown = 1; - let him look at it at least once */
- obj->cursed = 0;
- if(obj->oclass == WEAPON_CLASS || obj->oclass == TOOL_CLASS) {
- obj->quan = (long) trop->trquan;
- trop->trquan = 1;
- }
- if(obj->oclass == FOOD_CLASS && undefined) {
- obj->known = 1;
- /* needed for tins and eggs; harmless otherwise */
- obj->bknown = 1;
- }
- /*
- * The below lines not needed because they don't correspond
- * to any actual inventory; nobody gets random tools.
- else if(obj->oclass == TOOL_CLASS && undefined) {
- obj->bknown = (obj->otyp != BAG_OF_TRICKS
- && obj->otyp != SACK
- && obj->otyp != CHEST
- && obj->otyp != LARGE_BOX
- && obj->otyp != ICE_BOX);
- }
- */
- if(trop->trspe != UNDEF_SPE)
- obj->spe = trop->trspe;
- if(trop->trbless != UNDEF_BLESS)
- obj->blessed = trop->trbless;
-
- /* defined after setting otyp+quan + blessedness */
- obj->owt = weight(obj);
- obj = addinv(obj);
-
- /* Make the type known if necessary */
- if (OBJ_DESCR(objects[obj->otyp]) && obj->known)
- makeknown(obj->otyp);
-
- if(obj->oclass == ARMOR_CLASS){
- if (is_shield(obj) && !uarms)
- setworn(obj, W_ARMS);
- else if (is_helmet(obj) && !uarmh)
- setworn(obj, W_ARMH);
- else if (is_gloves(obj) && !uarmg)
- setworn(obj, W_ARMG);
- #ifdef TOURIST
- else if (obj->otyp == HAWAIIAN_SHIRT && !uarmu)
- setworn(obj, W_ARMU);
- #endif
- else if (is_cloak(obj) && !uarmc)
- setworn(obj, W_ARMC);
- else if (is_boots(obj) && !uarmf)
- setworn(obj, W_ARMF);
- else if (!uarm)
- setworn(obj, W_ARM);
- }
- /* below changed by GAN 01/09/87 to allow wielding of
- * pick-axe or can-opener if there is no weapon
- */
- if(obj->oclass == WEAPON_CLASS || obj->otyp == PICK_AXE ||
- obj->otyp == TIN_OPENER)
- if(!uwep) setuwep(obj);
- #if !defined(PYRAMID_BUG) && !defined(MAC)
- if(--trop->trquan) continue; /* make a similar object */
- #else
- if(trop->trquan) { /* check if zero first */
- --trop->trquan;
- if(trop->trquan)
- continue; /* make a similar object */
- }
- #endif
- trop++;
- }
- }
-
- void
- plnamesuffix() {
- register char *p;
- if ((p = rindex(plname, '-')) != 0) {
- *p = 0;
- pl_character[0] = p[1];
- pl_character[1] = 0;
- if(!plname[0]) {
- askname();
- plnamesuffix();
- }
- }
- }
-
- /*u_init.c*/
-