1 /* NetHack 3.6 lock.c $NHDT-Date: 1548978605 2019/01/31 23:50:05 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.84 $ */
2 /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
3 /*-Copyright (c) Robert Patrick Rankin, 2011. */
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-2019 */
9 /* JNetHack may be freely redistributed. See license for details. */
13 /* at most one of `door' and `box' should be non-null at any given time */
14 STATIC_VAR NEARDATA struct xlock_s {
17 int picktyp, /* key|pick|card for unlock, sharp vs blunt for #force */
22 /* occupation callbacks */
23 STATIC_PTR int NDECL(picklock);
24 STATIC_PTR int NDECL(forcelock);
26 STATIC_DCL const char *NDECL(lock_action);
27 STATIC_DCL boolean FDECL(obstructed, (int, int, BOOLEAN_P));
28 STATIC_DCL void FDECL(chest_shatter_msg, (struct obj *));
34 if (occupation == picklock) {
48 return (boolean) (occupation == picklock && xlock.door == &levl[x][y]);
51 /* produce an occupation string appropriate for the current activity */
52 STATIC_OVL const char *
55 /* "unlocking"+2 == "locking" */
56 static const char *actions[] = {
58 "unlocking the door", /* [0] */
59 "unlocking the chest", /* [1] */
60 "unlocking the box", /* [2] */
61 "picking the lock" /* [3] */
63 "
\94à
\82Ì
\8c®
\82ð
\82Í
\82¸
\82·",
64 "
\95ó
\94 \82Ì
\8c®
\82ð
\82Í
\82¸
\82·",
65 "
\94 \82Ì
\8c®
\82ð
\82Í
\82¸
\82·",
66 "
\8c®
\82ð
\82Í
\82¸
\82·"
70 /* if the target is currently unlocked, we're trying to lock it now */
71 if (xlock.door && !(xlock.door->doormask & D_LOCKED))
73 return actions[0] + 2; /* "locking the door" */
74 #else /*
\89p
\8cê
\82Í un
\82ð
\8eæ
\82ê
\82Î
\8bt
\82Ì
\88Ó
\96¡
\82É
\82È
\82é
\82ª
\81C
\93ú
\96{
\8cê
\82Í
\82»
\82¤
\82Í
\82¢
\82©
\82È
\82¢
\82Ì
\82Å
\83\8a\83e
\83\89\83\8b\82ð
\8f\91\82 */
75 return "
\94à
\82É
\8c®
\82ð
\82©
\82¯
\82é";
77 else if (xlock.box && !xlock.box->olocked)
79 return xlock.box->otyp == CHEST ? actions[1] + 2 : actions[2] + 2;
81 return xlock.box->otyp == CHEST ? "
\95ó
\94 \82É
\8c®
\82ð
\82©
\82¯
\82é" : "
\94 \82É
\8c®
\82ð
\82©
\82¯
\82é";
83 /* otherwise we're trying to unlock it */
84 else if (xlock.picktyp == LOCK_PICK)
85 return actions[3]; /* "picking the lock" */
86 else if (xlock.picktyp == CREDIT_CARD)
87 return actions[3]; /* same as lock_pick */
89 return actions[0]; /* "unlocking the door" */
91 return xlock.box->otyp == CHEST ? actions[1] : actions[2];
96 /* try to open/close a lock */
101 if (xlock.box->where != OBJ_FLOOR
102 || xlock.box->ox != u.ux || xlock.box->oy != u.uy) {
103 return ((xlock.usedtime = 0)); /* you or it moved */
106 if (xlock.door != &(levl[u.ux + u.dx][u.uy + u.dy])) {
107 return ((xlock.usedtime = 0)); /* you moved */
109 switch (xlock.door->doormask) {
112 pline("This doorway has no door.");
114 pline("
\8fo
\93ü
\8cû
\82É
\82Í
\94à
\82ª
\82È
\82¢
\81D");
115 return ((xlock.usedtime = 0));
118 You("cannot lock an open door.");
120 pline("
\8aJ
\82¢
\82Ä
\82é
\94à
\82É
\8c®
\82ð
\82©
\82¯
\82ç
\82ê
\82È
\82¢
\81D");
121 return ((xlock.usedtime = 0));
124 pline("This door is broken.");
126 pline("
\94à
\82Í
\89ó
\82ê
\82Ä
\82¢
\82é
\81D");
127 return ((xlock.usedtime = 0));
131 if (xlock.usedtime++ >= 50 || nohands(youmonst.data)) {
133 You("give up your attempt at %s.", lock_action());
135 pline("%s
\82Ì
\82ð
\82 \82«
\82ç
\82ß
\82½
\81D", lock_action());
136 exercise(A_DEX, TRUE); /* even if you don't succeed */
137 return ((xlock.usedtime = 0));
140 if (rn2(100) >= xlock.chance)
141 return 1; /* still busy */
143 /* using the Master Key of Thievery finds traps if its bless/curse
144 state is adequate (non-cursed for rogues, blessed for others;
145 checked when setting up 'xlock') */
146 if ((!xlock.door ? (int) xlock.box->otrapped
147 : (xlock.door->doormask & D_TRAPPED) != 0)
148 && xlock.magic_key) {
149 xlock.chance += 20; /* less effort needed next time */
150 /* unfortunately we don't have a 'tknown' flag to record
151 "known to be trapped" so declining to disarm and then
152 retrying lock manipulation will find it all over again */
154 if (yn("You find a trap! Do you want to try to disarm it?") == 'y') {
156 if (yn("ã©
\82ð
\8c©
\82Â
\82¯
\82½
\81I
\8aO
\82µ
\82Ü
\82·
\82©
\81H") == 'y') {
158 boolean alreadyunlocked;
160 /* disarming while using magic key always succeeds */
162 xlock.door->doormask &= ~D_TRAPPED;
167 alreadyunlocked = !(xlock.door->doormask & D_LOCKED);
169 xlock.box->otrapped = 0;
171 what = (xlock.box->otyp == CHEST) ? "chest" : "box";
173 what = (xlock.box->otyp == CHEST) ? "
\95ó
\94 " : "
\94 ";
174 alreadyunlocked = !xlock.box->olocked;
177 You("succeed in disarming the trap. The %s is still %slocked.",
178 what, alreadyunlocked ? "un" : "");
180 You("ã©
\82ð
\8aO
\82µ
\82½
\81D%s
\82Í
\8c®
\82ª%s
\82Ü
\82Ü
\82¾
\81D",
181 what, alreadyunlocked ? "
\8aJ
\82¢
\82½" : "
\82©
\82©
\82Á
\82½");
183 exercise(A_WIS, TRUE);
186 You("stop %s.", lock_action());
188 You("%s
\82Ì
\82ð
\82â
\82ß
\82½
\81D", lock_action());
189 exercise(A_WIS, FALSE);
191 return ((xlock.usedtime = 0));
195 You("succeed in %s.", lock_action());
197 You("%s
\82Ì
\82É
\90¬
\8c÷
\82µ
\82½
\81D", lock_action());
199 if (xlock.door->doormask & D_TRAPPED) {
201 b_trapped("door", FINGER);
203 b_trapped("
\94à", FINGER);
204 xlock.door->doormask = D_NODOOR;
205 unblock_point(u.ux + u.dx, u.uy + u.dy);
206 if (*in_rooms(u.ux + u.dx, u.uy + u.dy, SHOPBASE))
207 add_damage(u.ux + u.dx, u.uy + u.dy, SHOP_DOOR_COST);
208 newsym(u.ux + u.dx, u.uy + u.dy);
209 } else if (xlock.door->doormask & D_LOCKED)
210 xlock.door->doormask = D_CLOSED;
212 xlock.door->doormask = D_LOCKED;
214 xlock.box->olocked = !xlock.box->olocked;
215 xlock.box->lknown = 1;
216 if (xlock.box->otrapped)
217 (void) chest_trap(xlock.box, FINGER, FALSE);
219 exercise(A_DEX, TRUE);
220 return ((xlock.usedtime = 0));
224 breakchestlock(box, destroyit)
228 if (!destroyit) { /* bill for the box but not for its contents */
229 struct obj *hide_contents = box->cobj;
232 costly_alteration(box, COST_BRKLCK);
233 box->cobj = hide_contents;
237 } else { /* #force has destroyed this box (at <u.ux,u.uy>) */
239 struct monst *shkp = (*u.ushops && costly_spot(u.ux, u.uy))
240 ? shop_keeper(*u.ushops)
242 boolean costly = (boolean) (shkp != 0),
243 peaceful_shk = costly && (boolean) shkp->mpeaceful;
247 pline("In fact, you've totally destroyed %s.", the(xname(box)));
249 pline("
\8eÀ
\8dÛ
\82Ì
\82Æ
\82±
\82ë
\81C%s
\82ð
\8a®
\91S
\82É
\89ó
\82µ
\82Ä
\82µ
\82Ü
\82Á
\82½
\81D", xname(xlock.box));
250 /* Put the contents on ground at the hero's feet. */
251 while ((otmp = box->cobj) != 0) {
252 obj_extract_self(otmp);
253 if (!rn2(3) || otmp->oclass == POTION_CLASS) {
254 chest_shatter_msg(otmp);
256 loss += stolen_value(otmp, u.ux, u.uy, peaceful_shk, TRUE);
257 if (otmp->quan == 1L) {
258 obfree(otmp, (struct obj *) 0);
261 /* this works because we're sure to have at least 1 left;
262 otherwise it would fail since otmp is not in inventory */
265 if (box->otyp == ICE_BOX && otmp->otyp == CORPSE) {
266 otmp->age = monstermoves - otmp->age; /* actual age */
267 start_corpse_timeout(otmp);
269 place_object(otmp, u.ux, u.uy);
273 loss += stolen_value(box, u.ux, u.uy, peaceful_shk, TRUE);
276 You("owe %ld %s for objects destroyed.", loss, currency(loss));
278 You("
\8aí
\95¨
\94j
\91¹
\82Å%ld%s
\82Ì
\8eØ
\82è
\82ð
\82Â
\82
\82Á
\82½
\81D", loss, currency(loss));
283 /* try to force a locked chest */
287 if ((xlock.box->ox != u.ux) || (xlock.box->oy != u.uy))
288 return ((xlock.usedtime = 0)); /* you or it moved */
290 if (xlock.usedtime++ >= 50 || !uwep || nohands(youmonst.data)) {
292 You("give up your attempt to force the lock.");
294 pline("
\8c®
\82ð
\82±
\82¶
\8aJ
\82¯
\82é
\82Ì
\82ð
\82 \82«
\82ç
\82ß
\82½
\81D");
295 if (xlock.usedtime >= 50) /* you made the effort */
296 exercise((xlock.picktyp) ? A_DEX : A_STR, TRUE);
297 return ((xlock.usedtime = 0));
300 if (xlock.picktyp) { /* blade */
301 if (rn2(1000 - (int) uwep->spe) > (992 - greatest_erosion(uwep) * 10)
302 && !uwep->cursed && !obj_resists(uwep, 0, 99)) {
303 /* for a +0 weapon, probability that it survives an unsuccessful
304 * attempt to force the lock is (.992)^50 = .67
307 pline("%sour %s broke!", (uwep->quan > 1L) ? "One of y" : "Y",
310 pline("%s
\82Í
\89ó
\82ê
\82Ä
\82µ
\82Ü
\82Á
\82½
\81I",xname(uwep));
314 You("give up your attempt to force the lock.");
316 pline("
\8c®
\82ð
\82±
\82¶
\8aJ
\82¯
\82é
\82Ì
\82ð
\82 \82«
\82ç
\82ß
\82½
\81D");
317 exercise(A_DEX, TRUE);
318 return ((xlock.usedtime = 0));
321 wake_nearby(); /* due to hammering on the container */
323 if (rn2(100) >= xlock.chance)
324 return 1; /* still busy */
327 You("succeed in forcing the lock.");
329 pline("
\8c®
\82ð
\82±
\82¶
\8aJ
\82¯
\82½
\81D");
330 exercise(xlock.picktyp ? A_DEX : A_STR, TRUE);
331 /* breakchestlock() might destroy xlock.box; if so, xlock context will
332 be cleared (delobj -> obfree -> maybe_reset_pick); but it might not,
333 so explicitly clear that manually */
334 breakchestlock(xlock.box, (boolean) (!xlock.picktyp && !rn2(3)));
335 reset_pick(); /* lock-picking context is no longer valid */
343 xlock.usedtime = xlock.chance = xlock.picktyp = 0;
344 xlock.magic_key = FALSE;
345 xlock.door = (struct rm *) 0;
346 xlock.box = (struct obj *) 0;
349 /* level change or object deletion; context may no longer be valid */
351 maybe_reset_pick(container)
352 struct obj *container; /* passed from obfree() */
355 * If a specific container, only clear context if it is for that
356 * particular container (which is being deleted). Other stuff on
357 * the current dungeon level remains valid.
358 * However if 'container' is Null, clear context if not carrying
359 * xlock.box (which might be Null if context is for a door).
360 * Used for changing levels, where a floor container or a door is
361 * being left behind and won't be valid on the new level but a
362 * carried container will still be. There might not be any context,
363 * in which case redundantly clearing it is harmless.
365 if (container ? (container == xlock.box)
366 : (!xlock.box || !carried(xlock.box)))
370 /* for doapply(); if player gives a direction or resumes an interrupted
371 previous attempt then it costs hero a move even if nothing ultimately
372 happens; when told "can't do that" before being asked for direction
373 or player cancels with ESC while giving direction, it doesn't */
374 #define PICKLOCK_LEARNED_SOMETHING (-1) /* time passes */
375 #define PICKLOCK_DID_NOTHING 0 /* no time passes */
376 #define PICKLOCK_DID_SOMETHING 1
378 /* player is applying a key, lock pick, or credit card */
389 picktyp = pick->otyp;
391 /* check whether we're resuming an interrupted previous attempt */
392 if (xlock.usedtime && picktyp == xlock.picktyp) {
394 static char no_longer[] = "Unfortunately, you can no longer %s %s.";
396 static char no_longer[] = "
\82´
\82ñ
\82Ë
\82ñ
\82È
\82ª
\82ç
\81C
\82 \82È
\82½
\82Í%s%s";
398 if (nohands(youmonst.data)) {
400 const char *what = (picktyp == LOCK_PICK) ? "pick" : "key";
402 const char *what = (picktyp == LOCK_PICK) ? "
\8c®
\8aJ
\82¯
\8aí
\8bï" : "
\8c®";
404 if (picktyp == CREDIT_CARD)
408 what = "
\83J
\81[
\83h";
410 pline(no_longer, "hold the", what);
412 pline(no_longer, what, "
\82ð
\82Â
\82©
\82ß
\82È
\82¢");
414 return PICKLOCK_LEARNED_SOMETHING;
415 } else if (u.uswallow || (xlock.box && !can_reach_floor(TRUE))) {
417 pline(no_longer, "reach the", "lock");
419 pline(no_longer, "
\8c®
\82É", "
\93Í
\82©
\82È
\82¢");
421 return PICKLOCK_LEARNED_SOMETHING;
423 const char *action = lock_action();
426 You("resume your attempt at %s.", action);
428 pline("%s
\82Ì
\82ð
\8dÄ
\8aJ
\82µ
\82½
\81D", action);
429 xlock.magic_key = is_magic_key(&youmonst, pick);
430 set_occupation(picklock, action, 0);
431 return PICKLOCK_DID_SOMETHING;
435 if (nohands(youmonst.data)) {
437 You_cant("hold %s -- you have no hands!", doname(pick));
439 You("%s
\82ð
\82Â
\82©
\82Þ
\82±
\82Æ
\82ª
\82Å
\82«
\82È
\82¢
\81I
\8eè
\82ª
\82È
\82¢
\82ñ
\82¾
\82à
\82Ì
\81I", xname(pick));
440 return PICKLOCK_DID_NOTHING;
441 } else if (u.uswallow) {
443 You_cant("%sunlock %s.", (picktyp == CREDIT_CARD) ? "" : "lock or ",
446 You_cant("%s
\82ð%s
\82È
\82¢
\81D", mon_nam(u.ustuck),
447 (picktyp == CREDIT_CARD) ? "
\8aJ
\82¯
\82ç
\82ê" : "
\8aJ
\82¯
\95Â
\82ß
\82Å
\82«");
449 return PICKLOCK_DID_NOTHING;
452 if (picktyp != LOCK_PICK
453 && picktyp != CREDIT_CARD
454 && picktyp != SKELETON_KEY) {
455 impossible("picking lock with object %d?", picktyp);
456 return PICKLOCK_DID_NOTHING;
458 ch = 0; /* lint suppression */
461 if (!get_adjacent_loc((char *) 0, "Invalid location!", u.ux, u.uy, &cc))
463 if (!get_adjacent_loc((char *) 0, "
\88Ê
\92u
\82ª
\82¨
\82©
\82µ
\82¢
\81I", u.ux, u.uy, &cc))
464 return PICKLOCK_DID_NOTHING;
466 if (cc.x == u.ux && cc.y == u.uy) { /* pick lock on a container */
476 There("isn't any sort of lock up %s.",
477 Levitation ? "here" : "there");
479 pline("%s
\82É
\82Í
\8c®
\82ð
\82©
\82¯
\82é
\82æ
\82¤
\82È
\95¨
\82Í
\82È
\82¢
\81D",
480 Levitation ? "
\82±
\82±" : "
\89º
\95û");
482 return PICKLOCK_LEARNED_SOMETHING;
483 } else if (is_lava(u.ux, u.uy)) {
485 pline("Doing that would probably melt %s.", yname(pick));
487 pline("
\82»
\82ñ
\82È
\82±
\82Æ
\82ð
\82µ
\82½
\82ç%s
\82ª
\97n
\82¯
\82Ä
\82µ
\82Ü
\82¤
\81D", yname(pick));
488 return PICKLOCK_LEARNED_SOMETHING;
489 } else if (is_pool(u.ux, u.uy) && !Underwater) {
491 pline_The("%s has no lock.", hliquid("water"));
493 pline_The("%s
\82É
\8fù
\91O
\82Í
\82È
\82¢
\81D", hliquid("
\90\85"));
494 return PICKLOCK_LEARNED_SOMETHING;
498 c = 'n'; /* in case there are no boxes here */
499 for (otmp = level.objects[cc.x][cc.y]; otmp; otmp = otmp->nexthere)
502 if (!can_reach_floor(TRUE)) {
504 You_cant("reach %s from up here.", the(xname(otmp)));
506 You("
\82±
\82±
\82©
\82ç%s
\82É
\93Í
\82©
\82È
\82¢
\81D", the(xname(otmp)));
507 return PICKLOCK_LEARNED_SOMETHING;
516 verb = "
\8fC
\95\9c\82·
\82é";
517 else if (!otmp->olocked)
519 verb = "lock", it = 1;
521 verb = "
\8c®
\82ð
\82©
\82¯
\82é";
522 else if (picktyp != LOCK_PICK)
524 verb = "unlock", it = 1;
526 verb = "
\8c®
\82ð
\82Í
\82¸
\82·";
531 verb = "
\82±
\82¶
\82 \82¯
\82é";
533 /* "There is <a box> here; <verb> <it|its lock>?" */
535 Sprintf(qsfx, " here; %s %s?", verb, it ? "it" : "its lock");
537 Sprintf(qsfx, "
\82ª
\82 \82é
\81D%s
\81H", verb);
539 (void) safe_qbuf(qbuf, "There is ", qsfx, otmp, doname,
540 ansimpleoname, "a box");
542 (void) safe_qbuf(qbuf, "
\82±
\82±
\82É
\82Í", qsfx, otmp, doname,
543 ansimpleoname, "
\94 ");
555 You_cant("fix its broken lock with %s.", doname(pick));
557 You("
\89ó
\82ê
\82½
\8c®
\82ð%s
\82Å
\8fC
\95\9c\82Å
\82«
\82È
\82¢
\81D", doname(pick));
558 return PICKLOCK_LEARNED_SOMETHING;
559 } else if (picktyp == CREDIT_CARD && !otmp->olocked) {
560 /* credit cards are only good for unlocking */
562 You_cant("do that with %s.",
563 an(simple_typename(picktyp)));
565 pline("%s
\82¶
\82á
\82»
\82ñ
\82È
\82±
\82Æ
\82Í
\82Å
\82«
\82È
\82¢
\81D",
566 simple_typename(picktyp));
568 return PICKLOCK_LEARNED_SOMETHING;
572 ch = ACURR(A_DEX) + 20 * Role_if(PM_ROGUE);
575 ch = 4 * ACURR(A_DEX) + 25 * Role_if(PM_ROGUE);
578 ch = 75 + ACURR(A_DEX);
593 There("doesn't seem to be any sort of lock here.");
595 pline("
\82±
\82±
\82É
\82Í
\8c®
\82ð
\82©
\82¯
\82é
\82æ
\82¤
\82È
\95¨
\82Í
\82È
\82¢
\82æ
\82¤
\82¾
\81D");
596 return PICKLOCK_LEARNED_SOMETHING; /* decided against all boxes */
598 } else { /* pick the lock in a door */
601 if (u.utrap && u.utraptype == TT_PIT) {
603 You_cant("reach over the edge of the pit.");
605 pline("
\97\8e\82µ
\8c\8a\82Ì
\92\86\82©
\82ç
\82Å
\82Í
\93Í
\82©
\82È
\82¢
\81D");
606 return PICKLOCK_LEARNED_SOMETHING;
609 door = &levl[cc.x][cc.y];
610 mtmp = m_at(cc.x, cc.y);
611 if (mtmp && canseemon(mtmp) && M_AP_TYPE(mtmp) != M_AP_FURNITURE
612 && M_AP_TYPE(mtmp) != M_AP_OBJECT) {
613 if (picktyp == CREDIT_CARD
614 && (mtmp->isshk || mtmp->data == &mons[PM_ORACLE]))
616 verbalize("No checks, no credit, no problem.");
618 verbalize("
\82¢
\82Â
\82à
\83j
\83R
\83j
\83R
\8c»
\8bà
\95¥
\82¢
\81D");
621 pline("I don't think %s would appreciate that.",
624 pline("%s
\82ª
\82»
\82Ì
\89¿
\92l
\82ð
\94F
\82ß
\82é
\82Æ
\82Í
\8ev
\82¦
\82È
\82¢
\81D", mon_nam(mtmp));
626 return PICKLOCK_LEARNED_SOMETHING;
627 } else if (mtmp && is_door_mappear(mtmp)) {
628 /* "The door actually was a <mimic>!" */
629 stumble_onto_mimic(mtmp);
630 /* mimic might keep the key (50% chance, 10% for PYEC or MKoT) */
631 maybe_absorb_item(mtmp, pick, 50, 10);
632 return PICKLOCK_LEARNED_SOMETHING;
634 if (!IS_DOOR(door->typ)) {
635 if (is_drawbridge_wall(cc.x, cc.y) >= 0)
637 You("%s no lock on the drawbridge.", Blind ? "feel" : "see");
639 pline("
\92µ
\82Ë
\8b´
\82É
\82Í
\8c®
\82ª
\82È
\82¢%s
\81D", Blind ? "
\82æ
\82¤
\82¾" : "
\82æ
\82¤
\82É
\8c©
\82¦
\82é");
642 You("%s no door there.", Blind ? "feel" : "see");
644 pline("
\82±
\82±
\82É
\82Í
\94à
\82ª
\82È
\82¢%s
\81D", Blind ? "
\82æ
\82¤
\82¾" : "
\82æ
\82¤
\82É
\8c©
\82¦
\82é");
645 return PICKLOCK_LEARNED_SOMETHING;
647 switch (door->doormask) {
650 pline("This doorway has no door.");
652 pline("
\82±
\82Ì
\8fo
\93ü
\8cû
\82É
\82Í
\94à
\82ª
\82È
\82¢
\81D");
653 return PICKLOCK_LEARNED_SOMETHING;
656 You("cannot lock an open door.");
658 pline("
\8aJ
\82¢
\82Ä
\82é
\94à
\82É
\82Í
\8c®
\82ð
\82©
\82¯
\82ç
\82ê
\82È
\82¢
\81D");
659 return PICKLOCK_LEARNED_SOMETHING;
662 pline("This door is broken.");
664 pline("
\82±
\82Ì
\94à
\82Í
\89ó
\82ê
\82Ä
\82¢
\82é
\81D");
665 return PICKLOCK_LEARNED_SOMETHING;
667 /* credit cards are only good for unlocking */
668 if (picktyp == CREDIT_CARD && !(door->doormask & D_LOCKED)) {
670 You_cant("lock a door with a credit card.");
672 You("
\83N
\83\8c\83W
\83b
\83g
\83J
\81[
\83h
\82Å
\94à
\82É
\8c®
\82ð
\82©
\82¯
\82é
\82±
\82Æ
\82Í
\82Å
\82«
\82È
\82¢
\81D");
673 return PICKLOCK_LEARNED_SOMETHING;
677 Sprintf(qbuf, "%s it?",
678 (door->doormask & D_LOCKED) ? "Unlock" : "Lock");
680 Sprintf(qbuf, "%s
\82Ü
\82·
\82©
\81H",
681 (door->doormask & D_LOCKED) ? "
\82Í
\82¸
\82µ" : "
\82©
\82¯" );
690 ch = 2 * ACURR(A_DEX) + 20 * Role_if(PM_ROGUE);
693 ch = 3 * ACURR(A_DEX) + 30 * Role_if(PM_ROGUE);
696 ch = 70 + ACURR(A_DEX);
707 xlock.picktyp = picktyp;
708 xlock.magic_key = is_magic_key(&youmonst, pick);
710 set_occupation(picklock, lock_action(), 0);
711 return PICKLOCK_DID_SOMETHING;
714 /* try to force a chest with your weapon */
718 register struct obj *otmp;
719 register int c, picktyp;
724 You_cant("force anything from inside here.");
726 You_cant("
\93à
\91¤
\82©
\82ç
\82±
\82¶
\8aJ
\82¯
\82é
\82±
\82Æ
\82Í
\82Å
\82«
\82È
\82¢
\81D");
729 if (!uwep /* proper type test */
730 || ((uwep->oclass == WEAPON_CLASS || is_weptool(uwep))
731 ? (objects[uwep->otyp].oc_skill < P_DAGGER
732 || objects[uwep->otyp].oc_skill == P_FLAIL
733 || objects[uwep->otyp].oc_skill > P_LANCE)
734 : uwep->oclass != ROCK_CLASS)) {
736 You_cant("force anything %s weapon.",
737 !uwep ? "when not wielding a"
738 : (uwep->oclass != WEAPON_CLASS && !is_weptool(uwep))
742 You_cant("%s
\95\90\8aí
\82È
\82µ
\82Å
\8c®
\82ð
\82±
\82¶
\8aJ
\82¯
\82é
\82±
\82Æ
\82Í
\82Å
\82«
\82È
\82¢
\81D",
743 !uwep ? "
\91\95\94õ
\82µ
\82Ä
\82¢
\82é"
744 : (uwep->oclass != WEAPON_CLASS && !is_weptool(uwep))
750 if (!can_reach_floor(TRUE)) {
751 cant_reach_floor(u.ux, u.uy, FALSE, TRUE);
755 picktyp = is_blade(uwep) && !is_pick(uwep);
756 if (xlock.usedtime && xlock.box && picktyp == xlock.picktyp) {
758 You("resume your attempt to force the lock.");
760 pline("
\8c®
\82ð
\82±
\82¶
\82 \82¯
\82é
\82Ì
\82ð
\8dÄ
\8aJ
\82µ
\82½
\81D");
762 set_occupation(forcelock, "forcing the lock", 0);
764 set_occupation(forcelock, "
\8c®
\82ð
\82±
\82¶
\82 \82¯
\82é", 0);
768 /* A lock is made only for the honest man, the thief will break it. */
769 xlock.box = (struct obj *) 0;
770 for (otmp = level.objects[u.ux][u.uy]; otmp; otmp = otmp->nexthere)
772 if (otmp->obroken || !otmp->olocked) {
773 /* force doname() to omit known "broken" or "unlocked"
774 prefix so that the message isn't worded redundantly;
775 since we're about to set lknown, there's no need to
776 remember and then reset its current value */
779 There("is %s here, but its lock is already %s.",
780 doname(otmp), otmp->obroken ? "broken" : "unlocked");
782 pline("
\82±
\82±
\82É
\82Í%s
\82ª
\82 \82é
\81D
\82µ
\82©
\82µ
\82»
\82Ì
\8c®
\82Í
\82à
\82¤%s
\81D",
784 otmp->obroken ? "
\89ó
\82ê
\82Ä
\82¢
\82é" : "
\82Í
\82¸
\82³
\82ê
\82Ä
\82¢
\82é");
790 (void) safe_qbuf(qbuf, "There is ", " here; force its lock?",
791 otmp, doname, ansimpleoname, "a box");
793 (void) safe_qbuf(qbuf, "
\82±
\82±
\82É
\82Í", "
\82ª
\82 \82é
\81D
\8c®
\82ð
\82±
\82¶
\8aJ
\82¯
\82Ü
\82·
\82©
\81H",
794 otmp, doname, ansimpleoname, "
\94 ");
806 You("force %s into a crack and pry.", yname(uwep));
808 You("%s
\82ð
\82·
\82«
\8aÔ
\82É
\8d·
\82µ
\82±
\82ñ
\82Å
\82±
\82¶
\82 \82¯
\82æ
\82¤
\82Æ
\82µ
\82½
\81D",xname(uwep));
811 You("start bashing it with %s.", yname(uwep));
813 pline("%s
\82Å
\89£
\82è
\82Â
\82¯
\82½
\81D", xname(uwep));
815 xlock.chance = objects[uwep->otyp].oc_wldam * 2;
816 xlock.picktyp = picktyp;
817 xlock.magic_key = FALSE;
824 set_occupation(forcelock, "forcing the lock", 0);
826 set_occupation(forcelock, "
\8c®
\82ð
\82±
\82¶
\82 \82¯
\82é", 0);
829 You("decide not to force the issue.");
831 pline("
\82»
\82ê
\82Í
\96³
\88Ó
\96¡
\82È
\8ds
\88×
\82¾
\81D");
836 stumble_on_door_mimic(x, y)
841 if ((mtmp = m_at(x, y)) && is_door_mappear(mtmp)
842 && !Protection_from_shape_changers) {
843 stumble_onto_mimic(mtmp);
849 /* the 'O' command - try to open a door */
853 return doopen_indir(0, 0);
856 /* try to open a door in direction u.dx/u.dy */
862 register struct rm *door;
866 if (nohands(youmonst.data)) {
868 You_cant("open anything -- you have no hands!");
870 You("
\89½
\82à
\8aJ
\82¯
\82é
\82±
\82Æ
\82ª
\82Å
\82«
\82È
\82¢
\81I
\8eè
\82ª
\82È
\82¢
\82ñ
\82¾
\82à
\82Ì
\81I");
874 if (u.utrap && u.utraptype == TT_PIT) {
876 You_cant("reach over the edge of the pit.");
878 pline("
\97\8e\82µ
\8c\8a\82Ì
\92\86\82©
\82ç
\93Í
\82©
\82È
\82¢
\81D");
882 if (x > 0 && y > 0) {
885 } else if (!get_adjacent_loc((char *) 0, (char *) 0, u.ux, u.uy, &cc))
888 /* open at yourself/up/down */
889 if ((cc.x == u.ux) && (cc.y == u.uy))
892 if (stumble_on_door_mimic(cc.x, cc.y))
895 /* when choosing a direction is impaired, use a turn
896 regardless of whether a door is successfully targetted */
897 if (Confusion || Stunned)
900 door = &levl[cc.x][cc.y];
901 portcullis = (is_drawbridge_wall(cc.x, cc.y) >= 0);
903 int oldglyph = door->glyph;
904 schar oldlastseentyp = lastseentyp[cc.x][cc.y];
906 feel_location(cc.x, cc.y);
907 if (door->glyph != oldglyph
908 || lastseentyp[cc.x][cc.y] != oldlastseentyp)
909 res = 1; /* learned something */
912 if (portcullis || !IS_DOOR(door->typ)) {
913 /* closed portcullis or spot that opened bridge would span */
914 if (is_db_wall(cc.x, cc.y) || door->typ == DRAWBRIDGE_UP)
916 There("is no obvious way to open the drawbridge.");
918 pline("
\92µ
\82Ë
\8b´
\82ð
\8d~
\82ë
\82·
\96¾
\94\92\82È
\95û
\96@
\82Í
\82È
\82¢
\81D");
919 else if (portcullis || door->typ == DRAWBRIDGE_DOWN)
921 pline_The("drawbridge is already open.");
923 pline_The("
\92µ
\82Ë
\8b´
\82Í
\82à
\82¤
\8aJ
\82¢
\82Ä
\82¢
\82é
\81D");
924 else if (container_at(cc.x, cc.y, TRUE))
926 pline("%s like something lootable over there.",
927 Blind ? "Feels" : "Seems");
929 pline("
\82±
\82±
\82É
\82Í
\89½
\82©
\93ü
\82ê
\95¨
\82ª
\82 \82é
\82æ
\82¤
\82¾
\81D");
933 You("%s no door there.", Blind ? "feel" : "see");
935 pline("
\82»
\82±
\82É
\82Í
\94à
\82Í
\82È
\82¢
\82æ
\82¤%s
\81D", Blind ? "
\82¾" : "
\82É
\8c©
\82¦
\82é");
939 if (!(door->doormask & D_CLOSED)) {
942 switch (door->doormask) {
947 mesg = "
\94à
\82Í
\89ó
\82ê
\82Ä
\82¢
\82é";
951 mesg = "way has no door";
953 mesg = "
\8fo
\93ü
\8cû
\82É
\82Í
\94à
\82ª
\82È
\82¢";
957 mesg = " is already open";
959 mesg = "
\94à
\82Í
\82à
\82¤
\8aJ
\82¢
\82Ä
\82¢
\82é";
965 mesg = "
\94à
\82É
\82Í
\8c®
\82ª
\8a|
\82©
\82Á
\82Ä
\82¢
\82é";
969 pline("This door%s.", mesg);
971 pline("%s
\81D", mesg);
975 if (verysmall(youmonst.data)) {
977 pline("You're too small to pull the door open.");
979 You("
\94à
\82ð
\89\9f\82·
\82É
\82Í
\8f¬
\82³
\82·
\82¬
\82é
\81D");
983 /* door is known to be CLOSED */
984 if (rnl(20) < (ACURRSTR + ACURR(A_DEX) + ACURR(A_CON)) / 3) {
986 pline_The("door opens.");
988 pline("
\94à
\82Í
\8aJ
\82¢
\82½
\81D");
989 if (door->doormask & D_TRAPPED) {
991 b_trapped("door", FINGER);
993 b_trapped("
\94à", FINGER);
994 door->doormask = D_NODOOR;
995 if (*in_rooms(cc.x, cc.y, SHOPBASE))
996 add_damage(cc.x, cc.y, SHOP_DOOR_COST);
998 door->doormask = D_ISOPEN;
999 feel_newsym(cc.x, cc.y); /* the hero knows she opened it */
1000 unblock_point(cc.x, cc.y); /* vision: new see through there */
1002 exercise(A_STR, TRUE);
1004 pline_The("door resists!");
1006 pline("
\82È
\82©
\82È
\82©
\8aJ
\82©
\82È
\82¢
\81I");
1013 obstructed(x, y, quietly)
1017 register struct monst *mtmp = m_at(x, y);
1019 if (mtmp && M_AP_TYPE(mtmp) != M_AP_FURNITURE) {
1020 if (M_AP_TYPE(mtmp) == M_AP_OBJECT)
1023 if ((mtmp->mx != x) || (mtmp->my != y)) {
1026 pline("%s%s blocks the way!",
1027 !canspotmon(mtmp) ? Something : s_suffix(Monnam(mtmp)),
1028 !canspotmon(mtmp) ? "" : " tail");
1030 pline("%s%s
\82ª
\97§
\82¿
\82Ó
\82³
\82ª
\82Á
\82Ä
\82¢
\82é
\81I",
1031 !canspotmon(mtmp) ? "
\89½
\82©" : Monnam(mtmp),
1032 !canspotmon(mtmp) ? "" : "
\82Ì
\90K
\94ö");
1036 pline("%s blocks the way!",
1037 !canspotmon(mtmp) ? "Some creature" : Monnam(mtmp));
1039 pline("%s
\82ª
\97§
\82¿
\82Ó
\82³
\82ª
\82Á
\82Ä
\82¢
\82é
\81I",
1040 !canspotmon(mtmp) ? "
\89½
\8eÒ
\82©" : Monnam(mtmp));
1044 if (!canspotmon(mtmp))
1045 map_invisible(x, y);
1052 pline("%s's in the way.", Something);
1054 pline("
\89½
\82©
\82ª
\8fo
\93ü
\8cû
\82É
\82 \82é
\81D");
1060 /* the 'C' command - try to close a door */
1065 register struct rm *door;
1069 if (nohands(youmonst.data)) {
1071 You_cant("close anything -- you have no hands!");
1073 You("
\95Â
\82ß
\82é
\82±
\82Æ
\82ª
\82Å
\82«
\82È
\82¢
\81I
\8eè
\82ª
\82È
\82¢
\82ñ
\82¾
\82à
\82Ì
\81I");
1077 if (u.utrap && u.utraptype == TT_PIT) {
1079 You_cant("reach over the edge of the pit.");
1081 pline("
\97\8e\82µ
\8c\8a\82Ì
\92\86\82©
\82ç
\93Í
\82©
\82È
\82¢
\81D");
1085 if (!getdir((char *) 0))
1090 if ((x == u.ux) && (y == u.uy)) {
1092 You("are in the way!");
1094 pline("
\82 \82È
\82½
\82ª
\8fo
\93ü
\8cû
\82É
\82¢
\82é
\82Ì
\82Å
\95Â
\82Ü
\82ç
\82È
\82¢
\81I");
1101 if (stumble_on_door_mimic(x, y))
1104 /* when choosing a direction is impaired, use a turn
1105 regardless of whether a door is successfully targetted */
1106 if (Confusion || Stunned)
1110 portcullis = (is_drawbridge_wall(x, y) >= 0);
1112 int oldglyph = door->glyph;
1113 schar oldlastseentyp = lastseentyp[x][y];
1115 feel_location(x, y);
1116 if (door->glyph != oldglyph || lastseentyp[x][y] != oldlastseentyp)
1117 res = 1; /* learned something */
1120 if (portcullis || !IS_DOOR(door->typ)) {
1121 /* is_db_wall: closed portcullis */
1122 if (is_db_wall(x, y) || door->typ == DRAWBRIDGE_UP)
1124 pline_The("drawbridge is already closed.");
1126 pline_The("
\92µ
\82Ë
\8b´
\82Í
\82à
\82¤
\95Â
\82¶
\82Ä
\82¢
\82é
\81D");
1127 else if (portcullis || door->typ == DRAWBRIDGE_DOWN)
1129 There("is no obvious way to close the drawbridge.");
1131 pline("
\92µ
\82Ë
\8b´
\82ð
\95Â
\82ß
\82é
\96¾
\94\92\82È
\95û
\96@
\82Í
\82È
\82¢
\81D");
1135 You("%s no door there.", Blind ? "feel" : "see");
1137 pline("
\82»
\82±
\82É
\94à
\82Í
\82È
\82¢
\82æ
\82¤%s
\81D", Blind ? "
\82¾" : "
\82É
\8c©
\82¦
\82é");
1142 if (door->doormask == D_NODOOR) {
1144 pline("This doorway has no door.");
1146 pline("
\8fo
\93ü
\8cû
\82É
\82Í
\94à
\82ª
\82È
\82¢
\81D");
1148 } else if (obstructed(x, y, FALSE)) {
1150 } else if (door->doormask == D_BROKEN) {
1152 pline("This door is broken.");
1154 pline("
\94à
\82Í
\89ó
\82ê
\82Ä
\82¢
\82é
\81D");
1156 } else if (door->doormask & (D_CLOSED | D_LOCKED)) {
1158 pline("This door is already closed.");
1160 pline("
\94à
\82Í
\82à
\82¤
\95Â
\82¶
\82Ä
\82¢
\82é
\81D");
1164 if (door->doormask == D_ISOPEN) {
1165 if (verysmall(youmonst.data) && !u.usteed) {
1167 pline("You're too small to push the door closed.");
1169 You("
\8f¬
\82³
\82·
\82¬
\82Ä
\94à
\82ð
\95Â
\82ß
\82ç
\82ê
\82È
\82¢
\81D");
1173 || rn2(25) < (ACURRSTR + ACURR(A_DEX) + ACURR(A_CON)) / 3) {
1175 pline_The("door closes.");
1177 pline("
\94à
\82Í
\95Â
\82¶
\82½
\81D");
1178 door->doormask = D_CLOSED;
1179 feel_newsym(x, y); /* the hero knows she closed it */
1180 block_point(x, y); /* vision: no longer see there */
1182 exercise(A_STR, TRUE);
1184 pline_The("door resists!");
1186 pline("
\82È
\82©
\82È
\82©
\95Â
\82Ü
\82ç
\82È
\82¢
\81I");
1193 /* box obj was hit with spell or wand effect otmp;
1194 returns true if something happened */
1197 struct obj *obj, *otmp; /* obj *is* a box */
1201 switch (otmp->otyp) {
1203 case SPE_WIZARD_LOCK:
1204 if (!obj->olocked) { /* lock it; fix if broken */
1208 pline("
\83J
\83`
\81I");
1211 if (Role_if(PM_WIZARD))
1216 } /* else already closed and locked */
1220 if (obj->olocked) { /* unlock; couldn't be broken */
1224 pline("
\83R
\83\93\83R
\83\93\81I");
1227 if (Role_if(PM_WIZARD))
1231 } else /* silently fix if broken */
1236 /* maybe start unlocking chest, get interrupted, then zap it;
1237 we must avoid any attempt to resume unlocking it */
1238 if (xlock.box == obj)
1245 /* Door/secret door was hit with spell or wand effect otmp;
1246 returns true if something happened */
1248 doorlock(otmp, x, y)
1252 register struct rm *door = &levl[x][y];
1255 const char *msg = (const char *) 0;
1257 const char *dustcloud = "A cloud of dust";
1259 const char *dustcloud = "
\82Ù
\82±
\82è";
1261 const char *quickly_dissipates = "quickly dissipates";
1263 const char *quickly_dissipates = "
\82 \82Á
\82Æ
\8c¾
\82¤
\82Ü
\82É
\94ò
\82Ñ
\8eU
\82Á
\82½";
1264 boolean mysterywand = (otmp->oclass == WAND_CLASS && !otmp->dknown);
1266 if (door->typ == SDOOR) {
1267 switch (otmp->otyp) {
1271 case SPE_FORCE_BOLT:
1273 door->doormask = D_CLOSED | (door->doormask & D_TRAPPED);
1277 pline("A door appears in the wall!");
1279 pline("
\95Ç
\82©
\82ç
\94à
\82ª
\8c»
\82ê
\82½
\81I");
1280 if (otmp->otyp == WAN_OPENING || otmp->otyp == SPE_KNOCK)
1282 break; /* striking: continue door handling below */
1284 case SPE_WIZARD_LOCK:
1290 switch (otmp->otyp) {
1292 case SPE_WIZARD_LOCK:
1293 if (Is_rogue_level(&u.uz)) {
1294 boolean vis = cansee(x, y);
1295 /* Can't have real locking in Rogue, so just hide doorway */
1298 pline("%s springs up in the older, more primitive doorway.",
1300 pline("
\8cÃ
\82
\82³
\82¢
\81C
\8c´
\8en
\93I
\82È
\8fo
\93ü
\8cû
\82É%s
\82ª
\97§
\82¿
\82±
\82ß
\82½
\81D",
1304 You_hear("a swoosh.");
1306 You_hear("
\83V
\83\85\81[
\83b
\82Æ
\82¢
\82¤
\89¹
\82ð
\95·
\82¢
\82½
\81D");
1307 if (obstructed(x, y, mysterywand)) {
1310 pline_The("cloud %s.", quickly_dissipates);
1312 pline("
\82Ù
\82±
\82è
\82Í%s
\81D",quickly_dissipates);
1316 door->typ = SDOOR, door->doormask = D_NODOOR;
1319 pline_The("doorway vanishes!");
1321 pline("
\8fo
\93ü
\8cû
\82Í
\8fÁ
\82¦
\82½
\81I");
1325 if (obstructed(x, y, mysterywand))
1327 /* Don't allow doors to close over traps. This is for pits */
1328 /* & trap doors, but is it ever OK for anything else? */
1330 /* maketrap() clears doormask, so it should be NODOOR */
1332 pline("%s springs up in the doorway, but %s.", dustcloud,
1333 quickly_dissipates);
1335 pline("%s
\82ª
\8fo
\93ü
\8cû
\82É
\97§
\82¿
\82±
\82ß
\82½
\81C
\82µ
\82©
\82µ%s", dustcloud,
1336 quickly_dissipates);
1341 switch (door->doormask & ~D_TRAPPED) {
1344 msg = "The door locks!";
1346 msg = "
\94à
\82É
\8c®
\82ª
\82©
\82©
\82Á
\82½
\81I";
1350 msg = "The door swings shut, and locks!";
1352 msg = "
\94à
\82Í
\90¨
\82¢
\82æ
\82
\95Â
\82Ü
\82è
\81C
\8c®
\82ª
\82©
\82©
\82Á
\82½
\81I";
1356 msg = "The broken door reassembles and locks!";
1358 msg = "
\89ó
\82ê
\82½
\94à
\82ª
\8dÄ
\8d\
\90¬
\82³
\82ê
\81C
\8c®
\82ª
\82©
\82©
\82Á
\82½
\81I";
1363 "A cloud of dust springs up and assembles itself into a door!";
1365 "
\82Ù
\82±
\82è
\82ª
\82½
\82¿
\82±
\82ß
\81C
\8fW
\82Ü
\82Á
\82Ä
\94à
\82É
\82È
\82Á
\82½
\81I";
1372 door->doormask = D_LOCKED | (door->doormask & D_TRAPPED);
1377 if (door->doormask & D_LOCKED) {
1379 msg = "The door unlocks!";
1381 msg = "
\94à
\82Ì
\8c®
\82Í
\82Í
\82¸
\82ê
\82½
\81I";
1382 door->doormask = D_CLOSED | (door->doormask & D_TRAPPED);
1387 case SPE_FORCE_BOLT:
1388 if (door->doormask & (D_LOCKED | D_CLOSED)) {
1389 if (door->doormask & D_TRAPPED) {
1391 (void) mb_trapped(m_at(x, y));
1392 else if (flags.verbose) {
1395 pline("KABOOM!! You see a door explode.");
1397 pline("
\82¿
\82ã
\82Ç
\81[
\82ñ
\81I
\94à
\82ª
\94\9a\94
\82µ
\82½
\81D");
1400 You_hear("a distant explosion.");
1402 You_hear("
\89\93\82
\82Ì
\94\9a\94
\89¹
\82ð
\95·
\82¢
\82½
\81D");
1404 door->doormask = D_NODOOR;
1405 unblock_point(x, y);
1410 door->doormask = D_BROKEN;
1411 if (flags.verbose) {
1414 pline_The("door crashes open!");
1416 pline("
\94à
\82Í
\89ó
\82ê
\8aJ
\82¢
\82½
\81I");
1419 You_hear("a crashing sound.");
1421 You_hear("
\89½
\82©
\82ª
\89ó
\82ê
\82é
\89¹
\82ð
\95·
\82¢
\82½
\81D");
1423 unblock_point(x, y);
1425 /* force vision recalc before printing more messages */
1426 if (vision_full_recalc)
1433 impossible("magic (%d) attempted on door.", otmp->otyp);
1436 if (msg && cansee(x, y))
1439 /* door was destroyed */
1440 wake_nearto(x, y, loudness);
1441 if (*in_rooms(x, y, SHOPBASE))
1442 add_damage(x, y, 0L);
1445 if (res && picking_at(x, y)) {
1446 /* maybe unseen monster zaps door you're unlocking */
1454 chest_shatter_msg(otmp)
1457 const char *disposition;
1461 if (otmp->oclass == POTION_CLASS) {
1463 You("%s %s shatter!", Blind ? "hear" : "see", an(bottlename()));
1466 You_hear("%s
\82ª
\8a\84\82ê
\82é
\89¹
\82ð
\95·
\82¢
\82½
\81I", bottlename());
1468 pline("%s
\82ª
\8a\84\82ê
\82½
\81I", bottlename());
1470 if (!breathless(youmonst.data) || haseyes(youmonst.data))
1471 potionbreathe(otmp);
1474 /* We have functions for distant and singular names, but not one */
1475 /* which does _both_... */
1476 save_Blinded = Blinded;
1478 thing = singular(otmp, xname);
1479 Blinded = save_Blinded;
1480 switch (objects[otmp->otyp].oc_material) {
1483 disposition = "is torn to shreds";
1485 disposition = "
\82Í
\90¡
\92f
\82³
\82ê
\82½";
1489 disposition = "is crushed";
1491 disposition = "
\82ð
\8f°
\82É
\82Ô
\82¿
\82Ü
\82¯
\82½";
1495 disposition = "is pulped";
1497 disposition = "
\82Í
\82Ç
\82ë
\82Ç
\82ë
\82É
\82È
\82Á
\82½";
1501 disposition = "is mashed";
1503 disposition = "
\82Í
\82Ç
\82ë
\82Ç
\82ë
\82É
\82È
\82Á
\82½";
1507 disposition = "shatters";
1509 disposition = "
\82Í
\8a\84\82ê
\82½";
1513 disposition = "splinters to fragments";
1515 disposition = "
\82Í
\82©
\82¯
\82ç
\82É
\82È
\82Á
\82½";
1519 disposition = "is destroyed";
1521 disposition = "
\82Í
\89ó
\82ê
\82½";
1525 pline("%s %s!", An(thing), disposition);
1527 pline("%s%s
\81I", thing, disposition);