1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64: #include <sys/cdefs.h>
65: #ifndef lint
66: __RCSID("$NetBSD: hack.u_init.c,v 1.8 2004/11/05 21:30:32 dsl Exp $");
67: #endif
68:
69: #include <ctype.h>
70: #include <signal.h>
71: #include <stdlib.h>
72: #include "hack.h"
73: #include "extern.h"
74:
75: #define Strcpy (void) strcpy
76: #define Strcat (void) strcat
77: #define UNDEF_TYP 0
78: #define UNDEF_SPE '\177'
79:
80: struct you zerou;
81: char pl_character[PL_CSIZ];
82: const char *(roles[]) = {
83:
84: "Tourist", "Speleologist", "Fighter", "Knight",
85: "Cave-man", "Wizard"
86: };
87: #define NR_OF_ROLES SIZE(roles)
88: char rolesyms[NR_OF_ROLES + 1];
89:
90: struct trobj {
91: uchar trotyp;
92: schar trspe;
93: char trolet;
94: Bitfield(trquan, 6);
95: Bitfield(trknown, 1);
96: };
97:
98: #ifdef WIZARD
99: struct trobj Extra_objs[] = {
100: {0, 0, 0, 0, 0},
101: {0, 0, 0, 0, 0}
102: };
103: #endif
104:
105: struct trobj Cave_man[] = {
106: {MACE, 1, WEAPON_SYM, 1, 1},
107: {BOW, 1, WEAPON_SYM, 1, 1},
108: {ARROW, 0, WEAPON_SYM, 25, 1},
109: {LEATHER_ARMOR, 0, ARMOR_SYM, 1, 1},
110: {0, 0, 0, 0, 0}
111: };
112:
113: struct trobj Fighter[] = {
114: {TWO_HANDED_SWORD, 0, WEAPON_SYM, 1, 1},
115: {RING_MAIL, 0, ARMOR_SYM, 1, 1},
116: {0, 0, 0, 0, 0}
117: };
118:
119: struct trobj Knight[] = {
120: {LONG_SWORD, 0, WEAPON_SYM, 1, 1},
121: {SPEAR, 2, WEAPON_SYM, 1, 1},
122: {RING_MAIL, 1, ARMOR_SYM, 1, 1},
123: {HELMET, 0, ARMOR_SYM, 1, 1},
124: {SHIELD, 0, ARMOR_SYM, 1, 1},
125: {PAIR_OF_GLOVES, 0, ARMOR_SYM, 1, 1},
126: {0, 0, 0, 0, 0}
127: };
128:
129: struct trobj Speleologist[] = {
130: {STUDDED_LEATHER_ARMOR, 0, ARMOR_SYM, 1, 1},
131: {UNDEF_TYP, 0, POTION_SYM, 2, 0},
132: {FOOD_RATION, 0, FOOD_SYM, 3, 1},
133: {PICK_AXE, UNDEF_SPE, TOOL_SYM, 1, 0},
134: {ICE_BOX, 0, TOOL_SYM, 1, 0},
135: {0, 0, 0, 0, 0}
136: };
137:
138: struct trobj Tinopener[] = {
139: {CAN_OPENER, 0, TOOL_SYM, 1, 1},
140: {0, 0, 0, 0, 0}
141: };
142:
143: struct trobj Tourist[] = {
144: {UNDEF_TYP, 0, FOOD_SYM, 10, 1},
145: {POT_EXTRA_HEALING, 0, POTION_SYM, 2, 0},
146: {EXPENSIVE_CAMERA, 0, TOOL_SYM, 1, 1},
147: {DART, 2, WEAPON_SYM, 25, 1},
148: {0, 0, 0, 0, 0}
149: };
150:
151: struct trobj Wizard[] = {
152: {ELVEN_CLOAK, 0, ARMOR_SYM, 1, 1},
153: {UNDEF_TYP, UNDEF_SPE, WAND_SYM, 2, 0},
154: {UNDEF_TYP, UNDEF_SPE, RING_SYM, 2, 0},
155: {UNDEF_TYP, UNDEF_SPE, POTION_SYM, 2, 0},
156: {UNDEF_TYP, UNDEF_SPE, SCROLL_SYM, 3, 0},
157: {0, 0, 0, 0, 0}
158: };
159:
160: void
161: u_init()
162: {
163: int i;
164: char exper = 'y', pc;
165: if (flags.female)
166: roles[4] = "Cave-woman";
167: for (i = 0; i < NR_OF_ROLES; i++)
168: rolesyms[i] = roles[i][0];
169: rolesyms[i] = 0;
170:
171: if ((pc = pl_character[0]) != '\0') {
172: if (islower((unsigned char)pc))
173: pc = toupper((unsigned char)pc);
174: if ((i = role_index(pc)) >= 0)
175: goto got_suffix;
176: printf("\nUnknown role: %c\n", pc);
177: pl_character[0] = pc = 0;
178: }
179: printf("\nAre you an experienced player? [ny] ");
180:
181: while (!strchr("ynYN \n\004", (exper = readchar())))
182: bell();
183: if (exper == '\004')
184: end_of_input();
185: printf("%c\n", exper);
186: if (strchr("Nn \n", exper)) {
187: exper = 0;
188: goto beginner;
189: }
190: printf("\nTell me what kind of character you are:\n");
191: printf("Are you");
192: for (i = 0; i < NR_OF_ROLES; i++) {
193: printf(" a %s", roles[i]);
194: if (i == 2)
195: printf(",\n\t");
196: else if (i < NR_OF_ROLES - 2)
197: printf(",");
198: else if (i == NR_OF_ROLES - 2)
199: printf(" or");
200: }
201: printf("? [%s] ", rolesyms);
202:
203: while ((pc = readchar()) != '\0') {
204: if (islower((unsigned char)pc))
205: pc = toupper((unsigned char)pc);
206: if ((i = role_index(pc)) >= 0) {
207: printf("%c\n", pc);
208: (void) fflush(stdout);
209: break;
210: }
211: if (pc == '\n')
212: break;
213: if (pc == '\004')
214:
215: end_of_input();
216: bell();
217: }
218: if (pc == '\n')
219: pc = 0;
220:
221: beginner:
222: if (!pc) {
223: printf("\nI'll choose a character for you.\n");
224: i = rn2(NR_OF_ROLES);
225: pc = rolesyms[i];
226: printf("This game you will be a%s %s.\n",
227: exper ? "n experienced" : "",
228: roles[i]);
229: getret();
230:
231: (void) putchar('\n');
232: (void) fflush(stdout);
233: }
234: #if 0
235:
236:
237:
238:
239: if (exper) {
240: roles[i][0] = pc;
241: }
242: #endif
243:
244: got_suffix:
245:
246: (void) strncpy(pl_character, roles[i], PL_CSIZ - 1);
247: pl_character[PL_CSIZ - 1] = 0;
248: flags.beginner = 1;
249: u = zerou;
250: u.usym = '@';
251: u.ulevel = 1;
252: init_uhunger();
253: #ifdef QUEST
254: u.uhorizon = 6;
255: #endif
256: uarm = uarm2 = uarmh = uarms = uarmg = uwep = uball = uchain =
257: uleft = uright = 0;
258:
259: switch (pc) {
260: case 'c':
261: case 'C':
262: Cave_man[2].trquan = 12 + rnd(9) * rnd(9);
263: u.uhp = u.uhpmax = 16;
264: u.ustr = u.ustrmax = 18;
265: ini_inv(Cave_man);
266: break;
267: case 't':
268: case 'T':
269: Tourist[3].trquan = 20 + rnd(20);
270: u.ugold = u.ugold0 = rnd(1000);
271: u.uhp = u.uhpmax = 10;
272: u.ustr = u.ustrmax = 8;
273: ini_inv(Tourist);
274: if (!rn2(25))
275: ini_inv(Tinopener);
276: break;
277: case 'w':
278: case 'W':
279: for (i = 1; i <= 4; i++)
280: if (!rn2(5))
281: Wizard[i].trquan += rn2(3) - 1;
282: u.uhp = u.uhpmax = 15;
283: u.ustr = u.ustrmax = 16;
284: ini_inv(Wizard);
285: break;
286: case 's':
287: case 'S':
288: Fast = INTRINSIC;
289: Stealth = INTRINSIC;
290: u.uhp = u.uhpmax = 12;
291: u.ustr = u.ustrmax = 10;
292: ini_inv(Speleologist);
293: if (!rn2(10))
294: ini_inv(Tinopener);
295: break;
296: case 'k':
297: case 'K':
298: u.uhp = u.uhpmax = 12;
299: u.ustr = u.ustrmax = 10;
300: ini_inv(Knight);
301: break;
302: case 'f':
303: case 'F':
304: u.uhp = u.uhpmax = 14;
305: u.ustr = u.ustrmax = 17;
306: ini_inv(Fighter);
307: break;
308: default:
309: u.uhp = u.uhpmax = 12;
310: u.ustr = u.ustrmax = 16;
311: }
312: find_ac();
313: if (!rn2(20)) {
314: int d = rn2(7) - 2;
315: u.ustr += d;
316: u.ustrmax += d;
317: }
318: #ifdef WIZARD
319: if (wizard)
320: wiz_inv();
321: #endif
322:
323:
324: while (inv_weight() > 0 && u.ustr < 118)
325: u.ustr++, u.ustrmax++;
326: }
327:
328: void
329: ini_inv(trop)
330: struct trobj *trop;
331: {
332: struct obj *obj;
333: while (trop->trolet) {
334: obj = mkobj(trop->trolet);
335: obj->known = trop->trknown;
336:
337: obj->cursed = 0;
338: if (obj->olet == WEAPON_SYM) {
339: obj->quan = trop->trquan;
340: trop->trquan = 1;
341: }
342: if (trop->trspe != UNDEF_SPE)
343: obj->spe = trop->trspe;
344: if (trop->trotyp != UNDEF_TYP)
345: obj->otyp = trop->trotyp;
346: else if (obj->otyp == WAN_WISHING)
347: obj->otyp = WAN_DEATH;
348: obj->owt = weight(obj);
349: obj = addinv(obj);
350: if (obj->olet == ARMOR_SYM) {
351: switch (obj->otyp) {
352: case SHIELD:
353: if (!uarms)
354: setworn(obj, W_ARMS);
355: break;
356: case HELMET:
357: if (!uarmh)
358: setworn(obj, W_ARMH);
359: break;
360: case PAIR_OF_GLOVES:
361: if (!uarmg)
362: setworn(obj, W_ARMG);
363: break;
364: case ELVEN_CLOAK:
365: if (!uarm2)
366: setworn(obj, W_ARM);
367: break;
368: default:
369: if (!uarm)
370: setworn(obj, W_ARM);
371: }
372: }
373: if (obj->olet == WEAPON_SYM)
374: if (!uwep)
375: setuwep(obj);
376: #ifndef PYRAMID_BUG
377: if (--trop->trquan)
378: continue;
379: #else
380: if (trop->trquan) {
381: --trop->trquan;
382: if (trop->trquan)
383: continue;
384: }
385: #endif
386: trop++;
387: }
388: }
389:
390: #ifdef WIZARD
391: void
392: wiz_inv()
393: {
394: struct trobj *trop = &Extra_objs[0];
395: char *ep = getenv("INVENT");
396: int type;
397: while (ep && *ep) {
398: type = atoi(ep);
399: ep = strchr(ep, ',');
400: if (ep)
401: while (*ep == ',' || *ep == ' ')
402: ep++;
403: if (type <= 0 || type > NROFOBJECTS)
404: continue;
405: trop->trotyp = type;
406: trop->trolet = objects[type].oc_olet;
407: trop->trspe = 4;
408: trop->trknown = 1;
409: trop->trquan = 1;
410: ini_inv(trop);
411: }
412:
413: trop->trotyp = WAN_WISHING;
414: trop->trolet = WAND_SYM;
415: trop->trspe = 20;
416: trop->trknown = 1;
417: trop->trquan = 1;
418: ini_inv(trop);
419: }
420: #endif
421:
422: void
423: plnamesuffix()
424: {
425: char *p;
426: if ((p = strrchr(plname, '-')) != NULL) {
427: *p = 0;
428: pl_character[0] = p[1];
429: pl_character[1] = 0;
430: if (!plname[0]) {
431: askname();
432: plnamesuffix();
433: }
434: }
435: }
436:
437: int
438: role_index(pc)
439: char pc;
440: {
441:
442: char *cp;
443:
444: if ((cp = strchr(rolesyms, pc)) != NULL)
445: return (cp - rolesyms);
446: return (-1);
447: }