1 /* NetHack 3.6 mplayer.c $NHDT-Date: 1432512774 2015/05/25 00:12:54 $ $NHDT-Branch: master $:$NHDT-Revision: 1.19 $ */
2 /* Copyright (c) Izchak Miller, 1992. */
3 /* NetHack may be freely redistributed. See license for details. */
7 STATIC_DCL const char *NDECL(dev_name);
8 STATIC_DCL void FDECL(get_mplname, (struct monst *, char *));
9 STATIC_DCL void FDECL(mk_mplayer_armor, (struct monst *, SHORT_P));
11 /* These are the names of those who
12 * contributed to the development of NetHack 3.2/3.3/3.4/3.6.
14 * Keep in alphabetical order within teams.
15 * Same first name is entered once within each team.
17 static const char *developers[] = {
19 "Dave", "Dean", "Eric", "Izchak", "Janet", "Jessie",
20 "Ken", "Kevin", "Michael", "Mike", "Pat", "Paul",
21 "Steve", "Timo", "Warwick",
23 "Bill", "Eric", "Keizo", "Ken", "Kevin", "Michael",
24 "Mike", "Paul", "Stephen", "Steve", "Timo", "Yitzhak",
26 "Andy", "Gregg", "Janne", "Keni", "Mike", "Olaf",
29 "Andy", "Chris", "Dean", "Jon", "Jonathan", "Kevin",
32 "Eric", "Marvin", "Warwick",
34 "Alex", "Dion", "Michael",
36 "Helge", "Ron", "Timo",
41 /* return a randomly chosen developer name */
42 STATIC_OVL const char *
45 register int i, m = 0, n = SIZE(developers);
46 register struct monst *mtmp;
47 register boolean match;
52 for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) {
53 if (!is_mplayer(mtmp->data))
55 if (!strncmp(developers[i], (has_mname(mtmp)) ? MNAME(mtmp) : "",
56 strlen(developers[i]))) {
62 } while (match && m < 100); /* m for insurance */
65 return (const char *) 0;
66 return (developers[i]);
70 get_mplname(mtmp, nam)
71 register struct monst *mtmp;
74 boolean fmlkind = is_female(mtmp->data);
77 char tmp_nam[PL_NSIZ];
82 Strcpy(nam, fmlkind ? "Eve" : "Adam");
83 else if (fmlkind && !!strcmp(devnam, "Janet"))
84 Strcpy(nam, rn2(2) ? "Maud" : "Eve");
88 if (fmlkind || !strcmp(nam, "Janet"))
94 Strcat(nam, rank_of((int) mtmp->m_lev, monsndx(mtmp->data),
95 (boolean) mtmp->female));
96 #else /*
\8fÌ
\8d\86\82ð
\91O
\82É
\95t
\82¯
\82½
\82¢
\82Ì
\82Åtmp_nam
\82É
\88ê
\92U
\8d\
\92z
\82µ
\82Änam
\82É
\96ß
\82·*/
97 Strcpy(tmp_nam, rank_of((int) mtmp->m_lev, monsndx(mtmp->data),
98 (boolean)mtmp->female));
99 Strcat(tmp_nam, "
\82Ì");
100 Strcat(tmp_nam, nam);
101 Strcpy(nam, tmp_nam);
106 mk_mplayer_armor(mon, typ)
112 if (typ == STRANGE_OBJECT)
114 obj = mksobj(typ, FALSE, FALSE);
116 obj->oerodeproof = 1;
121 /* Most players who get to the endgame who have cursed equipment
122 * have it because the wizard or other monsters cursed it, so its
123 * chances of having plusses is the same as usual....
125 obj->spe = rn2(10) ? (rn2(3) ? rn2(5) : rn1(4, 4)) : -rnd(3);
126 (void) mpickobj(mon, obj);
130 mk_mplayer(ptr, x, y, special)
131 register struct permonst *ptr;
133 register boolean special;
135 register struct monst *mtmp;
138 if (!is_mplayer(ptr))
139 return ((struct monst *) 0);
142 (void) rloc(m_at(x, y), FALSE); /* insurance */
144 if (!In_endgame(&u.uz))
147 if ((mtmp = makemon(ptr, x, y, NO_MM_FLAGS)) != 0) {
148 short weapon = rn2(2) ? LONG_SWORD : rnd_class(SPEAR, BULLWHIP);
150 rnd_class(GRAY_DRAGON_SCALE_MAIL, YELLOW_DRAGON_SCALE_MAIL);
151 short cloak = !rn2(8)
153 : rnd_class(OILSKIN_CLOAK, CLOAK_OF_DISPLACEMENT);
154 short helm = !rn2(8) ? STRANGE_OBJECT : rnd_class(ELVEN_LEATHER_HELM,
156 short shield = !rn2(8)
158 : rnd_class(ELVEN_SHIELD, SHIELD_OF_REFLECTION);
162 mtmp->m_lev = (special ? rn1(16, 15) : rnd(16));
163 mtmp->mhp = mtmp->mhpmax =
164 d((int) mtmp->m_lev, 10) + (special ? (30 + rnd(30)) : 30);
166 get_mplname(mtmp, nam);
167 mtmp = christen_monst(mtmp, nam);
168 /* that's why they are "stuck" in the endgame :-) */
169 (void) mongets(mtmp, FAKE_AMULET_OF_YENDOR);
172 set_malign(mtmp); /* peaceful may have changed again */
174 switch (monsndx(ptr)) {
175 case PM_ARCHEOLOGIST:
181 weapon = rn2(2) ? TWO_HANDED_SWORD : BATTLE_AXE;
182 shield = STRANGE_OBJECT;
185 armor = rnd_class(PLATE_MAIL, CHAIN_MAIL);
186 if (helm == HELM_OF_BRILLIANCE)
187 helm = STRANGE_OBJECT;
195 if (helm == HELM_OF_BRILLIANCE)
196 helm = STRANGE_OBJECT;
200 weapon = QUARTERSTAFF;
202 weapon = rn2(2) ? UNICORN_HORN : SCALPEL;
204 helm = rn2(2) ? HELM_OF_BRILLIANCE : HELM_OF_TELEPATHY;
206 shield = STRANGE_OBJECT;
212 armor = rnd_class(PLATE_MAIL, CHAIN_MAIL);
215 weapon = !rn2(3) ? SHURIKEN : STRANGE_OBJECT;
216 armor = STRANGE_OBJECT;
219 shield = STRANGE_OBJECT;
226 armor = rnd_class(PLATE_MAIL, CHAIN_MAIL);
230 helm = rn2(2) ? HELM_OF_BRILLIANCE : HELM_OF_TELEPATHY;
232 shield = STRANGE_OBJECT;
236 weapon = ELVEN_DAGGER;
240 weapon = rn2(2) ? SHORT_SWORD : ORCISH_DAGGER;
247 /* Defaults are just fine */
253 armor = rnd_class(PLATE_MAIL, CHAIN_MAIL);
257 weapon = rn2(2) ? QUARTERSTAFF : ATHAME;
259 armor = rn2(2) ? BLACK_DRAGON_SCALE_MAIL
260 : SILVER_DRAGON_SCALE_MAIL;
261 cloak = CLOAK_OF_MAGIC_RESISTANCE;
264 helm = HELM_OF_BRILLIANCE;
265 shield = STRANGE_OBJECT;
268 impossible("bad mplayer monster");
273 if (weapon != STRANGE_OBJECT) {
274 otmp = mksobj(weapon, TRUE, FALSE);
275 otmp->spe = (special ? rn1(5, 4) : rn2(4));
277 otmp->oerodeproof = 1;
280 if (special && rn2(2))
281 otmp = mk_artifact(otmp, A_NONE);
282 /* usually increase stack size if stackable weapon */
283 if (objects[otmp->otyp].oc_merge && !otmp->oartifact)
284 otmp->quan += (long) rn2(is_spear(otmp) ? 4 : 8);
285 /* mplayers knew better than to overenchant Magicbane */
286 if (otmp->oartifact == ART_MAGICBANE)
288 (void) mpickobj(mtmp, otmp);
293 (void) mongets(mtmp, rn2(3) ? LUCKSTONE : LOADSTONE);
294 mk_mplayer_armor(mtmp, armor);
295 mk_mplayer_armor(mtmp, cloak);
296 mk_mplayer_armor(mtmp, helm);
297 mk_mplayer_armor(mtmp, shield);
300 mtmp, rnd_class(LEATHER_GLOVES, GAUNTLETS_OF_DEXTERITY));
302 mk_mplayer_armor(mtmp,
303 rnd_class(LOW_BOOTS, LEVITATION_BOOTS));
304 m_dowear(mtmp, TRUE);
306 quan = rn2(3) ? rn2(3) : rn2(16);
308 (void) mongets(mtmp, rnd_class(DILITHIUM_CRYSTAL, JADE));
309 /* To get the gold "right" would mean a player can double his */
310 /* gold supply by killing one mplayer. Not good. */
311 mkmonmoney(mtmp, rn2(1000));
314 (void) mpickobj(mtmp, mkobj(RANDOM_CLASS, FALSE));
318 (void) mongets(mtmp, rnd_offensive_item(mtmp));
321 (void) mongets(mtmp, rnd_defensive_item(mtmp));
324 (void) mongets(mtmp, rnd_misc_item(mtmp));
330 /* create the indicated number (num) of monster-players,
331 * randomly chosen, and in randomly chosen (free) locations
332 * on the level. If "special", the size of num should not
333 * be bigger than the number of _non-repeated_ names in the
334 * developers array, otherwise a bunch of Adams and Eves will
335 * fill up the overflow.
338 create_mplayers(num, special)
343 struct monst fakemon;
348 /* roll for character class */
349 pm = PM_ARCHEOLOGIST + rn2(PM_WIZARD - PM_ARCHEOLOGIST + 1);
350 fakemon.data = &mons[pm];
352 /* roll for an available location */
354 x = rn1(COLNO - 4, 2);
356 } while (!goodpos(x, y, &fakemon, 0) && tryct++ <= 50);
358 /* if pos not found in 50 tries, don't bother to continue */
362 (void) mk_mplayer(&mons[pm], (xchar) x, (xchar) y, special);
369 register struct monst *mtmp;
372 static const char *same_class_msg[3] =
374 "I can't win, and neither will you!", "You don't deserve to win!",
375 "Mine should be the honor, not yours!",
377 *other_class_msg[3] = {
378 "The low-life wants to talk, eh?", "Fight, scum!",
379 "Here is what I have to say!",
382 static const char *same_class_msg[2][3] = {
384 "
\8e\84\82Å
\82·
\82ç
\92B
\90¬
\82Å
\82«
\82È
\82¢
\82Ì
\82É
\81C
\82¨
\91O
\82É
\92B
\90¬
\82Å
\82«
\82é
\82Ì
\82©
\81H",
385 "
\82¨
\91O
\82ª
\90¬
\8c÷
\82·
\82é
\82È
\82ñ
\82Ä
\82±
\82Æ
\82Í
\82È
\82¢
\82È
\81D",
386 "
\96¼
\97_
\82ð
\89ä
\82É
\81I
\82¨
\91O
\82¶
\82á
\82È
\82¢
\81I",
389 "
\8e\84\82Å
\82·
\82ç
\92B
\90¬
\82Å
\82«
\82È
\82¢
\82Ì
\82É
\81C
\82 \82È
\82½
\82É
\92B
\90¬
\82Å
\82«
\82Ä
\81H",
390 "
\82 \82È
\82½
\82ª
\90¬
\8c÷
\82·
\82é
\82È
\82ñ
\82Ä
\82 \82è
\82¦
\82Ü
\82¹
\82ñ
\82í
\81D",
391 "
\96¼
\97_
\82Í
\8e\84\82É
\81I
\82 \82È
\82½
\82É
\82È
\82ñ
\82Ä
\82Æ
\82ñ
\82Å
\82à
\82È
\82¢
\81D",
394 *other_class_msg[2][3] = {
396 "
\89º
\8fO
\82ª
\98b
\82µ
\82©
\82¯
\82é
\82©
\81H
\82Í
\82Í
\81[
\82ñ
\81H",
397 "
\90í
\82¦
\81I
\82±
\82Ì
\96ì
\98Y
\81I",
398 "
\82¨
\91O
\82Æ
\98b
\82·
\82±
\82Æ
\82È
\82Ç
\82È
\82É
\82à
\82È
\82¢
\81I",
401 "
\8e\84\82Æ
\98b
\82µ
\82½
\82¢
\82Å
\82·
\82Á
\82Ä
\81H",
402 "
\8c\95\82ð
\8eæ
\82è
\82È
\82³
\82¢
\81I",
403 "
\82 \82È
\82½
\82Æ
\98b
\82·
\82±
\82Æ
\82È
\82Ç
\82 \82è
\82Ü
\82¹
\82ñ
\82í
\81I",
410 return; /* will drop to humanoid talk */
413 pline("Talk? -- %s", (mtmp->data == &mons[urole.malenum]
414 || mtmp->data == &mons[urole.femalenum])
415 ? same_class_msg[rn2(3)]
416 : other_class_msg[rn2(3)]);
418 female = (mtmp->female ? 1 : 0);
419 pline("
\98b
\82·
\81H -- %s", (mtmp->data == &mons[urole.malenum]
420 || mtmp->data == &mons[urole.femalenum])
421 ? same_class_msg[female][rn2(3)]
422 : other_class_msg[female][rn2(3)]);