void _domination_spell(int cmd, variant *res) { switch (cmd) { case SPELL_NAME: var_set_string(res, "Domination"); break; case SPELL_DESC: var_set_string(res, "Stuns, confuses or scares a monster. Or attempts to charm all monsters in sight at level 30."); break; case SPELL_SPOIL_DESC: var_set_string(res, "Stuns, confuses or scares a monster. Or attempts to charm all monsters in sight at L30."); break; case SPELL_CAST: { var_set_bool(res, FALSE); if (p_ptr->lev < 30) { int dir = 0; if (!get_fire_dir(&dir)) return; fire_ball(GF_DOMINATION, dir, spell_power(p_ptr->lev), 0); } else { charm_monsters(spell_power(p_ptr->lev * 2)); } var_set_bool(res, TRUE); break; } default: default_spell(cmd, res); break; } }
/* The player is trying to extract something from his/her instrument. */ static int do_improvisation(struct obj *instr, const struct nh_cmd_arg *arg) { int do_spec = !Confusion; if (!do_spec) pline(msgc_yafm, "What you produce is quite far from music..."); else pline(msgc_occstart, "You start playing %s.", the(xname(instr))); switch (instr->otyp) { case MAGIC_FLUTE: /* Make monster fall asleep */ if (do_spec && instr->spe > 0) { consume_obj_charge(instr, TRUE); pline(msgc_actionok, "You produce soft music."); put_monsters_to_sleep(youmonst.m_lev * 5); exercise(A_DEX, TRUE); break; } /* else FALLTHRU */ case WOODEN_FLUTE: /* May charm snakes */ do_spec &= (rn2(ACURR(A_DEX)) + youmonst.m_lev > 25); pline(do_spec ? msgc_actionok : msgc_failrandom, "%s.", Tobjnam(instr, do_spec ? "trill" : "toot")); if (do_spec) charm_snakes(youmonst.m_lev * 3); exercise(A_DEX, TRUE); break; case FROST_HORN: /* Idem wand of cold */ case FIRE_HORN: /* Idem wand of fire */ if (do_spec && instr->spe > 0) { schar dx, dy, dz; consume_obj_charge(instr, TRUE); if (!getargdir(arg, NULL, &dx, &dy, &dz)) { pline(msgc_yafm, "%s.", Tobjnam(instr, "vibrate")); break; } else { buzz((instr->otyp == FROST_HORN) ? AD_COLD - 1 : AD_FIRE - 1, rn1(6, 6), youmonst.mx, youmonst.my, dx, dy, 0); } makeknown(instr->otyp); break; } /* else FALLTHRU */ case TOOLED_HORN: /* Awaken or scare monsters */ pline(msgc_actionok, "You produce a frightful, grave sound."); awaken_monsters(&youmonst, youmonst.m_lev * 30); exercise(A_WIS, FALSE); break; case BUGLE: /* Awaken & attract soldiers */ pline(msgc_actionok, "You extract a loud noise from %s.", the(xname(instr))); awaken_soldiers(&youmonst); exercise(A_WIS, FALSE); break; case MAGIC_HARP: /* Charm monsters */ if (do_spec && instr->spe > 0) { consume_obj_charge(instr, TRUE); pline(msgc_actionok, "%s very attractive music.", Tobjnam(instr, "produce")); charm_monsters((youmonst.m_lev - 1) / 3 + 1); exercise(A_DEX, TRUE); break; } /* else FALLTHRU */ case WOODEN_HARP: /* May calm Nymph */ do_spec &= (rn2(ACURR(A_DEX)) + youmonst.m_lev > 25); pline(do_spec ? msgc_actionok : msgc_failrandom, "%s %s.", The(xname(instr)), do_spec ? "produces a lilting melody" : "twangs"); if (do_spec) calm_nymphs(youmonst.m_lev * 3); exercise(A_DEX, TRUE); break; case DRUM_OF_EARTHQUAKE: /* create several pits */ if (do_spec && instr->spe > 0) { consume_obj_charge(instr, TRUE); pline(msgc_occstart, "You produce a heavy, thunderous rolling!"); pline_implied(msgc_occstart, "The entire dungeon is shaking around you!"); do_earthquake((youmonst.m_lev - 1) / 3 + 1); /* shake up monsters in a much larger radius... */ awaken_monsters(&youmonst, ROWNO * COLNO); makeknown(DRUM_OF_EARTHQUAKE); break; } /* else FALLTHRU */ case LEATHER_DRUM: /* Awaken monsters */ pline(msgc_actionok, "You beat a deafening row!"); awaken_monsters(&youmonst, youmonst.m_lev * 40); exercise(A_WIS, FALSE); break; default: impossible("What a weird instrument (%d)!", instr->otyp); break; } return 2; /* That takes time */ }