独学ツクールブログ

ツクールでのオリジナル作品の話を中心に創作関係の徒然な語り。

<< RGSS奮闘記78:プリセットを読み解く21(Game_Battlerクラスその3) | main | RGSS奮闘記80:プリセットを読み解く23(Game_Battlerクラスその5) >>

[ - ] スポンサーサイト

一定期間更新がないため広告を表示しています

| 2018.05.23 Wednesday | - | - |

[ RGSS奮闘記 ] RGSS奮闘記79:プリセットを読み解く22(Game_Battlerクラスその4)

おいまだ半分とかどういうことだ。


def remove_state(state_id, force = false)
  if state?(state_id)
    if @states_turn[state_id] == -1 and not force
      return
    end
    if @hp == 0 and $data_states[state_id].zero_hp
      zero_hp = false
      for i in @states
        if i != state_id and $data_states[i].zero_hp
          zero_hp = true
        end
      end
      if zero_hp == false
        @hp = 1
      end
    end
    @states.delete(state_id)
    @states_turn.delete(state_id)
  end
  @hp = [@hp, self.maxhp].min
  @sp = [@sp, self.maxsp].min
end

ステートの解除remove_stateメソッド。こちらもまた訳の分からん流れの処理を組むことによって無駄に長くなっている(笑)
まずはステートが付加されている場合。強制付加されたステートでかつ解除が強制でない場合は処理終了。これは、装備品によるステートを解除しないための処理である。
次に、現在HPが0かつ解除しようとしているステートに「HP0の状態とみなす」がある場合。@statesの中にほかに「HP0」のステートがあるかどうか調べ、一つでもあればフラグを立てる。そしてフラグが偽ならHPを1にする。うーん……ローカル変数なんか使わず
@hp = 1 unless @states.any?{|state| state != state_id && $data_states[state].zero_hp }

とかじゃダメなのかな?(笑)
最後に、@statesと@states_turnからIDを削除し、HPとMPの上限処理を行って終了である。


次。ステートのアニメーションを取得。ステートが何もなければ0を、何か付加されていればレーティングが最大のステートのアニメーションIDを返す。これもなあ……
$data_states.fiest.animation_id unless @states.empty?

で済むわけだが。

次。制約の取得。これもなぜか非常に原始的な処理をしている。まずローカル変数restriction_maxを用意し、@statesの中身それぞれについて「そのステートのrestrictionがrestriction_maxより大きければ代入」を繰り返す。最後にrestriction_maxを返すことで最大の制約を返すのだが……restrictionだけの配列の最大値とか、すっきりした方法があるのになぜこんなことをするのか。RGSSの作者はRubyを知らないんじゃないか?(笑)現にVXでも変わってないしなあ……


以下も同様なので、原始的処理へのツッコミは割愛(笑)


「EXP を獲得できない」判定、「スリップダメージ」判定、「攻撃を回避できない」判定は、現在かかっているステートのいずれかでそのフラグがONなら真を返す。

バトル用ステートの解除は、「バトル終了時に解除」のフラグがONのステートを解除。

ステート自然解除は、@states_turnの中で、0より大きいものは1減算、0になっているものはランダムで解除。確率はエディタで設定したものである。

ステート衝撃解除も自然解除と同様確率での解除である。こちらは物理攻撃を受けた時に呼ばれる。

最後にステート変化の適用。これは、特定のステートがかかったときに連動して付加もしくは解除されるステートの処理である。なぜか+と-で分かれているがこれも統合可能。実際VXではapply_state_changeメソッドになっている。
def states_plus(plus_state_set)
  effective = false
  for i in plus_state_set
    unless self.state_guard?(i)
      effective |= self.state_full?(i) == false
      if $data_states[i].nonresistance
        @state_changed = true
        add_state(i)
      elsif self.state_full?(i) == false
        if rand(100) < [0,100,80,60,40,20,0][self.state_ranks[i]]
          @state_changed = true
          add_state(i)
        end
      end
    end
  end
  return effective
end

states_plusメソッドでは、まず、ステートが防具によって防御されているかチェック。
防御されていなければ、次にフルかどうかをチェック。フルでないならフラグをON。ここで、「|=」は論理和である。演算子の両側の式のうちどちらかが真ならば真となる。
続いて抵抗のチェック。もし「抵抗しない」になっている場合、@state_changedをtrueにする。これは攻撃やアイテムでステートが変化しなかった場合に「Miss」を表示するためのフラグである。
最後に実際にステートを付加して終了。
「抵抗しない」になっていなく、かつフルではない場合、有効度を基準に確率を計算。ここで現れる数値の配列はツクールXPのデフォルトのステート有効度。state_ranksで有効度が1〜6の数値で(マニュアルの「0〜5」は間違い)返ってくるのでそれを確率に変換している。乱数が有効度の数値未満であればステート判定成功。フラグを立てステートを付加する。
最後にeffectiveを返し処理終了。


最後はstates_minusメソッド。こちらは判定が少ない分やや短い。
「-」が設定されているステートが付加されていれば解除、これだけの処理である。

これでセクション2終了。
次回やっと最後のセクションへ。


タグ:[ツクールXP] [Ruby] [RGSS] [プリセットを読み解く] [Game_Battler]

| 2011.11.21 Monday 21:21 | comments(0) | trackbacks(0) |

[ - ] スポンサーサイト

| 2018.05.23 Wednesday 21:21 | - | - |

コメント

コメントする






この記事のトラックバックURL

トラックバック

このページの先頭へ▲

Twitter

WebClap

Blogram

ブログランキングならblogram

calendar

S M T W T F S
  12345
6789101112
13141516171819
20212223242526
2728293031  
<< October 2019 >>

categories

archives

Amazon

selected entries

recent comment

recent trackback

recent ranking

links

search this site.

sponsored links

others

mobile

qrcode

powered

無料ブログ作成サービス JUGEM