装備中にステータスを上昇させ、装備を外すと元の数値に戻す方法

ホーム フォーラム CF2.5使用法全般 装備中にステータスを上昇させ、装備を外すと元の数値に戻す方法

  • このトピックには8件の返信、2人の参加者があり、最後にdaifukuにより5年、 8ヶ月前に更新されました。
9件の投稿を表示中 - 1 - 9件目 (全9件中)
  • 投稿者
    投稿
  • #15511
    daifuku
    参加者

    お世話になります。
    装備中ステータスを○倍し解除すると元の数値に戻るような装備を作りたいのですが、計算式が分かりません。
    例えば元の防御力60にアイテムを装備した事で1.1倍にする場合、「元の防御力を(元の防御力×0.1)増加」、または「元の防御力(防御力60×1.1)に変更」で66になるのですが、この上昇分の数値をどうやって元に戻せばよいのでしょうか。
    「元の防御力から(元の防御力×0.1)引く」でも、59となってしまいますし、良い方法が思いつきません。
    どうぞよろしくお願いいたします。

    #15514
    ラクレス
    参加者

    daifukuさんこんにちは

    能力値はその都度上書きしていくのではなく
    基本値と最終値を分けて扱うのがいいかと思います

    基本値*(100+増幅率)/100=最終値
    60*(100+10)/100=66 防御+10%適用時
    60*(100+0)/100=60 装備なし

    装備無しの時は [装備無し] という性能0の装備を付けている
    とイメージすると管理し易いと思います

    #15516
    daifuku
    参加者

    >>ラクレスさん
    ありがとうございます、おかげさまで良い感じの装備イベントがつくれました。
    昨日まで装備前の能力値を一時的に別のオブジェクトの変数に格納したりしてそれっぽくしてみましたが、やはりこちらの方法が良いですね。

    #15517
    daifuku
    参加者

    また一つ問題がでてきました。
    複数同様の効果がある装備をした場合はどうすれば良いのでしょうか。
    今装備中は

    最終防御力を( 基礎防御力* ( 100 + 10 ) ) / 100に変更

    となっているのですが、もう片方の装備枠にも同様の効果がある装備をした場合、片方を解除すると装備の効果も0に戻ってしまいます。
    これを避けるためにはどのような条件を使うと良いのでしょうか。

    今の所Aが装備中でBが装備無しの時能力値を○○に変更と一つ一つ条件を追加していって問題を回避するくらいしか思いつかないです。

    #15520
    ラクレス
    参加者

    (100+増幅率) の部分を
    (100+枠1の増幅率+枠2の増幅率+枠3の…)
    と同じ能力値を変動させる要素をまとめてあげるといいと思います
    レベルアップやアビリティによる成長値やマイナス要素なんかも同様です

    枠数や装備品や能力値の種類が多い場合は
    ・枠1に装備品Aを着けている時
    などの判定方法では恐ろしく手間がかかりますので
    配列やデータグリッドやString Parser等を用いて
    装備品のデータベースを作っておく事で
    少ない行数に統括して纏められるようになります

    私が行っている配列を使った例では
    x軸=ID (1=こん棒,2=短剣…101=木の盾)など
    y軸=能力値 (1=攻撃力,2=防御力,3=行動力)など
    といった具合で装備情報を予め入力しておきます
    同時に枠内情報を入れる変数もどこかに用意します
    (枠1=武器,枠2=盾,枠3=鎧)など

    短剣を装備 → 変数(枠1)に2を代入
    木の盾を装備 → 変数(枠2)に101を代入
    鎧を外す →変数(枠3)に0を代入

    のようにし 必要箇所(枠内が変更されたタイミング等)で
    能力値更新 のフラグを立て
    現装備状態での能力値を割り出し フラグを伏せます

    攻撃力を割り出すときは
    基本値+配列XY(枠1,1)+配列XY(枠2,1)+…
    行動力を割り出すときは
    基本値+配列XY(枠1,3)+配列XY(枠2,3)+…

    という具合になるのですが
    高速ループを用いれば長ったらしい数式は不要になります
    まず更新フラグが立ったら各能力値の最終値とする変数に基本値を代入し
    枠と同じ数だけループを回します
    ループ実行中に 各能力値に対して
    最終攻撃力に 配列(ループindex+1,1)を加算
    最終防御力に 配列(ループindex+1,2)を加算
    最終行動力に 配列(ループindex+1,3)を加算
    と各能力値分のイベントを一行内に書くだけで済みます
    *枠の変数番号が0からの場合+1は不要です

    他の人のやり方を文字でズラズラ書かれても分かりづらいと思いますが
    どうぞ参考までにm(_ _)m

    #15521
    ラクレス
    参加者

    ↑であげた例は 攻撃力+3 などの加算タイプですが
    %増幅の場合は合計増幅値を入れる変数を用意し
    同じようりょうで高速ループを用いて増幅値の合計を求めます そして
    基本値*(100+増幅率)/100=最終値
    をしてやればいいかと思います

    #15524
    daifuku
    参加者

    >>ラクレスさん
    (100+枠1の増幅率+枠2の増幅率+枠3の…)
    この考え方がとても役に立ちました!ありがとうございます。
    確かに成長や一時的な能力の上昇や下降など広い範囲で活躍しそうですね。
    今後どう作ろうか悩んでいたところも解決しそうです。

    配列に関しては使ったことが無いので先ほど触ってみたのですが
    画像のような事が出来るという認識で合っているでしょうか。
    装備品の数はさほど多くないので今は大丈夫そうですが、いくらでも格納できて便利ですね。

    Attachments:
    You must be logged in to view attached files.
    #15528
    ラクレス
    参加者

    お役に立てたようでなによりです!

    配列の認識はそれで合っています
    ですが配列オブジェクトはテキストか数値どちらかしか扱えません
    扱えないのに代入は出来てしまうのでややこしいですが・・・
    プロパティで数値か文字列どちらを扱う配列にするか選びます

    性能値なども文字列としてテキスト配列に入れ込む事も可能ですが
    Val関数が必要になる分少し扱い辛くなります

    #15529
    daifuku
    参加者

    >>ラクレスさん
    なるほどよくわかりました!
    色々とありがとうございました。

9件の投稿を表示中 - 1 - 9件目 (全9件中)
  • このトピックに返信するにはログインが必要です。