+ * @brief 矢弾の属性を定義する
+ * @param bow_ptr 弓のオブジェクト構造体参照ポインタ
+ * @param arrow_ptr 矢弾のオブジェクト構造体参照ポインタ
+ * @return スナイパーの射撃属性、弓矢の属性を考慮する。デフォルトはGF_PLAYER_SHOOT。
+ */
+AttributeFlags shot_attribute(PlayerType *player_ptr, ObjectType *bow_ptr, ObjectType *arrow_ptr, SPELL_IDX snipe_type)
+{
+ AttributeFlags attribute_flags{};
+ attribute_flags.set(AttributeType::PLAYER_SHOOT);
+
+ TrFlags flags{};
+ auto arrow_flags = object_flags(arrow_ptr);
+ auto bow_flags = object_flags(bow_ptr);
+
+ flags = bow_flags | arrow_flags;
+
+ static const struct snipe_convert_table_t {
+ SPELL_IDX snipe_type;
+ AttributeType attribute;
+ } snipe_convert_table[] = {
+ { SP_LITE, AttributeType::LITE },
+ { SP_FIRE, AttributeType::FIRE },
+ { SP_COLD, AttributeType::COLD },
+ { SP_ELEC, AttributeType::ELEC },
+ { SP_KILL_WALL, AttributeType::KILL_WALL },
+ { SP_EVILNESS, AttributeType::HELL_FIRE },
+ { SP_HOLYNESS, AttributeType::HOLY_FIRE },
+ { SP_FINAL, AttributeType::MANA },
+ };
+
+ static const struct brand_convert_table_t {
+ tr_type brand_type;
+ AttributeType attribute;
+ } brand_convert_table[] = {
+ { TR_BRAND_ACID, AttributeType::ACID },
+ { TR_BRAND_FIRE, AttributeType::FIRE },
+ { TR_BRAND_ELEC, AttributeType::ELEC },
+ { TR_BRAND_COLD, AttributeType::COLD },
+ { TR_BRAND_POIS, AttributeType::POIS },
+ { TR_SLAY_GOOD, AttributeType::HELL_FIRE },
+ { TR_KILL_GOOD, AttributeType::HELL_FIRE },
+ { TR_SLAY_EVIL, AttributeType::HOLY_FIRE },
+ { TR_KILL_EVIL, AttributeType::HOLY_FIRE },
+ };
+
+ for (size_t i = 0; i < sizeof(snipe_convert_table) / sizeof(snipe_convert_table[0]); ++i) {
+ const struct snipe_convert_table_t *p = &snipe_convert_table[i];
+
+ if (snipe_type == p->snipe_type)
+ attribute_flags.set(p->attribute);
+ }
+
+ for (size_t i = 0; i < sizeof(brand_convert_table) / sizeof(brand_convert_table[0]); ++i) {
+ const struct brand_convert_table_t *p = &brand_convert_table[i];
+
+ if (flags.has(p->brand_type))
+ attribute_flags.set(p->attribute);
+ }
+
+ if ((flags.has(TR_FORCE_WEAPON)) && (player_ptr->csp > (player_ptr->msp / 30))) {
+ attribute_flags.set(AttributeType::MANA);
+ }
+
+ return attribute_flags;
+}
+
+/*!