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は店の主との種族的相性補正を与える者です。ないと色々まずいのになぜ今まで動いていたのか。
ともかく面倒ですが必ず入れましょう。