#include "angband.h"
+#include "artifact.h"
#include "spells-object.h"
#include "object-hook.h"
#include "player-status.h"
+#include "avatar.h"
typedef struct
{
POSITION x, y;
DIRECTION dir;
- cave_type *c_ptr;
+ grid_type *g_ptr;
if (!get_rep_dir(&dir, FALSE)) return FALSE;
y = p_ptr->y + ddy[dir];
x = p_ptr->x + ddx[dir];
- c_ptr = &cave[y][x];
+ g_ptr = ¤t_floor_ptr->grid_array[y][x];
- if (!have_flag(f_info[get_feat_mimic(c_ptr)].flags, FF_CAN_DIG))
+ if (!have_flag(f_info[get_feat_mimic(g_ptr)].flags, FF_CAN_DIG))
{
msg_print(_("そこには岩石がない。", "You need pile of rubble."));
return FALSE;
}
- else if (!cave_have_flag_grid(c_ptr, FF_CAN_DIG) || !cave_have_flag_grid(c_ptr, FF_HURT_ROCK))
+ else if (!cave_have_flag_grid(g_ptr, FF_CAN_DIG) || !cave_have_flag_grid(g_ptr, FF_HURT_ROCK))
{
msg_print(_("硬すぎて崩せなかった。", "You failed to make ammo."));
}
floor_item_describe(0 - item);
floor_item_optimize(0 - item);
}
- take_turn(p_ptr, 100);;
+ take_turn(p_ptr, 100);
return TRUE;
}
/* Paranoia - reroll if nothing */
if (!(i_ptr->k_idx)) continue;
- /* Drop the object */
(void)drop_near(i_ptr, -1, y1, x1);
num--;
object_known(i_ptr);
}
- /* Drop the object */
(void)drop_near(i_ptr, -1, y1, x1);
}
}
+
+void acquire_chaos_weapon(player_type *creature_ptr)
+{
+ object_type forge;
+ object_type *q_ptr = &forge;
+ OBJECT_TYPE_VALUE dummy = TV_SWORD;
+ OBJECT_SUBTYPE_VALUE dummy2;
+ switch (randint1(creature_ptr->lev))
+ {
+ case 0: case 1:
+ dummy2 = SV_DAGGER;
+ break;
+ case 2: case 3:
+ dummy2 = SV_MAIN_GAUCHE;
+ break;
+ case 4:
+ dummy2 = SV_TANTO;
+ break;
+ case 5: case 6:
+ dummy2 = SV_RAPIER;
+ break;
+ case 7: case 8:
+ dummy2 = SV_SMALL_SWORD;
+ break;
+ case 9: case 10:
+ dummy2 = SV_BASILLARD;
+ break;
+ case 11: case 12: case 13:
+ dummy2 = SV_SHORT_SWORD;
+ break;
+ case 14: case 15:
+ dummy2 = SV_SABRE;
+ break;
+ case 16: case 17:
+ dummy2 = SV_CUTLASS;
+ break;
+ case 18:
+ dummy2 = SV_WAKIZASHI;
+ break;
+ case 19:
+ dummy2 = SV_KHOPESH;
+ break;
+ case 20:
+ dummy2 = SV_TULWAR;
+ break;
+ case 21:
+ dummy2 = SV_BROAD_SWORD;
+ break;
+ case 22: case 23:
+ dummy2 = SV_LONG_SWORD;
+ break;
+ case 24: case 25:
+ dummy2 = SV_SCIMITAR;
+ break;
+ case 26:
+ dummy2 = SV_NINJATO;
+ break;
+ case 27:
+ dummy2 = SV_KATANA;
+ break;
+ case 28: case 29:
+ dummy2 = SV_BASTARD_SWORD;
+ break;
+ case 30:
+ dummy2 = SV_GREAT_SCIMITAR;
+ break;
+ case 31:
+ dummy2 = SV_CLAYMORE;
+ break;
+ case 32:
+ dummy2 = SV_ESPADON;
+ break;
+ case 33:
+ dummy2 = SV_TWO_HANDED_SWORD;
+ break;
+ case 34:
+ dummy2 = SV_FLAMBERGE;
+ break;
+ case 35:
+ dummy2 = SV_NO_DACHI;
+ break;
+ case 36:
+ dummy2 = SV_EXECUTIONERS_SWORD;
+ break;
+ case 37:
+ dummy2 = SV_ZWEIHANDER;
+ break;
+ case 38:
+ dummy2 = SV_HAYABUSA;
+ break;
+ default:
+ dummy2 = SV_BLADE_OF_CHAOS;
+ }
+
+ object_prep(q_ptr, lookup_kind(dummy, dummy2));
+ q_ptr->to_h = 3 + randint1(dun_level) % 10;
+ q_ptr->to_d = 3 + randint1(dun_level) % 10;
+ one_resistance(q_ptr);
+ q_ptr->name2 = EGO_CHAOTIC;
+ (void)drop_near(q_ptr, -1, creature_ptr->y, creature_ptr->x);
+}
+
+
+/*!
+ * @brief 防具呪縛処理 /
+ * Curse the players armor
+ * @return 実際に呪縛されたらTRUEを返す
+ */
+bool curse_armor(void)
+{
+ int i;
+ object_type *o_ptr;
+
+ GAME_TEXT o_name[MAX_NLEN];
+
+ /* Curse the body armor */
+ o_ptr = &inventory[INVEN_BODY];
+
+ /* Nothing to curse */
+ if (!o_ptr->k_idx) return (FALSE);
+
+ object_desc(o_name, o_ptr, OD_OMIT_PREFIX);
+
+ /* Attempt a saving throw for artifacts */
+ if (object_is_artifact(o_ptr) && (randint0(100) < 50))
+ {
+ /* Cool */
+#ifdef JP
+ msg_format("%sが%sを包み込もうとしたが、%sはそれを跳ね返した!",
+ "恐怖の暗黒オーラ", "防具", o_name);
+#else
+ msg_format("A %s tries to %s, but your %s resists the effects!",
+ "terrible black aura", "surround your armor", o_name);
+#endif
+
+ }
+
+ /* not artifact or failed save... */
+ else
+ {
+ msg_format(_("恐怖の暗黒オーラがあなたの%sを包み込んだ!", "A terrible black aura blasts your %s!"), o_name);
+ chg_virtue(V_ENCHANT, -5);
+
+ /* Blast the armor */
+ o_ptr->name1 = 0;
+ o_ptr->name2 = EGO_BLASTED;
+ o_ptr->to_a = 0 - randint1(5) - randint1(5);
+ o_ptr->to_h = 0;
+ o_ptr->to_d = 0;
+ o_ptr->ac = 0;
+ o_ptr->dd = 0;
+ o_ptr->ds = 0;
+
+ for (i = 0; i < TR_FLAG_SIZE; i++)
+ o_ptr->art_flags[i] = 0;
+
+ /* Curse it */
+ o_ptr->curse_flags = TRC_CURSED;
+
+ /* Break it */
+ o_ptr->ident |= (IDENT_BROKEN);
+ p_ptr->update |= (PU_BONUS | PU_MANA);
+ p_ptr->window |= (PW_INVEN | PW_EQUIP | PW_PLAYER);
+ }
+
+ return (TRUE);
+}
+
+/*!
+ * @brief 武器呪縛処理 /
+ * Curse the players weapon
+ * @param force 無条件に呪縛を行うならばTRUE
+ * @param o_ptr 呪縛する武器のアイテム情報参照ポインタ
+ * @return 実際に呪縛されたらTRUEを返す
+ */
+bool curse_weapon_object(bool force, object_type *o_ptr)
+{
+ int i;
+ GAME_TEXT o_name[MAX_NLEN];
+
+ /* Nothing to curse */
+ if (!o_ptr->k_idx) return (FALSE);
+ object_desc(o_name, o_ptr, OD_OMIT_PREFIX);
+
+ /* Attempt a saving throw */
+ if (object_is_artifact(o_ptr) && (randint0(100) < 50) && !force)
+ {
+ /* Cool */
+#ifdef JP
+ msg_format("%sが%sを包み込もうとしたが、%sはそれを跳ね返した!",
+ "恐怖の暗黒オーラ", "武器", o_name);
+#else
+ msg_format("A %s tries to %s, but your %s resists the effects!",
+ "terrible black aura", "surround your weapon", o_name);
+#endif
+ }
+
+ /* not artifact or failed save... */
+ else
+ {
+ if (!force) msg_format(_("恐怖の暗黒オーラがあなたの%sを包み込んだ!", "A terrible black aura blasts your %s!"), o_name);
+ chg_virtue(V_ENCHANT, -5);
+
+ /* Shatter the weapon */
+ o_ptr->name1 = 0;
+ o_ptr->name2 = EGO_SHATTERED;
+ o_ptr->to_h = 0 - randint1(5) - randint1(5);
+ o_ptr->to_d = 0 - randint1(5) - randint1(5);
+ o_ptr->to_a = 0;
+ o_ptr->ac = 0;
+ o_ptr->dd = 0;
+ o_ptr->ds = 0;
+
+ for (i = 0; i < TR_FLAG_SIZE; i++)
+ o_ptr->art_flags[i] = 0;
+
+ /* Curse it */
+ o_ptr->curse_flags = TRC_CURSED;
+
+ /* Break it */
+ o_ptr->ident |= (IDENT_BROKEN);
+ p_ptr->update |= (PU_BONUS | PU_MANA);
+ p_ptr->window |= (PW_INVEN | PW_EQUIP | PW_PLAYER);
+ }
+
+ return (TRUE);
+}
+
+/*!
+ * @brief 武器呪縛処理のメインルーチン /
+ * Curse the players weapon
+ * @param force 無条件に呪縛を行うならばTRUE
+ * @param slot 呪縛する武器の装備スロット
+ * @return 実際に呪縛されたらTRUEを返す
+ */
+bool curse_weapon(bool force, int slot)
+{
+ /* Curse the weapon */
+ return curse_weapon_object(force, &inventory[slot]);
+}
+
+
+/*!
+ * @brief 防具の錆止め防止処理
+ * @return ターン消費を要する処理を行ったならばTRUEを返す
+ */
+bool rustproof(void)
+{
+ OBJECT_IDX item;
+ object_type *o_ptr;
+ GAME_TEXT o_name[MAX_NLEN];
+ concptr q, s;
+
+ /* Select a piece of armour */
+ item_tester_hook = object_is_armour;
+
+ q = _("どの防具に錆止めをしますか?", "Rustproof which piece of armour? ");
+ s = _("錆止めできるものがありません。", "You have nothing to rustproof.");
+
+ o_ptr = choose_object(&item, q, s, (USE_EQUIP | USE_INVEN | USE_FLOOR | IGNORE_BOTHHAND_SLOT));
+ if (!o_ptr) return FALSE;
+
+ object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
+
+ add_flag(o_ptr->art_flags, TR_IGNORE_ACID);
+
+ if ((o_ptr->to_a < 0) && !object_is_cursed(o_ptr))
+ {
+#ifdef JP
+ msg_format("%sは新品同様になった!", o_name);
+#else
+ msg_format("%s %s look%s as good as new!", ((item >= 0) ? "Your" : "The"), o_name, ((o_ptr->number > 1) ? "" : "s"));
+#endif
+
+ o_ptr->to_a = 0;
+ }
+
+#ifdef JP
+ msg_format("%sは腐食しなくなった。", o_name);
+#else
+ msg_format("%s %s %s now protected against corrosion.", ((item >= 0) ? "Your" : "The"), o_name, ((o_ptr->number > 1) ? "are" : "is"));
+#endif
+
+ calc_android_exp();
+ return TRUE;
+}
+
+/*!
+ * @brief ボルトのエゴ化処理(火炎エゴのみ) /
+ * Enchant some bolts
+ * @return 常にTRUEを返す
+ */
+bool brand_bolts(void)
+{
+ int i;
+
+ /* Use the first acceptable bolts */
+ for (i = 0; i < INVEN_PACK; i++)
+ {
+ object_type *o_ptr = &inventory[i];
+
+ /* Skip non-bolts */
+ if (o_ptr->tval != TV_BOLT) continue;
+
+ /* Skip artifacts and ego-items */
+ if (object_is_artifact(o_ptr) || object_is_ego(o_ptr))
+ continue;
+
+ /* Skip cursed/broken items */
+ if (object_is_cursed(o_ptr) || object_is_broken(o_ptr)) continue;
+
+ /* Randomize */
+ if (randint0(100) < 75) continue;
+
+ msg_print(_("クロスボウの矢が炎のオーラに包まれた!", "Your bolts are covered in a fiery aura!"));
+
+ /* Ego-item */
+ o_ptr->name2 = EGO_FLAME;
+ enchant(o_ptr, randint0(3) + 4, ENCH_TOHIT | ENCH_TODAM);
+ return (TRUE);
+ }
+
+ if (flush_failure) flush();
+
+ /* Fail */
+ msg_print(_("炎で強化するのに失敗した。", "The fiery enchantment failed."));
+
+ return (TRUE);
+}
+
+
+bool perilous_secrets(player_type *creature_ptr)
+{
+ if (!ident_spell(FALSE)) return FALSE;
+
+ if (mp_ptr->spell_book)
+ {
+ /* Sufficient mana */
+ if (20 <= creature_ptr->csp)
+ {
+ /* Use some mana */
+ creature_ptr->csp -= 20;
+ }
+
+ /* Over-exert the player */
+ else
+ {
+ int oops = 20 - creature_ptr->csp;
+
+ /* No mana left */
+ creature_ptr->csp = 0;
+ creature_ptr->csp_frac = 0;
+
+ msg_print(_("石を制御できない!", "You are too weak to control the stone!"));
+ /* Hack -- Bypass free action */
+ (void)set_paralyzed(creature_ptr->paralyzed + randint1(5 * oops + 1));
+
+ /* Confusing. */
+ (void)set_confused(creature_ptr->confused + randint1(5 * oops + 1));
+ }
+ creature_ptr->redraw |= (PR_MANA);
+ }
+ take_hit(DAMAGE_LOSELIFE, damroll(1, 12), _("危険な秘密", "perilous secrets"), -1);
+ /* Confusing. */
+ if (one_in_(5)) (void)set_confused(creature_ptr->confused + randint1(10));
+
+ /* Exercise a little care... */
+ if (one_in_(20)) take_hit(DAMAGE_LOSELIFE, damroll(4, 10), _("危険な秘密", "perilous secrets"), -1);
+ return TRUE;
+
+}
+
+/*!
+ * @brief 固定アーティファクト『ブラッディムーン』の特性を変更する。
+ * @details スレイ2d2種、及びone_resistance()による耐性1d2種、pval2種を得る。
+ * @param o_ptr 対象のオブジェクト構造体(ブラッディムーン)のポインタ
+ * @return なし
+ */
+void get_bloody_moon_flags(object_type *o_ptr)
+{
+ int dummy, i;
+
+ for (i = 0; i < TR_FLAG_SIZE; i++)
+ o_ptr->art_flags[i] = a_info[ART_BLOOD].flags[i];
+
+ dummy = randint1(2) + randint1(2);
+ for (i = 0; i < dummy; i++)
+ {
+ int flag = randint0(26);
+ if (flag >= 20) add_flag(o_ptr->art_flags, TR_KILL_UNDEAD + flag - 20);
+ else if (flag == 19) add_flag(o_ptr->art_flags, TR_KILL_ANIMAL);
+ else if (flag == 18) add_flag(o_ptr->art_flags, TR_SLAY_HUMAN);
+ else add_flag(o_ptr->art_flags, TR_CHAOTIC + flag);
+ }
+
+ dummy = randint1(2);
+ for (i = 0; i < dummy; i++) one_resistance(o_ptr);
+
+ for (i = 0; i < 2; i++)
+ {
+ int tmp = randint0(11);
+ if (tmp < A_MAX) add_flag(o_ptr->art_flags, TR_STR + tmp);
+ else add_flag(o_ptr->art_flags, TR_STEALTH + tmp - 6);
+ }
+}
+
+