OSDN Git Service

[feature] ソースファイルをC++に対応
[hengbandforosx/hengbandosx.git] / src / object / warning.c
index 45544e8..2771ee7 100644 (file)
@@ -1,5 +1,5 @@
 #include "object/warning.h"
-#include "art-definition/art-sword-types.h"
+#include "artifact/fixed-art-types.h"
 #include "core/asking-player.h"
 #include "core/disturbance.h"
 #include "dungeon/dungeon-flag-types.h"
@@ -7,7 +7,6 @@
 #include "flavor/flavor-describer.h"
 #include "flavor/object-flavor-types.h"
 #include "floor/cave.h"
-#include "floor/floor.h"
 #include "game-option/input-options.h"
 #include "grid/feature.h"
 #include "grid/grid.h"
 #include "player/mimic-info-table.h"
 #include "player/player-class.h"
 #include "player/player-race-types.h"
+#include "player/player-status-flags.h"
+#include "player/player-status-resist.h"
 #include "player/special-defense-types.h"
 #include "spell/spell-types.h"
 #include "status/element-resistance.h"
 #include "system/floor-type-definition.h"
+#include "target/projection-path-calculator.h"
 #include "util/bit-flags-calculator.h"
 #include "view/display-messages.h"
 
@@ -45,7 +47,7 @@
  */
 object_type *choose_warning_item(player_type *creature_ptr)
 {
-    int choices[INVEN_TOTAL - INVEN_RARM];
+    int choices[INVEN_TOTAL - INVEN_MAIN_HAND];
 
     /* Paranoia -- Player has no warning ability */
     if (!creature_ptr->warning)
@@ -53,12 +55,12 @@ object_type *choose_warning_item(player_type *creature_ptr)
 
     /* Search Inventory */
     int number = 0;
-    for (inventory_slot_type i = INVEN_RARM; i < INVEN_TOTAL; i++) {
+    for (int i = INVEN_MAIN_HAND; i < INVEN_TOTAL; i++) {
         BIT_FLAGS flgs[TR_FLAG_SIZE];
         object_type *o_ptr = &creature_ptr->inventory_list[i];
 
         object_flags(creature_ptr, o_ptr, flgs);
-        if (have_flag(flgs, TR_WARNING)) {
+        if (has_flag(flgs, TR_WARNING)) {
             choices[number] = i;
             number++;
         }
@@ -86,83 +88,36 @@ static void spell_damcalc(player_type *target_ptr, monster_type *m_ptr, EFFECT_I
     /* Vulnerability, resistance and immunity */
     switch (typ) {
     case GF_ELEC:
-        if (target_ptr->immune_elec) {
-            dam = 0;
+        if (has_immune_elec(target_ptr)) {
             ignore_wraith_form = TRUE;
-            break;
         }
-
-        if (target_ptr->muta3 & MUT3_VULN_ELEM)
-            dam *= 2;
-        if (target_ptr->special_defense & KATA_KOUKIJIN)
-            dam += dam / 3;
-        if (is_specific_player_race(target_ptr, RACE_ANDROID))
-            dam += dam / 3;
-        if (target_ptr->resist_elec)
-            dam = (dam + 2) / 3;
-        if (is_oppose_elec(target_ptr))
-            dam = (dam + 2) / 3;
+        dam = dam * calc_elec_damage_rate(target_ptr) / 100;
         break;
 
     case GF_POIS:
-        if (target_ptr->resist_pois)
-            dam = (dam + 2) / 3;
-        if (is_oppose_pois(target_ptr))
-            dam = (dam + 2) / 3;
+        dam = dam * calc_pois_damage_rate(target_ptr) / 100;
         break;
 
     case GF_ACID:
-        if (target_ptr->immune_acid) {
-            dam = 0;
+        if (has_immune_acid(target_ptr)) {
             ignore_wraith_form = TRUE;
-            break;
         }
-
-        if (target_ptr->muta3 & MUT3_VULN_ELEM)
-            dam *= 2;
-        if (target_ptr->special_defense & KATA_KOUKIJIN)
-            dam += dam / 3;
-        if (target_ptr->resist_acid)
-            dam = (dam + 2) / 3;
-        if (is_oppose_acid(target_ptr))
-            dam = (dam + 2) / 3;
+        dam = dam * calc_acid_damage_rate(target_ptr) / 100;
         break;
 
     case GF_COLD:
     case GF_ICE:
-        if (target_ptr->immune_cold) {
-            dam = 0;
+        if (has_immune_cold(target_ptr)) {
             ignore_wraith_form = TRUE;
-            break;
         }
-
-        if (target_ptr->muta3 & MUT3_VULN_ELEM)
-            dam *= 2;
-        if (target_ptr->special_defense & KATA_KOUKIJIN)
-            dam += dam / 3;
-        if (target_ptr->resist_cold)
-            dam = (dam + 2) / 3;
-        if (is_oppose_cold(target_ptr))
-            dam = (dam + 2) / 3;
+        dam = dam * calc_cold_damage_rate(target_ptr) / 100;
         break;
 
     case GF_FIRE:
-        if (target_ptr->immune_fire) {
-            dam = 0;
+        if (has_immune_fire(target_ptr)) {
             ignore_wraith_form = TRUE;
-            break;
         }
-
-        if (target_ptr->muta3 & MUT3_VULN_ELEM)
-            dam *= 2;
-        if (is_specific_player_race(target_ptr, RACE_ENT))
-            dam += dam / 3;
-        if (target_ptr->special_defense & KATA_KOUKIJIN)
-            dam += dam / 3;
-        if (target_ptr->resist_fire)
-            dam = (dam + 2) / 3;
-        if (is_oppose_fire(target_ptr))
-            dam = (dam + 2) / 3;
+        dam = dam * calc_fire_damage_rate(target_ptr) / 100;
         break;
 
     case GF_PSY_SPEAR:
@@ -170,129 +125,82 @@ static void spell_damcalc(player_type *target_ptr, monster_type *m_ptr, EFFECT_I
         break;
 
     case GF_ARROW:
-        if (!target_ptr->blind
-            && ((target_ptr->inventory_list[INVEN_RARM].k_idx && (target_ptr->inventory_list[INVEN_RARM].name1 == ART_ZANTETSU))
-                || (target_ptr->inventory_list[INVEN_LARM].k_idx && (target_ptr->inventory_list[INVEN_LARM].name1 == ART_ZANTETSU)))) {
+        if (!target_ptr->blind && (has_invuln_arrow(target_ptr))) {
             dam = 0;
             ignore_wraith_form = TRUE;
         }
-
         break;
 
     case GF_LITE:
-        if (target_ptr->resist_lite)
-            dam /= 2; /* Worst case of 4 / (d4 + 7) */
-        if (is_specific_player_race(target_ptr, RACE_VAMPIRE) || (target_ptr->mimic_form == MIMIC_VAMPIRE))
-            dam *= 2;
-        else if (is_specific_player_race(target_ptr, RACE_S_FAIRY))
-            dam = dam * 4 / 3;
-
-        if (target_ptr->wraith_form)
-            dam *= 2;
+        dam = dam * calc_lite_damage_rate(target_ptr, CALC_MAX) / 100;
         break;
 
     case GF_DARK:
-        if (is_specific_player_race(target_ptr, RACE_VAMPIRE) || (target_ptr->mimic_form == MIMIC_VAMPIRE) || target_ptr->wraith_form) {
-            dam = 0;
+        dam = dam * calc_dark_damage_rate(target_ptr, CALC_MAX) / 100;
+        if (is_specific_player_race(target_ptr, RACE_VAMPIRE) || (target_ptr->mimic_form == MIMIC_VAMPIRE) || target_ptr->wraith_form)
             ignore_wraith_form = TRUE;
-        } else if (target_ptr->resist_dark)
-            dam /= 2; /* Worst case of 4 / (d4 + 7) */
         break;
 
     case GF_SHARDS:
-        if (target_ptr->resist_shard)
-            dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
+        dam = dam * calc_shards_damage_rate(target_ptr, CALC_MAX) / 100;
         break;
 
     case GF_SOUND:
-        if (target_ptr->resist_sound)
-            dam = dam * 5 / 8; /* Worst case of 5 / (d4 + 7) */
+        dam = dam * calc_sound_damage_rate(target_ptr, CALC_MAX) / 100;
         break;
 
     case GF_CONFUSION:
-        if (target_ptr->resist_conf)
-            dam = dam * 5 / 8; /* Worst case of 5 / (d4 + 7) */
+        dam = dam * calc_conf_damage_rate(target_ptr, CALC_MAX) / 100;
         break;
 
     case GF_CHAOS:
-        if (target_ptr->resist_chaos)
-            dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
+        dam = dam * calc_chaos_damage_rate(target_ptr, CALC_MAX) / 100;
         break;
 
     case GF_NETHER:
+        dam = dam * calc_nether_damage_rate(target_ptr, CALC_MAX) / 100;
         if (is_specific_player_race(target_ptr, RACE_SPECTRE)) {
-            dam = 0;
             ignore_wraith_form = TRUE;
-        } else if (target_ptr->resist_neth)
-            dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
+            dam = 0;
+        }
         break;
 
     case GF_DISENCHANT:
-        if (target_ptr->resist_disen)
-            dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
+        dam = dam * calc_disenchant_damage_rate(target_ptr, CALC_MAX) / 100;
         break;
 
     case GF_NEXUS:
-        if (target_ptr->resist_nexus)
-            dam = dam * 3 / 4; /* Worst case of 6 / (d4 + 7) */
+        dam = dam * calc_nexus_damage_rate(target_ptr, CALC_MAX) / 100;
         break;
 
     case GF_TIME:
-        if (target_ptr->resist_time)
-            dam /= 2; /* Worst case of 4 / (d4 + 7) */
+        dam = dam * calc_time_damage_rate(target_ptr, CALC_MAX) / 100;
         break;
 
     case GF_GRAVITY:
-        if (target_ptr->levitation)
-            dam = (dam * 2) / 3;
+        dam = dam * calc_gravity_damage_rate(target_ptr, CALC_MAX) / 100;
         break;
 
     case GF_ROCKET:
-        if (target_ptr->resist_shard)
-            dam /= 2;
+        dam = dam * calc_rocket_damage_rate(target_ptr, CALC_MAX) / 100;
         break;
 
     case GF_NUKE:
-        if (target_ptr->resist_pois)
-            dam = (2 * dam + 2) / 5;
-        if (is_oppose_pois(target_ptr))
-            dam = (2 * dam + 2) / 5;
+        dam = dam * calc_nuke_damage_rate(target_ptr) / 100;
         break;
 
     case GF_DEATH_RAY:
-        if (target_ptr->mimic_form) {
-            if (mimic_info[target_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_NONLIVING) {
-                dam = 0;
-                ignore_wraith_form = TRUE;
-            }
-
-            break;
-        }
-
-        switch (target_ptr->prace) {
-        case RACE_GOLEM:
-        case RACE_SKELETON:
-        case RACE_ZOMBIE:
-        case RACE_VAMPIRE:
-        case RACE_BALROG:
-        case RACE_SPECTRE:
-            dam = 0;
+        dam = dam * calc_deathray_damage_rate(target_ptr, CALC_MAX) / 100;
+        if (dam == 0)
             ignore_wraith_form = TRUE;
-            break;
-        }
-
         break;
 
     case GF_HOLY_FIRE:
-        if (target_ptr->align > 10)
-            dam /= 2;
-        else if (target_ptr->align < -10)
-            dam *= 2;
+        dam = dam * calc_holy_fire_damage_rate(target_ptr, CALC_MAX) / 100;
         break;
 
     case GF_HELL_FIRE:
-        if (target_ptr->align > 10)
-            dam *= 2;
+        dam = dam * calc_hell_fire_damage_rate(target_ptr, CALC_MAX) / 100;
         break;
 
     case GF_MIND_BLAST: