#include "player/player-status-resist.h"
-#include "art-definition/art-sword-types.h"
+#include "artifact/fixed-art-types.h"
#include "grid/grid.h"
#include "inventory/inventory-slot-types.h"
#include "monster-race/monster-race.h"
#include "object-hook/hook-checker.h"
#include "object-hook/hook-weapon.h"
#include "object/object-flags.h"
+#include "player/mimic-info-table.h"
#include "player/player-class.h"
#include "player/player-race-types.h"
#include "player/player-race.h"
#include "util/quarks.h"
#include "util/string-processor.h"
+/*!
+ * @brief 耐性倍率計算の用途に応じた分岐処理
+ */
PERCENTAGE randrate(int dice, int fix, rate_calc_type_mode mode)
{
switch (mode) {
}
}
+/*!
+ * @brief 酸属性攻撃に対するダメージ倍率計算
+ */
PERCENTAGE calc_acid_damage_rate(player_type *creature_ptr)
{
PERCENTAGE per = 100;
- int i;
- if (is_immune_acid(creature_ptr)) {
+ if (has_immune_acid(creature_ptr)) {
return 0;
}
- BIT_FLAGS flgs = is_vuln_acid(creature_ptr);
- for (i = 0; i < FLAG_CAUSE_MAX; i++) {
+ BIT_FLAGS flgs = has_vuln_acid(creature_ptr);
+ for (int i = 0; i < FLAG_CAUSE_MAX; i++) {
if (flgs & (0x01 << i)) {
if (i == FLAG_CAUSE_MUTATION) {
per *= 2;
}
}
- if (creature_ptr->resist_acid)
+ if (has_resist_acid(creature_ptr))
per = (per + 2) / 3;
if (is_oppose_acid(creature_ptr))
per = (per + 2) / 3;
return per;
}
+/*!
+ * @brief 電撃属性攻撃に対するダメージ倍率計算
+ */
PERCENTAGE calc_elec_damage_rate(player_type *creature_ptr)
{
PERCENTAGE per = 100;
- int i;
- if (is_immune_elec(creature_ptr)) {
+ if (has_immune_elec(creature_ptr)) {
return 0;
}
- BIT_FLAGS flgs = is_vuln_elec(creature_ptr);
- for (i = 0; i < FLAG_CAUSE_MAX; i++) {
+ BIT_FLAGS flgs = has_vuln_elec(creature_ptr);
+ for (int i = 0; i < FLAG_CAUSE_MAX; i++) {
if (flgs & (0x01 << i)) {
if (i == FLAG_CAUSE_MUTATION) {
per *= 2;
}
}
- if (creature_ptr->resist_elec)
+ if (has_resist_elec(creature_ptr))
per = (per + 2) / 3;
if (is_oppose_elec(creature_ptr))
per = (per + 2) / 3;
return per;
}
+/*!
+ * @brief 火炎属性攻撃に対するダメージ倍率計算
+ */
PERCENTAGE calc_fire_damage_rate(player_type *creature_ptr)
{
PERCENTAGE per = 100;
- int i;
- BIT_FLAGS flgs = is_vuln_fire(creature_ptr);
- for (i = 0; i < FLAG_CAUSE_MAX; i++) {
+ BIT_FLAGS flgs = has_vuln_fire(creature_ptr);
+ for (int i = 0; i < FLAG_CAUSE_MAX; i++) {
if (flgs & (0x01 << i)) {
if (i == FLAG_CAUSE_MUTATION) {
per *= 2;
}
/* Resist the damage */
- if (creature_ptr->resist_fire)
+ if (has_resist_fire(creature_ptr))
per = (per + 2) / 3;
if (is_oppose_fire(creature_ptr))
per = (per + 2) / 3;
return per;
}
+/*!
+ * @brief 冷気属性攻撃に対するダメージ倍率計算
+ */
PERCENTAGE calc_cold_damage_rate(player_type *creature_ptr)
{
PERCENTAGE per = 100;
- int i;
- BIT_FLAGS flgs = is_vuln_cold(creature_ptr);
- for (i = 0; i < FLAG_CAUSE_MAX; i++) {
+ BIT_FLAGS flgs = has_vuln_cold(creature_ptr);
+ for (int i = 0; i < FLAG_CAUSE_MAX; i++) {
if (flgs & (0x01 << i)) {
if (i == FLAG_CAUSE_MUTATION) {
per *= 2;
}
}
- if (creature_ptr->resist_cold)
+ if (has_resist_cold(creature_ptr))
per = (per + 2) / 3;
if (is_oppose_cold(creature_ptr))
per = (per + 2) / 3;
return per;
}
+/*!
+ * @brief 毒属性攻撃に対するダメージ倍率計算
+ */
PERCENTAGE calc_pois_damage_rate(player_type *creature_ptr)
{
PERCENTAGE per = 100;
- if (creature_ptr->resist_pois)
+ if (has_resist_pois(creature_ptr))
per = (per + 2) / 3;
if (is_oppose_pois(creature_ptr))
per = (per + 2) / 3;
return per;
}
+/*!
+ * @brief 放射性廃棄物攻撃に対するダメージ倍率計算
+ */
PERCENTAGE calc_nuke_damage_rate(player_type *creature_ptr)
{
+
PERCENTAGE per = 100;
- if (creature_ptr->resist_pois)
- per = (per + 2) / 3;
+ if (has_resist_pois(creature_ptr))
+ per = (2 * per + 2) / 5;
if (is_oppose_pois(creature_ptr))
- per = (per + 2) / 3;
+ per = (2 * per + 2) / 5;
return per;
}
+/*!
+ * @brief 死の光線に対するダメージ倍率計算
+ */
+PERCENTAGE calc_deathray_damage_rate(player_type *creature_ptr, rate_calc_type_mode mode)
+{
+ (void)mode; // unused
+ if (creature_ptr->mimic_form) {
+ if (mimic_info[creature_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_NONLIVING) {
+ return 0;
+ }
+ }
+
+ switch (creature_ptr->prace) {
+ case RACE_GOLEM:
+ case RACE_SKELETON:
+ case RACE_ZOMBIE:
+ case RACE_VAMPIRE:
+ case RACE_BALROG:
+ case RACE_SPECTRE:
+ return 0;
+ break;
+ }
+
+ return 100;
+}
+
+/*!
+ * @brief 閃光属性攻撃に対するダメージ倍率計算
+ */
PERCENTAGE calc_lite_damage_rate(player_type *creature_ptr, rate_calc_type_mode mode)
{
PERCENTAGE per = 100;
per = per * 4 / 3;
}
- if (creature_ptr->resist_lite) {
+ if (has_resist_lite(creature_ptr)) {
per *= 400;
per /= randrate(4, 7, mode);
}
return per;
}
+/*!
+ * @brief 暗黒属性攻撃に対するダメージ倍率計算
+ */
PERCENTAGE calc_dark_damage_rate(player_type *creature_ptr, rate_calc_type_mode mode)
{
PERCENTAGE per = 100;
return per;
}
+/*!
+ * @brief 破片属性攻撃に対するダメージ倍率計算
+ */
+PERCENTAGE calc_shards_damage_rate(player_type *creature_ptr, rate_calc_type_mode mode)
+{
+ PERCENTAGE per = 100;
+
+ if (creature_ptr->resist_shard) {
+ per *= 600;
+ per /= randrate(4, 7, mode);
+ }
+
+ return per;
+}
+
+/*!
+ * @brief 轟音属性攻撃に対するダメージ倍率計算
+ */
+PERCENTAGE calc_sound_damage_rate(player_type *creature_ptr, rate_calc_type_mode mode)
+{
+ PERCENTAGE per = 100;
+
+ if (has_resist_sound(creature_ptr)) {
+ per *= 500;
+ per /= randrate(4, 7, mode);
+ }
+
+ return per;
+}
+
+/*!
+ * @brief 混乱属性攻撃に対するダメージ倍率計算
+ */
+PERCENTAGE calc_conf_damage_rate(player_type *creature_ptr, rate_calc_type_mode mode)
+{
+ PERCENTAGE per = 100;
+
+ if (has_resist_conf(creature_ptr)) {
+ per *= 500;
+ per /= randrate(4, 7, mode);
+ }
+
+ return per;
+}
+
+/*!
+ * @brief 混沌属性攻撃に対するダメージ倍率計算
+ */
+PERCENTAGE calc_chaos_damage_rate(player_type *creature_ptr, rate_calc_type_mode mode)
+{
+ PERCENTAGE per = 100;
+
+ if (creature_ptr->resist_chaos) {
+ per *= 600;
+ per /= randrate(4, 7, mode);
+ }
+
+ return per;
+}
+
+/*!
+ * @brief 劣化属性攻撃に対するダメージ倍率計算
+ */
+PERCENTAGE calc_disenchant_damage_rate(player_type *creature_ptr, rate_calc_type_mode mode)
+{
+ PERCENTAGE per = 100;
+
+ if (creature_ptr->resist_disen) {
+ per *= 600;
+ per /= randrate(4, 7, mode);
+ }
+
+ return per;
+}
+
+/*!
+ * @brief 因果混乱属性攻撃に対するダメージ倍率計算
+ */
+PERCENTAGE calc_nexus_damage_rate(player_type *creature_ptr, rate_calc_type_mode mode)
+{
+ PERCENTAGE per = 100;
+
+ if (creature_ptr->resist_disen) {
+ per *= 600;
+ per /= randrate(4, 7, mode);
+ }
+
+ return per;
+}
+
+/*!
+ * @brief ロケット属性攻撃に対するダメージ倍率計算
+ */
+PERCENTAGE calc_rocket_damage_rate(player_type *creature_ptr, rate_calc_type_mode mode)
+{
+ (void)mode; // unused
+ PERCENTAGE per = 100;
+
+ if (creature_ptr->resist_shard) {
+ per /= 2;
+ }
+
+ return per;
+}
+
+/*!
+ * @brief 地獄属性攻撃に対するダメージ倍率計算
+ */
+PERCENTAGE calc_nether_damage_rate(player_type *creature_ptr, rate_calc_type_mode mode)
+{
+ PERCENTAGE per = 100;
+
+ if (creature_ptr->resist_neth) {
+ if (!is_specific_player_race(creature_ptr, RACE_SPECTRE))
+ per *= 6;
+ per *= 100;
+ per /= randrate(4, 7, mode);
+ }
+
+ return per;
+}
+
+/*!
+ * @brief 時間逆転攻撃に対するダメージ倍率計算
+ */
+PERCENTAGE calc_time_damage_rate(player_type *creature_ptr, rate_calc_type_mode mode)
+{
+ (void)mode; // unused
+ PERCENTAGE per = 100;
+
+ if (creature_ptr->resist_time) {
+ per *= 400;
+ per /= randrate(4, 7, mode);
+ }
+
+ return per;
+}
+
+/*!
+ * @brief 聖なる火炎攻撃に対するダメージ倍率計算
+ */
PERCENTAGE calc_holy_fire_damage_rate(player_type *creature_ptr, rate_calc_type_mode mode)
{
- (mode); // unused
+ (void)mode; // unused
PERCENTAGE per = 100;
if (creature_ptr->align > 10)
per /= 2;
return per;
}
+/*!
+ * @brief 地獄の火炎攻撃に対するダメージ倍率計算
+ */
+PERCENTAGE calc_hell_fire_damage_rate(player_type *creature_ptr, rate_calc_type_mode mode)
+{
+ (void)mode; // unused
+ PERCENTAGE per = 100;
+ if (creature_ptr->align > 10)
+ per *= 2;
+ return per;
+}
+
+/*!
+ * @brief 重力攻撃に対するダメージ倍率計算
+ */
+PERCENTAGE calc_gravity_damage_rate(player_type *creature_ptr, rate_calc_type_mode mode)
+{
+ (void)mode; // unused
+ PERCENTAGE per = 100;
+ if (creature_ptr->levitation) {
+ per = (per * 2) / 3;
+ }
+ return per;
+}