ンラナカラナシイミノチミトイニモチシニノチ

セブンスドラゴンのマレロ言語とルシェ言語を
ノーヒントで電車内で解読した僕は褒められてもいいと思う。

(この記事のタイトルはルシェ言語で「妖刀伝完成間近」。
 知らない人は解読してみよう)


どうも、とうとうアナゴさんとタメになってしまったかげろうです。


どう考えてもメルライト鉱山はまだ行くべきところじゃないんだが、
格上の相手に挑む緊張感がたまらん、ということで先に攻略。
状態異常による事故死率が高かっただけで、ボスはてんで弱かった。

次はミレクーラ森林でも攻略するか(マテ


世界樹でもそうだったが、メルライト鉱山ではこちらが行動不能になる技を全体掛けしてくる雑魚が頻繁に出てくるのはどうかと思った。だったら状態異常を100%防ぐ装備が店で売っててもいいと思う。
マインドガードとフィジカルガードを付けた、リカヴァI,IIとキュアオールが使えるヒーラーがいて、風と木の詩レベル10を先制で掛けた状態で、狼×3が登場したら50%全滅するってどうなんだろう。やはり来るのが早すぎたのか。(でもボスは楽勝)


というわけで、自分のゲームではそんな理不尽なことが起こらないように、RGSS講座第11回、「ステート&属性耐性」。


1.ステートの付加成功率の変更

「職業」と「敵キャラ」の項目で設定できる「ステート有効度」。
A~Fまでが設定できますが、これはデフォルトで

A:100% B:80% C:60% D:40% E:20% F:0%

となっています。
これを変更するには以下をいじります。
なぜかアクターとエネミーでいじる箇所が違います。

・アクターの場合(Game_Actor)
ステート有効度1

・エネミーの場合(Game_Enemy)
ステート有効度2
#--------------------------------------------------------------------------
# ● ステートの付加成功率の取得
# state_id : ステート ID
#--------------------------------------------------------------------------
def state_probability(state_id)
  if $data_states[state_id].nonresistance
    return 100
  else
    rank = self.class.state_ranks[state_id]
    return [0,100,80,60,40,20,0][rank]
  end
end

青文字の部分を変えてやりましょう。
一番左の0はたぶん使ってないはずですが、一応変えないほうがいいです。
全敵キャラ分のCをAに変えたりするのは地味に手間なので、ここで一括で変えてやりましょう。
(ちなみに赤文字の部分は「抵抗しない」に設定したステートの成功率)

個人的には、RPGやってて敵に状態異常が効く割合はどの程度なのかがいつもわからずに怖くてボスに異常系魔法が使えないので、効く効かないの2択にするか、異常耐性を明示するかのどっちかが良いと思いますねえ。

まあ「もも」では2択でもなければ明示もしてませんが。戦闘メインのRPGでは致命的だと思います。ちなみに妖刀伝では2択でかつ誰に効くかがはっきり明示されます。(完成間近です)


2.属性修正値の変更

今度は「属性有効度」です。
「ステート有効度」のすぐ左にあるやつです。
こちらはデフォルトで

A:2倍 B:1.5倍 C:通常 D:半減 E:無効 F:吸収

となっています。

今度もアクターかエネミーかで場所が違います。
というかさっきのすぐ上です。

・アクターの場合(Game_Actor)
属性修正値1

・エネミーの場合(Game_Enemy)
属性修正値2

#--------------------------------------------------------------------------
# ● 属性修正値の取得
# element_id : 属性 ID
#--------------------------------------------------------------------------
def element_rate(element_id)
  rank = enemy.element_ranks[element_id]
  result = [0,200,150,100,50,0,-100][rank]
  for state in states
    result /= 2 if state.element_set.include?(element_id)
  end
  return result
end

青文字部分はさっきと同じなので説明しなくてもわかるでしょう。
僕が今回語りたいのは赤文字部分です。

赤文字部分は言わずもがな、「ステート」「防具」で設定できる「半減する属性」です。なんで半減しか設定できないんだ?
4分の1とか倍増とか無効化とか設定できてもいいやないか。
特に、味方の属性耐性が職業でしか設定できないのはなんだかなあ。
というわけで、赤文字部分をいじります。

result /= 2

これが「半減」なので、好きに変えてやりましょう。

・4分の1
result /= 4

・倍増
result *= 2

・無効化
result = 0

・吸収
result *= -1

ちなみに応用編。
state?(n)
で、今かかっているステートを判定することができます。
アンデッド状態なら光属性に弱くなる、とかいう設定をしたいときに使えます。

if state?(5) and element_id == 3 # ゾンビ状態(ID5に設定) & 光属性(ID3に設定)なら2倍
  result *= 2 if state.element_set.include?(element_id)
else
  result *= 1.5 if state.element_set.include?(element_id) # それ以外は1.5倍
end

ちなみに、防具ごとにもっと細かい設定をしたい・・・
という場合は、もうKAMESOFT様の以下のスクリプトを使ってください。

装備品オプション追加
http://ytomy.sakura.ne.jp/tkool/rpgtech/php/tech.php?tool=VX&cat=tech_vx/equip&tech=add_equipment_options#ELEMENT_RESISTANCE

なんでもKAMESOFTにあるなー。


3.スリップダメージ改変

次。毒によるダメージを変更します。

Game_Battlerを見ます。
スリップダメージ
#--------------------------------------------------------------------------
# ● スリップダメージの効果適用
#--------------------------------------------------------------------------
def slip_damage_effect
  if slip_damage? and @hp > 0
    @hp_damage = apply_variance(maxhp / 10, 10)
    @hp_damage = @hp - 1 if @hp_damage >= @hp
    self.hp -= @hp_damage
  end
end

青文字は、最大HPの10分の1のダメージを与える処理です。
ここを「maxhp / 20」にすれば20分の1ダメージになります。「10」とすればそのまま10ダメージになります。
ちなみにapply_varianceは「分散」です。分散については前に話した気がしますが、スリップダメージの分散はデフォルトで10になってます。
右の10を0にすればダメージは固定になり、増やせば増やすほどバラつきます。

赤文字は、「スリップダメージが現在HPより大きい場合、HPを残り1にする」処理です。
ここを消せば、スリップダメージで普通に死にます。


さて、応用編。

・「毒」は10/1ダメージ、「火だるま」は固定10ダメージ(分散アリ)
if state?(2) # 毒(ID2に設定)
  @hp_damage = apply_variance(maxhp / 10, 10)
end
if state?(3) # 火だるま(ID3に設定)
  @hp_damage = apply_variance(10, 10)
end

・「疲労」時に毒を食らうとダメージが2倍(分散アリ)
if state?(4) # 疲労(ID4に設定)
  @hp_damage = apply_variance(maxhp / 5, 10)
else
  @hp_damage = apply_variance(maxhp / 10, 10)
end

ここはいろいろと応用の余地があると思います。


4.命中率減少ステート改変
暗闇の命中率をいじる話をしようと思ったんですが、
よく見たら第3回講座ですでにやっていたので割愛。


5.ステート予防ステート作成

ツクールVXには、ステートにかかった際に解除するステートは設定できるのに、ステートにかからないステートの設定はできません。それはどうなんだ。

Game_Battlerを見ます。
予防ステート

#--------------------------------------------------------------------------
# ● ステート変化の適用
# obj : スキル、アイテム、または攻撃者
#--------------------------------------------------------------------------
def apply_state_changes(obj)
  plus = obj.plus_state_set # ステート変化(+) を取得
  minus = obj.minus_state_set # ステート変化(-) を取得
  for i in plus # ステート変化 (+)
    next if state_resist?(i) # 無効化されている?
    next if dead? # 戦闘不能?
    next if i == 1 and @immortal # 不死身?
    if state?(i) # すでに付加されている?
      @remained_states.push(i) # 変化しなかったステートを記録
      next
    end

    next if state?(5) and i == 3 # 凍結状態(ID5に設定)には火だるま(ID3に設定)は無効

    if rand(100) < state_probability(i) # 確率判定
      add_state(i) # ステートを付加
      @added_states.push(i) # 付加したステートを記録
    end
  end
  for i in minus # ステート変化 (-)
    next unless state?(i) # 付加されていない?
    remove_state(i) # ステートを解除
    @removed_states.push(i) # 解除したステートを記録する
  end
  for i in @added_states & @removed_states
    @added_states.delete(i) # 付加と解除の両方に記録されている
    @removed_states.delete(i) # ステートがあれば両方削除する
  end
end

青文字の部分がオリジナル。
このようにすれば予防ステートが作れます。

しかし凍結状態に火だるまって・・・やけに限定的だな
考えてみたら予防ステートなんて使う機会ほぼないかもしれない。

さて、それではブログが長すぎて重くなってきたのでこのへんでやめときます。
来週は妖刀伝が完成していますよう。

かげろうでした。


RGSS講座目次

RGSS2講座第12回
スポンサーサイト

コメントの投稿

非公開コメント

検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR