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
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 */
技能値8000でレベル6ならば+4修正。2(耐久修正)+3(盾AC)+14(鎧AC)+4=23で計算通り。
こんなんなりました。以上!終わり!閉廷!