OSDN Git Service

[Fix] #38993 current_floor -> current_floor_ptr
[hengband/hengband.git] / src / spells-object.c
index 3303944..ea4d812 100644 (file)
@@ -1,5 +1,6 @@
 
 #include "angband.h"
+#include "artifact.h"
 #include "spells-object.h"
 #include "object-hook.h"
 #include "player-status.h"
@@ -113,7 +114,7 @@ bool create_ammo(void)
                if (!get_rep_dir(&dir, FALSE)) return FALSE;
                y = p_ptr->y + ddy[dir];
                x = p_ptr->x + ddx[dir];
-               g_ptr = &grid_array[y][x];
+               g_ptr = &current_floor_ptr->grid_array[y][x];
 
                if (!have_flag(f_info[get_feat_mimic(g_ptr)].flags, FF_CAN_DIG))
                {
@@ -338,7 +339,7 @@ bool import_magic_device(void)
                floor_item_describe(0 - item);
                floor_item_optimize(0 - item);
        }
-       take_turn(p_ptr, 100);;
+       take_turn(p_ptr, 100);
        return TRUE;
 }
 
@@ -466,6 +467,108 @@ void acquirement(POSITION y1, POSITION x1, int num, bool great, bool special, bo
        }
 }
 
+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
@@ -693,3 +796,80 @@ bool brand_bolts(void)
        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);
+       }
+}
+
+