[Add] cheat_sightに座標表示 / Coordinate display on cheat_sight.
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
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
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.
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
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:(トマス・マロリー、アーサー王の死)
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".
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
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
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
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,
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:賢者マーリンの魔法の鏡だ。鏡を通じて賢者の助けを得ることができるだろう。
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
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
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 ###
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
E:of Telepathy
X:33:20
W:0:18:0:15000
-#F:TELEPATHY
+G:1/1:HIGH_TELEPATHY
N:34:再生の
E:of Regeneration
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# 岸さんの訳です
F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD
G:1/3:RES_POIS
G:1/3:WARNING
+G:1/7:RES_CURSE
# OneAbility
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)
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)
# 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)
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)
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:モルグルの
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
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)
X:27:30
W:100:0:0:50000
C:0:0:15:0
-F:ACTIVATE
+F:RES_CURSE | ACTIVATE
U:ULTIMATE_RESIST
N:181:経験値吸収の
X:29:5
W:0:0:0:200
C:0:0:8:0
+F:RES_CURSE
N:219:知識の
E:and Lore
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
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
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
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:魔術的なルーンの刻まれた陰気な外套だ。
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
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
return ACT_RESIST_FIRE;
case ESSENCE_TMP_RES_COLD:
return ACT_RESIST_COLD;
- case TR_IMPACT:
+ case TR_EARTHQUAKE:
return ACT_QUAKE;
}
}
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,
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 対象のオブジェクト構造体への参照ポインタ
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)
case 33:
invest_misc_weak_esps(o_ptr);
break;
+ case 34:
+ invest_misc_res_curse(o_ptr);
+ break;
}
}
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))
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);
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))
break;
case 20:
- add_flag(o_ptr->art_flags, TR_IMPACT);
+ add_flag(o_ptr->art_flags, TR_EARTHQUAKE);
break;
case 21:
case 22:
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;
}
}
{ 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 },
* @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) {
#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);
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);
{ "毒", "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 },
};
/*! オブジェクトの特性表示記号テーブルの定義(その他特性) */
/*! オブジェクトの特性表示記号テーブルの定義(属性スレイ) */
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 },
};
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 },
};
*/
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))
*/
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))
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);
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, ':');
#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 },
};
/*!
{ "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
#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;
*/
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))
#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)
case TRC_SLOW_REGEN:
cf = TR_SLOW_REGEN;
break;
+ case TRC_BERS_RAGE:
+ cf = TR_BERS_RAGE;
+ break;
default:
break;
}
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))
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);
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];
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);
*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))
#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"
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);
-#pragma once
+#pragma once
#include "system/angband.h"
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);
{ "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
+};
concptr desc;
} activation_type;
-#define MAX_ACTIVATION_TYPE 136
+#define MAX_ACTIVATION_TYPE 137
extern const activation_type activation_info[MAX_ACTIVATION_TYPE];
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;
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;
}
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:
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...) */
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...)*/
#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 武器系オブジェクトに生成ランクごとの強化を与えるサブルーチン
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;
}
}
} 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;
}
}
#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"
}
/*!
+ * @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 対象のオブジェクト構造体ポインタ
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);
+}
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);
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);
#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"
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))
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))
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++;
}
}
+/*!
+ * @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) {
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];
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;
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;
}
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);
+ }
}
}
#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
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,
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 */
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 */
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,
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,
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,
};
TRC_DRAIN_HP = 0x00080000L,
TRC_DRAIN_MANA = 0x00100000L,
TRC_CALL_UNDEAD = 0x00200000L,
+ TRC_BERS_RAGE = 0x00400000L,
};
enum trc_special_type {
#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
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);
}
}
total += 5000;
count++;
}
+ if (has_flag(flgs, TR_BRAND_MAGIC)) {
+ total += 1000;
+ count++;
+ }
if (has_flag(flgs, TR_VAMPIRIC)) {
total += 6500;
count++;
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++;
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++;
}
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))
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.");
}
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)) {
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.");
}
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.");
}
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.");
}
/*!
- * @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);
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 直接攻撃構造体への参照ポインタ
*/
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;
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;
}
*/
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;
} 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);
}
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;
{
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);
}
#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,
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{}; //!< 打撃効果でモンスターが弱くなったかどうか
+};
#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;
}
}
/*!
+ * @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 直接攻撃構造体への参照ポインタ
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);
*/
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;
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() の判定をしないとダメ.
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);
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 */
/* 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;
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.");
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.");
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.");
}
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))
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:
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);
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:
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;
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)
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;
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;
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);
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);
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);
* * 種族/職業/性格による加算
* * 職業と性格とレベルによる追加加算
* * 変異MUT3_MAGIC_RESによる加算(15 + レベル / 5)
+ * * 呪力耐性の装備による加算(30)
+ * * 祝福された装備による加算(5 + レベル / 10)
* * 賢さによるadj_wis_savテーブル加算
* * 狂戦士化による減算(-30)
* * 反魔法持ちで大なり上書き(90+レベル未満ならその値に上書き)
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))
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{};
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を返す
*/
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];
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);
#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);
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);
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);
{ "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") },
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;
{ 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") },
{ 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] = {
{ TR_RES_DISEN, _("劣化", "Disenchantment") },
{ TR_RES_TIME, _("時間逆転", "Time") },
{ TR_RES_WATER, _("水", "Water") },
+ { TR_RES_CURSE, _("呪力", "Curse") },
};
/* Elemental immunities (along with poison) */
#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
#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"
#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"
#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
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);