トップ «前の日記(2018/12/16) 最新 次の日記(2018/12/18)» 編集

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分一本勝負


2018/12/17

[変愚蛮怒/開発]変愚蛮怒開発日誌part107…特別編「変愚蛮怒の技能実装例 ~剣は捨てても盾は捨てるなという名ゼリフを知らないのかよ~」

Roguelike Advent Calendar 2018の17日目です。肩こりと眠気でまた遅刻しました。ゆ る し て。

今回もしつこく記事のためという不純な動機で新しく盾技能などを追加してみようと思います。例によってブランチを切って調整などは済ませてから正規実装予定です。

盾技能の枠を追加する。

現在実装されている技能枠はマーシャルアーツ、乗馬、二刀流の三種。実装当初から配列上10枠用意してくれているため面倒になるセーブデータ処理の追加は行わずに済みそうです。

ただ、マジックナンバーはやめろください。ということで直しながら以下のように。

diff --git a/src/cmd4.c b/src/cmd4.c
index c698567..63afa94 100644
--- a/src/cmd4.c
+++ b/src/cmd4.c
@@ -5787,9 +5787,13 @@ static void do_cmd_knowledge_skill_exp(void)
 	FILE *fff;

 	char file_name[1024];
-	char skill_name[3][20]={_("マーシャルアーツ", "Martial Arts    "),
-							_("二刀流          ", "Dual Wielding   "),
-							_("乗馬            ", "Riding          ")};
+	char skill_name[GINOU_TEMPMAX][20] =
+	{
+		_("マーシャルアーツ", "Martial Arts    "),
+		_("二刀流          ", "Dual Wielding   "),
+		_("乗馬            ", "Riding          "),
+		_("盾              ", "Shield          ")
+	};

 	/* Open a new file */
 	fff = my_fopen_temp(file_name, 1024);
@@ -5799,7 +5803,7 @@ static void do_cmd_knowledge_skill_exp(void)
 	    return;
 	}

-	for (i = 0; i < 3; i++)
+	for (i = 0; i < GINOU_TEMPMAX; i++)
 	{
 		skill_exp = p_ptr->skill_exp[i];
 		fprintf(fff, "%-20s ", skill_name[i]);
diff --git a/src/defines.h b/src/defines.h
index ec8e7db..06d5052 100644
--- a/src/defines.h
+++ b/src/defines.h
@@ -4661,6 +4661,8 @@ extern int PlayerUID;
 #define GINOU_SUDE      0
 #define GINOU_NITOURYU  1
 #define GINOU_RIDING    2
+#define GINOU_SHIELD    3
+#define GINOU_TEMPMAX   4
 #define GINOU_MAX      10

1

s_info.txtに各職業ごとの初期値、最大値を指定する

上記の通り今のままではどんな職業でも初期値最大値が0なので、s_info.txtに新しく追加してやる必要があります。

長いのでdiff張りつけは略します。各職業ごとに追加。全く無関係な話ですが武器経験値は似たような武器であれこれ付けすぎて冗長な気はします。

盾技能上昇処理追加

盾を装備している時に、相手の攻撃をかわすことに成功した際に追加。

現状は惰性で他の技能値とほぼ似たような上昇条件です。

 src/melee1.c | 32 +++++++++++++++++++++++++++++---
 1 file changed, 29 insertions(+), 3 deletions(-)

diff --git a/src/melee1.c b/src/melee1.c
index 1406cac..e10c385 100644
--- a/src/melee1.c
+++ b/src/melee1.c
@@ -1455,8 +1455,8 @@ bool py_attack(POSITION y, POSITION x, BIT_FLAGS mode)

 		if (cur < max)
 		{
-			int ridinglevel = r_info[m_list[p_ptr->riding].r_idx].level;
-			int targetlevel = r_ptr->level;
+			DEPTH ridinglevel = r_info[m_list[p_ptr->riding].r_idx].level;
+			DEPTH targetlevel = r_ptr->level;
 			int inc = 0;

 			if ((cur / 200 - 5) < targetlevel)
@@ -1472,7 +1472,6 @@ bool py_attack(POSITION y, POSITION x, BIT_FLAGS mode)
 			}

 			p_ptr->skill_exp[GINOU_RIDING] = MIN(max, cur + inc);
-
 			p_ptr->update |= (PU_BONUS);
 		}
 	}
@@ -3224,6 +3223,33 @@ bool make_attack_normal(MONSTER_IDX m_idx)
 #endif

 				}
+
+				/* Gain shield experience */
+				if (object_is_armour(&inventory[INVEN_RARM]) || object_is_armour(&inventory[INVEN_LARM]))
+				{
+					int cur = p_ptr->skill_exp[GINOU_SHIELD];
+					int max = s_info[p_ptr->pclass].s_max[GINOU_SHIELD];
+
+					if (cur < max)
+					{
+						DEPTH targetlevel = r_ptr->level;
+						int inc = 0;
+
+
+						/* Extra experience */
+						if ((cur / 100) < targetlevel)
+						{
+							if ((cur / 100 + 15) < targetlevel)
+								inc += 1 + (targetlevel - (cur / 100 + 15));
+							else
+								inc += 1;
+						}
+
+						p_ptr->skill_exp[GINOU_SHIELD] = MIN(max, cur + inc);
+						p_ptr->update |= (PU_BONUS);
+					}
+				}
+
 				damage = 0;

 				break;

盾技能によるAC修正追加

例によってデカいcalc_bonuses()内にぽつりと。追加ACが最大+12は小さいか大きいか、正式実装までには調整したいと思います。

diff --git a/src/xtra1.c b/src/xtra1.c
index 3795201..3a84445 100644
--- a/src/xtra1.c
+++ b/src/xtra1.c
@@ -4355,6 +4355,13 @@ void calc_bonuses(void)
 		}
 	}

+	/* Shield skill bonus */
+	if (object_is_armour(&inventory[INVEN_RARM]) || object_is_armour(&inventory[INVEN_LARM]))
+	{
+		p_ptr->ac += p_ptr->skill_exp[GINOU_SHIELD] * (1 + p_ptr->lev / 22) / 2000;
+		p_ptr->dis_ac += p_ptr->skill_exp[GINOU_SHIELD] * (1 + p_ptr->lev / 22) / 2000;
+	}
+
 	if (old_mighty_throw != p_ptr->mighty_throw)
 	{
 		/* Redraw average damege display of Shuriken */

2

技能値8000でレベル6ならば+4修正。2(耐久修正)+3(盾AC)+14(鎧AC)+4=23で計算通り。

こんなんなりました。以上!終わり!閉廷!