/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* hack.u_init.c - version 1.0.3 */
#define Strcpy (void) strcpy
#define Strcat (void) strcat
extern struct obj
*addinv();
char pl_character
[PL_CSIZ
];
char *(roles
[]) = { /* must all have distinct first letter */
/* roles[4] may be changed to -man */
"Tourist", "Speleologist", "Fighter", "Knight",
#define NR_OF_ROLES SIZE(roles)
char rolesyms
[NR_OF_ROLES
+ 1]; /* filled by u_init() */
struct trobj Extra_objs
[] = {
struct trobj Cave_man
[] = {
{ MACE
, 1, WEAPON_SYM
, 1, 1 },
{ BOW
, 1, WEAPON_SYM
, 1, 1 },
{ ARROW
, 0, WEAPON_SYM
, 25, 1 }, /* quan is variable */
{ LEATHER_ARMOR
, 0, ARMOR_SYM
, 1, 1 },
struct trobj Fighter
[] = {
{ TWO_HANDED_SWORD
, 0, WEAPON_SYM
, 1, 1 },
{ RING_MAIL
, 0, ARMOR_SYM
, 1, 1 },
struct trobj Knight
[] = {
{ LONG_SWORD
, 0, WEAPON_SYM
, 1, 1 },
{ SPEAR
, 2, WEAPON_SYM
, 1, 1 },
{ RING_MAIL
, 1, ARMOR_SYM
, 1, 1 },
{ HELMET
, 0, ARMOR_SYM
, 1, 1 },
{ SHIELD
, 0, ARMOR_SYM
, 1, 1 },
{ PAIR_OF_GLOVES
, 0, ARMOR_SYM
, 1, 1 },
struct trobj Speleologist
[] = {
{ STUDDED_LEATHER_ARMOR
, 0, ARMOR_SYM
, 1, 1 },
{ UNDEF_TYP
, 0, POTION_SYM
, 2, 0 },
{ FOOD_RATION
, 0, FOOD_SYM
, 3, 1 },
{ PICK_AXE
, UNDEF_SPE
, TOOL_SYM
, 1, 0 },
{ ICE_BOX
, 0, TOOL_SYM
, 1, 0 },
struct trobj Tinopener
[] = {
{ CAN_OPENER
, 0, TOOL_SYM
, 1, 1 },
struct trobj Tourist
[] = {
{ UNDEF_TYP
, 0, FOOD_SYM
, 10, 1 },
{ POT_EXTRA_HEALING
, 0, POTION_SYM
, 2, 0 },
{ EXPENSIVE_CAMERA
, 0, TOOL_SYM
, 1, 1 },
{ DART
, 2, WEAPON_SYM
, 25, 1 }, /* quan is variable */
struct trobj Wizard
[] = {
{ ELVEN_CLOAK
, 0, ARMOR_SYM
, 1, 1 },
{ UNDEF_TYP
, UNDEF_SPE
, WAND_SYM
, 2, 0 },
{ UNDEF_TYP
, UNDEF_SPE
, RING_SYM
, 2, 0 },
{ UNDEF_TYP
, UNDEF_SPE
, POTION_SYM
, 2, 0 },
{ UNDEF_TYP
, UNDEF_SPE
, SCROLL_SYM
, 3, 0 },
if(flags
.female
) /* should have been set in HACKOPTIONS */
for(i
= 0; i
< NR_OF_ROLES
; i
++)
rolesyms
[i
] = roles
[i
][0];
if(pc
= pl_character
[0]) {
if('a' <= pc
&& pc
<= 'z') pc
+= 'A'-'a';
if((i
= role_index(pc
)) >= 0)
goto got_suffix
; /* implies experienced */
printf("\nUnknown role: %c\n", pc
);
pl_character
[0] = pc
= 0;
printf("\nAre you an experienced player? [ny] ");
while(!index("ynYN \n\004", (exper
= readchar())))
if(exper
== '\004') /* Give him an opportunity to get out */
printf("%c\n", exper
); /* echo */
if(index("Nn \n", exper
)) {
printf("\nTell me what kind of character you are:\n");
for(i
= 0; i
< NR_OF_ROLES
; i
++) {
printf(" a %s", roles
[i
]);
else if(i
< NR_OF_ROLES
- 2)
else if(i
== NR_OF_ROLES
- 2)
printf("? [%s] ", rolesyms
);
if('a' <= pc
&& pc
<= 'z') pc
+= 'A'-'a';
if((i
= role_index(pc
)) >= 0) {
printf("%c\n", pc
); /* echo */
(void) fflush(stdout
); /* should be seen */
if(pc
== '\004') /* Give him the opportunity to get out */
printf("\nI'll choose a character for you.\n");
printf("This game you will be a%s %s.\n",
exper
? "n experienced" : "",
/* give him some feedback in case mklev takes much time */
(void) strncpy(pl_character
, roles
[i
], PL_CSIZ
-1);
pl_character
[PL_CSIZ
-1] = 0;
uarm
= uarm2
= uarmh
= uarms
= uarmg
= uwep
= uball
= uchain
=
Cave_man
[2].trquan
= 12 + rnd(9)*rnd(9);
Tourist
[3].trquan
= 20 + rnd(20);
u
.ugold
= u
.ugold0
= rnd(1000);
if(!rn2(25)) ini_inv(Tinopener
);
for(i
=1; i
<=4; i
++) if(!rn2(5))
Wizard
[i
].trquan
+= rn2(3) - 1;
if(!rn2(10)) ini_inv(Tinopener
);
default: /* impossible */
register int d
= rn2(7) - 2; /* biased variation */
/* make sure he can carry all he has - especially for T's */
while(inv_weight() > 0 && u
.ustr
< 118)
ini_inv(trop
) register struct trobj
*trop
; {
register struct obj
*obj
;
extern struct obj
*mkobj();
obj
= mkobj(trop
->trolet
);
obj
->known
= trop
->trknown
;
/* not obj->dknown = 1; - let him look at it at least once */
if(obj
->olet
== WEAPON_SYM
){
obj
->quan
= trop
->trquan
;
if(trop
->trspe
!= UNDEF_SPE
)
if(trop
->trotyp
!= UNDEF_TYP
)
obj
->otyp
= trop
->trotyp
;
if(obj
->otyp
== WAN_WISHING
) /* gitpyr!robert */
obj
->owt
= weight(obj
); /* defined after setting otyp+quan */
if(obj
->olet
== ARMOR_SYM
){
if(!uarms
) setworn(obj
, W_ARMS
);
if(!uarmh
) setworn(obj
, W_ARMH
);
if(!uarmg
) setworn(obj
, W_ARMG
);
if(!uarm
) setworn(obj
, W_ARM
);
if(obj
->olet
== WEAPON_SYM
)
if(--trop
->trquan
) continue; /* make a similar object */
if(trop
->trquan
) { /* check if zero first */
continue; /* make a similar object */
register struct trobj
*trop
= &Extra_objs
[0];
register char *ep
= getenv("INVENT");
if(ep
) while(*ep
== ',' || *ep
== ' ') ep
++;
if(type
<= 0 || type
> NROFOBJECTS
) continue;
trop
->trolet
= objects
[type
].oc_olet
;
/* give him a wand of wishing by default */
trop
->trotyp
= WAN_WISHING
;
if(p
= rindex(plname
, '-')) {
{ /* must be called only from u_init() */
/* so that rolesyms[] is defined */
if(cp
= index(rolesyms
, pc
))