街は休まる場所でなくてはいけません。
ゆっくりできる環境、拠点としての機能を持ち合わせてこそ街という居場所ができます。
・・・という概念の元、今回の改造術「街にいる間はHP・SPの自然回復が早くなる」という効果を設定したいと思います。
テンションリラックスみたいな感じです。
具体的には「マップフラグnopenaltyが設定されている場所にいる間、自然回復力が向上する」という具合にします。
改造対象は
pc.c
の1点のみです。
まずは自然回復の処理をしている箇所を探します。pc.cで
pc_natural_heal_hp
pc_natural_heal_sp
のブロックを探してみてください。検索を使うと便利です。
名称そのままの通り、ここで自然回復の処理をしています。~hpがHP、~spがSP処理です。
中には「歩いている時の処理」「battle_confでの処理」など、たくさんありますが、HPでは簡単にテンションリラックスの効果の部分をお借りして設定してあげます。
「プレイヤーがいる場所がnopenaltyのマップフラグか」を見るには
map[sd->bl.m].flag.nopenalty
と書きます。ifなどと組み合わせてnopenaltyが設定されていたら1が返ります。
pc.c 7318行目あたり、「立ち止まってる場合」の箇所で
if(sd->ud.walktimer == -1) {
inc_num = pc_hpheal(sd);
if( sd->sc_data[SC_TENSIONRELAX].timer!=-1 ){// テンションリラックス
sd->hp_sub += 2*inc_num;
sd->inchealhptick += 3*natural_heal_diff_tick;
}else {
sd->hp_sub += inc_num;
sd->inchealhptick += natural_heal_diff_tick;
}
}
の、テンションリラックスの場所に「nopenaltyが設定されている場合」の処理をお邪魔させてもらいます。
if(sd->ud.walktimer == -1) {
inc_num = pc_hpheal(sd);
if( sd->sc_data[SC_TENSIONRELAX].timer!=-1 || map[sd->bl.m].flag.nopenalty){// テンションリラックス
sd->hp_sub += 2*inc_num;
sd->inchealhptick += 3*natural_heal_diff_tick;
}else {
sd->hp_sub += inc_num;
sd->inchealhptick += natural_heal_diff_tick;
}
}
ちなみに、hp_subは自然回復する間隔です。座ったりすると短縮されます。
この場合2倍速で「6秒→3秒」です。
inchealhptickは「HP回復力向上」のスキルなどの効果で回復する間隔です。
この場合3倍速で「10秒→3.33秒」です。
もし、テンションリラックスと効果を分けたい場合は、
if(sd->ud.walktimer == -1) {
inc_num = pc_hpheal(sd);
if( sd->sc_data[SC_TENSIONRELAX].timer!=-1){// テンションリラックス
sd->hp_sub += 2*inc_num;
sd->inchealhptick += 3*natural_heal_diff_tick;
}else if(map[sd->bl.m].flag.nopenalty) {
sd->hp_sub += 2*inc_num;
sd->inchealhptick += 3*natural_heal_diff_tick;
}else {
sd->hp_sub += inc_num;
sd->inchealhptick += natural_heal_diff_tick;
}
}
と、if-else文を1つ追加して個別に判断してください。
個別に設定する場合、テンションリラックスよりも効果が高いと、テンションリラックスの効果の方が弱くなり、使用した時に逆効果になりますので注意してください。
次に、SPの部分も同様に追加していきます。
SPの部分にテンションリラックスの項はないので、単体として追加します。
SPの自然回復は歩いた時も回復するので、HPとは少し違った記述をしています。
pc_natural_heal_spのブロック、次の処理をしている箇所
if(s_class.job == 23 || sd->sc_data[SC_EXPLOSIONSPIRITS].timer == -1 || sd->sc_data[SC_MONK].timer!=-1)
sd->sp_sub += inc_num;
if(sd->ud.walktimer == -1)
sd->inchealsptick += natural_heal_diff_tick;
else
sd->inchealsptick = 0;
の部分にそれぞれnopenaltyが設定されている場合の処理を追加してあげます。
if(s_class.job == 23 || sd->sc_data[SC_EXPLOSIONSPIRITS].timer == -1 || sd->sc_data[SC_MONK].timer!=-1) {
if(map[sd->bl.m].flag.nopenalty)
sd->sp_sub += 2*inc_num;
else
sd->sp_sub += inc_num;
}
if(sd->ud.walktimer == -1) {
if(map[sd->bl.m].flag.nopenalty)
sd->inchealsptick += 3*natural_heal_diff_tick;
else
sd->inchealsptick += natural_heal_diff_tick;
}
else
sd->inchealsptick = 0;
各値はHPと同様です。値は各自変更してあげてください。
これでnopenaltyが設定されているマップにて自然回復力がかなり上がり、街での休息効果が高まります。
今回はnopenaltyのマップフラグで判断させましたが、独自にマップフラグを定義してみるのも面白そうですね。