OSDN Git Service

[Fix] サウロンが確率ドロップを両方落とす #212
authordis- <dis.rogue@gmail.com>
Sat, 20 Feb 2021 13:24:52 +0000 (22:24 +0900)
committerdis- <dis.rogue@gmail.com>
Sun, 21 Feb 2021 02:07:21 +0000 (11:07 +0900)
モンスター固有のアーティファクトをドロップする処理 get_artifact_index()内にて、複数のドロップ候補がある場合の処理に問題があった。
一つ目の候補がドロップした時点で処理を打ち切っていないため、二つ以上の候補が同時にドロップする場合があった。
フレーバー等を考慮し、ドロップが一つ確定した時点で以降の処理を打ち切る。

サウロンのドロップテーブルの数値がおかしくく、金無垢の指輪を100%ドロップしていたので、これを修正し正しい数値の10%とする。

仕様変更によりスルトがオーブしか落とさなくなるので、オーブ50%ドロップ、オーブを落とさなかったとき神々の黄昏ドロップに仕様変更とする。

get_artifact_index()内にartifact生成の処理があることから、関数名をdrop_artifact_index()に変更する。

lib/edit/r_info.txt
src/monster-floor/monster-death.c

index 0067637..e3f6e3c 100644 (file)
@@ -16860,7 +16860,7 @@ F:IM_FIRE | NO_CONF | NO_SLEEP | IM_POIS | HURT_COLD | GIANT |
 S:1_IN_5 |
 S:BR_FIRE | BR_PLAS | BLIND | TELE_TO | S_KIN | S_HI_UNDEAD |
 S:HAND_DOOM | TELE_AWAY | S_CYBER | S_DEMON
-A:245:3:100
+A:245:3:50
 A:78:1:100
 D:$Surtur is also one of the most ancient of all creatures. He is a demonic 
 D:$giant of fire, who is destined to set the nine worlds afire with his 
@@ -17499,7 +17499,7 @@ S:BO_ICEE | BO_MANA | BO_PLAS |
 S:BA_MANA | BA_FIRE | BA_WATE | BA_NETH | BA_DARK | 
 S:S_MONSTERS | S_DEMON | S_HI_UNDEAD | S_HI_DRAGON |
 S:HAND_DOOM | ANIM_DEAD | DISPEL | PSY_SPEAR
-A:13:10:100
+A:13:10:10
 A:14:1:100
 D:$Mighty in spells and enchantments,
 D:$he created the One Ring.  His eyes glow with power and his gaze seeks to 
index 99ed107..b728915 100644 (file)
@@ -142,7 +142,7 @@ static void drop_corpse(player_type *player_ptr, monster_death_type *md_ptr)
  * @param md_ptr モンスター死亡構造体への参照ポインタ
  * @return 何かドロップするなら1以上、何もドロップしないなら0
  */
-static ARTIFACT_IDX get_artifact_index(player_type *player_ptr, monster_death_type *md_ptr)
+static ARTIFACT_IDX drop_artifact_index(player_type *player_ptr, monster_death_type *md_ptr)
 {
     ARTIFACT_IDX a_idx = 0;
     PERCENTAGE chance = 0;
@@ -164,11 +164,13 @@ static ARTIFACT_IDX get_artifact_index(player_type *player_ptr, monster_death_ty
             if (current_world_ptr->character_dungeon)
                 a_ptr->floor_id = player_ptr->floor_id;
 
-            continue;
+            break;
         }
 
-        if (!preserve_mode)
+        if (!preserve_mode) {
             a_ptr->cur_num = 1;
+            break;
+        }
     }
 
     return a_idx;
@@ -201,7 +203,7 @@ static void drop_artifact(player_type *player_ptr, monster_death_type *md_ptr)
     if (!md_ptr->drop_chosen_item)
         return;
 
-    ARTIFACT_IDX a_idx = get_artifact_index(player_ptr, md_ptr);
+    ARTIFACT_IDX a_idx = drop_artifact_index(player_ptr, md_ptr);
     if (((md_ptr->r_ptr->flags7 & RF7_GUARDIAN) == 0) || (d_info[player_ptr->dungeon_idx].final_guardian != md_ptr->m_ptr->r_idx))
         return;