1 /* NetHack 3.6 read.c $NHDT-Date: 1515802375 2018/01/13 00:12:55 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.150 $ */
2 /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
3 /*-Copyright (c) Robert Patrick Rankin, 2012. */
4 /* NetHack may be freely redistributed. See license for details. */
6 /* JNetHack Copyright */
7 /* (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 */
8 /* For 3.4-, Copyright (c) SHIRAKATA Kentaro, 2002-2018 */
9 /* JNetHack may be freely redistributed. See license for details. */
13 #define Your_Own_Role(mndx) \
14 ((mndx) == urole.malenum \
15 || (urole.femalenum != NON_PM && (mndx) == urole.femalenum))
16 #define Your_Own_Race(mndx) \
17 ((mndx) == urace.malenum \
18 || (urace.femalenum != NON_PM && (mndx) == urace.femalenum))
22 static NEARDATA const char readable[] = { ALL_CLASSES, SCROLL_CLASS,
24 static const char all_count[] = { ALLOW_COUNT, ALL_CLASSES, 0 };
26 STATIC_DCL boolean FDECL(learnscrolltyp, (SHORT_P));
27 STATIC_DCL char * FDECL(erode_obj_text, (struct obj *, char *));
28 STATIC_DCL void NDECL(do_class_genocide);
29 STATIC_DCL void FDECL(stripspe, (struct obj *));
30 STATIC_DCL void FDECL(p_glow1, (struct obj *));
31 STATIC_DCL void FDECL(p_glow2, (struct obj *, const char *));
32 STATIC_DCL void FDECL(randomize, (int *, int));
33 STATIC_DCL void FDECL(forget_single_object, (int));
34 STATIC_DCL void FDECL(forget, (int));
35 STATIC_DCL int FDECL(maybe_tame, (struct monst *, struct obj *));
36 STATIC_DCL boolean FDECL(is_valid_stinking_cloud_pos, (int, int, BOOLEAN_P));
37 STATIC_DCL void FDECL(display_stinking_cloud_positions, (int));
38 STATIC_DCL boolean FDECL(get_valid_stinking_cloud_pos, (int, int));
39 STATIC_PTR void FDECL(set_lit, (int, int, genericptr));
42 learnscrolltyp(scrolltyp)
45 if (!objects[scrolltyp].oc_name_known) {
47 more_experienced(0, 10);
53 /* also called from teleport.c for scroll of teleportation */
58 /* it's implied that sobj->dknown is set;
59 we couldn't be reading this scroll otherwise */
60 if (sobj->oclass != SPBOOK_CLASS)
61 (void) learnscrolltyp(sobj->otyp);
65 erode_obj_text(otmp, buf)
69 int erosion = greatest_erosion(otmp);
72 wipeout_text(buf, (int) (strlen(buf) * erosion / (2 * MAX_ERODE)),
73 otmp->o_id ^ (unsigned) ubirthday);
78 tshirt_text(tshirt, buf)
82 static const char *shirt_msgs[] = {
85 "I explored the Dungeons of Doom and all I got was this lousy T-shirt!",
86 "Is that Mjollnir in your pocket or are you just happy to see me?",
87 "It's not the size of your sword, it's how #enhance'd you are with it.",
88 "Madame Elvira's House O' Succubi Lifetime Customer",
89 "Madame Elvira's House O' Succubi Employee of the Month",
90 "Ludios Vault Guards Do It In Small, Dark Rooms",
91 "Yendor Military Soldiers Do It In Large Groups",
92 "I survived Yendor Military Boot Camp",
93 "Ludios Accounting School Intra-Mural Lacrosse Team",
94 "Oracle(TM) Fountains 10th Annual Wet T-Shirt Contest",
95 "Hey, black dragon! Disintegrate THIS!",
96 "I'm With Stupid -->",
97 "Don't blame me, I voted for Izchak!",
98 "Don't Panic", /* HHGTTG */
99 "Furinkan High School Athletic Dept.", /* Ranma 1/2 */
100 "Hel-LOOO, Nurse!", /* Animaniacs */
102 "
\8e\84\82Í
\89^
\96½
\82Ì
\96À
\8b{
\82ð
\92²
\8d¸
\82µ
\82Ä
\82¢
\82½
\82ª
\81C
\8eè
\82É
\93ü
\82ê
\82½
\82Ì
\82Í
\82«
\82½
\82È
\82¢
\82s
\83V
\83\83\83c
\82¾
\82¯
\82¾
\82Á
\82½
\81I",
103 "
\83|
\83P
\83b
\83g
\82É
\83~
\83\85\83\8b\83j
\81[
\83\8b\82ª
\93ü
\82Á
\82Ä
\82¢
\82é
\82Ì
\81H
\82»
\82ê
\82Æ
\82à
\8e\84\82É
\89ï
\82¦
\82Ä
\82¤
\82ê
\82µ
\82¢
\81H",
104 "
\8c\95\82Ì
\91å
\82«
\82³
\82ª
\96â
\91è
\82È
\82Ì
\82Å
\82Í
\82È
\82¢
\81D
\82»
\82ê
\82ª
\94@
\89½
\82É#enhance
\82³
\82ê
\82Ä
\82¢
\82é
\82©
\82È
\82Ì
\82¾
\81D",
105 "
\83}
\83_
\83\80\81E
\83G
\83\8b\83o
\83C
\83\89\82Ì
\83T
\83L
\83\85\83o
\83X
\8aÙ
\89i
\8bv
\8cÚ
\8bq",
106 "
\83}
\83_
\83\80\81E
\83G
\83\8b\83o
\83C
\83\89\82Ì
\83T
\83L
\83\85\83o
\83X
\8aÙ
\8d¡
\8c\8e\82Ì
\8dÅ
\97D
\8fG
\8c÷
\98J
\8eÒ",
107 "
\83\8d\81[
\83f
\83B
\83I
\83X
\8bà
\8cÉ
\82Ì
\94Ô
\90l
\81C
\82»
\82ê
\82Í
\88Ã
\82
\8f¬
\82³
\82¢
\95\94\89®
\82Ì
\92\86",
108 "
\83C
\83F
\83\93\83_
\81[
\8cR
\95º
\8em
\81C
\82»
\82ê
\82Í
\8b\90\91å
\82È
\92c
\91Ì
\82Ì
\92\86",
109 "
\8e\84\82Í
\83C
\83F
\83\93\83_
\81[
\8cR
\82Ì
\90V
\95º
\8cP
\97û
\8f\8a\82ð
\8fæ
\82è
\89z
\82¦
\82Ü
\82µ
\82½",
110 "
\83\8d\81[
\83f
\83B
\83I
\83X
\89ï
\8cv
\8aw
\8dZ
\8eº
\93à
\83\89\83N
\83\8d\83X
\83`
\81[
\83\80",
111 "Oracle(TM)
\82Ì
\90ò
\91æ
\82P
\82O
\89ñ
\94G
\82ê
\82s
\83V
\83\83\83c
\83R
\83\93\83e
\83X
\83g",
112 "
\82¨
\82¢
\81C
\8d\95\83h
\83\89\83S
\83\93\81I
\82±
\82¢
\82Â
\82ð
\95ª
\89ð
\82µ
\82ë
\81I",
113 "
\94n
\8e
\82Æ
\88ê
\8f\8f\82É
\82¢
\82Ü
\82·
\81¨ ",
114 "
\8e\84\82Í
\88«
\82
\82È
\82¢
\81IIzchak
\82É
\93\8a\95[
\82µ
\82½
\82à
\82Ì
\81I",
115 "
\82 \82í
\82Ä
\82é
\82È", /*
\8bâ
\89Í
\83q
\83b
\83`
\83n
\83C
\83N
\83K
\83C
\83h */
116 "
\95\97\97Ñ
\8aÙ
\8d\82\8dZ
\97¤
\8fã
\95\94", /* Ranma 1/2 */
117 "
\82g
\82\85\82\8c\81|
\82k
\82n
\82n
\82n
\81C
\82m
\82\95\82\92\82\93\82\85\81I", /* Animaniacs */
121 "100% goblin hair - do not wash",
122 "Aberzombie and Fitch",
123 "cK -- Cockatrice touches the Kop",
124 "Don't ask me, I only adventure here",
126 "d, your dog or a killer?",
127 "FREE PUG AND NEWT!",
130 "Hello, my darlings!", /* Charlie Drake */
131 "Hey! Nymphs! Steal This T-Shirt!",
132 "I <3 Dungeon of Doom",
134 "I am a Valkyrie. If you see me running, try to keep up.",
135 "I am not a pack rat - I am a collector",
136 "I bounced off a rubber tree", /* Monkey Island */
137 "Plunder Island Brimstone Beach Club", /* Monkey Island */
139 "
\83S
\83u
\83\8a\83\93\96Ñ100% -
\90ô
\82¦
\82Ü
\82¹
\82ñ",
140 "
\83A
\83o
\83]
\83\93\83r&
\83t
\83B
\83b
\83`",
141 "cK --
\83R
\83J
\83g
\83\8a\83X
\82ª
\8cx
\8a¯
\82É
\83^
\83b
\83`",
142 "
\8e¿
\96â
\82µ
\82È
\82¢
\82Å;
\8e\84\82Í
\82±
\82±
\82ð
\92T
\8c\9f\82µ
\82Ä
\82¢
\82é
\82¾
\82¯",
144 "d
\82Í
\82 \82È
\82½
\82Ì
\8c¢
\82©
\8eE
\90l
\8eÒ
\82©
\81H",
145 "FREE PUG AND NEWT!",
148 "
\82±
\82ñ
\82É
\82¿
\82Í
\83_
\81[
\83\8a\83\93\81I", /* Charlie Drake */
149 "
\82â
\82 \81I
\83j
\83\93\83t
\81I
\82±
\82Ì
\82s
\83V
\83\83\83c
\82ð
\93\90\82ñ
\82Å
\81I",
150 "I <3 Dungeon of Doom",
152 "
\8e\84\82Í
\83o
\83\8b\83L
\83\8a\81[
\82¾
\81D
\8e\84\82ª
\91\96\82Á
\82Ä
\82¢
\82é
\82Ì
\82ð
\8c©
\82½
\82ç
\81C
\82Â
\82¢
\82Ä
\82±
\82¢
\81D",
153 "
\8e\84\82Í
\83S
\83~
\8fW
\82ß
\82Å
\82Í
\82È
\82¢
\81D
\8e\84\82Í
\8eû
\8fW
\89Æ
\82¾",
154 "
\8e\84\82Í
\83S
\83\80\82Ì
\96Ø
\82É
\92µ
\82Ë
\95Ô
\82Á
\82½", /* Monkey Island */
155 "
\97ª
\92D
\93\87\97°
\89©
\8aC
\8aÝ
\83N
\83\89\83u", /* Monkey Island */
158 "If you can read this, I can hit you with my polearm",
160 "I scored with the princess",
161 "I want to live forever or die in the attempt.",
163 "LOST IN THOUGHT - please send search party",
165 "Minetown Better Business Bureau",
167 "Ms. Palm's House of Negotiable Affection -- A Very Reputable House Of Disrepute",
168 "Protection Racketeer",
169 "Real men love Crom",
170 "Somebody stole my Mojo!",
171 "The Hellhound Gang",
174 "
\82±
\82ê
\82ª
\93Ç
\82ß
\82é
\82È
\82ç
\81A
\8e\84\82Ì
\92·
\95\80\82ª
\93Í
\82
\82Æ
\82¢
\82¤
\82±
\82Æ
\82¾",
175 "
\8e\84\82Í
\8d¬
\97\90\82µ
\82Ä
\82¢
\82Ü
\82·
\81I",
176 "I scored with the princess",
177 "
\8e\84\82Í
\89i
\89\93\82É
\90¶
\82«
\82é
\82©
\81A
\82»
\82Ì
\82½
\82ß
\82É
\8e\80\82É
\82½
\82¢
\81D",
179 "
\8dl
\82¦
\8d\9e\82ñ
\82Å
\82¢
\82Ü
\82· -
\91{
\8dõ
\91à
\82ð
\8fo
\82µ
\82Ä
\82
\82¾
\82³
\82¢",
180 "
\93÷
\82Í
\83\82\83\8b\83h
\81[
\83\8b",
181 "
\8dz
\8eR
\8aX
\8f¤
\8bÆ
\89ü
\91P
\8b¦
\89ï",
182 "
\8dz
\8eR
\8aX
\82Ì
\8c©
\92£
\82è",
183 "
\83p
\81[
\83\80\8f\97\8ej
\82Ì
\8cð
\8fÂ
\8bZ
\8fp
\82Ì
\89Æ --
\82Æ
\82Ä
\82à
\95]
\94»
\82Ì
\88«
\95]
\82Ì
\89Æ",
184 "
\8dz
\8eR
\83_
\83b
\83V
\83\85\92\86",
185 "
\96{
\95¨
\82Ì
\92j
\82Í
\83N
\83\8d\83\80\82ð
\88¤
\82·
\82é",
186 "
\92N
\82©
\82ª
\89´
\82Ì
\83A
\83\8c\82ð
\93\90\82ñ
\82¾
\81I",
187 "The Hellhound Gang",
191 "They Might Be Storm Giants",
192 "Weapons don't kill people, I kill people",
194 "You're killing me!",
195 "Anhur State University - Home of the Fighting Fire Ants!",
198 "Real men are valkyries",
199 "Young Men's Cavedigging Association",
200 "Occupy Fort Ludios",
201 "I couldn't afford this T-shirt so I stole it!",
203 "I'm not wearing any pants",
204 "Down with the living!",
208 "It is better to light a candle than to curse the darkness",
209 "It is easier to curse the darkness than to light a candle",
210 /* expanded "rock--paper--scissors" featured in TV show "Big Bang
211 Theory" although they didn't create it (and an actual T-shirt
212 with pentagonal diagram showing which choices defeat which) */
213 "rock--paper--scissors--lizard--Spock!",
214 /* "All men must die -- all men must serve" challange and response
215 from book series _A_Song_of_Ice_and_Fire_ by George R.R. Martin,
216 TV show "Game of Thrones" (probably an actual T-shirt too...) */
217 "/Valar morghulis/ -- /Valar dohaeris/",
219 "
\83[
\83C
\81E
\83}
\83C
\83g
\81E
\83r
\81[
\81E
\83X
\83g
\81[
\83\80\81E
\83W
\83\83\83C
\83A
\83\93\83c",
220 "
\95\90\8aí
\82ª
\90l
\82ð
\8eE
\82·
\82Ì
\82Å
\82Í
\82È
\82¢
\81C
\8e\84\82ª
\90l
\82ð
\8eE
\82·
\82Ì
\82¾",
222 "
\82¢
\82¢
\89Á
\8c¸
\82É
\82µ
\82Ä
\81I",
223 "
\83A
\83\93\83t
\83\8b\8fB
\97§
\91å
\8aw -
\89Î
\8ba
\82Æ
\82Ì
\90í
\82¢
\82Ì
\96{
\8b\92\92n
\81I",
225 "
\93Á
\95Ê
\8f¸
\93V
\8eÒ",
226 "
\96{
\93\96\82Ì
\92j
\82Í
\83o
\83\8b\83L
\83\8a\81[
\82¾",
227 "
\90Â
\94N
\93´
\8cA
\8c@
\8dí
\98A
\96¿",
228 "
\83\8d\81[
\83f
\83B
\83I
\83X
\8dÔ
\82ð
\90è
\8b\92\82¹
\82æ",
229 "
\82±
\82Ì
\82s
\83V
\83\83\83c
\82ð
\94\83\82¤
\82¨
\8bà
\82ª
\82È
\82©
\82Á
\82½
\82Ì
\82Å
\82±
\82ê
\82Í
\93\90\82ñ
\82¾
\81I",
230 "
\83}
\83C
\83\93\83h
\83t
\83\8c\83\84\8e\81\82Ë",
231 "
\8e\84\82Í
\83p
\83\93\83c
\82ð
\90ú
\82¢
\82Ä
\82¢
\82Ü
\82¹
\82ñ",
232 "Down with the living!",
233 "
\83v
\83\8a\83\93\94_
\89Æ",
234 "
\83x
\83W
\83^
\83\8a\83A
\83\93",
235 "
\82â
\82 \81C
\8e\84\82ª
\81w
\90í
\91\88\81x
\82¾
\81I",
236 "It is better to light a candle than to curse the darkness",
237 "It is easier to curse the darkness than to light a candle",
238 /* expanded "rock--paper--scissors" featured in TV show "Big Bang
239 Theory" although they didn't create it (and an actual T-shirt
240 with pentagonal diagram showing which choices defeat which) */
241 "rock--paper--scissors--lizard--Spock!",
242 /* "All men must die -- all men must serve" challange and response
243 from book series _A_Song_of_Ice_and_Fire_ by George R.R. Martin,
244 TV show "Game of Thrones" (probably an actual T-shirt too...) */
245 "/Valar morghulis/ -- /Valar dohaeris/",
249 Strcpy(buf, shirt_msgs[tshirt->o_id % SIZE(shirt_msgs)]);
250 return erode_obj_text(tshirt, buf);
254 apron_text(apron, buf)
258 static const char *apron_msgs[] = {
260 "I'm making SCIENCE!",
261 "Don't mess with the chef",
262 "Don't make me poison you",
263 "Gehennom's Kitchen",
264 "Rat: The other white meat",
265 "If you can't stand the heat, get out of Gehennom!",
266 "If we weren't meant to eat animals, why are they made out of meat?",
267 "If you don't like the food, I'll stab you",
270 Strcpy(buf, apron_msgs[apron->o_id % SIZE(apron_msgs)]);
271 return erode_obj_text(apron, buf);
277 register struct obj *scroll;
278 boolean confused, nodisappear;
281 if (check_capacity((char *) 0))
283 scroll = getobj(readable, "read");
287 /* outrumor has its own blindness check */
288 if (scroll->otyp == FORTUNE_COOKIE) {
291 You("break up the cookie and throw away the pieces.");
293 You("
\83N
\83b
\83L
\81[
\82ð
\8a\84\82è
\81C
\82©
\82¯
\82ç
\82ð
\93\8a\82°
\82·
\82Ä
\82½
\81D");
294 outrumor(bcsign(scroll), BY_COOKIE);
296 u.uconduct.literate++;
299 } else if (scroll->otyp == T_SHIRT || scroll->otyp == ALCHEMY_SMOCK) {
300 char buf[BUFSZ], *mesg;
301 const char *endpunct;
305 You_cant("feel any Braille writing.");
307 You("
\93_
\8e\9a\82Í
\82Ç
\82¤
\82à
\8f\91\82¢
\82Ä
\82È
\82¢
\82æ
\82¤
\82¾
\81D");
310 /* can't read shirt worn under suit (under cloak is ok though) */
311 if (scroll->otyp == T_SHIRT && uarm && scroll == uarmu) {
313 pline("%s shirt is obscured by %s%s.",
314 scroll->unpaid ? "That" : "Your", shk_your(buf, uarm),
315 suit_simple_name(uarm));
317 pline("
\83V
\83\83\83c
\82Í%s
\82Å
\89B
\82³
\82ê
\82Ä
\82¢
\82é
\81D",
318 suit_simple_name(uarm));
322 u.uconduct.literate++;
323 /* populate 'buf[]' */
324 mesg = (scroll->otyp == T_SHIRT) ? tshirt_text(scroll, buf)
325 : apron_text(scroll, buf);
328 int ln = (int) strlen(mesg);
330 /* we will be displaying a sentence; need ending punctuation */
331 if (ln > 0 && !index(".!?", mesg[ln - 1]))
336 pline("
\82»
\82ê
\82ð
\93Ç
\82ñ
\82¾
\81F");
339 pline("\"%s\"%s", mesg, endpunct);
341 pline("
\81u%s
\81v", mesg);
344 } else if (scroll->otyp == CREDIT_CARD) {
345 static const char *card_msgs[] = {
347 "Leprechaun Gold Tru$t - Shamrock Card",
348 "Magic Memory Vault Charge Card",
349 "Larn National Bank", /* Larn */
350 "First Bank of Omega", /* Omega */
351 "Bank of Zork - Frobozz Magic Card", /* Zork */
352 "Ankh-Morpork Merchant's Guild Barter Card",
353 "Ankh-Morpork Thieves' Guild Unlimited Transaction Card",
354 "Ransmannsby Moneylenders Association",
355 "Bank of Gehennom - 99% Interest Card",
356 "Yendorian Express - Copper Card",
357 "Yendorian Express - Silver Card",
358 "Yendorian Express - Gold Card",
359 "Yendorian Express - Mithril Card",
360 "Yendorian Express - Platinum Card", /* must be last */
362 "
\83\8c\83v
\83\89\83R
\81[
\83\93\90M
\97p
\8bà
\8cÉ -
\83N
\83\8d\81[
\83o
\81[
\83J
\81[
\83h",
363 "
\96\82\96@
\8bL
\94O
\91q
\8cÉ
\83N
\83\8c\83W
\83b
\83g
\83J
\81[
\83h", "
\83\89\81[
\83\93\8d\91\89c
\8bâ
\8ds", /* Larn */
364 "
\83I
\83\81\83K
\91æ
\88ê
\8bâ
\8ds", /* Omega */
365 "
\83]
\81[
\83N
\8bâ
\8ds - Bank of Zork -
\83t
\83\8d\83{
\83Y
\96\82\96@
\83J
\81[
\83h", /* Zork */
366 "
\83A
\83\93\83N
\83\82\83\8b\83|
\81[
\83N
\8f¤
\90l
\83M
\83\8b\83h
\8cð
\88Õ
\83J
\81[
\83h",
367 "
\83A
\83\93\83N
\83\82\83\8b\83|
\81[
\83N
\93\90\91¯
\83M
\83\8b\83h
\96³
\90§
\8cÀ
\8eæ
\88ø
\83J
\81[
\83h",
368 "
\83\89\83\93\83X
\83}
\83\93\83X
\83x
\83C
\91Ý
\8bà
\8bÆ
\8b¦
\89ï",
369 "
\83Q
\83w
\83i
\8bâ
\8ds -
\97\98\8eq99%
\83J
\81[
\83h",
370 "
\83C
\83F
\83\93\83_
\81[
\88ó
\83G
\83L
\83X
\83v
\83\8c\83X
\83J
\81[
\83h -
\83J
\83b
\83p
\81[
\83J
\81[
\83h",
371 "
\83C
\83F
\83\93\83_
\81[
\88ó
\83G
\83L
\83X
\83v
\83\8c\83X
\83J
\81[
\83h -
\83V
\83\8b\83o
\81[
\83J
\81[
\83h",
372 "
\83C
\83F
\83\93\83_
\81[
\88ó
\83G
\83L
\83X
\83v
\83\8c\83X
\83J
\81[
\83h -
\83S
\81[
\83\8b\83h
\83J
\81[
\83h",
373 "
\83C
\83F
\83\93\83_
\81[
\88ó
\83G
\83L
\83X
\83v
\83\8c\83X
\83J
\81[
\83h -
\83~
\83X
\83\8a\83\8b\83J
\81[
\83h",
374 "
\83C
\83F
\83\93\83_
\81[
\88ó
\83G
\83L
\83X
\83v
\83\8c\83X
\83J
\81[
\83h -
\83v
\83\89\83`
\83i
\83J
\81[
\83h", /* must be last */
380 You("feel the embossed numbers:");
382 You("
\95\82\82«
\92¤
\82è
\82É
\82³
\82ê
\82Ä
\82¢
\82é
\94Ô
\8d\86\82ð
\8a´
\82¶
\82½:");
388 pline("
\82»
\82ê
\82ð
\93Ç
\82ñ
\82¾
\81F");
394 ? card_msgs[SIZE(card_msgs) - 1]
395 : card_msgs[scroll->o_id % (SIZE(card_msgs) - 1)]);
397 /* Make a credit card number */
398 pline("\"%d0%d %ld%d1 0%d%d0\"%s",
399 (((int) scroll->o_id % 89) + 10),
400 ((int) scroll->o_id % 4),
401 ((((long) scroll->o_id * 499L) % 899999L) + 100000L),
402 ((int) scroll->o_id % 10),
403 (!((int) scroll->o_id % 3)),
404 (((int) scroll->o_id * 7) % 10),
405 (flags.verbose || Blind) ? "." : "");
406 u.uconduct.literate++;
408 } else if (scroll->otyp == CAN_OF_GREASE) {
410 pline("This %s has no label.", singular(scroll, xname));
412 pline("
\82±
\82Ì%s
\82É
\82Í
\83\89\83x
\83\8b\82ª
\82È
\82¢
\81D", singular(scroll, xname));
414 } else if (scroll->otyp == MAGIC_MARKER) {
417 You_cant("feel any Braille writing.");
419 pline("
\93_
\8e\9a\82Í
\82Ç
\82¤
\82à
\8f\91\82¢
\82Ä
\82È
\82¢
\82æ
\82¤
\82¾
\81D");
426 pline("
\82»
\82ê
\82ð
\93Ç
\82ñ
\82¾
\81F");
428 pline("\"Magic Marker(TM) Red Ink Marker Pen. Water Soluble.\"");
430 pline("
\81u
\96\82\96@
\82Ì
\83}
\81[
\83J(TM)
\90Ô
\83C
\83\93\83N
\83}
\81[
\83J
\83y
\83\93\81D
\90\85\90«
\81D
\81v");
431 u.uconduct.literate++;
433 } else if (scroll->oclass == COIN_CLASS) {
436 You("feel the embossed words:");
438 You("
\95\82\82«
\92¤
\82è
\82É
\82³
\82ê
\82Ä
\82¢
\82é
\95¶
\8e\9a\82ð
\8a´
\82¶
\82½:");
439 else if (flags.verbose)
443 pline("
\82»
\82ê
\82ð
\93Ç
\82ñ
\82¾
\81F");
444 pline("\"1 Zorkmid. 857 GUE. In Frobs We Trust.\"");
445 u.uconduct.literate++;
447 } else if (scroll->oartifact == ART_ORB_OF_FATE) {
450 You("feel the engraved signature:");
452 You("
\92¤
\82è
\8d\9e\82Ü
\82ê
\82Ä
\82¢
\82é
\83T
\83C
\83\93\82ð
\8a´
\82¶
\82½
\81F");
455 pline("It is signed:");
457 pline("
\83T
\83C
\83\93\82ª
\82 \82é
\81F");
461 pline("
\81u
\83I
\81[
\83f
\83B
\83\93\81v");
462 u.uconduct.literate++;
464 } else if (scroll->otyp == CANDY_BAR) {
465 static const char *wrapper_msgs[] = {
467 "Moon Crunchy", /* South Park */
468 "Snacky Cake", "Chocolate Nuggie", "The Small Bar",
469 "Crispy Yum Yum", "Nilla Crunchie", "Berry Bar",
470 "Choco Nummer", "Om-nom", /* Cat Macro */
471 "Fruity Oaty", /* Serenity */
472 "Wonka Bar" /* Charlie and the Chocolate Factory */
477 You_cant("feel any Braille writing.");
479 pline("
\93_
\8e\9a\82Í
\82Ç
\82¤
\82à
\8f\91\82¢
\82Ä
\82È
\82¢
\82æ
\82¤
\82¾
\81D");
483 pline("The wrapper reads: \"%s\".",
484 wrapper_msgs[scroll->o_id % SIZE(wrapper_msgs)]);
486 pline("
\95ï
\82Ý
\8e\86\82Ì
\95¶
\8e\9a\82ð
\93Ç
\82ñ
\82¾
\81F
\81u%s
\81v.",
487 wrapper_msgs[scroll->o_id % SIZE(wrapper_msgs)]);
489 u.uconduct.literate++;
491 } else if (scroll->oclass != SCROLL_CLASS
492 && scroll->oclass != SPBOOK_CLASS) {
494 pline(silly_thing_to, "read");
496 pline(silly_thing_to, "
\93Ç
\82Þ");
498 } else if (Blind && (scroll->otyp != SPE_BOOK_OF_THE_DEAD)) {
499 const char *what = 0;
500 if (scroll->oclass == SPBOOK_CLASS)
502 what = "mystic runes";
504 what = "
\90_
\94é
\93I
\82È
\83\8b\81[
\83\93\95¶
\8e\9a";
505 else if (!scroll->dknown)
507 what = "formula on the scroll";
509 what = "
\8aª
\95¨
\82Ì
\8eô
\95¶";
512 pline("Being blind, you cannot read the %s.", what);
514 pline("
\96Ú
\82ª
\8c©
\82¦
\82È
\82¢
\82Ì
\82Å
\81C
\82 \82È
\82½
\82Í%s
\82ð
\93Ç
\82Þ
\82±
\82Æ
\82ª
\82Å
\82«
\82È
\82¢
\81D", what);
519 confused = (Confusion != 0);
521 if (scroll->otyp == SCR_MAIL) {
522 confused = FALSE; /* override */
523 /* reading mail is a convenience for the player and takes
524 place outside the game, so shouldn't affect gameplay;
525 on the other hand, it starts by explicitly making the
526 hero actively read something, which is pretty hard
527 to simply ignore; as a compromise, if the player has
528 maintained illiterate conduct so far, and this mail
529 scroll didn't come from bones, ask for confirmation */
530 if (!u.uconduct.literate) {
532 if (!scroll->spe && yn(
533 "Reading mail will violate \"illiterate\" conduct. Read anyway?"
536 if (!scroll->spe && yn(
537 "
\83\81\81[
\83\8b\82ð
\93Ç
\82Þ
\82Æ
\81u
\95¶
\8e\9a\82ð
\93Ç
\82Ü
\82È
\82¢
\81v
\92§
\90í
\82É
\88á
\94½
\82·
\82é
\82¯
\82Ç
\81C
\82»
\82ê
\82Å
\82à
\93Ç
\82Þ
\81H"
545 /* Actions required to win the game aren't counted towards conduct */
546 /* Novel conduct is handled in read_tribute so exclude it too*/
547 if (scroll->otyp != SPE_BOOK_OF_THE_DEAD
548 && scroll->otyp != SPE_BLANK_PAPER && scroll->otyp != SCR_BLANK_PAPER
549 && scroll->otyp != SPE_NOVEL)
550 u.uconduct.literate++;
552 if (scroll->oclass == SPBOOK_CLASS) {
553 return study_book(scroll);
555 scroll->in_use = TRUE; /* scroll, not spellbook, now being read */
556 if (scroll->otyp != SCR_BLANK_PAPER) {
557 boolean silently = !can_chant(&youmonst);
559 /* a few scroll feedback messages describe something happening
560 to the scroll itself, so avoid "it disappears" for those */
561 nodisappear = (scroll->otyp == SCR_FIRE
562 || (scroll->otyp == SCR_REMOVE_CURSE
567 ? "You %s the formula on the scroll."
568 : "As you %s the formula on it, the scroll disappears.",
569 silently ? "cogitate" : "pronounce");
572 ? "
\82 \82È
\82½
\82Í
\8eô
\95¶
\82ð%s
\82½
\81D"
573 : "
\8eô
\95¶
\82ð%s
\82é
\82Æ
\81C
\8aª
\95¨
\82Í
\8fÁ
\82¦
\82½
\81D",
574 silently ? "
\94O
\82¶" : "
\8f¥
\82¦");
578 pline(nodisappear ? "You read the scroll."
579 : "As you read the scroll, it disappears.");
581 pline(nodisappear ? "
\82 \82È
\82½
\82Í
\8aª
\95¨
\82ð
\93Ç
\82ñ
\82¾
\81D"
582 : "
\8aª
\95¨
\82ð
\93Ç
\82Þ
\82Æ
\81C
\82»
\82ê
\82Í
\8fÁ
\82¦
\82½
\81D");
587 pline("Being so trippy, you screw up...");
589 pline("
\82Æ
\82Ä
\82à
\82Ö
\82ë
\82Ö
\82ë
\82È
\82Ì
\82Å
\81C
\82
\82µ
\82á
\82
\82µ
\82á
\82É
\82µ
\82Ä
\82µ
\82Ü
\82Á
\82½
\81D
\81D
\81D");
592 pline("Being confused, you %s the magic words...",
593 silently ? "misunderstand" : "mispronounce");
595 pline("
\8d¬
\97\90\82µ
\82Ä
\82¢
\82é
\82Ì
\82Å
\81C
\8eô
\95¶
\82ð
\8aÔ
\88á
\82Á
\82Ä
\82µ
\82Ü
\82Á
\82½
\81D
\81D
\81D");
599 if (!seffects(scroll)) {
600 if (!objects[scroll->otyp].oc_name_known) {
603 else if (!objects[scroll->otyp].oc_uname)
606 scroll->in_use = FALSE;
607 if (scroll->otyp != SCR_BLANK_PAPER)
615 register struct obj *obj;
617 if (obj->blessed || obj->spe <= 0) {
618 pline1(nothing_happens);
620 /* order matters: message, shop handling, actual transformation */
622 pline("%s briefly.", Yobjnam2(obj, "vibrate"));
624 Your("%s
\82Í
\8f¬
\8d\8f\82Ý
\82É
\90U
\93®
\82µ
\82½
\81D",xname(obj));
625 costly_alteration(obj, COST_UNCHRG);
627 if (obj->otyp == OIL_LAMP || obj->otyp == BRASS_LANTERN)
634 register struct obj *otmp;
637 pline("%s briefly.", Yobjnam2(otmp, Blind ? "vibrate" : "glow"));
639 Your("%s
\82Í
\8f¬
\8d\8f\82Ý
\82É%s
\81D", xname(otmp), Blind ? "
\90U
\93®
\82µ
\82½" : "
\8bP
\82¢
\82½");
644 register struct obj *otmp;
645 register const char *color;
648 pline("%s%s%s for a moment.", Yobjnam2(otmp, Blind ? "vibrate" : "glow"),
649 Blind ? "" : " ", Blind ? "" : hcolor(color));
651 Your("%s
\82Í
\88ê
\8fu%s%s
\81D", xname(otmp),
652 Blind ? "" : jconj_adj(hcolor(color)),
653 Blind ? "
\90U
\93®
\82µ
\82½" : "
\8bP
\82¢
\82½");
657 /* Is the object chargeable? For purposes of inventory display; it is
658 possible to be able to charge things for which this returns FALSE. */
663 if (obj->oclass == WAND_CLASS)
665 /* known && !oc_name_known is possible after amnesia/mind flayer */
666 if (obj->oclass == RING_CLASS)
667 return (boolean) (objects[obj->otyp].oc_charged
670 && objects[obj->otyp].oc_name_known)));
671 if (is_weptool(obj)) /* specific check before general tools */
673 if (obj->oclass == TOOL_CLASS)
674 return (boolean) objects[obj->otyp].oc_charged;
675 return FALSE; /* why are weapons/armor considered charged anyway? */
678 /* recharge an object; curse_bless is -1 if the recharging implement
679 was cursed, +1 if blessed, 0 otherwise. */
681 recharge(obj, curse_bless)
686 boolean is_cursed, is_blessed;
688 is_cursed = curse_bless < 0;
689 is_blessed = curse_bless > 0;
691 if (obj->oclass == WAND_CLASS) {
692 int lim = (obj->otyp == WAN_WISHING)
694 : (objects[obj->otyp].oc_dir != NODIR) ? 8 : 15;
696 /* undo any prior cancellation, even when is_cursed */
701 * Recharging might cause wands to explode.
702 * v = number of previous recharges
703 * v = percentage chance to explode on this attempt
704 * v = cumulative odds for exploding
714 n = (int) obj->recharged;
715 if (n > 0 && (obj->otyp == WAN_WISHING
716 || (n * n * n > rn2(7 * 7 * 7)))) { /* recharge_limit */
717 wand_explode(obj, rnd(lim));
720 /* didn't explode, so increment the recharge count */
721 obj->recharged = (unsigned) (n + 1);
723 /* now handle the actual recharging */
727 n = (lim == 3) ? 3 : rn1(5, lim + 1 - 5);
735 if (obj->otyp == WAN_WISHING && obj->spe > 3) {
736 wand_explode(obj, 1);
740 p_glow2(obj, NH_BLUE);
743 #if 0 /*[shop price doesn't vary by charge count]*/
744 /* update shop bill to reflect new higher price */
750 } else if (obj->oclass == RING_CLASS && objects[obj->otyp].oc_charged) {
751 /* charging does not affect ring's curse/bless status */
752 int s = is_blessed ? rnd(3) : is_cursed ? -rnd(2) : 1;
753 boolean is_on = (obj == uleft || obj == uright);
755 /* destruction depends on current state, not adjustment */
756 if (obj->spe > rn2(7) || obj->spe <= -5) {
758 pline("%s momentarily, then %s!", Yobjnam2(obj, "pulsate"),
759 otense(obj, "explode"));
761 Your("%s
\82Í
\88ê
\8fu
\96¬
\93®
\82µ
\81C
\94\9a\94
\82µ
\82½
\81I", xname(obj));
765 s = rnd(3 * abs(obj->spe)); /* amount of damage */
768 losehp(Maybe_Half_Phys(s), "exploding ring", KILLED_BY_AN);
770 losehp(Maybe_Half_Phys(s), "
\8ew
\97Ö
\82Ì
\94\9a\94
\82Å", KILLED_BY_AN);
772 long mask = is_on ? (obj == uleft ? LEFT_RING : RIGHT_RING) : 0L;
775 pline("%s spins %sclockwise for a moment.", Yname2(obj),
776 s < 0 ? "counter" : "");
778 Your("%s
\82Í
\88ê
\8fu%s
\8e\9e\8cv
\89ñ
\82è
\82É
\89ñ
\93]
\82µ
\82½
\81D", xname(obj),
779 s < 0 ? "
\94½" : "");
782 costly_alteration(obj, COST_DECHNT);
783 /* cause attributes and/or properties to be updated */
786 obj->spe += s; /* update the ring while it's off */
788 setworn(obj, mask), Ring_on(obj);
789 /* oartifact: if a touch-sensitive artifact ring is
790 ever created the above will need to be revised */
791 /* update shop bill to reflect new higher price */
792 if (s > 0 && obj->unpaid)
796 } else if (obj->oclass == TOOL_CLASS) {
797 int rechrg = (int) obj->recharged;
799 if (objects[obj->otyp].oc_charged) {
800 /* tools don't have a limit, but the counter used does */
801 if (rechrg < 7) /* recharge_limit */
805 case BELL_OF_OPENING:
817 case EXPENSIVE_CAMERA:
822 == MAGIC_MARKER) { /* previously recharged */
823 obj->recharged = 1; /* override increment done above */
826 Your("marker seems permanently dried out.");
828 Your("
\83}
\81[
\83J
\82Í
\8a®
\91S
\82É
\8a£
\82«
\82«
\82Á
\82Ä
\82µ
\82Ü
\82Á
\82½
\81D");
830 pline1(nothing_happens);
831 } else if (is_blessed) {
832 n = rn1(16, 15); /* 15..30 */
833 if (obj->spe + n <= 50)
835 else if (obj->spe + n <= 75)
838 int chrg = (int) obj->spe;
839 if ((chrg + n) > 127)
844 p_glow2(obj, NH_BLUE);
846 n = rn1(11, 10); /* 10..20 */
847 if (obj->spe + n <= 50)
850 int chrg = (int) obj->spe;
851 if ((chrg + n) > 127)
856 p_glow2(obj, NH_WHITE);
866 pline("%s out!", Tobjnam(obj, "go"));
868 pline("%s
\82Í
\8fÁ
\82¦
\82½
\81I", xname(obj));
872 } else if (is_blessed) {
875 p_glow2(obj, NH_BLUE);
887 } else if (is_blessed) {
889 p_glow2(obj, NH_BLUE);
895 pline1(nothing_happens);
903 } else if (is_blessed) {
905 obj->spe += rn1(10, 6);
907 obj->spe += rn1(5, 6);
910 p_glow2(obj, NH_BLUE);
922 case DRUM_OF_EARTHQUAKE:
925 } else if (is_blessed) {
929 p_glow2(obj, NH_BLUE);
946 You("have a feeling of loss.");
948 You("
\82È
\82É
\82©
\91¹
\82µ
\82½
\8bC
\95ª
\82É
\82È
\82Á
\82½
\81D");
952 /* Forget known information about this object type. */
954 forget_single_object(obj_id)
957 objects[obj_id].oc_name_known = 0;
958 objects[obj_id].oc_pre_discovered = 0; /* a discovery when relearned */
959 if (objects[obj_id].oc_uname) {
960 free((genericptr_t) objects[obj_id].oc_uname);
961 objects[obj_id].oc_uname = 0;
963 undiscover_object(obj_id); /* after clearing oc_name_known */
965 /* clear & free object names from matching inventory items too? */
968 #if 0 /* here if anyone wants it.... */
969 /* Forget everything known about a particular object class. */
971 forget_objclass(oclass)
976 for (i = bases[oclass];
977 i < NUM_OBJECTS && objects[i].oc_class == oclass; i++)
978 forget_single_object(i);
982 /* randomize the given list of numbers 0 <= i < count */
984 randomize(indices, count)
990 for (i = count - 1; i > 0; i--) {
991 if ((iswap = rn2(i + 1)) == i)
994 indices[i] = indices[iswap];
995 indices[iswap] = temp;
999 /* Forget % of known objects. */
1001 forget_objects(percent)
1005 int indices[NUM_OBJECTS];
1009 if (percent <= 0 || percent > 100) {
1010 impossible("forget_objects: bad percent %d", percent);
1014 indices[0] = 0; /* lint suppression */
1015 for (count = 0, i = 1; i < NUM_OBJECTS; i++)
1016 if (OBJ_DESCR(objects[i])
1017 && (objects[i].oc_name_known || objects[i].oc_uname))
1018 indices[count++] = i;
1021 randomize(indices, count);
1023 /* forget first % of randomized indices */
1024 count = ((count * percent) + rn2(100)) / 100;
1025 for (i = 0; i < count; i++)
1026 forget_single_object(indices[i]);
1030 /* Forget some or all of map (depends on parameters). */
1035 register int zx, zy;
1041 for (zx = 0; zx < COLNO; zx++)
1042 for (zy = 0; zy < ROWNO; zy++)
1043 if (howmuch & ALL_MAP || rn2(7)) {
1044 /* Zonk all memory of this location. */
1045 levl[zx][zy].seenv = 0;
1046 levl[zx][zy].waslit = 0;
1047 levl[zx][zy].glyph = cmap_to_glyph(S_stone);
1048 lastseentyp[zx][zy] = STONE;
1050 /* forget overview data for this level */
1051 forget_mapseen(ledger_no(&u.uz));
1054 /* Forget all traps on the level. */
1058 register struct trap *trap;
1060 /* forget all traps (except the one the hero is in :-) */
1061 for (trap = ftrap; trap; trap = trap->ntrap)
1062 if ((trap->tx != u.ux || trap->ty != u.uy) && (trap->ttyp != HOLE))
1067 * Forget given % of all levels that the hero has visited and not forgotten,
1071 forget_levels(percent)
1075 xchar maxl, this_lev;
1076 int indices[MAXLINFO];
1081 if (percent <= 0 || percent > 100) {
1082 impossible("forget_levels: bad percent %d", percent);
1086 this_lev = ledger_no(&u.uz);
1087 maxl = maxledgerno();
1089 /* count & save indices of non-forgotten visited levels */
1090 /* Sokoban levels are pre-mapped for the player, and should stay
1091 * so, or they become nearly impossible to solve. But try to
1092 * shift the forgetting elsewhere by fiddling with percent
1093 * instead of forgetting fewer levels.
1095 indices[0] = 0; /* lint suppression */
1096 for (count = 0, i = 0; i <= maxl; i++)
1097 if ((level_info[i].flags & VISITED)
1098 && !(level_info[i].flags & FORGOTTEN) && i != this_lev) {
1099 if (ledger_to_dnum(i) == sokoban_dnum)
1102 indices[count++] = i;
1109 randomize(indices, count);
1111 /* forget first % of randomized indices */
1112 count = ((count * percent) + 50) / 100;
1113 for (i = 0; i < count; i++) {
1114 level_info[indices[i]].flags |= FORGOTTEN;
1115 forget_mapseen(indices[i]);
1121 * Forget some things (e.g. after reading a scroll of amnesia). When called,
1122 * the following are always forgotten:
1123 * - felt ball & chain
1125 * - part (6 out of 7) of the map
1127 * Other things are subject to flags:
1128 * howmuch & ALL_MAP = forget whole map
1129 * howmuch & ALL_SPELLS = forget all spells
1136 u.bc_felt = 0; /* forget felt ball&chain */
1138 forget_map(howmuch);
1141 /* 1 in 3 chance of forgetting some levels */
1143 forget_levels(rn2(25));
1145 /* 1 in 3 chance of forgetting some objects */
1147 forget_objects(rn2(25));
1149 if (howmuch & ALL_SPELLS)
1152 * Make sure that what was seen is restored correctly. To do this,
1153 * we need to go blind for an instant --- turn off the display,
1154 * then restart it. All this work is needed to correctly handle
1155 * walls which are stone on one side and wall on the other. Turning
1156 * off the seen bits above will make the wall revert to stone, but
1157 * there are cases where we don't want this to happen. The easiest
1158 * thing to do is to run it through the vision system again, which
1159 * is always correct.
1161 docrt(); /* this correctly will reset vision */
1164 /* monster is hit by scroll of taming's effect */
1166 maybe_tame(mtmp, sobj)
1170 int was_tame = mtmp->mtame;
1171 unsigned was_peaceful = mtmp->mpeaceful;
1174 setmangry(mtmp, FALSE);
1175 if (was_peaceful && !mtmp->mpeaceful)
1179 make_happy_shk(mtmp, FALSE);
1180 else if (!resist(mtmp, sobj->oclass, 0, NOTELL))
1181 (void) tamedog(mtmp, (struct obj *) 0);
1182 if ((!was_peaceful && mtmp->mpeaceful) || (!was_tame && mtmp->mtame))
1189 get_valid_stinking_cloud_pos(x,y)
1192 return (!(!isok(x,y) || !cansee(x, y)
1193 || !ACCESSIBLE(levl[x][y].typ)
1194 || distu(x, y) >= 32));
1198 is_valid_stinking_cloud_pos(x, y, showmsg)
1202 if (!get_valid_stinking_cloud_pos(x,y)) {
1205 You("smell rotten eggs.");
1207 pline("
\82
\82³
\82Á
\82½
\97\91\82Ì
\82É
\82¨
\82¢
\82ª
\82µ
\82½
\81D");
1214 display_stinking_cloud_positions(state)
1218 tmp_at(DISP_BEAM, cmap_to_glyph(S_goodpos));
1219 } else if (state == 1) {
1223 for (dx = -dist; dx <= dist; dx++)
1224 for (dy = -dist; dy <= dist; dy++) {
1227 if (get_valid_stinking_cloud_pos(x,y))
1231 tmp_at(DISP_END, 0);
1235 /* scroll effects; return 1 if we use up the scroll and possibly make it
1236 become discovered, 0 if caller should take care of those side-effects */
1239 struct obj *sobj; /* scroll, or fake spellbook object for scroll-like spell */
1241 int cval, otyp = sobj->otyp;
1242 boolean confused = (Confusion != 0), sblessed = sobj->blessed,
1243 scursed = sobj->cursed, already_known, old_erodeproof,
1247 if (objects[otyp].oc_magic)
1248 exercise(A_WIS, TRUE); /* just for trying */
1249 already_known = (sobj->oclass == SPBOOK_CLASS /* spell */
1250 || objects[otyp].oc_name_known);
1257 /* "stamped scroll" created via magic marker--without a stamp */
1259 pline("This scroll is marked \"postage due\".");
1261 pline("
\82±
\82Ì
\8aª
\95¨
\82É
\82Í
\81u
\97¿
\8bà
\95s
\91«
\81v
\82Æ
\8f\91\82¢
\82Ä
\82 \82é
\81D");
1263 /* scroll of mail obtained from bones file or from wishing;
1264 * note to the puzzled: the game Larn actually sends you junk
1269 "This seems to be junk mail addressed to the finder of the Eye of Larn.");
1271 "Eye of Larn
\82Ì
\94
\8c©
\8eÒ
\82É
\88¶
\82Ä
\82ç
\82ê
\82½
\83S
\83~
\83\81\83C
\83\8b\82Ì
\82æ
\82¤
\82¾
\81D");
1276 case SCR_ENCHANT_ARMOR: {
1278 boolean special_armor;
1281 otmp = some_armor(&youmonst);
1284 strange_feeling(sobj, !Blind
1285 ? "Your skin glows then fades."
1286 : "Your skin feels warm for a moment.");
1288 strange_feeling(sobj, !Blind
1289 ? "
\82 \82È
\82½
\82Ì
\91Ì
\82Í
\88ê
\8fu
\8bP
\82¢
\82½
\81D"
1290 : "
\82 \82È
\82½
\82Ì
\91Ì
\82Í
\88ê
\8fu
\92g
\82©
\82
\82È
\82Á
\82½
\81D");
1292 sobj = 0; /* useup() in strange_feeling() */
1293 exercise(A_CON, !scursed);
1294 exercise(A_STR, !scursed);
1298 old_erodeproof = (otmp->oerodeproof != 0);
1299 new_erodeproof = !scursed;
1300 otmp->oerodeproof = 0; /* for messages */
1302 otmp->rknown = FALSE;
1304 pline("%s warm for a moment.", Yobjnam2(otmp, "feel"));
1306 Your("%s
\82Í
\88ê
\8fu
\92g
\82©
\82
\82È
\82Á
\82½
\81D", xname(otmp));
1308 otmp->rknown = TRUE;
1310 pline("%s covered by a %s %s %s!", Yobjnam2(otmp, "are"),
1311 scursed ? "mottled" : "shimmering",
1312 hcolor(scursed ? NH_BLACK : NH_GOLDEN),
1314 : (is_shield(otmp) ? "layer" : "shield"));
1316 Your("%s
\82Í%s%s%s
\82Å
\95¢
\82í
\82ê
\82½
\81I", xname(otmp),
1317 jconj_adj(hcolor(scursed ? NH_BLACK : NH_GOLDEN)),
1318 scursed ? "
\8cõ
\82é
\82Ü
\82¾
\82ç
\82Ì" : "
\82ä
\82ç
\82ß
\82",
1319 scursed ? "
\8bP
\82«"
1320 : "
\83o
\83\8a\83A");
1323 if (new_erodeproof && (otmp->oeroded || otmp->oeroded2)) {
1324 otmp->oeroded = otmp->oeroded2 = 0;
1326 pline("%s as good as new!",
1327 Yobjnam2(otmp, Blind ? "feel" : "look"));
1329 Your("%s
\82Í
\90V
\95i
\93¯
\97l
\82É
\82È
\82Á
\82½
\81I",
1333 if (old_erodeproof && !new_erodeproof) {
1334 /* restore old_erodeproof before shop charges */
1335 otmp->oerodeproof = 1;
1336 costly_alteration(otmp, COST_DEGRD);
1338 otmp->oerodeproof = new_erodeproof ? 1 : 0;
1341 /* elven armor vibrates warningly when enchanted beyond a limit */
1342 special_armor = is_elven_armor(otmp)
1343 || (Role_if(PM_WIZARD) && otmp->otyp == CORNUTHAUM);
1345 same_color = (otmp->otyp == BLACK_DRAGON_SCALE_MAIL
1346 || otmp->otyp == BLACK_DRAGON_SCALES);
1348 same_color = (otmp->otyp == SILVER_DRAGON_SCALE_MAIL
1349 || otmp->otyp == SILVER_DRAGON_SCALES
1350 || otmp->otyp == SHIELD_OF_REFLECTION);
1354 /* KMH -- catch underflow */
1355 s = scursed ? -otmp->spe : otmp->spe;
1356 if (s > (special_armor ? 5 : 3) && rn2(s)) {
1357 otmp->in_use = TRUE;
1359 pline("%s violently %s%s%s for a while, then %s.", Yname2(otmp),
1360 otense(otmp, Blind ? "vibrate" : "glow"),
1361 (!Blind && !same_color) ? " " : "",
1362 (Blind || same_color) ? "" : hcolor(scursed ? NH_BLACK
1364 otense(otmp, "evaporate"));
1366 Your("%s
\82Í
\82µ
\82Î
\82ç
\82
\82Ì
\8aÔ
\8c\83\82µ
\82%s%s
\81C
\8fö
\94
\82µ
\82½
\81D", xname(otmp),
1367 (Blind || same_color) ? "" : jconj_adj(hcolor(scursed ? NH_BLACK : NH_SILVER)),
1368 Blind ? "
\90U
\93®
\82µ" : "
\8bP
\82«");
1370 remove_worn_item(otmp, FALSE);
1376 ? (rn2(otmp->spe) == 0)
1378 ? rnd(3 - otmp->spe / 3)
1380 if (s >= 0 && Is_dragon_scales(otmp)) {
1381 /* dragon scales get turned into dragon scale mail */
1383 pline("%s merges and hardens!", Yname2(otmp));
1385 Your("%s
\82Í
\97Z
\8d\87\82µ
\8cÅ
\82
\82È
\82Á
\82½
\81I", xname(otmp));
1386 setworn((struct obj *) 0, W_ARM);
1387 /* assumes same order */
1388 otmp->otyp += GRAY_DRAGON_SCALE_MAIL - GRAY_DRAGON_SCALES;
1393 } else if (otmp->cursed)
1396 setworn(otmp, W_ARM);
1398 alter_cost(otmp, 0L); /* shop bill */
1402 pline("%s %s%s%s%s for a %s.", Yname2(otmp),
1403 s == 0 ? "violently " : "",
1404 otense(otmp, Blind ? "vibrate" : "glow"),
1405 (!Blind && !same_color) ? " " : "",
1406 (Blind || same_color)
1407 ? "" : hcolor(scursed ? NH_BLACK : NH_SILVER),
1408 (s * s > 1) ? "while" : "moment");
1410 Your("%s
\82Í%s%s%s%s
\81D", xname(otmp),
1411 (s * s > 1) ? "
\82µ
\82Î
\82ç
\82
\82Ì
\8aÔ" : "
\88ê
\8fu",
1412 s == 0 ? "
\8c\83\82µ
\82" : "",
1413 (Blind || same_color) ? ""
1414 : jconj_adj(hcolor(sobj->cursed ? NH_BLACK : NH_SILVER)),
1415 Blind ? "
\90U
\93®
\82µ
\82½" : "
\8bP
\82¢
\82½");
1417 /* [this cost handling will need updating if shop pricing is
1418 ever changed to care about curse/bless status of armor] */
1420 costly_alteration(otmp, COST_DECHNT);
1421 if (scursed && !otmp->cursed)
1423 else if (sblessed && !otmp->blessed)
1425 else if (!scursed && otmp->cursed)
1430 known = otmp->known;
1431 /* update shop bill to reflect new higher price */
1432 if (s > 0 && otmp->unpaid)
1433 alter_cost(otmp, 0L);
1436 if ((otmp->spe > (special_armor ? 5 : 3))
1437 && (special_armor || !rn2(7)))
1439 pline("%s %s.", Yobjnam2(otmp, "suddenly vibrate"),
1440 Blind ? "again" : "unexpectedly");
1442 Your("%s
\82Í
\93Ë
\91R%s
\90U
\93®
\82µ
\82½
\81D", xname(otmp),
1443 Blind ? "
\82Ü
\82½" : "
\8ev
\82¢
\82à
\82æ
\82ç
\82¸");
1447 case SCR_DESTROY_ARMOR: {
1448 otmp = some_armor(&youmonst);
1452 strange_feeling(sobj, "Your bones itch.");
1454 strange_feeling(sobj, "
\8d\9c\82ª
\83\80\83Y
\83\80\83Y
\82·
\82é
\81D");
1455 sobj = 0; /* useup() in strange_feeling() */
1456 exercise(A_STR, FALSE);
1457 exercise(A_CON, FALSE);
1460 old_erodeproof = (otmp->oerodeproof != 0);
1461 new_erodeproof = scursed;
1462 otmp->oerodeproof = 0; /* for messages */
1463 p_glow2(otmp, NH_PURPLE);
1464 if (old_erodeproof && !new_erodeproof) {
1465 /* restore old_erodeproof before shop charges */
1466 otmp->oerodeproof = 1;
1467 costly_alteration(otmp, COST_DEGRD);
1469 otmp->oerodeproof = new_erodeproof ? 1 : 0;
1472 if (!scursed || !otmp || !otmp->cursed) {
1473 if (!destroy_arm(otmp)) {
1475 strange_feeling(sobj, "Your skin itches.");
1477 strange_feeling(sobj,"
\94ç
\95\86\82ª
\83\80\83Y
\83\80\83Y
\82·
\82é
\81D");
1478 sobj = 0; /* useup() in strange_feeling() */
1479 exercise(A_STR, FALSE);
1480 exercise(A_CON, FALSE);
1484 } else { /* armor and scroll both cursed */
1486 pline("%s.", Yobjnam2(otmp, "vibrate"));
1488 Your("%s
\82Í
\90U
\93®
\82µ
\82½
\81D", xname(otmp));
1489 if (otmp->spe >= -6) {
1493 make_stunned((HStun & TIMEOUT) + (long) rn1(10, 10), TRUE);
1496 case SCR_CONFUSE_MONSTER:
1497 case SPE_CONFUSE_MONSTER:
1498 if (youmonst.data->mlet != S_HUMAN || scursed) {
1501 You_feel("confused.");
1503 You_feel("
\8d¬
\97\90\82µ
\82½
\81D");
1504 make_confused(HConfusion + rnd(100), FALSE);
1505 } else if (confused) {
1508 Your("%s begin to %s%s.", makeplural(body_part(HAND)),
1509 Blind ? "tingle" : "glow ",
1510 Blind ? "" : hcolor(NH_PURPLE));
1512 Your("%s
\82Í%s%s
\82Í
\82¶
\82ß
\82½
\81D", makeplural(body_part(HAND)),
1513 Blind ? "" : jconj_adj(hcolor(NH_PURPLE)),
1514 Blind ? "
\83q
\83\8a\83q
\83\8a\82µ" : "
\8bP
\82«");
1516 make_confused(HConfusion + rnd(100), FALSE);
1519 pline("A %s%s surrounds your %s.",
1520 Blind ? "" : hcolor(NH_RED),
1521 Blind ? "faint buzz" : " glow", body_part(HEAD));
1523 pline("%s%s
\82ª
\82 \82È
\82½
\82Ì%s
\82ð
\8eæ
\82è
\8aª
\82¢
\82½
\81D",
1524 Blind ? "" : jconj_adj(hcolor(NH_RED)),
1525 Blind ? "
\82©
\82·
\82©
\82É
\83u
\81[
\83\93\82Æ
\96Â
\82é
\82à
\82Ì" : "
\8bP
\82
\82à
\82Ì",
1528 make_confused(0L, TRUE);
1533 Your("%s%s %s%s.", makeplural(body_part(HAND)),
1534 Blind ? "" : " begin to glow",
1535 Blind ? (const char *) "tingle" : hcolor(NH_RED),
1536 u.umconf ? " even more" : "");
1538 Your("%s
\82Í%s%s%s
\81D", makeplural(body_part(HAND)),
1539 u.umconf ? "
\8f
\82µ" : "",
1540 Blind ? (const char *) "
\83q
\83\8a\83q
\83\8a\82µ
\82½" : jconj_adj(hcolor(NH_RED)),
1541 Blind ? "" : "
\8bP
\82«
\82Í
\82¶
\82ß
\82½");
1547 Your("%s tingle %s sharply.", makeplural(body_part(HAND)),
1548 u.umconf ? "even more" : "very");
1550 Your("%s
\82Í%s
\83s
\83\8a\83s
\83\8a\82·
\82é
\81D", makeplural(body_part(HAND)),
1551 u.umconf ? "
\8f
\82µ" : "
\82Æ
\82Ä
\82à");
1555 Your("%s glow a%s brilliant %s.",
1556 makeplural(body_part(HAND)),
1557 u.umconf ? "n even more" : "", hcolor(NH_RED));
1559 Your("%s
\82Í%s%s
\96¾
\82é
\82
\8bP
\82¢
\82½
\81D",
1560 makeplural(body_part(HAND)),
1561 u.umconf ? "
\8f
\82µ" : "", jconj_adj(hcolor(NH_RED)));
1563 /* after a while, repeated uses become less effective */
1567 u.umconf += rn1(8, 2);
1571 case SCR_SCARE_MONSTER:
1572 case SPE_CAUSE_FEAR: {
1573 register int ct = 0;
1574 register struct monst *mtmp;
1576 for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) {
1577 if (DEADMONSTER(mtmp))
1579 if (cansee(mtmp->mx, mtmp->my)) {
1580 if (confused || scursed) {
1581 mtmp->mflee = mtmp->mfrozen = mtmp->msleeping = 0;
1583 } else if (!resist(mtmp, sobj->oclass, 0, NOTELL))
1584 monflee(mtmp, 0, FALSE, FALSE);
1586 ct++; /* pets don't laugh at you */
1589 if (otyp == SCR_SCARE_MONSTER || !ct)
1591 You_hear("%s %s.", (confused || scursed) ? "sad wailing"
1592 : "maniacal laughter",
1593 !ct ? "in the distance" : "close by");
1595 You_hear("
\89\93\82
\82Å%s
\82ð
\95·
\82¢
\82½
\81D",
1596 (confused || sobj->cursed) ? "
\94ß
\82µ
\82
\8b\83\82«
\8b©
\82Ô
\90º"
1597 : "
\8b¶
\82Á
\82½
\82æ
\82¤
\82É
\8fÎ
\82¤
\90º");
1601 case SCR_BLANK_PAPER:
1604 You("don't remember there being any magic words on this scroll.");
1606 You("
\8aª
\95¨
\82É
\8eô
\95¶
\82ª
\8f\91\82¢
\82Ä
\82È
\82©
\82Á
\82½
\82±
\82Æ
\82ð
\8ev
\82¢
\82¾
\82µ
\82½
\81D");
1609 pline("This scroll seems to be blank.");
1611 pline("
\82±
\82Ì
\8aª
\95¨
\82É
\82Í
\89½
\82à
\8f\91\82¢
\82Ä
\82È
\82¢
\82æ
\82¤
\82É
\8c©
\82¦
\82é
\81D");
1614 case SCR_REMOVE_CURSE:
1615 case SPE_REMOVE_CURSE: {
1616 register struct obj *obj;
1619 You_feel(!Hallucination
1620 ? (!confused ? "like someone is helping you."
1621 : "like you need some help.")
1622 : (!confused ? "in touch with the Universal Oneness."
1623 : "the power of the Force against you!"));
1626 ? (!confused ? "
\92N
\82©
\82ª
\82 \82È
\82½
\82ð
\8f\95\82¯
\82Ä
\82¢
\82é
\82æ
\82¤
\82È
\8bC
\82ª
\82µ
\82½
\81D"
1627 : "
\8e©
\95ª
\82ª
\8f\95\82¯
\82ð
\95K
\97v
\82Æ
\82µ
\82Ä
\82¢
\82é
\82æ
\82¤
\82È
\8bC
\82ª
\82µ
\82½
\81D")
1628 : (!confused ? "
\89F
\92\88\92²
\98a
\82Ì
\8c´
\97\9d\82É
\90G
\82ê
\82Ä
\82¢
\82é
\82æ
\82¤
\82È
\8bC
\82ª
\82µ
\82½
\81D"
1629 : "
\83t
\83H
\81[
\83X
\82Ì
\97Í
\82ª
\82 \82È
\82½
\82É
\82Í
\82Þ
\82©
\82Á
\82Ä
\82¢
\82é
\82æ
\82¤
\82É
\8a´
\82¶
\82½
\81I"));
1634 pline_The("scroll disintegrates.");
1636 pline("
\8aª
\95¨
\82Í
\95²
\81X
\82É
\82È
\82Á
\82½
\81D");
1638 for (obj = invent; obj; obj = obj->nobj) {
1641 /* gold isn't subject to cursing and blessing */
1642 if (obj->oclass == COIN_CLASS)
1644 wornmask = (obj->owornmask & ~(W_BALL | W_ART | W_ARTI));
1645 if (wornmask && !sblessed) {
1646 /* handle a couple of special cases; we don't
1647 allow auxiliary weapon slots to be used to
1648 artificially increase number of worn items */
1649 if (obj == uswapwep) {
1652 } else if (obj == uquiver) {
1653 if (obj->oclass == WEAPON_CLASS) {
1654 /* mergeable weapon test covers ammo,
1655 missiles, spears, daggers & knives */
1656 if (!objects[obj->otyp].oc_merge)
1658 } else if (obj->oclass == GEM_CLASS) {
1659 /* possibly ought to check whether
1660 alternate weapon is a sling... */
1664 /* weptools don't merge and aren't
1665 reasonable quivered weapons */
1670 if (sblessed || wornmask || obj->otyp == LOADSTONE
1671 || (obj->otyp == LEASH && obj->leashmon)) {
1672 /* water price varies by curse/bless status */
1673 boolean shop_h2o = (obj->unpaid && obj->otyp == POT_WATER);
1676 blessorcurse(obj, 2);
1677 /* lose knowledge of this object's curse/bless
1678 state (even if it didn't actually change) */
1680 /* blessorcurse() only affects uncursed items
1681 so no need to worry about price of water
1682 going down (hence no costly_alteration) */
1683 if (shop_h2o && (obj->cursed || obj->blessed))
1684 alter_cost(obj, 0L); /* price goes up */
1685 } else if (obj->cursed) {
1687 costly_alteration(obj, COST_UNCURS);
1693 if (Punished && !confused)
1695 if (u.utrap && u.utraptype == TT_BURIEDBALL) {
1696 buried_ball_to_freedom();
1698 pline_The("clasp on your %s vanishes.", body_part(LEG));
1700 pline_The("%s
\82Ì
\8bà
\8bï
\82ª
\8fÁ
\82¦
\82½
\81D", body_part(LEG));
1705 case SCR_CREATE_MONSTER:
1706 case SPE_CREATE_MONSTER:
1707 if (create_critters(1 + ((confused || scursed) ? 12 : 0)
1708 + ((sblessed || rn2(73)) ? 0 : rnd(4)),
1709 confused ? &mons[PM_ACID_BLOB]
1710 : (struct permonst *) 0,
1713 /* no need to flush monsters; we ask for identification only if the
1714 * monsters are not visible
1717 case SCR_ENCHANT_WEAPON:
1718 /* [What about twoweapon mode? Proofing/repairing/enchanting both
1719 would be too powerful, but shouldn't we choose randomly between
1720 primary and secondary instead of always acting on primary?] */
1721 if (confused && uwep
1722 && erosion_matters(uwep) && uwep->oclass != ARMOR_CLASS) {
1723 old_erodeproof = (uwep->oerodeproof != 0);
1724 new_erodeproof = !scursed;
1725 uwep->oerodeproof = 0; /* for messages */
1727 uwep->rknown = FALSE;
1729 Your("weapon feels warm for a moment.");
1731 pline("
\95\90\8aí
\82ª
\88ê
\8fu
\92g
\82©
\82
\82È
\82Á
\82½
\82æ
\82¤
\82È
\8bC
\82ª
\82µ
\82½
\81D");
1733 uwep->rknown = TRUE;
1735 pline("%s covered by a %s %s %s!", Yobjnam2(uwep, "are"),
1736 scursed ? "mottled" : "shimmering",
1737 hcolor(scursed ? NH_PURPLE : NH_GOLDEN),
1738 scursed ? "glow" : "shield");
1740 Your("%s
\82Í%s%s%s
\82Å
\95¢
\82í
\82ê
\82½
\81I", xname(uwep),
1741 jconj_adj(hcolor(scursed ? NH_PURPLE : NH_GOLDEN)),
1742 scursed ? "
\8cõ
\82é
\82Ü
\82¾
\82ç
\82Ì" : "
\82ä
\82ç
\82ß
\82",
1743 scursed ? "
\8bP
\82«" : "
\83o
\83\8a\83A");
1746 if (new_erodeproof && (uwep->oeroded || uwep->oeroded2)) {
1747 uwep->oeroded = uwep->oeroded2 = 0;
1749 pline("%s as good as new!",
1750 Yobjnam2(uwep, Blind ? "feel" : "look"));
1752 pline("%s
\82Í
\90V
\95i
\93¯
\97l
\82É
\82È
\82Á
\82½
\81I", xname(uwep));
1755 if (old_erodeproof && !new_erodeproof) {
1756 /* restore old_erodeproof before shop charges */
1757 uwep->oerodeproof = 1;
1758 costly_alteration(uwep, COST_DEGRD);
1760 uwep->oerodeproof = new_erodeproof ? 1 : 0;
1763 if (!chwepon(sobj, scursed ? -1
1765 : (uwep->spe >= 9) ? !rn2(uwep->spe)
1766 : sblessed ? rnd(3 - uwep->spe / 3)
1768 sobj = 0; /* nothing enchanted: strange_feeling -> useup */
1771 case SPE_CHARM_MONSTER: {
1772 int candidates, res, results, vis_results;
1776 results = vis_results = maybe_tame(u.ustuck, sobj);
1778 int i, j, bd = confused ? 5 : 1;
1781 /* note: maybe_tame() can return either positive or
1782 negative values, but not both for the same scroll */
1783 candidates = results = vis_results = 0;
1784 for (i = -bd; i <= bd; i++)
1785 for (j = -bd; j <= bd; j++) {
1786 if (!isok(u.ux + i, u.uy + j))
1788 if ((mtmp = m_at(u.ux + i, u.uy + j)) != 0
1789 || (!i && !j && (mtmp = u.usteed) != 0)) {
1791 res = maybe_tame(mtmp, sobj);
1793 if (canspotmon(mtmp))
1800 pline("Nothing interesting %s.",
1801 !candidates ? "happens" : "seems to happen");
1803 pline("
\89½
\82à
\96Ê
\94\92\82¢
\82±
\82Æ
\82Í
\82¨
\82±
\82ç
\82È
\82©
\82Á
\82½%s
\81D",
1804 !candidates ? "" : "
\82æ
\82¤
\82¾");
1808 pline_The("neighborhood %s %sfriendlier.",
1809 vis_results ? "is" : "seems",
1810 (results < 0) ? "un" : "");
1812 pline_The("
\82¨
\97×
\82Æ
\82Ì
\92\87\82ª%s
\82
\82È
\82Á
\82½%s
\81D",
1813 (results < 0) ? "
\88«" : "
\97Ç",
1814 vis_results ? "" : "
\82æ
\82¤
\82¾");
1816 if (vis_results > 0)
1824 You("have found a scroll of genocide!");
1826 pline("
\82±
\82ê
\82Í
\8bs
\8eE
\82Ì
\8aª
\95¨
\82¾
\81I");
1829 do_class_genocide();
1831 do_genocide((!scursed) | (2 * !!Confusion));
1834 if (!confused || rn2(5)) {
1837 litroom(!confused && !scursed, sobj);
1838 if (!confused && !scursed) {
1839 if (lightdamage(sobj, TRUE, 5))
1843 /* could be scroll of create monster, don't set known ...*/
1844 (void) create_critters(1, !scursed ? &mons[PM_YELLOW_LIGHT]
1845 : &mons[PM_BLACK_LIGHT],
1849 case SCR_TELEPORTATION:
1850 if (confused || scursed) {
1853 known = scrolltele(sobj);
1856 case SCR_GOLD_DETECTION:
1857 if ((confused || scursed) ? trap_detect(sobj) : gold_detect(sobj))
1858 sobj = 0; /* failure: strange_feeling() -> useup() */
1860 case SCR_FOOD_DETECTION:
1861 case SPE_DETECT_FOOD:
1862 if (food_detect(sobj))
1863 sobj = 0; /* nothing detected: strange_feeling -> useup */
1866 /* known = TRUE; -- handled inline here */
1867 /* use up the scroll first, before makeknown() performs a
1868 perm_invent update; also simplifies empty invent check */
1870 sobj = 0; /* it's gone */
1873 You("identify this as an identify scroll.");
1875 You("
\82±
\82ê
\82Í
\8e¯
\95Ê
\82Ì
\8aª
\95¨
\82¾
\82Æ
\8e¯
\95Ê
\82µ
\82½
\81D");
1876 else if (!already_known || !invent)
1877 /* force feedback now if invent became
1878 empty after using up this scroll */
1880 pline("This is an identify scroll.");
1882 pline("
\82±
\82ê
\82Í
\8e¯
\95Ê
\82Ì
\8aª
\95¨
\82¾
\81D");
1884 (void) learnscrolltyp(SCR_IDENTIFY);
1888 if (sblessed || (!scursed && !rn2(5))) {
1890 /* note: if cval==0, identify all items */
1891 if (cval == 1 && sblessed && Luck > 0)
1894 if (invent && !confused) {
1895 identify_pack(cval, !already_known);
1896 } else if (otyp == SPE_IDENTIFY) {
1897 /* when casting a spell we know we're not confused,
1898 so inventory must be empty (another message has
1899 already been given above if reading a scroll) */
1901 pline("You're not carrying anything to be identified.");
1903 pline("
\82 \82È
\82½
\82Í
\8e¯
\95Ê
\82Å
\82«
\82é
\82à
\82Ì
\82ð
\82È
\82É
\82à
\8e\9d\82Á
\82Ä
\82¢
\82È
\82¢
\81D");
1910 You_feel("discharged.");
1912 You_feel("
\95ú
\8fo
\82³
\82ê
\82½
\8bC
\82ª
\82·
\82é
\81D");
1916 You_feel("charged up!");
1918 You_feel("
\8f[
\93U
\82³
\82ê
\82½
\82æ
\82¤
\82È
\8bC
\82ª
\82·
\82é
\81I");
1919 u.uen += d(sblessed ? 6 : 4, 4);
1920 if (u.uen > u.uenmax) /* if current energy is already at */
1921 u.uenmax = u.uen; /* or near maximum, increase maximum */
1923 u.uen = u.uenmax; /* otherwise restore current to max */
1928 /* known = TRUE; -- handled inline here */
1929 if (!already_known) {
1931 pline("This is a charging scroll.");
1933 pline("
\82±
\82ê
\82Í
\8f[
\93U
\82Ì
\8aª
\95¨
\82¾
\81I");
1936 /* use it up now to prevent it from showing in the
1937 getobj picklist because the "disappears" message
1938 was already delivered */
1940 sobj = 0; /* it's gone */
1941 otmp = getobj(all_count, "charge");
1943 recharge(otmp, scursed ? -1 : sblessed ? 1 : 0);
1945 case SCR_MAGIC_MAPPING:
1946 if (level.flags.nommap) {
1948 Your("mind is filled with crazy lines!");
1950 Your("
\90S
\82É
\82½
\82¾
\82È
\82ç
\82Ê
\90ü
\81I
\90ü
\81I
\90ü
\81I
\82ª
\95\82\82Ñ
\82 \82ª
\82Á
\82½
\81I");
1953 pline("Wow! Modern art.");
1955 pline("
\83\8f\83H
\81I
\83\82\83_
\83\93\83A
\81[
\83g
\82¾
\81I");
1958 Your("%s spins in bewilderment.", body_part(HEAD));
1960 You("
\93\96\98f
\82µ
\82Ä
\96Ú
\82ª
\82Ü
\82í
\82Á
\82½
\81D");
1961 make_confused(HConfusion + rnd(30), FALSE);
1967 for (x = 1; x < COLNO; x++)
1968 for (y = 0; y < ROWNO; y++)
1969 if (levl[x][y].typ == SDOOR)
1970 cvt_sdoor_to_door(&levl[x][y]);
1971 /* do_mapping() already reveals secret passages */
1975 case SPE_MAGIC_MAPPING:
1976 if (level.flags.nommap) {
1978 Your("%s spins as %s blocks the spell!", body_part(HEAD),
1981 You("
\89½
\82©
\82ª
\8eô
\95¶
\82ð
\82³
\82¦
\82¬
\82è
\81C
\96Ú
\82ª
\82Ü
\82í
\82Á
\82½
\81I");
1983 make_confused(HConfusion + rnd(30), FALSE);
1987 pline("A map coalesces in your mind!");
1989 pline("
\92n
\90}
\82ª
\82 \82È
\82½
\82Ì
\90S
\82É
\97Z
\8d\87\82µ
\82½
\81I");
1990 cval = (scursed && !confused);
1992 HConfusion = 1; /* to screw up map */
1995 HConfusion = 0; /* restore */
1997 pline("Unfortunately, you can't grasp the details.");
1999 pline("
\8ec
\94O
\82È
\82ª
\82ç
\81C
\82 \82È
\82½
\82Í
\8fÚ
\8d×
\82ð
\93¾
\82é
\82±
\82Æ
\82ª
\82Å
\82«
\82È
\82©
\82Á
\82½
\81D");
2004 forget((!sblessed ? ALL_SPELLS : 0)
2005 | (!confused || scursed ? ALL_MAP : 0));
2006 if (Hallucination) /* Ommmmmm! */
2008 Your("mind releases itself from mundane concerns.");
2010 Your("
\90S
\82Í
\95½
\96}
\82È
\97\98\8aQ
\8aÖ
\8cW
\82©
\82ç
\89ð
\95ú
\82³
\82ê
\82½
\81D");
2011 else if (!strncmpi(plname, "Maud", 4))
2014 "As your mind turns inward on itself, you forget everything else.");
2016 "
\82 \82È
\82½
\82Ì
\90S
\82Í
\93à
\91¤
\82É
\8cü
\82«
\81C
\91S
\82Ä
\82ð
\96Y
\82ê
\82Ä
\82µ
\82Ü
\82Á
\82½
\81D");
2019 pline("Who was that Maud person anyway?");
2021 pline("Maud
\82Á
\82Ä
\96º
\82Í
\82¢
\82Á
\82½
\82¢
\92N
\82¾
\82¢
\81H");
2024 pline("Thinking of Maud you forget everything else.");
2026 pline("Maud
\82ð
\8dl
\82¦
\82é
\82±
\82Æ
\88È
\8aO
\81C
\82 \82È
\82½
\82Í
\91S
\82Ä
\82ð
\96Y
\82ê
\82Ä
\82µ
\82Ü
\82Á
\82½
\81D");
2027 exercise(A_WIS, FALSE);
2035 cval = bcsign(sobj);
2036 dam = (2 * (rn1(3, 3) + 2 * cval) + 1) / 3;
2038 sobj = 0; /* it's gone */
2040 (void) learnscrolltyp(SCR_FIRE);
2042 if (Fire_resistance) {
2043 shieldeff(u.ux, u.uy);
2046 pline("Oh, look, what a pretty fire in your %s.",
2048 pline("
\82í
\82\9f\82²
\82ç
\82ñ
\81D
\8f¬
\82³
\82È
\89Î
\82ª%s
\82É
\82 \82é
\81D",
2049 makeplural(body_part(HAND)));
2052 You_feel("a pleasant warmth in your %s.",
2054 You_feel("%s
\82Ì
\92\86\82É
\89õ
\93K
\82È
\92g
\82©
\82³
\82ð
\8a´
\82¶
\82½
\81D",
2055 makeplural(body_part(HAND)));
2058 pline_The("scroll catches fire and you burn your %s.",
2060 pline("
\8aª
\95¨
\82É
\89Î
\82ª
\94R
\82¦
\82¤
\82Â
\82è
\81C
\82 \82È
\82½
\82Ì%s
\82ð
\8fÄ
\82¢
\82½
\81D",
2061 makeplural(body_part(HAND)));
2063 losehp(1, "scroll of fire", KILLED_BY_AN);
2065 losehp(1, "
\89\8a\82Ì
\8aª
\95¨
\82Å", KILLED_BY_AN);
2071 pline_The("%s around you vaporizes violently!", hliquid("water"));
2073 pline_The("
\82 \82È
\82½
\82Ì
\89ñ
\82è
\82Ì%s
\82Í
\82Í
\82°
\82µ
\82
\95¦
\93«
\82µ
\82½
\81I", hliquid("
\90\85"));
2078 pline("This is a scroll of fire!");
2080 pline("
\82±
\82ê
\82Í
\89Î
\82Ì
\8aª
\95¨
\82¾
\81I");
2083 pline("Where do you want to center the explosion?");
2085 pline("
\82Ç
\82±
\82ð
\94\9a\94
\82Ì
\92\86\90S
\82É
\82µ
\82Ü
\82·
\82©
\81H");
2086 getpos_sethilite(display_stinking_cloud_positions, get_valid_stinking_cloud_pos);
2088 (void) getpos(&cc, TRUE, "the desired position");
2090 (void) getpos(&cc, TRUE, "
\91_
\82¢
\82Ì
\8fê
\8f\8a");
2091 if (!is_valid_stinking_cloud_pos(cc.x, cc.y, FALSE)) {
2092 /* try to reach too far, get burned */
2097 if (cc.x == u.ux && cc.y == u.uy) {
2099 pline_The("scroll erupts in a tower of flame!");
2101 pline("
\8aª
\95¨
\82©
\82ç
\89Î
\92\8c\82ª
\97§
\82¿
\8f¸
\82Á
\82½
\81I");
2102 iflags.last_msg = PLNMSG_TOWER_OF_FLAME; /* for explode() */
2106 explode(cc.x, cc.y, 11, dam, SCROLL_CLASS, EXPL_FIERY);
2110 /* TODO: handle steeds */
2111 if (!Is_rogue_level(&u.uz) && has_ceiling(&u.uz)
2112 && (!In_endgame(&u.uz) || Is_earthlevel(&u.uz))) {
2116 /* Identify the scroll */
2119 You_hear("rumbling.");
2121 You_hear("
\83S
\83\8d\83S
\83\8d\82Æ
\82¢
\82¤
\89¹
\82ð
\95·
\82¢
\82½
\81D");
2124 pline_The("%s rumbles %s you!", ceiling(u.ux, u.uy),
2125 sblessed ? "around" : "above");
2127 pline("
\82 \82È
\82½
\82Ì%s
\82Ì%s
\82©
\82ç
\83S
\83\8d\83S
\83\8d\82Æ
\89¹
\82ª
\95·
\82±
\82¦
\82Ä
\82«
\82½
\81I",
2128 sblessed ? "
\82Ü
\82í
\82è" : "
\90^
\8fã", ceiling(u.ux,u.uy));
2133 /* Loop through the surrounding squares */
2135 for (x = u.ux - 1; x <= u.ux + 1; x++) {
2136 for (y = u.uy - 1; y <= u.uy + 1; y++) {
2137 /* Is this a suitable spot? */
2138 if (isok(x, y) && !closed_door(x, y)
2139 && !IS_ROCK(levl[x][y].typ)
2140 && !IS_AIR(levl[x][y].typ)
2141 && (x != u.ux || y != u.uy)) {
2143 drop_boulder_on_monster(x, y, confused, TRUE);
2147 /* Attack the player */
2149 drop_boulder_on_player(confused, !scursed, TRUE, FALSE);
2150 } else if (!nboulders)
2152 pline("But nothing else happens.");
2154 pline("
\82µ
\82©
\82µ
\91¼
\82É
\89½
\82à
\82¨
\82±
\82ç
\82È
\82©
\82Á
\82½
\81D");
2157 case SCR_PUNISHMENT:
2159 if (confused || sblessed) {
2161 You_feel("guilty.");
2163 You("
\8dß
\82ð
\8a´
\82¶
\82½
\81D");
2168 case SCR_STINKING_CLOUD: {
2173 You("have found a scroll of stinking cloud!");
2175 You("
\88«
\8fL
\89_
\82Ì
\8aª
\95¨
\82ð
\94
\8c©
\82µ
\82½
\81I");
2178 pline("Where do you want to center the %scloud?",
2179 already_known ? "stinking " : "");
2181 pline("
\89_
\82Ì
\92\86\90S
\82ð
\82Ç
\82±
\82É
\82µ
\82Ü
\82·
\82©
\81H");
2185 getpos_sethilite(display_stinking_cloud_positions, get_valid_stinking_cloud_pos);
2187 if (getpos(&cc, TRUE, "the desired position") < 0) {
2189 if (getpos(&cc, TRUE, "
\91_
\82¤
\8fê
\8f\8a") < 0) {
2193 if (!is_valid_stinking_cloud_pos(cc.x, cc.y, TRUE))
2195 (void) create_gas_cloud(cc.x, cc.y, 3 + bcsign(sobj),
2196 8 + 4 * bcsign(sobj));
2200 impossible("What weird effect is this? (%u)", otyp);
2202 return sobj ? 0 : 1;
2206 drop_boulder_on_player(confused, helmet_protects, byu, skip_uswallow)
2207 boolean confused, helmet_protects, byu, skip_uswallow;
2212 /* hit monster if swallowed */
2213 if (u.uswallow && !skip_uswallow) {
2214 drop_boulder_on_monster(u.ux, u.uy, confused, byu);
2218 otmp2 = mksobj(confused ? ROCK : BOULDER, FALSE, FALSE);
2221 otmp2->quan = confused ? rn1(5, 2) : 1;
2222 otmp2->owt = weight(otmp2);
2223 if (!amorphous(youmonst.data) && !Passes_walls
2224 && !noncorporeal(youmonst.data) && !unsolid(youmonst.data)) {
2226 You("are hit by %s!", doname(otmp2));
2228 pline("%s
\82ª
\96½
\92\86\82µ
\82½
\81I", doname(otmp2));
2229 dmg = dmgval(otmp2, &youmonst) * otmp2->quan;
2230 if (uarmh && helmet_protects) {
2231 if (is_metallic(uarmh)) {
2233 pline("Fortunately, you are wearing a hard helmet.");
2235 pline("
\8dK
\89^
\82É
\82à
\81C
\82 \82È
\82½
\82Í
\8cÅ
\82¢
\8a\95\82ð
\90g
\82É
\82Â
\82¯
\82Ä
\82¢
\82é
\81D");
2238 } else if (flags.verbose) {
2240 pline("%s does not protect you.", Yname2(uarmh));
2242 Your("%s
\82Å
\82Í
\8eç
\82ê
\82È
\82¢
\81D", xname(uarmh));
2247 wake_nearto(u.ux, u.uy, 4 * 4);
2248 /* Must be before the losehp(), for bones files */
2250 if (!flooreffects(otmp2, u.ux, u.uy, "fall")) {
2252 if (!flooreffects(otmp2, u.ux, u.uy, "
\97\8e\82¿
\82é")) {
2253 place_object(otmp2, u.ux, u.uy);
2259 losehp(Maybe_Half_Phys(dmg), "scroll of earth", KILLED_BY_AN);
2261 losehp(Maybe_Half_Phys(dmg), "
\91å
\92n
\82Ì
\8aª
\95¨
\82Å", KILLED_BY_AN);
2265 drop_boulder_on_monster(x, y, confused, byu)
2267 boolean confused, byu;
2269 register struct obj *otmp2;
2270 register struct monst *mtmp;
2272 /* Make the object(s) */
2273 otmp2 = mksobj(confused ? ROCK : BOULDER, FALSE, FALSE);
2275 return FALSE; /* Shouldn't happen */
2276 otmp2->quan = confused ? rn1(5, 2) : 1;
2277 otmp2->owt = weight(otmp2);
2279 /* Find the monster here (won't be player) */
2281 if (mtmp && !amorphous(mtmp->data) && !passes_walls(mtmp->data)
2282 && !noncorporeal(mtmp->data) && !unsolid(mtmp->data)) {
2283 struct obj *helmet = which_armor(mtmp, W_ARMH);
2286 if (cansee(mtmp->mx, mtmp->my)) {
2288 pline("%s is hit by %s!", Monnam(mtmp), doname(otmp2));
2290 pline("%s
\82ª%s
\82É
\96½
\92\86\82µ
\82½
\81I", doname(otmp2), Monnam(mtmp));
2291 if (mtmp->minvis && !canspotmon(mtmp))
2292 map_invisible(mtmp->mx, mtmp->my);
2293 } else if (u.uswallow && mtmp == u.ustuck)
2295 You_hear("something hit %s %s over your %s!",
2296 s_suffix(mon_nam(mtmp)), mbodypart(mtmp, STOMACH),
2299 You_hear("
\89½
\82©
\82ª
\82 \82È
\82½
\82Ì%s
\82Ì
\8fã
\82Ì%s
\82Ì%s
\82É
\93\96\82½
\82Á
\82½
\89¹
\82ð
\95·
\82¢
\82½
\81I",
2301 mon_nam(mtmp), mbodypart(mtmp, STOMACH));
2304 mdmg = dmgval(otmp2, mtmp) * otmp2->quan;
2306 if (is_metallic(helmet)) {
2307 if (canspotmon(mtmp))
2309 pline("Fortunately, %s is wearing a hard helmet.",
2311 pline("
\8dK
\89^
\82É
\82à
\81C%s
\82Í
\8cÅ
\82¢
\8a\95\82ð
\90g
\82É
\82Â
\82¯
\82Ä
\82¢
\82é
\81D",
2315 You_hear("a clanging sound.");
2317 You_hear("
\83K
\83\89\83\93\83K
\83\89\83\93\82Æ
\82¢
\82¤
\89¹
\82ð
\95·
\82¢
\82½
\81D");
2321 if (canspotmon(mtmp))
2323 pline("%s's %s does not protect %s.", Monnam(mtmp),
2324 xname(helmet), mhim(mtmp));
2326 pline("%s
\82Ì%s
\82Å
\82Í
\8eç
\82ê
\82È
\82¢
\81D", Monnam(mtmp),
2332 if (mtmp->mhp <= 0) {
2337 pline("%s is killed.", Monnam(mtmp));
2339 pline("%s
\82Í
\8e\80\82ñ
\82¾
\81D", Monnam(mtmp));
2345 wake_nearto(x, y, 4 * 4);
2346 } else if (u.uswallow && mtmp == u.ustuck) {
2347 obfree(otmp2, (struct obj *) 0);
2348 /* fall through to player */
2349 drop_boulder_on_player(confused, TRUE, FALSE, TRUE);
2352 /* Drop the rock/boulder to the floor */
2354 if (!flooreffects(otmp2, x, y, "fall")) {
2356 if (!flooreffects(otmp2, x, y, "
\97\8e\82¿
\82é")) {
2357 place_object(otmp2, x, y);
2359 newsym(x, y); /* map the rock */
2364 /* overcharging any wand or zapping/engraving cursed wand */
2366 wand_explode(obj, chg)
2368 int chg; /* recharging */
2371 const char *expl = !chg ? "suddenly" : "vibrates violently and";
2373 const char *expl = !chg ? "
\93Ë
\91R" : "
\8c\83\82µ
\82
\90U
\93®
\82µ
\81C";
2376 /* number of damage dice */
2378 chg = 2; /* zap/engrave adjustment */
2381 n = 2; /* arbitrary minimum */
2382 /* size of damage dice */
2383 switch (obj->otyp) {
2387 case WAN_CANCELLATION:
2390 case WAN_UNDEAD_TURNING:
2396 case WAN_MAGIC_MISSILE:
2406 /* inflict damage and destroy the wand */
2408 obj->in_use = TRUE; /* in case losehp() is fatal (or --More--^C) */
2410 pline("%s %s explodes!", Yname2(obj), expl);
2412 pline("%s
\82Í%s
\94\9a\94
\82µ
\82½
\81I", xname(obj), expl);
2415 losehp(Maybe_Half_Phys(dmg), "exploding wand", KILLED_BY_AN);
2417 losehp(Maybe_Half_Phys(dmg), "
\8fñ
\82Ì
\94\9a\94
\82Å", KILLED_BY_AN);
2419 /* obscure side-effect */
2420 exercise(A_STR, FALSE);
2423 /* used to collect gremlins being hit by light so that they can be processed
2424 after vision for the entire lit area has been brought up to date */
2429 STATIC_VAR struct litmon *gremlins = 0;
2432 * Low-level lit-field update routine.
2440 struct litmon *gremlin;
2444 if ((mtmp = m_at(x, y)) != 0 && mtmp->data == &mons[PM_GREMLIN]) {
2445 gremlin = (struct litmon *) alloc(sizeof *gremlin);
2446 gremlin->mon = mtmp;
2447 gremlin->nxt = gremlins;
2452 snuff_light_source(x, y);
2458 register boolean on;
2461 char is_lit; /* value is irrelevant; we use its address
2462 as a `not null' flag for set_lit() */
2464 /* first produce the text (provided you're not blind) */
2466 register struct obj *otmp;
2471 pline("It seems even darker in here than before.");
2473 pline("
\91O
\82æ
\82è
\88Ã
\82
\82È
\82Á
\82½
\82æ
\82¤
\82É
\8c©
\82¦
\82é
\81D");
2475 if (uwep && artifact_light(uwep) && uwep->lamplit)
2477 pline("Suddenly, the only light left comes from %s!",
2479 pline("
\93Ë
\91R
\81C
\96¾
\82©
\82è
\82ª%s
\82¾
\82¯
\82É
\82È
\82Á
\82½
\81I",
2483 You("are surrounded by darkness!");
2485 You("
\88Ã
\88Å
\82É
\95¢
\82í
\82ê
\82½
\81I");
2489 /* the magic douses lamps, et al, too */
2490 for (otmp = invent; otmp; otmp = otmp->nobj)
2492 (void) snuff_lit(otmp);
2497 else if (is_animal(u.ustuck->data))
2499 pline("%s %s is lit.", s_suffix(Monnam(u.ustuck)),
2500 mbodypart(u.ustuck, STOMACH));
2502 pline("%s
\82Ì%s
\82Í
\96¾
\82é
\82
\82È
\82Á
\82½
\81D", Monnam(u.ustuck),
2503 mbodypart(u.ustuck, STOMACH));
2505 else if (is_whirly(u.ustuck->data))
2507 pline("%s shines briefly.", Monnam(u.ustuck));
2509 pline("%s
\82Í
\82¿
\82å
\82Á
\82Æ
\8bP
\82¢
\82½
\81D", Monnam(u.ustuck));
2512 pline("%s glistens.", Monnam(u.ustuck));
2514 pline("%s
\82Í
\82«
\82ç
\82«
\82ç
\8bP
\82¢
\82½
\81D", Monnam(u.ustuck));
2517 pline("A lit field surrounds you!");
2519 pline("
\93\94\82è
\82ª
\82 \82È
\82½
\82ð
\8eæ
\82è
\88Í
\82ñ
\82¾
\81I");
2522 /* No-op when swallowed or in water */
2523 if (u.uswallow || Underwater || Is_waterlevel(&u.uz))
2526 * If we are darkening the room and the hero is punished but not
2527 * blind, then we have to pick up and replace the ball and chain so
2528 * that we don't remember them if they are out of sight.
2530 if (Punished && !on && !Blind)
2531 move_bc(1, 0, uball->ox, uball->oy, uchain->ox, uchain->oy);
2533 if (Is_rogue_level(&u.uz)) {
2534 /* Can't use do_clear_area because MAX_RADIUS is too small */
2535 /* rogue lighting must light the entire room */
2536 int rnum = levl[u.ux][u.uy].roomno - ROOMOFFSET;
2540 for (rx = rooms[rnum].lx - 1; rx <= rooms[rnum].hx + 1; rx++)
2541 for (ry = rooms[rnum].ly - 1; ry <= rooms[rnum].hy + 1; ry++)
2543 (genericptr_t) (on ? &is_lit : (char *) 0));
2544 rooms[rnum].rlit = on;
2546 /* hallways remain dark on the rogue level */
2548 do_clear_area(u.ux, u.uy,
2549 (obj && obj->oclass == SCROLL_CLASS && obj->blessed)
2551 set_lit, (genericptr_t) (on ? &is_lit : (char *) 0));
2554 * If we are not blind, then force a redraw on all positions in sight
2555 * by temporarily blinding the hero. The vision recalculation will
2556 * correctly update all previously seen positions *and* correctly
2557 * set the waslit bit [could be messed up from above].
2562 /* replace ball&chain */
2563 if (Punished && !on)
2564 move_bc(0, 0, uball->ox, uball->oy, uchain->ox, uchain->oy);
2567 vision_full_recalc = 1; /* delayed vision recalculation */
2569 struct litmon *gremlin;
2571 /* can't delay vision recalc after all */
2573 /* after vision has been updated, monsters who are affected
2574 when hit by light can now be hit by it */
2577 gremlins = gremlin->nxt;
2578 light_hits_gremlin(gremlin->mon, rnd(5));
2579 free((genericptr_t) gremlin);
2587 int i, j, immunecnt, gonecnt, goodcnt, class, feel_dead = 0;
2588 char buf[BUFSZ] = DUMMY;
2589 boolean gameover = FALSE; /* true iff killed self */
2593 pline1(thats_enough_tries);
2598 getlin("What class of monsters do you wish to genocide?", buf);
2600 getlin("
\82Ç
\82Ì
\83N
\83\89\83X
\82É
\91®
\82·
\82é
\89ö
\95¨
\82ð
\8bs
\8eE
\82µ
\82Ü
\82·
\82©
\81H[
\95¶
\8e\9a\82ð
\93ü
\82ê
\82Ä
\82Ë]", buf);
2601 (void) mungspaces(buf);
2603 /* choosing "none" preserves genocideless conduct */
2605 if (*buf == '\033' || !strcmpi(buf, "none")
2606 || !strcmpi(buf, "nothing"))
2608 if (*buf == '\033' || !strcmpi(buf, "
\82È
\82µ")
2609 || !strcmpi(buf, "
\96³
\82µ"))
2613 class = name_to_monclass(buf, (int *) 0);
2614 if (class == 0 && (i = name_to_mon(buf)) != NON_PM)
2615 class = mons[i].mlet;
2616 immunecnt = gonecnt = goodcnt = 0;
2617 for (i = LOW_PM; i < NUMMONS; i++) {
2618 if (mons[i].mlet == class) {
2619 if (!(mons[i].geno & G_GENO))
2621 else if (mvitals[i].mvflags & G_GENOD)
2627 if (!goodcnt && class != mons[urole.malenum].mlet
2628 && class != mons[urace.malenum].mlet) {
2631 pline("All such monsters are already nonexistent.");
2633 pline("
\82»
\82Ì
\89ö
\95¨
\82Í
\82à
\82¤
\82¢
\82È
\82¢
\81D");
2634 else if (immunecnt || class == S_invisible)
2636 You("aren't permitted to genocide such monsters.");
2638 You("
\82»
\82Ì
\89ö
\95¨
\82ð
\8bs
\8eE
\82·
\82é
\82±
\82Æ
\82Í
\82Å
\82«
\82È
\82¢
\81D");
2639 else if (wizard && buf[0] == '*') {
2640 register struct monst *mtmp, *mtmp2;
2643 for (mtmp = fmon; mtmp; mtmp = mtmp2) {
2645 if (DEADMONSTER(mtmp))
2651 pline("Eliminated %d monster%s.", gonecnt, plur(gonecnt));
2653 pline("%d
\82Ì
\89ö
\95¨
\82ð
\8f\9c\82¢
\82½
\81D", gonecnt);
2657 pline("That %s does not represent any monster.",
2658 strlen(buf) == 1 ? "symbol" : "response");
2660 pline("
\82»
\82Ì
\82æ
\82¤
\82È
\89ö
\95¨
\82Í
\82¢
\82È
\82¢
\81D");
2665 for (i = LOW_PM; i < NUMMONS; i++) {
2666 if (mons[i].mlet == class) {
2669 Strcpy(nam, makeplural(mons[i].mname));
2670 /* Although "genus" is Latin for race, the hero benefits
2671 * from both race and role; thus genocide affects either.
2673 if (Your_Own_Role(i) || Your_Own_Race(i)
2674 || ((mons[i].geno & G_GENO)
2675 && !(mvitals[i].mvflags & G_GENOD))) {
2676 /* This check must be first since player monsters might
2677 * have G_GENOD or !G_GENO.
2679 mvitals[i].mvflags |= (G_GENOD | G_NOCORPSE);
2681 kill_genocided_monsters();
2682 update_inventory(); /* eggs & tins */
2684 pline("Wiped out all %s.", nam);
2686 pline("%s
\82ð
\91S
\82Ä
\94r
\8f\9c\82µ
\82½
\81D", nam);
2687 if (Upolyd && i == u.umonnum) {
2694 You("
\8e\80\82É
\82Ü
\82µ
\82½
\81D
\81D
\81D");
2695 /* finish genociding this class of
2696 monsters before ultimately dying */
2701 /* Self-genocide if it matches either your race
2702 or role. Assumption: male and female forms
2703 share same monster class. */
2704 if (i == urole.malenum || i == urace.malenum) {
2709 You_feel("%s inside.", udeadinside());
2711 You("
\8d°
\82ª%s
\82æ
\82¤
\82È
\8bC
\82ª
\82µ
\82½
\81D", udeadinside());
2717 You("
\8e\80\82É
\82Ü
\82µ
\82½
\81D
\81D
\81D");
2721 } else if (mvitals[i].mvflags & G_GENOD) {
2724 pline("All %s are already nonexistent.", nam);
2726 pline("%s
\82Í
\8aù
\82É
\82¢
\82È
\82¢
\81D", nam);
2727 } else if (!gameover) {
2728 /* suppress feedback about quest beings except
2729 for those applicable to our own role */
2730 if ((mons[i].msound != MS_LEADER
2731 || quest_info(MS_LEADER) == i)
2732 && (mons[i].msound != MS_NEMESIS
2733 || quest_info(MS_NEMESIS) == i)
2734 && (mons[i].msound != MS_GUARDIAN
2735 || quest_info(MS_GUARDIAN) == i)
2736 /* non-leader/nemesis/guardian role-specific monster
2738 && (i != PM_NINJA /* nuisance */
2739 || Role_if(PM_SAMURAI))) {
2740 boolean named, uniq;
2742 named = type_is_pname(&mons[i]) ? TRUE : FALSE;
2743 uniq = (mons[i].geno & G_UNIQ) ? TRUE : FALSE;
2744 /* one special case */
2745 if (i == PM_HIGH_PRIEST)
2749 You("aren't permitted to genocide %s%s.",
2750 (uniq && !named) ? "the " : "",
2751 (uniq || named) ? mons[i].mname : nam);
2753 You("%s
\82ð
\8bs
\8eE
\82Å
\82«
\82È
\82¢
\81D",
2754 (uniq || named) ? mons[i].mname : nam);
2760 if (gameover || u.uhp == -1) {
2761 killer.format = KILLED_BY_AN;
2763 Strcpy(killer.name, "scroll of genocide");
2765 Strcpy(killer.name, "
\8bs
\8eE
\82Ì
\8aª
\95¨
\82Å");
2779 /* 0 = no genocide; create monsters (cursed scroll) */
2780 /* 1 = normal genocide */
2781 /* 3 = forced genocide of player */
2782 /* 5 (4 | 1) = normal genocide from throne */
2784 char buf[BUFSZ] = DUMMY;
2785 register int i, killplayer = 0;
2787 register struct permonst *ptr;
2791 mndx = u.umonster; /* non-polymorphed mon num */
2793 Strcpy(buf, ptr->mname);
2798 /* cursed effect => no free pass (unless rndmonst() fails) */
2799 if (!(how & REALLY) && (ptr = rndmonst()) != 0)
2802 pline1(thats_enough_tries);
2806 getlin("What monster do you want to genocide? [type the name]",
2808 getlin("
\82Ç
\82Ì
\89ö
\95¨
\82ð
\8bs
\8eE
\82µ
\82Ü
\82·
\82©
\81H[
\96¼
\91O
\82ð
\93ú
\96{
\8cê
\82Å
\93ü
\82ê
\82Ä
\82Ë]",
2810 (void) mungspaces(buf);
2811 /* choosing "none" preserves genocideless conduct */
2813 if (*buf == '\033' || !strcmpi(buf, "none")
2814 || !strcmpi(buf, "nothing")) {
2816 if (*buf == '\033' || !strcmpi(buf, "
\82È
\82µ")
2817 || !strcmpi(buf, "
\96³
\82µ")) {
2819 /* ... but no free pass if cursed */
2820 if (!(how & REALLY) && (ptr = rndmonst()) != 0)
2821 break; /* remaining checks don't apply */
2826 mndx = name_to_mon(buf);
2827 if (mndx == NON_PM || (mvitals[mndx].mvflags & G_GENOD)) {
2829 pline("Such creatures %s exist in this world.",
2830 (mndx == NON_PM) ? "do not" : "no longer");
2832 pline("
\82»
\82Ì
\82æ
\82¤
\82È
\90¶
\82«
\95¨
\82Í%s
\82±
\82Ì
\90¢
\8aE
\82É
\91¶
\8dÝ
\82µ
\82È
\82¢
\81D",
2833 (mndx == NON_PM) ? "" : "
\82à
\82Í
\82â");
2838 /* Although "genus" is Latin for race, the hero benefits
2839 * from both race and role; thus genocide affects either.
2841 if (Your_Own_Role(mndx) || Your_Own_Race(mndx)) {
2846 adjalign(-sgn(u.ualign.type));
2848 adjalign(sgn(u.ualign.type));
2850 if (!(ptr->geno & G_GENO)) {
2852 /* FIXME: unconditional "caverns" will be silly in some
2853 * circumstances. Who's speaking? Divine pronouncements
2854 * aren't supposed to be hampered by deafness....
2858 pline("A thunderous voice booms through the caverns:");
2860 pline("
\97\8b\82Ì
\82æ
\82¤
\82È
\90º
\82ª
\93´
\8cA
\82É
\8b¿
\82¢
\82½
\81F");
2862 verbalize("No, mortal! That will not be done.");
2864 pline("
\81u
\92è
\96½
\82Ì
\8eÒ
\82æ
\81I
\82»
\82Ì
\96]
\82Ý
\82Í
\82©
\82È
\82¤
\82Ü
\82¢
\81D
\81v");
2868 /* KMH -- Unchanging prevents rehumanization */
2869 if (Unchanging && ptr == youmonst.data)
2873 mndx = monsndx(ptr); /* needed for the 'no free pass' cases */
2880 if (Hallucination) {
2882 Strcpy(buf, youmonst.data->mname);
2884 Strcpy(buf, (flags.female && urole.name.f) ? urole.name.f
2886 buf[0] = lowc(buf[0]);
2889 Strcpy(buf, ptr->mname); /* make sure we have standard singular */
2890 if ((ptr->geno & G_UNIQ) && ptr != &mons[PM_HIGH_PRIEST])
2892 which = !type_is_pname(ptr) ? "the " : "";
2898 /* setting no-corpse affects wishing and random tin generation */
2899 mvitals[mndx].mvflags |= (G_GENOD | G_NOCORPSE);
2901 pline("Wiped out %s%s.", which,
2902 (*which != 'a') ? buf : makeplural(buf));
2904 pline("%s
\82ð%s
\88ê
\91|
\82µ
\82½
\81D", buf, which);
2908 /* might need to wipe out dual role */
2909 if (urole.femalenum != NON_PM && mndx == urole.malenum)
2910 mvitals[urole.femalenum].mvflags |= (G_GENOD | G_NOCORPSE);
2911 if (urole.femalenum != NON_PM && mndx == urole.femalenum)
2912 mvitals[urole.malenum].mvflags |= (G_GENOD | G_NOCORPSE);
2913 if (urace.femalenum != NON_PM && mndx == urace.malenum)
2914 mvitals[urace.femalenum].mvflags |= (G_GENOD | G_NOCORPSE);
2915 if (urace.femalenum != NON_PM && mndx == urace.femalenum)
2916 mvitals[urace.malenum].mvflags |= (G_GENOD | G_NOCORPSE);
2920 killer.format = KILLED_BY;
2922 Strcpy(killer.name, "genocidal confusion");
2924 Strcpy(killer.name, "
\8d¬
\97\90\82É
\82æ
\82é
\8e©
\8bs
\93I
\8bs
\8eE
\82Å");
2925 } else if (how & ONTHRONE) {
2926 /* player selected while on a throne */
2927 killer.format = KILLED_BY_AN;
2929 Strcpy(killer.name, "imperious order");
2931 Strcpy(killer.name, "
\98ü
\96\9d\82È
\96½
\97ß
\82Å");
2932 } else { /* selected player deliberately, not confused */
2933 killer.format = KILLED_BY_AN;
2935 Strcpy(killer.name, "scroll of genocide");
2937 Strcpy(killer.name, "
\8bs
\8eE
\82Ì
\8aª
\95¨
\82Å");
2940 /* Polymorphed characters will die as soon as they're rehumanized.
2942 /* KMH -- Unchanging prevents rehumanization */
2943 if (Upolyd && ptr != youmonst.data) {
2944 delayed_killer(POLYMORPH, killer.format, killer.name);
2946 You_feel("%s inside.", udeadinside());
2948 You_feel("
\8d°
\82ª%s
\82æ
\82¤
\82È
\8bC
\82ª
\82µ
\82½
\81D", udeadinside());
2951 } else if (ptr == youmonst.data) {
2954 reset_rndmonst(mndx);
2955 kill_genocided_monsters();
2956 update_inventory(); /* in case identified eggs were affected */
2958 int cnt = 0, census = monster_census(FALSE);
2960 if (!(mons[mndx].geno & G_UNIQ)
2961 && !(mvitals[mndx].mvflags & (G_GENOD | G_EXTINCT)))
2962 for (i = rn1(3, 4); i > 0; i--) {
2963 if (!makemon(ptr, u.ux, u.uy, NO_MINVENT))
2964 break; /* couldn't make one */
2966 if (mvitals[mndx].mvflags & G_EXTINCT)
2967 break; /* just made last one */
2970 /* accumulated 'cnt' doesn't take groups into account;
2971 assume bringing in new mon(s) didn't remove any old ones */
2972 cnt = monster_census(FALSE) - census;
2974 pline("Sent in %s%s.", (cnt > 1) ? "some " : "",
2975 (cnt > 1) ? makeplural(buf) : an(buf));
2977 pline("%s
\82ª
\91\97\82ç
\82ê
\82Ä
\82«
\82½
\81D", buf);
2980 pline1(nothing_happens);
2988 struct obj *reuse_ball = (sobj && sobj->otyp == HEAVY_IRON_BALL)
2989 ? sobj : (struct obj *) 0;
2991 /* KMH -- Punishment is still okay when you are riding */
2994 You("are being punished for your misbehavior!");
2996 You("
\95s
\8dì
\96@
\82Ì
\82½
\82ß
\94±
\82ð
\8eó
\82¯
\82½
\81I");
2999 Your("iron ball gets heavier.");
3001 Your("
\93S
\8b\85\82Í
\82³
\82ç
\82É
\8fd
\82
\82È
\82Á
\82½
\81D");
3002 uball->owt += IRON_BALL_W_INCR * (1 + sobj->cursed);
3005 if (amorphous(youmonst.data) || is_whirly(youmonst.data)
3006 || unsolid(youmonst.data)) {
3009 pline("A ball and chain appears, then falls away.");
3011 pline("
\93S
\8b\85\82Æ
\8d½
\82ª
\8c»
\82í
\82ê
\82½
\82ª
\81C
\82·
\82é
\82Á
\82Æ
\94²
\82¯
\82½
\81D");
3012 dropy(mkobj(BALL_CLASS, TRUE));
3018 setworn(mkobj(CHAIN_CLASS, TRUE), W_CHAIN);
3020 setworn(mkobj(BALL_CLASS, TRUE), W_BALL);
3022 setworn(reuse_ball, W_BALL);
3023 uball->spe = 1; /* special ball (see save) */
3026 * Place ball & chain if not swallowed. If swallowed, the ball &
3027 * chain variables will be set at the next call to placebc().
3032 set_bc(1); /* set up ball and chain variables */
3033 newsym(u.ux, u.uy); /* see ball&chain if can't see self */
3037 /* remove the ball and chain */
3041 struct obj *savechain = uchain;
3043 obj_extract_self(uchain);
3044 newsym(uchain->ox, uchain->oy);
3045 setworn((struct obj *) 0, W_CHAIN);
3046 dealloc_obj(savechain);
3048 setworn((struct obj *) 0, W_BALL);
3051 /* some creatures have special data structures that only make sense in their
3052 * normal locations -- if the player tries to create one elsewhere, or to
3053 * revive one, the disoriented creature becomes a zombie
3056 cant_revive(mtype, revival, from_obj)
3059 struct obj *from_obj;
3061 /* SHOPKEEPERS can be revived now */
3062 if (*mtype == PM_GUARD || (*mtype == PM_SHOPKEEPER && !revival)
3063 || *mtype == PM_HIGH_PRIEST || *mtype == PM_ALIGNED_PRIEST
3064 || *mtype == PM_ANGEL) {
3065 *mtype = PM_HUMAN_ZOMBIE;
3067 } else if (*mtype == PM_LONG_WORM_TAIL) { /* for create_particular() */
3068 *mtype = PM_LONG_WORM;
3070 } else if (unique_corpstat(&mons[*mtype])
3071 && (!from_obj || !has_omonst(from_obj))) {
3072 /* unique corpses (from bones or wizard mode wish) or
3073 statues (bones or any wish) end up as shapechangers */
3074 *mtype = PM_DOPPELGANGER;
3081 * Make a new monster with the type controlled by the user.
3083 * Note: when creating a monster by class letter, specifying the
3084 * "strange object" (']') symbol produces a random monster rather
3085 * than a mimic. This behavior quirk is useful so don't "fix" it
3086 * (use 'm'--or "mimic"--to create a random mimic).
3088 * Used in wizard mode only (for ^G command and for scroll or spell
3089 * of create monster). Once upon a time, an earlier incarnation of
3090 * this code was also used for the scroll/spell in explore mode.
3095 char buf[BUFSZ] = DUMMY, *bufp, monclass;
3097 int which, tryct, i, firstchoice = NON_PM;
3098 struct permonst *whichpm = NULL;
3100 boolean madeany = FALSE, randmonst = FALSE,
3101 maketame, makepeaceful, makehostile, saddled, invisible,
3107 monclass = MAXMCLASSES;
3108 which = urole.malenum; /* an arbitrary index into mons[] */
3109 maketame = makepeaceful = makehostile = FALSE;
3110 sleeping = saddled = invisible = FALSE;
3111 fem = -1; /* gender not specified */
3113 getlin("Create what kind of monster? [type the name or symbol]", buf);
3115 getlin("
\82Ç
\82Ì
\8eí
\82Ì
\89ö
\95¨
\82ð
\8dì
\82è
\82Ü
\82·
\82©
\81H[
\96¼
\91O
\82ð
\93ü
\82ê
\82Ä
\82Ë]", buf);
3116 bufp = mungspaces(buf);
3117 if (*bufp == '\033')
3119 if ((tmpp = strstri(bufp, "saddled ")) != 0) {
3121 (void) memset(tmpp, ' ', sizeof "saddled " - 1);
3123 if ((tmpp = strstri(bufp, "sleeping ")) != 0) {
3125 (void) memset(tmpp, ' ', sizeof "sleeping " - 1);
3127 if ((tmpp = strstri(bufp, "invisible ")) != 0) {
3129 (void) memset(tmpp, ' ', sizeof "invisible " - 1);
3131 /* check "female" before "male" to avoid false hit mid-word */
3132 if ((tmpp = strstri(bufp, "female ")) != 0) {
3134 (void) memset(tmpp, ' ', sizeof "female " - 1);
3136 if ((tmpp = strstri(bufp, "male ")) != 0) {
3138 (void) memset(tmpp, ' ', sizeof "male " - 1);
3140 bufp = mungspaces(bufp); /* after potential memset(' ') */
3141 /* allow the initial disposition to be specified */
3143 if (!strncmpi(bufp, "tame ", 5)) {
3146 if (!strncmpi(bufp, "
\8eè
\82È
\82¸
\82¯
\82ç
\82ê
\82½", 14)) {
3151 } else if (!strncmpi(bufp, "peaceful ", 9)) {
3154 } else if (!strncmpi(bufp, "
\97F
\8dD
\93I
\82È", 8)) {
3157 makepeaceful = TRUE;
3159 } else if (!strncmpi(bufp, "hostile ", 8)) {
3162 } else if (!strncmpi(bufp, "
\93G
\91Î
\93I
\82È", 8)) {
3167 /* decide whether a valid monster was chosen */
3169 if (wizard && (!strcmp(bufp, "*") || !strcmp(bufp, "random"))) {
3171 if (wizard && (!strcmp(bufp, "*") || !strcmp(bufp, "
\83\89\83\93\83_
\83\80"))) {
3175 which = name_to_mon(bufp);
3176 if (which >= LOW_PM)
3177 break; /* got one */
3178 monclass = name_to_monclass(bufp, &which);
3179 if (which >= LOW_PM) {
3180 monclass = MAXMCLASSES; /* matters below */
3182 } else if (monclass > 0) {
3183 which = urole.malenum; /* reset from NON_PM */
3186 /* no good; try again... */
3188 pline("I've never heard of such monsters.");
3190 pline("
\82»
\82Ì
\82æ
\82¤
\82È
\89ö
\95¨
\82Í
\95·
\82¢
\82½
\82±
\82Æ
\82ª
\82È
\82¢
\81D");
3191 } while (--tryct > 0);
3194 pline1(thats_enough_tries);
3197 firstchoice = which;
3198 if (cant_revive(&which, FALSE, (struct obj *) 0)) {
3199 /* wizard mode can override handling of special monsters */
3201 Sprintf(buf, "Creating %s instead; force %s?",
3202 mons[which].mname, mons[firstchoice].mname);
3204 Sprintf(buf, "
\91ã
\82í
\82è
\82É%s
\82ª
\8dì
\82ç
\82ê
\82Ü
\82·
\81G%s
\82É
\82·
\82é
\81H",
3205 mons[which].mname, mons[firstchoice].mname);
3208 which = firstchoice;
3210 whichpm = &mons[which];
3212 for (i = 0; i <= multi; i++) {
3213 if (monclass != MAXMCLASSES)
3214 whichpm = mkclass(monclass, 0);
3216 whichpm = rndmonst();
3217 mtmp = makemon(whichpm, u.ux, u.uy, NO_MM_FLAGS);
3219 /* quit trying if creation failed and is going to repeat */
3220 if (monclass == MAXMCLASSES && !randmonst)
3222 /* otherwise try again */
3225 /* 'is_FOO()' ought to be called 'always_FOO()' */
3226 if (fem != -1 && !is_male(mtmp->data) && !is_female(mtmp->data))
3227 mtmp->female = fem; /* ignored for is_neuter() */
3229 (void) tamedog(mtmp, (struct obj *) 0);
3230 } else if (makepeaceful || makehostile) {
3231 mtmp->mtame = 0; /* sanity precaution */
3232 mtmp->mpeaceful = makepeaceful ? 1 : 0;
3235 if (saddled && can_saddle(mtmp) && !which_armor(mtmp, W_SADDLE)) {
3236 struct obj *otmp = mksobj(SADDLE, TRUE, FALSE);
3238 put_saddle_on_mon(otmp, mtmp);
3241 mon_set_minvis(mtmp);
3243 mtmp->msleeping = 1;
3245 /* in case we got a doppelganger instead of what was asked
3246 for, make it start out looking like what was asked for */
3247 if (mtmp->cham != NON_PM && firstchoice != NON_PM
3248 && mtmp->cham != firstchoice)
3249 (void) newcham(mtmp, &mons[firstchoice], FALSE, FALSE);