GOREとにゃんこの桃源郷

主観的にCDのレビューやら、日記やら、色々と。
ゴアとかメタルとかロックとか

RPGツクールVXAceの不満点はUIくらいなものだ。

2022-02-05 | RPGツクールMZ,VXace,VX,2000,95,1~5
2022/02/05更新
 テストしてみたら不具合を見付けたので更新した。ターゲットがHP0になっても発動していたので、頑張って修正した。ついでにステート発動時にアニメーションも表示させるように改変してみた。ちなみにターゲット撃破後にアニメーション表示がされたことで不具合に気付けた。また何か問題が発生すると困るので、(やる気という意味合いの)可能な範囲でテストした。下記を確認済みなのだが、今思い付かないだけで他にも状況はあるかもしれない。
・HP0以下の状態では発動しない。
・回復魔法で発動しない。
・混乱状態で発動する。
 ※挙動として好みの問題で、スクリプトの「movable?」を「confusion?」に書き換えると混乱時も発動しないようになる。
・全体攻撃でも1人ずつ判定される。

 あとタグ認識されるから不等号記号が記事中に使えないようだ、久し振りで忘れていた。仕方ないので<この記号だけ全角で記載する。あと行数の問題か記事が更新できなくなったので点線を概ね削った。

※下記スクリプト内、更新箇所は赤文字
-----------------------------------------------------------------------------------------

 以前、怒りステートを作ったが、また似たようなものを作った。オーラステートと命名して、敵味方ともに確率で発生するステートとなる。ドラクエ11Sのゾーンに影響を受けたものだが、少し違うのはダメージを受けた時にしか発生しないこと。また、どのキャラクターも一律同じ効果であるということ。(ドラクエのゾーンはキャラにより増加する能力値が異なる。)

 確率についてはドラクエ11Sのゾーン発生率がブラックボックスなので、最低限公開されている下記の情報だけ満たせるようにした。
 ・ターン経過するほど発生率が高まる
 ・一撃で大きなダメージを受けるほど発生しやすい
 ・行動可能な状態でなければ発生しない

 エネミーとアクターで処理を分けているのには次の理由がある。ドラクエ11Sのモンスターは、定期的にゾーン状態となったり、ゾーン状態に入らないものがいる。それも再現したかったのでエネミーのメモ欄に記載させることで対応した。素材として使えそうな書き方を心掛けたものの、たぶん使えると思うが如何せん素人を下回りし者なのでエラー対処は出来ない。TPチャージのスクリプトを併用するか、あるいは単独で使用する際は「 * GCC::TYPE_RATE[@nickname_type]」この部分だけ削除すれば問題無い。新規プロジェクトでのテストはしていないので、併用した場合に問題無いかは分からない。

#==============================================================================
# ! オーラステート Ver1.0
#==============================================================================
=begin
 攻撃を受けた際、確率でオーラ状態になる。
 敵と味方で確率が異なり、敵は結構簡単になる。

 下記3種類のいずれかをエネミーのメモ欄に記載する。
 表記しない場合は <オーラ通常>か<オーラ無し>のどちらをデフォルトにするか
 Module内で設定可能。

<オーラ通常>
 たまにオーラが発動する。

<オーラ行動:n>
指定の行動回数(n回)を経過すると、被ダメ量に関わらず必ずオーラが発動する。
そういうボスなんかにおすすめ。nを任意の数値にする。

<オーラ無し>
オーラの発動は無い。マシンの敵や感情を失った鬱野郎なんかにおすすめ。

スクリプト内の凡例
 ● 独自メソッド(競合無し)
 〇 エイリアス(競合注意)
 ◎ 再定義(競合要注意)
=end
module GCC
AURA_STATE = 120 ## オーラステートのID

AURATYPE_A = "オーラ通常" ## メモ欄に記載する文字。気に入らなければ変更可能。
AURATYPE_B = "オーラ行動"
AURATYPE_C = "オーラ無し"

AURA_DEFAULT = 1 ## メモ欄に表記無い場合、1が通常、2はオーラ無し

AURA_ANIMATION = 10 ## オーラ発動時のアニメーションID

end

class RPG::BaseItem
# ● オーラタイプ識別
def gcc_aura_type
if /<#{GCC::AURATYPE_A}>/ =~ @note
"通常"
elsif /<#{GCC::AURATYPE_B}[::](\d+)>/ =~ @note
@aura_type = $1.to_i
elsif /<#{GCC::AURATYPE_C}>/ =~ @note
"無し"
else
if GCC::AURA_DEFAULT == 1
"通常"
elsif GCC::AURA_DEFAULT == 2
"無し"
end
end
end
end
class Game_Battler < Game_BattlerBase
 ### メソッド「on_damage」を削除済み

attr_accessor :aura_flg # オーラ発動フラグ
attr_accessor :action_count # 行動数
attr_reader :aura_type # オーラ行動の回数
# 〇 エイリアス  オブジェクト初期化
alias init_aura_state initialize
def initialize
@aura_flg = false
@action_count = 0
@aura_type = 0
init_aura_state
end
# 〇 エイリアス 戦闘行動終了時の処理
alias action_end_aura_state on_action_end
def on_action_end
action_end_aura_state
@action_count += 1 if movable? && !state?(GCC::AURA_STATE)
end
# 〇 エイリアス スキル/アイテムの効果適用
alias aurastate_item_apply item_apply
def item_apply(user, item)
aurastate_item_apply(user, item)
aura_state_judgment(@result.hp_damage.to_f / mhp) if @result.hp_damage > 0 && self.movable?
end

end

class Game_Actor < Game_Battler
 ### 条件判定から「movable? &&」を、発動後の処理から「add_state(GCC::AURA_STATE)」,「@action_count = 0」を削除済み

# ● 確率計算と付与
def aura_state_judgment(value)
### 行動可能且つオーラ状態ではない
if !state?(GCC::AURA_STATE)
### ターン数×2ずつ、最大50まで積み上げ
t = $game_troop.turn_count * 2 >= 50 ? 50 : $game_troop.turn_count * 2
v = value * 100 + @action_count

### 0~(ターン数+ダメージ幅+累積の行動回数)を小数にして変動率を掛け、
### 1.0以上ならオーラ化
if rand(t + v) * 0.01 * GCC::TYPE_RATE[@nickname_type] >= 1.0
@aura_flg = true
end
end
end
end

class Game_Enemy < Game_Battler
 ### 条件判定から「movable? &&」を、発動後の処理から「add_state(GCC::AURA_STATE)」,「@action_count = 0」を削除済み

# ● 確率計算と付与
def aura_state_judgment(value)
if enemy.gcc_aura_type == "通常"
if !state?(GCC::AURA_STATE)
t = $game_troop.turn_count * 2 >= 50 ? 50 : $game_troop.turn_count * 2
v = value * 100 + (@action_count * 5)
if rand(t + v) * 0.01 >= 1.0
@aura_flg = true
end
end
elsif enemy.gcc_aura_type == "無し"
return
else
if !state?(GCC::AURA_STATE) && @action_count >= enemy.gcc_aura_type
@aura_flg = true
end
end
end
end
class Scene_Battle < Scene_Base
# 〇 エイリアス スキル/アイテムの効果を適用
alias on_aurastate_apply_item_effects apply_item_effects
def apply_item_effects(target, item)
on_aurastate_apply_item_effects(target, item)
### 元の処理実行後、オーラフラグがONであれば発動させる。
if target.aura_flg
show_animation([target], GCC::AURA_ANIMATION)
target.add_state(GCC::AURA_STATE)
target.action_count = 0
target.aura_flg = false
@log_window.display_added_states(target)
end
end
end


 上記オーラステートの計算式には「GCC::TYPE_RATE[@nickname_type]」がある。これとは別にオーラの発動率及びTPの増加率をコントロールするスクリプトも作成した。設定値は二次元配列にすればよかったと反省しているが、概ね理想通りの仕様に作ることが出来た。(そう、理想が低い。)
 前々から自分のゲームでは、二つ名の設定をゲーム中で活かしたことがないため、実質死にパラメータとなっていた。これを活用するために、アクターの感情という体裁にして、初期値は「ふつう」となっており、画面にも表示している。戦闘終了後のタイミングでランダム更新されるようにした。具体的にはタイプという変数を作成して数値基準の管理で、①変動無し、②1つ上がる、③1つ下がるのパターンで分岐する。さらに上下どちらかの最高値または最低値の場合、ランダムで大幅に変動する。

 感情タイプ毎のTPチャージ率、オーラ発動率は共有で最大1.5~最低0.65にしているが、ここはゲームを作っていくうえで要調整が必要になる想定だ。つまり、2次元配列で書けばよかったと後悔している。たとえば下記のようにすれば、もっと言えばパラメータ1つ追加して両方の確率を分けてもいいような気がする。メモ欄には対応させていないためあくまでスクリプト内で決めになる。
 ["さいこう",1.5],["こうふん",1.45]

module GCC
#ステータスに描画される文字列
TYPE_NAME = [
"さいこう",# type0
"こうふん",# type1
"そうかい",# type2
"はつらつ",# type3
"たかぶる",# type4
"わくわく",# type5
"かろやか",# type6
"それなり",# type7
"おだやか",# type8
"ふつう",# type9
"そわそわ",# type10
"もやもや",# type11
"ゆううつ",# type12
"むなしい",# type13
"さいあく",# type14
"いらいら"# type15
]

#タイプごとのTPチャージ、オーラ発動の変動率
TYPE_RATE = [1.5, 1.45, 1.4, 1.35, 1.3, 1.25, 1.2, 1.15, 1.1, 1.0, 0.9, 0.85, 0.8, 0.75, 0.7, 0.65]
end

class Game_Actor < Game_Battler
attr_accessor :nickname_type
#--------------------------------------------------------------------------
# ● オブジェクト初期化(エイリアス)
#--------------------------------------------------------------------------
alias nicknametype_initialize initialize
def initialize(actor_id)
nicknametype_initialize(actor_id)
####二つ名
@nickname_type = 9
end
#--------------------------------------------------------------------------
# ☆ 性格によるTPチャージ率
#--------------------------------------------------------------------------
def charge_tp_rate
return GCC::TYPE_RATE[@nickname_type]
end
#--------------------------------------------------------------------------
# ● 被ダメージによる TP チャージ
#--------------------------------------------------------------------------
def charge_tp_by_damage(damage_rate)
self.tp += damage_rate > 0.08 ? 20 * damage_rate * tcr * charge_tp_rate : 1
end
#--------------------------------------------------------------------------
# ☆ ニックネームタイプの最大値
#--------------------------------------------------------------------------
def nt_max
return 15
end
#--------------------------------------------------------------------------
# ☆ ニックネームタイプの最低値
#--------------------------------------------------------------------------
def nt_min
return 0
end
#--------------------------------------------------------------------------
# ☆ 二つ名のランダム変更
#--------------------------------------------------------------------------
def emotional_change
case rand(3)
when 0
return
when 1
@nickname_type > nt_min && @nickname_type < nt_max ? @nickname_type -= 1 : @nickname_type = 9
when 2
@nickname_type > nt_min && @nickname_type
※ここから下のスクリプトは説明のためのもので、これだけ入れてもエラー出るので注意!

 その他、提供可能なスクリプトは無いが混乱(confusion)についても改変した。デフォルトのパターン①敵を攻撃する(命令出来ない)、②敵か味方を攻撃する、③味方を攻撃するがスクリプト内では混乱に当たり、混乱レベルとして3段階に分類されていた。ここに「魅了」というステートを追加して、魅了されている間はパターン④味方を攻撃する+攻撃スキルも使うようにした。敵を回復する行動は、更に手を加える必要があるので、コスト対効果(バグ取りのおそれと効果)を考えた時に以下の2点から避けることとした。
 ・そもそも魅了を受けることがあまり無いかもしれない。
 ・回復スキルを使うメンバーが魅了されるという状況はさらに限定される。
 ・行動選択で回復スキルとなる状況はもっと限定される。

 具体的には魅了時の行動リストを新たに作成することで対応した。対象選択が味方あるいは使用者のスキルを除外したリストになっているため実質的に「回復スキル以外を使う」挙動となっている。なお、ターゲットの仕様も変更しないといけないのか、自環境で競合が発生しているのか、全体スキルも単体効果になってしまうため、敵全体のスコープも外した。

# ● 魅了時用の行動候補リストを作成 ※対象が味方のスキルを除外
def make_charmed_action_list
list = []
list.push(Game_Action.new(self).set_attack.evaluate)
usable_skills.each do |skill|
list.push(Game_Action.new(self).set_skill(skill.id).evaluate) if skill.scope <= 6 && skill.scope != 2
end
list
end

 他に改変したのは即死魔法の種類を増やしたこと。以前もやっていたような気がするが、今回のほうがまともだ。たとえば女神転生シリーズの「ハマ」と「ムド」はどちらも即死魔法だが耐性が異なる。ハマは天使などに効かず、悪霊などに効果的であり、ムドはその逆になる。つまりそれを実現したかった。急所、呪殺、昇天という3種類の即死が出来た。※下記だけでは出来ない。

# ● 戦闘不能のステート ID を取得
def vital_state_id
return 145
end
# ● 戦闘不能のステート ID を取得
def dead_state_id
return 146
end
# ● 戦闘不能のステート ID を取得
def haven_state_id
return 147
end

 あとクリティカル時に音を再生するようにした。これは色んな人がやっていると思うし、何ならアニメーション表示を追加していたりバトラーのコメント表示(絵とセリフが出るやつ何て言うんだっけ)もあったりするだろうから、非常に地味な改変だ。

#--------------------------------------------------------------------------
# ● クリティカルヒットの表示
#--------------------------------------------------------------------------
def display_critical(target, item)
if target.result.critical
target.actor? ? Sound.play_actor_critical : Sound.play_enemy_critical
wait
text = target.actor? ? Vocab::CriticalToActor : Vocab::CriticalToEnemy
add_text(text)
wait
end
end

 結論、になっているかは不明だが、なんだかツクールをやっていて思うのは次の通り。
 ・俺はRPGが作りたいのか、プログラムが書けるようになりたいのか、どっちなんだい?





最新の画像もっと見る

コメントを投稿