OSDN Git Service

[Implement] アヌビス神のカタナを原作仕様に近づける
authordis- <dis.rogue@gmail.com>
Mon, 22 Nov 2021 10:22:34 +0000 (19:22 +0900)
committerdis- <dis.rogue@gmail.com>
Mon, 22 Nov 2021 10:24:39 +0000 (19:24 +0900)
反テレポートとカオス効果を排除して実用武器として調整した。
+4攻撃は非常に強力なため、殺戮修正を落として調整。
フレーバー重視で切れ味の付加。
装備者を操る描写から執拗呪詛、狂戦士化を付与。

デメリットとしてAC低下、MR低下を付与。

シルバーチャリオッツとの二刀流にセットボーナスを与える。
二刀流命中ペナルティの半減と加速+5。
フレーバー程度に二刀流中はシルバーチャリオッツ側にも執拗呪詛を与える。

lib/edit/a_info.txt
src/artifact/fixed-art-types.h
src/cmd-item/cmd-equipment.cpp
src/player-status/player-speed.cpp
src/player/player-status.cpp
src/player/player-status.h

index 5efeeef..a38c485 100644 (file)
@@ -2961,9 +2961,9 @@ N:158:アヌビス神の
 E:of Anubis
 I:23:20:4
 W:30:90:120:200000
-P:0:3d4:28:22:-30
-F:DEX | CHAOTIC | CURSED | HEAVY_CURSE | TUNNEL | AGGRAVATE | BLOWS |
-F:RES_CONF | RES_CHAOS | RES_FEAR | RES_DISEN | NO_TELE
+P:0:3d4:15:10:0
+F:DEX | VORPAL | CURSED | HEAVY_CURSE | PERSISTENT_CURSE | TUNNEL | AGGRAVATE | BLOWS |
+F:RES_CONF | RES_CHAOS | RES_FEAR | RES_DISEN | BERS_RAGE | VUL_CURSE | LOW_AC
 
 N:159:太公望の
 E:of Taikobo
index e61711b..20c05f5 100644 (file)
@@ -16,11 +16,13 @@ enum fixed_artifact_type {
     ART_GROND = 111,
     ART_BARD = 125,
     ART_MJOLLNIR = 136,
+    ART_SILVER_CHARIOT = 140,
     ART_MURAMASA = 144,
     ART_XIAOLONG = 145,
     ART_STONEMASK = 146,
     ART_ZANTETSU = 150,
     ART_BARD_ARROW = 153,
+    ART_ANUBIS = 158,
     ART_HYOUSIGI = 169,
     ART_MUSASI_KATANA = 171,
     ART_MUSASI_WAKIZASI = 172,
index 30fd420..9916bdd 100644 (file)
 #include "view/display-messages.h"
 
 /*!
+ * @brief 装備時にアイテムを呪う処理
+ */
+static void do_curse_on_equip(OBJECT_IDX slot, object_type *o_ptr, PlayerType *player_ptr)
+{
+    if (set_anubis_and_chariot(player_ptr) && ((slot == INVEN_MAIN_HAND) || (slot == INVEN_SUB_HAND))) {
+
+        object_type *anubis = &(player_ptr->inventory_list[INVEN_MAIN_HAND]);
+        object_type *chariot = &(player_ptr->inventory_list[INVEN_SUB_HAND]);
+
+        anubis->curse_flags.set(CurseTraitType::PERSISTENT_CURSE);
+        anubis->curse_flags.set(CurseTraitType::HEAVY_CURSE);
+        chariot->curse_flags.set(CurseTraitType::PERSISTENT_CURSE);
+        chariot->curse_flags.set(CurseTraitType::HEAVY_CURSE);
+        chariot->curse_flags.set(CurseTraitType::BERS_RAGE);
+        chariot->curse_flags.set(CurseTraitType::LOW_AC);
+        chariot->curse_flags.set(CurseTraitType::VUL_CURSE);
+        
+        msg_format(_("『銀の戦車』プラス『アヌビス神』二刀流ッ!", "*Silver Chariot* plus *Anubis God* Two Swords!"));
+        player_ptr->update |= (PU_BONUS);
+        return;
+    }
+
+    if ((object_flags(o_ptr).has(TR_PERSISTENT_CURSE) || o_ptr->curse_flags.has(CurseTraitType::PERSISTENT_CURSE)) 
+        && o_ptr->curse_flags.has_not(CurseTraitType::HEAVY_CURSE)) {
+
+        GAME_TEXT o_name[MAX_NLEN];
+        describe_flavor(player_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
+        o_ptr->curse_flags.set(CurseTraitType::HEAVY_CURSE);
+        msg_format(_("悪意に満ちた黒いオーラが%sをとりまいた...", "There is a malignant black aura surrounding your %s..."), o_name);
+        o_ptr->feeling = FEEL_NONE;
+        player_ptr->update |= (PU_BONUS);
+    }
+}
+
+/*!
  * @brief 装備一覧を表示するコマンドのメインルーチン / Display equipment
  */
 void do_cmd_equip(PlayerType *player_ptr)
@@ -286,14 +321,7 @@ void do_cmd_wield(PlayerType *player_ptr)
         o_ptr->ident |= (IDENT_SENSE);
     }
 
-    if (object_flags(o_ptr).has(TR_PERSITENT_CURSE) && o_ptr->curse_flags.has_not(CurseTraitType::HEAVY_CURSE)) {
-        GAME_TEXT o_name[MAX_NLEN];
-        describe_flavor(player_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
-        o_ptr->curse_flags.set(CurseTraitType::HEAVY_CURSE);
-        msg_format(_("悪意に満ちた黒いオーラが%sをとりまいた...", "There is a malignant black aura surrounding your %s..."), o_name);
-        o_ptr->feeling = FEEL_NONE;
-        player_ptr->update |= (PU_BONUS);
-    }
+    do_curse_on_equip(slot, o_ptr, player_ptr);
 
     if ((o_ptr->name1 == ART_STONEMASK) && (player_ptr->prace != PlayerRaceType::VAMPIRE) && (player_ptr->prace != PlayerRaceType::ANDROID))
         change_race(player_ptr, PlayerRaceType::VAMPIRE, "");
index 8cdb586..a12665f 100644 (file)
@@ -122,17 +122,22 @@ int16_t PlayerSpeed::personality_value()
  * @return 速度値の増減分
  * @details
  * ** 棘セット装備中ならば加算(+7)
- * ** アイシングデス-トゥインクル装備中ならば加算(+7)
+ * ** アイシングデス-トゥインクル装備中ならば加算(+5)
+ * ** アヌビス-チャリオッツ装備中ならば加算(+5)
  */
 int16_t PlayerSpeed::special_weapon_set_value()
 {
     int16_t result = 0;
     if (has_melee_weapon(this->player_ptr, INVEN_MAIN_HAND) && has_melee_weapon(this->player_ptr, INVEN_SUB_HAND)) {
-        if ((this->player_ptr->inventory_list[INVEN_MAIN_HAND].name1 == ART_QUICKTHORN) && (this->player_ptr->inventory_list[INVEN_SUB_HAND].name1 == ART_TINYTHORN)) {
+        if (set_quick_and_tiny(this->player_ptr)) {
             result += 7;
         }
 
-        if ((this->player_ptr->inventory_list[INVEN_MAIN_HAND].name1 == ART_ICINGDEATH) && (this->player_ptr->inventory_list[INVEN_SUB_HAND].name1 == ART_TWINKLE)) {
+        if (set_icing_and_twinkle(this->player_ptr)) {
+            result += 5;
+        }
+
+        if (set_anubis_and_chariot(this->player_ptr)) {
             result += 5;
         }
     }
index fe7b564..1248195 100644 (file)
@@ -1606,7 +1606,7 @@ static ARMOUR_CLASS calc_to_ac(PlayerType *player_ptr, bool is_real_value)
         if (is_real_value || o_ptr->is_known())
             ac += o_ptr->to_a;
 
-        if (o_ptr->curse_flags.has(CurseTraitType::LOW_AC)) {
+        if (o_ptr->curse_flags.has(CurseTraitType::LOW_AC) || object_flags(o_ptr).has(TR_LOW_AC)) {
             if (o_ptr->curse_flags.has(CurseTraitType::HEAVY_CURSE)) {
                 if (is_real_value || o_ptr->is_fully_known())
                     ac -= 30;
@@ -1625,12 +1625,11 @@ static ARMOUR_CLASS calc_to_ac(PlayerType *player_ptr, bool is_real_value)
         ac += 10 + (player_ptr->lev * 2 / 5);
     }
 
-    if ((player_ptr->inventory_list[INVEN_MAIN_HAND].name1 == ART_QUICKTHORN) && (player_ptr->inventory_list[INVEN_SUB_HAND].name1 == ART_TINYTHORN)) {
+    if (set_quick_and_tiny(player_ptr)) {
         ac += 10;
     }
 
-    if ((player_ptr->inventory_list[INVEN_MAIN_HAND].name1 == ART_MUSASI_KATANA)
-        && (player_ptr->inventory_list[INVEN_SUB_HAND].name1 == ART_MUSASI_WAKIZASI)) {
+    if (set_musasi(player_ptr)) {
         ac += 10;
     }
 
@@ -1749,9 +1748,7 @@ int16_t calc_double_weapon_penalty(PlayerType *player_ptr, INVENTORY_IDX slot)
         auto flags = object_flags(&player_ptr->inventory_list[INVEN_SUB_HAND]);
 
         penalty = ((100 - player_ptr->skill_exp[PlayerSkillKindType::TWO_WEAPON] / 160) - (130 - player_ptr->inventory_list[slot].weight) / 8);
-        if (((player_ptr->inventory_list[INVEN_MAIN_HAND].name1 == ART_QUICKTHORN) && (player_ptr->inventory_list[INVEN_SUB_HAND].name1 == ART_TINYTHORN))
-            || ((player_ptr->inventory_list[INVEN_MAIN_HAND].name1 == ART_ICINGDEATH)
-                && (player_ptr->inventory_list[INVEN_SUB_HAND].name1 == ART_TWINKLE))) {
+        if (set_quick_and_tiny(player_ptr) || set_icing_and_twinkle(player_ptr) || set_anubis_and_chariot(player_ptr)) {
             penalty = penalty / 2 - 5;
         }
 
@@ -1762,8 +1759,7 @@ int16_t calc_double_weapon_penalty(PlayerType *player_ptr, INVENTORY_IDX slot)
         if (flags.has(TR_SUPPORTIVE))
             penalty = std::max(0, penalty - 10);
 
-        if ((player_ptr->inventory_list[INVEN_MAIN_HAND].name1 == ART_MUSASI_KATANA)
-            && (player_ptr->inventory_list[INVEN_SUB_HAND].name1 == ART_MUSASI_WAKIZASI)) {
+        if (set_musasi(player_ptr)) {
             penalty = std::min(0, penalty);
         }
 
@@ -2984,3 +2980,27 @@ static player_hand main_attack_hand(PlayerType *player_ptr)
     }
     return PLAYER_HAND_MAIN;
 }
+
+bool set_quick_and_tiny(PlayerType *player_ptr)
+{
+    return (player_ptr->inventory_list[INVEN_MAIN_HAND].name1 == ART_QUICKTHORN) 
+        && (player_ptr->inventory_list[INVEN_SUB_HAND].name1 == ART_TINYTHORN);
+}
+
+bool set_musasi(PlayerType *player_ptr)
+{
+    return (player_ptr->inventory_list[INVEN_MAIN_HAND].name1 == ART_MUSASI_KATANA) 
+        && (player_ptr->inventory_list[INVEN_SUB_HAND].name1 == ART_MUSASI_WAKIZASI);
+}
+
+bool set_icing_and_twinkle(PlayerType *player_ptr)
+{
+    return (player_ptr->inventory_list[INVEN_MAIN_HAND].name1 == ART_ICINGDEATH)
+        && (player_ptr->inventory_list[INVEN_SUB_HAND].name1 == ART_TWINKLE);
+}
+
+bool set_anubis_and_chariot(PlayerType *player_ptr)
+{
+    return (player_ptr->inventory_list[INVEN_MAIN_HAND].name1 == ART_ANUBIS) 
+        && (player_ptr->inventory_list[INVEN_SUB_HAND].name1 == ART_SILVER_CHARIOT);
+}
index cac0920..8b696bf 100644 (file)
@@ -38,3 +38,8 @@ bool is_echizen(PlayerType *player_ptr);
 bool is_chargeman(PlayerType *player_ptr);
 
 void stop_mouth(PlayerType *player_ptr);
+
+bool set_quick_and_tiny(PlayerType *player_ptr);
+bool set_musasi(PlayerType *player_ptr);
+bool set_icing_and_twinkle(PlayerType *player_ptr);
+bool set_anubis_and_chariot(PlayerType *player_ptr);