1 /* NetHack 3.6 role.c $NHDT-Date: 1446861770 2015/11/07 02:02:50 $ $NHDT-Branch: master $:$NHDT-Revision: 1.34 $ */
2 /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985-1999. */
3 /* NetHack may be freely redistributed. See license for details. */
5 /* JNetHack Copyright */
6 /* (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 */
7 /* For 3.4-, Copyright (c) SHIRAKATA Kentaro, 2002-2016 */
8 /* JNetHack may be freely redistributed. See license for details. */
12 /*** Table of all roles ***/
13 /* According to AD&D, HD for some classes (ex. Wizard) should be smaller
14 * (4-sided for wizards). But this is not AD&D, and using the AD&D
15 * rule here produces an unplayable character. Thus I have used a minimum
16 * of an 10-sided hit die for everything. Another AD&D change: wizards get
17 * a minimum strength of 4 since without one you can't teleport or cast
20 * As the wizard has been updated (wizard patch 5 jun '96) their HD can be
21 * brought closer into line with AD&D. This forces wizards to use magic more
22 * and distance themselves from their attackers. --LSZ
24 * With the introduction of races, some hit points and energy
25 * has been reallocated for each race. The values assigned
26 * to the roles has been reduced by the amount allocated to
29 * God names use a leading underscore to flag goddesses.
31 const struct Role roles[] = {
33 { { "Archeologist", 0 },
35 { "Field Worker", 0 },
36 { "Investigator", 0 },
40 { "Speleologist", 0 },
43 "Quetzalcoatl", "Camaxtli", "Huhetotl", /* Central American */
45 { { "
\8dl
\8cÃ
\8aw
\8eÒ", 0 },
47 { "
\98J
\93
\8eÒ", 0 },
48 { "
\92²
\8d¸
\8eÒ", 0 },
49 { "
\94
\8c@
\8eÒ", 0 },
50 { "
\8c@
\8dí
\8eÒ", 0 },
51 { "
\92T
\8c\9f\8eÒ", 0 },
52 { "
\93´
\8cA
\8aw
\8eÒ", 0 },
53 { "
\94ü
\8fp
\8eû
\8fW
\8eÒ", 0 },
55 "
\83P
\83c
\83A
\83\8b\83J
\83g
\83\8b", "
\83J
\83}
\83L
\83V
\83g
\83\8a", "
\83t
\83w
\83g
\83g
\83\8b", /* Central American */
59 "the College of Archeology",
60 "the Tomb of the Toltec Kings",
62 "
\8dl
\8cÃ
\8aw
\91å
\8aw",
63 "
\83g
\83\8b\83e
\83J
\89¤
\89Æ
\82Ì
\95æ",
70 PM_MINION_OF_HUHETOTL,
76 MH_HUMAN | MH_DWARF | MH_GNOME | ROLE_MALE | ROLE_FEMALE | ROLE_LAWFUL
78 /* Str Int Wis Dex Con Cha */
79 { 7, 10, 10, 7, 7, 7 },
80 { 20, 20, 20, 10, 20, 10 },
81 /* Init Lower Higher */
82 { 11, 0, 0, 8, 1, 0 }, /* Hit points */
95 { { "Plunderer", "Plunderess" },
102 { "Chieftain", "Chieftainess" },
103 { "Conqueror", "Conqueress" } },
104 "Mitra", "Crom", "Set", /* Hyborian */
106 { { "
\96ì
\94Ø
\90l", 0 },
107 { { "
\93\90\91¯", 0 },
108 { "
\97ª
\92D
\8eÒ", 0 },
111 { "
\90N
\97ª
\8eÒ", 0 },
113 { "
\8eE
\9dC
\8eÒ", 0 },
115 { "
\90ª
\95\9e\8eÒ", 0 } },
116 "
\83~
\83g
\83\89", "
\83N
\83\8d\83\80", "
\83Z
\83g", /* Hyborian */
120 "the Camp of the Duali Tribe",
123 "
\83f
\83\85\83A
\83\8a\91°
\82Ì
\83L
\83\83\83\93\83v",
124 "
\83f
\83\85\83A
\83\8a\91°
\82Ì
\83I
\83A
\83V
\83X",
136 ART_HEART_OF_AHRIMAN,
137 MH_HUMAN | MH_ORC | ROLE_MALE | ROLE_FEMALE | ROLE_NEUTRAL
139 /* Str Int Wis Dex Con Cha */
140 { 16, 7, 7, 15, 16, 6 },
141 { 30, 6, 7, 20, 30, 7 },
142 /* Init Lower Higher */
143 { 14, 0, 0, 10, 2, 0 }, /* Hit points */
144 { 1, 0, 0, 1, 0, 1 },
155 { { "Caveman", "Cavewoman" },
156 { { "Troglodyte", 0 },
165 "Anu", "_Ishtar", "Anshar", /* Babylonian */
167 { { "
\93´
\8cA
\90l", 0 },
168 { { "
\8c\8a\8b\8f\90l", 0 },
169 { "
\8c´
\8fZ
\96¯", 0 },
170 { "
\95ú
\98Q
\8eÒ", 0 },
171 { "
\95\82\98Q
\8eÒ", 0 },
172 { "
\97·
\8ds
\8eÒ", 0 },
173 { "
\95ú
\97V
\8eÒ", 0 },
174 { "
\97V
\96q
\96¯", 0 },
175 { "
\97¬
\98Q
\8eÒ", 0 },
176 { "
\90æ
\8bì
\8eÒ", 0 } },
177 "
\83A
\83k", "_
\83C
\83V
\83\85\83^
\83\8b", "
\83A
\83\93\83V
\83\83\83\8b", /* Babylonian */
181 "the Caves of the Ancestors",
184 "
\91¾
\8cÃ
\82Ì
\93´
\8cA",
185 "
\97³
\82Ì
\89B
\82ê
\89Æ",
197 ART_SCEPTRE_OF_MIGHT,
198 MH_HUMAN | MH_DWARF | MH_GNOME | ROLE_MALE | ROLE_FEMALE | ROLE_LAWFUL
200 /* Str Int Wis Dex Con Cha */
201 { 10, 7, 7, 7, 8, 6 },
202 { 30, 6, 7, 20, 30, 7 },
203 /* Init Lower Higher */
204 { 14, 0, 0, 8, 2, 0 }, /* Hit points */
205 { 1, 0, 0, 1, 0, 1 },
217 { { "Rhizotomist", 0 },
221 { "Medicus ossium", "Medica ossium" },
223 { "Magister", "Magistra" },
225 { "Chirurgeon", 0 } },
226 "_Athena", "Hermes", "Poseidon", /* Greek */
229 { { "
\8c©
\8fK
\82¢", 0 },
230 { "
\88ã
\8et
\8c©
\8fK
\82¢", 0 },
231 { "
\8aÅ
\8cì
\8et", "
\8aÅ
\8cì
\95w" },
232 { "
\88ã
\8et
\8f\95\8eè", 0 },
233 { "
\96ò
\95¨
\8eå
\94C", 0 },
234 { "
\8a¿
\95û
\88ã", 0 },
235 { "
\88ã
\8et
\8eå
\94C", 0 },
236 { "
\93à
\89È
\88ã", 0 },
237 { "
\8aO
\89È
\88ã", 0 } },
238 "_
\83A
\83e
\83i", "
\83w
\83\8b\83\81\83X", "
\83|
\83Z
\83C
\83h
\83\93", /* Greek */
242 "the Temple of Epidaurus",
243 "the Temple of Coeus",
245 "
\83G
\83s
\83_
\83E
\83\8d\83X
\8e\9b\89@",
246 "
\83R
\83C
\83I
\83X
\8e\9b\89@",
258 ART_STAFF_OF_AESCULAPIUS,
259 MH_HUMAN | MH_GNOME | ROLE_MALE | ROLE_FEMALE | ROLE_NEUTRAL,
260 /* Str Int Wis Dex Con Cha */
261 { 7, 7, 13, 7, 11, 16 },
262 { 15, 20, 20, 15, 25, 5 },
263 /* Init Lower Higher */
264 { 11, 0, 0, 8, 1, 0 }, /* Hit points */
265 { 1, 4, 0, 1, 0, 2 },
283 { "Chevalier", "Chevaliere" },
284 { "Seignieur", "Dame" },
286 "Lugh", "_Brigit", "Manannan Mac Lir", /* Celtic */
289 { { "
\8c©
\8fK
\82¢", 0 },
293 { "
\8fd
\90í
\8em", 0 },
295 { "
\8fd
\8bR
\8em", 0 },
296 { "
\8cM
\8bR
\8em", 0 },
297 { "
\90¹
\8bR
\8em", 0 } },
298 "
\83\8b\81[
\83t", "_
\83u
\83\8a\83W
\83b
\83g", "
\83}
\83i
\83\93\83i
\83\93\81E
\83}
\83N
\83\8a\81[
\83\8b", /* Celtic */
305 "
\83L
\83\83\83\81\83\8d\83b
\83g
\8fé",
306 "
\83K
\83\89\83X
\82Ì
\93\87",
318 ART_MAGIC_MIRROR_OF_MERLIN,
319 MH_HUMAN | ROLE_MALE | ROLE_FEMALE | ROLE_LAWFUL,
320 /* Str Int Wis Dex Con Cha */
321 { 13, 7, 14, 8, 10, 17 },
322 { 30, 15, 15, 10, 20, 10 },
323 /* Init Lower Higher */
324 { 14, 0, 0, 8, 2, 0 }, /* Hit points */
325 { 1, 4, 0, 1, 0, 2 },
337 { { "Candidate", 0 },
340 { "Student of Stones", 0 },
341 { "Student of Waters", 0 },
342 { "Student of Metals", 0 },
343 { "Student of Winds", 0 },
344 { "Student of Fire", 0 },
346 "Shan Lai Ching", "Chih Sung-tzu", "Huan Ti", /* Chinese */
348 { { "
\95\90\93¬
\89Æ", 0 },
349 { { "
\93ü
\96å
\8aó
\96]
\8eÒ", 0 },
350 { "
\8f\89\90S
\8eÒ", 0 },
351 { "
\93ü
\96å
\8eÒ
\93`", 0 },
352 { "
\93y
\82Ì
\8fK
\82¢
\8eè", 0 },
353 { "
\90\85\82Ì
\8fK
\82¢
\8eè", 0 },
354 { "
\8bà
\82Ì
\8fK
\82¢
\8eè", 0 },
355 { "
\96Ø
\82Ì
\8fK
\82¢
\8eè", 0 },
356 { "
\89Î
\82Ì
\8fK
\82¢
\8eè", 0 },
357 { "
\96Æ
\8b\96\8aF
\93`", 0 } },
358 "
\8eR
\97\8b\90¸", "
\90Ô
\8f¼
\8eq", "
\89©
\92é", /* Chinese */
362 "the Monastery of Chan-Sune",
363 "the Monastery of the Earth-Lord",
365 "
\83`
\83\83\83\93\81E
\83X
\81[
\8fC
\93¹
\89@",
366 "
\92n
\89¤
\82Ì
\8fC
\93¹
\89@",
378 ART_EYES_OF_THE_OVERWORLD,
379 MH_HUMAN | ROLE_MALE | ROLE_FEMALE | ROLE_LAWFUL | ROLE_NEUTRAL
381 /* Str Int Wis Dex Con Cha */
382 { 10, 7, 8, 8, 7, 7 },
383 { 25, 10, 20, 20, 15, 10 },
384 /* Init Lower Higher */
385 { 12, 0, 0, 8, 1, 0 }, /* Hit points */
386 { 2, 2, 0, 2, 0, 2 },
397 { { "Priest", "Priestess" },
401 { "Priest", "Priestess" },
403 { "Canon", "Canoness" },
405 { "Patriarch", "Matriarch" },
406 { "High Priest", "High Priestess" } },
407 0, 0, 0, /* deities from a randomly chosen other role will be used */
409 { { "
\91m
\97µ", "
\93ò
\91m" },
410 { { "
\8fC
\93¹
\8eÒ", "
\8fC
\93¹
\8f\97" },
413 { "
\91m
\97µ", "
\93ò
\91m" },
414 { "
\8f\95\94C
\8ei
\8dÕ", 0 },
415 { "
\90¹
\8eÒ", "
\90¹
\8f\97" },
417 { "
\91å
\8ei
\8b³", 0 },
418 { "
\91å
\91m
\8fã", 0 } },
419 0, 0, 0, /* deities from a randomly chosen other role will be used */
424 "the Temple of Nalzok",
426 "
\88Ì
\91å
\82È
\82é
\8e\9b\89@",
427 "
\83i
\83\8b\83]
\83N
\8e\9b\89@",
439 ART_MITRE_OF_HOLINESS,
440 MH_HUMAN | MH_ELF | ROLE_MALE | ROLE_FEMALE | ROLE_LAWFUL | ROLE_NEUTRAL
442 /* Str Int Wis Dex Con Cha */
443 { 7, 7, 10, 7, 7, 7 },
444 { 15, 10, 30, 15, 20, 10 },
445 /* Init Lower Higher */
446 { 12, 0, 0, 8, 1, 0 }, /* Hit points */
447 { 4, 3, 0, 2, 0, 2 },
457 /* Note: Rogue precedes Ranger so that use of `-R' on the command line
458 retains its traditional meaning. */
468 { "Magsman", "Magswoman" },
470 "Issek", "Mog", "Kos", /* Nehwon */
472 { { "
\93\90\91¯", 0 },
473 { { "
\92Ç
\82¢
\82Í
\82¬", 0 },
474 { "
\82Ð
\82Á
\82½
\82
\82è", 0 },
476 { "
\82²
\82ë
\82Â
\82«", 0 },
477 { "
\82±
\82»
\82Ç
\82ë", 0 },
481 { "
\91å
\93D
\96_", 0 } },
482 "
\83C
\83Z
\83b
\83N", "
\83\82\83O", "
\83R
\83X", /* Nehwon */
486 "the Thieves' Guild Hall",
487 "the Assassins' Guild Hall",
489 "
\93\90\91¯
\83M
\83\8b\83h",
490 "
\88Ã
\8eE
\8eÒ
\83M
\83\8b\83h",
495 PM_MASTER_OF_THIEVES,
502 ART_MASTER_KEY_OF_THIEVERY,
503 MH_HUMAN | MH_ORC | ROLE_MALE | ROLE_FEMALE | ROLE_CHAOTIC,
504 /* Str Int Wis Dex Con Cha */
505 { 7, 7, 7, 10, 7, 6 },
506 { 20, 10, 10, 30, 20, 10 },
507 /* Init Lower Higher */
508 { 10, 0, 0, 8, 1, 0 }, /* Hit points */
509 { 1, 0, 0, 1, 0, 1 },
524 {"Edhel", "Elleth"}, /* elf-maid */
525 {"Ohtar", "Ohtie"}, /* warrior */
526 {"Kano", "Kanie"}, /* commander (Q.) ['a] educated guess,
527 until further research- SAC */
528 {"Arandur"," Aranduriel"}, /* king's servant, minister (Q.) - guess */
529 {"Hir", "Hiril"}, /* lord, lady (S.) ['ir] */
530 {"Aredhel", "Arwen"}, /* noble elf, maiden (S.) */
531 {"Ernil", "Elentariel"}, /* prince (S.), elf-maiden (Q.) */
532 {"Elentar", "Elentari"}, /* Star-king, -queen (Q.) */
533 "Solonor Thelandira", "Aerdrie Faenya", "Lolth", /* Elven */
537 { "Trailblazer", 0 },
538 { "Reconnoiterer", "Reconnoiteress" },
540 { "Arbalester", 0 }, /* One skilled at crossbows */
542 { "Sharpshooter", 0 },
543 { "Marksman", "Markswoman" } },
544 "Mercury", "_Venus", "Mars", /* Roman/planets */
546 { { "
\83\8c\83\93\83W
\83\83\81[", 0 },
548 { "
\8c©
\92£
\82è", 0 },
552 { "
\8b|
\95º", 0 }, /* One skilled at crossbows */
553 { "
\92\86\8b\89\8b|
\95º", 0 },
554 { "
\8fã
\8b\89\8b|
\95º", 0 },
555 { "
\8fã
\8b\89\8b|
\95º", 0 } },
556 "
\83}
\81[
\83L
\83\85\83\8a\81[", "_
\83r
\81[
\83i
\83X", "
\83}
\81[
\83Y", /* Roman/planets */
561 "the cave of the wumpus",
563 "
\83I
\83\8a\83I
\83\93\82Ì
\83L
\83\83\83\93\83v",
564 "
\83\8f\83\93\83p
\83X
\82Ì
\93´
\8cA",
568 PM_LITTLE_DOG /* Orion & canis major */,
576 ART_LONGBOW_OF_DIANA,
577 MH_HUMAN | MH_ELF | MH_GNOME | MH_ORC | ROLE_MALE | ROLE_FEMALE
578 | ROLE_NEUTRAL | ROLE_CHAOTIC,
579 /* Str Int Wis Dex Con Cha */
580 { 13, 13, 13, 9, 13, 7 },
581 { 30, 10, 10, 20, 20, 10 },
582 /* Init Lower Higher */
583 { 13, 0, 0, 6, 1, 0 }, /* Hit points */
584 { 1, 0, 0, 1, 0, 1 },
596 { { "Hatamoto", 0 }, /* Banner Knight */
597 { "Ronin", 0 }, /* no allegiance */
598 { "Ninja", "Kunoichi" }, /* secret society */
599 { "Joshu", 0 }, /* heads a castle */
600 { "Ryoshu", 0 }, /* has a territory */
601 { "Kokushu", 0 }, /* heads a province */
602 { "Daimyo", 0 }, /* a samurai lord */
603 { "Kuge", 0 }, /* Noble of the Court */
604 { "Shogun", 0 } }, /* supreme commander, warlord */
605 "_Amaterasu Omikami", "Raijin", "Susanowo", /* Japanese */
608 { { "
\8aø
\96{", 0 }, /* Banner Knight */
609 { "
\98Q
\90l", 0 }, /* no allegiance */
610 { "
\94E
\8eÒ", "
\82
\83m
\88ê" }, /* secret society */
611 { "
\8fé
\8eå", 0 }, /* heads a castle */
612 { "
\97Ì
\8eå", 0 }, /* has a territory */
613 { "
\97Ì
\8eå", 0 }, /* heads a province */
614 { "
\91å
\96¼", "
\8d\98\8c³" }, /* a samurai lord */
615 { "
\8cö
\89Æ", 0 }, /* Noble of the Court */
616 { "
\8cö
\89Æ", "
\91å
\89\9c" } }, /* supreme commander, warlord */
617 "_
\93V
\8fÆ
\91å
\90_", "
\97\8b\90_", "
\90{
\8d²
\94V
\92j", /* Japanese */
621 "the Castle of the Taro Clan",
622 "the Shogun's Castle",
624 "
\91¾
\98Y
\88ê
\91°
\82Ì
\8fé",
637 ART_TSURUGI_OF_MURAMASA,
638 MH_HUMAN | ROLE_MALE | ROLE_FEMALE | ROLE_LAWFUL,
639 /* Str Int Wis Dex Con Cha */
640 { 10, 8, 7, 10, 17, 6 },
641 { 30, 10, 8, 30, 14, 8 },
642 /* Init Lower Higher */
643 { 13, 0, 0, 8, 1, 0 }, /* Hit points */
644 { 1, 0, 0, 1, 0, 1 },
658 { "Excursionist", 0 },
659 { "Peregrinator", "Peregrinatrix" },
664 { "Adventurer", 0 } },
665 "Blind Io", "_The Lady", "Offler", /* Discworld */
667 { { "
\8aÏ
\8cõ
\8bq", 0 },
668 { { "
\83v
\81[
\91¾
\98Y", "
\83v
\81[
\8eq" },
669 { "
\8aÏ
\8cõ
\8bq", 0 },
670 { "
\8eü
\97V
\97·
\8ds
\8eÒ", 0 },
671 { "
\95Õ
\97ð
\8eÒ", 0 },
672 { "
\97·
\8ds
\8eÒ", 0 },
674 { "
\8dq
\8aC
\8eÒ", 0 },
675 { "
\92T
\8c\9f\89Æ", 0 },
676 { "
\96`
\8c¯
\8eÒ", 0 } },
677 "
\96Ó
\96Ú
\82Ì
\83C
\83I", "_
\81\83\8f\97\90_
\81\84", "
\83I
\83t
\83\89\81[", /* Discworld */
682 "the Thieves' Guild Hall",
684 "
\83A
\83\93\83N
\83\82\83\8b\83|
\81[
\83N",
685 "
\93\90\91¯
\83M
\83\8b\83h",
692 PM_MASTER_OF_THIEVES,
697 ART_YENDORIAN_EXPRESS_CARD,
698 MH_HUMAN | ROLE_MALE | ROLE_FEMALE | ROLE_NEUTRAL,
699 /* Str Int Wis Dex Con Cha */
700 { 7, 10, 6, 7, 7, 10 },
701 { 15, 10, 10, 15, 30, 20 },
702 /* Init Lower Higher */
703 { 8, 0, 0, 8, 0, 0 }, /* Hit points */
704 { 1, 0, 0, 1, 0, 1 },
716 { { "Stripling", 0 },
719 { "Man-at-arms", "Woman-at-arms" },
721 { "Swashbuckler", 0 },
722 { "Hero", "Heroine" },
724 { "Lord", "Lady" } },
725 "Tyr", "Odin", "Loki", /* Norse */
727 { { "
\83\8f\83\8b\83L
\83\85\81[
\83\8c", 0 },
728 { { "
\8c©
\8fK
\82¢", 0 },
732 { "
\90í
\93¬
\95º", 0 },
733 { "
\8dU
\8c\82\95º", 0 },
735 { "
\90æ
\93±
\8eÒ", 0 },
736 { "
\83\8d\81[
\83h", "
\83\8c\83f
\83B" } },
737 "
\83`
\83\85\81[
\83\8b", "
\83I
\81[
\83f
\83B
\83\93", "
\83\8d\83L", /* Norse */
741 "the Shrine of Destiny",
742 "the cave of Surtur",
744 "
\89^
\96½
\82Ì
\90¹
\93°",
745 "
\83X
\83\8b\83g
\82Ì
\93´
\8cA",
749 NON_PM /*PM_WINTER_WOLF_CUB*/,
758 MH_HUMAN | MH_DWARF | ROLE_FEMALE | ROLE_LAWFUL | ROLE_NEUTRAL,
759 /* Str Int Wis Dex Con Cha */
760 { 10, 7, 7, 7, 10, 7 },
761 { 30, 6, 7, 20, 30, 7 },
762 /* Init Lower Higher */
763 { 14, 0, 0, 8, 2, 0 }, /* Hit points */
764 { 1, 0, 0, 1, 0, 1 },
778 { "Thaumaturge", 0 },
780 { "Enchanter", "Enchantress" },
781 { "Sorcerer", "Sorceress" },
782 { "Necromancer", 0 },
785 "Ptah", "Thoth", "Anhur", /* Egyptian */
787 { { "
\96\82\96@
\8eg
\82¢", 0 },
788 { { "
\8eè
\95i
\8et", 0 },
789 { "
\8aï
\8fp
\8et", 0 },
790 { "
\90è
\82¢
\8et", 0 },
791 { "
\97ì
\8a´
\8et", 0 },
792 { "
\8f¢
\8a«
\8et", 0 },
793 { "
\97d
\8fp
\8et", 0 },
794 { "
\96\82\8fp
\8et", 0 },
795 { "
\96\82\96@
\8eg
\82¢", 0 },
796 { "
\91å
\96\82\96@
\8eg
\82¢", 0 } },
797 "
\83v
\83^
\83n", "
\83g
\81[
\83g", "
\83A
\83\93\83t
\83\8b", /* Egyptian */
802 "the Tower of Darkness",
804 "
\8cÇ
\8d\82\82Ì
\93\83",
805 "
\88Ã
\8d\95\82Ì
\93\83",
810 PM_NEFERET_THE_GREEN,
817 ART_EYE_OF_THE_AETHIOPICA,
818 MH_HUMAN | MH_ELF | MH_GNOME | MH_ORC | ROLE_MALE | ROLE_FEMALE
819 | ROLE_NEUTRAL | ROLE_CHAOTIC,
820 /* Str Int Wis Dex Con Cha */
821 { 7, 10, 7, 7, 7, 7 },
822 { 10, 30, 10, 20, 20, 10 },
823 /* Init Lower Higher */
824 { 10, 0, 0, 8, 1, 0 }, /* Hit points */
825 { 4, 3, 0, 2, 0, 3 },
835 /* Array terminator */
839 /* The player's role, created at runtime from initial
840 * choices. This may be munged in role_init().
842 struct Role urole = {
844 { { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
845 { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 } },
847 "Xxx", "home", "locate",
848 NON_PM, NON_PM, NON_PM, NON_PM, NON_PM, NON_PM, NON_PM, NON_PM,
850 /* Str Int Wis Dex Con Cha */
851 { 7, 7, 7, 7, 7, 7 },
852 { 20, 15, 15, 20, 20, 10 },
853 /* Init Lower Higher */
854 { 10, 0, 0, 8, 1, 0 }, /* Hit points */
855 { 2, 0, 0, 2, 0, 3 },
867 /* Table of all races */
868 const struct Race races[] = {
883 { "
\92j", "
\8f\97" },
889 MH_HUMAN | ROLE_MALE | ROLE_FEMALE | ROLE_LAWFUL | ROLE_NEUTRAL
894 /* Str Int Wis Dex Con Cha */
895 { 3, 3, 3, 3, 3, 3 },
896 { STR18(100), 18, 18, 18, 18, 18 },
897 /* Init Lower Higher */
898 { 2, 0, 0, 2, 1, 0 }, /* Hit points */
899 { 1, 0, 2, 0, 2, 0 } /* Energy */
908 "
\83G
\83\8b\83t
\82Ì",
917 MH_ELF | ROLE_MALE | ROLE_FEMALE | ROLE_CHAOTIC,
921 /* Str Int Wis Dex Con Cha */
922 { 3, 3, 3, 3, 3, 3 },
923 { 18, 20, 20, 18, 16, 18 },
924 /* Init Lower Higher */
925 { 1, 0, 0, 1, 1, 0 }, /* Hit points */
926 { 2, 0, 3, 0, 3, 0 } /* Energy */
934 "
\83h
\83\8f\81[
\83t",
935 "
\83h
\83\8f\81[
\83t
\82Ì",
936 "
\83h
\83\8f\81[
\83t",
944 MH_DWARF | ROLE_MALE | ROLE_FEMALE | ROLE_LAWFUL,
948 /* Str Int Wis Dex Con Cha */
949 { 3, 3, 3, 3, 3, 3 },
950 { STR18(100), 16, 16, 20, 20, 16 },
951 /* Init Lower Higher */
952 { 4, 0, 0, 3, 2, 0 }, /* Hit points */
953 { 0, 0, 0, 0, 0, 0 } /* Energy */
962 "
\83m
\81[
\83\80\82Ì",
971 MH_GNOME | ROLE_MALE | ROLE_FEMALE | ROLE_NEUTRAL,
975 /* Str Int Wis Dex Con Cha */
976 { 3, 3, 3, 3, 3, 3 },
977 { STR18(50), 19, 18, 18, 18, 18 },
978 /* Init Lower Higher */
979 { 1, 0, 0, 1, 0, 0 }, /* Hit points */
980 { 2, 0, 2, 0, 2, 0 } /* Energy */
998 MH_ORC | ROLE_MALE | ROLE_FEMALE | ROLE_CHAOTIC,
1001 MH_HUMAN | MH_ELF | MH_DWARF,
1002 /* Str Int Wis Dex Con Cha */
1003 { 3, 3, 3, 3, 3, 3 },
1004 { STR18(50), 16, 16, 18, 18, 16 },
1005 /* Init Lower Higher */
1006 { 1, 0, 0, 1, 0, 0 }, /* Hit points */
1007 { 1, 0, 1, 0, 1, 0 } /* Energy */
1009 /* Array terminator */
1013 /* The player's race, created at runtime from initial
1014 * choices. This may be munged in role_init().
1016 struct Race urace = {
1030 /* Str Int Wis Dex Con Cha */
1031 { 3, 3, 3, 3, 3, 3 },
1032 { STR18(100), 18, 18, 18, 18, 18 },
1033 /* Init Lower Higher */
1034 { 2, 0, 0, 2, 1, 0 }, /* Hit points */
1035 { 1, 0, 2, 0, 2, 0 } /* Energy */
1038 /* Table of all genders */
1040 - steed.c kick_steed() He[]
\82É
\92l
\82ª
\83R
\83s
\81[
\82³
\82ê
\82é
\82Ì
\82Å
\92·
\82³
\82ð
\95Ï
\82¦
\82½
\82Æ
\82«
\82É
\82Í
1041 \8aY
\93\96\95\94\82à
\97v
\8fC
\90³
\81B
1043 const struct Gender genders[] = {
1045 { "male", "he", "him", "his", "Mal", ROLE_MALE },
1046 { "female", "she", "her", "her", "Fem", ROLE_FEMALE },
1047 { "neuter", "it", "it", "its", "Ntr", ROLE_NEUTER }
1049 { "
\92j
\90«", "
\94Þ", "
\94Þ", "
\94Þ
\82Ì", "Mal", ROLE_MALE },
1050 { "
\8f\97\90«", "
\94Þ
\8f\97", "
\94Þ
\8f\97", "
\94Þ
\8f\97\82Ì", "Fem", ROLE_FEMALE },
1051 { "
\92\86\90«", "
\82»
\82ê", "
\82»
\82ê", "
\82»
\82Ì", "Ntr", ROLE_NEUTER }
1055 /* Table of all alignments */
1056 const struct Align aligns[] = {
1058 { "law", "lawful", "Law", ROLE_LAWFUL, A_LAWFUL },
1059 { "balance", "neutral", "Neu", ROLE_NEUTRAL, A_NEUTRAL },
1060 { "chaos", "chaotic", "Cha", ROLE_CHAOTIC, A_CHAOTIC },
1061 { "evil", "unaligned", "Una", 0, A_NONE }
1063 { "
\92\81\8f\98", "
\92\81\8f\98\82Ì", "Law", ROLE_LAWFUL, A_LAWFUL },
1064 { "
\92\86\97§", "
\92\86\97§
\82Ì", "Neu", ROLE_NEUTRAL, A_NEUTRAL },
1065 { "
\8d¬
\93×", "
\8d¬
\93×
\82Ì", "Cha", ROLE_CHAOTIC, A_CHAOTIC },
1066 { "
\96³
\90S", "
\96³
\90S
\82Ì", "Una", 0, A_NONE }
1072 boolean roles[SIZE(roles)];
1076 STATIC_DCL int NDECL(randrole_filtered);
1077 STATIC_DCL char *FDECL(promptsep, (char *, int));
1078 STATIC_DCL int FDECL(role_gendercount, (int));
1079 STATIC_DCL int FDECL(race_alignmentcount, (int));
1081 /* used by str2XXX() */
1083 static char NEARDATA randomstr[] = "random";
1085 static char NEARDATA randomstr[] = "
\83\89\83\93\83_
\83\80";
1091 return (boolean) (rolenum >= 0 && rolenum < SIZE(roles) - 1);
1097 return rn2(SIZE(roles) - 1);
1103 int i, n = 0, set[SIZE(roles)];
1105 /* this doesn't rule out impossible combinations but attempts to
1106 honor all the filter masks */
1107 for (i = 0; i < SIZE(roles); ++i)
1108 if (ok_role(i, ROLE_NONE, ROLE_NONE, ROLE_NONE)
1109 && ok_race(i, ROLE_RANDOM, ROLE_NONE, ROLE_NONE)
1110 && ok_gend(i, ROLE_NONE, ROLE_RANDOM, ROLE_NONE)
1111 && ok_align(i, ROLE_NONE, ROLE_NONE, ROLE_RANDOM))
1113 return n ? set[rn2(n)] : randrole();
1123 if (!str || !str[0])
1126 /* Match as much of str as is provided */
1128 for (i = 0; roles[i].name.m; i++) {
1129 /* Does it match the male name? */
1130 if (!strncmpi(str, roles[i].name.m, len))
1132 /* Or the female name? */
1133 if (roles[i].name.f && !strncmpi(str, roles[i].name.f, len))
1135 /* Or the filecode? */
1136 if (!strcmpi(str, roles[i].filecode))
1140 if ((len == 1 && (*str == '*' || *str == '@'))
1141 || !strncmpi(str, randomstr, len))
1144 /* Couldn't find anything appropriate */
1149 validrace(rolenum, racenum)
1150 int rolenum, racenum;
1152 /* Assumes validrole */
1153 return (boolean) (racenum >= 0 && racenum < SIZE(races) - 1
1154 && (roles[rolenum].allow & races[racenum].allow
1164 /* Count the number of valid races */
1165 for (i = 0; races[i].noun; i++)
1166 if (roles[rolenum].allow & races[i].allow & ROLE_RACEMASK)
1169 /* Pick a random race */
1170 /* Use a factor of 100 in case of bad random number generators */
1172 n = rn2(n * 100) / 100;
1173 for (i = 0; races[i].noun; i++)
1174 if (roles[rolenum].allow & races[i].allow & ROLE_RACEMASK) {
1181 /* This role has no permitted races? */
1182 return rn2(SIZE(races) - 1);
1192 if (!str || !str[0])
1195 /* Match as much of str as is provided */
1197 for (i = 0; races[i].noun; i++) {
1198 /* Does it match the noun? */
1199 if (!strncmpi(str, races[i].noun, len))
1201 /* Or the filecode? */
1202 if (!strcmpi(str, races[i].filecode))
1206 if ((len == 1 && (*str == '*' || *str == '@'))
1207 || !strncmpi(str, randomstr, len))
1210 /* Couldn't find anything appropriate */
1215 validgend(rolenum, racenum, gendnum)
1216 int rolenum, racenum, gendnum;
1218 /* Assumes validrole and validrace */
1219 return (boolean) (gendnum >= 0 && gendnum < ROLE_GENDERS
1220 && (roles[rolenum].allow & races[racenum].allow
1221 & genders[gendnum].allow & ROLE_GENDMASK));
1225 randgend(rolenum, racenum)
1226 int rolenum, racenum;
1230 /* Count the number of valid genders */
1231 for (i = 0; i < ROLE_GENDERS; i++)
1232 if (roles[rolenum].allow & races[racenum].allow & genders[i].allow
1236 /* Pick a random gender */
1239 for (i = 0; i < ROLE_GENDERS; i++)
1240 if (roles[rolenum].allow & races[racenum].allow & genders[i].allow
1248 /* This role/race has no permitted genders? */
1249 return rn2(ROLE_GENDERS);
1259 if (!str || !str[0])
1262 /* Match as much of str as is provided */
1264 for (i = 0; i < ROLE_GENDERS; i++) {
1265 /* Does it match the adjective? */
1266 if (!strncmpi(str, genders[i].adj, len))
1268 /* Or the filecode? */
1269 if (!strcmpi(str, genders[i].filecode))
1272 if ((len == 1 && (*str == '*' || *str == '@'))
1273 || !strncmpi(str, randomstr, len))
1276 /* Couldn't find anything appropriate */
1281 validalign(rolenum, racenum, alignnum)
1282 int rolenum, racenum, alignnum;
1284 /* Assumes validrole and validrace */
1285 return (boolean) (alignnum >= 0 && alignnum < ROLE_ALIGNS
1286 && (roles[rolenum].allow & races[racenum].allow
1287 & aligns[alignnum].allow & ROLE_ALIGNMASK));
1291 randalign(rolenum, racenum)
1292 int rolenum, racenum;
1296 /* Count the number of valid alignments */
1297 for (i = 0; i < ROLE_ALIGNS; i++)
1298 if (roles[rolenum].allow & races[racenum].allow & aligns[i].allow
1302 /* Pick a random alignment */
1305 for (i = 0; i < ROLE_ALIGNS; i++)
1306 if (roles[rolenum].allow & races[racenum].allow & aligns[i].allow
1314 /* This role/race has no permitted alignments? */
1315 return rn2(ROLE_ALIGNS);
1325 if (!str || !str[0])
1328 /* Match as much of str as is provided */
1330 for (i = 0; i < ROLE_ALIGNS; i++) {
1331 /* Does it match the adjective? */
1332 if (!strncmpi(str, aligns[i].adj, len))
1334 /* Or the filecode? */
1335 if (!strcmpi(str, aligns[i].filecode))
1338 if ((len == 1 && (*str == '*' || *str == '@'))
1339 || !strncmpi(str, randomstr, len))
1342 /* Couldn't find anything appropriate */
1346 /* is rolenum compatible with any racenum/gendnum/alignnum constraints? */
1348 ok_role(rolenum, racenum, gendnum, alignnum)
1349 int rolenum, racenum, gendnum, alignnum;
1354 if (rolenum >= 0 && rolenum < SIZE(roles) - 1) {
1355 if (filter.roles[rolenum])
1357 allow = roles[rolenum].allow;
1358 if (racenum >= 0 && racenum < SIZE(races) - 1
1359 && !(allow & races[racenum].allow & ROLE_RACEMASK))
1361 if (gendnum >= 0 && gendnum < ROLE_GENDERS
1362 && !(allow & genders[gendnum].allow & ROLE_GENDMASK))
1364 if (alignnum >= 0 && alignnum < ROLE_ALIGNS
1365 && !(allow & aligns[alignnum].allow & ROLE_ALIGNMASK))
1369 /* random; check whether any selection is possible */
1370 for (i = 0; i < SIZE(roles) - 1; i++) {
1371 if (filter.roles[i])
1373 allow = roles[i].allow;
1374 if (racenum >= 0 && racenum < SIZE(races) - 1
1375 && !(allow & races[racenum].allow & ROLE_RACEMASK))
1377 if (gendnum >= 0 && gendnum < ROLE_GENDERS
1378 && !(allow & genders[gendnum].allow & ROLE_GENDMASK))
1380 if (alignnum >= 0 && alignnum < ROLE_ALIGNS
1381 && !(allow & aligns[alignnum].allow & ROLE_ALIGNMASK))
1389 /* pick a random role subject to any racenum/gendnum/alignnum constraints */
1390 /* If pickhow == PICK_RIGID a role is returned only if there is */
1391 /* a single possibility */
1393 pick_role(racenum, gendnum, alignnum, pickhow)
1394 int racenum, gendnum, alignnum, pickhow;
1397 int roles_ok = 0, set[SIZE(roles)];
1399 for (i = 0; i < SIZE(roles) - 1; i++) {
1400 if (ok_role(i, racenum, gendnum, alignnum)
1401 && ok_race(i, (racenum >= 0) ? racenum : ROLE_RANDOM,
1403 && ok_gend(i, racenum,
1404 (gendnum >= 0) ? gendnum : ROLE_RANDOM, alignnum)
1405 && ok_race(i, racenum,
1406 gendnum, (alignnum >= 0) ? alignnum : ROLE_RANDOM))
1407 set[roles_ok++] = i;
1409 if (roles_ok == 0 || (roles_ok > 1 && pickhow == PICK_RIGID))
1411 return set[rn2(roles_ok)];
1414 /* is racenum compatible with any rolenum/gendnum/alignnum constraints? */
1416 ok_race(rolenum, racenum, gendnum, alignnum)
1417 int rolenum, racenum, gendnum, alignnum;
1422 if (racenum >= 0 && racenum < SIZE(races) - 1) {
1423 if (filter.mask & races[racenum].selfmask)
1425 allow = races[racenum].allow;
1426 if (rolenum >= 0 && rolenum < SIZE(roles) - 1
1427 && !(allow & roles[rolenum].allow & ROLE_RACEMASK))
1429 if (gendnum >= 0 && gendnum < ROLE_GENDERS
1430 && !(allow & genders[gendnum].allow & ROLE_GENDMASK))
1432 if (alignnum >= 0 && alignnum < ROLE_ALIGNS
1433 && !(allow & aligns[alignnum].allow & ROLE_ALIGNMASK))
1437 /* random; check whether any selection is possible */
1438 for (i = 0; i < SIZE(races) - 1; i++) {
1439 if (filter.mask & races[i].selfmask)
1441 allow = races[i].allow;
1442 if (rolenum >= 0 && rolenum < SIZE(roles) - 1
1443 && !(allow & roles[rolenum].allow & ROLE_RACEMASK))
1445 if (gendnum >= 0 && gendnum < ROLE_GENDERS
1446 && !(allow & genders[gendnum].allow & ROLE_GENDMASK))
1448 if (alignnum >= 0 && alignnum < ROLE_ALIGNS
1449 && !(allow & aligns[alignnum].allow & ROLE_ALIGNMASK))
1457 /* pick a random race subject to any rolenum/gendnum/alignnum constraints */
1458 /* If pickhow == PICK_RIGID a race is returned only if there is */
1459 /* a single possibility */
1461 pick_race(rolenum, gendnum, alignnum, pickhow)
1462 int rolenum, gendnum, alignnum, pickhow;
1467 for (i = 0; i < SIZE(races) - 1; i++) {
1468 if (ok_race(rolenum, i, gendnum, alignnum))
1471 if (races_ok == 0 || (races_ok > 1 && pickhow == PICK_RIGID))
1473 races_ok = rn2(races_ok);
1474 for (i = 0; i < SIZE(races) - 1; i++) {
1475 if (ok_race(rolenum, i, gendnum, alignnum)) {
1485 /* is gendnum compatible with any rolenum/racenum/alignnum constraints? */
1486 /* gender and alignment are not comparable (and also not constrainable) */
1488 ok_gend(rolenum, racenum, gendnum, alignnum)
1489 int rolenum, racenum, gendnum;
1490 int alignnum UNUSED;
1495 if (gendnum >= 0 && gendnum < ROLE_GENDERS) {
1496 if (filter.mask & genders[gendnum].allow)
1498 allow = genders[gendnum].allow;
1499 if (rolenum >= 0 && rolenum < SIZE(roles) - 1
1500 && !(allow & roles[rolenum].allow & ROLE_GENDMASK))
1502 if (racenum >= 0 && racenum < SIZE(races) - 1
1503 && !(allow & races[racenum].allow & ROLE_GENDMASK))
1507 /* random; check whether any selection is possible */
1508 for (i = 0; i < ROLE_GENDERS; i++) {
1509 if (filter.mask & genders[i].allow)
1511 allow = genders[i].allow;
1512 if (rolenum >= 0 && rolenum < SIZE(roles) - 1
1513 && !(allow & roles[rolenum].allow & ROLE_GENDMASK))
1515 if (racenum >= 0 && racenum < SIZE(races) - 1
1516 && !(allow & races[racenum].allow & ROLE_GENDMASK))
1524 /* pick a random gender subject to any rolenum/racenum/alignnum constraints */
1525 /* gender and alignment are not comparable (and also not constrainable) */
1526 /* If pickhow == PICK_RIGID a gender is returned only if there is */
1527 /* a single possibility */
1529 pick_gend(rolenum, racenum, alignnum, pickhow)
1530 int rolenum, racenum, alignnum, pickhow;
1535 for (i = 0; i < ROLE_GENDERS; i++) {
1536 if (ok_gend(rolenum, racenum, i, alignnum))
1539 if (gends_ok == 0 || (gends_ok > 1 && pickhow == PICK_RIGID))
1541 gends_ok = rn2(gends_ok);
1542 for (i = 0; i < ROLE_GENDERS; i++) {
1543 if (ok_gend(rolenum, racenum, i, alignnum)) {
1553 /* is alignnum compatible with any rolenum/racenum/gendnum constraints? */
1554 /* alignment and gender are not comparable (and also not constrainable) */
1556 ok_align(rolenum, racenum, gendnum, alignnum)
1557 int rolenum, racenum;
1564 if (alignnum >= 0 && alignnum < ROLE_ALIGNS) {
1565 if (filter.mask & aligns[alignnum].allow)
1567 allow = aligns[alignnum].allow;
1568 if (rolenum >= 0 && rolenum < SIZE(roles) - 1
1569 && !(allow & roles[rolenum].allow & ROLE_ALIGNMASK))
1571 if (racenum >= 0 && racenum < SIZE(races) - 1
1572 && !(allow & races[racenum].allow & ROLE_ALIGNMASK))
1576 /* random; check whether any selection is possible */
1577 for (i = 0; i < ROLE_ALIGNS; i++) {
1578 if (filter.mask & aligns[i].allow)
1580 allow = aligns[i].allow;
1581 if (rolenum >= 0 && rolenum < SIZE(roles) - 1
1582 && !(allow & roles[rolenum].allow & ROLE_ALIGNMASK))
1584 if (racenum >= 0 && racenum < SIZE(races) - 1
1585 && !(allow & races[racenum].allow & ROLE_ALIGNMASK))
1593 /* pick a random alignment subject to any rolenum/racenum/gendnum constraints
1595 /* alignment and gender are not comparable (and also not constrainable) */
1596 /* If pickhow == PICK_RIGID an alignment is returned only if there is */
1597 /* a single possibility */
1599 pick_align(rolenum, racenum, gendnum, pickhow)
1600 int rolenum, racenum, gendnum, pickhow;
1605 for (i = 0; i < ROLE_ALIGNS; i++) {
1606 if (ok_align(rolenum, racenum, gendnum, i))
1609 if (aligns_ok == 0 || (aligns_ok > 1 && pickhow == PICK_RIGID))
1611 aligns_ok = rn2(aligns_ok);
1612 for (i = 0; i < ROLE_ALIGNS; i++) {
1613 if (ok_align(rolenum, racenum, gendnum, i)) {
1626 /* Some roles are limited to a single race, alignment, or gender and
1627 * calling this routine prior to XXX_player_selection() will help
1628 * prevent an extraneous prompt that actually doesn't allow
1629 * you to choose anything further. Note the use of PICK_RIGID which
1630 * causes the pick_XX() routine to return a value only if there is one
1631 * single possible selection, otherwise it returns ROLE_NONE.
1634 if (flags.initrole == ROLE_RANDOM) {
1635 /* If the role was explicitly specified as ROLE_RANDOM
1636 * via -uXXXX-@ then choose the role in here to narrow down
1637 * later choices. Pick a random role in this case.
1639 flags.initrole = pick_role(flags.initrace, flags.initgend,
1640 flags.initalign, PICK_RANDOM);
1641 if (flags.initrole < 0)
1642 flags.initrole = randrole_filtered();
1644 if (flags.initrole != ROLE_NONE) {
1645 if (flags.initrace == ROLE_NONE)
1646 flags.initrace = pick_race(flags.initrole, flags.initgend,
1647 flags.initalign, PICK_RIGID);
1648 if (flags.initalign == ROLE_NONE)
1649 flags.initalign = pick_align(flags.initrole, flags.initrace,
1650 flags.initgend, PICK_RIGID);
1651 if (flags.initgend == ROLE_NONE)
1652 flags.initgend = pick_gend(flags.initrole, flags.initrace,
1653 flags.initalign, PICK_RIGID);
1662 boolean reslt = TRUE;
1664 if ((i = str2role(bufp)) != ROLE_NONE && i != ROLE_RANDOM)
1665 filter.roles[i] = TRUE;
1666 else if ((i = str2race(bufp)) != ROLE_NONE && i != ROLE_RANDOM)
1667 filter.mask |= races[i].selfmask;
1668 else if ((i = str2gend(bufp)) != ROLE_NONE && i != ROLE_RANDOM)
1669 filter.mask |= genders[i].allow;
1670 else if ((i = str2align(bufp)) != ROLE_NONE && i != ROLE_RANDOM)
1671 filter.mask |= aligns[i].allow;
1684 for (i = 0; i < SIZE(roles); ++i)
1685 if (filter.roles[i])
1695 for (i = 0; i < SIZE(roles); ++i)
1696 filter.roles[i] = FALSE;
1706 STATIC_VAR char pa[NUM_BP], post_attribs;
1709 promptsep(buf, num_post_attribs)
1711 int num_post_attribs;
1714 const char *conjuct = "and ";
1716 if (num_post_attribs > 1 && post_attribs < num_post_attribs
1717 && post_attribs > 1)
1721 if (!post_attribs && num_post_attribs > 1)
1722 Strcat(buf, conjuct);
1724 /*JP:
\93ú
\96{
\8cê
\82Å
\82Í "A, B, and C"
\82Æ
\82¢
\82¤
\8f\88\97\9d\82Í
\95s
\97v */
1725 if(num_post_attribs > post_attribs){
1726 Strcat(buf, "
\81C");
1734 role_gendercount(rolenum)
1739 if (validrole(rolenum)) {
1740 if (roles[rolenum].allow & ROLE_MALE)
1742 if (roles[rolenum].allow & ROLE_FEMALE)
1744 if (roles[rolenum].allow & ROLE_NEUTER)
1751 race_alignmentcount(racenum)
1756 if (racenum != ROLE_NONE && racenum != ROLE_RANDOM) {
1757 if (races[racenum].allow & ROLE_CHAOTIC)
1759 if (races[racenum].allow & ROLE_LAWFUL)
1761 if (races[racenum].allow & ROLE_NEUTRAL)
1768 root_plselection_prompt(suppliedbuf, buflen, rolenum, racenum, gendnum,
1771 int buflen, rolenum, racenum, gendnum, alignnum;
1773 int k, gendercount = 0, aligncount = 0;
1776 static char err_ret[] = " character's";
1778 static char err_ret[] = "
\83L
\83\83\83\89\83N
\83^
\81[
\82Ì";
1779 boolean donefirst = FALSE;
1781 if (!suppliedbuf || buflen < 1)
1784 /* initialize these static variables each time this is called */
1786 for (k = 0; k < NUM_BP; ++k)
1789 *suppliedbuf = '\0';
1791 /* How many alignments are allowed for the desired race? */
1792 if (racenum != ROLE_NONE && racenum != ROLE_RANDOM)
1793 aligncount = race_alignmentcount(racenum);
1795 if (alignnum != ROLE_NONE && alignnum != ROLE_RANDOM
1796 && ok_align(rolenum, racenum, gendnum, alignnum)) {
1797 /* if race specified, and multiple choice of alignments for it */
1798 if ((racenum >= 0) && (aligncount > 1)) {
1803 Strcat(buf, aligns[alignnum].adj);
1810 Strcat(buf, aligns[alignnum].adj);
1814 /* in case we got here by failing the ok_align() test */
1815 if (alignnum != ROLE_RANDOM)
1816 alignnum = ROLE_NONE;
1817 /* if alignment not specified, but race is specified
1818 and only one choice of alignment for that race then
1819 don't include it in the later list */
1820 if ((((racenum != ROLE_NONE && racenum != ROLE_RANDOM)
1821 && ok_race(rolenum, racenum, gendnum, alignnum))
1822 && (aligncount > 1))
1823 || (racenum == ROLE_NONE || racenum == ROLE_RANDOM)) {
1830 /* How many genders are allowed for the desired role? */
1831 if (validrole(rolenum))
1832 gendercount = role_gendercount(rolenum);
1834 if (gendnum != ROLE_NONE && gendnum != ROLE_RANDOM) {
1835 if (validrole(rolenum)) {
1836 /* if role specified, and multiple choice of genders for it,
1837 and name of role itself does not distinguish gender */
1838 if ((rolenum != ROLE_NONE) && (gendercount > 1)
1839 && !roles[rolenum].name.f) {
1844 Strcat(buf, genders[gendnum].adj);
1852 Strcat(buf, genders[gendnum].adj);
1856 /* if gender not specified, but role is specified
1857 and only one choice of gender then
1858 don't include it in the later list */
1859 if ((validrole(rolenum) && (gendercount > 1))
1860 || !validrole(rolenum)) {
1865 /* <your lawful female> */
1867 if (racenum != ROLE_NONE && racenum != ROLE_RANDOM) {
1868 if (validrole(rolenum)
1869 && ok_race(rolenum, racenum, gendnum, alignnum)) {
1874 Strcat(buf, (rolenum == ROLE_NONE) ? races[racenum].noun
1875 : races[racenum].adj);
1877 } else if (!validrole(rolenum)) {
1882 Strcat(buf, races[racenum].noun);
1892 /* <your lawful female gnomish> || <your lawful female gnome> */
1894 if (validrole(rolenum)) {
1899 if (gendnum != ROLE_NONE) {
1900 if (gendnum == 1 && roles[rolenum].name.f)
1901 Strcat(buf, roles[rolenum].name.f);
1903 Strcat(buf, roles[rolenum].name.m);
1905 if (roles[rolenum].name.f) {
1906 Strcat(buf, roles[rolenum].name.m);
1908 Strcat(buf, roles[rolenum].name.f);
1910 Strcat(buf, roles[rolenum].name.m);
1913 } else if (rolenum == ROLE_NONE) {
1918 if ((racenum == ROLE_NONE || racenum == ROLE_RANDOM)
1919 && !validrole(rolenum)) {
1925 Strcat(buf, "character");
1927 Strcat(buf, "
\83L
\83\83\83\89\83N
\83^
\81[");
1930 /* <your lawful female gnomish cavewoman> || <your lawful female gnome>
1931 * || <your lawful female character>
1933 if (buflen > (int) (strlen(buf) + 1)) {
1934 Strcpy(suppliedbuf, buf);
1941 build_plselection_prompt(buf, buflen, rolenum, racenum, gendnum, alignnum)
1943 int buflen, rolenum, racenum, gendnum, alignnum;
1946 const char *defprompt = "Shall I pick a character for you? [ynaq] ";
1948 const char *defprompt = "
\93K
\93\96\82É
\83L
\83\83\83\89\83N
\83^
\81[
\82ð
\91I
\82ñ
\82Å
\82æ
\82¢
\82Å
\82·
\82©
\81H[ynaq] ";
1949 int num_post_attribs = 0;
1951 char tmpbuf[BUFSZ], *p;
1956 if (buflen < QBUFSZ)
1957 return (char *) defprompt;
1960 Strcpy(tmpbuf, "Shall I pick ");
1961 if (racenum != ROLE_NONE || validrole(rolenum))
1962 Strcat(tmpbuf, "your ");
1964 Strcat(tmpbuf, "a ");
1971 (void) root_plselection_prompt(eos(tmpbuf), buflen - strlen(tmpbuf),
1972 rolenum, racenum, gendnum, alignnum);
1974 Sprintf(buf, "%s", s_suffix(tmpbuf));
1976 Sprintf(buf, "%s
\82Ì", tmpbuf);
1978 #if 0 /*JP:
\93ú
\96{
\8cê
\82Å
\82Í
\95s
\97v*/
1979 /* don't bother splitting caveman/cavewoman or priest/priestess
1980 in order to apply possessive suffix to both halves, but do
1981 change "priest/priestess'" to "priest/priestess's" */
1982 if ((p = strstri(buf, "priest/priestess'")) != 0
1983 && p[sizeof "priest/priestess'" - sizeof ""] == '\0')
1984 strkitten(buf, 's');
1987 /* buf should now be:
1988 * <your lawful female gnomish cavewoman's>
1989 * || <your lawful female gnome's>
1990 * || <your lawful female character's>
1992 * Now append the post attributes to it
1994 num_post_attribs = post_attribs;
1997 (void) promptsep(eos(buf), num_post_attribs);
1999 Strcat(buf, "race");
2001 Strcat(buf, "
\8eí
\91°");
2004 (void) promptsep(eos(buf), num_post_attribs);
2006 Strcat(buf, "role");
2008 Strcat(buf, "
\90E
\8bÆ");
2011 (void) promptsep(eos(buf), num_post_attribs);
2013 Strcat(buf, "gender");
2015 Strcat(buf, "
\90«
\95Ê");
2018 (void) promptsep(eos(buf), num_post_attribs);
2020 Strcat(buf, "alignment");
2022 Strcat(buf, "
\91®
\90«");
2026 Strcat(buf, " for you? [ynaq] ");
2028 Strcat(buf, "
\82ð
\93K
\93\96\82É
\91I
\82ñ
\82Å
\82æ
\82ë
\82µ
\82¢
\82Å
\82·
\82©
\81H[ynq] ");
2044 #ifdef GENERIC_USERNAMES
2046 /* some generic user names will be ignored in favor of prompting */
2047 const char *uptr = GENERIC_USERNAMES;
2049 i = (int) strlen(plname);
2050 if ((sptr = strstri(uptr, plname)) != 0
2051 && (sptr == uptr || sptr[-1] == ' ')
2052 && (sptr[i] == ' ' || sptr[i] == '\0'))
2053 *plname = '\0'; /* call askname() */
2059 askname(); /* fill plname[] if necessary */
2061 /* Look for tokens delimited by '-' */
2062 if ((eptr = index(plname, '-')) != (char *) 0)
2065 /* Isolate the next token */
2067 if ((eptr = index(sptr, '-')) != (char *) 0)
2070 /* Try to match it to something */
2071 if ((i = str2role(sptr)) != ROLE_NONE)
2073 else if ((i = str2race(sptr)) != ROLE_NONE)
2075 else if ((i = str2gend(sptr)) != ROLE_NONE)
2077 else if ((i = str2align(sptr)) != ROLE_NONE)
2078 flags.initalign = i;
2082 /* commas in the plname confuse the record file, convert to spaces */
2083 for (sptr = plname; *sptr; sptr++) {
2089 /* show current settings for name, role, race, gender, and alignment
2090 in the specified window */
2092 role_selection_prolog(which, where)
2097 static const char NEARDATA choosing[] = " choosing now",
2099 static const char NEARDATA choosing[] = "
\8c»
\8dÝ
\91I
\91ð
\92\86",
2101 not_yet[] = " not yet specified",
2103 not_yet[] = "
\96¢
\91I
\91ð",
2105 rand_choice[] = " random";
2107 rand_choice[] = "
\83\89\83\93\83_
\83\80";
2109 int r, c, g, a, allowmask;
2114 a = flags.initalign;
2116 allowmask = roles[r].allow;
2117 if ((allowmask & ROLE_RACEMASK) == MH_HUMAN)
2118 c = 0; /* races[human] */
2119 else if (c >= 0 && !(allowmask & ROLE_RACEMASK & races[c].allow))
2121 if ((allowmask & ROLE_GENDMASK) == ROLE_MALE)
2122 g = 0; /* role forces male (hypothetical) */
2123 else if ((allowmask & ROLE_GENDMASK) == ROLE_FEMALE)
2124 g = 1; /* role forces female (valkyrie) */
2125 if ((allowmask & ROLE_ALIGNMASK) == AM_LAWFUL)
2126 a = 0; /* aligns[lawful] */
2127 else if ((allowmask & ROLE_ALIGNMASK) == AM_NEUTRAL)
2128 a = 1; /* aligns[neutral] */
2129 else if ((allowmask & ROLE_ALIGNMASK) == AM_CHAOTIC)
2130 a = 2; /* alings[chaotic] */
2133 allowmask = races[c].allow;
2134 if ((allowmask & ROLE_ALIGNMASK) == AM_LAWFUL)
2135 a = 0; /* aligns[lawful] */
2136 else if ((allowmask & ROLE_ALIGNMASK) == AM_NEUTRAL)
2137 a = 1; /* aligns[neutral] */
2138 else if ((allowmask & ROLE_ALIGNMASK) == AM_CHAOTIC)
2139 a = 2; /* alings[chaotic] */
2140 /* [c never forces gender] */
2142 /* [g and a don't constrain anything sufficiently
2143 to narrow something done to a single choice] */
2146 Sprintf(buf, "%12s ", "name:");
2148 Sprintf(buf, "%12s ", "
\96¼
\91O:");
2149 Strcat(buf, (which == RS_NAME) ? choosing : !*plname ? not_yet : plname);
2150 putstr(where, 0, buf);
2152 Sprintf(buf, "%12s ", "role:");
2154 Sprintf(buf, "%12s ", "
\90E
\8bÆ:");
2155 Strcat(buf, (which == RS_ROLE) ? choosing : (r == ROLE_NONE)
2157 : (r == ROLE_RANDOM)
2160 if (r >= 0 && roles[r].name.f) {
2161 /* distinct female name [caveman/cavewoman, priest/priestess] */
2163 /* female specified; replace male role name with female one */
2164 Sprintf(index(buf, ':'), ": %s", roles[r].name.f);
2166 /* gender unspecified; append slash and female role name */
2167 Sprintf(eos(buf), "/%s", roles[r].name.f);
2169 putstr(where, 0, buf);
2171 Sprintf(buf, "%12s ", "race:");
2173 Sprintf(buf, "%12s ", "
\8eí
\91°:");
2174 Strcat(buf, (which == RS_RACE) ? choosing : (c == ROLE_NONE)
2176 : (c == ROLE_RANDOM)
2179 putstr(where, 0, buf);
2181 Sprintf(buf, "%12s ", "gender:");
2183 Sprintf(buf, "%12s ", "
\90«
\95Ê:");
2184 Strcat(buf, (which == RS_GENDER) ? choosing : (g == ROLE_NONE)
2186 : (g == ROLE_RANDOM)
2189 putstr(where, 0, buf);
2191 Sprintf(buf, "%12s ", "alignment:");
2193 Sprintf(buf, "%12s ", "
\91®
\90«:");
2194 Strcat(buf, (which == RS_ALGNMNT) ? choosing : (a == ROLE_NONE)
2196 : (a == ROLE_RANDOM)
2198 #if 0 /*JP:
\93ú
\96{
\8cê
\82Å
\82Í
\96¼
\8e\8c\82ª
\8e©
\91R*/
2203 putstr(where, 0, buf);
2206 /* add a "pick alignment first"-type entry to the specified menu */
2208 role_menu_extra(which, where)
2212 static NEARDATA const char RS_menu_let[] = {
2217 '[', /* alignment */
2221 const char *what = 0, *constrainer = 0, *forcedvalue = 0;
2222 int f = 0, r, c, g, a, i, allowmask;
2239 for (i = 0; i < SIZE(roles); ++i)
2240 if (i != f && !filter.roles[i])
2242 if (i == SIZE(roles)) {
2244 constrainer = "filter";
2246 constrainer = "
\8di
\82è
\8d\9e\82Ý";
2248 forcedvalue = "role";
2250 forcedvalue = "
\90E
\8bÆ";
2259 c = ROLE_NONE; /* override player's setting */
2261 allowmask = roles[r].allow & ROLE_RACEMASK;
2262 if (allowmask == MH_HUMAN)
2263 c = 0; /* races[human] */
2266 constrainer = "role";
2268 constrainer = "
\90E
\8bÆ";
2269 forcedvalue = races[c].noun;
2271 && (allowmask & ~filter.mask) == races[f].selfmask) {
2272 /* if there is only one race choice available due to user
2273 options disallowing others, race menu entry is disabled */
2275 constrainer = "filter";
2277 constrainer = "
\8di
\82è
\8d\9e\82Ý";
2279 forcedvalue = "race";
2281 forcedvalue = "
\8eí
\91°";
2293 allowmask = roles[r].allow & ROLE_GENDMASK;
2294 if (allowmask == ROLE_MALE)
2295 g = 0; /* genders[male] */
2296 else if (allowmask == ROLE_FEMALE)
2297 g = 1; /* genders[female] */
2300 constrainer = "role";
2302 constrainer = "
\90E
\8bÆ";
2303 forcedvalue = genders[g].adj;
2305 && (allowmask & ~filter.mask) == genders[f].allow) {
2306 /* if there is only one gender choice available due to user
2307 options disallowing other, gender menu entry is disabled */
2309 constrainer = "filter";
2311 constrainer = "
\8di
\82è
\8d\9e\82Ý";
2313 forcedvalue = "gender";
2315 forcedvalue = "
\90«
\95Ê";
2324 f = flags.initalign;
2327 allowmask = roles[r].allow & ROLE_ALIGNMASK;
2328 if (allowmask == AM_LAWFUL)
2329 a = 0; /* aligns[lawful] */
2330 else if (allowmask == AM_NEUTRAL)
2331 a = 1; /* aligns[neutral] */
2332 else if (allowmask == AM_CHAOTIC)
2333 a = 2; /* aligns[chaotic] */
2336 constrainer = "role";
2338 constrainer = "
\90E
\8bÆ";
2340 if (c >= 0 && !constrainer) {
2341 allowmask = races[c].allow & ROLE_ALIGNMASK;
2342 if (allowmask == AM_LAWFUL)
2343 a = 0; /* aligns[lawful] */
2344 else if (allowmask == AM_NEUTRAL)
2345 a = 1; /* aligns[neutral] */
2346 else if (allowmask == AM_CHAOTIC)
2347 a = 2; /* aligns[chaotic] */
2350 constrainer = "race";
2352 constrainer = "
\8eí
\91°";
2354 if (f >= 0 && !constrainer
2355 && (ROLE_ALIGNMASK & ~filter.mask) == aligns[f].allow) {
2356 /* if there is only one alignment choice available due to user
2357 options disallowing others, algn menu entry is disabled */
2359 constrainer = "filter";
2361 constrainer = "
\8di
\82è
\8d\9e\82Ý";
2363 forcedvalue = "alignment";
2365 forcedvalue = "
\91®
\90«";
2368 #if 0 /*JP:
\93ú
\96{
\8cê
\82Å
\82Í
\96¼
\8e\8c\82ª
\8e©
\91R*/
2369 forcedvalue = aligns[a].adj;
2371 forcedvalue = aligns[a].noun;
2376 any = zeroany; /* zero out all bits */
2379 /* use four spaces of padding to fake a grayed out menu choice */
2381 Sprintf(buf, "%4s%s forces %s", "", constrainer, forcedvalue);
2383 Sprintf(buf, "%4s
\82±
\82Ì%s
\82Å
\82Í%s
\82Ì
\82Ý", "", constrainer, forcedvalue);
2384 add_menu(where, NO_GLYPH, &any, ' ', 0, ATR_NONE, buf,
2387 any.a_int = RS_menu_arg(which);
2389 Sprintf(buf, "Pick%s %s first", (f >= 0) ? " another" : "", what);
2391 Sprintf(buf, "%s%s
\82ð
\90æ
\82É
\91I
\82Ô", (f >= 0) ? "
\91¼
\82Ì" : "", what);
2392 add_menu(where, NO_GLYPH, &any, RS_menu_let[which], 0, ATR_NONE, buf,
2394 } else if (which == RS_filter) {
2395 any.a_int = RS_menu_arg(RS_filter);
2397 add_menu(where, NO_GLYPH, &any, '~', 0, ATR_NONE,
2398 "Reset role/race/&c filtering", MENU_UNSELECTED);
2400 add_menu(where, NO_GLYPH, &any, '~', 0, ATR_NONE,
2401 "
\90E
\8bÆ/
\8eí
\91°
\82È
\82Ç
\82Ì
\8di
\82è
\8d\9e\82Ý
\82ð
\89ð
\8f\9c\82·
\82é", MENU_UNSELECTED);
2403 } else if (which == ROLE_RANDOM) {
2404 any.a_int = ROLE_RANDOM;
2406 add_menu(where, NO_GLYPH, &any, '*', 0, ATR_NONE, "Random",
2409 add_menu(where, NO_GLYPH, &any, '*', 0, ATR_NONE, "
\83\89\83\93\83_
\83\80",
2412 } else if (which == ROLE_NONE) {
2413 any.a_int = ROLE_NONE;
2415 add_menu(where, NO_GLYPH, &any, 'q', 0, ATR_NONE, "Quit",
2418 add_menu(where, NO_GLYPH, &any, 'q', 0, ATR_NONE, "
\94²
\82¯
\82é",
2422 impossible("role_menu_extra: bad arg (%d)", which);
2427 * Special setup modifications here:
2429 * Unfortunately, this is going to have to be done
2430 * on each newgame or restore, because you lose the permonst mods
2431 * across a save/restore. :-)
2433 * 1 - The Rogue Leader is the Tourist Nemesis.
2434 * 2 - Priests start with a random alignment - convert the leader and
2436 * 3 - Priests also get their of deities from a randomly chosen role.
2437 * 4 - [obsolete] Elves can have one of two different leaders,
2438 * but can't work it out here because it requires hacking the
2439 * level file data (see sp_lev.c).
2441 * This code also replaces quest_init().
2447 struct permonst *pm;
2449 /* Strip the role letter out of the player name.
2450 * This is included for backwards compatibility.
2454 /* Check for a valid role. Try flags.initrole first. */
2455 if (!validrole(flags.initrole)) {
2456 /* Try the player letter second */
2457 if ((flags.initrole = str2role(pl_character)) < 0)
2458 /* None specified; pick a random role */
2459 flags.initrole = randrole_filtered();
2462 /* We now have a valid role index. Copy the role name back. */
2463 /* This should become OBSOLETE */
2464 Strcpy(pl_character, roles[flags.initrole].name.m);
2465 pl_character[PL_CSIZ - 1] = '\0';
2467 /* Check for a valid race */
2468 if (!validrace(flags.initrole, flags.initrace))
2469 flags.initrace = randrace(flags.initrole);
2471 /* Check for a valid gender. If new game, check both initgend
2472 * and female. On restore, assume flags.female is correct. */
2473 if (flags.pantheon == -1) { /* new game */
2474 if (!validgend(flags.initrole, flags.initrace, flags.female))
2475 flags.female = !flags.female;
2477 if (!validgend(flags.initrole, flags.initrace, flags.initgend))
2478 /* Note that there is no way to check for an unspecified gender. */
2479 flags.initgend = flags.female;
2481 /* Check for a valid alignment */
2482 if (!validalign(flags.initrole, flags.initrace, flags.initalign))
2483 /* Pick a random alignment */
2484 flags.initalign = randalign(flags.initrole, flags.initrace);
2485 alignmnt = aligns[flags.initalign].value;
2487 /* Initialize urole and urace */
2488 urole = roles[flags.initrole];
2489 urace = races[flags.initrace];
2491 /* Fix up the quest leader */
2492 if (urole.ldrnum != NON_PM) {
2493 pm = &mons[urole.ldrnum];
2494 pm->msound = MS_LEADER;
2495 pm->mflags2 |= (M2_PEACEFUL);
2496 pm->mflags3 |= M3_CLOSE;
2497 pm->maligntyp = alignmnt * 3;
2498 /* if gender is random, we choose it now instead of waiting
2499 until the leader monster is created */
2500 quest_status.ldrgend =
2501 is_neuter(pm) ? 2 : is_female(pm) ? 1 : is_male(pm)
2506 /* Fix up the quest guardians */
2507 if (urole.guardnum != NON_PM) {
2508 pm = &mons[urole.guardnum];
2509 pm->mflags2 |= (M2_PEACEFUL);
2510 pm->maligntyp = alignmnt * 3;
2513 /* Fix up the quest nemesis */
2514 if (urole.neminum != NON_PM) {
2515 pm = &mons[urole.neminum];
2516 pm->msound = MS_NEMESIS;
2517 pm->mflags2 &= ~(M2_PEACEFUL);
2518 pm->mflags2 |= (M2_NASTY | M2_STALK | M2_HOSTILE);
2519 pm->mflags3 &= ~(M3_CLOSE);
2520 pm->mflags3 |= M3_WANTSARTI | M3_WAITFORU;
2521 /* if gender is random, we choose it now instead of waiting
2522 until the nemesis monster is created */
2523 quest_status.nemgend = is_neuter(pm) ? 2 : is_female(pm) ? 1
2524 : is_male(pm) ? 0 : (rn2(100) < 50);
2527 /* Fix up the god names */
2528 if (flags.pantheon == -1) { /* new game */
2529 flags.pantheon = flags.initrole; /* use own gods */
2530 while (!roles[flags.pantheon].lgod) /* unless they're missing */
2531 flags.pantheon = randrole();
2534 urole.lgod = roles[flags.pantheon].lgod;
2535 urole.ngod = roles[flags.pantheon].ngod;
2536 urole.cgod = roles[flags.pantheon].cgod;
2538 /* 0 or 1; no gods are neuter, nor is gender randomized */
2539 quest_status.godgend = !strcmpi(align_gtitle(alignmnt), "goddess");
2541 /* Fix up infravision */
2542 if (mons[urace.malenum].mflags3 & M3_INFRAVISION) {
2543 /* although an infravision intrinsic is possible, infravision
2544 * is purely a property of the physical race. This means that we
2545 * must put the infravision flag in the player's current race
2546 * (either that or have separate permonst entries for
2547 * elven/non-elven members of each class). The side effect is that
2548 * all NPCs of that class will have (probably bogus) infravision,
2549 * but since infravision has no effect for NPCs anyway we can
2552 mons[urole.malenum].mflags3 |= M3_INFRAVISION;
2553 if (urole.femalenum != NON_PM)
2554 mons[urole.femalenum].mflags3 |= M3_INFRAVISION;
2557 /* Artifacts are fixed in hack_artifacts() */
2568 switch (Role_switch) {
2570 return "Salutations"; /* Olde English */
2572 return (mtmp && mtmp->data == &mons[PM_SHOPKEEPER])
2574 : "Konnichi wa"; /* Japanese */
2576 return "Aloha"; /* Hawaiian */
2580 (mtmp && mtmp->data == &mons[PM_MAIL_DAEMON]) ? "Hallo" :
2582 "Velkommen"; /* Norse */
2588 \82 \82¢
\82³
\82Â
\82Í
\93ú
\96{
\8cê
\82Æ
\82µ
\82Ä
\8e©
\91R
\82É
\82È
\82é
\82æ
\82¤
\91å
\82«
\82
\8ed
\97l
\82ð
\95Ï
\8dX
2590 static char helo_buf[BUFSZ];
2592 switch (Role_switch) {
2594 Sprintf(helo_buf, "
\82æ
\82
\82¼
\8eQ
\82Á
\82½%s
\82æ", plname);
2597 Sprintf(helo_buf, "
\82æ
\82
\82¼
\8eQ
\82ç
\82ê
\82½%s
\82æ", plname);
2600 Sprintf(helo_buf, "
\83A
\83\8d\81[
\83n%s", plname);
2603 Sprintf(helo_buf, "
\8d°
\82Ì
\8eç
\8cì
\8eÒ%s
\82æ", plname);
2606 Sprintf(helo_buf, "
\82æ
\82¤
\82±
\82»%s", plname);
2618 switch (Role_switch) {
2620 return "Fare thee well"; /* Olde English */
2622 return "Sayonara"; /* Japanese */
2624 return "Aloha"; /* Hawaiian */
2626 return "Farvel"; /* Norse */
2631 static char helo_buf[BUFSZ];
2633 switch (Role_switch) {
2635 Sprintf(helo_buf, "
\82³
\82ç
\82Î
\8chåi
\82È
\82é");
2638 Sprintf(helo_buf, "
\82³
\82ç
\82Î
\95\90\8em
\93¹
\82ð
\8eu
\82·");
2641 Sprintf(helo_buf, "
\83A
\83\8d\81[
\83n");
2644 Sprintf(helo_buf, "
\82³
\82ç
\82Î
\8d°
\82Ì
\8eç
\8cì
\8eÒ");
2647 Sprintf(helo_buf, "
\82³
\82æ
\82¤
\82È
\82ç");