トップ «前の日記(2018/12/14) 最新 次の日記(2018/12/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分一本勝負


2018/12/15

[変愚蛮怒/開発]変愚蛮怒開発日誌part106…特別編「変愚蛮怒の種族実装例 ~MtGの主に青いヤクザ種族~(後編)」

前回から続けていきます。

水地形にいるか否か、浮遊しているかどうかで加速したり減速したりする。

MtGのマーフォークは各次元(ともすれば絵師)によって下半身が魚や水蛇っぽかったり、二本脚であったり、それを時々に応じて変化させたり様々なようですが、総じて水中での機動に長けていて、陸上でも活動はできるが限度があるようです。

それに即して以下のようなルールを考えます。

  • 水地形(FF_WATERフラグ付き)の地形に入っている間は2+(レベル)/10の加速がつく。
  • それ以外の地形で浮遊を持っていない場合、加速-2。

これを実装するために、move_player_effect()の地形参照処理を直した上で、移動前と移動後の水地形の是非が切り替わる毎にプレイヤーの修正更新処理を呼び出すよう追加します。丁度前後には忍者の超隠密や早駆けの切替処理があります。

diff --git a/src/cmd1.c b/src/cmd1.c
index 5efc9be..c78e626 100644
--- a/src/cmd1.c
+++ b/src/cmd1.c
@@ -826,16 +826,17 @@ bool player_can_enter(s16b feature, u16b mode)
  */
 bool move_player_effect(POSITION ny, POSITION nx, BIT_FLAGS mpe_mode)
 {
+	POSITION oy = p_ptr->y;
+	POSITION ox = p_ptr->x;
 	cave_type *c_ptr = &cave[ny][nx];
+	cave_type *oc_ptr = &cave[oy][ox];
 	feature_type *f_ptr = &f_info[c_ptr->feat];
+	feature_type *of_ptr = &f_info[oc_ptr->feat];

 	if (!(mpe_mode & MPE_STAYING))
 	{
-		POSITION oy = p_ptr->y;
-		POSITION ox = p_ptr->x;
-		cave_type *oc_ptr = &cave[oy][ox];
-		IDX om_idx = oc_ptr->m_idx;
-		IDX nm_idx = c_ptr->m_idx;
+		MONSTER_IDX om_idx = oc_ptr->m_idx;
+		MONSTER_IDX nm_idx = c_ptr->m_idx;

 		/* Move the player */
 		p_ptr->y = ny;
@@ -885,7 +886,6 @@ bool move_player_effect(POSITION ny, POSITION nx, BIT_FLAGS mpe_mode)
 		}

 		p_ptr->update |= (PU_VIEW | PU_LITE | PU_FLOW | PU_MON_LITE | PU_DISTANCE);
-
 		p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);

 		/* Remove "unsafe" flag */
@@ -908,6 +908,15 @@ bool move_player_effect(POSITION ny, POSITION nx, BIT_FLAGS mpe_mode)
 			msg_print(_("ここでは素早く動けない。", "You cannot run in here."));
 			set_action(ACTION_NONE);
 		}
+
+		if (p_ptr->prace == RACE_MERFOLK)
+		{
+			if(have_flag(f_ptr->flags, FF_WATER) ^ have_flag(of_ptr->flags, FF_WATER))
+			{
+				p_ptr->update |= PU_BONUS;
+				update_stuff();
+			}
+		}
 	}

 	if (mpe_mode & MPE_ENERGY_USE)

calc_bonuses()の種族特性switch文に以下のように条件を追加します。

@@ -3773,6 +3776,15 @@ void calc_bonuses(void)
 			break;
 		case RACE_MERFOLK:
 			p_ptr->resist_water = TRUE;
+			if(have_flag(f_ptr->flags, FF_WATER))
+			{
+				new_speed += (2 + p_ptr->lev / 10);
+			}
+			else if(!p_ptr->levitation)
+			{
+				new_speed -= 2;
+			}
+			break;
 		default:
 			/* Do nothing */
 			;

おまけに浮遊の指輪を装備させる。

この実装を済ませた上で、ちょっと戦士で盗賊クエに行ったのですがちょっと参りました。最序盤の減速-2はかなり大きく、追い剥ぎとやり合ってギリで負けています。実際-2は通常の0.8倍になってしまうのですから厳しいかも知れません。

減速を-1としてもいいですが、そもそも自力救済が求められるような世界で、従来水棲の種族が地上で長く滞在する以上は、魔法の装備で問題を軽減するのも当然かも知れません。

浮遊の指輪自体は最序盤のアイテムにして、早々に装備枠を逼迫させる要因になる程度のものですし、種族マーフォークを選んでいる場合は常に浮遊の指輪を与えることにしましょう。

birth.cにplayer_outfit()への追加を行います。

diff --git a/src/birth.c b/src/birth.c
index 142896f..ad99a51 100644
--- a/src/birth.c
+++ b/src/birth.c
@@ -2393,6 +2393,13 @@ void player_outfit(void)
 	}
 	q_ptr = &forge;

+	if (p_ptr->prace == RACE_MERFOLK)
+	{
+		object_prep(q_ptr, lookup_kind(TV_RING, SV_RING_LEVITATION_FALL));
+		q_ptr->number = 1;
+		add_outfit(q_ptr);
+	}
+
 	if ((p_ptr->pclass == CLASS_RANGER) || (p_ptr->pclass == CLASS_CAVALRY))
 	{
 		/* Hack -- Give the player some arrows */

calc_bonuses()のミスを修正

ここまでで浮遊の指輪を自動装備させて気づきました。calc_bonuses()内の処理で装備による浮遊がTRUEになる前から、マーフォークの減速判定を行っているため、適用がされていません。プレイヤー自身の耐性や能力などに関わる処理はcalc_bonuses()の後半に回しましょう。

---
 src/xtra1.c | 22 ++++++++++++++--------
 1 file changed, 14 insertions(+), 8 deletions(-)

diff --git a/src/xtra1.c b/src/xtra1.c
index 2065f39..40cd5bf 100644
--- a/src/xtra1.c
+++ b/src/xtra1.c
@@ -3776,14 +3776,6 @@ void calc_bonuses(void)
 			break;
 		case RACE_MERFOLK:
 			p_ptr->resist_water = TRUE;
-			if(have_flag(f_ptr->flags, FF_WATER))
-			{
-				new_speed += (2 + p_ptr->lev / 10);
-			}
-			else if(!p_ptr->levitation)
-			{
-				new_speed -= 2;
-			}
 			break;
 		default:
 			/* Do nothing */
@@ -4898,6 +4890,20 @@ void calc_bonuses(void)
 	/* Searching slows the player down */
 	if (p_ptr->action == ACTION_SEARCH) new_speed -= 10;

+	/* Feature bonus */
+	if(p_ptr->prace == RACE_MERFOLK)
+	{
+		if (have_flag(f_ptr->flags, FF_WATER))
+		{
+			new_speed += (2 + p_ptr->lev / 10);
+		}
+		else if (!p_ptr->levitation)
+		{
+			new_speed -= 2;
+		}
+	}
+
+
 	/* Actual Modifier Bonuses (Un-inflate stat bonuses) */
 	p_ptr->to_a += ((int)(adj_dex_ta[p_ptr->stat_ind[A_DEX]]) - 128);
 	p_ptr->to_d[0] += ((int)(adj_str_td[p_ptr->stat_ind[A_STR]]) - 128);

大体できました

この位まで実装すれば、種族としての特化は十分にできたと思います。まだ、生い立ち設定、援軍指定とか本当に正式に詰めることは、細々とありますが、一旦ここで完結とさせてもらおうと思います。

正式なアップは2.2.2として調整済ませて出します。お楽しみに。

マーフォーク

2019/02/14 追記 マーフォーク用の rgold_adj を追加

忘れていました(小声)rgold_adjは店の主との種族的相性補正を与える者です。ないと色々まずいのになぜ今まで動いていたのか。

ともかく面倒ですが必ず入れましょう。