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-2016 */
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) {
531 if (!scroll->spe && yn(
532 "Reading mail will violate \"illiterate\" conduct. Read anyway?"
539 /* Actions required to win the game aren't counted towards conduct */
540 /* Novel conduct is handled in read_tribute so exclude it too*/
541 if (scroll->otyp != SPE_BOOK_OF_THE_DEAD
542 && scroll->otyp != SPE_BLANK_PAPER && scroll->otyp != SCR_BLANK_PAPER
543 && scroll->otyp != SPE_NOVEL)
544 u.uconduct.literate++;
546 if (scroll->oclass == SPBOOK_CLASS) {
547 return study_book(scroll);
549 scroll->in_use = TRUE; /* scroll, not spellbook, now being read */
550 if (scroll->otyp != SCR_BLANK_PAPER) {
551 boolean silently = !can_chant(&youmonst);
553 /* a few scroll feedback messages describe something happening
554 to the scroll itself, so avoid "it disappears" for those */
555 nodisappear = (scroll->otyp == SCR_FIRE
556 || (scroll->otyp == SCR_REMOVE_CURSE
561 ? "You %s the formula on the scroll."
562 : "As you %s the formula on it, the scroll disappears.",
563 silently ? "cogitate" : "pronounce");
566 ? "
\82 \82È
\82½
\82Í
\8eô
\95¶
\82ð%s
\82½
\81D"
567 : "
\8eô
\95¶
\82ð%s
\82é
\82Æ
\81C
\8aª
\95¨
\82Í
\8fÁ
\82¦
\82½
\81D",
568 silently ? "
\94O
\82¶" : "
\8f¥
\82¦");
572 pline(nodisappear ? "You read the scroll."
573 : "As you read the scroll, it disappears.");
575 pline(nodisappear ? "
\82 \82È
\82½
\82Í
\8aª
\95¨
\82ð
\93Ç
\82ñ
\82¾
\81D"
576 : "
\8aª
\95¨
\82ð
\93Ç
\82Þ
\82Æ
\81C
\82»
\82ê
\82Í
\8fÁ
\82¦
\82½
\81D");
581 pline("Being so trippy, you screw up...");
583 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");
586 pline("Being confused, you %s the magic words...",
587 silently ? "misunderstand" : "mispronounce");
589 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");
593 if (!seffects(scroll)) {
594 if (!objects[scroll->otyp].oc_name_known) {
597 else if (!objects[scroll->otyp].oc_uname)
600 scroll->in_use = FALSE;
601 if (scroll->otyp != SCR_BLANK_PAPER)
609 register struct obj *obj;
611 if (obj->blessed || obj->spe <= 0) {
612 pline1(nothing_happens);
614 /* order matters: message, shop handling, actual transformation */
616 pline("%s briefly.", Yobjnam2(obj, "vibrate"));
618 Your("%s
\82Í
\8f¬
\8d\8f\82Ý
\82É
\90U
\93®
\82µ
\82½
\81D",xname(obj));
619 costly_alteration(obj, COST_UNCHRG);
621 if (obj->otyp == OIL_LAMP || obj->otyp == BRASS_LANTERN)
628 register struct obj *otmp;
631 pline("%s briefly.", Yobjnam2(otmp, Blind ? "vibrate" : "glow"));
633 Your("%s
\82Í
\8f¬
\8d\8f\82Ý
\82É%s
\81D", xname(otmp), Blind ? "
\90U
\93®
\82µ
\82½" : "
\8bP
\82¢
\82½");
638 register struct obj *otmp;
639 register const char *color;
642 pline("%s%s%s for a moment.", Yobjnam2(otmp, Blind ? "vibrate" : "glow"),
643 Blind ? "" : " ", Blind ? "" : hcolor(color));
645 Your("%s
\82Í
\88ê
\8fu%s%s
\81D", xname(otmp),
646 Blind ? "" : jconj_adj(hcolor(color)),
647 Blind ? "
\90U
\93®
\82µ
\82½" : "
\8bP
\82¢
\82½");
651 /* Is the object chargeable? For purposes of inventory display; it is
652 possible to be able to charge things for which this returns FALSE. */
657 if (obj->oclass == WAND_CLASS)
659 /* known && !oc_name_known is possible after amnesia/mind flayer */
660 if (obj->oclass == RING_CLASS)
661 return (boolean) (objects[obj->otyp].oc_charged
664 && objects[obj->otyp].oc_name_known)));
665 if (is_weptool(obj)) /* specific check before general tools */
667 if (obj->oclass == TOOL_CLASS)
668 return (boolean) objects[obj->otyp].oc_charged;
669 return FALSE; /* why are weapons/armor considered charged anyway? */
672 /* recharge an object; curse_bless is -1 if the recharging implement
673 was cursed, +1 if blessed, 0 otherwise. */
675 recharge(obj, curse_bless)
680 boolean is_cursed, is_blessed;
682 is_cursed = curse_bless < 0;
683 is_blessed = curse_bless > 0;
685 if (obj->oclass == WAND_CLASS) {
686 int lim = (obj->otyp == WAN_WISHING)
688 : (objects[obj->otyp].oc_dir != NODIR) ? 8 : 15;
690 /* undo any prior cancellation, even when is_cursed */
695 * Recharging might cause wands to explode.
696 * v = number of previous recharges
697 * v = percentage chance to explode on this attempt
698 * v = cumulative odds for exploding
708 n = (int) obj->recharged;
709 if (n > 0 && (obj->otyp == WAN_WISHING
710 || (n * n * n > rn2(7 * 7 * 7)))) { /* recharge_limit */
711 wand_explode(obj, rnd(lim));
714 /* didn't explode, so increment the recharge count */
715 obj->recharged = (unsigned) (n + 1);
717 /* now handle the actual recharging */
721 n = (lim == 3) ? 3 : rn1(5, lim + 1 - 5);
729 if (obj->otyp == WAN_WISHING && obj->spe > 3) {
730 wand_explode(obj, 1);
734 p_glow2(obj, NH_BLUE);
737 #if 0 /*[shop price doesn't vary by charge count]*/
738 /* update shop bill to reflect new higher price */
744 } else if (obj->oclass == RING_CLASS && objects[obj->otyp].oc_charged) {
745 /* charging does not affect ring's curse/bless status */
746 int s = is_blessed ? rnd(3) : is_cursed ? -rnd(2) : 1;
747 boolean is_on = (obj == uleft || obj == uright);
749 /* destruction depends on current state, not adjustment */
750 if (obj->spe > rn2(7) || obj->spe <= -5) {
752 pline("%s momentarily, then %s!", Yobjnam2(obj, "pulsate"),
753 otense(obj, "explode"));
755 Your("%s
\82Í
\88ê
\8fu
\96¬
\93®
\82µ
\81C
\94\9a\94
\82µ
\82½
\81I", xname(obj));
759 s = rnd(3 * abs(obj->spe)); /* amount of damage */
762 losehp(Maybe_Half_Phys(s), "exploding ring", KILLED_BY_AN);
764 losehp(Maybe_Half_Phys(s), "
\8ew
\97Ö
\82Ì
\94\9a\94
\82Å", KILLED_BY_AN);
766 long mask = is_on ? (obj == uleft ? LEFT_RING : RIGHT_RING) : 0L;
769 pline("%s spins %sclockwise for a moment.", Yname2(obj),
770 s < 0 ? "counter" : "");
772 Your("%s
\82Í
\88ê
\8fu%s
\8e\9e\8cv
\89ñ
\82è
\82É
\89ñ
\93]
\82µ
\82½
\81D", xname(obj),
773 s < 0 ? "
\94½" : "");
776 costly_alteration(obj, COST_DECHNT);
777 /* cause attributes and/or properties to be updated */
780 obj->spe += s; /* update the ring while it's off */
782 setworn(obj, mask), Ring_on(obj);
783 /* oartifact: if a touch-sensitive artifact ring is
784 ever created the above will need to be revised */
785 /* update shop bill to reflect new higher price */
786 if (s > 0 && obj->unpaid)
790 } else if (obj->oclass == TOOL_CLASS) {
791 int rechrg = (int) obj->recharged;
793 if (objects[obj->otyp].oc_charged) {
794 /* tools don't have a limit, but the counter used does */
795 if (rechrg < 7) /* recharge_limit */
799 case BELL_OF_OPENING:
811 case EXPENSIVE_CAMERA:
816 == MAGIC_MARKER) { /* previously recharged */
817 obj->recharged = 1; /* override increment done above */
820 Your("marker seems permanently dried out.");
822 Your("
\83}
\81[
\83J
\82Í
\8a®
\91S
\82É
\8a£
\82«
\82«
\82Á
\82Ä
\82µ
\82Ü
\82Á
\82½
\81D");
824 pline1(nothing_happens);
825 } else if (is_blessed) {
826 n = rn1(16, 15); /* 15..30 */
827 if (obj->spe + n <= 50)
829 else if (obj->spe + n <= 75)
832 int chrg = (int) obj->spe;
833 if ((chrg + n) > 127)
838 p_glow2(obj, NH_BLUE);
840 n = rn1(11, 10); /* 10..20 */
841 if (obj->spe + n <= 50)
844 int chrg = (int) obj->spe;
845 if ((chrg + n) > 127)
850 p_glow2(obj, NH_WHITE);
860 pline("%s out!", Tobjnam(obj, "go"));
862 pline("%s
\82Í
\8fÁ
\82¦
\82½
\81I", xname(obj));
866 } else if (is_blessed) {
869 p_glow2(obj, NH_BLUE);
881 } else if (is_blessed) {
883 p_glow2(obj, NH_BLUE);
889 pline1(nothing_happens);
897 } else if (is_blessed) {
899 obj->spe += rn1(10, 6);
901 obj->spe += rn1(5, 6);
904 p_glow2(obj, NH_BLUE);
916 case DRUM_OF_EARTHQUAKE:
919 } else if (is_blessed) {
923 p_glow2(obj, NH_BLUE);
940 You("have a feeling of loss.");
942 You("
\82È
\82É
\82©
\91¹
\82µ
\82½
\8bC
\95ª
\82É
\82È
\82Á
\82½
\81D");
946 /* Forget known information about this object type. */
948 forget_single_object(obj_id)
951 objects[obj_id].oc_name_known = 0;
952 objects[obj_id].oc_pre_discovered = 0; /* a discovery when relearned */
953 if (objects[obj_id].oc_uname) {
954 free((genericptr_t) objects[obj_id].oc_uname);
955 objects[obj_id].oc_uname = 0;
957 undiscover_object(obj_id); /* after clearing oc_name_known */
959 /* clear & free object names from matching inventory items too? */
962 #if 0 /* here if anyone wants it.... */
963 /* Forget everything known about a particular object class. */
965 forget_objclass(oclass)
970 for (i = bases[oclass];
971 i < NUM_OBJECTS && objects[i].oc_class == oclass; i++)
972 forget_single_object(i);
976 /* randomize the given list of numbers 0 <= i < count */
978 randomize(indices, count)
984 for (i = count - 1; i > 0; i--) {
985 if ((iswap = rn2(i + 1)) == i)
988 indices[i] = indices[iswap];
989 indices[iswap] = temp;
993 /* Forget % of known objects. */
995 forget_objects(percent)
999 int indices[NUM_OBJECTS];
1003 if (percent <= 0 || percent > 100) {
1004 impossible("forget_objects: bad percent %d", percent);
1008 indices[0] = 0; /* lint suppression */
1009 for (count = 0, i = 1; i < NUM_OBJECTS; i++)
1010 if (OBJ_DESCR(objects[i])
1011 && (objects[i].oc_name_known || objects[i].oc_uname))
1012 indices[count++] = i;
1015 randomize(indices, count);
1017 /* forget first % of randomized indices */
1018 count = ((count * percent) + rn2(100)) / 100;
1019 for (i = 0; i < count; i++)
1020 forget_single_object(indices[i]);
1024 /* Forget some or all of map (depends on parameters). */
1029 register int zx, zy;
1035 for (zx = 0; zx < COLNO; zx++)
1036 for (zy = 0; zy < ROWNO; zy++)
1037 if (howmuch & ALL_MAP || rn2(7)) {
1038 /* Zonk all memory of this location. */
1039 levl[zx][zy].seenv = 0;
1040 levl[zx][zy].waslit = 0;
1041 levl[zx][zy].glyph = cmap_to_glyph(S_stone);
1042 lastseentyp[zx][zy] = STONE;
1044 /* forget overview data for this level */
1045 forget_mapseen(ledger_no(&u.uz));
1048 /* Forget all traps on the level. */
1052 register struct trap *trap;
1054 /* forget all traps (except the one the hero is in :-) */
1055 for (trap = ftrap; trap; trap = trap->ntrap)
1056 if ((trap->tx != u.ux || trap->ty != u.uy) && (trap->ttyp != HOLE))
1061 * Forget given % of all levels that the hero has visited and not forgotten,
1065 forget_levels(percent)
1069 xchar maxl, this_lev;
1070 int indices[MAXLINFO];
1075 if (percent <= 0 || percent > 100) {
1076 impossible("forget_levels: bad percent %d", percent);
1080 this_lev = ledger_no(&u.uz);
1081 maxl = maxledgerno();
1083 /* count & save indices of non-forgotten visited levels */
1084 /* Sokoban levels are pre-mapped for the player, and should stay
1085 * so, or they become nearly impossible to solve. But try to
1086 * shift the forgetting elsewhere by fiddling with percent
1087 * instead of forgetting fewer levels.
1089 indices[0] = 0; /* lint suppression */
1090 for (count = 0, i = 0; i <= maxl; i++)
1091 if ((level_info[i].flags & VISITED)
1092 && !(level_info[i].flags & FORGOTTEN) && i != this_lev) {
1093 if (ledger_to_dnum(i) == sokoban_dnum)
1096 indices[count++] = i;
1103 randomize(indices, count);
1105 /* forget first % of randomized indices */
1106 count = ((count * percent) + 50) / 100;
1107 for (i = 0; i < count; i++) {
1108 level_info[indices[i]].flags |= FORGOTTEN;
1109 forget_mapseen(indices[i]);
1115 * Forget some things (e.g. after reading a scroll of amnesia). When called,
1116 * the following are always forgotten:
1117 * - felt ball & chain
1119 * - part (6 out of 7) of the map
1121 * Other things are subject to flags:
1122 * howmuch & ALL_MAP = forget whole map
1123 * howmuch & ALL_SPELLS = forget all spells
1130 u.bc_felt = 0; /* forget felt ball&chain */
1132 forget_map(howmuch);
1135 /* 1 in 3 chance of forgetting some levels */
1137 forget_levels(rn2(25));
1139 /* 1 in 3 chance of forgetting some objects */
1141 forget_objects(rn2(25));
1143 if (howmuch & ALL_SPELLS)
1146 * Make sure that what was seen is restored correctly. To do this,
1147 * we need to go blind for an instant --- turn off the display,
1148 * then restart it. All this work is needed to correctly handle
1149 * walls which are stone on one side and wall on the other. Turning
1150 * off the seen bits above will make the wall revert to stone, but
1151 * there are cases where we don't want this to happen. The easiest
1152 * thing to do is to run it through the vision system again, which
1153 * is always correct.
1155 docrt(); /* this correctly will reset vision */
1158 /* monster is hit by scroll of taming's effect */
1160 maybe_tame(mtmp, sobj)
1164 int was_tame = mtmp->mtame;
1165 unsigned was_peaceful = mtmp->mpeaceful;
1168 setmangry(mtmp, FALSE);
1169 if (was_peaceful && !mtmp->mpeaceful)
1173 make_happy_shk(mtmp, FALSE);
1174 else if (!resist(mtmp, sobj->oclass, 0, NOTELL))
1175 (void) tamedog(mtmp, (struct obj *) 0);
1176 if ((!was_peaceful && mtmp->mpeaceful) || (!was_tame && mtmp->mtame))
1183 get_valid_stinking_cloud_pos(x,y)
1186 return (!(!isok(x,y) || !cansee(x, y)
1187 || !ACCESSIBLE(levl[x][y].typ)
1188 || distu(x, y) >= 32));
1192 is_valid_stinking_cloud_pos(x, y, showmsg)
1196 if (!get_valid_stinking_cloud_pos(x,y)) {
1199 You("smell rotten eggs.");
1201 pline("
\82
\82³
\82Á
\82½
\97\91\82Ì
\82É
\82¨
\82¢
\82ª
\82µ
\82½
\81D");
1208 display_stinking_cloud_positions(state)
1212 tmp_at(DISP_BEAM, cmap_to_glyph(S_goodpos));
1213 } else if (state == 1) {
1217 for (dx = -dist; dx <= dist; dx++)
1218 for (dy = -dist; dy <= dist; dy++) {
1221 if (get_valid_stinking_cloud_pos(x,y))
1225 tmp_at(DISP_END, 0);
1229 /* scroll effects; return 1 if we use up the scroll and possibly make it
1230 become discovered, 0 if caller should take care of those side-effects */
1233 struct obj *sobj; /* scroll, or fake spellbook object for scroll-like spell */
1235 int cval, otyp = sobj->otyp;
1236 boolean confused = (Confusion != 0), sblessed = sobj->blessed,
1237 scursed = sobj->cursed, already_known, old_erodeproof,
1241 if (objects[otyp].oc_magic)
1242 exercise(A_WIS, TRUE); /* just for trying */
1243 already_known = (sobj->oclass == SPBOOK_CLASS /* spell */
1244 || objects[otyp].oc_name_known);
1251 /* "stamped scroll" created via magic marker--without a stamp */
1252 pline("This scroll is marked \"postage due\".");
1254 /* scroll of mail obtained from bones file or from wishing;
1255 * note to the puzzled: the game Larn actually sends you junk
1260 "This seems to be junk mail addressed to the finder of the Eye of Larn.");
1262 "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");
1267 case SCR_ENCHANT_ARMOR: {
1269 boolean special_armor;
1272 otmp = some_armor(&youmonst);
1275 strange_feeling(sobj, !Blind
1276 ? "Your skin glows then fades."
1277 : "Your skin feels warm for a moment.");
1279 strange_feeling(sobj, !Blind
1280 ? "
\82 \82È
\82½
\82Ì
\91Ì
\82Í
\88ê
\8fu
\8bP
\82¢
\82½
\81D"
1281 : "
\82 \82È
\82½
\82Ì
\91Ì
\82Í
\88ê
\8fu
\92g
\82©
\82
\82È
\82Á
\82½
\81D");
1283 sobj = 0; /* useup() in strange_feeling() */
1284 exercise(A_CON, !scursed);
1285 exercise(A_STR, !scursed);
1289 old_erodeproof = (otmp->oerodeproof != 0);
1290 new_erodeproof = !scursed;
1291 otmp->oerodeproof = 0; /* for messages */
1293 otmp->rknown = FALSE;
1295 pline("%s warm for a moment.", Yobjnam2(otmp, "feel"));
1297 Your("%s
\82Í
\88ê
\8fu
\92g
\82©
\82
\82È
\82Á
\82½
\81D", xname(otmp));
1299 otmp->rknown = TRUE;
1301 pline("%s covered by a %s %s %s!", Yobjnam2(otmp, "are"),
1302 scursed ? "mottled" : "shimmering",
1303 hcolor(scursed ? NH_BLACK : NH_GOLDEN),
1305 : (is_shield(otmp) ? "layer" : "shield"));
1307 Your("%s
\82Í%s%s%s
\82Å
\95¢
\82í
\82ê
\82½
\81I", xname(otmp),
1308 jconj_adj(hcolor(scursed ? NH_BLACK : NH_GOLDEN)),
1309 scursed ? "
\8cõ
\82é
\82Ü
\82¾
\82ç
\82Ì" : "
\82ä
\82ç
\82ß
\82",
1310 scursed ? "
\8bP
\82«"
1311 : "
\83o
\83\8a\83A");
1314 if (new_erodeproof && (otmp->oeroded || otmp->oeroded2)) {
1315 otmp->oeroded = otmp->oeroded2 = 0;
1317 pline("%s as good as new!",
1318 Yobjnam2(otmp, Blind ? "feel" : "look"));
1320 Your("%s
\82Í
\90V
\95i
\93¯
\97l
\82É
\82È
\82Á
\82½
\81I",
1324 if (old_erodeproof && !new_erodeproof) {
1325 /* restore old_erodeproof before shop charges */
1326 otmp->oerodeproof = 1;
1327 costly_alteration(otmp, COST_DEGRD);
1329 otmp->oerodeproof = new_erodeproof ? 1 : 0;
1332 /* elven armor vibrates warningly when enchanted beyond a limit */
1333 special_armor = is_elven_armor(otmp)
1334 || (Role_if(PM_WIZARD) && otmp->otyp == CORNUTHAUM);
1336 same_color = (otmp->otyp == BLACK_DRAGON_SCALE_MAIL
1337 || otmp->otyp == BLACK_DRAGON_SCALES);
1339 same_color = (otmp->otyp == SILVER_DRAGON_SCALE_MAIL
1340 || otmp->otyp == SILVER_DRAGON_SCALES
1341 || otmp->otyp == SHIELD_OF_REFLECTION);
1345 /* KMH -- catch underflow */
1346 s = scursed ? -otmp->spe : otmp->spe;
1347 if (s > (special_armor ? 5 : 3) && rn2(s)) {
1348 otmp->in_use = TRUE;
1350 pline("%s violently %s%s%s for a while, then %s.", Yname2(otmp),
1351 otense(otmp, Blind ? "vibrate" : "glow"),
1352 (!Blind && !same_color) ? " " : "",
1353 (Blind || same_color) ? "" : hcolor(scursed ? NH_BLACK
1355 otense(otmp, "evaporate"));
1357 Your("%s
\82Í
\82µ
\82Î
\82ç
\82
\82Ì
\8aÔ
\8c\83\82µ
\82%s%s
\81C
\8fö
\94
\82µ
\82½
\81D", xname(otmp),
1358 (Blind || same_color) ? "" : jconj_adj(hcolor(scursed ? NH_BLACK : NH_SILVER)),
1359 Blind ? "
\90U
\93®
\82µ" : "
\8bP
\82«");
1361 remove_worn_item(otmp, FALSE);
1367 ? (rn2(otmp->spe) == 0)
1369 ? rnd(3 - otmp->spe / 3)
1371 if (s >= 0 && Is_dragon_scales(otmp)) {
1372 /* dragon scales get turned into dragon scale mail */
1374 pline("%s merges and hardens!", Yname2(otmp));
1376 Your("%s
\82Í
\97Z
\8d\87\82µ
\8cÅ
\82
\82È
\82Á
\82½
\81I", xname(otmp));
1377 setworn((struct obj *) 0, W_ARM);
1378 /* assumes same order */
1379 otmp->otyp += GRAY_DRAGON_SCALE_MAIL - GRAY_DRAGON_SCALES;
1384 } else if (otmp->cursed)
1387 setworn(otmp, W_ARM);
1389 alter_cost(otmp, 0L); /* shop bill */
1393 pline("%s %s%s%s%s for a %s.", Yname2(otmp),
1394 s == 0 ? "violently " : "",
1395 otense(otmp, Blind ? "vibrate" : "glow"),
1396 (!Blind && !same_color) ? " " : "",
1397 (Blind || same_color)
1398 ? "" : hcolor(scursed ? NH_BLACK : NH_SILVER),
1399 (s * s > 1) ? "while" : "moment");
1401 Your("%s
\82Í%s%s%s%s
\81D", xname(otmp),
1402 (s * s > 1) ? "
\82µ
\82Î
\82ç
\82
\82Ì
\8aÔ" : "
\88ê
\8fu",
1403 s == 0 ? "
\8c\83\82µ
\82" : "",
1404 (Blind || same_color) ? ""
1405 : jconj_adj(hcolor(sobj->cursed ? NH_BLACK : NH_SILVER)),
1406 Blind ? "
\90U
\93®
\82µ
\82½" : "
\8bP
\82¢
\82½");
1408 /* [this cost handling will need updating if shop pricing is
1409 ever changed to care about curse/bless status of armor] */
1411 costly_alteration(otmp, COST_DECHNT);
1412 if (scursed && !otmp->cursed)
1414 else if (sblessed && !otmp->blessed)
1416 else if (!scursed && otmp->cursed)
1421 known = otmp->known;
1422 /* update shop bill to reflect new higher price */
1423 if (s > 0 && otmp->unpaid)
1424 alter_cost(otmp, 0L);
1427 if ((otmp->spe > (special_armor ? 5 : 3))
1428 && (special_armor || !rn2(7)))
1430 pline("%s %s.", Yobjnam2(otmp, "suddenly vibrate"),
1431 Blind ? "again" : "unexpectedly");
1433 Your("%s
\82Í
\93Ë
\91R%s
\90U
\93®
\82µ
\82½
\81D", xname(otmp),
1434 Blind ? "
\82Ü
\82½" : "
\8ev
\82¢
\82à
\82æ
\82ç
\82¸");
1438 case SCR_DESTROY_ARMOR: {
1439 otmp = some_armor(&youmonst);
1443 strange_feeling(sobj, "Your bones itch.");
1445 strange_feeling(sobj, "
\8d\9c\82ª
\83\80\83Y
\83\80\83Y
\82·
\82é
\81D");
1446 sobj = 0; /* useup() in strange_feeling() */
1447 exercise(A_STR, FALSE);
1448 exercise(A_CON, FALSE);
1451 old_erodeproof = (otmp->oerodeproof != 0);
1452 new_erodeproof = scursed;
1453 otmp->oerodeproof = 0; /* for messages */
1454 p_glow2(otmp, NH_PURPLE);
1455 if (old_erodeproof && !new_erodeproof) {
1456 /* restore old_erodeproof before shop charges */
1457 otmp->oerodeproof = 1;
1458 costly_alteration(otmp, COST_DEGRD);
1460 otmp->oerodeproof = new_erodeproof ? 1 : 0;
1463 if (!scursed || !otmp || !otmp->cursed) {
1464 if (!destroy_arm(otmp)) {
1466 strange_feeling(sobj, "Your skin itches.");
1468 strange_feeling(sobj,"
\94ç
\95\86\82ª
\83\80\83Y
\83\80\83Y
\82·
\82é
\81D");
1469 sobj = 0; /* useup() in strange_feeling() */
1470 exercise(A_STR, FALSE);
1471 exercise(A_CON, FALSE);
1475 } else { /* armor and scroll both cursed */
1477 pline("%s.", Yobjnam2(otmp, "vibrate"));
1479 Your("%s
\82Í
\90U
\93®
\82µ
\82½
\81D", xname(otmp));
1480 if (otmp->spe >= -6) {
1484 make_stunned((HStun & TIMEOUT) + (long) rn1(10, 10), TRUE);
1487 case SCR_CONFUSE_MONSTER:
1488 case SPE_CONFUSE_MONSTER:
1489 if (youmonst.data->mlet != S_HUMAN || scursed) {
1492 You_feel("confused.");
1494 You_feel("confused.");
1495 make_confused(HConfusion + rnd(100), FALSE);
1496 } else if (confused) {
1499 Your("%s begin to %s%s.", makeplural(body_part(HAND)),
1500 Blind ? "tingle" : "glow ",
1501 Blind ? "" : hcolor(NH_PURPLE));
1503 Your("%s
\82Í%s%s
\82Í
\82¶
\82ß
\82½
\81D", makeplural(body_part(HAND)),
1504 Blind ? "" : jconj_adj(hcolor(NH_PURPLE)),
1505 Blind ? "
\83q
\83\8a\83q
\83\8a\82µ" : "
\8bP
\82«");
1507 make_confused(HConfusion + rnd(100), FALSE);
1510 pline("A %s%s surrounds your %s.",
1511 Blind ? "" : hcolor(NH_RED),
1512 Blind ? "faint buzz" : " glow", body_part(HEAD));
1514 pline("%s%s
\82ª
\82 \82È
\82½
\82Ì%s
\82ð
\8eæ
\82è
\8aª
\82¢
\82½
\81D",
1515 Blind ? "" : jconj_adj(hcolor(NH_RED)),
1516 Blind ? "
\82©
\82·
\82©
\82É
\83u
\81[
\83\93\82Æ
\96Â
\82é
\82à
\82Ì" : "
\8bP
\82
\82à
\82Ì",
1519 make_confused(0L, TRUE);
1524 Your("%s%s %s%s.", makeplural(body_part(HAND)),
1525 Blind ? "" : " begin to glow",
1526 Blind ? (const char *) "tingle" : hcolor(NH_RED),
1527 u.umconf ? " even more" : "");
1529 Your("%s
\82Í%s%s%s
\81D", makeplural(body_part(HAND)),
1530 u.umconf ? "
\8f
\82µ" : "",
1531 Blind ? (const char *) "
\83q
\83\8a\83q
\83\8a\82µ
\82½" : jconj_adj(hcolor(NH_RED)),
1532 Blind ? "" : "
\8bP
\82«
\82Í
\82¶
\82ß
\82½");
1538 Your("%s tingle %s sharply.", makeplural(body_part(HAND)),
1539 u.umconf ? "even more" : "very");
1541 Your("%s
\82Í%s
\83s
\83\8a\83s
\83\8a\82·
\82é
\81D", makeplural(body_part(HAND)),
1542 u.umconf ? "
\8f
\82µ" : "
\82Æ
\82Ä
\82à");
1546 Your("%s glow a%s brilliant %s.",
1547 makeplural(body_part(HAND)),
1548 u.umconf ? "n even more" : "", hcolor(NH_RED));
1550 Your("%s
\82Í%s%s
\96¾
\82é
\82
\8bP
\82¢
\82½
\81D",
1551 makeplural(body_part(HAND)),
1552 u.umconf ? "
\8f
\82µ" : "", jconj_adj(hcolor(NH_RED)));
1554 /* after a while, repeated uses become less effective */
1558 u.umconf += rn1(8, 2);
1562 case SCR_SCARE_MONSTER:
1563 case SPE_CAUSE_FEAR: {
1564 register int ct = 0;
1565 register struct monst *mtmp;
1567 for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) {
1568 if (DEADMONSTER(mtmp))
1570 if (cansee(mtmp->mx, mtmp->my)) {
1571 if (confused || scursed) {
1572 mtmp->mflee = mtmp->mfrozen = mtmp->msleeping = 0;
1574 } else if (!resist(mtmp, sobj->oclass, 0, NOTELL))
1575 monflee(mtmp, 0, FALSE, FALSE);
1577 ct++; /* pets don't laugh at you */
1580 if (otyp == SCR_SCARE_MONSTER || !ct)
1582 You_hear("%s %s.", (confused || scursed) ? "sad wailing"
1583 : "maniacal laughter",
1584 !ct ? "in the distance" : "close by");
1586 You_hear("
\89\93\82
\82Å%s
\82ð
\95·
\82¢
\82½
\81D",
1587 (confused || sobj->cursed) ? "
\94ß
\82µ
\82
\8b\83\82«
\8b©
\82Ô
\90º"
1588 : "
\8b¶
\82Á
\82½
\82æ
\82¤
\82É
\8fÎ
\82¤
\90º");
1592 case SCR_BLANK_PAPER:
1595 You("don't remember there being any magic words on this scroll.");
1597 You("
\8aª
\95¨
\82É
\8eô
\95¶
\82ª
\8f\91\82¢
\82Ä
\82È
\82©
\82Á
\82½
\82±
\82Æ
\82ð
\8ev
\82¢
\82¾
\82µ
\82½
\81D");
1600 pline("This scroll seems to be blank.");
1602 pline("
\82±
\82Ì
\8aª
\95¨
\82É
\82Í
\89½
\82à
\8f\91\82¢
\82Ä
\82È
\82¢
\82æ
\82¤
\82É
\8c©
\82¦
\82é
\81D");
1605 case SCR_REMOVE_CURSE:
1606 case SPE_REMOVE_CURSE: {
1607 register struct obj *obj;
1610 You_feel(!Hallucination
1611 ? (!confused ? "like someone is helping you."
1612 : "like you need some help.")
1613 : (!confused ? "in touch with the Universal Oneness."
1614 : "the power of the Force against you!"));
1617 ? (!confused ? "
\92N
\82©
\82ª
\82 \82È
\82½
\82ð
\8f\95\82¯
\82Ä
\82¢
\82é
\82æ
\82¤
\82È
\8bC
\82ª
\82µ
\82½
\81D"
1618 : "
\8e©
\95ª
\82ª
\8f\95\82¯
\82ð
\95K
\97v
\82Æ
\82µ
\82Ä
\82¢
\82é
\82æ
\82¤
\82È
\8bC
\82ª
\82µ
\82½
\81D")
1619 : (!confused ? "
\89F
\92\88\92²
\98a
\82Ì
\8c´
\97\9d\82É
\90G
\82ê
\82Ä
\82¢
\82é
\82æ
\82¤
\82È
\8bC
\82ª
\82µ
\82½
\81D"
1620 : "
\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"));
1625 pline_The("scroll disintegrates.");
1627 pline("
\8aª
\95¨
\82Í
\95²
\81X
\82É
\82È
\82Á
\82½
\81D");
1629 for (obj = invent; obj; obj = obj->nobj) {
1632 /* gold isn't subject to cursing and blessing */
1633 if (obj->oclass == COIN_CLASS)
1635 wornmask = (obj->owornmask & ~(W_BALL | W_ART | W_ARTI));
1636 if (wornmask && !sblessed) {
1637 /* handle a couple of special cases; we don't
1638 allow auxiliary weapon slots to be used to
1639 artificially increase number of worn items */
1640 if (obj == uswapwep) {
1643 } else if (obj == uquiver) {
1644 if (obj->oclass == WEAPON_CLASS) {
1645 /* mergeable weapon test covers ammo,
1646 missiles, spears, daggers & knives */
1647 if (!objects[obj->otyp].oc_merge)
1649 } else if (obj->oclass == GEM_CLASS) {
1650 /* possibly ought to check whether
1651 alternate weapon is a sling... */
1655 /* weptools don't merge and aren't
1656 reasonable quivered weapons */
1661 if (sblessed || wornmask || obj->otyp == LOADSTONE
1662 || (obj->otyp == LEASH && obj->leashmon)) {
1663 /* water price varies by curse/bless status */
1664 boolean shop_h2o = (obj->unpaid && obj->otyp == POT_WATER);
1667 blessorcurse(obj, 2);
1668 /* lose knowledge of this object's curse/bless
1669 state (even if it didn't actually change) */
1671 /* blessorcurse() only affects uncursed items
1672 so no need to worry about price of water
1673 going down (hence no costly_alteration) */
1674 if (shop_h2o && (obj->cursed || obj->blessed))
1675 alter_cost(obj, 0L); /* price goes up */
1676 } else if (obj->cursed) {
1678 costly_alteration(obj, COST_UNCURS);
1684 if (Punished && !confused)
1686 if (u.utrap && u.utraptype == TT_BURIEDBALL) {
1687 buried_ball_to_freedom();
1689 pline_The("clasp on your %s vanishes.", body_part(LEG));
1691 pline_The("%s
\82Ì
\8bà
\8bï
\82ª
\8fÁ
\82¦
\82½
\81D", body_part(LEG));
1696 case SCR_CREATE_MONSTER:
1697 case SPE_CREATE_MONSTER:
1698 if (create_critters(1 + ((confused || scursed) ? 12 : 0)
1699 + ((sblessed || rn2(73)) ? 0 : rnd(4)),
1700 confused ? &mons[PM_ACID_BLOB]
1701 : (struct permonst *) 0,
1704 /* no need to flush monsters; we ask for identification only if the
1705 * monsters are not visible
1708 case SCR_ENCHANT_WEAPON:
1709 /* [What about twoweapon mode? Proofing/repairing/enchanting both
1710 would be too powerful, but shouldn't we choose randomly between
1711 primary and secondary instead of always acting on primary?] */
1712 if (confused && uwep
1713 && erosion_matters(uwep) && uwep->oclass != ARMOR_CLASS) {
1714 old_erodeproof = (uwep->oerodeproof != 0);
1715 new_erodeproof = !scursed;
1716 uwep->oerodeproof = 0; /* for messages */
1718 uwep->rknown = FALSE;
1720 Your("weapon feels warm for a moment.");
1722 pline("
\95\90\8aí
\82ª
\88ê
\8fu
\92g
\82©
\82
\82È
\82Á
\82½
\82æ
\82¤
\82È
\8bC
\82ª
\82µ
\82½
\81D");
1724 uwep->rknown = TRUE;
1726 pline("%s covered by a %s %s %s!", Yobjnam2(uwep, "are"),
1727 scursed ? "mottled" : "shimmering",
1728 hcolor(scursed ? NH_PURPLE : NH_GOLDEN),
1729 scursed ? "glow" : "shield");
1731 Your("%s
\82Í%s%s%s
\82Å
\95¢
\82í
\82ê
\82½
\81I", xname(uwep),
1732 jconj_adj(hcolor(scursed ? NH_PURPLE : NH_GOLDEN)),
1733 scursed ? "
\8cõ
\82é
\82Ü
\82¾
\82ç
\82Ì" : "
\82ä
\82ç
\82ß
\82",
1734 scursed ? "
\8bP
\82«" : "
\83o
\83\8a\83A");
1737 if (new_erodeproof && (uwep->oeroded || uwep->oeroded2)) {
1738 uwep->oeroded = uwep->oeroded2 = 0;
1740 pline("%s as good as new!",
1741 Yobjnam2(uwep, Blind ? "feel" : "look"));
1743 pline("%s
\82Í
\90V
\95i
\93¯
\97l
\82É
\82È
\82Á
\82½
\81I", xname(uwep));
1746 if (old_erodeproof && !new_erodeproof) {
1747 /* restore old_erodeproof before shop charges */
1748 uwep->oerodeproof = 1;
1749 costly_alteration(uwep, COST_DEGRD);
1751 uwep->oerodeproof = new_erodeproof ? 1 : 0;
1754 if (!chwepon(sobj, scursed ? -1
1756 : (uwep->spe >= 9) ? !rn2(uwep->spe)
1757 : sblessed ? rnd(3 - uwep->spe / 3)
1759 sobj = 0; /* nothing enchanted: strange_feeling -> useup */
1762 case SPE_CHARM_MONSTER: {
1763 int candidates, res, results, vis_results;
1767 results = vis_results = maybe_tame(u.ustuck, sobj);
1769 int i, j, bd = confused ? 5 : 1;
1772 /* note: maybe_tame() can return either positive or
1773 negative values, but not both for the same scroll */
1774 candidates = results = vis_results = 0;
1775 for (i = -bd; i <= bd; i++)
1776 for (j = -bd; j <= bd; j++) {
1777 if (!isok(u.ux + i, u.uy + j))
1779 if ((mtmp = m_at(u.ux + i, u.uy + j)) != 0
1780 || (!i && !j && (mtmp = u.usteed) != 0)) {
1782 res = maybe_tame(mtmp, sobj);
1784 if (canspotmon(mtmp))
1791 pline("Nothing interesting %s.",
1792 !candidates ? "happens" : "seems to happen");
1794 pline("
\89½
\82à
\96Ê
\94\92\82¢
\82±
\82Æ
\82Í
\82¨
\82±
\82ç
\82È
\82©
\82Á
\82½%s
\81D",
1795 !candidates ? "" : "
\82æ
\82¤
\82¾");
1799 pline_The("neighborhood %s %sfriendlier.",
1800 vis_results ? "is" : "seems",
1801 (results < 0) ? "un" : "");
1803 pline_The("
\82¨
\97×
\82Æ
\82Ì
\92\87\82ª%s
\82
\82È
\82Á
\82½%s
\81D",
1804 (results < 0) ? "
\88«" : "
\97Ç",
1805 vis_results ? "" : "
\82æ
\82¤
\82¾");
1807 if (vis_results > 0)
1815 You("have found a scroll of genocide!");
1817 pline("
\82±
\82ê
\82Í
\8bs
\8eE
\82Ì
\8aª
\95¨
\82¾
\81I");
1820 do_class_genocide();
1822 do_genocide((!scursed) | (2 * !!Confusion));
1825 if (!confused || rn2(5)) {
1828 litroom(!confused && !scursed, sobj);
1829 if (!confused && !scursed) {
1830 if (lightdamage(sobj, TRUE, 5))
1834 /* could be scroll of create monster, don't set known ...*/
1835 (void) create_critters(1, !scursed ? &mons[PM_YELLOW_LIGHT]
1836 : &mons[PM_BLACK_LIGHT],
1840 case SCR_TELEPORTATION:
1841 if (confused || scursed) {
1844 known = scrolltele(sobj);
1847 case SCR_GOLD_DETECTION:
1848 if ((confused || scursed) ? trap_detect(sobj) : gold_detect(sobj))
1849 sobj = 0; /* failure: strange_feeling() -> useup() */
1851 case SCR_FOOD_DETECTION:
1852 case SPE_DETECT_FOOD:
1853 if (food_detect(sobj))
1854 sobj = 0; /* nothing detected: strange_feeling -> useup */
1857 /* known = TRUE; -- handled inline here */
1858 /* use up the scroll first, before makeknown() performs a
1859 perm_invent update; also simplifies empty invent check */
1861 sobj = 0; /* it's gone */
1864 You("identify this as an identify scroll.");
1866 You("
\82±
\82ê
\82Í
\8e¯
\95Ê
\82Ì
\8aª
\95¨
\82¾
\82Æ
\8e¯
\95Ê
\82µ
\82½
\81D");
1867 else if (!already_known || !invent)
1868 /* force feedback now if invent became
1869 empty after using up this scroll */
1871 pline("This is an identify scroll.");
1873 pline("
\82±
\82ê
\82Í
\8e¯
\95Ê
\82Ì
\8aª
\95¨
\82¾
\81D");
1875 (void) learnscrolltyp(SCR_IDENTIFY);
1879 if (sblessed || (!scursed && !rn2(5))) {
1881 /* note: if cval==0, identify all items */
1882 if (cval == 1 && sblessed && Luck > 0)
1885 if (invent && !confused) {
1886 identify_pack(cval, !already_known);
1887 } else if (otyp == SPE_IDENTIFY) {
1888 /* when casting a spell we know we're not confused,
1889 so inventory must be empty (another message has
1890 already been given above if reading a scroll) */
1892 pline("You're not carrying anything to be identified.");
1894 pline("
\82 \82È
\82½
\82Í
\8e¯
\95Ê
\82Å
\82«
\82é
\82à
\82Ì
\82ð
\82È
\82É
\82à
\8e\9d\82Á
\82Ä
\82¢
\82È
\82¢
\81D");
1901 You_feel("discharged.");
1903 You_feel("
\95ú
\8fo
\82³
\82ê
\82½
\8bC
\82ª
\82·
\82é
\81D");
1907 You_feel("charged up!");
1909 You_feel("
\8f[
\93U
\82³
\82ê
\82½
\82æ
\82¤
\82È
\8bC
\82ª
\82·
\82é
\81I");
1910 u.uen += d(sblessed ? 6 : 4, 4);
1911 if (u.uen > u.uenmax) /* if current energy is already at */
1912 u.uenmax = u.uen; /* or near maximum, increase maximum */
1914 u.uen = u.uenmax; /* otherwise restore current to max */
1919 /* known = TRUE; -- handled inline here */
1920 if (!already_known) {
1922 pline("This is a charging scroll.");
1924 pline("
\82±
\82ê
\82Í
\8f[
\93U
\82Ì
\8aª
\95¨
\82¾
\81I");
1927 /* use it up now to prevent it from showing in the
1928 getobj picklist because the "disappears" message
1929 was already delivered */
1931 sobj = 0; /* it's gone */
1932 otmp = getobj(all_count, "charge");
1934 recharge(otmp, scursed ? -1 : sblessed ? 1 : 0);
1936 case SCR_MAGIC_MAPPING:
1937 if (level.flags.nommap) {
1939 Your("mind is filled with crazy lines!");
1941 Your("
\90S
\82É
\82½
\82¾
\82È
\82ç
\82Ê
\90ü
\81I
\90ü
\81I
\90ü
\81I
\82ª
\95\82\82Ñ
\82 \82ª
\82Á
\82½
\81I");
1944 pline("Wow! Modern art.");
1946 pline("
\83\8f\83H
\81I
\83\82\83_
\83\93\83A
\81[
\83g
\82¾
\81I");
1949 Your("%s spins in bewilderment.", body_part(HEAD));
1951 You("
\93\96\98f
\82µ
\82Ä
\96Ú
\82ª
\82Ü
\82í
\82Á
\82½
\81D");
1952 make_confused(HConfusion + rnd(30), FALSE);
1958 for (x = 1; x < COLNO; x++)
1959 for (y = 0; y < ROWNO; y++)
1960 if (levl[x][y].typ == SDOOR)
1961 cvt_sdoor_to_door(&levl[x][y]);
1962 /* do_mapping() already reveals secret passages */
1966 case SPE_MAGIC_MAPPING:
1967 if (level.flags.nommap) {
1969 Your("%s spins as %s blocks the spell!", body_part(HEAD),
1972 You("
\89½
\82©
\82ª
\8eô
\95¶
\82ð
\82³
\82¦
\82¬
\82è
\81C
\96Ú
\82ª
\82Ü
\82í
\82Á
\82½
\81I");
1974 make_confused(HConfusion + rnd(30), FALSE);
1978 pline("A map coalesces in your mind!");
1980 pline("
\92n
\90}
\82ª
\82 \82È
\82½
\82Ì
\90S
\82É
\97Z
\8d\87\82µ
\82½
\81I");
1981 cval = (scursed && !confused);
1983 HConfusion = 1; /* to screw up map */
1986 HConfusion = 0; /* restore */
1988 pline("Unfortunately, you can't grasp the details.");
1990 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");
1995 forget((!sblessed ? ALL_SPELLS : 0)
1996 | (!confused || scursed ? ALL_MAP : 0));
1997 if (Hallucination) /* Ommmmmm! */
1999 Your("mind releases itself from mundane concerns.");
2001 Your("
\90S
\82Í
\95½
\96}
\82È
\97\98\8aQ
\8aÖ
\8cW
\82©
\82ç
\89ð
\95ú
\82³
\82ê
\82½
\81D");
2002 else if (!strncmpi(plname, "Maud", 4))
2005 "As your mind turns inward on itself, you forget everything else.");
2007 "
\82 \82È
\82½
\82Ì
\90S
\82Í
\93à
\91¤
\82É
\8cü
\82«
\81C
\91S
\82Ä
\82ð
\96Y
\82ê
\82Ä
\82µ
\82Ü
\82Á
\82½
\81D");
2010 pline("Who was that Maud person anyway?");
2012 pline("Maud
\82Á
\82Ä
\96º
\82Í
\82¢
\82Á
\82½
\82¢
\92N
\82¾
\82¢
\81H");
2015 pline("Thinking of Maud you forget everything else.");
2017 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");
2018 exercise(A_WIS, FALSE);
2026 cval = bcsign(sobj);
2027 dam = (2 * (rn1(3, 3) + 2 * cval) + 1) / 3;
2029 sobj = 0; /* it's gone */
2031 (void) learnscrolltyp(SCR_FIRE);
2033 if (Fire_resistance) {
2034 shieldeff(u.ux, u.uy);
2037 pline("Oh, look, what a pretty fire in your %s.",
2039 pline("
\82í
\82\9f\82²
\82ç
\82ñ
\81D
\8f¬
\82³
\82È
\89Î
\82ª%s
\82É
\82 \82é
\81D",
2040 makeplural(body_part(HAND)));
2043 You_feel("a pleasant warmth in your %s.",
2045 You_feel("%s
\82Ì
\92\86\82É
\89õ
\93K
\82È
\92g
\82©
\82³
\82ð
\8a´
\82¶
\82½
\81D",
2046 makeplural(body_part(HAND)));
2049 pline_The("scroll catches fire and you burn your %s.",
2051 pline("
\8aª
\95¨
\82É
\89Î
\82ª
\94R
\82¦
\82¤
\82Â
\82è
\81C
\82 \82È
\82½
\82Ì%s
\82ð
\8fÄ
\82¢
\82½
\81D",
2052 makeplural(body_part(HAND)));
2054 losehp(1, "scroll of fire", KILLED_BY_AN);
2056 losehp(1, "
\89\8a\82Ì
\8aª
\95¨
\82Å", KILLED_BY_AN);
2062 pline_The("%s around you vaporizes violently!", hliquid("water"));
2064 pline_The("
\82 \82È
\82½
\82Ì
\89ñ
\82è
\82Ì%s
\82Í
\82Í
\82°
\82µ
\82
\95¦
\93«
\82µ
\82½
\81I", hliquid("
\90\85"));
2068 pline("This is a scroll of fire!");
2070 pline("Where do you want to center the explosion?");
2071 getpos_sethilite(display_stinking_cloud_positions, get_valid_stinking_cloud_pos);
2072 (void) getpos(&cc, TRUE, "the desired position");
2073 if (!is_valid_stinking_cloud_pos(cc.x, cc.y, FALSE)) {
2074 /* try to reach too far, get burned */
2079 if (cc.x == u.ux && cc.y == u.uy) {
2081 pline_The("scroll erupts in a tower of flame!");
2083 pline("
\8aª
\95¨
\82©
\82ç
\89Î
\92\8c\82ª
\97§
\82¿
\8f¸
\82Á
\82½
\81I");
2084 iflags.last_msg = PLNMSG_TOWER_OF_FLAME; /* for explode() */
2088 explode(cc.x, cc.y, 11, dam, SCROLL_CLASS, EXPL_FIERY);
2092 /* TODO: handle steeds */
2093 if (!Is_rogue_level(&u.uz) && has_ceiling(&u.uz)
2094 && (!In_endgame(&u.uz) || Is_earthlevel(&u.uz))) {
2098 /* Identify the scroll */
2101 You_hear("rumbling.");
2103 You_hear("
\83S
\83\8d\83S
\83\8d\82Æ
\82¢
\82¤
\89¹
\82ð
\95·
\82¢
\82½
\81D");
2106 pline_The("%s rumbles %s you!", ceiling(u.ux, u.uy),
2107 sblessed ? "around" : "above");
2109 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",
2110 sblessed ? "
\82Ü
\82í
\82è" : "
\90^
\8fã", ceiling(u.ux,u.uy));
2115 /* Loop through the surrounding squares */
2117 for (x = u.ux - 1; x <= u.ux + 1; x++) {
2118 for (y = u.uy - 1; y <= u.uy + 1; y++) {
2119 /* Is this a suitable spot? */
2120 if (isok(x, y) && !closed_door(x, y)
2121 && !IS_ROCK(levl[x][y].typ)
2122 && !IS_AIR(levl[x][y].typ)
2123 && (x != u.ux || y != u.uy)) {
2125 drop_boulder_on_monster(x, y, confused, TRUE);
2129 /* Attack the player */
2131 drop_boulder_on_player(confused, !scursed, TRUE, FALSE);
2132 } else if (!nboulders)
2134 pline("But nothing else happens.");
2136 pline("
\82µ
\82©
\82µ
\91¼
\82É
\89½
\82à
\82¨
\82±
\82ç
\82È
\82©
\82Á
\82½
\81D");
2139 case SCR_PUNISHMENT:
2141 if (confused || sblessed) {
2143 You_feel("guilty.");
2145 You("
\8dß
\82ð
\8a´
\82¶
\82½
\81D");
2150 case SCR_STINKING_CLOUD: {
2155 You("have found a scroll of stinking cloud!");
2157 You("
\88«
\8fL
\89_
\82Ì
\8aª
\95¨
\82ð
\94
\8c©
\82µ
\82½
\81I");
2160 pline("Where do you want to center the %scloud?",
2161 already_known ? "stinking " : "");
2163 pline("
\89_
\82Ì
\92\86\90S
\82ð
\82Ç
\82±
\82É
\82µ
\82Ü
\82·
\82©
\81H");
2167 getpos_sethilite(display_stinking_cloud_positions, get_valid_stinking_cloud_pos);
2169 if (getpos(&cc, TRUE, "the desired position") < 0) {
2171 if (getpos(&cc, TRUE, "
\91_
\82¤
\8fê
\8f\8a") < 0) {
2175 if (!is_valid_stinking_cloud_pos(cc.x, cc.y, TRUE))
2177 (void) create_gas_cloud(cc.x, cc.y, 3 + bcsign(sobj),
2178 8 + 4 * bcsign(sobj));
2182 impossible("What weird effect is this? (%u)", otyp);
2184 return sobj ? 0 : 1;
2188 drop_boulder_on_player(confused, helmet_protects, byu, skip_uswallow)
2189 boolean confused, helmet_protects, byu, skip_uswallow;
2194 /* hit monster if swallowed */
2195 if (u.uswallow && !skip_uswallow) {
2196 drop_boulder_on_monster(u.ux, u.uy, confused, byu);
2200 otmp2 = mksobj(confused ? ROCK : BOULDER, FALSE, FALSE);
2203 otmp2->quan = confused ? rn1(5, 2) : 1;
2204 otmp2->owt = weight(otmp2);
2205 if (!amorphous(youmonst.data) && !Passes_walls
2206 && !noncorporeal(youmonst.data) && !unsolid(youmonst.data)) {
2208 You("are hit by %s!", doname(otmp2));
2210 pline("%s
\82ª
\96½
\92\86\82µ
\82½
\81I", doname(otmp2));
2211 dmg = dmgval(otmp2, &youmonst) * otmp2->quan;
2212 if (uarmh && helmet_protects) {
2213 if (is_metallic(uarmh)) {
2215 pline("Fortunately, you are wearing a hard helmet.");
2217 pline("
\8dK
\89^
\82É
\82à
\81C
\82 \82È
\82½
\82Í
\8cÅ
\82¢
\8a\95\82ð
\90g
\82É
\82Â
\82¯
\82Ä
\82¢
\82é
\81D");
2220 } else if (flags.verbose) {
2222 pline("%s does not protect you.", Yname2(uarmh));
2224 Your("%s
\82Å
\82Í
\8eç
\82ê
\82È
\82¢
\81D", xname(uarmh));
2229 wake_nearto(u.ux, u.uy, 4 * 4);
2230 /* Must be before the losehp(), for bones files */
2232 if (!flooreffects(otmp2, u.ux, u.uy, "fall")) {
2234 if (!flooreffects(otmp2, u.ux, u.uy, "
\97\8e\82¿
\82é")) {
2235 place_object(otmp2, u.ux, u.uy);
2241 losehp(Maybe_Half_Phys(dmg), "scroll of earth", KILLED_BY_AN);
2243 losehp(Maybe_Half_Phys(dmg), "
\91å
\92n
\82Ì
\8aª
\95¨
\82Å", KILLED_BY_AN);
2247 drop_boulder_on_monster(x, y, confused, byu)
2249 boolean confused, byu;
2251 register struct obj *otmp2;
2252 register struct monst *mtmp;
2254 /* Make the object(s) */
2255 otmp2 = mksobj(confused ? ROCK : BOULDER, FALSE, FALSE);
2257 return FALSE; /* Shouldn't happen */
2258 otmp2->quan = confused ? rn1(5, 2) : 1;
2259 otmp2->owt = weight(otmp2);
2261 /* Find the monster here (won't be player) */
2263 if (mtmp && !amorphous(mtmp->data) && !passes_walls(mtmp->data)
2264 && !noncorporeal(mtmp->data) && !unsolid(mtmp->data)) {
2265 struct obj *helmet = which_armor(mtmp, W_ARMH);
2268 if (cansee(mtmp->mx, mtmp->my)) {
2270 pline("%s is hit by %s!", Monnam(mtmp), doname(otmp2));
2272 pline("%s
\82ª%s
\82É
\96½
\92\86\82µ
\82½
\81I", doname(otmp2), Monnam(mtmp));
2273 if (mtmp->minvis && !canspotmon(mtmp))
2274 map_invisible(mtmp->mx, mtmp->my);
2275 } else if (u.uswallow && mtmp == u.ustuck)
2277 You_hear("something hit %s %s over your %s!",
2278 s_suffix(mon_nam(mtmp)), mbodypart(mtmp, STOMACH),
2281 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",
2283 mon_nam(mtmp), mbodypart(mtmp, STOMACH));
2286 mdmg = dmgval(otmp2, mtmp) * otmp2->quan;
2288 if (is_metallic(helmet)) {
2289 if (canspotmon(mtmp))
2291 pline("Fortunately, %s is wearing a hard helmet.",
2293 pline("
\8dK
\89^
\82É
\82à
\81C%s
\82Í
\8cÅ
\82¢
\8a\95\82ð
\90g
\82É
\82Â
\82¯
\82Ä
\82¢
\82é
\81D",
2297 You_hear("a clanging sound.");
2299 You_hear("
\83K
\83\89\83\93\83K
\83\89\83\93\82Æ
\82¢
\82¤
\89¹
\82ð
\95·
\82¢
\82½
\81D");
2303 if (canspotmon(mtmp))
2305 pline("%s's %s does not protect %s.", Monnam(mtmp),
2306 xname(helmet), mhim(mtmp));
2308 pline("%s
\82Ì%s
\82Å
\82Í
\8eç
\82ê
\82È
\82¢
\81D", Monnam(mtmp),
2314 if (mtmp->mhp <= 0) {
2319 pline("%s is killed.", Monnam(mtmp));
2321 pline("%s
\82Í
\8e\80\82ñ
\82¾
\81D", Monnam(mtmp));
2327 wake_nearto(x, y, 4 * 4);
2328 } else if (u.uswallow && mtmp == u.ustuck) {
2329 obfree(otmp2, (struct obj *) 0);
2330 /* fall through to player */
2331 drop_boulder_on_player(confused, TRUE, FALSE, TRUE);
2334 /* Drop the rock/boulder to the floor */
2336 if (!flooreffects(otmp2, x, y, "fall")) {
2338 if (!flooreffects(otmp2, x, y, "
\97\8e\82¿
\82é")) {
2339 place_object(otmp2, x, y);
2341 newsym(x, y); /* map the rock */
2346 /* overcharging any wand or zapping/engraving cursed wand */
2348 wand_explode(obj, chg)
2350 int chg; /* recharging */
2353 const char *expl = !chg ? "suddenly" : "vibrates violently and";
2355 const char *expl = !chg ? "
\93Ë
\91R" : "
\8c\83\82µ
\82
\90U
\93®
\82µ
\81C";
2358 /* number of damage dice */
2360 chg = 2; /* zap/engrave adjustment */
2363 n = 2; /* arbitrary minimum */
2364 /* size of damage dice */
2365 switch (obj->otyp) {
2369 case WAN_CANCELLATION:
2372 case WAN_UNDEAD_TURNING:
2378 case WAN_MAGIC_MISSILE:
2388 /* inflict damage and destroy the wand */
2390 obj->in_use = TRUE; /* in case losehp() is fatal (or --More--^C) */
2392 pline("%s %s explodes!", Yname2(obj), expl);
2394 pline("%s
\82Í%s
\94\9a\94
\82µ
\82½
\81I", xname(obj), expl);
2397 losehp(Maybe_Half_Phys(dmg), "exploding wand", KILLED_BY_AN);
2399 losehp(Maybe_Half_Phys(dmg), "
\8fñ
\82Ì
\94\9a\94
\82Å", KILLED_BY_AN);
2401 /* obscure side-effect */
2402 exercise(A_STR, FALSE);
2405 /* used to collect gremlins being hit by light so that they can be processed
2406 after vision for the entire lit area has been brought up to date */
2411 STATIC_VAR struct litmon *gremlins = 0;
2414 * Low-level lit-field update routine.
2422 struct litmon *gremlin;
2426 if ((mtmp = m_at(x, y)) != 0 && mtmp->data == &mons[PM_GREMLIN]) {
2427 gremlin = (struct litmon *) alloc(sizeof *gremlin);
2428 gremlin->mon = mtmp;
2429 gremlin->nxt = gremlins;
2434 snuff_light_source(x, y);
2440 register boolean on;
2443 char is_lit; /* value is irrelevant; we use its address
2444 as a `not null' flag for set_lit() */
2446 /* first produce the text (provided you're not blind) */
2448 register struct obj *otmp;
2453 pline("It seems even darker in here than before.");
2455 pline("
\91O
\82æ
\82è
\88Ã
\82
\82È
\82Á
\82½
\82æ
\82¤
\82É
\8c©
\82¦
\82é
\81D");
2457 if (uwep && artifact_light(uwep) && uwep->lamplit)
2459 pline("Suddenly, the only light left comes from %s!",
2461 pline("
\93Ë
\91R
\81C
\96¾
\82©
\82è
\82ª%s
\82¾
\82¯
\82É
\82È
\82Á
\82½
\81I",
2465 You("are surrounded by darkness!");
2467 You("
\88Ã
\88Å
\82É
\95¢
\82í
\82ê
\82½
\81I");
2471 /* the magic douses lamps, et al, too */
2472 for (otmp = invent; otmp; otmp = otmp->nobj)
2474 (void) snuff_lit(otmp);
2479 else if (is_animal(u.ustuck->data))
2481 pline("%s %s is lit.", s_suffix(Monnam(u.ustuck)),
2482 mbodypart(u.ustuck, STOMACH));
2484 pline("%s
\82Ì%s
\82Í
\96¾
\82é
\82
\82È
\82Á
\82½
\81D", Monnam(u.ustuck),
2485 mbodypart(u.ustuck, STOMACH));
2487 else if (is_whirly(u.ustuck->data))
2489 pline("%s shines briefly.", Monnam(u.ustuck));
2491 pline("%s
\82Í
\82¿
\82å
\82Á
\82Æ
\8bP
\82¢
\82½
\81D", Monnam(u.ustuck));
2494 pline("%s glistens.", Monnam(u.ustuck));
2496 pline("%s
\82Í
\82«
\82ç
\82«
\82ç
\8bP
\82¢
\82½
\81D", Monnam(u.ustuck));
2499 pline("A lit field surrounds you!");
2501 pline("
\93\94\82è
\82ª
\82 \82È
\82½
\82ð
\8eæ
\82è
\88Í
\82ñ
\82¾
\81I");
2504 /* No-op when swallowed or in water */
2505 if (u.uswallow || Underwater || Is_waterlevel(&u.uz))
2508 * If we are darkening the room and the hero is punished but not
2509 * blind, then we have to pick up and replace the ball and chain so
2510 * that we don't remember them if they are out of sight.
2512 if (Punished && !on && !Blind)
2513 move_bc(1, 0, uball->ox, uball->oy, uchain->ox, uchain->oy);
2515 if (Is_rogue_level(&u.uz)) {
2516 /* Can't use do_clear_area because MAX_RADIUS is too small */
2517 /* rogue lighting must light the entire room */
2518 int rnum = levl[u.ux][u.uy].roomno - ROOMOFFSET;
2522 for (rx = rooms[rnum].lx - 1; rx <= rooms[rnum].hx + 1; rx++)
2523 for (ry = rooms[rnum].ly - 1; ry <= rooms[rnum].hy + 1; ry++)
2525 (genericptr_t) (on ? &is_lit : (char *) 0));
2526 rooms[rnum].rlit = on;
2528 /* hallways remain dark on the rogue level */
2530 do_clear_area(u.ux, u.uy,
2531 (obj && obj->oclass == SCROLL_CLASS && obj->blessed)
2533 set_lit, (genericptr_t) (on ? &is_lit : (char *) 0));
2536 * If we are not blind, then force a redraw on all positions in sight
2537 * by temporarily blinding the hero. The vision recalculation will
2538 * correctly update all previously seen positions *and* correctly
2539 * set the waslit bit [could be messed up from above].
2544 /* replace ball&chain */
2545 if (Punished && !on)
2546 move_bc(0, 0, uball->ox, uball->oy, uchain->ox, uchain->oy);
2549 vision_full_recalc = 1; /* delayed vision recalculation */
2551 struct litmon *gremlin;
2553 /* can't delay vision recalc after all */
2555 /* after vision has been updated, monsters who are affected
2556 when hit by light can now be hit by it */
2559 gremlins = gremlin->nxt;
2560 light_hits_gremlin(gremlin->mon, rnd(5));
2561 free((genericptr_t) gremlin);
2569 int i, j, immunecnt, gonecnt, goodcnt, class, feel_dead = 0;
2570 char buf[BUFSZ] = DUMMY;
2571 boolean gameover = FALSE; /* true iff killed self */
2575 pline1(thats_enough_tries);
2580 getlin("What class of monsters do you wish to genocide?", buf);
2582 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);
2583 (void) mungspaces(buf);
2585 /* choosing "none" preserves genocideless conduct */
2587 if (*buf == '\033' || !strcmpi(buf, "none")
2588 || !strcmpi(buf, "nothing"))
2590 if (*buf == '\033' || !strcmpi(buf, "
\82È
\82µ")
2591 || !strcmpi(buf, "
\96³
\82µ"))
2595 class = name_to_monclass(buf, (int *) 0);
2596 if (class == 0 && (i = name_to_mon(buf)) != NON_PM)
2597 class = mons[i].mlet;
2598 immunecnt = gonecnt = goodcnt = 0;
2599 for (i = LOW_PM; i < NUMMONS; i++) {
2600 if (mons[i].mlet == class) {
2601 if (!(mons[i].geno & G_GENO))
2603 else if (mvitals[i].mvflags & G_GENOD)
2609 if (!goodcnt && class != mons[urole.malenum].mlet
2610 && class != mons[urace.malenum].mlet) {
2613 pline("All such monsters are already nonexistent.");
2615 pline("
\82»
\82Ì
\89ö
\95¨
\82Í
\82à
\82¤
\82¢
\82È
\82¢
\81D");
2616 else if (immunecnt || class == S_invisible)
2618 You("aren't permitted to genocide such monsters.");
2620 You("
\82»
\82Ì
\89ö
\95¨
\82ð
\8bs
\8eE
\82·
\82é
\82±
\82Æ
\82Í
\82Å
\82«
\82È
\82¢
\81D");
2621 else if (wizard && buf[0] == '*') {
2622 register struct monst *mtmp, *mtmp2;
2625 for (mtmp = fmon; mtmp; mtmp = mtmp2) {
2627 if (DEADMONSTER(mtmp))
2633 pline("Eliminated %d monster%s.", gonecnt, plur(gonecnt));
2635 pline("%d
\82Ì
\89ö
\95¨
\82ð
\8f\9c\82¢
\82½
\81D", gonecnt);
2639 pline("That %s does not represent any monster.",
2640 strlen(buf) == 1 ? "symbol" : "response");
2642 pline("
\82»
\82Ì
\82æ
\82¤
\82È
\89ö
\95¨
\82Í
\82¢
\82È
\82¢
\81D");
2647 for (i = LOW_PM; i < NUMMONS; i++) {
2648 if (mons[i].mlet == class) {
2651 Strcpy(nam, makeplural(mons[i].mname));
2652 /* Although "genus" is Latin for race, the hero benefits
2653 * from both race and role; thus genocide affects either.
2655 if (Your_Own_Role(i) || Your_Own_Race(i)
2656 || ((mons[i].geno & G_GENO)
2657 && !(mvitals[i].mvflags & G_GENOD))) {
2658 /* This check must be first since player monsters might
2659 * have G_GENOD or !G_GENO.
2661 mvitals[i].mvflags |= (G_GENOD | G_NOCORPSE);
2663 kill_genocided_monsters();
2664 update_inventory(); /* eggs & tins */
2666 pline("Wiped out all %s.", nam);
2668 pline("%s
\82ð
\91S
\82Ä
\94r
\8f\9c\82µ
\82½
\81D", nam);
2669 if (Upolyd && i == u.umonnum) {
2676 You("
\8e\80\82É
\82Ü
\82µ
\82½
\81D
\81D
\81D");
2677 /* finish genociding this class of
2678 monsters before ultimately dying */
2683 /* Self-genocide if it matches either your race
2684 or role. Assumption: male and female forms
2685 share same monster class. */
2686 if (i == urole.malenum || i == urace.malenum) {
2691 You_feel("%s inside.", udeadinside());
2693 You("
\8d°
\82ª%s
\82æ
\82¤
\82È
\8bC
\82ª
\82µ
\82½
\81D", udeadinside());
2699 You("
\8e\80\82É
\82Ü
\82µ
\82½
\81D
\81D
\81D");
2703 } else if (mvitals[i].mvflags & G_GENOD) {
2706 pline("All %s are already nonexistent.", nam);
2708 pline("%s
\82Í
\8aù
\82É
\82¢
\82È
\82¢
\81D", nam);
2709 } else if (!gameover) {
2710 /* suppress feedback about quest beings except
2711 for those applicable to our own role */
2712 if ((mons[i].msound != MS_LEADER
2713 || quest_info(MS_LEADER) == i)
2714 && (mons[i].msound != MS_NEMESIS
2715 || quest_info(MS_NEMESIS) == i)
2716 && (mons[i].msound != MS_GUARDIAN
2717 || quest_info(MS_GUARDIAN) == i)
2718 /* non-leader/nemesis/guardian role-specific monster
2720 && (i != PM_NINJA /* nuisance */
2721 || Role_if(PM_SAMURAI))) {
2722 boolean named, uniq;
2724 named = type_is_pname(&mons[i]) ? TRUE : FALSE;
2725 uniq = (mons[i].geno & G_UNIQ) ? TRUE : FALSE;
2726 /* one special case */
2727 if (i == PM_HIGH_PRIEST)
2731 You("aren't permitted to genocide %s%s.",
2732 (uniq && !named) ? "the " : "",
2733 (uniq || named) ? mons[i].mname : nam);
2735 You("%s
\82ð
\8bs
\8eE
\82Å
\82«
\82È
\82¢
\81D",
2736 (uniq || named) ? mons[i].mname : nam);
2742 if (gameover || u.uhp == -1) {
2743 killer.format = KILLED_BY_AN;
2745 Strcpy(killer.name, "scroll of genocide");
2747 Strcpy(killer.name, "
\8bs
\8eE
\82Ì
\8aª
\95¨
\82Å");
2761 /* 0 = no genocide; create monsters (cursed scroll) */
2762 /* 1 = normal genocide */
2763 /* 3 = forced genocide of player */
2764 /* 5 (4 | 1) = normal genocide from throne */
2766 char buf[BUFSZ] = DUMMY;
2767 register int i, killplayer = 0;
2769 register struct permonst *ptr;
2773 mndx = u.umonster; /* non-polymorphed mon num */
2775 Strcpy(buf, ptr->mname);
2780 /* cursed effect => no free pass (unless rndmonst() fails) */
2781 if (!(how & REALLY) && (ptr = rndmonst()) != 0)
2784 pline1(thats_enough_tries);
2788 getlin("What monster do you want to genocide? [type the name]",
2790 getlin("
\82Ç
\82Ì
\89ö
\95¨
\82ð
\8bs
\8eE
\82µ
\82Ü
\82·
\82©
\81H[
\96¼
\91O
\82ð
\93ú
\96{
\8cê
\82Å
\93ü
\82ê
\82Ä
\82Ë]",
2792 (void) mungspaces(buf);
2793 /* choosing "none" preserves genocideless conduct */
2795 if (*buf == '\033' || !strcmpi(buf, "none")
2796 || !strcmpi(buf, "nothing")) {
2798 if (*buf == '\033' || !strcmpi(buf, "
\82È
\82µ")
2799 || !strcmpi(buf, "
\96³
\82µ")) {
2801 /* ... but no free pass if cursed */
2802 if (!(how & REALLY) && (ptr = rndmonst()) != 0)
2803 break; /* remaining checks don't apply */
2808 mndx = name_to_mon(buf);
2809 if (mndx == NON_PM || (mvitals[mndx].mvflags & G_GENOD)) {
2811 pline("Such creatures %s exist in this world.",
2812 (mndx == NON_PM) ? "do not" : "no longer");
2814 pline("
\82»
\82Ì
\82æ
\82¤
\82È
\90¶
\82«
\95¨
\82Í%s
\82±
\82Ì
\90¢
\8aE
\82É
\91¶
\8dÝ
\82µ
\82È
\82¢
\81D",
2815 (mndx == NON_PM) ? "" : "
\82à
\82Í
\82â");
2820 /* Although "genus" is Latin for race, the hero benefits
2821 * from both race and role; thus genocide affects either.
2823 if (Your_Own_Role(mndx) || Your_Own_Race(mndx)) {
2828 adjalign(-sgn(u.ualign.type));
2830 adjalign(sgn(u.ualign.type));
2832 if (!(ptr->geno & G_GENO)) {
2834 /* FIXME: unconditional "caverns" will be silly in some
2835 * circumstances. Who's speaking? Divine pronouncements
2836 * aren't supposed to be hampered by deafness....
2840 pline("A thunderous voice booms through the caverns:");
2842 pline("
\97\8b\82Ì
\82æ
\82¤
\82È
\90º
\82ª
\93´
\8cA
\82É
\8b¿
\82¢
\82½
\81F");
2844 verbalize("No, mortal! That will not be done.");
2846 pline("
\81u
\92è
\96½
\82Ì
\8eÒ
\82æ
\81I
\82»
\82Ì
\96]
\82Ý
\82Í
\82©
\82È
\82¤
\82Ü
\82¢
\81D
\81v");
2850 /* KMH -- Unchanging prevents rehumanization */
2851 if (Unchanging && ptr == youmonst.data)
2855 mndx = monsndx(ptr); /* needed for the 'no free pass' cases */
2862 if (Hallucination) {
2864 Strcpy(buf, youmonst.data->mname);
2866 Strcpy(buf, (flags.female && urole.name.f) ? urole.name.f
2868 buf[0] = lowc(buf[0]);
2871 Strcpy(buf, ptr->mname); /* make sure we have standard singular */
2872 if ((ptr->geno & G_UNIQ) && ptr != &mons[PM_HIGH_PRIEST])
2874 which = !type_is_pname(ptr) ? "the " : "";
2880 /* setting no-corpse affects wishing and random tin generation */
2881 mvitals[mndx].mvflags |= (G_GENOD | G_NOCORPSE);
2883 pline("Wiped out %s%s.", which,
2884 (*which != 'a') ? buf : makeplural(buf));
2886 pline("%s
\82ð%s
\88ê
\91|
\82µ
\82½
\81D", buf, which);
2890 /* might need to wipe out dual role */
2891 if (urole.femalenum != NON_PM && mndx == urole.malenum)
2892 mvitals[urole.femalenum].mvflags |= (G_GENOD | G_NOCORPSE);
2893 if (urole.femalenum != NON_PM && mndx == urole.femalenum)
2894 mvitals[urole.malenum].mvflags |= (G_GENOD | G_NOCORPSE);
2895 if (urace.femalenum != NON_PM && mndx == urace.malenum)
2896 mvitals[urace.femalenum].mvflags |= (G_GENOD | G_NOCORPSE);
2897 if (urace.femalenum != NON_PM && mndx == urace.femalenum)
2898 mvitals[urace.malenum].mvflags |= (G_GENOD | G_NOCORPSE);
2902 killer.format = KILLED_BY;
2904 Strcpy(killer.name, "genocidal confusion");
2906 Strcpy(killer.name, "
\8d¬
\97\90\82É
\82æ
\82é
\8e©
\8bs
\93I
\8bs
\8eE
\82Å");
2907 } else if (how & ONTHRONE) {
2908 /* player selected while on a throne */
2909 killer.format = KILLED_BY_AN;
2911 Strcpy(killer.name, "imperious order");
2913 Strcpy(killer.name, "
\98ü
\96\9d\82È
\96½
\97ß
\82Å");
2914 } else { /* selected player deliberately, not confused */
2915 killer.format = KILLED_BY_AN;
2917 Strcpy(killer.name, "scroll of genocide");
2919 Strcpy(killer.name, "
\8bs
\8eE
\82Ì
\8aª
\95¨
\82Å");
2922 /* Polymorphed characters will die as soon as they're rehumanized.
2924 /* KMH -- Unchanging prevents rehumanization */
2925 if (Upolyd && ptr != youmonst.data) {
2926 delayed_killer(POLYMORPH, killer.format, killer.name);
2928 You_feel("%s inside.", udeadinside());
2930 You_feel("
\8d°
\82ª%s
\82æ
\82¤
\82È
\8bC
\82ª
\82µ
\82½
\81D", udeadinside());
2933 } else if (ptr == youmonst.data) {
2936 reset_rndmonst(mndx);
2937 kill_genocided_monsters();
2938 update_inventory(); /* in case identified eggs were affected */
2940 int cnt = 0, census = monster_census(FALSE);
2942 if (!(mons[mndx].geno & G_UNIQ)
2943 && !(mvitals[mndx].mvflags & (G_GENOD | G_EXTINCT)))
2944 for (i = rn1(3, 4); i > 0; i--) {
2945 if (!makemon(ptr, u.ux, u.uy, NO_MINVENT))
2946 break; /* couldn't make one */
2948 if (mvitals[mndx].mvflags & G_EXTINCT)
2949 break; /* just made last one */
2952 /* accumulated 'cnt' doesn't take groups into account;
2953 assume bringing in new mon(s) didn't remove any old ones */
2954 cnt = monster_census(FALSE) - census;
2956 pline("Sent in %s%s.", (cnt > 1) ? "some " : "",
2957 (cnt > 1) ? makeplural(buf) : an(buf));
2959 pline("%s
\82ª
\91\97\82ç
\82ê
\82Ä
\82«
\82½
\81D", buf);
2962 pline1(nothing_happens);
2970 struct obj *reuse_ball = (sobj && sobj->otyp == HEAVY_IRON_BALL)
2971 ? sobj : (struct obj *) 0;
2973 /* KMH -- Punishment is still okay when you are riding */
2976 You("are being punished for your misbehavior!");
2978 You("
\95s
\8dì
\96@
\82Ì
\82½
\82ß
\94±
\82ð
\8eó
\82¯
\82½
\81I");
2981 Your("iron ball gets heavier.");
2983 Your("
\93S
\8b\85\82Í
\82³
\82ç
\82É
\8fd
\82
\82È
\82Á
\82½
\81D");
2984 uball->owt += IRON_BALL_W_INCR * (1 + sobj->cursed);
2987 if (amorphous(youmonst.data) || is_whirly(youmonst.data)
2988 || unsolid(youmonst.data)) {
2991 pline("A ball and chain appears, then falls away.");
2993 pline("
\93S
\8b\85\82Æ
\8d½
\82ª
\8c»
\82í
\82ê
\82½
\82ª
\81C
\82·
\82é
\82Á
\82Æ
\94²
\82¯
\82½
\81D");
2994 dropy(mkobj(BALL_CLASS, TRUE));
3000 setworn(mkobj(CHAIN_CLASS, TRUE), W_CHAIN);
3002 setworn(mkobj(BALL_CLASS, TRUE), W_BALL);
3004 setworn(reuse_ball, W_BALL);
3005 uball->spe = 1; /* special ball (see save) */
3008 * Place ball & chain if not swallowed. If swallowed, the ball &
3009 * chain variables will be set at the next call to placebc().
3014 set_bc(1); /* set up ball and chain variables */
3015 newsym(u.ux, u.uy); /* see ball&chain if can't see self */
3019 /* remove the ball and chain */
3023 struct obj *savechain = uchain;
3025 obj_extract_self(uchain);
3026 newsym(uchain->ox, uchain->oy);
3027 setworn((struct obj *) 0, W_CHAIN);
3028 dealloc_obj(savechain);
3030 setworn((struct obj *) 0, W_BALL);
3033 /* some creatures have special data structures that only make sense in their
3034 * normal locations -- if the player tries to create one elsewhere, or to
3035 * revive one, the disoriented creature becomes a zombie
3038 cant_revive(mtype, revival, from_obj)
3041 struct obj *from_obj;
3043 /* SHOPKEEPERS can be revived now */
3044 if (*mtype == PM_GUARD || (*mtype == PM_SHOPKEEPER && !revival)
3045 || *mtype == PM_HIGH_PRIEST || *mtype == PM_ALIGNED_PRIEST
3046 || *mtype == PM_ANGEL) {
3047 *mtype = PM_HUMAN_ZOMBIE;
3049 } else if (*mtype == PM_LONG_WORM_TAIL) { /* for create_particular() */
3050 *mtype = PM_LONG_WORM;
3052 } else if (unique_corpstat(&mons[*mtype])
3053 && (!from_obj || !has_omonst(from_obj))) {
3054 /* unique corpses (from bones or wizard mode wish) or
3055 statues (bones or any wish) end up as shapechangers */
3056 *mtype = PM_DOPPELGANGER;
3063 * Make a new monster with the type controlled by the user.
3065 * Note: when creating a monster by class letter, specifying the
3066 * "strange object" (']') symbol produces a random monster rather
3067 * than a mimic. This behavior quirk is useful so don't "fix" it
3068 * (use 'm'--or "mimic"--to create a random mimic).
3070 * Used in wizard mode only (for ^G command and for scroll or spell
3071 * of create monster). Once upon a time, an earlier incarnation of
3072 * this code was also used for the scroll/spell in explore mode.
3077 char buf[BUFSZ] = DUMMY, *bufp, monclass;
3079 int which, tryct, i, firstchoice = NON_PM;
3080 struct permonst *whichpm = NULL;
3082 boolean madeany = FALSE, randmonst = FALSE,
3083 maketame, makepeaceful, makehostile, saddled, invisible,
3089 monclass = MAXMCLASSES;
3090 which = urole.malenum; /* an arbitrary index into mons[] */
3091 maketame = makepeaceful = makehostile = FALSE;
3092 sleeping = saddled = invisible = FALSE;
3093 fem = -1; /* gender not specified */
3095 getlin("Create what kind of monster? [type the name or symbol]", buf);
3097 getlin("
\82Ç
\82Ì
\8eí
\82Ì
\89ö
\95¨
\82ð
\8dì
\82è
\82Ü
\82·
\82©
\81H[
\96¼
\91O
\82ð
\93ü
\82ê
\82Ä
\82Ë]", buf);
3098 bufp = mungspaces(buf);
3099 if (*bufp == '\033')
3101 if ((tmpp = strstri(bufp, "saddled ")) != 0) {
3103 (void) memset(tmpp, ' ', sizeof "saddled " - 1);
3105 if ((tmpp = strstri(bufp, "sleeping ")) != 0) {
3107 (void) memset(tmpp, ' ', sizeof "sleeping " - 1);
3109 if ((tmpp = strstri(bufp, "invisible ")) != 0) {
3111 (void) memset(tmpp, ' ', sizeof "invisible " - 1);
3113 /* check "female" before "male" to avoid false hit mid-word */
3114 if ((tmpp = strstri(bufp, "female ")) != 0) {
3116 (void) memset(tmpp, ' ', sizeof "female " - 1);
3118 if ((tmpp = strstri(bufp, "male ")) != 0) {
3120 (void) memset(tmpp, ' ', sizeof "male " - 1);
3122 bufp = mungspaces(bufp); /* after potential memset(' ') */
3123 /* allow the initial disposition to be specified */
3125 if (!strncmpi(bufp, "tame ", 5)) {
3128 if (!strncmpi(bufp, "
\8eè
\82È
\82¸
\82¯
\82ç
\82ê
\82½", 14)) {
3133 } else if (!strncmpi(bufp, "peaceful ", 9)) {
3136 } else if (!strncmpi(bufp, "
\97F
\8dD
\93I
\82È", 8)) {
3139 makepeaceful = TRUE;
3141 } else if (!strncmpi(bufp, "hostile ", 8)) {
3144 } else if (!strncmpi(bufp, "
\93G
\91Î
\93I
\82È", 8)) {
3149 /* decide whether a valid monster was chosen */
3151 if (wizard && (!strcmp(bufp, "*") || !strcmp(bufp, "random"))) {
3153 if (wizard && (!strcmp(bufp, "*") || !strcmp(bufp, "
\83\89\83\93\83_
\83\80"))) {
3157 which = name_to_mon(bufp);
3158 if (which >= LOW_PM)
3159 break; /* got one */
3160 monclass = name_to_monclass(bufp, &which);
3161 if (which >= LOW_PM) {
3162 monclass = MAXMCLASSES; /* matters below */
3164 } else if (monclass > 0) {
3165 which = urole.malenum; /* reset from NON_PM */
3168 /* no good; try again... */
3170 pline("I've never heard of such monsters.");
3172 pline("
\82»
\82Ì
\82æ
\82¤
\82È
\89ö
\95¨
\82Í
\95·
\82¢
\82½
\82±
\82Æ
\82ª
\82È
\82¢
\81D");
3173 } while (--tryct > 0);
3176 pline1(thats_enough_tries);
3179 firstchoice = which;
3180 if (cant_revive(&which, FALSE, (struct obj *) 0)) {
3181 /* wizard mode can override handling of special monsters */
3183 Sprintf(buf, "Creating %s instead; force %s?",
3184 mons[which].mname, mons[firstchoice].mname);
3186 Sprintf(buf, "
\91ã
\82í
\82è
\82É%s
\82ª
\8dì
\82ç
\82ê
\82Ü
\82·
\81G%s
\82É
\82·
\82é
\81H",
3187 mons[which].mname, mons[firstchoice].mname);
3190 which = firstchoice;
3192 whichpm = &mons[which];
3194 for (i = 0; i <= multi; i++) {
3195 if (monclass != MAXMCLASSES)
3196 whichpm = mkclass(monclass, 0);
3198 whichpm = rndmonst();
3199 mtmp = makemon(whichpm, u.ux, u.uy, NO_MM_FLAGS);
3201 /* quit trying if creation failed and is going to repeat */
3202 if (monclass == MAXMCLASSES && !randmonst)
3204 /* otherwise try again */
3207 /* 'is_FOO()' ought to be called 'always_FOO()' */
3208 if (fem != -1 && !is_male(mtmp->data) && !is_female(mtmp->data))
3209 mtmp->female = fem; /* ignored for is_neuter() */
3211 (void) tamedog(mtmp, (struct obj *) 0);
3212 } else if (makepeaceful || makehostile) {
3213 mtmp->mtame = 0; /* sanity precaution */
3214 mtmp->mpeaceful = makepeaceful ? 1 : 0;
3217 if (saddled && can_saddle(mtmp) && !which_armor(mtmp, W_SADDLE)) {
3218 struct obj *otmp = mksobj(SADDLE, TRUE, FALSE);
3220 put_saddle_on_mon(otmp, mtmp);
3223 mon_set_minvis(mtmp);
3225 mtmp->msleeping = 1;
3227 /* in case we got a doppelganger instead of what was asked
3228 for, make it start out looking like what was asked for */
3229 if (mtmp->cham != NON_PM && firstchoice != NON_PM
3230 && mtmp->cham != firstchoice)
3231 (void) newcham(mtmp, &mons[firstchoice], FALSE, FALSE);