OSDN Git Service

Merge pull request #808 from sikabane-works/feature/add-coordinate-cheat-sight
authorDeskull <61610939+sikabane-works@users.noreply.github.com>
Fri, 16 Apr 2021 12:24:22 +0000 (21:24 +0900)
committerGitHub <noreply@github.com>
Fri, 16 Apr 2021 12:24:22 +0000 (21:24 +0900)
[Add] cheat_sightに座標表示 / Coordinate display on cheat_sight.

55 files changed:
lib/edit/a_info.txt
lib/edit/e_info.txt
lib/edit/k_info.txt
lib/edit/misc.txt
src/artifact/artifact-info.cpp
src/artifact/random-art-effects.h
src/artifact/random-art-misc.cpp
src/artifact/random-art-slay.cpp
src/cmd-item/cmd-smith.cpp
src/combat/attack-criticality.cpp
src/combat/attack-criticality.h
src/combat/shoot.cpp
src/flavor/flag-inscriptions-table.cpp
src/info-reader/artifact-reader.cpp
src/info-reader/ego-reader.cpp
src/info-reader/kind-info-tokens-table.cpp
src/info-reader/kind-info-tokens-table.h
src/info-reader/kind-reader.cpp
src/inventory/inventory-curse.cpp
src/market/building-craft-weapon.cpp
src/monster-floor/monster-object.cpp
src/object-activation/activation-others.cpp
src/object-activation/activation-others.h
src/object-enchant/activation-info-table.cpp
src/object-enchant/activation-info-table.h
src/object-enchant/apply-magic-armor.cpp
src/object-enchant/apply-magic-weapon.cpp
src/object-enchant/object-boost.cpp
src/object-enchant/object-boost.h
src/object-enchant/object-ego.cpp
src/object-enchant/object-ego.h
src/object-enchant/tr-types.h
src/object-enchant/trc-types.h
src/object-enchant/trg-types.h
src/object/object-flags.cpp
src/object/object-value-calc.cpp
src/perception/identification.cpp
src/player-attack/attack-chaos-effect.cpp
src/player-attack/player-attack-util.h
src/player-attack/player-attack.cpp
src/player-info/body-improvement-info.cpp
src/player-info/self-info.cpp
src/player-info/weapon-effect-info.cpp
src/player/player-status-flags.cpp
src/player/player-status-flags.h
src/player/player-status.cpp
src/player/player-status.h
src/spell-kind/spells-sight.cpp
src/spell-kind/spells-sight.h
src/view/display-characteristic.cpp
src/wizard/cmd-wizard.cpp
src/wizard/spoiler-table.cpp
src/wizard/spoiler-table.h
src/wizard/wizard-item-modifier.cpp
src/wizard/wizard-item-modifier.h

index f3fa5ee..9befd60 100644 (file)
@@ -464,7 +464,7 @@ E:'Soulkeeper'
 I:37:30:2
 W:75:9:420:200000
 P:40:2d4:-4:0:20
-F:CON | HOLD_EXP | SUST_CON |
+F:CON | HOLD_EXP | SUST_CON | RES_CURSE
 F:RES_ACID | RES_COLD | RES_DARK | RES_NETHER | RES_NEXUS | RES_CHAOS |
 F:ACTIVATE
 U:CURE_1000
@@ -2237,7 +2237,7 @@ E:'Grond'
 I:21:50:0
 W:100:1:1000:500000
 P:0:9d9:5:25:10
-F:KILL_DRAGON | SLAY_ANIMAL | SLAY_EVIL | IMPACT | SLAY_UNDEAD | NO_MAGIC |
+F:KILL_DRAGON | SLAY_ANIMAL | SLAY_EVIL | IMPACT | EARTHQUAKE | SLAY_UNDEAD | NO_MAGIC |
 F:SLAY_DEMON | SLAY_TROLL | SLAY_ORC | RES_ACID | RES_ELEC | RES_FIRE |
 F:RES_COLD | SEE_INVIS | TELEPATHY | AGGRAVATE | SHOW_MODS | INSTA_ART |
 F:SLAY_HUMAN | RIDING | QUESTITEM
@@ -2729,7 +2729,7 @@ I:21:13:-4
 W:30:20:500:0
 P:0:8d6:0:30:0
 F:STEALTH | INT | WIS | AGGRAVATE | CURSED | HEAVY_CURSE |
-F:SHOW_MODS | CHAOTIC | IMPACT | SPEED
+F:SHOW_MODS | CHAOTIC | IMPACT | EARTHQUAKE | SPEED
 F:RANDOM_CURSE0
 D:$This is a destructive heavy thing made by Micro$oft.
 D:$  It will bring many troubles to its user.
@@ -3157,7 +3157,7 @@ E:'Iron ball'
 I:21:6:-6
 W:45:40:666:66666
 P:0:25d4:-30:0:20
-F:SPEED | STEALTH | WIS | IMPACT | SHOW_MODS | HIDE_TYPE |
+F:SPEED | STEALTH | WIS | IMPACT | EARTHQUAKE | SHOW_MODS | HIDE_TYPE |
 F:CURSED | HEAVY_CURSE
 D:$It is a very heavy iron ball, likely too cumbersome to be effective as
 D:$ a weapon, with an attached chain and metal ring, ready to be fastened to
@@ -3199,7 +3199,7 @@ P:0:5d5:21:19:5
 F:WIS | CHR | SUST_WIS | SUST_CHR | 
 F:VORPAL | TUNNEL | RIDING |
 F:SLAY_EVIL | SLAY_UNDEAD | SLAY_DEMON |
-F:RES_SHARDS | RES_FEAR | BLESSED | HOLD_EXP | 
+F:RES_SHARDS | RES_FEAR | RES_CURSE | BLESSED | HOLD_EXP
 F:SEE_INVIS | WARNING | SHOW_MODS
 D:「妖精郷にて鍛えられし我はいや高き刃なりて、相応しき王の佩刀とならん」
 D:(トマス・マロリー、アーサー王の死)
@@ -3340,7 +3340,7 @@ I:34:7:0
 W:50:3:160:90000
 P:10:1d6:0:0:20
 F:RES_BLIND | RES_DARK | RES_NETHER | RES_ELEC | RES_FIRE | RES_WATER
-F:ACTIVATE | ESP_GOOD | LITE_3
+F:ACTIVATE | ESP_GOOD | LITE_3 | RES_CURSE
 U:CURING
 D:$A shining shield, once borne by the great mariner Earendil, "scored with 
 D:$runes to keep all wounds and harm from him".
@@ -3525,7 +3525,7 @@ I:38:2:0
 W:80:9:300:200000
 P:40:2d4:-3:0:30
 F:RES_ACID | RES_FIRE | RES_COLD | RES_ELEC |
-F:RES_DARK | RES_CONF | RES_POIS |
+F:RES_DARK | RES_CONF | RES_POIS | RES_TIME | RES_CURSE
 F:FREE_ACT | SEE_INVIS | ACTIVATE
 U:RESIST_ALL
 D:$This blue dragon scale armor has been blessed by the azure dragon that
@@ -3563,7 +3563,7 @@ W:90:8:200:100000
 P:14:1d4:-5:0:-40
 F:INT | WIS | CHR | HIDE_TYPE | RES_LITE | RES_DARK |
 F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD |
-F:RES_POIS | RES_CONF | RES_CHAOS | RES_NETHER |
+F:RES_POIS | RES_CONF | RES_CHAOS | RES_NETHER | RES_CURSE
 F:RES_NEXUS | AGGRAVATE | CURSED | HEAVY_CURSE | TY_CURSE
 D:$This badly rusted chain mail was once worn by a high priest who guarded a
 D:$ powerful magic amulet.  That priest's despair and the amulet's magic have
@@ -3782,7 +3782,7 @@ I:40:25:2
 W:50:50:2:77777
 P:0:0d0:0:0:10
 F:STR | WIS | HIDE_TYPE |
-F:RES_CONF | RES_CHAOS | BLESSED | 
+F:RES_CONF | RES_CHAOS | BLESSED |
 F:SEE_INVIS | FREE_ACT | REGEN | HOLD_EXP | ACTIVATE |
 F:INSTA_ART
 U:DISP_CURSE_XTRA
@@ -4155,7 +4155,8 @@ E:The Orb of Fate
 I:39:10:3
 W:70:70:15:45000
 P:0:1d1:0:0:20
-F:WIS | CON | WARNING | ACTIVATE | FULL_NAME | LITE_3 | INSTA_ART
+F:FULL_NAME | INSTA_ART
+F:WIS | CON | WARNING | RES_CURSE | LITE_3 | ACTIVATE 
 U:TELEPORT_LEVEL
 D:$"You may take the Orb of Fate with you.
 D:$  I have removed from it the power to foretell the future,
@@ -4428,3 +4429,25 @@ U:BA_FIRE_2
 D:破壊神シヴァが持つ三又槍だ。3つの穂先はそれぞれシヴァの力である、意志(欲望)、行動、知恵をあらわす。
 D:シヴァはこの槍を用いて、アシュラ族の3人の魔神『トリプラースラ』がつくった「鉄でできた町」「銀でできた町」
 D:「金でできた町」を一晩で焼き払った。
+
+N:264:『マジックベーン』
+E:'Magicbane'
+I:23:4:1
+W:30:40:12:50000
+P:0:2d4:0:0:0
+F:INT | WIS | HIDE_TYPE | SHOW_MODS
+F:BRAND_MAGIC | RES_CURSE | REFLECT
+F:SEE_INVIS | EASY_SPELL | BLESSED | ACTIVATE
+U:ELBERETH
+D:$This athame has magical blade which provides some nasty effect to your enemies.
+D:魔力を帯びた刃を持つアサメだ。斬りつけた敵に様々な効果をもたらすだろう。
+
+N:265:賢者マーリンの魔法の
+E:of Wizard Marlin
+I:34:50:3
+W:65:90:50:50000
+P:0:1d1:0:0:15
+F:INT | WIS | HIDE_TYPE | INSTA_ART
+F:RES_CURSE | RES_BLIND
+F:TELEPATHY | DEC_MANA | REFLECT | BLESSED
+D:賢者マーリンの魔法の鏡だ。鏡を通じて賢者の助けを得ることができるだろう。
index 4033ffe..db686a6 100644 (file)
@@ -67,7 +67,7 @@ E:of Morgul
 X:31:30
 W:0:30:0:10000
 C:0:0:10:3
-F:INT | WIS |
+F:INT | WIS | POWERFUL
 F:RES_COLD | RES_POIS | RES_NETHER | SH_COLD | ESP_UNDEAD
 F:IGNORE_COLD |  XTRA_H_RES 
 F:CURSED | RANDOM_CURSE2 | ADD_L_CURSE | DRAIN_EXP
@@ -136,7 +136,8 @@ X:31:10
 W:0:10:0:1500
 C:0:0:15:3
 F:CON |
-F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD | XTRA_E_RES
+F:LIGHT_WEIGHT | XTRA_AC | XTRA_E_RES
+F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD
 
 # OnePower
 
@@ -236,14 +237,15 @@ X:25:20
 W:0:18:0:600
 C:0:0:15:0
 F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD
+G:1/3:RES_CURSE
 
 N:239:ドワーフの
 E:of the Dwarves
 X:25:20
 W:0:15:0:2000
 C:0:0:8:2
-F:CON|
-F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD | XTRA_E_RES
+F:CON | LIGHT_WEIGHT | XTRA_AC | XTRA_E_RES
+F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD
 
 
 ### Crowns and Helms ###
@@ -269,6 +271,7 @@ X:33:20
 C:0:0:15:0
 W:0:20:0:2000
 F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD
+G:1/3:RES_CURSE
 
 N:26:悪魔の
 E:of Demon
@@ -342,7 +345,7 @@ N:33:テレパシーの
 E:of Telepathy
 X:33:20
 W:0:18:0:15000
-#F:TELEPATHY
+G:1/1:HIGH_TELEPATHY
 
 N:34:再生の
 E:of Regeneration
@@ -411,6 +414,7 @@ X:32:10
 W:0:5:0:500
 C:0:0:18:0
 F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD
+G:1/3:RES_CURSE
 
 #J0#
 #J0# 岸さんの訳です
@@ -635,6 +639,7 @@ F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | ONE_SUSTAIN | XTRA_H_RES |
 F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD
 G:1/3:RES_POIS
 G:1/3:WARNING
+G:1/7:RES_CURSE
 
 # OneAbility
 
@@ -645,6 +650,7 @@ W:0:36:0:7500
 C:10:0:5:3
 F:WIS | ESP_GOOD | SLAY_UNDEAD | SLAY_DEMON
 F:LITE_2 | BLESSED | XTRA_POWER | XTRA_H_RES
+G:1/4:RES_CURSE
 
 # 67 (unused)
 
@@ -740,7 +746,7 @@ E:of Earthquakes
 X:24:20
 W:0:18:0:4000
 C:0:0:0:3
-F:TUNNEL | IMPACT | ACTIVATE
+F:TUNNEL | IMPACT | EARTHQUAKE | ACTIVATE
 U:QUAKE
 
 # The "Slay" brands (8)
@@ -750,10 +756,62 @@ U:QUAKE
 # 80
 # 81
 # 82
-# 83
-# 84
-# 85
-# 86
+
+N:83:妖精の
+E:of Fairy
+X:24:16
+W:0:60:0:10000
+C:0:0:0:2
+F:DEX | CHR | STEALTH | MAGIC_MASTERY | XTRA_E_RES
+F:SLOW_DIGEST | LITE | LEVITATION | LIGHT_WEIGHT
+G:1/3:SPEED
+
+N:84:(貪食)
+E:(Omnivorous)
+X:24:30
+W:0:40:0:15000
+C:0:7:-20:3
+F:CON | POWERFUL
+F:BRAND_ACID | SLAY_ANIMAL | SLAY_DRAGON
+F:RES_ACID | XTRA_H_RES | HEAVY_WEIGHT
+F:REGEN | FAST_DIGEST | BERS_RAGE | HEAVY_CURSE | CURSED | XTRA_DICE
+F:RANDOM_CURSE2
+G:1/1:SLAY_HUMAN | SLAY_ORC | SLAY_GIANT | SLAY_TROLL
+G:1/1:DRAIN_EXP | DRAIN_MANA | DRAIN_HP
+G:1/5:IM_ACID
+G:1/3:RES_POIS
+G:1/4:BLOWS
+G:1/7:VAMPIRIC
+G:1/5:HARD_SPELL
+G:1/5:DOWN_SAVING
+G:1/3:ADD_L_CURSE | ADD_H_CURSE
+G:1/4:NO_MAGIC | NO_TELE
+G:1/10:PERMA_CURSE
+
+N:85:(復讐者)
+E:(Dark Revenger)
+X:24:30
+W:0:40:0:15000
+C:7:7:-20:3
+F:STR | POWERFUL
+F:BRAND_ELEC | SLAY_GOOD
+F:RES_ELEC | RES_FEAR | RES_DARK | XTRA_H_RES | AGGRAVATE
+F:LITE_M1 | SEE_INVIS | BERS_RAGE | CURSED | XTRA_DICE | ACTIVATE
+F:RANDOM_CURSE2
+U:BERSERK
+G:1/1:SLAY_HUMAN | SLAY_DRAGON | SLAY_DEMON
+G:1/1:DRAIN_EXP | DRAIN_MANA | DRAIN_HP
+G:1/1:ADD_L_CURSE | ADD_H_CURSE
+G:1/4:BLOWS
+G:1/5:DOWN_SAVING
+G:1/5:NO_MAGIC | NO_TELE
+
+N:86:滅善の
+E:of Slay Good
+X:24:15
+W:0:40:0:5000
+C:0:0:0:3
+F:STR | SLAY_GOOD | SEE_INVIS | RES_BLIND | ESP_GOOD
 
 N:87:(妖刀)
 E:(Weird Weapon)
@@ -762,9 +820,14 @@ W:0:40:0:0
 C:0:10:0:-3
 F:INT | WIS | POWERFUL
 F:VORPAL | VAMPIRIC | SLAY_DRAGON
-F:SLAY_ANIMAL | SLAY_ORC | SLAY_TROLL | SLAY_GIANT | SLAY_HUMAN
-F:DRAIN_EXP | AGGRAVATE
+F:SLAY_GOOD | SLAY_ANIMAL | SLAY_ORC | SLAY_TROLL | SLAY_GIANT | SLAY_HUMAN
+F:DRAIN_EXP | AGGRAVATE | BERS_RAGE
 F:HEAVY_CURSE | CURSED | XTRA_DICE
+G:1/1:KILL_DRAGON | KILL_ANIMAL | KILL_ORC | KILL_TROLL | KILL_GIANT | KILL_HUMAN | KILL_GOOD
+G:1/3:HARD_SPELL
+G:1/4:BRAND_POIS
+G:1/4:RES_NETHER
+G:1/6:ADD_L_CURSE | ADD_H_CURSE
 
 # The "Kill" brands (8)
 
@@ -888,7 +951,7 @@ G:1/1:DRAIN_EXP | DRAIN_MANA | DRAIN_HP
 G:1/3:HEAVY_CURSE
 G:1/3:CHAOTIC
 G:1/4:BLOWS
-G:1/5:ADD_H_CURSE
+G:1/5:ADD_L_CURSE | ADD_H_CURSE
 G:1/5:CALL_DEMON
 
 N:102:モルグルの
@@ -901,8 +964,12 @@ F:SLAY_UNDEAD | BRAND_COLD | BRAND_POIS
 F:RES_COLD | RES_NETHER | SH_COLD
 F:SEE_INVIS | ESP_UNDEAD | AGGRAVATE
 F:RANDOM_CURSE2 | XTRA_DICE | XTRA_POWER
+G:1/1:DRAIN_EXP | DRAIN_MANA | DRAIN_HP
 G:1/3:HEAVY_CURSE
 G:1/6:TY_CURSE
+G:1/4:BLOWS
+G:1/5:ADD_L_CURSE | ADD_H_CURSE
+G:1/5:CALL_UNDEAD
 
 N:103:人喰いの
 E:of Slay Human
@@ -919,12 +986,14 @@ E:of Accuracy
 X:26:10
 W:0:5:0:1000
 C:15:2:0:0
+G:1/1:MOD_ACCURACY
 
 N:105:高速度の
 E:of Velocity
 X:26:10
 W:0:5:0:1000
 C:2:12:0:0
+G:1/1:MOD_VELOCITY
 
 # 106 (unused)
 
@@ -1337,7 +1406,7 @@ E:of the Mightiest in the Galaxy
 X:27:30
 W:100:0:0:50000
 C:0:0:15:0
-F:ACTIVATE
+F:RES_CURSE | ACTIVATE
 U:ULTIMATE_RESIST
 
 N:181:経験値吸収の
@@ -1452,6 +1521,7 @@ E:and Protection
 X:29:5
 W:0:0:0:200
 C:0:0:8:0
+F:RES_CURSE
 
 N:219:知識の
 E:and Lore
@@ -1506,6 +1576,7 @@ X:29:25
 W:0:0:0:20000
 C:0:0:8:4
 F:STEALTH | LEVITATION | REGEN | FREE_ACT | SEE_INVIS
+G:1/4:RES_CURSE
 
 N:226:耐火の
 E:and Resist Fire
@@ -1580,6 +1651,7 @@ X:29:15
 W:0:0:0:10000
 C:0:0:5:5
 F:RES_BLIND | RES_CONF | WARNING | EASY_SPELL
+F:RES_CURSE
 
 N:236:感知の
 E:and Detection
@@ -1596,5 +1668,16 @@ W:0:0:0:0
 C:0:0:0:3
 F:WIS | CHR | CURSED | HEAVY_CURSE | DOWN_SAVING
 
-# MAX 240
+# Gloves
+N:241:強撃の
+E:of Impact
+X:34:30
+W:0:36:0:15000
+C:10:10:5:-1
+F:BLOWS | SHOW_MODS | HIDE_TYPE | MOD_VELOCITY
+F:IMPACT | MIGHTY_THROW
+G:1/3:FREE_ACT
+G:1/3:RES_SOUND | RES_SHARDS
+
+# MAX 241
 
index fd7b8cc..951969b 100644 (file)
@@ -6416,4 +6416,14 @@ I:19:51:0
 W:20:0:0:2000
 F:SHOW_MODS | INSTA_ART
 
+N:672:魔法を防ぐクローク
+E:& Cloak~ of Magic Resistance
+G:(:s
+I:35:1:0
+W:1:0:10:3
+A:20/4:50/4
+P:1:0d0:0:0:0
+F:RES_CURSE
+D:$A faded cloak carved with magical runes.
+D:魔術的なルーンの刻まれた陰気な外套だ。
 
index 23b2553..b60e03c 100644 (file)
@@ -16,7 +16,7 @@ M:WY:66
 M:R:1281
 
 # Maximum number of items in k_info.txt
-M:K:672
+M:K:673
 
 # Maximum number of vaults in v_info.txt
 M:V:173
@@ -25,7 +25,7 @@ M:V:173
 M:F:255
 
 # Maximum number of artifacts in a_info.txt
-M:A:264
+M:A:266
 
 # Maximum number of ego-items in e_info.txt
 M:E:255
index 2d94789..ed2f02b 100644 (file)
@@ -29,7 +29,7 @@ int activation_index(player_type *player_ptr, object_type *o_ptr)
             return ACT_RESIST_FIRE;
         case ESSENCE_TMP_RES_COLD:
             return ACT_RESIST_COLD;
-        case TR_IMPACT:
+        case TR_EARTHQUAKE:
             return ACT_QUAKE;
         }
     }
index 49c4d44..50a8469 100644 (file)
@@ -129,7 +129,8 @@ enum random_art_activation_type {
     ACT_PHASE_DOOR = 136,
     ACT_DETECT_ALL_MONS = 137,
     ACT_ULTIMATE_RESIST = 138,
-    /* 139 - 245 unused */
+    ACT_ELBERETH = 139,
+    /* 140 - 245 unused */
     ACT_FALLING_STAR = 246,
     ACT_STRAIN_HASTE = 247,
     ACT_TELEPORT_LEVEL = 248,
index 5339bed..e553d73 100644 (file)
@@ -77,6 +77,15 @@ static bool invest_misc_chaos(object_type *o_ptr)
     return one_in_(2);
 }
 
+static bool invest_misc_res_curse(object_type* o_ptr)
+{
+    if (has_flag(o_ptr->art_flags, TR_RES_CURSE))
+        return FALSE;
+
+    add_flag(o_ptr->art_flags, TR_RES_CURSE);
+    return one_in_(2);
+}
+
 /*!
  * @brief アーティファクトのバイアス値に基づいて特性を付与する
  * @param o_ptr 対象のオブジェクト構造体への参照ポインタ
@@ -237,7 +246,7 @@ void random_misc(player_type *player_ptr, object_type *o_ptr)
     if (switch_misc_bias(o_ptr))
         return;
 
-    switch (randint1(33)) {
+    switch (randint1(34)) {
     case 1:
         add_flag(o_ptr->art_flags, TR_SUST_STR);
         if (!o_ptr->artifact_bias)
@@ -340,5 +349,8 @@ void random_misc(player_type *player_ptr, object_type *o_ptr)
     case 33:
         invest_misc_weak_esps(o_ptr);
         break;
+    case 34:
+        invest_misc_res_curse(o_ptr);
+        break;
     }
 }
index eecf0c4..a6d8181 100644 (file)
@@ -43,6 +43,15 @@ static bool random_art_slay_chaos(object_type *o_ptr)
     return one_in_(2);
 }
 
+static bool random_art_brand_magical(object_type *o_ptr)
+{
+    if (has_flag(o_ptr->art_flags, TR_BRAND_MAGIC))
+        return FALSE;
+
+    add_flag(o_ptr->art_flags, TR_BRAND_MAGIC);
+    return one_in_(3);
+}
+
 static bool random_art_slay_vampiric(object_type *o_ptr)
 {
     if (has_flag(o_ptr->art_flags, TR_VAMPIRIC))
@@ -138,6 +147,9 @@ static bool switch_random_art_slay(object_type *o_ptr)
     switch (o_ptr->artifact_bias) {
     case BIAS_CHAOS:
         return random_art_slay_chaos(o_ptr);
+    case BIAS_MAGE:
+    case BIAS_INT:
+        return random_art_brand_magical(o_ptr);
     case BIAS_PRIESTLY:
         if (((o_ptr->tval == TV_SWORD) || (o_ptr->tval == TV_POLEARM)) && !has_flag(o_ptr->art_flags, TR_BLESSED))
             add_flag(o_ptr->art_flags, TR_BLESSED);
@@ -186,7 +198,7 @@ void random_slay(object_type *o_ptr)
     if (random_art_slay_bow(o_ptr) || switch_random_art_slay(o_ptr))
         return;
 
-    switch (randint1(36)) {
+    switch (randint1(39)) {
     case 1:
     case 2:
         if (one_in_(4))
@@ -277,7 +289,7 @@ void random_slay(object_type *o_ptr)
 
         break;
     case 20:
-        add_flag(o_ptr->art_flags, TR_IMPACT);
+        add_flag(o_ptr->art_flags, TR_EARTHQUAKE);
         break;
     case 21:
     case 22:
@@ -344,11 +356,32 @@ void random_slay(object_type *o_ptr)
             add_flag(o_ptr->art_flags, TR_SLAY_HUMAN);
         
         break;
-    default:
+    case 35:
+        add_flag(o_ptr->art_flags, TR_BRAND_MAGIC);
+        if (o_ptr->artifact_bias == BIAS_NONE)
+            o_ptr->artifact_bias = BIAS_MAGE;
+        break;
+    case 36:
+    case 37:
         add_flag(o_ptr->art_flags, TR_CHAOTIC);
         if (o_ptr->artifact_bias == BIAS_NONE)
             o_ptr->artifact_bias = BIAS_CHAOS;
 
         break;
+    default:
+        if (one_in_(8))
+            add_flag(o_ptr->art_flags, TR_KILL_GOOD);
+        else
+            add_flag(o_ptr->art_flags, TR_SLAY_GOOD);
+
+        if ((o_ptr->artifact_bias == BIAS_NONE) && one_in_(2)) {
+            o_ptr->artifact_bias = BIAS_POIS;
+            break;
+        }
+
+        if ((o_ptr->artifact_bias == BIAS_NONE) && one_in_(9))
+            o_ptr->artifact_bias = BIAS_ROGUE;
+
+        break;
     }
 }
index 3087639..55a23e4 100644 (file)
@@ -59,7 +59,7 @@ static essence_type essence_info[] = { { TR_STR, "腕力", 4, TR_STR, 20 }, { TR
     { TR_MAGIC_MASTERY, "魔力支配", 4, TR_MAGIC_MASTERY, 20 }, { TR_STEALTH, "隠密", 4, TR_STEALTH, 40 }, { TR_SEARCH, "探索", 4, TR_SEARCH, 15 },
     { TR_INFRA, "赤外線視力", 4, TR_INFRA, 15 }, { TR_TUNNEL, "採掘", 4, TR_TUNNEL, 15 }, { TR_SPEED, "スピード", 4, TR_SPEED, 12 },
     { TR_BLOWS, "追加攻撃", 1, TR_BLOWS, 20 }, { TR_CHAOTIC, "カオス攻撃", 1, TR_CHAOTIC, 15 }, { TR_VAMPIRIC, "吸血攻撃", 1, TR_VAMPIRIC, 60 },
-    { TR_IMPACT, "地震発動", 7, TR_IMPACT, 15 }, { TR_BRAND_POIS, "毒殺", 1, TR_BRAND_POIS, 20 }, { TR_BRAND_ACID, "溶解", 1, TR_BRAND_ACID, 20 },
+    { TR_EARTHQUAKE, "地震発動", 7, TR_EARTHQUAKE, 15 }, { TR_BRAND_POIS, "毒殺", 1, TR_BRAND_POIS, 20 }, { TR_BRAND_ACID, "溶解", 1, TR_BRAND_ACID, 20 },
     { TR_BRAND_ELEC, "電撃", 1, TR_BRAND_ELEC, 20 }, { TR_BRAND_FIRE, "焼棄", 1, TR_BRAND_FIRE, 20 }, { TR_BRAND_COLD, "凍結", 1, TR_BRAND_COLD, 20 },
     { TR_SUST_STR, "腕力維持", 3, TR_SUST_STR, 15 }, { TR_SUST_INT, "知能維持", 3, TR_SUST_STR, 15 }, { TR_SUST_WIS, "賢さ維持", 3, TR_SUST_STR, 15 },
     { TR_SUST_DEX, "器用さ維持", 3, TR_SUST_STR, 15 }, { TR_SUST_CON, "耐久力維持", 3, TR_SUST_STR, 15 }, { TR_SUST_CHR, "魅力維持", 3, TR_SUST_STR, 15 },
index 0f17b0f..f6de5af 100644 (file)
  * @param mode オプションフラグ
  * @return クリティカル修正が入ったダメージ値
  */
-HIT_POINT critical_norm(player_type *attacker_ptr, WEIGHT weight, int plus, HIT_POINT dam, s16b meichuu, combat_options mode)
+HIT_POINT critical_norm(player_type *attacker_ptr, WEIGHT weight, int plus, HIT_POINT dam, s16b meichuu, combat_options mode, bool impact)
 {
     /* Extract "blow" power */
     int i = (weight + (meichuu * 3 + plus * 5) + attacker_ptr->skill_thn);
 
     /* Chance */
-    bool is_special_option = randint1((attacker_ptr->pclass == CLASS_NINJA) ? 4444 : 5000) <= i;
+    auto pow = (attacker_ptr->pclass == CLASS_NINJA) ? 4444 : 5000;
+    if (impact)
+        pow /= 2;
+
+    bool is_special_option = randint1(pow) <= i;
     is_special_option |= mode == HISSATSU_MAJIN;
     is_special_option |= mode == HISSATSU_3DAN;
     if (!is_special_option)
         return dam;
 
     int k = weight + randint1(650);
-    if ((mode == HISSATSU_MAJIN) || (mode == HISSATSU_3DAN))
+    if (impact || (mode == HISSATSU_MAJIN) || (mode == HISSATSU_3DAN))
         k += randint1(650);
 
     if (k < 400) {
index 04558dd..47cdc03 100644 (file)
@@ -3,6 +3,6 @@
 #include "system/angband.h"
 #include "player-attack/player-attack-util.h"
 
-HIT_POINT critical_norm(player_type *attacker_ptr, WEIGHT weight, int plus, HIT_POINT dam, s16b meichuu, combat_options mode);
+HIT_POINT critical_norm(player_type *attacker_ptr, WEIGHT weight, int plus, HIT_POINT dam, s16b meichuu, combat_options mode, bool impact = false);
 int calc_monster_critical(DICE_NUMBER dice, DICE_SID sides, HIT_POINT dam);
 void critical_attack(player_type *attacker_ptr, player_attack_type *pa_ptr);
index 6217153..3c01cd8 100644 (file)
@@ -122,6 +122,22 @@ static MULTIPLY calc_shot_damage_with_slay(player_type *sniper_ptr, object_type
                 mult = 25;
         }
 
+        if ((has_flag(flags, TR_SLAY_GOOD)) && any_bits(race_ptr->flags3, RF3_GOOD)) {
+            if (is_original_ap_and_seen(sniper_ptr, monster_ptr)) {
+                set_bits(race_ptr->r_flags3, RF3_GOOD);
+            }
+            if (mult < 15)
+                mult = 15;
+        }
+
+        if ((has_flag(flags, TR_KILL_GOOD)) && any_bits(race_ptr->flags3, RF3_GOOD)) {
+            if (is_original_ap_and_seen(sniper_ptr, monster_ptr)) {
+                set_bits(race_ptr->r_flags3, RF3_GOOD);
+            }
+            if (mult < 25)
+                mult = 25;
+        }
+
         if ((has_flag(flags, TR_SLAY_HUMAN)) && any_bits(race_ptr->flags2, RF2_HUMAN)) {
             if (is_original_ap_and_seen(sniper_ptr, monster_ptr)) {
                 set_bits(race_ptr->r_flags2, RF2_HUMAN);
index 9d418cb..4b43124 100644 (file)
@@ -36,7 +36,7 @@ std::vector<flag_insc_table> flag_insc_resistance = {
     { "毒", "Po", TR_RES_POIS, -1 }, { "閃", "Li", TR_RES_LITE, -1 }, { "暗", "Dk", TR_RES_DARK, -1 }, { "破", "Sh", TR_RES_SHARDS, -1 },
     { "盲", "Bl", TR_RES_BLIND, -1 }, { "乱", "Cf", TR_RES_CONF, -1 }, { "轟", "So", TR_RES_SOUND, -1 }, { "獄", "Nt", TR_RES_NETHER, -1 },
     { "因", "Nx", TR_RES_NEXUS, -1 }, { "沌", "Ca", TR_RES_CHAOS, -1 }, { "劣", "Di", TR_RES_DISEN, -1 }, { "時", "Tm", TR_RES_TIME, -1 },
-    { "水", "Wt", TR_RES_WATER, -1 }, { "恐", "Fe", TR_RES_FEAR, -1 },
+    { "水", "Wt", TR_RES_WATER, -1 }, { "恐", "Fe", TR_RES_FEAR, -1 }, { "呪", "Cu", TR_RES_CURSE, -1 },
 };
 
 /*! オブジェクトの特性表示記号テーブルの定義(その他特性) */
@@ -59,20 +59,21 @@ std::vector<flag_insc_table> flag_insc_aura = {
 /*! オブジェクトの特性表示記号テーブルの定義(属性スレイ) */
 std::vector<flag_insc_table> flag_insc_brand = {
     { "酸", "A", TR_BRAND_ACID, -1 }, { "電", "E", TR_BRAND_ELEC, -1 }, { "焼", "F", TR_BRAND_FIRE, -1 }, { "凍", "Co", TR_BRAND_COLD, -1 },
-    { "毒", "P", TR_BRAND_POIS, -1 }, { "沌", "Ca", TR_CHAOTIC, -1 },
-    { "吸", "V", TR_VAMPIRIC, -1 }, { "震", "Q", TR_IMPACT, -1 }, { "切", "S", TR_VORPAL, -1 }, { "理", "M", TR_FORCE_WEAPON, -1 }
+    { "毒", "P", TR_BRAND_POIS, -1 }, { "沌", "Ca", TR_CHAOTIC, -1 }, { "魔", "Ma", TR_BRAND_MAGIC, -1 },
+    { "吸", "V", TR_VAMPIRIC, -1 }, { "震", "Q", TR_EARTHQUAKE, -1 }, { "切", "Sl", TR_VORPAL, -1 }, { "強", "Sm", TR_IMPACT, -1 },
+    { "理", "Mf", TR_FORCE_WEAPON, -1 }
 };
 
 /*! オブジェクトの特性表示記号テーブルの定義(種族スレイ) */
 std::vector<flag_insc_table> flag_insc_kill = {
-    { "邪", "*", TR_KILL_EVIL, -1 }, { "人", "p", TR_KILL_HUMAN, -1 }, { "龍", "D", TR_KILL_DRAGON, -1 }, { "オ", "o", TR_KILL_ORC, -1 },
+    { "邪", "*", TR_KILL_EVIL, -1 }, { "善", "A", TR_KILL_GOOD, -1 }, { "人", "p", TR_KILL_HUMAN, -1 }, { "龍", "D", TR_KILL_DRAGON, -1 }, { "オ", "o", TR_KILL_ORC, -1 },
     { "ト", "T", TR_KILL_TROLL, -1 }, { "巨", "P", TR_KILL_GIANT, -1 }, { "デ", "U", TR_KILL_DEMON, -1 }, { "死", "L", TR_KILL_UNDEAD, -1 },
     { "動", "Z", TR_KILL_ANIMAL, -1 },
 };
 
 /*! オブジェクトの特性表示記号テーブルの定義(種族*スレイ*) */
 std::vector<flag_insc_table> flag_insc_slay = {
-    { "邪", "*", TR_SLAY_EVIL, TR_KILL_EVIL }, { "人", "p", TR_SLAY_HUMAN, TR_KILL_HUMAN }, { "竜", "D", TR_SLAY_DRAGON, TR_KILL_DRAGON },
+    { "邪", "*", TR_SLAY_EVIL, TR_KILL_EVIL }, { "善", "A", TR_SLAY_GOOD, TR_KILL_GOOD }, { "人", "p", TR_SLAY_HUMAN, TR_KILL_HUMAN }, { "竜", "D", TR_SLAY_DRAGON, TR_KILL_DRAGON },
     { "オ", "o", TR_SLAY_ORC, TR_KILL_ORC }, { "ト", "T", TR_SLAY_TROLL, TR_KILL_TROLL }, { "巨", "P", TR_SLAY_GIANT, TR_KILL_GIANT },
     { "デ", "U", TR_SLAY_DEMON, TR_KILL_DEMON }, { "死", "L", TR_SLAY_UNDEAD, TR_KILL_UNDEAD }, { "動", "Z", TR_SLAY_ANIMAL, TR_KILL_ANIMAL },
 };
@@ -132,18 +133,19 @@ std::vector<flag_insc_table> flag_insc_aura = {
 
 std::vector<flag_insc_table> flag_insc_brand = {
     { "A", TR_BRAND_ACID, -1 }, { "E", TR_BRAND_ELEC, -1 }, { "F", TR_BRAND_FIRE, -1 }, { "Co", TR_BRAND_COLD, -1 },
-    { "P", TR_BRAND_POIS, -1 }, { "Ca", TR_CHAOTIC, -1 },
-    { "V", TR_VAMPIRIC, -1 }, { "Q", TR_IMPACT, -1 }, { "S", TR_VORPAL, -1 }, { "M", TR_FORCE_WEAPON, -1 },
+    { "P", TR_BRAND_POIS, -1 }, { "Ca", TR_CHAOTIC, -1 }, { "Ma", TR_BRAND_MAGIC, -1 },
+    { "V", TR_VAMPIRIC, -1 }, { "Q", TR_EARTHQUAKE, -1 }, { "Sl", TR_VORPAL, -1 }, { "Sm", TR_IMPACT, -1 },
+    { "Mf", TR_FORCE_WEAPON, -1 },
 };
 
 std::vector<flag_insc_table> flag_insc_kill = {
-    { "*", TR_KILL_EVIL, -1 }, { "p", TR_KILL_HUMAN, -1 }, { "D", TR_KILL_DRAGON, -1 }, { "o", TR_KILL_ORC, -1 },
+    { "*", TR_KILL_EVIL, -1 }, { "A", TR_KILL_GOOD, -1 }, { "p", TR_KILL_HUMAN, -1 }, { "D", TR_KILL_DRAGON, -1 }, { "o", TR_KILL_ORC, -1 },
     { "T", TR_KILL_TROLL, -1 }, { "P", TR_KILL_GIANT, -1 }, { "U", TR_KILL_DEMON, -1 }, { "L", TR_KILL_UNDEAD, -1 },
     { "Z", TR_KILL_ANIMAL, -1 },
 };
 
 std::vector<flag_insc_table> flag_insc_slay = {
-    { "*", TR_SLAY_EVIL, TR_KILL_EVIL }, { "p", TR_SLAY_HUMAN, TR_KILL_HUMAN }, { "D", TR_SLAY_DRAGON, TR_KILL_DRAGON }, { "o", TR_SLAY_ORC, TR_KILL_ORC },
+    { "*", TR_SLAY_EVIL, TR_KILL_EVIL }, { "A", TR_SLAY_GOOD, TR_KILL_GOOD }, { "p", TR_SLAY_HUMAN, TR_KILL_HUMAN }, { "D", TR_SLAY_DRAGON, TR_KILL_DRAGON }, { "o", TR_SLAY_ORC, TR_KILL_ORC },
     { "T", TR_SLAY_TROLL, TR_KILL_TROLL }, { "P", TR_SLAY_GIANT, TR_KILL_GIANT }, { "U", TR_SLAY_DEMON, TR_KILL_DEMON }, { "L", TR_SLAY_UNDEAD, TR_KILL_UNDEAD },
     { "Z", TR_SLAY_ANIMAL, TR_KILL_ANIMAL },
 };
index 76112f4..dcd9eaf 100644 (file)
  */
 static errr grab_one_artifact_flag(artifact_type *a_ptr, concptr what)
 {
-    for (int i = 0; i < TR_FLAG_MAX; i++) {
-        if (streq(what, k_info_flags[i])) {
-            add_flag(a_ptr->flags, i);
-            return 0;
-        }
+    if (k_info_flags.find(what) != k_info_flags.end()) {
+        add_flag(a_ptr->flags, k_info_flags[what]);
+        return 0;
     }
 
     if (FlagGroup<TRG>::grab_one_flag(a_ptr->gen_flags, k_info_gen_flags, what))
index df694b1..5056b13 100644 (file)
  */
 static bool grab_one_ego_item_flag(ego_item_type *e_ptr, concptr what)
 {
-    for (int i = 0; i < TR_FLAG_MAX; i++) {
-        if (streq(what, k_info_flags[i])) {
-            add_flag(e_ptr->flags, i);
-            return 0;
-        }
+    if (k_info_flags.find(what) != k_info_flags.end()) {
+        add_flag(e_ptr->flags, k_info_flags[what]);
+        return 0;
     }
 
     if (FlagGroup<TRG>::grab_one_flag(e_ptr->gen_flags, k_info_gen_flags, what))
@@ -34,11 +32,9 @@ static bool grab_one_ego_item_flag(ego_item_type *e_ptr, concptr what)
 
 static bool grab_ego_generate_flags(ego_generate_type &xtra, concptr what)
 {
-    for (int i = 0; i < TR_FLAG_MAX; i++) {
-        if (streq(what, k_info_flags[i])) {
-            xtra.tr_flags.push_back(static_cast<tr_type>(i));
-            return false;
-        }
+    if (k_info_flags.find(what) != k_info_flags.end()) {
+        xtra.tr_flags.push_back(k_info_flags[what]);
+        return 0;
     }
 
     auto it = k_info_gen_flags.find(what);
@@ -61,8 +57,7 @@ static bool grab_ego_generate_flags(ego_generate_type &xtra, concptr what)
 errr parse_e_info(char *buf, angband_header *head)
 {
     static ego_item_type *e_ptr = NULL;
-    error_idx = -1;
-    error_line = -1;
+    error_idx = 0;
     char *s, *t;
     if (buf[0] == 'N') {
         s = angband_strchr(buf + 2, ':');
index 0ec6c82..481ed4a 100644 (file)
 #include "info-reader/kind-info-tokens-table.h"
 
+// clang-format off
 /*!
  * オブジェクト基本特性トークンの定義 /
  * Object flags
  */
-concptr k_info_flags[NUM_K_FLAGS] = {
-    "STR",
-    "INT",
-    "WIS",
-    "DEX",
-    "CON",
-    "CHR",
-    "MAGIC_MASTERY",
-    "FORCE_WEAPON",
-    "STEALTH",
-    "SEARCH",
-    "INFRA",
-    "TUNNEL",
-    "SPEED",
-    "BLOWS",
-    "CHAOTIC",
-    "VAMPIRIC",
-    "SLAY_ANIMAL",
-    "SLAY_EVIL",
-    "SLAY_UNDEAD",
-    "SLAY_DEMON",
-    "SLAY_ORC",
-    "SLAY_TROLL",
-    "SLAY_GIANT",
-    "SLAY_DRAGON",
-    "KILL_DRAGON",
-    "VORPAL",
-    "IMPACT",
-    "BRAND_POIS",
-    "BRAND_ACID",
-    "BRAND_ELEC",
-    "BRAND_FIRE",
-    "BRAND_COLD",
+std::unordered_map<std::string_view, tr_type> k_info_flags = {
+    { "STR", TR_STR },
+    { "INT", TR_INT },
+    { "WIS", TR_WIS },
+    { "DEX", TR_DEX },
+    { "CON", TR_CON },
+    { "CHR", TR_CHR },
+    { "MAGIC_MASTERY", TR_MAGIC_MASTERY },
+    { "FORCE_WEAPON", TR_FORCE_WEAPON },
+    { "STEALTH", TR_STEALTH },
+    { "SEARCH", TR_SEARCH },
+    { "INFRA", TR_INFRA },
+    { "TUNNEL", TR_TUNNEL },
+    { "SPEED", TR_SPEED },
+    { "BLOWS", TR_BLOWS },
+    { "CHAOTIC", TR_CHAOTIC },
+    { "VAMPIRIC", TR_VAMPIRIC },
+    { "SLAY_ANIMAL", TR_SLAY_ANIMAL },
+    { "SLAY_EVIL", TR_SLAY_EVIL },
+    { "SLAY_UNDEAD", TR_SLAY_UNDEAD },
+    { "SLAY_DEMON", TR_SLAY_DEMON },
+    { "SLAY_ORC", TR_SLAY_ORC },
+    { "SLAY_TROLL", TR_SLAY_TROLL },
+    { "SLAY_GIANT", TR_SLAY_GIANT },
+    { "SLAY_DRAGON", TR_SLAY_DRAGON },
+    { "KILL_DRAGON", TR_KILL_DRAGON },
+    { "VORPAL", TR_VORPAL },
+    { "EARTHQUAKE", TR_EARTHQUAKE },
+    { "BRAND_POIS", TR_BRAND_POIS },
+    { "BRAND_ACID", TR_BRAND_ACID },
+    { "BRAND_ELEC", TR_BRAND_ELEC },
+    { "BRAND_FIRE", TR_BRAND_FIRE },
+    { "BRAND_COLD", TR_BRAND_COLD },
 
-    "SUST_STR",
-    "SUST_INT",
-    "SUST_WIS",
-    "SUST_DEX",
-    "SUST_CON",
-    "SUST_CHR",
-    "RIDING",
-    "EASY_SPELL",
-    "IM_ACID",
-    "IM_ELEC",
-    "IM_FIRE",
-    "IM_COLD",
-    "THROW",
-    "REFLECT",
-    "FREE_ACT",
-    "HOLD_EXP",
-    "RES_ACID",
-    "RES_ELEC",
-    "RES_FIRE",
-    "RES_COLD",
-    "RES_POIS",
-    "RES_FEAR",
-    "RES_LITE",
-    "RES_DARK",
-    "RES_BLIND",
-    "RES_CONF",
-    "RES_SOUND",
-    "RES_SHARDS",
-    "RES_NETHER",
-    "RES_NEXUS",
-    "RES_CHAOS",
-    "RES_DISEN",
+    { "SUST_STR", TR_SUST_STR },
+    { "SUST_INT", TR_SUST_INT },
+    { "SUST_WIS", TR_SUST_WIS },
+    { "SUST_DEX", TR_SUST_DEX },
+    { "SUST_CON", TR_SUST_CON },
+    { "SUST_CHR", TR_SUST_CHR },
+    { "RIDING", TR_RIDING },
+    { "EASY_SPELL", TR_EASY_SPELL },
+    { "IM_ACID", TR_IM_ACID },
+    { "IM_ELEC", TR_IM_ELEC },
+    { "IM_FIRE", TR_IM_FIRE },
+    { "IM_COLD", TR_IM_COLD },
+    { "THROW", TR_THROW },
+    { "REFLECT", TR_REFLECT },
+    { "FREE_ACT", TR_FREE_ACT },
+    { "HOLD_EXP", TR_HOLD_EXP },
+    { "RES_ACID", TR_RES_ACID },
+    { "RES_ELEC", TR_RES_ELEC },
+    { "RES_FIRE", TR_RES_FIRE },
+    { "RES_COLD", TR_RES_COLD },
+    { "RES_POIS", TR_RES_POIS },
+    { "RES_FEAR", TR_RES_FEAR },
+    { "RES_LITE", TR_RES_LITE },
+    { "RES_DARK", TR_RES_DARK },
+    { "RES_BLIND", TR_RES_BLIND },
+    { "RES_CONF", TR_RES_CONF },
+    { "RES_SOUND", TR_RES_SOUND },
+    { "RES_SHARDS", TR_RES_SHARDS },
+    { "RES_NETHER", TR_RES_NETHER },
+    { "RES_NEXUS", TR_RES_NEXUS },
+    { "RES_CHAOS", TR_RES_CHAOS },
+    { "RES_DISEN", TR_RES_DISEN },
 
-    "SH_FIRE",
-    "SH_ELEC",
-    "SLAY_HUMAN",
-    "SH_COLD",
-    "NO_TELE",
-    "NO_MAGIC",
-    "DEC_MANA",
-    "TY_CURSE",
-    "WARNING",
-    "HIDE_TYPE",
-    "SHOW_MODS",
-    "SLAY_GOOD",
-    "LEVITATION",
-    "LITE",
-    "SEE_INVIS",
-    "TELEPATHY",
-    "SLOW_DIGEST",
-    "REGEN",
-    "XTRA_MIGHT",
-    "XTRA_SHOTS",
-    "IGNORE_ACID",
-    "IGNORE_ELEC",
-    "IGNORE_FIRE",
-    "IGNORE_COLD",
-    "ACTIVATE",
-    "DRAIN_EXP",
-    "TELEPORT",
-    "AGGRAVATE",
-    "BLESSED",
-    "XXX3", /* Fake flag for Smith */
-    "XXX4", /* Fake flag for Smith */
-    "KILL_GOOD",
+    { "SH_FIRE", TR_SH_FIRE },
+    { "SH_ELEC", TR_SH_ELEC },
+    { "SLAY_HUMAN", TR_SLAY_HUMAN },
+    { "SH_COLD", TR_SH_COLD },
+    { "NO_TELE", TR_NO_TELE },
+    { "NO_MAGIC", TR_NO_MAGIC },
+    { "DEC_MANA", TR_DEC_MANA },
+    { "TY_CURSE", TR_TY_CURSE },
+    { "WARNING", TR_WARNING },
+    { "HIDE_TYPE", TR_HIDE_TYPE },
+    { "SHOW_MODS", TR_SHOW_MODS },
+    { "SLAY_GOOD", TR_SLAY_GOOD },
+    { "LEVITATION", TR_LEVITATION },
+    { "LITE", TR_LITE_1 }, //<! @note 古い書式
+    { "SEE_INVIS", TR_SEE_INVIS },
+    { "TELEPATHY", TR_TELEPATHY },
+    { "SLOW_DIGEST", TR_SLOW_DIGEST },
+    { "REGEN", TR_REGEN },
+    { "XTRA_MIGHT", TR_XTRA_MIGHT },
+    { "XTRA_SHOTS", TR_XTRA_SHOTS },
+    { "IGNORE_ACID", TR_IGNORE_ACID },
+    { "IGNORE_ELEC", TR_IGNORE_ELEC },
+    { "IGNORE_FIRE", TR_IGNORE_FIRE },
+    { "IGNORE_COLD", TR_IGNORE_COLD },
+    { "ACTIVATE", TR_ACTIVATE },
+    { "DRAIN_EXP", TR_DRAIN_EXP },
+    { "TELEPORT", TR_TELEPORT },
+    { "AGGRAVATE", TR_AGGRAVATE },
+    { "BLESSED", TR_BLESSED },
+    /* { "XXX3", TR_XXX3 }, Fake flag for Smith */
+    /* { "XXX4", TR_XXX4 }, Fake flag for Smith */
+    { "KILL_GOOD", TR_KILL_GOOD },
 
-    "KILL_ANIMAL",
-    "KILL_EVIL",
-    "KILL_UNDEAD",
-    "KILL_DEMON",
-    "KILL_ORC",
-    "KILL_TROLL",
-    "KILL_GIANT",
-    "KILL_HUMAN",
-    "ESP_ANIMAL",
-    "ESP_UNDEAD",
-    "ESP_DEMON",
-    "ESP_ORC",
-    "ESP_TROLL",
-    "ESP_GIANT",
-    "ESP_DRAGON",
-    "ESP_HUMAN",
-    "ESP_EVIL",
-    "ESP_GOOD",
-    "ESP_NONLIVING",
-    "ESP_UNIQUE",
-    "FULL_NAME",
-    "FIXED_FLAVOR",
-    "ADD_L_CURSE",
-    "ADD_H_CURSE",
-    "DRAIN_HP",
-    "DRAIN_MANA",
+    { "KILL_ANIMAL", TR_KILL_ANIMAL },
+    { "KILL_EVIL", TR_KILL_EVIL },
+    { "KILL_UNDEAD", TR_KILL_UNDEAD },
+    { "KILL_DEMON", TR_KILL_DEMON },
+    { "KILL_ORC", TR_KILL_ORC },
+    { "KILL_TROLL", TR_KILL_TROLL },
+    { "KILL_GIANT", TR_KILL_GIANT },
+    { "KILL_HUMAN", TR_KILL_HUMAN },
+    { "ESP_ANIMAL", TR_ESP_ANIMAL },
+    { "ESP_UNDEAD", TR_ESP_UNDEAD },
+    { "ESP_DEMON", TR_ESP_DEMON },
+    { "ESP_ORC", TR_ESP_ORC },
+    { "ESP_TROLL", TR_ESP_TROLL },
+    { "ESP_GIANT", TR_ESP_GIANT },
+    { "ESP_DRAGON", TR_ESP_DRAGON },
+    { "ESP_HUMAN", TR_ESP_HUMAN },
+    { "ESP_EVIL", TR_ESP_EVIL },
+    { "ESP_GOOD", TR_ESP_GOOD },
+    { "ESP_NONLIVING", TR_ESP_NONLIVING },
+    { "ESP_UNIQUE", TR_ESP_UNIQUE },
+    { "FULL_NAME", TR_FULL_NAME },
+    { "FIXED_FLAVOR", TR_FIXED_FLAVOR },
+    { "ADD_L_CURSE", TR_ADD_L_CURSE },
+    { "ADD_H_CURSE", TR_ADD_H_CURSE },
+    { "DRAIN_HP", TR_DRAIN_HP },
+    { "DRAIN_MANA", TR_DRAIN_MANA },
 
-    "LITE_2",
-    "LITE_3",
-    "LITE_M1",
-    "LITE_M2",
-    "LITE_M3",
-    "LITE_FUEL",
+    { "LITE_1", TR_LITE_1 },
+    { "LITE_2", TR_LITE_2 },
+    { "LITE_3", TR_LITE_3 },
+    { "LITE_M1", TR_LITE_M1 },
+    { "LITE_M2", TR_LITE_M2 },
+    { "LITE_M3", TR_LITE_M3 },
+    { "LITE_FUEL", TR_LITE_FUEL },
 
-    "CALL_ANIMAL",
-    "CALL_DEMON",
-    "CALL_DRAGON",
-    "CALL_UNDEAD",
-    "COWARDICE",
-    "LOW_MELEE",
-    "LOW_AC",
-    "HARD_SPELL",
-    "FAST_DIGEST",
-    "SLOW_REGEN",
-    "MIGHTY_THROW",
-    "EASY2_WEAPON",
-    "DOWN_SAVING",
-    "NO_AC",
-    "HEAVY_SPELL",
-    "RES_TIME",
-    "RES_WATER",
-    "INVULN_ARROW",
-    "DARK_SOURCE",
-    "SUPPORTIVE",
+    { "CALL_ANIMAL", TR_CALL_ANIMAL },
+    { "CALL_DEMON", TR_CALL_DEMON },
+    { "CALL_DRAGON", TR_CALL_DRAGON },
+    { "CALL_UNDEAD", TR_CALL_UNDEAD },
+    { "COWARDICE", TR_COWARDICE },
+    { "LOW_MELEE", TR_LOW_MELEE },
+    { "LOW_AC", TR_LOW_AC },
+    { "HARD_SPELL", TR_HARD_SPELL },
+    { "FAST_DIGEST", TR_FAST_DIGEST },
+    { "SLOW_REGEN", TR_SLOW_REGEN },
+    { "MIGHTY_THROW", TR_MIGHTY_THROW },
+    { "EASY2_WEAPON", TR_EASY2_WEAPON },
+    { "DOWN_SAVING", TR_DOWN_SAVING },
+    { "NO_AC", TR_NO_AC },
+    { "HEAVY_SPELL", TR_HEAVY_SPELL },
+    { "RES_TIME", TR_RES_TIME },
+    { "RES_WATER", TR_RES_WATER },
+    { "INVULN_ARROW", TR_INVULN_ARROW },
+    { "DARK_SOURCE", TR_DARK_SOURCE },
+    { "SUPPORTIVE", TR_SUPPORTIVE },
+    { "RES_CURSE", TR_RES_CURSE },
+    { "BERS_RAGE", TR_BERS_RAGE },
+    { "BRAND_MAGIC", TR_BRAND_MAGIC },
+    { "IMPACT", TR_IMPACT },
 };
 
 /*!
@@ -183,4 +189,13 @@ std::unordered_map<std::string_view, TRG> k_info_gen_flags = {
     { "RANDOM_CURSE2", TRG::RANDOM_CURSE2 },
     { "XTRA_DICE", TRG::XTRA_DICE },
     { "POWERFUL", TRG::POWERFUL },
+    { "LIGHT_WEIGHT", TRG::LIGHT_WEIGHT },
+    { "HEAVY_WEIGHT", TRG::HEAVY_WEIGHT },
+    { "XTRA_AC", TRG::XTRA_AC },
+    { "HIGH_TELEPATHY", TRG::HIGH_TELEPATHY },
+    { "LOW_TELEPATHY", TRG::LOW_TELEPATHY },
+    { "XTRA_L_ESP", TRG::XTRA_L_ESP },
+    { "MOD_ACCURACY", TRG::MOD_ACCURACY },
+    { "MOD_VELOCITY", TRG::MOD_VELOCITY },
 };
+// clang-format on
index 5d4d2d9..aa79c3a 100644 (file)
@@ -1,11 +1,10 @@
 #pragma once
 
 #include "system/angband.h"
+#include "object-enchant/tr-types.h"
 #include "object-enchant/trg-types.h"
 #include <string>
 #include <unordered_map>
 
-#define NUM_K_FLAGS 148
-
-extern concptr k_info_flags[NUM_K_FLAGS];
+extern std::unordered_map<std::string_view, tr_type> k_info_flags;
 extern std::unordered_map<std::string_view, TRG> k_info_gen_flags;
index 5b97841..4454990 100644 (file)
  */
 static errr grab_one_kind_flag(object_kind *k_ptr, concptr what)
 {
-    for (int i = 0; i < TR_FLAG_MAX; i++) {
-        if (streq(what, k_info_flags[i])) {
-            add_flag(k_ptr->flags, i);
-            return 0;
-        }
+    if (k_info_flags.find(what) != k_info_flags.end()) {
+        add_flag(k_ptr->flags, k_info_flags[what]);
+        return 0;
     }
 
     if (FlagGroup<TRG>::grab_one_flag(k_ptr->gen_flags, k_info_gen_flags, what))
index 8e42acb..43e9b19 100644 (file)
@@ -24,6 +24,7 @@
 #include "spell-kind/spells-teleport.h"
 #include "spell/summon-types.h"
 #include "status/bad-status-setter.h"
+#include "status/buff-setter.h"
 #include "system/floor-type-definition.h"
 #include "util/bit-flags-calculator.h"
 #include "util/quarks.h"
 
 #define TRC_P_FLAG_MASK                                                                                                                                        \
     (TRC_TELEPORT_SELF | TRC_CHAINSWORD | TRC_TY_CURSE | TRC_DRAIN_EXP | TRC_ADD_L_CURSE | TRC_ADD_H_CURSE | TRC_CALL_ANIMAL | TRC_CALL_DEMON                  \
-        | TRC_CALL_DRAGON | TRC_COWARDICE | TRC_TELEPORT | TRC_DRAIN_HP | TRC_DRAIN_MANA | TRC_CALL_UNDEAD)
+        | TRC_CALL_DRAGON | TRC_COWARDICE | TRC_TELEPORT | TRC_DRAIN_HP | TRC_DRAIN_MANA | TRC_CALL_UNDEAD | TRC_BERS_RAGE)
 
 static bool is_specific_curse(BIT_FLAGS flag)
 {
     return (flag == TRC_ADD_L_CURSE) || (flag == TRC_ADD_H_CURSE) || (flag == TRC_DRAIN_HP) || (flag == TRC_DRAIN_MANA) || (flag == TRC_CALL_ANIMAL)
         || (flag == TRC_CALL_DEMON) || (flag == TRC_CALL_DRAGON) || (flag == TRC_CALL_UNDEAD) || (flag == TRC_COWARDICE) || (flag == TRC_LOW_MELEE)
-        || (flag == TRC_LOW_AC) || (flag == TRC_HARD_SPELL) || (flag == TRC_FAST_DIGEST) || (flag == TRC_SLOW_REGEN);
+        || (flag == TRC_LOW_AC) || (flag == TRC_HARD_SPELL) || (flag == TRC_FAST_DIGEST) || (flag == TRC_SLOW_REGEN || flag == TRC_BERS_RAGE);
 }
 
 static void choise_cursed_item(player_type *creature_ptr, BIT_FLAGS flag, object_type *o_ptr, int *choices, int *number, int item_num)
@@ -92,6 +93,9 @@ static void choise_cursed_item(player_type *creature_ptr, BIT_FLAGS flag, object
     case TRC_SLOW_REGEN:
         cf = TR_SLOW_REGEN;
         break;
+    case TRC_BERS_RAGE:
+        cf = TR_BERS_RAGE;
+        break;
     default:
         break;
     }
@@ -297,6 +301,22 @@ static void curse_cowardice(player_type *creature_ptr)
     set_afraid(creature_ptr, creature_ptr->afraid + 13 + randint1(26));
 }
 
+/*!
+ * @brief 装備による狂戦士化の発作を引き起こす
+ * @param creature_ptr プレイヤー情報への参照ポインタ
+ */
+static void curse_berserk_rage(player_type *creature_ptr)
+{
+    if (((creature_ptr->cursed & TRC_BERS_RAGE) == 0) || !one_in_(1500))
+        return;
+
+    disturb(creature_ptr, FALSE, TRUE);
+    msg_print(_("ウガァァア!", "RAAAAGHH!"));
+    msg_print(_("激怒の発作に襲われた!", "You feel a fit of rage coming over you!"));
+    (void)set_shero(creature_ptr, 10 + randint1(creature_ptr->lev), FALSE);
+    (void)set_afraid(creature_ptr, 0);
+}
+
 static void curse_drain_hp(player_type *creature_ptr)
 {
     if (((creature_ptr->cursed & TRC_DRAIN_HP) == 0) || !one_in_(666))
@@ -342,6 +362,7 @@ static void occur_curse_effects(player_type *creature_ptr)
     multiply_high_curse(creature_ptr);
     curse_call_monster(creature_ptr);
     curse_cowardice(creature_ptr);
+    curse_berserk_rage(creature_ptr);
     if ((creature_ptr->cursed & TRC_TELEPORT) && one_in_(200) && !creature_ptr->anti_tele) {
         disturb(creature_ptr, FALSE, TRUE);
         teleport_player(creature_ptr, 40, TELEPORT_PASSIVE);
@@ -360,7 +381,7 @@ static void occur_curse_effects(player_type *creature_ptr)
 void execute_cursed_items_effect(player_type *creature_ptr)
 {
     occur_curse_effects(creature_ptr);
-    if (!one_in_(999) || creature_ptr->anti_magic)
+    if (!one_in_(999) || creature_ptr->anti_magic || (one_in_(2) && has_resist_curse(creature_ptr)))
         return;
 
     object_type *o_ptr = &creature_ptr->inventory_list[INVEN_LITE];
index 4c064f4..ccfc171 100644 (file)
@@ -183,6 +183,16 @@ static void compare_weapon_aux(player_type *owner_ptr, object_type *o_ptr, int c
         show_weapon_dmg(r++, col, mindam, maxdam, blow, dmg_bonus, _("邪悪:", "Evil:"), TERM_YELLOW);
     }
 
+    if (has_flag(flgs, TR_KILL_GOOD)) {
+        mindam = calc_expect_dice(owner_ptr, mindice, 7, 2, force, o_ptr->weight, o_ptr->to_h, owner_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
+        maxdam = calc_expect_dice(owner_ptr, maxdice, 7, 2, force, o_ptr->weight, o_ptr->to_h, owner_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
+        show_weapon_dmg(r++, col, mindam, maxdam, blow, dmg_bonus, _("善良:", "Good:"), TERM_YELLOW);
+    } else if (has_flag(flgs, TR_SLAY_GOOD)) {
+        mindam = calc_expect_dice(owner_ptr, mindice, 2, 2, force, o_ptr->weight, o_ptr->to_h, owner_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
+        maxdam = calc_expect_dice(owner_ptr, maxdice, 2, 1, force, o_ptr->weight, o_ptr->to_h, owner_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
+        show_weapon_dmg(r++, col, mindam, maxdam, blow, dmg_bonus, _("善良:", "Good:"), TERM_YELLOW);
+    }
+
     if (has_flag(flgs, TR_KILL_HUMAN)) {
         mindam = calc_expect_dice(owner_ptr, mindice, 4, 1, force, o_ptr->weight, o_ptr->to_h, owner_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
         maxdam = calc_expect_dice(owner_ptr, maxdice, 4, 1, force, o_ptr->weight, o_ptr->to_h, owner_ptr->to_h[0], dokubari, vorpal_mult, vorpal_div);
index b19cd36..add7865 100644 (file)
@@ -63,6 +63,10 @@ static void update_object_flags(BIT_FLAGS *flgs, BIT_FLAGS *flg2, BIT_FLAGS *flg
         *flg3 |= (RF3_EVIL);
     if (has_flag(flgs, TR_KILL_EVIL))
         *flg3 |= (RF3_EVIL);
+    if (has_flag(flgs, TR_SLAY_GOOD))
+        *flg3 |= (RF3_GOOD);
+    if (has_flag(flgs, TR_KILL_GOOD))
+        *flg3 |= (RF3_GOOD);
     if (has_flag(flgs, TR_SLAY_HUMAN))
         *flg2 |= (RF2_HUMAN);
     if (has_flag(flgs, TR_KILL_HUMAN))
index 2e0f6ee..8e5ecec 100644 (file)
@@ -9,6 +9,7 @@
 #include "cmd-io/cmd-save.h"
 #include "core/asking-player.h"
 #include "core/hp-mp-processor.h"
+#include "core/player-redraw-types.h"
 #include "effect/effect-characteristics.h"
 #include "effect/effect-processor.h"
 #include "game-option/special-options.h"
 #include "spell/spell-types.h"
 #include "spell/spells-status.h"
 #include "status/bad-status-setter.h"
+#include "status/body-improvement.h"
 #include "status/buff-setter.h"
 #include "system/floor-type-definition.h"
 #include "system/object-type-definition.h"
 #include "target/target-getter.h"
+#include "util/bit-flags-calculator.h"
 #include "util/quarks.h"
 #include "view/display-messages.h"
 
@@ -339,6 +342,18 @@ bool activate_protection_rune(player_type *user_ptr)
     return TRUE;
 }
 
+bool activate_protection_elbereth(player_type *user_ptr)
+{
+    msg_print(_("エルベレスよ、我を護り給え!", "A Elbereth gilthoniel!"));
+    create_rune_protection_one(user_ptr);
+    set_afraid(user_ptr, 0);
+    set_blind(user_ptr, 0);
+    set_image(user_ptr, 0);
+    set_blessed(user_ptr, randint0(25) + 25, true);
+    set_bits(user_ptr->redraw, PR_STATS);
+    return TRUE;
+}
+
 bool activate_light(player_type *user_ptr, concptr name)
 {
     msg_format(_("%sから澄んだ光があふれ出た...", "The %s wells with clear light..."), name);
index dda2a36..6651dba 100644 (file)
@@ -1,4 +1,4 @@
-#pragma once
+#pragma once
 
 #include "system/angband.h"
 
@@ -35,6 +35,7 @@ bool activate_terror(player_type *user_ptr);
 bool activate_map_light(player_type *user_ptr);
 bool activate_exploding_rune(player_type *user_ptr);
 bool activate_protection_rune(player_type *user_ptr);
+bool activate_protection_elbereth(player_type *user_ptr);
 bool activate_light(player_type *user_ptr, concptr name);
 bool activate_recall(player_type *user_ptr);
 bool activate_tree_creation(player_type *user_ptr, object_type *o_ptr, concptr name);
index 01365fb..567528d 100644 (file)
@@ -149,5 +149,7 @@ const activation_type activation_info[MAX_ACTIVATION_TYPE] = {
     { "ARTS_FALLING_STAR", ACT_FALLING_STAR, 20, 5500, { 30, 50 }, _("魔剣・流れ星", "blade arts 'falling star'") },
     { "ANIM_DEAD", ACT_ANIM_DEAD, 30, 2000, { 10, 10 }, _("死者復活", "animate dead") },
     { "TREE_CREATION", ACT_TREE_CREATION, 50, 25000, { 1000, 0 }, _("森林生成", "tree creation") },
+    { "ELBERETH", ACT_ELBERETH, 10, 30000, { 75, 0 }, _("エルベレスの結界", "Rune of Elbereth") },
+
     { NULL, 0, 0, 0, { 0, 0 }, "" },
-};
\ No newline at end of file
+};
index 8babdaa..5017fc3 100644 (file)
@@ -14,5 +14,5 @@ typedef struct activation_type {
     concptr desc;
 } activation_type;
 
-#define MAX_ACTIVATION_TYPE 136
+#define MAX_ACTIVATION_TYPE 137
 extern const activation_type activation_info[MAX_ACTIVATION_TYPE];
index 0c30730..369d440 100644 (file)
@@ -103,15 +103,6 @@ void apply_magic_armor(player_type *owner_ptr, object_type *o_ptr, DEPTH level,
                 if (okay_flag)
                     break;
             }
-
-            switch (o_ptr->name2) {
-            case EGO_DWARVEN:
-                o_ptr->weight = (2 * k_info[o_ptr->k_idx].weight / 3);
-                o_ptr->ac = k_info[o_ptr->k_idx].ac + 5;
-                break;
-            default:
-                break;
-            }
         } else if (power < -1) {
             while (TRUE) {
                 bool okay_flag = TRUE;
@@ -162,10 +153,6 @@ void apply_magic_armor(player_type *owner_ptr, object_type *o_ptr, DEPTH level,
                 if (o_ptr->sval == SV_MIRROR_SHIELD)
                     o_ptr->name2 = 0;
                 break;
-            case EGO_S_DWARVEN:
-                o_ptr->weight = (2 * k_info[o_ptr->k_idx].weight / 3);
-                o_ptr->ac = k_info[o_ptr->k_idx].ac + 3;
-                break;
             default:
                 break;
             }
@@ -229,11 +216,6 @@ void apply_magic_armor(player_type *owner_ptr, object_type *o_ptr, DEPTH level,
 
                 switch (o_ptr->name2) {
                 case EGO_TELEPATHY:
-                    if (add_esp_strong(o_ptr))
-                        add_esp_weak(o_ptr, TRUE);
-                    else
-                        add_esp_weak(o_ptr, FALSE);
-                    break;
                 case EGO_MAGI:
                 case EGO_MIGHT:
                 case EGO_REGENERATION:
@@ -241,12 +223,8 @@ void apply_magic_armor(player_type *owner_ptr, object_type *o_ptr, DEPTH level,
                 case EGO_BASILISK:
                     break;
                 case EGO_SEEING:
-                    if (one_in_(3)) {
-                        if (one_in_(2))
-                            add_esp_strong(o_ptr);
-                        else
-                            add_esp_weak(o_ptr, FALSE);
-                    }
+                    if (one_in_(3))
+                        add_low_telepathy(o_ptr);
                     break;
                 default:
                     /* not existing crown (wisdom,lite, etc...) */
@@ -297,18 +275,14 @@ void apply_magic_armor(player_type *owner_ptr, object_type *o_ptr, DEPTH level,
                 o_ptr->name2 = get_random_ego(INVEN_HEAD, TRUE);
                 switch (o_ptr->name2) {
                 case EGO_BRILLIANCE:
-                case EGO_DARK:
+                case EGO_DARK:  
                 case EGO_INFRAVISION:
                 case EGO_H_PROTECTION:
                 case EGO_LITE:
                     break;
                 case EGO_SEEING:
-                    if (one_in_(7)) {
-                        if (one_in_(2))
-                            add_esp_strong(o_ptr);
-                        else
-                            add_esp_weak(o_ptr, FALSE);
-                    }
+                    if (one_in_(7))
+                        add_low_telepathy(o_ptr);
                     break;
                 default:
                     /* not existing helm (Magi, Might, etc...)*/
index 3980a24..b6adc9d 100644 (file)
@@ -15,6 +15,7 @@
 #include "sv-definition/sv-weapon-types.h"
 #include "system/floor-type-definition.h"
 #include "util/bit-flags-calculator.h"
+#include "view/display-messages.h"
 
 /*!
  * @brief 武器系オブジェクトに生成ランクごとの強化を与えるサブルーチン
@@ -94,8 +95,6 @@ void apply_magic_weapon(player_type *owner_ptr, object_type *o_ptr, DEPTH level,
                     continue;
                 if (o_ptr->name2 == EGO_EARTHQUAKES && o_ptr->tval != TV_HAFTED)
                     continue;
-                if (o_ptr->name2 == EGO_WEIRD && o_ptr->tval != TV_SWORD)
-                    continue;
                 break;
             }
 
@@ -135,12 +134,21 @@ void apply_magic_weapon(player_type *owner_ptr, object_type *o_ptr, DEPTH level,
             }
         } else if (power < -1) {
             if (randint0(MAX_DEPTH) < level) {
+                int n = 0;
                 while (TRUE) {
                     o_ptr->name2 = get_random_ego(INVEN_MAIN_HAND, FALSE);
                     if (o_ptr->name2 == EGO_WEIRD && o_ptr->tval != TV_SWORD) {
                         continue;
                     }
 
+                    ego_item_type *e_ptr = &e_info[o_ptr->name2];
+                    if (o_ptr->tval == TV_SWORD && o_ptr->sval == SV_HAYABUSA && e_ptr->max_pval < 0) {
+                        if (++n > 1000) {
+                            msg_print(_("エラー:隼の剣に割り当てるエゴ無し", "Error: Cannot find for Hayabusa."));
+                            return;
+                        }
+                        continue;
+                    }
                     break;
                 }
             }
index 4537b5a..88e259c 100644 (file)
@@ -1,6 +1,7 @@
 #include "object-enchant/object-boost.h"
 #include "artifact/random-art-effects.h"
 #include "object-enchant/tr-types.h"
+#include "object/object-kind.h"
 #include "system/floor-type-definition.h"
 #include "system/object-type-definition.h"
 #include "util/bit-flags-calculator.h"
@@ -178,6 +179,39 @@ void add_esp_weak(object_type *o_ptr, bool extra)
 }
 
 /*!
+ * @brief 高級なテレパシー群を付ける
+ * @param o_ptr 対象のオブジェクト構造体ポインタ
+ * @return なし
+ * @details
+ * テレパシーの冠など。
+ * ESPまたは邪ESPは1d3の種族ESPを得る。
+ * 無ESPは3+1d6の種族ESPを得る。
+ */
+void add_high_telepathy(object_type* o_ptr)
+{
+    if (add_esp_strong(o_ptr))
+        add_esp_weak(o_ptr, TRUE);
+    else
+        add_esp_weak(o_ptr, FALSE);
+}
+
+/*!
+ * @brief テレパシー群を付ける
+ * @param o_ptr 対象のオブジェクト構造体ポインタ
+ * @return なし
+ * @details
+ * 鋭敏の帽子など。
+ * ESP、邪ESP、無ESPまたは1d3の種族ESP。
+ */
+void add_low_telepathy(object_type *o_ptr)
+{
+    if (one_in_(2))
+        add_esp_strong(o_ptr);
+    else
+        add_esp_weak(o_ptr, FALSE);
+}
+
+/*!
  * @brief 対象のオブジェクトに元素耐性を一つ付加する。/ Choose one random element resistance
  * @details 候補は火炎、冷気、電撃、酸のいずれかであり、重複の抑止はない。
  * @param o_ptr 対象のオブジェクト構造体ポインタ
@@ -547,3 +581,35 @@ void one_lordly_high_resistance(object_type *o_ptr)
         break;
     }
 }
+
+/*!
+ * @brief オブジェクトの重量を軽くする
+ * @param o_ptr オブジェクト情報への参照ポインタ
+ * @return なし
+ */
+void make_weight_ligten(object_type* o_ptr)
+{
+    o_ptr->weight = (2 * k_info[o_ptr->k_idx].weight / 3);
+}
+
+/*!
+ * @brief オブジェクトの重量を重くする
+ * @param o_ptr オブジェクト情報への参照ポインタ
+ * @return なし
+ */
+void make_weight_heavy(object_type *o_ptr)
+{
+    o_ptr->weight = (4 * k_info[o_ptr->k_idx].weight / 3);
+}
+
+/*!
+ * @brief オブジェクトのベースACを増やす
+ * @param o_ptr オブジェクト情報への参照ポインタ
+ * @return なし
+ * @details
+ * 1/4を加算。最低+5を保証。
+ */
+void add_xtra_ac(object_type *o_ptr)
+{
+    o_ptr->ac += MAX(5, o_ptr->ac / 4);
+}
index bdb7bc0..64b88e6 100644 (file)
@@ -6,6 +6,8 @@ int m_bonus(int max, DEPTH level);
 void one_sustain(object_type *o_ptr);
 bool add_esp_strong(object_type *o_ptr);
 void add_esp_weak(object_type *o_ptr, bool extra);
+void add_high_telepathy(object_type *o_ptr);
+void add_low_telepathy(object_type *o_ptr);
 void one_dragon_ele_resistance(object_type *o_ptr);
 void one_high_resistance(object_type *o_ptr);
 void one_ele_resistance(object_type *o_ptr);
@@ -15,4 +17,6 @@ void one_low_esp(object_type *o_ptr);
 void one_ability(object_type *o_ptr);
 void one_activation(object_type *o_ptr);
 void one_lordly_high_resistance(object_type *o_ptr);
-void apply_magic_weapon(player_type *owner_ptr, object_type *o_ptr, DEPTH level, int power);
+void make_weight_ligten(object_type *o_ptr);
+void make_weight_heavy(object_type *o_ptr);
+void add_xtra_ac(object_type *o_ptr);
index e1da37a..e4a6514 100644 (file)
@@ -10,6 +10,7 @@
 #include "object-enchant/special-object-flags.h"
 #include "object-enchant/trc-types.h"
 #include "object-hook/hook-checker.h"
+#include "object-hook/hook-weapon.h"
 #include "sv-definition/sv-protector-types.h"
 #include "sv-definition/sv-weapon-types.h"
 #include "util/bit-flags-calculator.h"
@@ -55,6 +56,13 @@ byte get_random_ego(byte slot, bool good)
     return (EGO_IDX)0;
 }
 
+/*!
+ * @brief エゴオブジェクトに呪いを付加する
+ * @param player_ptr プレイヤー情報への参照ポインタ
+ * @param o_ptr オブジェクト情報への参照ポインタ
+ * @param gen_flags 生成フラグ(参照渡し)
+ * @return なし
+ */
 static void ego_invest_curse(player_type* player_ptr, object_type* o_ptr, FlagGroup<TRG>& gen_flags)
 {
     if (gen_flags.has(TRG::CURSED))
@@ -71,6 +79,12 @@ static void ego_invest_curse(player_type* player_ptr, object_type* o_ptr, FlagGr
         o_ptr->curse_flags |= get_curse(player_ptr, 2, o_ptr);
 }
 
+/*!
+ * @brief エゴオブジェクトに追加能力/耐性を付加する
+ * @param o_ptr オブジェクト情報への参照ポインタ
+ * @param gen_flags 生成フラグ(参照渡し)
+ * @return なし
+ */
 static void ego_invest_extra_abilities(object_type *o_ptr, FlagGroup<TRG> &gen_flags)
 {
     if (gen_flags.has(TRG::ONE_SUSTAIN))
@@ -87,6 +101,18 @@ static void ego_invest_extra_abilities(object_type *o_ptr, FlagGroup<TRG> &gen_f
         one_lordly_high_resistance(o_ptr);
     if (gen_flags.has(TRG::XTRA_RES))
         one_resistance(o_ptr);
+    if (gen_flags.has(TRG::LIGHT_WEIGHT))
+        make_weight_ligten(o_ptr);
+    if (gen_flags.has(TRG::HEAVY_WEIGHT))
+        make_weight_heavy(o_ptr);
+    if (gen_flags.has(TRG::XTRA_AC))
+        add_xtra_ac(o_ptr);
+    if (gen_flags.has(TRG::HIGH_TELEPATHY))
+        add_high_telepathy(o_ptr);
+    if (gen_flags.has(TRG::LOW_TELEPATHY))
+        add_low_telepathy(o_ptr);
+    if (gen_flags.has(TRG::XTRA_L_ESP))
+        one_low_esp(o_ptr);
     if (gen_flags.has(TRG::XTRA_DICE)) {
         do {
             o_ptr->dd++;
@@ -97,6 +123,14 @@ static void ego_invest_extra_abilities(object_type *o_ptr, FlagGroup<TRG> &gen_f
     }
 }
 
+/*!
+ * @brief エゴアイテムの追加能力/耐性フラグを解釈する
+ * @param player_ptr プレイヤー情報への参照ポインタ
+ * @param o_ptr オブジェクト情報への参照ポインタ
+ * @param e_ptr エゴアイテム情報への参照ポインタ
+ * @param gen_flags 生成フラグ(参照渡し)
+ * @return なし
+ */
 static void ego_interpret_extra_abilities(object_type *o_ptr, ego_item_type *e_ptr, FlagGroup<TRG> &gen_flags)
 {
     for (auto& xtra : e_ptr->xtra_flags) {
@@ -135,6 +169,68 @@ static int randint1_signed(const int n)
     return n > 0 ? randint1(n) : -randint1(-n);
 }
 
+/*!
+ * @brief 追加込みでエゴがフラグを保持しているか判定する
+ * @param o_ptr オブジェクト情報への参照ポインタ
+ * @param e_ptr エゴアイテム情報への参照ポインタ
+ * @param flag フラグ
+ * @return 持つならtrue、持たないならfalse
+ */
+static bool ego_has_flag(object_type *o_ptr, ego_item_type *e_ptr, tr_type flag)
+{
+    if (has_flag(o_ptr->art_flags, flag))
+        return true;
+    if (has_flag(e_ptr->flags, flag))
+        return true;
+    return false;
+}
+
+/*!
+ * @brief エゴに追加攻撃のpvalを付加する
+ * @param player_ptr プレイヤー情報への参照ポインタ
+ * @param o_ptr オブジェクト情報への参照ポインタ
+ * @param e_ptr エゴアイテム情報への参照ポインタ
+ * @param lev 生成階
+ * @return なし
+ */
+void ego_invest_extra_attack(player_type *player_ptr, object_type *o_ptr, ego_item_type *e_ptr, DEPTH lev)
+{
+    if (!object_is_weapon(player_ptr, o_ptr)) {
+        o_ptr->pval = e_ptr->max_pval >= 0 ? 1 : randint1_signed(e_ptr->max_pval);
+        return;
+    }
+
+    if (o_ptr->name2 == EGO_ATTACKS) {
+        o_ptr->pval = randint1(e_ptr->max_pval * lev / 100 + 1);
+        if (o_ptr->pval > 3)
+            o_ptr->pval = 3;
+        if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_HAYABUSA))
+            o_ptr->pval += randint1(2);
+        return;
+    }
+
+    if (ego_has_flag(o_ptr, e_ptr, TR_EARTHQUAKE)) {
+        o_ptr->pval += randint1(e_ptr->max_pval);
+        return;
+    }
+
+    if (ego_has_flag(o_ptr, e_ptr, TR_SLAY_EVIL) || ego_has_flag(o_ptr, e_ptr, TR_KILL_EVIL)) {
+        o_ptr->pval++;
+        if ((lev > 60) && one_in_(3) && ((o_ptr->dd * (o_ptr->ds + 1)) < 15))
+            o_ptr->pval++;
+        return;
+    }
+
+    o_ptr->pval += randint1(2);
+}
+
+/*!
+ * @brief オブジェクトをエゴアイテムにする
+ * @param player_ptr プレイヤー情報への参照ポインタ
+ * @param o_ptr オブジェクト情報への参照ポインタ
+ * @param lev 生成階
+ * @return なし
+ */
 void apply_ego(player_type *player_ptr, object_type *o_ptr, DEPTH lev)
 {
     auto e_ptr = &e_info[o_ptr->name2];
@@ -175,7 +271,8 @@ void apply_ego(player_type *player_ptr, object_type *o_ptr, DEPTH lev)
         o_ptr->to_h += (HIT_PROB)randint1_signed(e_ptr->max_to_h);
         o_ptr->to_d += randint1_signed(e_ptr->max_to_d);
         o_ptr->to_a += (ARMOUR_CLASS)randint1_signed(e_ptr->max_to_a);
-        if (o_ptr->name2 == EGO_ACCURACY) {
+
+        if (gen_flags.has(TRG::MOD_ACCURACY)) {
             while (o_ptr->to_h < o_ptr->to_d + 10) {
                 o_ptr->to_h += 5;
                 o_ptr->to_d -= 5;
@@ -183,7 +280,7 @@ void apply_ego(player_type *player_ptr, object_type *o_ptr, DEPTH lev)
             o_ptr->to_h = MAX(o_ptr->to_h, 15);
         }
 
-        if (o_ptr->name2 == EGO_VELOCITY) {
+        if (gen_flags.has(TRG::MOD_VELOCITY)) {
             while (o_ptr->to_d < o_ptr->to_h + 10) {
                 o_ptr->to_d += 5;
                 o_ptr->to_h -= 5;
@@ -196,33 +293,19 @@ void apply_ego(player_type *player_ptr, object_type *o_ptr, DEPTH lev)
         }
 
         if (e_ptr->max_pval) {
-            if ((o_ptr->name2 == EGO_HA) && (has_flag(o_ptr->art_flags, TR_BLOWS))) {
-                o_ptr->pval++;
-                if ((lev > 60) && one_in_(3) && ((o_ptr->dd * (o_ptr->ds + 1)) < 15))
-                    o_ptr->pval++;
-            } else if (o_ptr->name2 == EGO_DEMON) {
-                if (has_flag(o_ptr->art_flags, TR_BLOWS)) {
-                    o_ptr->pval += randint1(2);
-                } else {
-                    o_ptr->pval += randint1(e_ptr->max_pval);
-                }
-            } else if (o_ptr->name2 == EGO_ATTACKS) {
-                o_ptr->pval = randint1(e_ptr->max_pval * lev / 100 + 1);
-                if (o_ptr->pval > 3)
-                    o_ptr->pval = 3;
-                if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_HAYABUSA))
-                    o_ptr->pval += randint1(2);
-            } else if (o_ptr->name2 == EGO_BAT) {
+            if (o_ptr->name2 == EGO_BAT) {
                 o_ptr->pval = randint1(e_ptr->max_pval);
                 if (o_ptr->sval == SV_ELVEN_CLOAK)
                     o_ptr->pval += randint1(2);
-            } else if (o_ptr->name2 == EGO_A_DEMON || o_ptr->name2 == EGO_DRUID || o_ptr->name2 == EGO_OLOG) {
-                o_ptr->pval = randint1(e_ptr->max_pval);
             } else {
-                if (e_ptr->max_pval > 0)
-                    o_ptr->pval += randint1(e_ptr->max_pval);
-                else if (e_ptr->max_pval < 0)
-                    o_ptr->pval -= randint1(0 - e_ptr->max_pval);
+                if (ego_has_flag(o_ptr, e_ptr, TR_BLOWS))
+                    ego_invest_extra_attack(player_ptr, o_ptr, e_ptr, lev);
+                else {
+                    if (e_ptr->max_pval > 0)
+                        o_ptr->pval += randint1(e_ptr->max_pval);
+                    else if (e_ptr->max_pval < 0)
+                        o_ptr->pval -= randint1(0 - e_ptr->max_pval);
+                }
             }
         }
 
index 30fba5c..d2a6317 100644 (file)
 #define EGO_CHAOTIC             77
 #define EGO_SHARPNESS           78
 #define EGO_EARTHQUAKES         79
+#define EGO_W_FAIRLY            83
+#define EGO_W_OMNIVOROUS        84
+#define EGO_W_DARK_REVENGER     85
+#define EGO_KILL_GOOD           86
 #define EGO_WEIRD               87
 #define EGO_KILL_ANIMAL         88
 #define EGO_KILL_EVIL           89
index 42e659a..6f59fc6 100644 (file)
@@ -30,13 +30,13 @@ enum tr_type {
     TR_SLAY_DRAGON = 23,
     TR_KILL_DRAGON = 24, /* Execute Dragon */
     TR_VORPAL = 25, /* Later */
-    TR_IMPACT = 26, /* Cause Earthquakes */
+    TR_EARTHQUAKE = 26, //!< 地震を起こす / Cause earthquake
     TR_BRAND_POIS = 27,
     TR_BRAND_ACID = 28,
     TR_BRAND_ELEC = 29,
     TR_BRAND_FIRE = 30,
     TR_BRAND_COLD = 31,
-    
+
     TR_SUST_STR = 32,
     TR_SUST_INT = 33,
     TR_SUST_WIS = 34,
@@ -69,7 +69,7 @@ enum tr_type {
     TR_RES_NEXUS = 61,
     TR_RES_CHAOS = 62,
     TR_RES_DISEN = 63,
-    
+
     TR_SH_FIRE = 64, /* Immolation (Fire) */
     TR_SH_ELEC = 65, /* Electric Sheath */
     TR_SLAY_HUMAN = 66, /* Slay human */
@@ -81,7 +81,7 @@ enum tr_type {
     TR_WARNING = 72, /* Warning */
     TR_HIDE_TYPE = 73, /* Hide "pval" description */
     TR_SHOW_MODS = 74, /* Always show Tohit/Todam */
-    TR_SLAY_GOOD = 75,
+    TR_SLAY_GOOD = 75,  //!< 善良スレイ(/善)
     TR_LEVITATION = 76, /* Feather Falling */
     TR_LITE_1 = 77, /* Light Radius 1*/
     TR_SEE_INVIS = 78, /* See Invisible */
@@ -101,8 +101,8 @@ enum tr_type {
     TR_BLESSED = 92, /* Item is Blessed */
     TR_ES_ATTACK = 93, /* Fake flag for Smith */
     TR_ES_AC = 94, /* Fake flag for Smith */
-    TR_KILL_GOOD = 95,
-    
+    TR_KILL_GOOD = 95,  //!< 善良スレイ(X善)
+
     TR_KILL_ANIMAL = 96,
     TR_KILL_EVIL = 97,
     TR_KILL_UNDEAD = 98,
@@ -135,7 +135,7 @@ enum tr_type {
     TR_LITE_M2 = 125, /* Permanent decrease Light Area (-1) */
     TR_LITE_M3 = 126, /* Permanent decrease Light Area (-1) */
     TR_LITE_FUEL = 127, /* Lights need Fuels */
-    
+
     TR_CALL_ANIMAL = 128,
     TR_CALL_DEMON = 129,
     TR_CALL_DRAGON = 130,
@@ -154,7 +154,12 @@ enum tr_type {
     TR_RES_TIME = 143,
     TR_RES_WATER = 144,
     TR_INVULN_ARROW = 145,
-    TR_DARK_SOURCE = 146, 
+    TR_DARK_SOURCE = 146,
     TR_SUPPORTIVE = 147,
-    TR_FLAG_MAX = 148,
+    TR_RES_CURSE = 148,
+    TR_BERS_RAGE = 149, //!< 狂戦士化の発作
+    TR_BRAND_MAGIC = 150, //!< 魔術属性
+    TR_IMPACT = 151, //!< クリティカル率アップ / Increase critical hit ratio
+
+        TR_FLAG_MAX = 152,
 };
index 89e6f10..659f961 100644 (file)
@@ -24,6 +24,7 @@ enum trc_curse_type {
     TRC_DRAIN_HP = 0x00080000L,
     TRC_DRAIN_MANA = 0x00100000L,
     TRC_CALL_UNDEAD = 0x00200000L,
+    TRC_BERS_RAGE = 0x00400000L,
 };
 
 enum trc_special_type {
index 9a60412..7c5d66c 100644 (file)
@@ -1,25 +1,36 @@
 #pragma once
 
 // clang-format off
+/*!
+ * @brief アイテム生成条件フラグ
+ */
 enum class TRG {
-       INSTA_ART         =  0, /* Item must be an artifact */
-    QUESTITEM         =  1, /* quest level item -KMW- */
-    XTRA_POWER        =  2, /* Extra power */
-    ONE_SUSTAIN       =  3, /* One sustain */
-    XTRA_RES_OR_POWER =  4, /* Extra resistance or power */
-    XTRA_H_RES        =  5, /* Extra high resistance */
-    XTRA_E_RES        =  6, /* Extra element resistance */
-    XTRA_L_RES        =  7, /* Extra lordly resistance */
-    XTRA_D_RES        =  8, /* Extra dragon resistance */
-    XTRA_RES          =  9, /* Extra resistance */
-    CURSED            = 10, /* Item is Cursed */
-    HEAVY_CURSE       = 11, /* Item is Heavily Cursed */
-    PERMA_CURSE       = 12, /* Item is Perma Cursed */
-    RANDOM_CURSE0     = 13, /* Item is Random Cursed */
-    RANDOM_CURSE1     = 14, /* Item is Random Cursed */
-    RANDOM_CURSE2     = 15, /* Item is Random Cursed */
-    XTRA_DICE         = 16, /* Extra dice */
-    POWERFUL          = 17, /* Item has good value even if Cursed */
+       INSTA_ART         =  0, //!< 固定アーティファクトになる / Item must be an artifact
+    QUESTITEM         =  1, //!< クエスト専用アイテム / quest level item -KMW-
+    XTRA_POWER        =  2, //!< 追加能力を得る / Extra power
+    ONE_SUSTAIN       =  3, //!< 追加維持を得る / One sustain
+    XTRA_RES_OR_POWER =  4, //!< 追加能力or耐性を得る / Extra resistance or power
+    XTRA_H_RES        =  5, //!< 追加上位耐性を得る / Extra high resistance
+    XTRA_E_RES        =  6, //!< 追加元素耐性を得る / Extra element resistance
+    XTRA_L_RES        =  7, //!< 王者の加護版追加耐性を得る / Extra lordly resistance
+    XTRA_D_RES        =  8, //!< ドラゴン的追加耐性を得る / Extra dragon resistance
+    XTRA_RES          =  9, //!< 追加耐性を得る / Extra resistance
+    CURSED            = 10, //!< 呪われている / Item is Cursed
+    HEAVY_CURSE       = 11, //!< 重い呪い / Item is Heavily Cursed
+    PERMA_CURSE       = 12, //!< 永遠の呪い / Item is Perma Cursed
+    RANDOM_CURSE0     = 13, //!< 軽い呪い効果を付ける / Item is Random Cursed
+    RANDOM_CURSE1     = 14, //!< 呪い効果を付ける(太古と反感以外) / Item is Random Cursed
+    RANDOM_CURSE2     = 15, //!< 重い呪い効果を付ける / Item is Random Cursed
+    XTRA_DICE         = 16, //!< ダイス数を増やす / Extra dice
+    POWERFUL          = 17, //!< 呪われているが修正値を正にする / Item has good value even if Cursed
+    LIGHT_WEIGHT      = 18, //!< 重量を軽くする(2/3倍) / Make lighten (エゴ用、他は重量を普通に設定でよい)
+    HEAVY_WEIGHT      = 19, //!< 重量を重くする(4/3倍) / Make heavy (エゴ用、他は重量を普通に設定でよい)
+    XTRA_AC           = 20, //!< ベースACを上げる / Add base AC (エゴ用、他はACを普通に設定でよい)
+    HIGH_TELEPATHY    = 21, //!< 高水準のテレパシーを付ける(テレパシーの冠) / Add high quarity esps.
+    LOW_TELEPATHY     = 22, //!< 中水準のテレパシーを付ける(鋭敏) / Add middle quarity esps.
+    XTRA_L_ESP        = 23, //!< 種族テレパシーを得る / Extra racial esp.
+    MOD_ACCURACY      = 24, //!< 命中偏重の殺戮修正にする / Adjust to-hit more than to-dam.
+    MOD_VELOCITY      = 25, //!< ダメージ偏重の殺戮修正にする / Adjust to-dam more than to-hit.
     MAX,
 };
 // clang-format on
index 7693d77..8cdf492 100644 (file)
@@ -84,7 +84,7 @@ void object_flags(player_type *player_ptr, object_type *o_ptr, BIT_FLAGS flgs[TR
             add_flag(flgs, TR_RES_ELEC);
             add_flag(flgs, TR_RES_FIRE);
             add_flag(flgs, TR_RES_COLD);
-        } else if (add == TR_IMPACT) {
+        } else if (add == TR_EARTHQUAKE) {
             add_flag(flgs, TR_ACTIVATE);
         }
     }
index 44d5857..91295a8 100644 (file)
@@ -79,6 +79,10 @@ PRICE flag_cost(player_type *player_ptr, object_type *o_ptr, int plusses)
         total += 5000;
         count++;
     }
+    if (has_flag(flgs, TR_BRAND_MAGIC)) {
+        total += 1000;
+        count++;
+    }
     if (has_flag(flgs, TR_VAMPIRIC)) {
         total += 6500;
         count++;
@@ -101,6 +105,13 @@ PRICE flag_cost(player_type *player_ptr, object_type *o_ptr, int plusses)
         tmp_cost += 2300;
         count++;
     }
+    if (has_flag(flgs, TR_KILL_GOOD)) {
+        tmp_cost += 2800;
+        count++;
+    } else if (has_flag(flgs, TR_SLAY_GOOD)) {
+        tmp_cost += 1800;
+        count++;
+    }
     if (has_flag(flgs, TR_KILL_HUMAN)) {
         tmp_cost += 2800;
         count++;
@@ -159,6 +170,10 @@ PRICE flag_cost(player_type *player_ptr, object_type *o_ptr, int plusses)
         tmp_cost += 2500;
         count++;
     }
+    if (has_flag(flgs, TR_EARTHQUAKE)) {
+        tmp_cost += 2500;
+        count++;
+    }
     if (has_flag(flgs, TR_BRAND_POIS)) {
         tmp_cost += 3800;
         count++;
@@ -300,6 +315,8 @@ PRICE flag_cost(player_type *player_ptr, object_type *o_ptr, int plusses)
     }
     total += (tmp_cost * count);
 
+    if (has_flag(flgs, TR_RES_CURSE))
+        total += 7500;
     if (has_flag(flgs, TR_SH_FIRE))
         total += 5000;
     if (has_flag(flgs, TR_SH_ELEC))
index 65cf19b..b4287f9 100644 (file)
@@ -242,11 +242,15 @@ bool screen_object(player_type *player_ptr, object_type *o_ptr, BIT_FLAGS mode)
         info[i++] = _("それはカオス的な効果を及ぼす。", "It produces chaotic effects.");
     }
 
+    if (has_flag(flgs, TR_BRAND_MAGIC)) {
+        info[i++] = _("それは魔術的な効果を及ぼす。", "It produces magical effects.");
+    }
+
     if (has_flag(flgs, TR_VAMPIRIC)) {
         info[i++] = _("それは敵から生命力を吸収する。", "It drains life from your foes.");
     }
 
-    if (has_flag(flgs, TR_IMPACT)) {
+    if (has_flag(flgs, TR_EARTHQUAKE)) {
         info[i++] = _("それは地震を起こすことができる。", "It can cause earthquakes.");
     }
 
@@ -254,6 +258,10 @@ bool screen_object(player_type *player_ptr, object_type *o_ptr, BIT_FLAGS mode)
         info[i++] = _("それは非常に切れ味が鋭く敵を切断することができる。", "It is very sharp and can cut your foes.");
     }
 
+    if (has_flag(flgs, TR_IMPACT)) {
+        info[i++] = _("それは非常に強く敵を攻撃することができる。", "It can hit your foes strongly.");
+    }
+
     if (has_flag(flgs, TR_KILL_DRAGON)) {
         info[i++] = _("それはドラゴンにとっての天敵である。", "It is a great bane of dragons.");
     } else if (has_flag(flgs, TR_SLAY_DRAGON)) {
@@ -306,6 +314,14 @@ bool screen_object(player_type *player_ptr, object_type *o_ptr, BIT_FLAGS mode)
         info[i++] = _("それは邪悪なる存在に対して聖なる力で攻撃する。", "It fights against evil with holy fury.");
     }
 
+    if (has_flag(flgs, TR_KILL_GOOD)) {
+        info[i++] = _("それは善良なる存在にとっての天敵である。", "It is a great bane of good monsters.");
+    }
+
+    if (has_flag(flgs, TR_SLAY_EVIL)) {
+        info[i++] = _("それは善良なる存在に対して邪悪なる力で攻撃する。", "It fights against good with evil fury.");
+    }
+
     if (has_flag(flgs, TR_KILL_ANIMAL)) {
         info[i++] = _("それは自然界の動物にとっての天敵である。", "It is a great bane of natural creatures.");
     }
@@ -530,7 +546,12 @@ bool screen_object(player_type *player_ptr, object_type *o_ptr, BIT_FLAGS mode)
         info[i++] = _("それは矢の呪文を反射する。", "It reflects bolt spells.");
     }
 
-    if (has_flag(flgs, TR_SH_FIRE)) {
+    if (has_flag(flgs, TR_RES_CURSE)) {
+        info[i++] = _("それは呪いへの抵抗力を高める。", "It produces your high resisrance to curse.");
+    }
+
+    if (has_flag(flgs, TR_SH_FIRE))
+    {
         info[i++] = _("それは炎のバリアを張る。", "It produces a fiery sheath.");
     }
 
@@ -622,6 +643,9 @@ bool screen_object(player_type *player_ptr, object_type *o_ptr, BIT_FLAGS mode)
         info[i++] = _("それは恐怖感を引き起こす。", "It makes you subject to cowardice.");
     }
 
+    if (has_flag(flgs, TR_BERS_RAGE))
+        info[i++] = _("それは狂戦士化の発作を引き起こす。", "It makes you subject to berserker fits.");
+
     if ((has_flag(flgs, TR_TELEPORT)) || (o_ptr->curse_flags & TRC_TELEPORT)) {
         info[i++] = _("それはランダムなテレポートを引き起こす。", "It induces random teleportation.");
     }
index 791efac..c5738e3 100644 (file)
@@ -1,8 +1,9 @@
 /*!
- * @brief カオス武器で攻撃した際の追加効果処理
+ * @brief 特殊属性武器で攻撃した際の追加効果処理
  * @date 2020/05/23
  * @author Hourier
- * @details 不可分な処理であるゴールデンハンマーによるアイテム奪取処理も入っている
+ * @details
+ * カオス属性、魔術属性、ゴールデンハンマー
  */
 
 #include "player-attack/attack-chaos-effect.h"
 #include "monster-race/race-flags-resistance.h"
 #include "monster-race/race-flags1.h"
 #include "monster-race/race-flags3.h"
+#include "monster-race//race-ability-mask.h"
 #include "monster/monster-describer.h"
 #include "monster/monster-info.h"
 #include "monster/monster-status-setter.h"
 #include "monster/monster-status.h"
+#include "lore/lore-store.h"
 #include "object/object-mark-types.h"
 #include "player/attack-defense-types.h"
 #include "realm/realm-hex-numbers.h"
 #include "spell-kind/spells-polymorph.h"
+#include "spell-kind/spells-sight.h"
 #include "spell-kind/spells-teleport.h"
 #include "spell-realm/spells-hex.h"
 #include "system/floor-type-definition.h"
+#include "util/bit-flags-calculator.h"
 #include "view/display-messages.h"
 
 /*!
- * @brief カオス武器か混乱の手でモンスターを混乱させる処理
+ * @brief 打撃でモンスターを混乱させる処理
  * @param attacker_ptr プレーヤーへの参照ポインタ
  * @param pa_ptr 直接攻撃構造体への参照ポインタ
- * @return 死んだらTRUE、生きていたらFALSE
+ * @param can_resist レベルで抵抗可能ならTRUE、できないならFALSE
  * @return なし
+ * @details
+ * カオス属性や混乱の手
  */
-static void attack_confuse(player_type *attacker_ptr, player_attack_type *pa_ptr)
+static void attack_confuse(player_type *attacker_ptr, player_attack_type *pa_ptr, bool can_resist = true)
 {
     if (attacker_ptr->special_attack & ATTACK_CONFUSE) {
         attacker_ptr->special_attack &= ~(ATTACK_CONFUSE);
@@ -44,21 +51,117 @@ static void attack_confuse(player_type *attacker_ptr, player_attack_type *pa_ptr
         attacker_ptr->redraw |= (PR_STATUS);
     }
 
-    monster_race *r_ptr = &r_info[pa_ptr->m_ptr->r_idx];
+    monster_race *r_ptr = pa_ptr->r_ptr;
     if (r_ptr->flags3 & RF3_NO_CONF) {
         if (is_original_ap_and_seen(attacker_ptr, pa_ptr->m_ptr))
             r_ptr->r_flags3 |= RF3_NO_CONF;
         msg_format(_("%^sには効果がなかった。", "%^s is unaffected."), pa_ptr->m_name);
 
-    } else if (randint0(100) < r_ptr->level) {
+    } else if (can_resist && randint0(100) < r_ptr->level) {
         msg_format(_("%^sには効果がなかった。", "%^s is unaffected."), pa_ptr->m_name);
     } else {
         msg_format(_("%^sは混乱したようだ。", "%^s appears confused."), pa_ptr->m_name);
-        (void)set_monster_confused(attacker_ptr, pa_ptr->g_ptr->m_idx, monster_confused_remaining(pa_ptr->m_ptr) + 10 + randint0(attacker_ptr->lev) / 5);
+        (void)set_monster_confused(attacker_ptr, pa_ptr->m_idx, monster_confused_remaining(pa_ptr->m_ptr) + 10 + randint0(attacker_ptr->lev) / 5);
     }
 }
 
 /*!
+ * @brief 打撃でモンスターを朦朧とさせる処理
+ * @param attacker_ptr プレーヤーへの参照ポインタ
+ * @param pa_ptr 直接攻撃構造体への参照ポインタ
+ * @param can_resist レベルで抵抗可能ならTRUE、できないならFALSE
+ * @return なし
+ * @details
+ * 魔術属性
+ */
+static void attack_stun(player_type *attacker_ptr, player_attack_type *pa_ptr, bool can_resist = true)
+{
+    monster_race *r_ptr = pa_ptr->r_ptr;
+    if (any_bits(r_ptr->flags3, RF3_NO_STUN)) {
+        if (is_original_ap_and_seen(attacker_ptr, pa_ptr->m_ptr))
+            set_bits(r_ptr->flags3, RF3_NO_STUN);
+        msg_format(_("%^sには効果がなかった。", "%^s is unaffected."), pa_ptr->m_name);
+    } else if (can_resist && randint0(100) < r_ptr->level) {
+        msg_format(_("%^sには効果がなかった。", "%^s is unaffected."), pa_ptr->m_name);
+    } else {
+        msg_format(_("%^sは朦朧としたようだ。", "%^s appears stuned."), pa_ptr->m_name);
+        (void)set_monster_stunned(attacker_ptr, pa_ptr->m_idx, monster_stunned_remaining(pa_ptr->m_ptr) + 10 + randint0(attacker_ptr->lev) / 5);
+    }
+}
+
+/*!
+ * @brief 打撃でモンスターを恐怖させる処理
+ * @param attacker_ptr プレーヤーへの参照ポインタ
+ * @param pa_ptr 直接攻撃構造体への参照ポインタ
+ * @param can_resist レベルで抵抗可能ならTRUE、できないならFALSE
+ * @return なし
+ * @details
+ * 魔術属性
+ */
+static void attack_scare(player_type *attacker_ptr, player_attack_type *pa_ptr, bool can_resist = true)
+{
+    monster_race *r_ptr = pa_ptr->r_ptr;
+    if (any_bits(r_ptr->flags3, RF3_NO_FEAR)) {
+        if (is_original_ap_and_seen(attacker_ptr, pa_ptr->m_ptr))
+            set_bits(r_ptr->flags3, RF3_NO_FEAR);
+        msg_format(_("%^sには効果がなかった。", "%^s is unaffected."), pa_ptr->m_name);
+    } else if (can_resist && randint0(100) < r_ptr->level) {
+        msg_format(_("%^sには効果がなかった。", "%^s is unaffected."), pa_ptr->m_name);
+    } else {
+        msg_format(_("%^sは恐怖して逃げ出した!", "%^s flees in terror!"), pa_ptr->m_name);
+        (void)set_monster_monfear(attacker_ptr, pa_ptr->m_idx, monster_fear_remaining(pa_ptr->m_ptr) + 10 + randint0(attacker_ptr->lev) / 5);
+    }
+}
+
+/*!
+ * @brief 打撃でモンスターを無力化する処理
+ * @param attacker_ptr プレーヤーへの参照ポインタ
+ * @param pa_ptr 直接攻撃構造体への参照ポインタ
+ * @return なし
+ * @details
+ * 魔術属性
+ */
+static void attack_dispel(player_type *attacker_ptr, player_attack_type *pa_ptr)
+{
+    if (pa_ptr->r_ptr->ability_flags.has_none_of(RF_ABILITY_ATTACK_MASK) && pa_ptr->r_ptr->ability_flags.has_none_of(RF_ABILITY_INDIRECT_MASK))
+        return;
+
+    auto dd = 2;
+    if (pa_ptr->m_ptr->mtimed[MTIMED_SLOW])
+        dd += 1;
+    if (pa_ptr->m_ptr->mtimed[MTIMED_FAST])
+        dd += 2;
+    if (pa_ptr->m_ptr->mtimed[MTIMED_INVULNER])
+        dd += 3;
+
+    msg_print(_("武器が敵の魔力を吸い取った!", "The weapon drains mana of your enemy!"));
+    dispel_monster_status(attacker_ptr, pa_ptr->m_idx);
+
+    auto sp = damroll(dd, 8);
+    attacker_ptr->csp = MIN(attacker_ptr->msp, attacker_ptr->csp + sp);
+    set_bits(attacker_ptr->redraw, PR_MANA);
+}
+
+/*!
+ * @brief 打撃でモンスターを調査する処理
+ * @param attacker_ptr プレーヤーへの参照ポインタ
+ * @param pa_ptr 直接攻撃構造体への参照ポインタ
+ * @return なし
+ * @details
+ * 魔術属性
+ */
+static void attack_probe(player_type *attacker_ptr, player_attack_type *pa_ptr)
+{
+    msg_print(_("刃が敵を調査した...", "The blade probed your enemy..."));
+    msg_print(NULL);
+    char buf[256];
+    probed_monster_info(buf, attacker_ptr, pa_ptr->m_ptr, pa_ptr->r_ptr);
+    msg_print(buf);
+    msg_print(NULL);
+    (void)lore_do_probe(attacker_ptr, pa_ptr->r_idx);
+}
+
+/*!
  * @breif カオス武器でのテレポート・アウェイを行うか判定する (抵抗されたら無効)
  * @param attacker_ptr プレーヤーへの参照ポインタ
  * @param pa_ptr 直接攻撃構造体への参照ポインタ
@@ -66,7 +169,7 @@ static void attack_confuse(player_type *attacker_ptr, player_attack_type *pa_ptr
  */
 static bool judge_tereprt_resistance(player_type *attacker_ptr, player_attack_type *pa_ptr)
 {
-    monster_race *r_ptr = &r_info[pa_ptr->m_ptr->r_idx];
+    monster_race *r_ptr = pa_ptr->r_ptr;
     if ((r_ptr->flagsr & RFR_RES_TELE) == 0)
         return FALSE;
 
@@ -102,7 +205,7 @@ static void attack_teleport_away(player_type *attacker_ptr, player_attack_type *
         return;
 
     msg_format(_("%^sは消えた!", "%^s disappears!"), pa_ptr->m_name);
-    teleport_away(attacker_ptr, pa_ptr->g_ptr->m_idx, 50, TELEPORT_PASSIVE);
+    teleport_away(attacker_ptr, pa_ptr->m_idx, 50, TELEPORT_PASSIVE);
     *num = pa_ptr->num_blow + 1;
     *(pa_ptr->mdeath) = TRUE;
 }
@@ -117,7 +220,7 @@ static void attack_teleport_away(player_type *attacker_ptr, player_attack_type *
  */
 static void attack_polymorph(player_type *attacker_ptr, player_attack_type *pa_ptr, POSITION y, POSITION x)
 {
-    monster_race *r_ptr = &r_info[pa_ptr->m_ptr->r_idx];
+    monster_race *r_ptr = pa_ptr->r_ptr;
     if (((r_ptr->flags1 & (RF1_UNIQUE | RF1_QUESTOR)) != 0) || ((r_ptr->flagsr & RFR_EFF_RES_CHAO_MASK) != 0))
         return;
 
@@ -128,7 +231,7 @@ static void attack_polymorph(player_type *attacker_ptr, player_attack_type *pa_p
     } else
         msg_format(_("%^sには効果がなかった。", "%^s is unaffected."), pa_ptr->m_name);
 
-    pa_ptr->m_ptr = &attacker_ptr->current_floor_ptr->m_list[pa_ptr->g_ptr->m_idx];
+    pa_ptr->m_ptr = &attacker_ptr->current_floor_ptr->m_list[pa_ptr->m_idx];
     monster_desc(attacker_ptr, pa_ptr->m_name, pa_ptr->m_ptr, 0);
 }
 
@@ -141,7 +244,7 @@ static void attack_polymorph(player_type *attacker_ptr, player_attack_type *pa_p
 static void attack_golden_hammer(player_type *attacker_ptr, player_attack_type *pa_ptr)
 {
     floor_type *floor_ptr = attacker_ptr->current_floor_ptr;
-    monster_type *target_ptr = &floor_ptr->m_list[pa_ptr->g_ptr->m_idx];
+    monster_type *target_ptr = &floor_ptr->m_list[pa_ptr->m_idx];
     if (target_ptr->hold_o_idx == 0)
         return;
 
@@ -169,13 +272,29 @@ void change_monster_stat(player_type *attacker_ptr, player_attack_type *pa_ptr,
 {
     monster_race *r_ptr = &r_info[pa_ptr->m_ptr->r_idx];
     object_type *o_ptr = &attacker_ptr->inventory_list[INVEN_MAIN_HAND + pa_ptr->hand];
-    if ((attacker_ptr->special_attack & ATTACK_CONFUSE) || (pa_ptr->chaos_effect == CE_CONFUSION) || (pa_ptr->mode == HISSATSU_CONF)
+
+    if (any_bits(attacker_ptr->special_attack, ATTACK_CONFUSE) || pa_ptr->chaos_effect == CE_CONFUSION || pa_ptr->mode == HISSATSU_CONF
         || hex_spelling(attacker_ptr, HEX_CONFUSION))
         attack_confuse(attacker_ptr, pa_ptr);
-    else if (pa_ptr->chaos_effect == CE_TELE_AWAY)
+
+    if (pa_ptr->magical_effect == MagicalBrandEffect::STUN)
+        attack_stun(attacker_ptr, pa_ptr, false);
+
+    if (pa_ptr->magical_effect == MagicalBrandEffect::SCARE)
+        attack_scare(attacker_ptr, pa_ptr, false);
+
+    if (pa_ptr->magical_effect == MagicalBrandEffect::DISPELL)
+        attack_dispel(attacker_ptr, pa_ptr);
+
+    if (pa_ptr->magical_effect == MagicalBrandEffect::PROBE)
+        attack_probe(attacker_ptr, pa_ptr);
+
+    if (pa_ptr->chaos_effect == CE_TELE_AWAY)
         attack_teleport_away(attacker_ptr, pa_ptr, num);
-    else if ((pa_ptr->chaos_effect == CE_POLYMORPH) && (randint1(90) > r_ptr->level))
+
+    if (pa_ptr->chaos_effect == CE_POLYMORPH && randint1(90) > r_ptr->level)
         attack_polymorph(attacker_ptr, pa_ptr, y, x);
-    else if (o_ptr->name1 == ART_G_HAMMER)
+
+    if (o_ptr->name1 == ART_G_HAMMER)
         attack_golden_hammer(attacker_ptr, pa_ptr);
 }
index d8088bb..02c5ee7 100644 (file)
@@ -4,9 +4,12 @@
 #include "combat/martial-arts-table.h"
 #include "grid/grid.h"
 #include "system/angband.h"
-#include "system/object-type-definition.h"
 #include "system/monster-type-definition.h"
+#include "system/object-type-definition.h"
 
+/*!
+ * @brief カオス効果種別
+ */
 enum chaotic_effect {
     CE_NONE = 0,
     CE_VAMPIRIC = 1,
@@ -16,25 +19,37 @@ enum chaotic_effect {
     CE_POLYMORPH = 5,
 };
 
-typedef struct player_attack_type {
-    s16b hand;
-    combat_options mode;
-    monster_type *m_ptr;
-    bool backstab;
-    bool surprise_attack;
-    bool stab_fleeing;
-    bool monk_attack;
-    int num_blow;
-    HIT_POINT attack_damage;
-    GAME_TEXT m_name[MAX_NLEN];
-    BIT_FLAGS flags[TR_FLAG_SIZE];
-    chaotic_effect chaos_effect;
-    bool can_drain;
-    const martial_arts *ma_ptr;
-    int drain_result;
-    grid_type *g_ptr;
-    bool *fear;
-    bool *mdeath;
-    int drain_left;
-    bool weak;
-} player_attack_type;
+/*!
+ * @brief 魔術効果種別
+ */
+enum class MagicalBrandEffect { NONE = 0, EXTRA = 1, STUN = 2, SCARE = 3, DISPELL = 4, PROBE = 5, MAX };
+
+/*!
+ * @brief プレイヤーの打撃に関する情報
+ */
+struct player_attack_type {
+    s16b hand{}; //!< 武器の持ち手
+    grid_type *g_ptr; //!< ターゲットのいる地形情報
+    MONSTER_IDX m_idx{}; //!< モンスターID
+    monster_type *m_ptr{}; //!< モンスター情報(参照ポインタ)
+    GAME_TEXT m_name[MAX_NLEN]{}; //!< モンスター名
+    MONRACE_IDX r_idx{}; //!< モンスター種族ID
+    monster_race *r_ptr{}; //!< モンスター種族情報(参照ポインタ)
+    bool backstab{}; //!< 眠っている敵を不意打ちしたか
+    bool surprise_attack{}; //!< 気づいていない敵に闇討ちしたか(忍者)
+    bool stab_fleeing{}; //!< 逃げている敵の背後を襲ったか
+    combat_options mode{}; //!< 剣術種別
+    bool monk_attack{}; //!< 素手/マーシャルアーツかどうか
+    const martial_arts *ma_ptr{}; //!< マーシャルアーツ種別
+    HIT_POINT attack_damage{}; //!< 累積ダメージ
+    int num_blow{}; //!< 打撃回数
+    BIT_FLAGS flags[TR_FLAG_SIZE]{}; //!< 武器フラグ
+    chaotic_effect chaos_effect{}; //!< カオス効果
+    MagicalBrandEffect magical_effect{}; //!< 魔術効果
+    bool *fear{}; //!< 恐怖したかどうか
+    bool *mdeath{}; //!< 死んだかどうか
+    bool can_drain{}; //!< 吸血できるかどうか
+    int drain_result{}; //!< 吸血した累積量
+    int drain_left{}; //!< 吸血できる残量(最大MAX_VAMPIRIC_DRAIN)
+    bool weak{}; //!< 打撃効果でモンスターが弱くなったかどうか
+};
index 0946b4c..ccd879c 100644 (file)
 #include "wizard/wizard-messages.h"
 #include "world/world.h"
 
+/*!
+ * @brief プレイヤーの攻撃情報を初期化する(コンストラクタ以外の分)
+ */
 static player_attack_type *initialize_player_attack_type(
-    player_attack_type *pa_ptr, s16b hand, combat_options mode, monster_type *m_ptr, grid_type *g_ptr, bool *fear, bool *mdeath)
+    player_attack_type *pa_ptr, player_type *attacker_ptr, POSITION y, POSITION x, s16b hand, combat_options mode, bool *fear, bool *mdeath)
 {
+    auto floor_ptr = attacker_ptr->current_floor_ptr;
+    auto g_ptr = &floor_ptr->grid_array[y][x];
+    auto m_ptr = &floor_ptr->m_list[g_ptr->m_idx];
+
     pa_ptr->hand = hand;
     pa_ptr->mode = mode;
+    pa_ptr->m_idx = g_ptr->m_idx;
     pa_ptr->m_ptr = m_ptr;
-    pa_ptr->backstab = FALSE;
-    pa_ptr->surprise_attack = FALSE;
-    pa_ptr->stab_fleeing = FALSE;
-    pa_ptr->monk_attack = FALSE;
-    pa_ptr->num_blow = 0;
-    pa_ptr->attack_damage = 0;
-    pa_ptr->can_drain = FALSE;
+    pa_ptr->r_idx = m_ptr->r_idx;
+    pa_ptr->r_ptr = &r_info[m_ptr->r_idx];
     pa_ptr->ma_ptr = &ma_blows[0];
-    pa_ptr->drain_result = 0;
     pa_ptr->g_ptr = g_ptr;
     pa_ptr->fear = fear;
     pa_ptr->mdeath = mdeath;
     pa_ptr->drain_left = MAX_VAMPIRIC_DRAIN;
-    pa_ptr->weak = FALSE;
     return pa_ptr;
 }
 
@@ -220,6 +221,102 @@ static chaotic_effect select_chaotic_effect(player_type *attacker_ptr, player_at
 }
 
 /*!
+ * @brief 魔術属性による追加ダイス数を返す
+ * @param attacker_ptr プレーヤー情報への参照ポインタ
+ * @param pa_ptr プレイヤー攻撃情報への参照ポインタ
+ * @return 魔術属性効果
+ */
+static MagicalBrandEffect select_magical_brand_effect(player_type *attacker_ptr, player_attack_type *pa_ptr)
+{
+    if (!has_flag(pa_ptr->flags, TR_BRAND_MAGIC))
+        return MagicalBrandEffect::NONE;
+
+    if (one_in_(10))
+        chg_virtue(attacker_ptr, V_CHANCE, 1);
+
+    if (one_in_(5))
+        return MagicalBrandEffect::STUN;
+
+    if (one_in_(5))
+        return MagicalBrandEffect::SCARE;
+
+    if (one_in_(10))
+        return MagicalBrandEffect::DISPELL;
+
+    if (one_in_(16))
+        return MagicalBrandEffect::PROBE;
+
+    return MagicalBrandEffect::EXTRA;
+}
+
+/*!
+ * @brief 魔法属性による追加ダイス数を返す
+ * @param pa_ptr プレイヤー攻撃情報への参照ポインタ
+ * @return ダイス数
+ */
+static DICE_NUMBER magical_brand_extra_dice(player_attack_type* pa_ptr)
+{
+    switch (pa_ptr->magical_effect) {
+    case MagicalBrandEffect::NONE:
+        return 0;
+    case MagicalBrandEffect::EXTRA:
+        return 1;
+    default:
+        return 2;
+    }
+}
+
+/*!
+ * @brief 装備品が地震を起こすか判定
+ * @param attacker_ptr プレイヤー情報への参照ポインタ
+ * @param pa_ptr 直接攻撃構造体への参照ポインタ
+ * @return 地震を起こすならtrue、起こさないならfalse
+ * @details
+ * 打撃に使用する武器または武器以外の装備品が地震を起こすなら、
+ * ダメージ量が50より多いか1/7で地震を起こす
+ */
+static bool does_equip_cause_earthquake(player_type *attacker_ptr, player_attack_type *pa_ptr)
+{
+    if (!attacker_ptr->earthquake)
+        return false;
+
+    auto do_quake = false;
+
+    auto hand = (pa_ptr->hand == 0) ? FLAG_CAUSE_INVEN_MAIN_HAND : FLAG_CAUSE_INVEN_SUB_HAND;
+    if (any_bits(attacker_ptr->earthquake, hand))
+        do_quake = true;
+    else {
+        auto flags = attacker_ptr->earthquake;
+        reset_bits(flags, FLAG_CAUSE_INVEN_MAIN_HAND | FLAG_CAUSE_INVEN_SUB_HAND);
+        do_quake = flags != 0;
+    }
+
+    if (do_quake)
+        return pa_ptr->attack_damage > 50 || one_in_(7);
+
+    return false;
+}
+
+/*!
+ * @brief 手にしている装備品がフラグを持つか判定
+ * @param attacker_flags 装備状況で集計されたフラグ
+ * @param pa_ptr 直接攻撃構造体への参照ポインタ
+ * @return 持つならtrue、持たないならfalse
+ */
+static bool does_weapon_has_flag(BIT_FLAGS &attacker_flags, player_attack_type *pa_ptr) {
+    if (!attacker_flags)
+        return false;
+
+    auto hand = (pa_ptr->hand == 0) ? FLAG_CAUSE_INVEN_MAIN_HAND : FLAG_CAUSE_INVEN_SUB_HAND;
+    if (any_bits(attacker_flags, hand))
+        return true;
+
+    auto flags = attacker_flags;
+    reset_bits(flags, FLAG_CAUSE_INVEN_MAIN_HAND | FLAG_CAUSE_INVEN_SUB_HAND);
+    return flags != 0;
+}
+
+/*!
  * @brief 武器による直接攻撃メインルーチン
  * @param attacker_ptr プレーヤーへの参照ポインタ
  * @param pa_ptr 直接攻撃構造体への参照ポインタ
@@ -230,17 +327,17 @@ static chaotic_effect select_chaotic_effect(player_type *attacker_ptr, player_at
 static void process_weapon_attack(player_type *attacker_ptr, player_attack_type *pa_ptr, bool *do_quake, const bool vorpal_cut, const int vorpal_chance)
 {
     object_type *o_ptr = &attacker_ptr->inventory_list[INVEN_MAIN_HAND + pa_ptr->hand];
-    pa_ptr->attack_damage = damroll(o_ptr->dd + attacker_ptr->to_dd[pa_ptr->hand], o_ptr->ds + attacker_ptr->to_ds[pa_ptr->hand]);
+    auto dd = o_ptr->dd + attacker_ptr->to_dd[pa_ptr->hand] + magical_brand_extra_dice(pa_ptr);
+    pa_ptr->attack_damage = damroll(dd, o_ptr->ds + attacker_ptr->to_ds[pa_ptr->hand]);
     pa_ptr->attack_damage = calc_attack_damage_with_slay(attacker_ptr, o_ptr, pa_ptr->attack_damage, pa_ptr->m_ptr, pa_ptr->mode, FALSE);
     calc_surprise_attack_damage(attacker_ptr, pa_ptr);
 
-    BIT_FLAGS attack_hand = (pa_ptr->hand == 0) ? FLAG_CAUSE_INVEN_MAIN_HAND : FLAG_CAUSE_INVEN_SUB_HAND;
-    if ((any_bits(attacker_ptr->impact, attack_hand) && ((pa_ptr->attack_damage > 50) || one_in_(7))) || (pa_ptr->chaos_effect == CE_QUAKE)
-        || (pa_ptr->mode == HISSATSU_QUAKE))
+    if (does_equip_cause_earthquake(attacker_ptr, pa_ptr) || (pa_ptr->chaos_effect == CE_QUAKE) || (pa_ptr->mode == HISSATSU_QUAKE))
         *do_quake = TRUE;
 
+    auto do_impact = does_weapon_has_flag(attacker_ptr->impact, pa_ptr);
     if ((!(o_ptr->tval == TV_SWORD) || !(o_ptr->sval == SV_POISON_NEEDLE)) && !(pa_ptr->mode == HISSATSU_KYUSHO))
-        pa_ptr->attack_damage = critical_norm(attacker_ptr, o_ptr->weight, o_ptr->to_h, pa_ptr->attack_damage, attacker_ptr->to_h[pa_ptr->hand], pa_ptr->mode);
+        pa_ptr->attack_damage = critical_norm(attacker_ptr, o_ptr->weight, o_ptr->to_h, pa_ptr->attack_damage, attacker_ptr->to_h[pa_ptr->hand], pa_ptr->mode, do_impact);
 
     pa_ptr->drain_result = pa_ptr->attack_damage;
     process_vorpal_attack(attacker_ptr, pa_ptr, vorpal_cut, vorpal_chance);
@@ -333,7 +430,7 @@ static void apply_damage_negative_effect(player_attack_type *pa_ptr, bool is_zan
  */
 static bool check_fear_death(player_type *attacker_ptr, player_attack_type *pa_ptr, const int num, const bool is_lowlevel)
 {
-    if (!mon_take_hit(attacker_ptr, pa_ptr->g_ptr->m_idx, pa_ptr->attack_damage, pa_ptr->fear, NULL))
+    if (!mon_take_hit(attacker_ptr, pa_ptr->m_idx, pa_ptr->attack_damage, pa_ptr->fear, NULL))
         return FALSE;
 
     *(pa_ptr->mdeath) = TRUE;
@@ -375,6 +472,7 @@ static void apply_actual_attack(
 
     object_flags(attacker_ptr, o_ptr, pa_ptr->flags);
     pa_ptr->chaos_effect = select_chaotic_effect(attacker_ptr, pa_ptr);
+    pa_ptr->magical_effect = select_magical_brand_effect(attacker_ptr, pa_ptr);
     decide_blood_sucking(attacker_ptr, pa_ptr);
 
     // process_monk_attackの中でplayer_type->magic_num1[0] を書き換えているので、ここでhex_spelling() の判定をしないとダメ.
@@ -385,6 +483,7 @@ static void apply_actual_attack(
     apply_damage_bonus(attacker_ptr, pa_ptr);
     apply_damage_negative_effect(pa_ptr, is_zantetsu_nullified, is_ej_nullified);
     mineuchi(attacker_ptr, pa_ptr);
+
     pa_ptr->attack_damage = mon_damage_mod(attacker_ptr, pa_ptr->m_ptr, pa_ptr->attack_damage,
         (bool)(((o_ptr->tval == TV_POLEARM) && (o_ptr->sval == SV_DEATH_SCYTHE)) || ((attacker_ptr->pclass == CLASS_BERSERKER) && one_in_(2))));
     critical_attack(attacker_ptr, pa_ptr);
@@ -429,26 +528,23 @@ void exe_player_attack_to_monster(player_type *attacker_ptr, POSITION y, POSITIO
     bool do_quake = FALSE;
     bool drain_msg = TRUE;
 
-    floor_type *floor_ptr = attacker_ptr->current_floor_ptr;
-    grid_type *g_ptr = &floor_ptr->grid_array[y][x];
-    monster_type *m_ptr = &floor_ptr->m_list[g_ptr->m_idx];
     player_attack_type tmp_attack;
-    player_attack_type *pa_ptr = initialize_player_attack_type(&tmp_attack, hand, mode, m_ptr, g_ptr, fear, mdeath);
-    monster_race *r_ptr = &r_info[pa_ptr->m_ptr->r_idx];
-    bool is_human = (r_ptr->d_char == 'p');
-    bool is_lowlevel = (r_ptr->level < (attacker_ptr->lev - 15));
+    auto pa_ptr = initialize_player_attack_type(&tmp_attack, attacker_ptr, y, x, hand, mode, fear, mdeath);
+
+    bool is_human = (pa_ptr->r_ptr->d_char == 'p');
+    bool is_lowlevel = (pa_ptr->r_ptr->level < (attacker_ptr->lev - 15));
 
     attack_classify(attacker_ptr, pa_ptr);
     get_attack_exp(attacker_ptr, pa_ptr);
 
     /* Disturb the monster */
-    (void)set_monster_csleep(attacker_ptr, g_ptr->m_idx, 0);
-    monster_desc(attacker_ptr, pa_ptr->m_name, m_ptr, 0);
+    (void)set_monster_csleep(attacker_ptr, pa_ptr->m_idx, 0);
+    monster_desc(attacker_ptr, pa_ptr->m_name, pa_ptr->m_ptr, 0);
 
     int chance = calc_attack_quality(attacker_ptr, pa_ptr);
     object_type *o_ptr = &attacker_ptr->inventory_list[INVEN_MAIN_HAND + pa_ptr->hand];
-    bool is_zantetsu_nullified = ((o_ptr->name1 == ART_ZANTETSU) && (r_ptr->d_char == 'j'));
-    bool is_ej_nullified = ((o_ptr->name1 == ART_EXCALIBUR_J) && (r_ptr->d_char == 'S'));
+    bool is_zantetsu_nullified = ((o_ptr->name1 == ART_ZANTETSU) && (pa_ptr->r_ptr->d_char == 'j'));
+    bool is_ej_nullified = ((o_ptr->name1 == ART_EXCALIBUR_J) && (pa_ptr->r_ptr->d_char == 'S'));
     calc_num_blow(attacker_ptr, pa_ptr);
 
     /* Attack once for each legal blow */
@@ -464,9 +560,9 @@ void exe_player_attack_to_monster(player_type *attacker_ptr, POSITION y, POSITIO
 
         /* Anger the monster */
         if (pa_ptr->attack_damage > 0)
-            anger_monster(attacker_ptr, m_ptr);
+            anger_monster(attacker_ptr, pa_ptr->m_ptr);
 
-        touch_zap_player(m_ptr, attacker_ptr);
+        touch_zap_player(pa_ptr->m_ptr, attacker_ptr);
         process_drain(attacker_ptr, pa_ptr, is_human, &drain_msg);
         pa_ptr->can_drain = FALSE;
         pa_ptr->drain_result = 0;
index 47a2efc..fc73c33 100644 (file)
@@ -67,6 +67,9 @@ void set_body_improvement_info_3(player_type *creature_ptr, self_info_type *self
     if (has_reflect(creature_ptr))
         self_ptr->info[self_ptr->line++] = _("あなたは矢の呪文を反射する。", "You reflect bolt spells.");
 
+    if (has_resist_curse(creature_ptr))
+        self_ptr->info[self_ptr->line++] = _("あなたはより強く呪いに抵抗できる。", "You can resist curses powerfully.");
+
     if (has_sh_fire(creature_ptr))
         self_ptr->info[self_ptr->line++] = _("あなたは炎のオーラに包まれている。", "You are surrounded with a fiery aura.");
 
index 50c5cbd..fd8733d 100644 (file)
@@ -83,6 +83,9 @@ static void set_curse_info(player_type *creature_ptr, self_info_type *self_ptr)
     if (creature_ptr->cursed & TRC_COWARDICE)
         self_ptr->info[self_ptr->line++] = _("あなたは時々臆病になる。", "You are subject to cowardice.");
 
+    if (creature_ptr->cursed & TRC_BERS_RAGE)
+        self_ptr->info[self_ptr->line++] = _("あなたは狂戦士化の発作を起こす。", "You are subject to berserker fits.");
+
     if (creature_ptr->cursed & TRC_TELEPORT)
         self_ptr->info[self_ptr->line++] = _("あなたの位置はひじょうに不安定だ。", "Your position is very uncertain.");
 
index 60f043e..bd441af 100644 (file)
@@ -12,12 +12,18 @@ static void set_weapon_bless_info(self_info_type *self_ptr)
     if (has_flag(self_ptr->flags, TR_CHAOTIC))
         self_ptr->info[self_ptr->line++] = _("あなたの武器はログルスの徴の属性をもつ。", "Your weapon is branded with the Sign of Logrus.");
 
-    if (has_flag(self_ptr->flags, TR_IMPACT))
+    if (has_flag(self_ptr->flags, TR_BRAND_MAGIC))
+        self_ptr->info[self_ptr->line++] = _("あなたの武器は魔術的効果を発動することがある。", "Your weapon is branded with magical power.");
+
+    if (has_flag(self_ptr->flags, TR_EARTHQUAKE))
         self_ptr->info[self_ptr->line++] = _("あなたの武器は打撃で地震を発生することができる。", "The impact of your weapon can cause earthquakes.");
 
     if (has_flag(self_ptr->flags, TR_VORPAL))
         self_ptr->info[self_ptr->line++] = _("あなたの武器は非常に鋭い。", "Your weapon is very sharp.");
 
+    if (has_flag(self_ptr->flags, TR_IMPACT))
+        self_ptr->info[self_ptr->line++] = _("あなたの武器は強力な一撃を放てる。", "Your weapon hits your foes strongly.");
+
     if (has_flag(self_ptr->flags, TR_VAMPIRIC))
         self_ptr->info[self_ptr->line++] = _("あなたの武器は敵から生命力を吸収する。", "Your weapon drains life from your foes.");
 }
@@ -52,6 +58,11 @@ static void set_slay_info(self_info_type *self_ptr)
     else if (has_flag(self_ptr->flags, TR_SLAY_EVIL))
         self_ptr->info[self_ptr->line++] = _("あなたの武器は邪悪なる存在に対して強い力を発揮する。", "Your weapon strikes at evil with extra force.");
 
+    if (has_flag(self_ptr->flags, TR_KILL_GOOD))
+        self_ptr->info[self_ptr->line++] = _("あなたの武器は善良なる存在の天敵である。", "Your weapon is a great bane of good.");
+    else if (has_flag(self_ptr->flags, TR_SLAY_GOOD))
+        self_ptr->info[self_ptr->line++] = _("あなたの武器は善良なる存在に対して強い力を発揮する。", "Your weapon strikes at good with extra force.");
+
     if (has_flag(self_ptr->flags, TR_KILL_HUMAN))
         self_ptr->info[self_ptr->line++] = _("あなたの武器は人間の天敵である。", "Your weapon is a great bane of humans.");
     else if (has_flag(self_ptr->flags, TR_SLAY_HUMAN))
index eaf812f..f307777 100644 (file)
@@ -190,8 +190,8 @@ BIT_FLAGS get_player_flags(player_type *creature_ptr, tr_type tr_flag)
     case TR_KILL_DRAGON:
     case TR_VORPAL:
         return check_equipment_flags(creature_ptr, tr_flag);
-    case TR_IMPACT:
-        return has_impact(creature_ptr);
+    case TR_EARTHQUAKE:
+        return has_earthquake(creature_ptr);
     case TR_BRAND_POIS:
         return player_flags_brand_pois(creature_ptr);
     case TR_BRAND_ACID:
@@ -271,6 +271,8 @@ BIT_FLAGS get_player_flags(player_type *creature_ptr, tr_type tr_flag)
         return has_resist_time(creature_ptr);
     case TR_RES_WATER:
         return has_resist_water(creature_ptr);
+    case TR_RES_CURSE :
+        return has_resist_curse(creature_ptr);
 
     case TR_SH_FIRE:
         return has_sh_fire(creature_ptr);
@@ -292,9 +294,8 @@ BIT_FLAGS get_player_flags(player_type *creature_ptr, tr_type tr_flag)
         return has_warning(creature_ptr);
     case TR_HIDE_TYPE:
     case TR_SHOW_MODS:
-        return check_equipment_flags(creature_ptr, tr_flag);
     case TR_SLAY_GOOD:
-        return 0;
+        return check_equipment_flags(creature_ptr, tr_flag);
     case TR_LEVITATION:
         return has_levitation(creature_ptr);
     case TR_LITE_1:
@@ -395,7 +396,11 @@ BIT_FLAGS get_player_flags(player_type *creature_ptr, tr_type tr_flag)
         return has_invuln_arrow(creature_ptr);
     case TR_DARK_SOURCE:
     case TR_SUPPORTIVE:
+    case TR_BERS_RAGE:
+    case TR_BRAND_MAGIC:
         return check_equipment_flags(creature_ptr, tr_flag);
+    case TR_IMPACT:
+        return has_impact(creature_ptr);
 
     case TR_FLAG_MAX:
         break;
@@ -1290,6 +1295,8 @@ void update_curses(player_type *creature_ptr)
             creature_ptr->cursed |= TRC_FAST_DIGEST;
         if (has_flag(flgs, TR_SLOW_REGEN))
             creature_ptr->cursed |= TRC_SLOW_REGEN;
+        if (has_flag(flgs, TR_BERS_RAGE))
+            creature_ptr->cursed |= TRC_BERS_RAGE;
 
         creature_ptr->cursed |= (o_ptr->curse_flags & (0xFFFFFFF0L));
         if (o_ptr->name1 == ART_CHAINSWORD)
@@ -1319,6 +1326,11 @@ BIT_FLAGS has_impact(player_type *creature_ptr)
     return check_equipment_flags(creature_ptr, TR_IMPACT);
 }
 
+BIT_FLAGS has_earthquake(player_type *creature_ptr)
+{
+    return check_equipment_flags(creature_ptr, TR_EARTHQUAKE);
+}
+
 void update_extra_blows(player_type *creature_ptr)
 {
     object_type *o_ptr;
@@ -1856,6 +1868,19 @@ BIT_FLAGS has_resist_water(player_type *creature_ptr)
     return result;
 }
 
+/*!
+ * @brief 呪力耐性を所持しているかどうか
+ * @param プレイヤー情報への参照ポインタ
+ * @return 呪力耐性を所持していればTRUE、なければFALSE
+ */
+BIT_FLAGS has_resist_curse(player_type *creature_ptr)
+{
+    BIT_FLAGS result = 0L;
+
+    result |= check_equipment_flags(creature_ptr, TR_RES_CURSE);
+    return result;
+}
+
 BIT_FLAGS has_resist_fear(player_type *creature_ptr)
 {
     BIT_FLAGS result = 0L;
index 7e32df2..c1a329e 100644 (file)
@@ -100,6 +100,7 @@ BIT_FLAGS has_slow_digest(player_type *creature_ptr);
 BIT_FLAGS has_regenerate(player_type *creature_ptr);
 void update_curses(player_type *creature_ptr);
 BIT_FLAGS has_impact(player_type *creature_ptr);
+BIT_FLAGS has_earthquake(player_type *creature_ptr);
 void update_extra_blows(player_type *creature_ptr);
 BIT_FLAGS has_resist_acid(player_type *creature_ptr);
 BIT_FLAGS has_vuln_acid(player_type *creature_ptr);
@@ -123,6 +124,7 @@ BIT_FLAGS has_resist_blind(player_type *creature_ptr);
 BIT_FLAGS has_resist_neth(player_type *creature_ptr);
 BIT_FLAGS has_resist_time(player_type *creature_ptr);
 BIT_FLAGS has_resist_water(player_type *creature_ptr);
+BIT_FLAGS has_resist_curse(player_type *creature_ptr);
 BIT_FLAGS has_resist_fear(player_type *creature_ptr);
 BIT_FLAGS has_immune_acid(player_type *creature_ptr);
 BIT_FLAGS has_immune_elec(player_type *creature_ptr);
index c935b50..e02558c 100644 (file)
@@ -390,6 +390,7 @@ static void update_bonuses(player_type *creature_ptr)
     creature_ptr->regenerate = has_regenerate(creature_ptr);
     update_curses(creature_ptr);
     creature_ptr->impact = has_impact(creature_ptr);
+    creature_ptr->earthquake = has_earthquake(creature_ptr);
     update_extra_blows(creature_ptr);
 
     creature_ptr->lite = has_lite(creature_ptr);
@@ -1305,6 +1306,8 @@ static ACTION_SKILL_POWER calc_device_ability(player_type *creature_ptr)
  * * 種族/職業/性格による加算
  * * 職業と性格とレベルによる追加加算
  * * 変異MUT3_MAGIC_RESによる加算(15 + レベル / 5)
+ * * 呪力耐性の装備による加算(30)
+ * * 祝福された装備による加算(5 + レベル / 10)
  * * 賢さによるadj_wis_savテーブル加算
  * * 狂戦士化による減算(-30)
  * * 反魔法持ちで大なり上書き(90+レベル未満ならその値に上書き)
@@ -1330,6 +1333,12 @@ static ACTION_SKILL_POWER calc_saving_throw(player_type *creature_ptr)
     if (creature_ptr->muta.has(MUTA::MAGIC_RES))
         pow += (15 + (creature_ptr->lev / 5));
 
+    if (has_resist_curse(creature_ptr))
+        pow += 30;
+
+    if (creature_ptr->blessed)
+        pow += 6 + (creature_ptr->lev - 1) / 10;
+
     pow += adj_wis_sav[creature_ptr->stat_index[A_WIS]];
 
     if (is_shero(creature_ptr))
index e67bb7d..197d5ff 100644 (file)
@@ -401,9 +401,10 @@ typedef struct player_type {
     BIT_FLAGS esp_unique{};
 
     BIT_FLAGS slow_digest{}; /* Slower digestion */
-    BIT_FLAGS bless_blade{}; /* Blessed blade */
+    BIT_FLAGS bless_blade{}; //!< 祝福された装備をしている / Blessed by inventory items
     BIT_FLAGS xtra_might{}; /* Extra might bow */
-    BIT_FLAGS impact{}; /* Earthquake blows */
+    BIT_FLAGS impact{}; //!< クリティカル率を上げる装備をしている / Critical blows
+    BIT_FLAGS earthquake{}; //!< 地震を起こす装備をしている / Earthquake blows
     BIT_FLAGS dec_mana{};
     BIT_FLAGS easy_spell{};
     BIT_FLAGS heavy_spell{};
index 737ab94..7db9209 100644 (file)
@@ -292,6 +292,72 @@ bool turn_monsters(player_type *caster_ptr, HIT_POINT dam) { return (project_all
 bool deathray_monsters(player_type *caster_ptr) { return (project_all_los(caster_ptr, GF_DEATH_RAY, caster_ptr->lev * 200)); }
 
 /*!
+ * @brief 調査したモンスターの情報を表示する
+ * @param caster_ptr プレーヤー情報への参照ポインタ
+ * @param m_ptr モンスター情報への参照ポインタ
+ * @param r_ptr モンスター種族への参照ポインタ
+ * @return なし
+ */
+void probed_monster_info(char *buf, player_type *caster_ptr, monster_type *m_ptr, monster_race *r_ptr)
+{
+    if (!is_original_ap(m_ptr)) {
+        if (m_ptr->mflag2.has(MFLAG2::KAGE))
+            m_ptr->mflag2.reset(MFLAG2::KAGE);
+
+        m_ptr->ap_r_idx = m_ptr->r_idx;
+        lite_spot(caster_ptr, m_ptr->fy, m_ptr->fx);
+    }
+
+    GAME_TEXT m_name[MAX_NLEN];
+    monster_desc(caster_ptr, m_name, m_ptr, MD_IGNORE_HALLU | MD_INDEF_HIDDEN);
+
+    SPEED speed = m_ptr->mspeed - 110;
+    if (monster_fast_remaining(m_ptr))
+        speed += 10;
+    if (monster_slow_remaining(m_ptr))
+        speed -= 10;
+    if (ironman_nightmare)
+        speed += 5;
+
+    concptr align;
+    if ((r_ptr->flags3 & (RF3_EVIL | RF3_GOOD)) == (RF3_EVIL | RF3_GOOD))
+        align = _("善悪", "good&evil");
+    else if (r_ptr->flags3 & RF3_EVIL)
+        align = _("邪悪", "evil");
+    else if (r_ptr->flags3 & RF3_GOOD)
+        align = _("善良", "good");
+    else if ((m_ptr->sub_align & (SUB_ALIGN_EVIL | SUB_ALIGN_GOOD)) == (SUB_ALIGN_EVIL | SUB_ALIGN_GOOD))
+        align = _("中立(善悪)", "neutral(good&evil)");
+    else if (m_ptr->sub_align & SUB_ALIGN_EVIL)
+        align = _("中立(邪悪)", "neutral(evil)");
+    else if (m_ptr->sub_align & SUB_ALIGN_GOOD)
+        align = _("中立(善良)", "neutral(good)");
+    else
+        align = _("中立", "neutral");
+
+    sprintf(buf, _("%s ... 属性:%s HP:%d/%d AC:%d 速度:%s%d 経験:", "%s ... align:%s HP:%d/%d AC:%d speed:%s%d exp:"), m_name, align, (int)m_ptr->hp,
+        (int)m_ptr->maxhp, r_ptr->ac, (speed > 0) ? "+" : "", speed);
+
+    if (r_ptr->next_r_idx) {
+        strcat(buf, format("%d/%d ", m_ptr->exp, r_ptr->next_exp));
+    } else {
+        strcat(buf, "xxx ");
+    }
+
+    if (monster_csleep_remaining(m_ptr))
+        strcat(buf, _("睡眠 ", "sleeping "));
+    if (monster_stunned_remaining(m_ptr))
+        strcat(buf, _("朦朧 ", "stunned "));
+    if (monster_fear_remaining(m_ptr))
+        strcat(buf, _("恐怖 ", "scared "));
+    if (monster_confused_remaining(m_ptr))
+        strcat(buf, _("混乱 ", "confused "));
+    if (monster_invulner_remaining(m_ptr))
+        strcat(buf, _("無敵 ", "invulnerable "));
+    buf[strlen(buf) - 1] = '\0';
+}
+
+/*!
  * @brief 周辺モンスターを調査する / Probe nearby monsters
  * @return 効力があった場合TRUEを返す
  */
@@ -303,9 +369,7 @@ bool probing(player_type *caster_ptr)
     Term->scr->cv = 1;
 
     bool probe = FALSE;
-    int speed;
     char buf[256];
-    concptr align;
     for (int i = 1; i < caster_ptr->current_floor_ptr->m_max; i++) {
         monster_type *m_ptr = &caster_ptr->current_floor_ptr->m_list[i];
         monster_race *r_ptr = &r_info[m_ptr->r_idx];
@@ -316,63 +380,11 @@ bool probing(player_type *caster_ptr)
         if (!m_ptr->ml)
             continue;
 
-        GAME_TEXT m_name[MAX_NLEN];
         if (!probe)
             msg_print(_("調査中...", "Probing..."));
         msg_print(NULL);
 
-        if (!is_original_ap(m_ptr)) {
-            if (m_ptr->mflag2.has(MFLAG2::KAGE))
-                m_ptr->mflag2.reset(MFLAG2::KAGE);
-
-            m_ptr->ap_r_idx = m_ptr->r_idx;
-            lite_spot(caster_ptr, m_ptr->fy, m_ptr->fx);
-        }
-
-        monster_desc(caster_ptr, m_name, m_ptr, MD_IGNORE_HALLU | MD_INDEF_HIDDEN);
-        speed = m_ptr->mspeed - 110;
-        if (monster_fast_remaining(m_ptr))
-            speed += 10;
-        if (monster_slow_remaining(m_ptr))
-            speed -= 10;
-        if (ironman_nightmare)
-            speed += 5;
-
-        if ((r_ptr->flags3 & (RF3_EVIL | RF3_GOOD)) == (RF3_EVIL | RF3_GOOD))
-            align = _("善悪", "good&evil");
-        else if (r_ptr->flags3 & RF3_EVIL)
-            align = _("邪悪", "evil");
-        else if (r_ptr->flags3 & RF3_GOOD)
-            align = _("善良", "good");
-        else if ((m_ptr->sub_align & (SUB_ALIGN_EVIL | SUB_ALIGN_GOOD)) == (SUB_ALIGN_EVIL | SUB_ALIGN_GOOD))
-            align = _("中立(善悪)", "neutral(good&evil)");
-        else if (m_ptr->sub_align & SUB_ALIGN_EVIL)
-            align = _("中立(邪悪)", "neutral(evil)");
-        else if (m_ptr->sub_align & SUB_ALIGN_GOOD)
-            align = _("中立(善良)", "neutral(good)");
-        else
-            align = _("中立", "neutral");
-
-        sprintf(buf, _("%s ... 属性:%s HP:%d/%d AC:%d 速度:%s%d 経験:", "%s ... align:%s HP:%d/%d AC:%d speed:%s%d exp:"), m_name, align, (int)m_ptr->hp,
-            (int)m_ptr->maxhp, r_ptr->ac, (speed > 0) ? "+" : "", speed);
-
-        if (r_ptr->next_r_idx) {
-            strcat(buf, format("%d/%d ", m_ptr->exp, r_ptr->next_exp));
-        } else {
-            strcat(buf, "xxx ");
-        }
-
-        if (monster_csleep_remaining(m_ptr))
-            strcat(buf, _("睡眠 ", "sleeping "));
-        if (monster_stunned_remaining(m_ptr))
-            strcat(buf, _("朦朧 ", "stunned "));
-        if (monster_fear_remaining(m_ptr))
-            strcat(buf, _("恐怖 ", "scared "));
-        if (monster_confused_remaining(m_ptr))
-            strcat(buf, _("混乱 ", "confused "));
-        if (monster_invulner_remaining(m_ptr))
-            strcat(buf, _("無敵 ", "invulnerable "));
-        buf[strlen(buf) - 1] = '\0';
+        probed_monster_info(buf, caster_ptr, m_ptr, r_ptr);
         prt(buf, 0, 0);
 
         message_add(buf);
index 8da52a1..708bf8f 100644 (file)
@@ -2,6 +2,8 @@
 
 #include "system/angband.h"
 
+struct monster_race;
+struct monster_type;
 bool project_all_los(player_type *caster_ptr, EFFECT_ID typ, HIT_POINT dam);
 bool speed_monsters(player_type *caster_ptr);
 bool slow_monsters(player_type *caster_ptr, int power);
@@ -26,4 +28,5 @@ bool banish_monsters(player_type *caster_ptr, int dist);
 bool turn_evil(player_type *caster_ptr, HIT_POINT dam);
 bool turn_monsters(player_type *caster_ptr, HIT_POINT dam);
 bool deathray_monsters(player_type *caster_ptr);
+void probed_monster_info(char *buf, player_type *caster_ptr, monster_type *m_ptr, monster_race *r_ptr);
 bool probing(player_type *caster_ptr);
index 9a5135e..7131c93 100644 (file)
@@ -397,7 +397,7 @@ static void display_slay_info(player_type *creature_ptr, void (*display_player_e
     process_one_characteristic(creature_ptr, row + 12, col, _("凍結      :", "Cold Brand:"), TR_BRAND_COLD, f, DP_WP);
     process_one_characteristic(creature_ptr, row + 13, col, _("毒殺      :", "Poison Brd:"), TR_BRAND_POIS, f, DP_WP);
     process_one_characteristic(creature_ptr, row + 14, col, _("切れ味    :", "Sharpness :"), TR_VORPAL, f, DP_WP);
-    process_one_characteristic(creature_ptr, row + 15, col, _("地震      :", "Quake     :"), TR_IMPACT, f, DP_WP);
+    process_one_characteristic(creature_ptr, row + 15, col, _("地震      :", "Quake     :"), TR_EARTHQUAKE, f, DP_WP);
     process_one_characteristic(creature_ptr, row + 16, col, _("吸血      :", "Vampiric  :"), TR_VAMPIRIC, f, DP_WP);
     process_one_characteristic(creature_ptr, row + 17, col, _("カオス効果:", "Chaotic   :"), TR_CHAOTIC, f, DP_WP);
     process_one_characteristic(creature_ptr, row + 18, col, _("理力      :", "Force Wep.:"), TR_FORCE_WEAPON, f, DP_WP);
index c687214..bc2daeb 100644 (file)
@@ -57,6 +57,7 @@ std::vector<std::vector<std::string>> debug_menu_table = {
     { "G", _("ゲームの設定を変更", "Modify game configurations") },
     { "H", _("モンスターの群れ生成", "Summon monsters") },
     { "i", _("鑑定", "Idenfity") },
+    { "I", _("インベントリ全*鑑定*", "Idenfity all objects fully in inventory") },
     { "j", _("指定ダンジョン階にワープ", "Jump to floor depth of target dungeon") },
     { "l", _("指定アイテム番号まで一括鑑定", "Make objects idenfified to target object id") },
     { "m", _("魔法の地図", "Magic mapping") },
@@ -177,6 +178,9 @@ bool exe_cmd_debug(player_type *creature_ptr, char cmd)
     case 'i':
         (void)ident_spell(creature_ptr, FALSE, TV_NONE);
         break;
+    case 'I':
+        wiz_identify_full_inventory(creature_ptr);
+        break;
     case 'j':
         wiz_jump_to_dungeon(creature_ptr);
         break;
index 161cc05..44ead87 100644 (file)
@@ -68,6 +68,8 @@ flag_desc slay_flags_desc[MAX_SLAY_FLAGS_DESCRIPTION] = {
     { TR_KILL_ANIMAL, _("*動物*", "XAnimal") },
     { TR_SLAY_EVIL, _("邪悪", "Evil") },
     { TR_KILL_EVIL, _("*邪悪*", "XEvil") },
+    { TR_SLAY_EVIL, _("善良", "Good") },
+    { TR_KILL_EVIL, _("*善良*", "XGood") },
     { TR_SLAY_HUMAN, _("人間", "Human") },
     { TR_KILL_HUMAN, _("*人間*", "XHuman") },
     { TR_SLAY_UNDEAD, _("アンデッド", "Undead") },
@@ -93,9 +95,11 @@ flag_desc brand_flags_desc[MAX_BRAND_FLAGS_DESCRIPTION] = {
     { TR_BRAND_POIS, _("毒殺", "Poisoned") },
     { TR_FORCE_WEAPON, _("理力", "Force") },
     { TR_CHAOTIC, _("混沌", "Mark of Chaos") },
+    { TR_BRAND_MAGIC, _("魔術", "Magical Brand") },
     { TR_VAMPIRIC, _("吸血", "Vampiric") },
-    { TR_IMPACT, _("地震", "Earthquake impact on hit") },
+    { TR_EARTHQUAKE, _("地震", "Earthquake impact on hit") },
     { TR_VORPAL, _("切れ味", "Very sharp") },
+    { TR_IMPACT, _("強撃", "Smash hit") },
 };
 
 const flag_desc resist_flags_desc[MAX_RESISTANCE_FLAGS_DESCRIPTION] = {
@@ -117,6 +121,7 @@ const flag_desc resist_flags_desc[MAX_RESISTANCE_FLAGS_DESCRIPTION] = {
     { TR_RES_DISEN, _("劣化", "Disenchantment") },
     { TR_RES_TIME, _("時間逆転", "Time") },
     { TR_RES_WATER, _("水", "Water") },
+    { TR_RES_CURSE, _("呪力", "Curse") },
 };
 
 /* Elemental immunities (along with poison) */
index ed1bbbf..0080524 100644 (file)
@@ -8,9 +8,9 @@
 #define MAX_GROUPER_ARTIFACT 21
 #define MAX_STAT_FLAGS_DESCRIPTION 6
 #define MAX_PVAL_FLAGS_DESCRIPTION 7
-#define MAX_SLAY_FLAGS_DESCRIPTION 18
-#define MAX_BRAND_FLAGS_DESCRIPTION 10
-#define MAX_RESISTANCE_FLAGS_DESCRIPTION 18
+#define MAX_SLAY_FLAGS_DESCRIPTION 20
+#define MAX_BRAND_FLAGS_DESCRIPTION 12
+#define MAX_RESISTANCE_FLAGS_DESCRIPTION 19
 #define MAX_IMMUNITY_FLAGS_DESCRIPTION 4
 #define MAX_SUSTAINER_FLAGS_DESCRIPTION 6
 #define MAX_MISC2_FLAGS_DESCRIPTION 4
index 045b85b..eb225df 100644 (file)
@@ -5,6 +5,7 @@
 #include "core/show-file.h"
 #include "core/player-update-types.h"
 #include "core/window-redrawer.h"
+#include "core/stuff-handler.h"
 #include "flavor/flavor-describer.h"
 #include "flavor/object-flavor-types.h"
 #include "floor/floor-object.h"
@@ -14,6 +15,7 @@
 #include "object-enchant/apply-magic.h"
 #include "object-enchant/item-apply-magic.h"
 #include "object-enchant/object-ego.h"
+#include "object-enchant/special-object-flags.h"
 #include "object-enchant/tr-types.h"
 #include "object-hook/hook-enchant.h"
 #include "object-hook/hook-checker.h"
@@ -23,7 +25,9 @@
 #include "object/object-info.h"
 #include "object/object-kind.h"
 #include "object/object-kind-hook.h"
+#include "object/object-mark-types.h"
 #include "object/object-value.h"
+#include "util/bit-flags-calculator.h"
 #include "util/string-processor.h"
 #include "system/alloc-entries.h"
 #include "system/artifact-type-definition.h"
 
 #define K_MAX_DEPTH 110 /*!< アイテムの階層毎生成率を表示する最大階 */
 
+void wiz_identify_full_inventory(player_type *caster_ptr)
+{
+    for (int i = 0; i < INVEN_TOTAL; i++) {
+        object_type *o_ptr = &caster_ptr->inventory_list[i];
+        if (!o_ptr->k_idx)
+            continue;
+
+        set_bits(o_ptr->ident, IDENT_KNOWN | IDENT_FULL_KNOWN);
+        set_bits(o_ptr->marked, OM_TOUCHED);
+    }
+
+    /* Refrect item informaiton onto subwindows without updating inventory */
+    reset_bits(caster_ptr->update, PU_COMBINE | PU_REORDER);
+    handle_stuff(caster_ptr);
+    set_bits(caster_ptr->update, PU_COMBINE | PU_REORDER);
+    set_bits(caster_ptr->window_flags, PW_INVEN | PW_EQUIP);
+}
+
 /*!
  * @brief アイテムの階層毎生成率を表示する / Output a rarity graph for a type of object.
  * @param tval ベースアイテムの大項目ID
index ac56015..a7f011e 100644 (file)
@@ -6,3 +6,4 @@ enum class WishResult { FAIL = -1, NOTHING = 0, NORMAL = 1, EGO = 2, ARTIFACT =
 
 void wiz_modify_item(player_type *creature_ptr);
 WishResult do_cmd_wishing(player_type *caster_ptr, int prob, bool art_ok, bool ego_ok, bool confirm);
+void wiz_identify_full_inventory(player_type *caster_ptr);