-/* NetHack 3.6 read.c $NHDT-Date: 1515802375 2018/01/13 00:12:55 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.150 $ */
+/* NetHack 3.6 read.c $NHDT-Date: 1561485713 2019/06/25 18:01:53 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.172 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/*-Copyright (c) Robert Patrick Rankin, 2012. */
/* NetHack may be freely redistributed. See license for details. */
/* JNetHack Copyright */
/* (c) Issei Numata, Naoki Hamada, Shigehiro Miyashita, 1994-2000 */
-/* For 3.4-, Copyright (c) SHIRAKATA Kentaro, 2002-2018 */
+/* For 3.4-, Copyright (c) SHIRAKATA Kentaro, 2002-2022 */
/* JNetHack may be freely redistributed. See license for details. */
#include "hack.h"
static const char all_count[] = { ALLOW_COUNT, ALL_CLASSES, 0 };
STATIC_DCL boolean FDECL(learnscrolltyp, (SHORT_P));
-STATIC_DCL char * FDECL(erode_obj_text, (struct obj *, char *));
-STATIC_DCL void NDECL(do_class_genocide);
+STATIC_DCL char *FDECL(erode_obj_text, (struct obj *, char *));
+STATIC_DCL char *FDECL(apron_text, (struct obj *, char *buf));
STATIC_DCL void FDECL(stripspe, (struct obj *));
STATIC_DCL void FDECL(p_glow1, (struct obj *));
STATIC_DCL void FDECL(p_glow2, (struct obj *, const char *));
-STATIC_DCL void FDECL(randomize, (int *, int));
STATIC_DCL void FDECL(forget_single_object, (int));
+#if 0 /* not used */
+STATIC_DCL void FDECL(forget_objclass, (int));
+#endif
+STATIC_DCL void FDECL(randomize, (int *, int));
STATIC_DCL void FDECL(forget, (int));
STATIC_DCL int FDECL(maybe_tame, (struct monst *, struct obj *));
-STATIC_DCL boolean FDECL(is_valid_stinking_cloud_pos, (int, int, BOOLEAN_P));
-STATIC_DCL void FDECL(display_stinking_cloud_positions, (int));
STATIC_DCL boolean FDECL(get_valid_stinking_cloud_pos, (int, int));
+STATIC_DCL boolean FDECL(is_valid_stinking_cloud_pos, (int, int, BOOLEAN_P));
+STATIC_PTR void FDECL(display_stinking_cloud_positions, (int));
STATIC_PTR void FDECL(set_lit, (int, int, genericptr));
+STATIC_DCL void NDECL(do_class_genocide);
STATIC_OVL boolean
learnscrolltyp(scrolltyp)
(void) learnscrolltyp(sobj->otyp);
}
-char *
+STATIC_OVL char *
erode_obj_text(otmp, buf)
struct obj *otmp;
char *buf;
{
static const char *shirt_msgs[] = {
/* Scott Bigham */
-#if 0 /*JP*/
+#if 0 /*JP:T*/
"I explored the Dungeons of Doom and all I got was this lousy T-shirt!",
"Is that Mjollnir in your pocket or are you just happy to see me?",
"It's not the size of your sword, it's how #enhance'd you are with it.",
"\82g\82\85\82\8c\81|\82k\82n\82n\82n\81C\82m\82\95\82\92\82\93\82\85\81I", /* Animaniacs */
#endif
"=^.^=",
-#if 0 /*JP*/
+#if 0 /*JP:T*/
"100% goblin hair - do not wash",
"Aberzombie and Fitch",
"cK -- Cockatrice touches the Kop",
"\8e\84\82Í\83S\83\80\82Ì\96Ø\82É\92µ\82Ë\95Ô\82Á\82½", /* Monkey Island */
"\97ª\92D\93\87\97°\89©\8aC\8aÝ\83N\83\89\83u", /* Monkey Island */
#endif
-#if 0 /*JP*/
+#if 0 /*JP:T*/
"If you can read this, I can hit you with my polearm",
"I'm confused!",
"I scored with the princess",
"The Hellhound Gang",
"The Werewolves",
#endif
-#if 0 /*JP*/
+#if 0 /*JP:T*/
"They Might Be Storm Giants",
"Weapons don't kill people, I kill people",
"White Zombie",
"Hello, I'm War!",
"It is better to light a candle than to curse the darkness",
"It is easier to curse the darkness than to light a candle",
- /* expanded "rock--paper--scissors" featured in TV show "Big Bang
- Theory" although they didn't create it (and an actual T-shirt
- with pentagonal diagram showing which choices defeat which) */
- "rock--paper--scissors--lizard--Spock!",
- /* "All men must die -- all men must serve" challange and response
- from book series _A_Song_of_Ice_and_Fire_ by George R.R. Martin,
- TV show "Game of Thrones" (probably an actual T-shirt too...) */
- "/Valar morghulis/ -- /Valar dohaeris/",
#else
"\83[\83C\81E\83}\83C\83g\81E\83r\81[\81E\83X\83g\81[\83\80\81E\83W\83\83\83C\83A\83\93\83c",
"\95\90\8aí\82ª\90l\82ð\8eE\82·\82Ì\82Å\82Í\82È\82¢\81C\8e\84\82ª\90l\82ð\8eE\82·\82Ì\82¾",
"\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",
"\83}\83C\83\93\83h\83t\83\8c\83\84\8e\81\82Ë",
"\8e\84\82Í\83p\83\93\83c\82ð\90ú\82¢\82Ä\82¢\82Ü\82¹\82ñ",
- "Down with the living!",
+ "\90¶\8a\88\82ð\82Ô\82Á\89ó\82¹\81I",
"\83v\83\8a\83\93\94_\89Æ",
"\83x\83W\83^\83\8a\83A\83\93",
"\82â\82 \81C\8e\84\82ª\81w\90í\91\88\81x\82¾\81I",
- "It is better to light a candle than to curse the darkness",
- "It is easier to curse the darkness than to light a candle",
+ "\88Ã\82¢\82Æ\95s\95½\82ð\8c¾\82¤\82æ\82è\82à\81C\82·\82·\82ñ\82Å\82 \82©\82è\82ð\82Â\82¯\82Ü\82µ\82å\82¤",
+ "\82·\82·\82ñ\82Å\82 \82©\82è\82ð\82Â\82¯\82é\82æ\82è\81C\88Ã\82¢\82Æ\95s\95½\82ð\8c¾\82¤\95û\82ª\8aÈ\92P",
+#endif
/* expanded "rock--paper--scissors" featured in TV show "Big Bang
Theory" although they didn't create it (and an actual T-shirt
with pentagonal diagram showing which choices defeat which) */
+/*JP
"rock--paper--scissors--lizard--Spock!",
+*/
+ "\8aâ--\8e\86--\83n\83T\83~--\83g\83J\83Q--\83X\83|\83b\83N\81I",
/* "All men must die -- all men must serve" challange and response
from book series _A_Song_of_Ice_and_Fire_ by George R.R. Martin,
TV show "Game of Thrones" (probably an actual T-shirt too...) */
"/Valar morghulis/ -- /Valar dohaeris/",
-#endif
};
Strcpy(buf, shirt_msgs[tshirt->o_id % SIZE(shirt_msgs)]);
return erode_obj_text(tshirt, buf);
}
-char *
+STATIC_OVL char *
apron_text(apron, buf)
struct obj *apron;
char *buf;
{
static const char *apron_msgs[] = {
+/*JP
"Kiss the cook",
+*/
+ "\83R\83b\83N\82É\83L\83X\82¹\82æ",
+/*JP
"I'm making SCIENCE!",
+*/
+ "\8e\84\82Í*\89È\8aw*\82ð\8ds\82Á\82Ä\82¢\82é\81I",
+/*JP
"Don't mess with the chef",
+*/
+ "\83V\83F\83t\82É\82Í\8eè\82ð\8fo\82·\82È",
+/*JP
"Don't make me poison you",
+*/
+ "\82 \82È\82½\82É\93Å\82ð\90·\82ç\82³\82¹\82È\82¢\82Å",
+/*JP
"Gehennom's Kitchen",
+*/
+ "\83Q\83w\83i\83L\83b\83`\83\93",
+/*JP
"Rat: The other white meat",
+*/
+ "\83l\83Y\83~: \82à\82¤\88ê\82Â\82Ì\94\92\90g\93÷",
+/*JP
"If you can't stand the heat, get out of Gehennom!",
+*/
+ "\94M\82É\91Ï\82¦\82ç\82ê\82È\82¢\82È\82ç\81A\83Q\83w\83i\82©\82ç\8fo\82Ä\8ds\82¯\81I",
+/*JP
"If we weren't meant to eat animals, why are they made out of meat?",
+*/
+ "\82à\82µ\89ä\81X\82ª\93÷\82ð\90H\82×\82é\89^\96½\82Å\82Í\82È\82¢\82Ì\82È\82ç\81C\82È\82º\93®\95¨\82É\82Í\93÷\82ª\82 \82é\82Ì\81H",
+/*JP
"If you don't like the food, I'll stab you",
+*/
+ "\90H\82×\95¨\82ª\8bC\82É\93ü\82ç\82È\82¢\82È\82ç\81C\8eh\82·\82æ",
};
Strcpy(buf, apron_msgs[apron->o_id % SIZE(apron_msgs)]);
return 1;
} else if (scroll->otyp == CREDIT_CARD) {
static const char *card_msgs[] = {
-#if 0 /*JP*/
+#if 0 /*JP:T*/
"Leprechaun Gold Tru$t - Shamrock Card",
"Magic Memory Vault Charge Card",
"Larn National Bank", /* Larn */
return 0;
} else if (Blind && (scroll->otyp != SPE_BOOK_OF_THE_DEAD)) {
const char *what = 0;
+
if (scroll->oclass == SPBOOK_CLASS)
/*JP
what = "mystic runes";
maintained illiterate conduct so far, and this mail
scroll didn't come from bones, ask for confirmation */
if (!u.uconduct.literate) {
-#if 0 /*JP*/
+#if 0 /*JP:T*/
if (!scroll->spe && yn(
"Reading mail will violate \"illiterate\" conduct. Read anyway?"
) != 'y')
|| (scroll->otyp == SCR_REMOVE_CURSE
&& scroll->cursed));
if (Blind)
-#if 0 /*JP*/
+#if 0 /*JP:T*/
pline(nodisappear
? "You %s the formula on the scroll."
: "As you %s the formula on it, the scroll disappears.",
silently ? "\94O\82¶" : "\8f¥\82¦");
#endif
else
-#if 0 /*JP*/
+#if 0 /*JP:T*/
pline(nodisappear ? "You read the scroll."
: "As you read the scroll, it disappears.");
#else
*/
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");
else
-#if 0 /*JP*/
+#if 0 /*JP:T*/
pline("Being confused, you %s the magic words...",
silently ? "misunderstand" : "mispronounce");
#else
register struct obj *otmp;
register const char *color;
{
-#if 0 /*JP*/
+#if 0 /*JP:T*/
pline("%s%s%s for a moment.", Yobjnam2(otmp, Blind ? "vibrate" : "glow"),
Blind ? "" : " ", Blind ? "" : hcolor(color));
#else
Your("%s\82Í\88ê\8fu%s%s\81D", xname(otmp),
- Blind ? "" : jconj_adj(hcolor(color)),
+ Blind ? "" : hcolor_adv(color),
Blind ? "\90U\93®\82µ\82½" : "\8bP\82¢\82½");
#endif
}
/* destruction depends on current state, not adjustment */
if (obj->spe > rn2(7) || obj->spe <= -5) {
-#if 0 /*JP*/
+#if 0 /*JP:T*/
pline("%s momentarily, then %s!", Yobjnam2(obj, "pulsate"),
otense(obj, "explode"));
#else
} else {
long mask = is_on ? (obj == uleft ? LEFT_RING : RIGHT_RING) : 0L;
-#if 0 /*JP*/
+#if 0 /*JP:T*/
pline("%s spins %sclockwise for a moment.", Yname2(obj),
s < 0 ? "counter" : "");
#else
stripspe(obj);
if (obj->lamplit) {
if (!Blind)
-#if 0 /*JP*/
+#if 0 /*JP:T*/
pline("%s out!", Tobjnam(obj, "go"));
#else
pline("%s\82Í\8fÁ\82¦\82½\81I", xname(obj));
|| distu(x, y) >= 32));
}
-boolean
+STATIC_OVL boolean
is_valid_stinking_cloud_pos(x, y, showmsg)
int x, y;
boolean showmsg;
return TRUE;
}
-void
+STATIC_PTR void
display_stinking_cloud_positions(state)
int state;
{
otmp = some_armor(&youmonst);
if (!otmp) {
-#if 0 /*JP*/
+#if 0 /*JP:T*/
strange_feeling(sobj, !Blind
? "Your skin glows then fades."
: "Your skin feels warm for a moment.");
Your("%s\82Í\88ê\8fu\92g\82©\82\82È\82Á\82½\81D", xname(otmp));
} else {
otmp->rknown = TRUE;
-#if 0 /*JP*/
+#if 0 /*JP:T*/
pline("%s covered by a %s %s %s!", Yobjnam2(otmp, "are"),
scursed ? "mottled" : "shimmering",
hcolor(scursed ? NH_BLACK : NH_GOLDEN),
: (is_shield(otmp) ? "layer" : "shield"));
#else
Your("%s\82Í%s%s%s\82Å\95¢\82í\82ê\82½\81I", xname(otmp),
- jconj_adj(hcolor(scursed ? NH_BLACK : NH_GOLDEN)),
+ hcolor_adv(scursed ? NH_BLACK : NH_GOLDEN),
scursed ? "\8cõ\82é\82Ü\82¾\82ç\82Ì" : "\82ä\82ç\82ß\82",
scursed ? "\8bP\82«"
: "\83o\83\8a\83A");
}
if (new_erodeproof && (otmp->oeroded || otmp->oeroded2)) {
otmp->oeroded = otmp->oeroded2 = 0;
-#if 0 /*JP*/
+#if 0 /*JP:T*/
pline("%s as good as new!",
Yobjnam2(otmp, Blind ? "feel" : "look"));
#else
s = scursed ? -otmp->spe : otmp->spe;
if (s > (special_armor ? 5 : 3) && rn2(s)) {
otmp->in_use = TRUE;
-#if 0 /*JP*/
+#if 0 /*JP:T*/
pline("%s violently %s%s%s for a while, then %s.", Yname2(otmp),
otense(otmp, Blind ? "vibrate" : "glow"),
(!Blind && !same_color) ? " " : "",
otense(otmp, "evaporate"));
#else
Your("%s\82Í\82µ\82Î\82ç\82\82Ì\8aÔ\8c\83\82µ\82%s%s\81C\8fö\94\82µ\82½\81D", xname(otmp),
- (Blind || same_color) ? "" : jconj_adj(hcolor(scursed ? NH_BLACK : NH_SILVER)),
+ (Blind || same_color) ? "" : hcolor_adv(scursed ? NH_BLACK : NH_SILVER),
Blind ? "\90U\93®\82µ" : "\8bP\82«");
#endif
remove_worn_item(otmp, FALSE);
alter_cost(otmp, 0L); /* shop bill */
break;
}
-#if 0 /*JP*/
+#if 0 /*JP:T*/
pline("%s %s%s%s%s for a %s.", Yname2(otmp),
s == 0 ? "violently " : "",
otense(otmp, Blind ? "vibrate" : "glow"),
(s * s > 1) ? "\82µ\82Î\82ç\82\82Ì\8aÔ" : "\88ê\8fu",
s == 0 ? "\8c\83\82µ\82" : "",
(Blind || same_color) ? ""
- : jconj_adj(hcolor(sobj->cursed ? NH_BLACK : NH_SILVER)),
+ : hcolor_adv(sobj->cursed ? NH_BLACK : NH_SILVER),
Blind ? "\90U\93®\82µ\82½" : "\8bP\82¢\82½");
#endif
/* [this cost handling will need updating if shop pricing is
if ((otmp->spe > (special_armor ? 5 : 3))
&& (special_armor || !rn2(7)))
-#if 0 /*JP*/
+#if 0 /*JP:T*/
pline("%s %s.", Yobjnam2(otmp, "suddenly vibrate"),
Blind ? "again" : "unexpectedly");
#else
make_confused(HConfusion + rnd(100), FALSE);
} else if (confused) {
if (!sblessed) {
-#if 0 /*JP*/
+#if 0 /*JP:T*/
Your("%s begin to %s%s.", makeplural(body_part(HAND)),
Blind ? "tingle" : "glow ",
Blind ? "" : hcolor(NH_PURPLE));
#else
Your("%s\82Í%s%s\82Í\82¶\82ß\82½\81D", makeplural(body_part(HAND)),
- Blind ? "" : jconj_adj(hcolor(NH_PURPLE)),
+ Blind ? "" : hcolor_adv(NH_PURPLE),
Blind ? "\83q\83\8a\83q\83\8a\82µ" : "\8bP\82«");
#endif
make_confused(HConfusion + rnd(100), FALSE);
} else {
-#if 0 /*JP*/
+#if 0 /*JP:T*/
pline("A %s%s surrounds your %s.",
Blind ? "" : hcolor(NH_RED),
Blind ? "faint buzz" : " glow", body_part(HEAD));
#else
pline("%s%s\82ª\82 \82È\82½\82Ì%s\82ð\8eæ\82è\8aª\82¢\82½\81D",
- Blind ? "" : jconj_adj(hcolor(NH_RED)),
+ Blind ? "" : hcolor_adv(NH_RED),
Blind ? "\82©\82·\82©\82É\83u\81[\83\93\82Æ\96Â\82é\82à\82Ì" : "\8bP\82\82à\82Ì",
body_part(HEAD));
#endif
}
} else {
if (!sblessed) {
-#if 0 /*JP*/
+#if 0 /*JP:T*/
Your("%s%s %s%s.", makeplural(body_part(HAND)),
Blind ? "" : " begin to glow",
Blind ? (const char *) "tingle" : hcolor(NH_RED),
#else
Your("%s\82Í%s%s%s\81D", makeplural(body_part(HAND)),
u.umconf ? "\8f\82µ" : "",
- Blind ? (const char *) "\83q\83\8a\83q\83\8a\82µ\82½" : jconj_adj(hcolor(NH_RED)),
+ Blind ? (const char *) "\83q\83\8a\83q\83\8a\82µ\82½" : hcolor_adv(NH_RED),
Blind ? "" : "\8bP\82«\82Í\82¶\82ß\82½");
#endif
u.umconf++;
} else {
if (Blind)
-#if 0 /*JP*/
+#if 0 /*JP:T*/
Your("%s tingle %s sharply.", makeplural(body_part(HAND)),
u.umconf ? "even more" : "very");
#else
u.umconf ? "\8f\82µ" : "\82Æ\82Ä\82à");
#endif
else
-#if 0 /*JP*/
+#if 0 /*JP:T*/
Your("%s glow a%s brilliant %s.",
makeplural(body_part(HAND)),
u.umconf ? "n even more" : "", hcolor(NH_RED));
#else
Your("%s\82Í%s%s\96¾\82é\82\8bP\82¢\82½\81D",
makeplural(body_part(HAND)),
- u.umconf ? "\8f\82µ" : "", jconj_adj(hcolor(NH_RED)));
+ u.umconf ? "\8f\82µ" : "", hcolor_adv(NH_RED));
#endif
/* after a while, repeated uses become less effective */
if (u.umconf >= 40)
}
}
if (otyp == SCR_SCARE_MONSTER || !ct)
-#if 0 /*JP*/
+#if 0 /*JP:T*/
You_hear("%s %s.", (confused || scursed) ? "sad wailing"
: "maniacal laughter",
!ct ? "in the distance" : "close by");
#else
- You_hear("\89\93\82\82Å%s\82ð\95·\82¢\82½\81D",
+ You_hear("%s\82\82Å%s\82ð\95·\82¢\82½\81D",
+ !ct ? "\89\93" : "\8bß",
(confused || sobj->cursed) ? "\94ß\82µ\82\8b\83\82«\8b©\82Ô\90º"
: "\8b¶\82Á\82½\82æ\82¤\82É\8fÎ\82¤\90º");
#endif
case SPE_REMOVE_CURSE: {
register struct obj *obj;
-#if 0 /*JP*/
+#if 0 /*JP:T*/
You_feel(!Hallucination
? (!confused ? "like someone is helping you."
: "like you need some help.")
/* gold isn't subject to cursing and blessing */
if (obj->oclass == COIN_CLASS)
continue;
+ /* hide current scroll from itself so that perm_invent won't
+ show known blessed scroll losing bknown when confused */
+ if (obj == sobj && obj->quan == 1L)
+ continue;
wornmask = (obj->owornmask & ~(W_BALL | W_ART | W_ARTI));
if (wornmask && !sblessed) {
/* handle a couple of special cases; we don't
pline("\95\90\8aí\82ª\88ê\8fu\92g\82©\82\82È\82Á\82½\82æ\82¤\82È\8bC\82ª\82µ\82½\81D");
} else {
uwep->rknown = TRUE;
-#if 0 /*JP*/
+#if 0 /*JP:T*/
pline("%s covered by a %s %s %s!", Yobjnam2(uwep, "are"),
scursed ? "mottled" : "shimmering",
hcolor(scursed ? NH_PURPLE : NH_GOLDEN),
scursed ? "glow" : "shield");
#else
Your("%s\82Í%s%s%s\82Å\95¢\82í\82ê\82½\81I", xname(uwep),
- jconj_adj(hcolor(scursed ? NH_PURPLE : NH_GOLDEN)),
+ hcolor_adv(scursed ? NH_PURPLE : NH_GOLDEN),
scursed ? "\8cõ\82é\82Ü\82¾\82ç\82Ì" : "\82ä\82ç\82ß\82",
scursed ? "\8bP\82«" : "\83o\83\8a\83A");
#endif
}
if (new_erodeproof && (uwep->oeroded || uwep->oeroded2)) {
uwep->oeroded = uwep->oeroded2 = 0;
-#if 0 /*JP*/
+#if 0 /*JP:T*/
pline("%s as good as new!",
Yobjnam2(uwep, Blind ? "feel" : "look"));
#else
}
}
if (!results) {
-#if 0 /*JP*/
+#if 0 /*JP:T*/
pline("Nothing interesting %s.",
!candidates ? "happens" : "seems to happen");
#else
!candidates ? "" : "\82æ\82¤\82¾");
#endif
} else {
-#if 0 /*JP*/
+#if 0 /*JP:T*/
pline_The("neighborhood %s %sfriendlier.",
vis_results ? "is" : "seems",
(results < 0) ? "un" : "");
/*FALLTHRU*/
case SPE_MAGIC_MAPPING:
if (level.flags.nommap) {
-#if 0 /*JP*/
+#if 0 /*JP:T*/
Your("%s spins as %s blocks the spell!", body_part(HEAD),
something);
#else
pline("Where do you want to center the explosion?");
*/
pline("\82Ç\82±\82ð\94\9a\94\82Ì\92\86\90S\82É\82µ\82Ü\82·\82©\81H");
- getpos_sethilite(display_stinking_cloud_positions, get_valid_stinking_cloud_pos);
+ getpos_sethilite(display_stinking_cloud_positions,
+ get_valid_stinking_cloud_pos);
/*JP
(void) getpos(&cc, TRUE, "the desired position");
*/
}
if (cc.x == u.ux && cc.y == u.uy) {
/*JP
- pline_The("scroll erupts in a tower of flame!");
+ pline_The("scroll erupts in a tower of flame!");
*/
- pline("\8aª\95¨\82©\82ç\89Î\92\8c\82ª\97§\82¿\8f¸\82Á\82½\81I");
+ pline("\8aª\95¨\82©\82ç\89Î\92\8c\82ª\97§\82¿\8f¸\82Á\82½\81I");
iflags.last_msg = PLNMSG_TOWER_OF_FLAME; /* for explode() */
burn_away_slime();
}
*/
You_hear("\83S\83\8d\83S\83\8d\82Æ\82¢\82¤\89¹\82ð\95·\82¢\82½\81D");
else
-#if 0 /*JP*/
+#if 0 /*JP:T*/
pline_The("%s rumbles %s you!", ceiling(u.ux, u.uy),
sblessed ? "around" : "above");
#else
*/
You("\88«\8fL\89_\82Ì\8aª\95¨\82ð\94\8c©\82µ\82½\81I");
known = TRUE;
-#if 0 /*JP*/
+#if 0 /*JP:T*/
pline("Where do you want to center the %scloud?",
already_known ? "stinking " : "");
#else
- pline("\89_\82Ì\92\86\90S\82ð\82Ç\82±\82É\82µ\82Ü\82·\82©\81H");
+ pline("%s\89_\82Ì\92\86\90S\82ð\82Ç\82±\82É\82µ\82Ü\82·\82©\81H",
+ already_known ? "\88«\8fL" : "");
#endif
cc.x = u.ux;
cc.y = u.uy;
- getpos_sethilite(display_stinking_cloud_positions, get_valid_stinking_cloud_pos);
+ getpos_sethilite(display_stinking_cloud_positions,
+ get_valid_stinking_cloud_pos);
/*JP
if (getpos(&cc, TRUE, "the desired position") < 0) {
*/
default:
impossible("What weird effect is this? (%u)", otyp);
}
+ /* if sobj is gone, we've already called useup() above and the
+ update_inventory() that it performs might have come too soon
+ (before charging an item, for instance) */
+ if (!sobj)
+ update_inventory();
return sobj ? 0 : 1;
}
if (mtmp->minvis && !canspotmon(mtmp))
map_invisible(mtmp->mx, mtmp->my);
} else if (u.uswallow && mtmp == u.ustuck)
-#if 0 /*JP*/
+#if 0 /*JP:T*/
You_hear("something hit %s %s over your %s!",
s_suffix(mon_nam(mtmp)), mbodypart(mtmp, STOMACH),
body_part(HEAD));
mdmg = 2;
} else {
if (canspotmon(mtmp))
-#if 0 /*JP*/
+#if 0 /*JP:T*/
pline("%s's %s does not protect %s.", Monnam(mtmp),
xname(helmet), mhim(mtmp));
#else
}
}
mtmp->mhp -= mdmg;
- if (mtmp->mhp <= 0) {
+ if (DEADMONSTER(mtmp)) {
if (byu) {
killed(mtmp);
} else {
/* inflict damage and destroy the wand */
dmg = d(n, k);
obj->in_use = TRUE; /* in case losehp() is fatal (or --More--^C) */
-#if 0 /*JP*/
+#if 0 /*JP:T*/
pline("%s %s explodes!", Yname2(obj), expl);
#else
pline("%s\82Í%s\94\9a\94\82µ\82½\81I", xname(obj), expl);
if (Blind)
; /* no feedback */
else if (is_animal(u.ustuck->data))
-#if 0 /*JP*/
+#if 0 /*JP:T*/
pline("%s %s is lit.", s_suffix(Monnam(u.ustuck)),
mbodypart(u.ustuck, STOMACH));
#else
(void) mungspaces(buf);
} while (!*buf);
/* choosing "none" preserves genocideless conduct */
-#if 0 /*JP*/
+#if 0 /*JP:T*/
if (*buf == '\033' || !strcmpi(buf, "none")
|| !strcmpi(buf, "nothing"))
#else
if (how & REALLY) {
/* setting no-corpse affects wishing and random tin generation */
mvitals[mndx].mvflags |= (G_GENOD | G_NOCORPSE);
-#if 0 /*JP*/
+#if 0 /*JP:T*/
pline("Wiped out %s%s.", which,
(*which != 'a') ? buf : makeplural(buf));
#else
/* accumulated 'cnt' doesn't take groups into account;
assume bringing in new mon(s) didn't remove any old ones */
cnt = monster_census(FALSE) - census;
-#if 0 /*JP*/
+#if 0 /*JP:T*/
pline("Sent in %s%s.", (cnt > 1) ? "some " : "",
(cnt > 1) ? makeplural(buf) : an(buf));
#else
uball->spe = 1; /* special ball (see save) */
/*
- * Place ball & chain if not swallowed. If swallowed, the ball &
- * chain variables will be set at the next call to placebc().
+ * Place ball & chain if not swallowed. If swallowed, the ball & chain
+ * variables will be set at the next call to placebc().
*/
if (!u.uswallow) {
placebc();
{
struct obj *savechain = uchain;
+ /* chain goes away */
obj_extract_self(uchain);
newsym(uchain->ox, uchain->oy);
- setworn((struct obj *) 0, W_CHAIN);
+ setworn((struct obj *) 0, W_CHAIN); /* sets 'uchain' to Null */
dealloc_obj(savechain);
+ /* ball persists */
uball->spe = 0;
- setworn((struct obj *) 0, W_BALL);
+ setworn((struct obj *) 0, W_BALL); /* sets 'uball' to Null */
}
/* some creatures have special data structures that only make sense in their
return FALSE;
}
+struct _create_particular_data {
+ int which;
+ int fem;
+ char monclass;
+ boolean randmonst;
+ boolean maketame, makepeaceful, makehostile;
+ boolean sleeping, saddled, invisible, hidden;
+};
+
+boolean
+create_particular_parse(str, d)
+char *str;
+struct _create_particular_data *d;
+{
+ char *bufp = str;
+ char *tmpp;
+
+ d->monclass = MAXMCLASSES;
+ d->which = urole.malenum; /* an arbitrary index into mons[] */
+ d->fem = -1; /* gender not specified */
+ d->randmonst = FALSE;
+ d->maketame = d->makepeaceful = d->makehostile = FALSE;
+ d->sleeping = d->saddled = d->invisible = d->hidden = FALSE;
+
+ if ((tmpp = strstri(bufp, "saddled ")) != 0) {
+ d->saddled = TRUE;
+ (void) memset(tmpp, ' ', sizeof "saddled " - 1);
+ }
+ if ((tmpp = strstri(bufp, "sleeping ")) != 0) {
+ d->sleeping = TRUE;
+ (void) memset(tmpp, ' ', sizeof "sleeping " - 1);
+ }
+ if ((tmpp = strstri(bufp, "invisible ")) != 0) {
+ d->invisible = TRUE;
+ (void) memset(tmpp, ' ', sizeof "invisible " - 1);
+ }
+ if ((tmpp = strstri(bufp, "hidden ")) != 0) {
+ d->hidden = TRUE;
+ (void) memset(tmpp, ' ', sizeof "hidden " - 1);
+ }
+ /* check "female" before "male" to avoid false hit mid-word */
+ if ((tmpp = strstri(bufp, "female ")) != 0) {
+ d->fem = 1;
+ (void) memset(tmpp, ' ', sizeof "female " - 1);
+ }
+ if ((tmpp = strstri(bufp, "male ")) != 0) {
+ d->fem = 0;
+ (void) memset(tmpp, ' ', sizeof "male " - 1);
+ }
+ bufp = mungspaces(bufp); /* after potential memset(' ') */
+ /* allow the initial disposition to be specified */
+#if 0 /*JP:T*/
+ if (!strncmpi(bufp, "tame ", 5)) {
+ bufp += 5;
+#else
+ if (!STRNCMP2(bufp, "\8eè\82È\82¸\82¯\82ç\82ê\82½")) {
+ bufp += 14;
+#endif
+ d->maketame = TRUE;
+#if 0 /*JP:T*/
+ } else if (!strncmpi(bufp, "peaceful ", 9)) {
+ bufp += 9;
+#else
+ } else if (!STRNCMP2(bufp, "\97F\8dD\93I\82È")) {
+ bufp += 8;
+#endif
+ d->makepeaceful = TRUE;
+#if 0 /*JP:T*/
+ } else if (!strncmpi(bufp, "hostile ", 8)) {
+ bufp += 8;
+#else
+ } else if (!STRNCMP2(bufp, "\93G\91Î\93I\82È")) {
+ bufp += 8;
+#endif
+ d->makehostile = TRUE;
+ }
+ /* decide whether a valid monster was chosen */
+/*JP
+ if (wizard && (!strcmp(bufp, "*") || !strcmp(bufp, "random"))) {
+*/
+ if (wizard && (!strcmp(bufp, "*") || !strcmp(bufp, "\83\89\83\93\83_\83\80"))) {
+ d->randmonst = TRUE;
+ return TRUE;
+ }
+ d->which = name_to_mon(bufp);
+ if (d->which >= LOW_PM)
+ return TRUE; /* got one */
+ d->monclass = name_to_monclass(bufp, &d->which);
+
+ if (d->which >= LOW_PM) {
+ d->monclass = MAXMCLASSES; /* matters below */
+ return TRUE;
+ } else if (d->monclass == S_invisible) { /* not an actual monster class */
+ d->which = PM_STALKER;
+ d->monclass = MAXMCLASSES;
+ return TRUE;
+ } else if (d->monclass == S_WORM_TAIL) { /* empty monster class */
+ d->which = PM_LONG_WORM;
+ d->monclass = MAXMCLASSES;
+ return TRUE;
+ } else if (d->monclass > 0) {
+ d->which = urole.malenum; /* reset from NON_PM */
+ return TRUE;
+ }
+ return FALSE;
+}
+
+boolean
+create_particular_creation(d)
+struct _create_particular_data *d;
+{
+ struct permonst *whichpm = NULL;
+ int i, mx, my, firstchoice = NON_PM;
+ struct monst *mtmp;
+ boolean madeany = FALSE;
+
+ if (!d->randmonst) {
+ firstchoice = d->which;
+ if (cant_revive(&d->which, FALSE, (struct obj *) 0)
+ && firstchoice != PM_LONG_WORM_TAIL) {
+ /* wizard mode can override handling of special monsters */
+ char buf[BUFSZ];
+
+#if 0 /*JP:T*/
+ Sprintf(buf, "Creating %s instead; force %s?",
+ mons[d->which].mname, mons[firstchoice].mname);
+#else
+ Sprintf(buf, "\91ã\82í\82è\82É%s\82ª\8dì\82ç\82ê\82Ü\82·\81G%s\82É\82·\82é\81H",
+ mons[d->which].mname, mons[firstchoice].mname);
+#endif
+ if (yn(buf) == 'y')
+ d->which = firstchoice;
+ }
+ whichpm = &mons[d->which];
+ }
+ for (i = 0; i <= multi; i++) {
+ if (d->monclass != MAXMCLASSES)
+ whichpm = mkclass(d->monclass, 0);
+ else if (d->randmonst)
+ whichpm = rndmonst();
+ mtmp = makemon(whichpm, u.ux, u.uy, NO_MM_FLAGS);
+ if (!mtmp) {
+ /* quit trying if creation failed and is going to repeat */
+ if (d->monclass == MAXMCLASSES && !d->randmonst)
+ break;
+ /* otherwise try again */
+ continue;
+ }
+ mx = mtmp->mx, my = mtmp->my;
+ /* 'is_FOO()' ought to be called 'always_FOO()' */
+ if (d->fem != -1 && !is_male(mtmp->data) && !is_female(mtmp->data))
+ mtmp->female = d->fem; /* ignored for is_neuter() */
+ if (d->maketame) {
+ (void) tamedog(mtmp, (struct obj *) 0);
+ } else if (d->makepeaceful || d->makehostile) {
+ mtmp->mtame = 0; /* sanity precaution */
+ mtmp->mpeaceful = d->makepeaceful ? 1 : 0;
+ set_malign(mtmp);
+ }
+ if (d->saddled && can_saddle(mtmp) && !which_armor(mtmp, W_SADDLE)) {
+ struct obj *otmp = mksobj(SADDLE, TRUE, FALSE);
+
+ put_saddle_on_mon(otmp, mtmp);
+ }
+ if (d->invisible) {
+ mon_set_minvis(mtmp);
+ if (does_block(mx, my, &levl[mx][my]))
+ block_point(mx, my);
+ else
+ unblock_point(mx, my);
+ }
+ if (d->hidden
+ && ((is_hider(mtmp->data) && mtmp->data->mlet != S_MIMIC)
+ || (hides_under(mtmp->data) && OBJ_AT(mx, my))
+ || (mtmp->data->mlet == S_EEL && is_pool(mx, my))))
+ mtmp->mundetected = 1;
+ if (d->sleeping)
+ mtmp->msleeping = 1;
+ /* iff asking for 'hidden', show locaton of every created monster
+ that can't be seen--whether that's due to successfully hiding
+ or vision issues (line-of-sight, invisibility, blindness) */
+ if (d->hidden && !canspotmon(mtmp)) {
+ int count = couldsee(mx, my) ? 8 : 4;
+ char saveviz = viz_array[my][mx];
+
+ if (!flags.sparkle)
+ count /= 2;
+ viz_array[my][mx] |= (IN_SIGHT | COULD_SEE);
+ flash_glyph_at(mx, my, mon_to_glyph(mtmp, newsym_rn2), count);
+ viz_array[my][mx] = saveviz;
+ newsym(mx, my);
+ }
+ madeany = TRUE;
+ /* in case we got a doppelganger instead of what was asked
+ for, make it start out looking like what was asked for */
+ if (mtmp->cham != NON_PM && firstchoice != NON_PM
+ && mtmp->cham != firstchoice)
+ (void) newcham(mtmp, &mons[firstchoice], FALSE, FALSE);
+ }
+ return madeany;
+}
+
/*
* Make a new monster with the type controlled by the user.
*
boolean
create_particular()
{
- char buf[BUFSZ] = DUMMY, *bufp, monclass;
- char *tmpp;
- int which, tryct, i, firstchoice = NON_PM;
- struct permonst *whichpm = NULL;
- struct monst *mtmp;
- boolean madeany = FALSE, randmonst = FALSE,
- maketame, makepeaceful, makehostile, saddled, invisible,
- sleeping;
- int fem;
+ char buf[BUFSZ] = DUMMY, *bufp;
+ int tryct = 5;
+ struct _create_particular_data d;
- tryct = 5;
do {
- monclass = MAXMCLASSES;
- which = urole.malenum; /* an arbitrary index into mons[] */
- maketame = makepeaceful = makehostile = FALSE;
- sleeping = saddled = invisible = FALSE;
- fem = -1; /* gender not specified */
/*JP
getlin("Create what kind of monster? [type the name or symbol]", buf);
*/
bufp = mungspaces(buf);
if (*bufp == '\033')
return FALSE;
- if ((tmpp = strstri(bufp, "saddled ")) != 0) {
- saddled = TRUE;
- (void) memset(tmpp, ' ', sizeof "saddled " - 1);
- }
- if ((tmpp = strstri(bufp, "sleeping ")) != 0) {
- sleeping = TRUE;
- (void) memset(tmpp, ' ', sizeof "sleeping " - 1);
- }
- if ((tmpp = strstri(bufp, "invisible ")) != 0) {
- invisible = TRUE;
- (void) memset(tmpp, ' ', sizeof "invisible " - 1);
- }
- /* check "female" before "male" to avoid false hit mid-word */
- if ((tmpp = strstri(bufp, "female ")) != 0) {
- fem = 1;
- (void) memset(tmpp, ' ', sizeof "female " - 1);
- }
- if ((tmpp = strstri(bufp, "male ")) != 0) {
- fem = 0;
- (void) memset(tmpp, ' ', sizeof "male " - 1);
- }
- bufp = mungspaces(bufp); /* after potential memset(' ') */
- /* allow the initial disposition to be specified */
-#if 0 /*JP*/
- if (!strncmpi(bufp, "tame ", 5)) {
- bufp += 5;
-#else
- if (!strncmpi(bufp, "\8eè\82È\82¸\82¯\82ç\82ê\82½", 14)) {
- bufp += 14;
-#endif
- maketame = TRUE;
-#if 0 /*JP*/
- } else if (!strncmpi(bufp, "peaceful ", 9)) {
- bufp += 9;
-#else
- } else if (!strncmpi(bufp, "\97F\8dD\93I\82È", 8)) {
- bufp += 8;
-#endif
- makepeaceful = TRUE;
-#if 0 /*JP*/
- } else if (!strncmpi(bufp, "hostile ", 8)) {
- bufp += 8;
-#else
- } else if (!strncmpi(bufp, "\93G\91Î\93I\82È", 8)) {
- bufp += 8;
-#endif
- makehostile = TRUE;
- }
- /* decide whether a valid monster was chosen */
-/*JP
- if (wizard && (!strcmp(bufp, "*") || !strcmp(bufp, "random"))) {
-*/
- if (wizard && (!strcmp(bufp, "*") || !strcmp(bufp, "\83\89\83\93\83_\83\80"))) {
- randmonst = TRUE;
- break;
- }
- which = name_to_mon(bufp);
- if (which >= LOW_PM)
- break; /* got one */
- monclass = name_to_monclass(bufp, &which);
- if (which >= LOW_PM) {
- monclass = MAXMCLASSES; /* matters below */
- break;
- } else if (monclass > 0) {
- which = urole.malenum; /* reset from NON_PM */
+
+ if (create_particular_parse(bufp, &d))
break;
- }
+
/* no good; try again... */
/*JP
pline("I've never heard of such monsters.");
pline("\82»\82Ì\82æ\82¤\82È\89ö\95¨\82Í\95·\82¢\82½\82±\82Æ\82ª\82È\82¢\81D");
} while (--tryct > 0);
- if (!tryct) {
+ if (!tryct)
pline1(thats_enough_tries);
- } else {
- if (!randmonst) {
- firstchoice = which;
- if (cant_revive(&which, FALSE, (struct obj *) 0)) {
- /* wizard mode can override handling of special monsters */
-#if 0 /*JP*/
- Sprintf(buf, "Creating %s instead; force %s?",
- mons[which].mname, mons[firstchoice].mname);
-#else
- Sprintf(buf, "\91ã\82í\82è\82É%s\82ª\8dì\82ç\82ê\82Ü\82·\81G%s\82É\82·\82é\81H",
- mons[which].mname, mons[firstchoice].mname);
-#endif
- if (yn(buf) == 'y')
- which = firstchoice;
- }
- whichpm = &mons[which];
- }
- for (i = 0; i <= multi; i++) {
- if (monclass != MAXMCLASSES)
- whichpm = mkclass(monclass, 0);
- else if (randmonst)
- whichpm = rndmonst();
- mtmp = makemon(whichpm, u.ux, u.uy, NO_MM_FLAGS);
- if (!mtmp) {
- /* quit trying if creation failed and is going to repeat */
- if (monclass == MAXMCLASSES && !randmonst)
- break;
- /* otherwise try again */
- continue;
- }
- /* 'is_FOO()' ought to be called 'always_FOO()' */
- if (fem != -1 && !is_male(mtmp->data) && !is_female(mtmp->data))
- mtmp->female = fem; /* ignored for is_neuter() */
- if (maketame) {
- (void) tamedog(mtmp, (struct obj *) 0);
- } else if (makepeaceful || makehostile) {
- mtmp->mtame = 0; /* sanity precaution */
- mtmp->mpeaceful = makepeaceful ? 1 : 0;
- set_malign(mtmp);
- }
- if (saddled && can_saddle(mtmp) && !which_armor(mtmp, W_SADDLE)) {
- struct obj *otmp = mksobj(SADDLE, TRUE, FALSE);
+ else
+ return create_particular_creation(&d);
- put_saddle_on_mon(otmp, mtmp);
- }
- if (invisible)
- mon_set_minvis(mtmp);
- if (sleeping)
- mtmp->msleeping = 1;
- madeany = TRUE;
- /* in case we got a doppelganger instead of what was asked
- for, make it start out looking like what was asked for */
- if (mtmp->cham != NON_PM && firstchoice != NON_PM
- && mtmp->cham != firstchoice)
- (void) newcham(mtmp, &mons[firstchoice], FALSE, FALSE);
- }
- }
- return madeany;
+ return FALSE;
}
/*read.c*/