トップ «前の日記(2013/06/14) 最新 次の日記(2013/06/16)» 編集

SikabaneWorksが関係するコンテンツ(主に*band系ローグライク)の開発近況・補足から全く個人的な雑記まで。

[WEB:屍の見える丘公園]| [RSS]

Angband | Badiashimshe | C# | CRAUZEL | D'angband/小説草稿 | D'angband/開発 | DarkSouls | Demon'sSouls | DungeonCrawl | ElvenUteruses | Haskell | Hengband | J9シリーズ | LEGO | LineDrawing | MISC | MTG | Mac | Math | Moria | R-18 | Roguelike | Rough | RoughSketch | Ruby | SDL | UNIX | VMware | WarHammer | Zangband | アタシラヂョウヲウ | イラスト | ガジェット | ゲーム | ゲーム紹介 | ゲーム製作技術 | ゲーム論 | スケッチ | ツクール | テクノロジー | ニコニコ動画 | ファルコム | ファンタジー | マリオ | ヴィーヤウトゥムノ | 別記事追加予定 | 変愚蛮怒 | 変愚蛮怒/スポイラー | 変愚蛮怒/元ネタ探訪 | 変愚蛮怒/攻略 | 変愚蛮怒/開発 | 宗教 | 情報 | 政治 | 文字コード | 日ペ昔話 | 東方ワンドロ | 東方外法漢女 | 歴史 | 漫画製作 | 版権絵 | 画像処理 | 翻訳 | 自然言語 | 艦隊これくしょん | 落書き | 言語解析 | 読書 | 超人ロック | 追記予定 | 通信 | 阿片窟 | 馬鹿馬鹿蛮怒/開発 | 魔法少女まどか☆マギカ | 魚類版深夜の真剣お絵描き60分一本勝負


2013/06/15

[変愚蛮怒/開発]パッチを解読してみる・機能:ランダムユニークモンスター

今回は個人的にビンビン感じまくるランダムユニークモンスターパッチの検証をば。これとは別にエゴモンスターパッチなるものもあるが、どうもリンク切れ起こしてる可能性が微レ存か。

なお今回、かなりいい加減にパッチファイルを切り取りコピペ整理しているので、パッチ場所指定記述が大分おかしくなっている所がある多い。ご了承を。

モンスター種族IDの設定方法

ランダムユニークは m_ptr->ego_race ポインタの参照先 にユニークモンスター種族情報の参照先を保管し、必要に応じてr_ptrの参照先を切り替えて実装を行っているらしい。100近い場所が以下の形に置換されている。

-			r_ptr = &r_info[m_ptr->r_idx];
+			r_ptr = m_ptr->ego_race? m_ptr->ego_race: &r_info[m_ptr->r_idx];

セーブデータ上に情報追加

diff -u -rN hengband/src/defines.h hengband-ego/src/defines.h
--- hengband/src/defines.h	2007-02-04 21:24:20.620307200 +0900
+++ hengband-ego/src/defines.h	2007-02-04 21:24:25.056686400 +0900
@@ -5357,6 +5357,8 @@
 #define SAVE_MON_MFLAG2       0x00002000
 #define SAVE_MON_NICKNAME     0x00004000
 #define SAVE_MON_PARENT       0x00008000
+// EGOMON
+#define SAVE_MON_EGO          0x00010000

diff -u -rN hengband/src/load.c hengband-ego/src/load.c
--- hengband/src/load.c	2007-02-04 21:24:21.511588800 +0900
+++ hengband-ego/src/load.c	2007-02-04 21:24:25.967996800 +0900
@@ -903,6 +903,27 @@

 	if (flags & SAVE_MON_PARENT) rd_s16b(&m_ptr->parent_m_idx);
 	else m_ptr->parent_m_idx = 0;
+
+    // EGOMON
+	if (flags & SAVE_MON_EGO) {
+        m_ptr->ego_race = RNEW(monster_race);
+        memcpy(m_ptr->ego_race,&r_info[m_ptr->r_idx],sizeof(monster_race));
+        //
+        rd_s16b(&m_ptr->ego_race->ac);
+        rd_s32b(&m_ptr->ego_race->mexp);
+        rd_byte(&m_ptr->ego_race->freq_spell);
+        rd_u32b(&m_ptr->ego_race->flags1);
+        rd_u32b(&m_ptr->ego_race->flags2);
+        rd_u32b(&m_ptr->ego_race->flags3);
+        rd_u32b(&m_ptr->ego_race->flags4);
+        rd_u32b(&m_ptr->ego_race->flags5);
+        rd_u32b(&m_ptr->ego_race->flags6);
+        rd_u32b(&m_ptr->ego_race->flags7);
+        rd_u32b(&m_ptr->ego_race->flags8);
+        rd_u32b(&m_ptr->ego_race->flags9);
+        rd_u32b(&m_ptr->ego_race->flagsr);
+    }
+	else m_ptr->ego_race = NULL;
 }
@@ -262,6 +263,22 @@
 	if (flags & SAVE_MON_MFLAG2) wr_byte(m_ptr->mflag2);
 	if (flags & SAVE_MON_NICKNAME) wr_string(quark_str(m_ptr->nickname));
 	if (flags & SAVE_MON_PARENT) wr_s16b(m_ptr->parent_m_idx);
+    // EGOMON
+    if (flags & SAVE_MON_EGO){
+        wr_s16b(m_ptr->ego_race->ac);
+        wr_s32b(m_ptr->ego_race->mexp);
+        wr_byte(m_ptr->ego_race->freq_spell);
+        wr_u32b(m_ptr->ego_race->flags1);
+        wr_u32b(m_ptr->ego_race->flags2);
+        wr_u32b(m_ptr->ego_race->flags3);
+        wr_u32b(m_ptr->ego_race->flags4);
+        wr_u32b(m_ptr->ego_race->flags5);
+        wr_u32b(m_ptr->ego_race->flags6);
+        wr_u32b(m_ptr->ego_race->flags7);
+        wr_u32b(m_ptr->ego_race->flags8);
+        wr_u32b(m_ptr->ego_race->flags9);
+        wr_u32b(m_ptr->ego_race->flagsr);
+    }
 }
@@ -204,6 +203,8 @@
 	if (m_ptr->mflag2) flags |= SAVE_MON_MFLAG2;
 	if (m_ptr->nickname) flags |= SAVE_MON_NICKNAME;
 	if (m_ptr->parent_m_idx) flags |= SAVE_MON_PARENT;
+    // EGOMON
+	if (m_ptr->ego_race) flags |= SAVE_MON_EGO;

 	/*** Monster save flags ***/
 	wr_u32b(flags);

構造体に型追加

diff -u -rN hengband/src/types.h hengband-ego/src/types.h
--- hengband/src/types.h	2007-02-04 21:24:23.544512000 +0900
+++ hengband-ego/src/types.h	2007-02-04 21:24:28.050992000 +0900
@@ -610,6 +610,8 @@
 	u32b smart;			/* Field for "smart_learn" */

 	s16b parent_m_idx;
+    // EGOMON
+    monster_race* ego_race;
 };

ユニークモンスターとしての強化処理

こういうのご飯三杯いける。

@@ -3142,6 +3142,150 @@
 	/* Get a new monster record */
 	m_ptr = &m_list[c_ptr->m_idx];

+    // EGOMON
+    if(one_in_(333)){
+        m_ptr->ego_race = RNEW(monster_race);
+        memcpy(m_ptr->ego_race,r_ptr,sizeof(monster_race));
+        m_ptr->ego_race->ac = m_ptr->ego_race->ac * rand_range(100,150) / 100;
+        m_ptr->ego_race->mexp = m_ptr->ego_race->mexp * rand_range(150,200) / 100;
+        m_ptr->ego_race->flags1 |= RF1_DROP_GOOD;
+        if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags1 |= RF1_DROP_GREAT;
+        if(one_in_(2000/(r_ptr->level+1))) m_ptr->ego_race->flags2 |= RF2_STUPID;
+        if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags2 |= RF2_SMART;
+        if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags2 |= RF2_CAN_SPEAK;
+        if(one_in_(2000/(r_ptr->level+1))) m_ptr->ego_race->flags2 |= RF2_REFLECTING;
+        if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags2 |= RF2_EMPTY_MIND;
+        if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags2 |= RF2_WEIRD_MIND;
+        m_ptr->ego_race->flags2 &= ~RF2_MULTIPLY;
+        if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags2 |= RF2_REGENERATE;
+        if(one_in_(2000/(r_ptr->level+1))) m_ptr->ego_race->flags2 |= RF2_AURA_FIRE;
+        if(one_in_(2000/(r_ptr->level+1))) m_ptr->ego_race->flags2 |= RF2_AURA_ELEC;
+        if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags2 |= RF2_OPEN_DOOR;
+        if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags2 |= RF2_BASH_DOOR;
+        if(one_in_(4000/(r_ptr->level+1))) m_ptr->ego_race->flags2 |= RF2_PASS_WALL;
+        if(one_in_(4000/(r_ptr->level+1))) m_ptr->ego_race->flags2 |= RF2_KILL_WALL;
+        if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags2 |= RF2_MOVE_BODY;
+        if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags2 |= RF2_KILL_BODY;
+        if(one_in_(2000/(r_ptr->level+1))) m_ptr->ego_race->flags2 |= RF2_TAKE_ITEM;
+        if(one_in_(2000/(r_ptr->level+1))) m_ptr->ego_race->flags2 |= RF2_KILL_ITEM;
+        if(one_in_(2000/(r_ptr->level+1))) m_ptr->ego_race->flags3 |= RF3_GOOD;
+        if(one_in_(2000/(r_ptr->level+1))) m_ptr->ego_race->flags3 |= RF3_AURA_COLD;
+        if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags3 |= RF3_NO_FEAR;
+        if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags3 |= RF3_NO_STUN;
+        if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags3 |= RF3_NO_CONF;
+        if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags3 |= RF3_NO_SLEEP;
+        if(one_in_(2000/(r_ptr->level+1))) m_ptr->ego_race->flags4 |= RF4_SHRIEK;
+        if(one_in_(2000/(r_ptr->level+1))) m_ptr->ego_race->flags4 |= RF4_DISPEL;
+        if(one_in_(4000/(r_ptr->level+1))) m_ptr->ego_race->flags4 |= RF4_ROCKET;
+        if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags4 |= RF4_SHOOT;
+        if(one_in_(2000/(r_ptr->level+1))) m_ptr->ego_race->flags4 |= RF4_BR_ACID;
+        if(one_in_(2000/(r_ptr->level+1))) m_ptr->ego_race->flags4 |= RF4_BR_ELEC;
+        if(one_in_(2000/(r_ptr->level+1))) m_ptr->ego_race->flags4 |= RF4_BR_FIRE;
+        if(one_in_(2000/(r_ptr->level+1))) m_ptr->ego_race->flags4 |= RF4_BR_COLD;
+        if(one_in_(2000/(r_ptr->level+1))) m_ptr->ego_race->flags4 |= RF4_BR_POIS;
+        if(one_in_(2000/(r_ptr->level+1))) m_ptr->ego_race->flags4 |= RF4_BR_NETH;
+        if(one_in_(2000/(r_ptr->level+1))) m_ptr->ego_race->flags4 |= RF4_BR_LITE;
+        if(one_in_(2000/(r_ptr->level+1))) m_ptr->ego_race->flags4 |= RF4_BR_DARK;
+        if(one_in_(2000/(r_ptr->level+1))) m_ptr->ego_race->flags4 |= RF4_BR_CONF;
+        if(one_in_(2000/(r_ptr->level+1))) m_ptr->ego_race->flags4 |= RF4_BR_SOUN;
+        if(one_in_(2000/(r_ptr->level+1))) m_ptr->ego_race->flags4 |= RF4_BR_CHAO;
+        if(one_in_(2000/(r_ptr->level+1))) m_ptr->ego_race->flags4 |= RF4_BR_DISE;
+        if(one_in_(2000/(r_ptr->level+1))) m_ptr->ego_race->flags4 |= RF4_BR_NEXU;
+        if(one_in_(2000/(r_ptr->level+1))) m_ptr->ego_race->flags4 |= RF4_BR_TIME;
+        if(one_in_(2000/(r_ptr->level+1))) m_ptr->ego_race->flags4 |= RF4_BR_INER;
+        if(one_in_(2000/(r_ptr->level+1))) m_ptr->ego_race->flags4 |= RF4_BR_GRAV;
+        if(one_in_(2000/(r_ptr->level+1))) m_ptr->ego_race->flags4 |= RF4_BR_SHAR;
+        if(one_in_(2000/(r_ptr->level+1))) m_ptr->ego_race->flags4 |= RF4_BR_PLAS;
+        if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags4 |= RF4_BA_NUKE;
+        if(one_in_(2000/(r_ptr->level+1))) m_ptr->ego_race->flags4 |= RF4_BR_NUKE;
+        if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags4 |= RF4_BA_CHAO;
+        if(one_in_(2000/(r_ptr->level+1))) m_ptr->ego_race->flags4 |= RF4_BR_DISI;
+        if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags5 |= RF5_BA_ACID;
+        if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags5 |= RF5_BA_ELEC;
+        if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags5 |= RF5_BA_FIRE;
+        if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags5 |= RF5_BA_COLD;
+        if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags5 |= RF5_BA_POIS;
+        if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags5 |= RF5_BA_NETH;
+        if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags5 |= RF5_BA_WATE;
+        if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags5 |= RF5_BA_MANA;
+        if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags5 |= RF5_BA_DARK;
+        if(one_in_(2000/(r_ptr->level+1))) m_ptr->ego_race->flags5 |= RF5_DRAIN_MANA;
+        if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags5 |= RF5_MIND_BLAST;
+        if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags5 |= RF5_BRAIN_SMASH;
+        if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags5 |= RF5_CAUSE_1;
+        if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags5 |= RF5_CAUSE_2;
+        if(one_in_(2000/(r_ptr->level+1))) m_ptr->ego_race->flags5 |= RF5_CAUSE_3;
+        if(one_in_(2000/(r_ptr->level+1))) m_ptr->ego_race->flags5 |= RF5_CAUSE_4;
+        if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags5 |= RF5_BO_ACID;
+        if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags5 |= RF5_BO_ELEC;
+        if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags5 |= RF5_BO_FIRE;
+        if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags5 |= RF5_BO_COLD;
+        if(one_in_(2000/(r_ptr->level+1))) m_ptr->ego_race->flags5 |= RF5_BA_LITE;
+        if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags5 |= RF5_BO_NETH;
+        if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags5 |= RF5_BO_WATE;
+        if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags5 |= RF5_BO_MANA;
+        if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags5 |= RF5_BO_PLAS;
+        if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags5 |= RF5_BO_ICEE;
+        if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags5 |= RF5_MISSILE;
+        if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags5 |= RF5_SCARE;
+        if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags5 |= RF5_BLIND;
+        if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags5 |= RF5_CONF;
+        if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags5 |= RF5_SLOW;
+        if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags5 |= RF5_HOLD;
+        if(one_in_(2000/(r_ptr->level+1))) m_ptr->ego_race->flags6 |= RF6_HASTE;
+        if(one_in_(2000/(r_ptr->level+1))) m_ptr->ego_race->flags6 |= RF6_HAND_DOOM;
+        if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags6 |= RF6_HEAL;
+        if(one_in_(4000/(r_ptr->level+1))) m_ptr->ego_race->flags6 |= RF6_INVULNER;
+        if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags6 |= RF6_BLINK;
+        if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags6 |= RF6_TPORT;
+        if(one_in_(4000/(r_ptr->level+1))) m_ptr->ego_race->flags6 |= RF6_WORLD;
+        if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags6 |= RF6_TELE_TO;
+        if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags6 |= RF6_TELE_AWAY;
+        if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags6 |= RF6_TELE_LEVEL;
+        if(one_in_(2000/(r_ptr->level+1))) m_ptr->ego_race->flags6 |= RF6_PSY_SPEAR;
+        if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags6 |= RF6_DARKNESS;
+        if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags6 |= RF6_TRAPS;
+        if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags6 |= RF6_FORGET;
+        if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags6 |= RF6_RAISE_DEAD;
+        if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags6 |= RF6_S_KIN;
+        if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags6 |= RF6_S_CYBER;
+        if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags6 |= RF6_S_MONSTER;
+        if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags6 |= RF6_S_MONSTERS;
+        if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags6 |= RF6_S_ANT;
+        if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags6 |= RF6_S_SPIDER;
+        if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags6 |= RF6_S_HOUND;
+        if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags6 |= RF6_S_HYDRA;
+        if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags6 |= RF6_S_ANGEL;
+        if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags6 |= RF6_S_DEMON;
+        if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags6 |= RF6_S_UNDEAD;
+        if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flags6 |= RF6_S_DRAGON;
+        if(one_in_(2000/(r_ptr->level+1))) m_ptr->ego_race->flags6 |= RF6_S_HI_UNDEAD;
+        if(one_in_(2000/(r_ptr->level+1))) m_ptr->ego_race->flags6 |= RF6_S_HI_DRAGON;
+        if(one_in_(4000/(r_ptr->level+1))) m_ptr->ego_race->flags6 |= RF6_S_AMBERITES;
+        if(one_in_(4000/(r_ptr->level+1))) m_ptr->ego_race->flags6 |= RF6_S_UNIQUE;
+        if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flagsr |= RFR_IM_ACID;
+        if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flagsr |= RFR_IM_ELEC;
+        if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flagsr |= RFR_IM_FIRE;
+        if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flagsr |= RFR_IM_COLD;
+        if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flagsr |= RFR_IM_POIS;
+        if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flagsr |= RFR_RES_LITE;
+        if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flagsr |= RFR_RES_DARK;
+        if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flagsr |= RFR_RES_NETH;
+        if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flagsr |= RFR_RES_WATE;
+        if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flagsr |= RFR_RES_PLAS;
+        if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flagsr |= RFR_RES_SHAR;
+        if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flagsr |= RFR_RES_SOUN;
+        if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flagsr |= RFR_RES_CHAO;
+        if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flagsr |= RFR_RES_NEXU;
+        if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flagsr |= RFR_RES_DISE;
+        if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flagsr |= RFR_RES_WALL;
+        if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flagsr |= RFR_RES_INER;
+        if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flagsr |= RFR_RES_TIME;
+        if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flagsr |= RFR_RES_GRAV;
+        if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flagsr |= RFR_RES_ALL;
+        if(one_in_(1000/(r_ptr->level+1))) m_ptr->ego_race->flagsr |= RFR_RES_TELE;
+    }
+
 	/* Save the race */
 	m_ptr->r_idx = r_idx;
 	m_ptr->ap_r_idx = initial_r_appearance(r_idx);

ユニークとしての独自名追加

@@ -3183,6 +3327,12 @@
 	reset_target(m_ptr);

 	m_ptr->nickname = 0;
+    // EGOMON
+    if(m_ptr->ego_race){
+        char buffer[16];
+        get_table_name_aux(buffer);
+        m_ptr->nickname = quark_add(buffer);
+    }

 	m_ptr->exp = 0;

HP強化

単純に3/2倍になる模様。

@@ -3250,6 +3400,10 @@
 	{
 		m_ptr->max_maxhp = damroll(r_ptr->hdice, r_ptr->hside);
 	}
+    // EGOMON
+    if(m_ptr->ego_race){
+        m_ptr->max_maxhp = m_ptr->max_maxhp * 3 / 2;
+    }

 	/* Monsters have double hitpoints in Nightmare mode */
 	if (ironman_nightmare)

加速強化

+0が内部で110と扱われている中で5/4倍はやばいですよ!先輩!

序盤の@こわれちゃーう。

@@ -3269,6 +3423,11 @@

 	/* Extract the monster base speed */
 	m_ptr->mspeed = get_mspeed(r_ptr);
+    // EGOMON
+    if(m_ptr->ego_race){
+        m_ptr->mspeed = m_ptr->mspeed * 5 / 4;
+        if(m_ptr->mspeed > 199) m_ptr->mspeed = 199;
+    }

 	if (mode & PM_HASTE) (void)set_monster_fast(c_ptr->m_idx, 100);

[D'angband/開発]D'angband開発日誌 part42…アイテム生成処理の再実装(2)

0

Hunahyanda

辺土SATSUGAI流開祖『フナヒヤンダ』
デバッグ機能の高級品生成機能中の出来事か。
安っぽい大鉄杖だなあ。

Udindae

兵器の悪魔『ウディンダイ』
我等が盟主の黒き槍に並ぶ一品が、悲しいなぁ。
INSTA_ARTや階層による生成率がまともに働いておらん模様。

Hunahyanda

辺土SATSUGAI流開祖『フナヒヤンダ』
そもそも元の変愚じゃこの辺のカスエゴは整理されたんだろ、
D'angじゃどうする気なんだろうな。

Udindae

兵器の悪魔『ウディンダイ』
仕様そのものが変わっているし、
独自の調整がかかるんじゃないかな。一応案はあるらしい。

1

Udindae

兵器の悪魔『ウディンダイ』
とりあえず、表記の符号表示が足りなかったり、
何故か高級品だと無条件にto ACがつく不具合を修正したと思いきや…

Hunahyanda

辺土SATSUGAI流開祖『フナヒヤンダ』
今度は魔法的修正がつかんよ~頼むよ~

2

Udindae

兵器の悪魔『ウディンダイ』
ま、こんなところかな。

Hunahyanda

辺土SATSUGAI流開祖『フナヒヤンダ』
そもそも変愚と比べて、ACに余計なパラメータが二種類加わってることの
説明はどうするんだよ。EVとかVOとか察しができる人やこれまでの
中の奴のツイート気長に見てきた人しか理解できまい。

Udindae

兵器の悪魔『ウディンダイ』
次回からそこを調整がてら説明しようか。

[ヴィーヤウトゥムノ] [U] ドリードロード『ツエラクス』/Tselakus, the Dreadlord (L.Red 'G')

=== Num:792  Lev:68  Rar:2  Spd:+20  Hp:6500  Ac:150  Exp:35000
この存在自体が侮辱的な人間は、辺りの空間の構造をゆがめて引き裂いている。
強力な魔法の熟練者であるツエラクスは、冒険者の柔らかい肉に飢えている。ツ
エラクスの持つ暗闇を発する松明が通った後には、死と破壊の痕跡しか残されな
い。ツエラクスは常に軽蔑的な冷笑を絶やさず、彼を倒そうとする冒険者の哀れ
な努力をせせら笑っている。強力な爪で現実を引き裂き、通り道にあるもの全て
を消滅させながら、冒険者の魂に向かってくる。
彼は通常地下 68 階で出現し、非常に素早く動いている。この邪悪なるアンデッ
ドのモンスターを倒すことは 50 レベルのキャラクタにとって 約45769.23 ポイ
ントの経験となる。彼は氷に包まれている。彼は魔法を使うことができ、地獄
球、暗黒の嵐、目くらまし、混乱、麻痺、救援召喚、強力なアンデッド召喚、ア
ンバーの王族召喚の呪文を唱えることがある(確率:1/3)。彼は AC150 の防御力と
6500 の体力がある。彼はダンジョンを暗くし、壁をすり抜けることができる。彼
は透明で目に見えない。彼は冷血動物である。彼は冷気と毒と地獄の耐性を持っ
ている。彼は混乱しないし、眠らされない。彼は侵入者を幾分注意深く見ており、
200 フィート先から侵入者に気付くことがある。彼は 14 個までの上質なアイテ
ムを持っていることがある。彼は 10d10 のダメージで殴って攻撃し、 10d10 の
ダメージで殴って攻撃し、 4d6 のダメージで殴って腕力を減少させ、 4d6 のダ
メージで殴って腕力を減少させる。

Tselakus

Hunahyanda

辺土SATSUGAI流開祖『フナヒヤンダ』
おうアンバー呼ぶなや!

Udindae

兵器の悪魔『ウディンダイ』
ヴァニラの頃はナズグル召喚だったんだよねえ…あっ…(察し)