- RSPEAK(BARE_HANDS_QUERY);
- GETIN(input, &WD1, &WD1X, &WD2, &WD2X);
- if (WD1 != MAKEWD(25) && WD1 != MAKEWD(250519))
- return GO_CHECKFOO;
- PSPEAK(DRAGON, 3);
- game.prop[DRAGON] = 1;
- game.prop[RUG] = 0;
- int k = (PLAC[DRAGON] + FIXD[DRAGON]) / 2;
- MOVE(DRAGON + NOBJECTS, -1);
- MOVE(RUG + NOBJECTS, 0);
- MOVE(DRAGON, k);
- MOVE(RUG, k);
- DROP(BLOOD, k);
- for (obj = 1; obj <= NOBJECTS; obj++) {
- if (game.place[obj] == PLAC[DRAGON] || game.place[obj] == FIXD[DRAGON])
- MOVE(obj, k);
- }
- game.loc = k;
+ rspeak(BARE_HANDS_QUERY);
+ if (!silent_yes_or_no()) {
+ speak(arbitrary_messages[NASTY_DRAGON]);
+ return GO_MOVE;
+ }
+ state_change(DRAGON, DRAGON_DEAD);
+ game.objects[RUG].prop = RUG_FLOOR;
+ /* Hardcoding LOC_SECRET5 as the dragon's death location is ugly.
+ * The way it was computed before was worse; it depended on the
+ * two dragon locations being LOC_SECRET4 and LOC_SECRET6 and
+ * LOC_SECRET5 being right between them.
+ */
+ move(DRAGON + NOBJECTS, IS_FIXED);
+ move(RUG + NOBJECTS, IS_FREE);
+ move(DRAGON, LOC_SECRET5);
+ move(RUG, LOC_SECRET5);
+ drop(BLOOD, LOC_SECRET5);
+ for (obj_t i = 1; i <= NOBJECTS; i++) {
+ if (game.objects[i].place == objects[DRAGON].plac ||
+ game.objects[i].place == objects[DRAGON].fixd)
+ move(i, LOC_SECRET5);
+ }
+ game.loc = LOC_SECRET5;