剛穀じゃないんだ剛毅なんだ

やる人みんなみんな剛穀とか剛殻とか言いやがって
剛毅(ごうき)だよ

剛毅一発変換できるだろ
剛毅な人とか言うだろ

って言ったらカナコさんにおっさんと言われたかげろうです。


剛穀でも剛殻でもなんでもいいですよー
デバッグしてくれてるみなさんありがとうございます。

さて、今日はコメントでリクエストがあった「小数点」について。
RGSS2講座第12回です。


ダメージ計算式を変えたいということがある。

妖刀伝を作っていて思ったが、ツクールのデフォダメージ計算式はアクターのHPがだいたい3ケタくらいの場合に合わせてあるため、HPが最大で100ちょっとくらいしかいかないゲームの場合、攻撃力と防御力の少しの誤差で大きくダメージが開いてしまう。

まあだからと言って別に妖刀伝ではダメージ計算式はいじっていないのだが。


このダメージ計算式をいじる方法をお伝えしよう。
Game_Battlerのmake_attack_damage_valueを見ます。

ダメージ計算式
#--------------------------------------------------------------------------
# ● 通常攻撃によるダメージ計算
# attacker : 攻撃者
# 結果は @hp_damage に代入する。
#--------------------------------------------------------------------------
def make_attack_damage_value(attacker)
  damage = attacker.atk * 4 - self.def * 2 # 基本計算
  damage = 0 if damage < 0 # マイナスなら 0 に
  damage *= elements_max_rate(attacker.element_set) # 属性修正
  damage /= 100
  if damage == 0 # ダメージが 0
    damage = rand(2) # 1/2 の確率で 1 ダメージ
  elsif damage > 0 # ダメージが正の数
    @critical = (rand(100) < attacker.cri) # クリティカル判定
    @critical = false if prevent_critical # クリティカル防止?
    damage *= 3 if @critical # クリティカル修正
  end
  damage = apply_variance(damage, 20) # 分散
  damage = apply_guard(damage) # 防御修正
  @hp_damage = damage # HP にダメージ
end

全部説明するのは面倒なので、通常攻撃の基本計算のみ説明する。
属性修正とかスキルの場合とかが知りたければ勝手に調べるがよい。
(本気でわからない人はリクエストお願いします)

青文字の部分を確認しよう。
damage = attacker.atk * 4 - self.def * 2
「攻撃力×4 - 防御力×2」である。
※直後に100で割っているので注意

思ったより単純だ。
これは是非変えたい人がいるだろう。
有名RPGのダメージ計算式を知っているなら、それを真似てみるのもいい。

しかしひとつ問題があるのだ。
それが冒頭で述べた「小数点」。

先ほどの計算式を、例えば以下のように改造したとする。
damage = attacker.atk * 4 - self.def * 1.5

防御力の掛け算を「×2」から「×1.5」に変更した。
するとこうなる。
細かすぎるダメージ

103.6のダメージを与えてしまった。
そんな細かいゲーム見たことないわ。

というか、内部的に小数点だったとしても表示するときに整数に丸め込むくらいの処理は入れとけよ、と思わなくもないが。
この小数点を整数に丸め込むには以下の技を使います。

damage = attacker.atk * 4 - self.def * 1.5
damage = damage.to_i

これでちゃんと整数になります。(小数点以下切り捨て)
これはRuby言語の仕様っぽいのでツクール関係なくググれば出ます。
http://www.rubylife.jp/ini/numeric_class/index3.html

切り捨ては嫌だー四捨五入がいいーとか言う人は上記のサイトを見て自分で実装しやがれ。


さて、これで今回の講座は終わったも同然なのだが、ひとつ気になることがある。
それは「防御」である。

防御時のダメージ式は以下の通りである。
#--------------------------------------------------------------------------
# ● 防御修正の適用
# damage : ダメージ
#--------------------------------------------------------------------------
def apply_guard(damage)
  if damage > 0 and guarding? # 防御判定
    damage /= super_guard ? 4 : 2 # ダメージ減少
  end
  return damage
end

防御時に÷2、アクター設定の強力防御時に÷4
これだとどう考えてももともとのダメージが奇数だったとき、小数点になるんじゃね?

と思って試したら、どうやら割り算の場合自動で整数に丸め込まれるようだ。
なんで掛け算は丸め込まれないんだ。


じゃあできるだけ割り算を使ったほうがいいかというと、そうではない。
割り算というのは時としてよくわからん挙動をすることがあるからだ。
たぶんこの「自動で丸め込まれる」という部分に危険な何かを感じる。

例を示そうと思ったがなにも思いつかなかった。
とにかく割り算はときどき結果が変になることがあるのでオリジナルで使うのは控えたほうが良いと思う。説得力ねえな。

まあ使う場合は十分気を付けましょうということで。


以上、かげろうでした。


RGSS講座目次

RGSS講座第13回
スポンサーサイト

コメントの投稿

非公開コメント

ありがとうございます!

遅くなりましたが講座通りにやってなんとか解決できました。
これからもがんばって続けてください!

Re:ありがとうございます!

もうこんな講座書いたこと忘れてましたw

今はしばらく妖刀伝がらみの記事が続くと思いますが、落ち着いたらまたRGSS2講座も再開したいと思います。

またリクエストがあればお願いします。
Index

ブログ趣旨
メンバー紹介
制作ゲーム紹介
RGSS2講座

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR