独学ツクールブログ

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

<< RGSS奮闘記77:プリセットを読み解く20(Game_Battlerクラスその2) | main | RGSS奮闘記79:プリセットを読み解く22(Game_Battlerクラスその4) >>

[ - ] スポンサーサイト

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

| 2018.05.23 Wednesday | - | - |

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

それにしても長いものである。Interpreterを除けばオブジェクトのクラスの中でセクション分割されているのがこことGame_Characterくらいしかないというのが重要度を物語っているのかなんなのか。少なくとも2割くらいは記述量減らせると思う。

今回は、記述の短いメソッドについては記載を省く。
だってめんどくs


ステートの検査state?メソッド。
@statesに引数state_idが含まれていれば真となる。

ステートがフルかどうかのstate_full?メソッド。「フル」の意味が分かりにくい。
ステートが付加されていなければ偽、オートステートか、持続ターン数が自然解除の最低ターンと同じなら真を返す。
「持続ターン数が自然解除の最低ターンと同じ」が特にわかりにくい。「持続ターン数」はステートの残りターン数、「自然解除の最低ターン」はステートに設定された持続ターン数である。ということはつまり、「持続ターンがいっぱいかどうか」ということだろう。

def add_state(state_id, force = false)
  if $data_states[state_id] == nil
    return
  end
  unless force
    for i in @states
      if $data_states[i].minus_state_set.include?(state_id) and
         not $data_states[state_id].minus_state_set.include?(i)
        return
      end
    end
  end
  unless state?(state_id)
    @states.push(state_id)
    if $data_states[state_id].zero_hp
      @hp = 0
    end
    for i in 1...$data_states.size
      if $data_states[state_id].plus_state_set.include?(i)
        add_state(i)
      end
      if $data_states[state_id].minus_state_set.include?(i)
        remove_state(i)
      end
    end
    @states.sort! do |a, b|
      state_a = $data_states[a]
      state_b = $data_states[b]
      if state_a.rating > state_b.rating
        -1
      elsif state_a.rating < state_b.rating
        +1
      elsif state_a.restriction > state_b.restriction
        -1
      elsif state_a.restriction < state_b.restriction
        +1
      else
        a <=> b
      end
    end
  end
  if force
    @states_turn[state_id] = -1
  end
  unless @states_turn[state_id] == -1
    @states_turn[state_id] = $data_states[state_id].hold_turn
  end
  unless movable?
    @current_action.clear
  end
  @hp = [@hp, self.maxhp].min
  @sp = [@sp, self.maxsp].min
end

ステートの付加add_stateメソッド。こいつもまた中で処理が混乱している。VXだと20行程に縮んでいるので、恐らくこの実装はダメ子だったんだろう。
まず、無効なステートであれば終了。
続いて、強制フラグがfalseの場合、現在のステートをチェック。ここで、3行に及ぶコメントが付記されている部分の処理は要するにステートの上書きチェックである。現在かかっているステートの「ステート変化」で新しいステートに「-」が入っている、かつ新しいステートの「ステート変化」で既存ステートに「-」が入っていない場合は処理を終了する。
続いて、ステートが付加されていない場合、@stateにステートのIDを追加、もしzero_hpがtrueであれば、アクターのHPを0にしてしまう。
次に、$data_statesを回して「ステート変化」のチェック。もし「+」があればそのステートを付加、「-」があれば除去。
次は並べ替え。なんだか謎なifがあるが、これは配列の要素同士の比較に用いられる「a<=>b」の戻り値が「-1、0、1」のいずれかであることによる。実際の処理としてはまずレーティング、次に制約でソートしている。というか
@states.sort!{|a, b|
  (a.rating <=> b.rating).nonzero? || a.restricton <=> b.restriction
}

じゃダメなのかこれ……??
気を取り直して次へ。次は強制フラグtrueの場合。つーかなんでelseじゃないんだ(笑)自然解除のターン数を-1(無効)に設定する。ちなみにここの処理が行われるのは装備品によるステートの付加時。ならそういう名前のフラグにしとけよと(笑)
次。強制付加ではない場合。だからなんで(ry強制でない場合には、$data_statesから自然解除のターン数を@states_turnに代入。
次は行動不能の場合。これはmovable?の戻り値を利用する。行動不能、つまりmovable?が偽である場合、アクションをクリアする。アクションについてはまた後日別セクションにて。
最後に、最大HPおよび最大SPがこれまでの変更で現在地を割った場合、現在地を新しい最大値まで切り捨てる処理を行って終了である。


add_stateのせいで無駄に分量が増えた。続きは次回。


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

| 2011.11.20 Sunday 21:55 | comments(0) | trackbacks(0) |

[ - ] スポンサーサイト

| 2018.05.23 Wednesday 21:55 | - | - |

コメント

コメントする






この記事のトラックバック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