ページ 1 / 1
<<解決済>>【RGSS2】ダメージに単位を付けたいのですが・・・。
Posted: 2021年2月25日(木) 19:50
by Mirin
下記URLを使用しようとするのですが、HP吸収、MP吸収の設定がわからない状態です。
製作者さんに複数回メールで送っていますが、返信がなく諦めよう。と思ったのですが、
コチラに投稿させていただきました。
http://rpgツクールvx.seesaa.net/article/220953643.html
現在の状況:HP/ MPダメージをできたのですが、回復の設定がわからない状態です。
状態:回復スキルを使用すると、「キャラ名は -10000万のダメージを受けた!」と表示されますが回復はしている状態ですHP/MPも同じ設定になっています。
どうか、よろしくおねがいします。
コード: 全て選択
#==============================================================================
# ■ Vocab
#------------------------------------------------------------------------------
# 用語とメッセージを定義するモジュールです。定数でメッセージなどを直接定義す
# るほか、グローバル変数 $data_system から用語データを取得します。
#==============================================================================
module Vocab
# アクター対象の行動結果
ActorDamage = "%sは %s%s のダメージを受けた!"
ActorLoss = "%sの%sが %s 減った!"
ActorDrain = "%sは%sを %s 奪われた!"
ActorNoDamage = "%sはダメージを受けていない!"
ActorNoHit = "%sに命中しなかった……。"
ActorEvasion = "%sは回避した。"
ActorRecovery = "%sの%sが %s%s 回復した!"
# 敵キャラ対象の行動結果
EnemyDamage = "%sに %s%s のダメージを与えた!"
EnemyLoss = "%sの%sが %s 減った!"
EnemyDrain = "%sの%sを %s 奪った!"
EnemyNoDamage = "%sに攻撃が効かない。"
EnemyNoHit = "%sに命中しなかった……。"
EnemyEvasion = "%sは回避した。"
EnemyRecovery = "%sの%sが %s 回復した!"
コード: 全て選択
#--------------------------------------------------------------------------
# ○ HP ダメージ表示
# target : 対象者
# obj : スキルまたはアイテム
#--------------------------------------------------------------------------
def display_hp_damage(target, obj = nil)
if target.hp_damage == 0 # ノーダメージ
return if obj != nil and obj.damage_to_mp
return if obj != nil and obj.base_damage == 0
fmt = target.actor? ? Vocab::ActorNoDamage : Vocab::EnemyNoDamage
text = sprintf(fmt, target.name)
elsif target.absorbed # 吸収
fmt = target.actor? ? Vocab::ActorDrain : Vocab::EnemyDrain
text = sprintf(fmt, target.name, Vocab::hp, target.hp_damage)
elsif target.hp_damage < 9999 #9999ダメージまで
if target.actor?
text = sprintf(Vocab::ActorDamage, target.name, target.hp_damage, ' ')
Sound.play_actor_damage
$game_troop.screen.start_shake(5, 5, 10)
else
text = sprintf(Vocab::EnemyDamage, target.name, target.hp_damage, ' ')
Sound.play_enemy_damage
target.blink = true
end
elsif target.hp_damage > 9999 and target.hp_damage < 100000000 #1万~1億未満
if target.actor?
text = sprintf(Vocab::ActorDamage, target.name, target.hp_damage / 10000,'万')
Sound.play_actor_damage
$game_troop.screen.start_shake(5, 5, 10)
else
text = sprintf(Vocab::EnemyDamage, target.name, target.hp_damage / 10000,'万')
Sound.play_enemy_damage
target.blink = true
end
elsif target.hp_damage > 100000000 and target.hp_damage < 1000000000000 #1億~1京未満
if target.actor?
text = sprintf(Vocab::ActorDamage, target.name, target.hp_damage / 1000000000, '億')
Sound.play_actor_damage
$game_troop.screen.start_shake(5, 5, 10)
else
text = sprintf(Vocab::EnemyDamage, target.name, target.hp_damage / 1000000000, '億')
Sound.play_enemy_damage
target.blink = true
end
else # 回復
fmt = target.actor? ? Vocab::ActorRecovery : Vocab::EnemyRecovery
text = sprintf(fmt, target.name, Vocab::hp, -target.hp_damage)
Sound.play_recovery
end
@message_window.add_instant_text(text)
wait(30)
end
Re: 【RGSS2】ダメージに単位を付けたいのですが・・・。
Posted: 2021年2月25日(木) 21:29
by faida
こんばんは。
コード: 全て選択
elsif target.hp_damage < 9999 #9999ダメージまで
この部分がありますが、この条件分岐だと回復(target.hp_damage < 0)も含むため、
記載された現象が起きていると思われます。
なので該当部分を
コード: 全て選択
elsif target.hp_damage > 0 and target.hp_damage < 9999 #9999ダメージまで
にしたうえで、
コード: 全て選択
elsif target.hp_damage > -9999 #9999回復まで
(中略)
elsif target.hp_damage < -9999 and target.hp_damage > -100000000 #1万~1億未満
(中略)
elsif target.hp_damage < -100000000 and target.hp_damage > -1000000000000 #1億~1京未満
のように回復条件を追加するとよいでしょう。
Re: 【RGSS2】ダメージに単位を付けたいのですが・・・。
Posted: 2021年2月25日(木) 22:14
by Mirin
返信ありがとうございます。
これらのコードはVX純正スクリプトからの抜粋です。
回復というところに、下記コードをいれればいいのですか?
コード: 全て選択
elsif target.hp_damage > -9999 #9999回復まで
(中略)
elsif target.hp_damage < -9999 and target.hp_damage > -100000000 #1万~1億未満
(中略)
elsif target.hp_damage < -100000000 and target.hp_damage > -1000000000000 #1億~1京未満
下記のような感じでしょうか?
コード: 全て選択
#--------------------------------------------------------------------------
# ○ HP ダメージ表示
# target : 対象者
# obj : スキルまたはアイテム
#--------------------------------------------------------------------------
def display_hp_damage(target, obj = nil)
if target.hp_damage == 0 # ノーダメージ
return if obj != nil and obj.damage_to_mp
return if obj != nil and obj.base_damage == 0
fmt = target.actor? ? Vocab::ActorNoDamage : Vocab::EnemyNoDamage
text = sprintf(fmt, target.name)
elsif target.absorbed # 吸収
fmt = target.actor? ? Vocab::ActorDrain : Vocab::EnemyDrain
text = sprintf(fmt, target.name, Vocab::hp, target.hp_damage)
elsif target.hp_damage > 0 and target.hp_damage < 9999 #9999ダメージまで
if target.actor?
text = sprintf(Vocab::ActorDamage, target.name, target.hp_damage, ' ')
Sound.play_actor_damage
$game_troop.screen.start_shake(5, 5, 10)
else
text = sprintf(Vocab::EnemyDamage, target.name, target.hp_damage, ' ')
Sound.play_enemy_damage
target.blink = true
end
elsif target.hp_damage > -9999 #9999ダメージまで
if target.actor?
text = sprintf(Vocab::ActorDamage, target.name, target.hp_damage, ' ')
Sound.play_actor_damage
$game_troop.screen.start_shake(5, 5, 10)
else
text = sprintf(Vocab::EnemyDamage, target.name, target.hp_damage, ' ')
Sound.play_enemy_damage
target.blink = true
end
elsif target.hp_damage < -9999 and target.hp_damage > -100000000 #1万~1億未満
if target.actor?
text = sprintf(Vocab::ActorDamage, target.name, target.hp_damage / 10000,'万')
Sound.play_actor_damage
$game_troop.screen.start_shake(5, 5, 10)
else
text = sprintf(Vocab::EnemyDamage, target.name, target.hp_damage / 10000,'万')
Sound.play_enemy_damage
target.blink = true
end
elsif target.hp_damage < -100000000 and target.hp_damage > -1000000000000 #1億~1京
if target.actor?
text = sprintf(Vocab::ActorDamage, target.name, target.hp_damage / 1000000000, '億')
Sound.play_actor_damage
$game_troop.screen.start_shake(5, 5, 10)
else
text = sprintf(Vocab::EnemyDamage, target.name, target.hp_damage / 1000000000, '億')
Sound.play_enemy_damage
target.blink = true
end
else # 回復
fmt = target.actor? ? Vocab::ActorRecovery : Vocab::EnemyRecovery
text = sprintf(fmt, target.name, Vocab::hp, -target.hp_damage)
Sound.play_recovery
end
@message_window.add_instant_text(text)
wait(30)
end
Re: 【RGSS2】ダメージに単位を付けたいのですが・・・。
Posted: 2021年2月25日(木) 22:43
by faida
大体そのような感じですね。
あとは回復メッセージに変更すれば大丈夫そうです。
※条件文のダメージの値を一部修正しました。
コード: 全て選択
#--------------------------------------------------------------------------
# ○ HP ダメージ表示
# target : 対象者
# obj : スキルまたはアイテム
#--------------------------------------------------------------------------
def display_hp_damage(target, obj = nil)
if target.hp_damage == 0 # ノーダメージ
return if obj != nil and obj.damage_to_mp
return if obj != nil and obj.base_damage == 0
fmt = target.actor? ? Vocab::ActorNoDamage : Vocab::EnemyNoDamage
text = sprintf(fmt, target.name)
elsif target.absorbed # 吸収
fmt = target.actor? ? Vocab::ActorDrain : Vocab::EnemyDrain
text = sprintf(fmt, target.name, Vocab::hp, target.hp_damage)
# ダメージ
elsif target.hp_damage > 0 and target.hp_damage <= 9999 #9999ダメージまで
if target.actor?
text = sprintf(Vocab::ActorDamage, target.name, target.hp_damage, ' ')
Sound.play_actor_damage
$game_troop.screen.start_shake(5, 5, 10)
else
text = sprintf(Vocab::EnemyDamage, target.name, target.hp_damage, ' ')
Sound.play_enemy_damage
target.blink = true
end
elsif target.hp_damage > 9999 and target.hp_damage < 100000000 #1万~1億未満
if target.actor?
text = sprintf(Vocab::ActorDamage, target.name, target.hp_damage / 10000,'万')
Sound.play_actor_damage
$game_troop.screen.start_shake(5, 5, 10)
else
text = sprintf(Vocab::EnemyDamage, target.name, target.hp_damage / 10000,'万')
Sound.play_enemy_damage
target.blink = true
end
elsif target.hp_damage > 99999999 and target.hp_damage < 1000000000000 #1億~1京未満
if target.actor?
text = sprintf(Vocab::ActorDamage, target.name, target.hp_damage / 1000000000, '億')
Sound.play_actor_damage
$game_troop.screen.start_shake(5, 5, 10)
else
text = sprintf(Vocab::EnemyDamage, target.name, target.hp_damage / 1000000000, '億')
Sound.play_enemy_damage
target.blink = true
end
# 回復
elsif target.hp_damage < 0 and target.hp_damage => -9999 #9999回復まで
fmt = target.actor? ? Vocab::ActorRecovery : Vocab::EnemyRecovery
text = sprintf(fmt, target.name, Vocab::hp, -target.hp_damage, ' ')
Sound.play_recovery
elsif target.hp_damage < -9999 and target.hp_damage > -100000000 #1万~1億未満
fmt = target.actor? ? Vocab::ActorRecovery : Vocab::EnemyRecovery
text = sprintf(fmt, target.name, Vocab::hp, -target.hp_damage / 10000, '万')
Sound.play_recovery
elsif target.hp_damage < -99999999 and target.hp_damage > -1000000000000 #1億~1京
fmt = target.actor? ? Vocab::ActorRecovery : Vocab::EnemyRecovery
text = sprintf(fmt, target.name, Vocab::hp, -target.hp_damage / 1000000000, '億')
Sound.play_recovery
end
@message_window.add_instant_text(text)
wait(30)
end
※22:50 エフェクトがおかしいので修正
※共通化できるところは共通化したほうがいいような気がした版
コード: 全て選択
#--------------------------------------------------------------------------
# ○ HP ダメージ表示
# target : 対象者
# obj : スキルまたはアイテム
#--------------------------------------------------------------------------
def display_hp_damage(target, obj = nil)
if target.hp_damage == 0 # ノーダメージ
return if obj != nil and obj.damage_to_mp
return if obj != nil and obj.base_damage == 0
fmt = target.actor? ? Vocab::ActorNoDamage : Vocab::EnemyNoDamage
text = sprintf(fmt, target.name)
elsif target.absorbed # 吸収
fmt = target.actor? ? Vocab::ActorDrain : Vocab::EnemyDrain
text = sprintf(fmt, target.name, Vocab::hp, target.hp_damage)
# ダメージ
elsif target.hp_damage > 0
if target.hp_damage > 99999999 # 億
digit = '億'
value = target.hp_damage / 100000000
elsif target.hp_damage > 9999
digit = '万'
value = target.hp_damage / 10000
else
digit = ' '
value = target.hp_damage
end
fmt = target.actor? ? Vocab::ActorDamage : Vocab::EnemyDamage
text = sprintf(fmt, target.name, value, digit)
if target.actor?
Sound.play_actor_damage
$game_troop.screen.start_shake(5, 5, 10)
else
Sound.play_enemy_damage
target.blink = true
end
# 回復
else target.hp_damage < 0
if target.hp_damage < -99999999 # 億
digit = '億'
value = target.hp_damage / 100000000
elsif target.hp_damage < -9999
digit = '万'
value = target.hp_damage / 10000
else
digit = ' '
value = target.hp_damage
end
fmt = target.actor? ? Vocab::ActorRecovery : Vocab::EnemyRecovery
text = sprintf(fmt, target.name, Vocab::hp, -value, digit)
Sound.play_recovery
end
@message_window.add_instant_text(text)
wait(30)
end
Re: 【RGSS2】ダメージに単位を付けたいのですが・・・。
Posted: 2021年2月25日(木) 23:13
by Mirin
1番目と2番目(共通化)ありがとうございます。
1,2番目の動作確認で回復、ダメも万と表示しました。(共通化が、わかりやすく使用させていただきます。)
キャラがHP/ MP吸収スキルを使用すると2桁と表示されるので、別対応が必要なのかな?と思いました。
コード: 全て選択
Vocab
ActorLoss = "%sの%sが %s 減った!"#%s1個のみ
ActorDrain = "%sは%sを %s 奪われた!"
(中略)
EnemyLoss = "%sの%sが %s 減った!"#%s1個のみ
EnemyDrain = "%sの%sを %s 奪った!"
Re: 【RGSS2】ダメージに単位を付けたいのですが・・・。
Posted: 2021年2月25日(木) 23:58
by faida
吸収も対応するなら、メッセージの部分は%sを2つにした上で
コード: 全て選択
elsif target.absorbed # 吸収
if target.hp_damage > 99999999 # 億
digit = '億'
value = target.hp_damage / 100000000
elsif target.hp_damage > 9999
digit = '万'
value = target.hp_damage / 10000
else
digit = ' '
value = target.hp_damage
end
fmt = target.actor? ? Vocab::ActorDrain : Vocab::EnemyDrain
text = sprintf(fmt, target.name, Vocab::hp, value, digit)
と変更するとできるはずです。
ちなみにメッセージの○○LossはMPダメージの時の文章ですね。
これも同様の対応をすると単位がつくはずです。
Re: 【RGSS2】ダメージに単位を付けたいのですが・・・。
Posted: 2021年2月26日(金) 00:58
by Mirin
なんども連絡して、すみません。
MP3ダメージは、こんな感じかな?と思いましたが何かが違うらしく。
ご伝授お願い致します。
コード: 全て選択
#--------------------------------------------------------------------------
# ● MP ダメージ表示
# target : 対象者
# obj : スキルまたはアイテム
#--------------------------------------------------------------------------
def display_mp_damage(target, obj = nil)
return if target.dead?
return if target.mp_damage == 0
elsif target.absorbed # 吸収
if target.mp_damage > 99999999 #億
digit = '億'
value = target.mp_damage / 100000000
elsif target.mp_damage > 9999
digit = '万'
value = target.mp_damage / 10000
else
digit = ' '
value = target.mp_damage
end
fmt = target.actor? ? Vocab::ActorDrain : Vocab::EnemyDrain
text = sprintf(fmt, target.name, Vocab::mp, value, digit)
# MPダメージ
elsif target.mp_damage > 0 # 9999ダメージまで
if target.mp_damage > 99999999 #億
digit = '億'
value = target.mp_damage / 100000000
elsif target.mp_damage > 9999
digit = '万'
value = target.mp_damage / 10000
else
digit = ' '
value = target.mp_damage
end
fmt = target.actor? ? Vocab::ActorLoss : Vocab::EnemyLoss
text = sprintf(fmt, target.name, value, digit)
if target.actor?
Sound.play_actor_damage
$game_troop.screen.start_shake(5, 5, 10)
else
Sound.play_enemy_damage
target.blink = true
end
# 回復
elsif target.mp_damage > 0 # 9999ダメージまで
if target.mp_damage > 99999999 #億
digit = '億'
value = target.mp_damage / 100000000
elsif target.mp_damage > 9999
digit = '万'
value = target.mp_damage / 10000
else
digit = ' '
value = target.mp_damage
end
fmt = target.actor? ? Vocab::ActorRecovery : Vocab::EnemyRecovery
text = sprintf(fmt, target.name, Vocab::mp, -value, digit)
Sound.play_recovery
end
@message_window.add_instant_text(text)
wait(30)
end
Re: 【RGSS2】ダメージに単位を付けたいのですが・・・。
Posted: 2021年2月26日(金) 13:12
by faida
回復の部分がダメージのものと同じだったので、回復がうまくいかないと思われます。
また、条件文の一部にも不具合があったので、そこも併せて修正したものが以下です。
コード: 全て選択
#--------------------------------------------------------------------------
# ● MP ダメージ表示
# target : 対象者
# obj : スキルまたはアイテム
#--------------------------------------------------------------------------
def display_mp_damage(target, obj = nil)
return if target.dead?
return if target.mp_damage == 0
if target.absorbed # 吸収
if target.mp_damage > 99999999 #億
digit = '億'
value = target.mp_damage / 100000000
elsif target.mp_damage > 9999
digit = '万'
value = target.mp_damage / 10000
else
digit = ' '
value = target.mp_damage
end
fmt = target.actor? ? Vocab::ActorDrain : Vocab::EnemyDrain
text = sprintf(fmt, target.name, Vocab::mp, value, digit)
# MPダメージ
elsif target.mp_damage > 0 # 9999ダメージまで
if target.mp_damage > 99999999 #億
digit = '億'
value = target.mp_damage / 100000000
elsif target.mp_damage > 9999
digit = '万'
value = target.mp_damage / 10000
else
digit = ' '
value = target.mp_damage
end
fmt = target.actor? ? Vocab::ActorLoss : Vocab::EnemyLoss
text = sprintf(fmt, target.name, value, digit)
# 回復
elsif target.mp_damage < 0 # 9999ダメージまで
if target.mp_damage < -99999999 #億
digit = '億'
value = target.mp_damage / 100000000
elsif target.mp_damage < -9999
digit = '万'
value = target.mp_damage / 10000
else
digit = ' '
value = target.mp_damage
end
fmt = target.actor? ? Vocab::ActorRecovery : Vocab::EnemyRecovery
text = sprintf(fmt, target.name, Vocab::mp, -value, digit)
Sound.play_recovery
end
@message_window.add_instant_text(text)
wait(30)
end
Re: 【RGSS2】ダメージに単位を付けたいのですが・・・。
Posted: 2021年2月26日(金) 21:52
by Mirin
ご丁寧に指摘ありがとうございます。
無事、HP/ MP吸収でダメージ単位が表示されました。
最後に確認用です。何もなければいいのですが・・・。
Faidaさんをエンドロール or Readmeに記載します。
コード: 全て選択
#==============================================================================
# ■ Vocab
#------------------------------------------------------------------------------
# 用語とメッセージを定義するモジュールです。定数でメッセージなどを直接定義す
# るほか、グローバル変数 $data_system から用語データを取得します。
#==============================================================================
module Vocab
# アクター対象の行動結果
ActorDamage = "%sは %s%s のダメージを受けた!"
ActorLoss = "%sの%sが %s%s 減った!"
ActorDrain = "%sは%sを %s%s 奪われた!"
(中略)
ActorRecovery = "%sの%sが %s%s 回復した!"
# 敵キャラ対象の行動結果
EnemyDamage = "%sに %s%s のダメージを与えた!"
EnemyLoss = "%sの%sが %s%s 減った!"#%s1個のみ
EnemyDrain = "%sの%sを %s%s 奪った!"
(中略)
EnemyRecovery = "%sの%sが %s%s 回復した!"
end
コード: 全て選択
#--------------------------------------------------------------------------
# ○ HP ダメージ表示
# target : 対象者
# obj : スキルまたはアイテム
#--------------------------------------------------------------------------
def display_hp_damage(target, obj = nil)
if target.hp_damage == 0 # ノーダメージ
return if obj != nil and obj.damage_to_mp
return if obj != nil and obj.base_damage == 0
fmt = target.actor? ? Vocab::ActorNoDamage : Vocab::EnemyNoDamage
text = sprintf(fmt, target.name)
elsif target.absorbed # 吸収
if target.hp_damage > 99999999 # 億
digit = '億'
value = target.hp_damage / 100000000
elsif target.hp_damage > 9999
digit = '万'
value = target.hp_damage / 10000
else
digit = ' '
value = target.hp_damage
end
fmt = target.actor? ? Vocab::ActorDrain : Vocab::EnemyDrain
text = sprintf(fmt, target.name, Vocab::hp, value, digit)
# ダメージ
elsif target.hp_damage > 0
if target.hp_damage > 99999999 # 億
digit = '億'
value = target.hp_damage / 100000000
elsif target.hp_damage > 9999
digit = '万'
value = target.hp_damage / 10000
else
digit = ' '
value = target.hp_damage
end
fmt = target.actor? ? Vocab::ActorDamage : Vocab::EnemyDamage
text = sprintf(fmt, target.name, value, digit)
if target.actor?
Sound.play_actor_damage
$game_troop.screen.start_shake(5, 5, 10)
else
Sound.play_enemy_damage
target.blink = true
end
# 回復
else target.hp_damage < 0
if target.hp_damage < -99999999 # 億
digit = '億'
value = target.hp_damage / 100000000
elsif target.hp_damage < -9999
digit = '万'
value = target.hp_damage / 10000
else
digit = ' '
value = target.hp_damage
end
fmt = target.actor? ? Vocab::ActorRecovery : Vocab::EnemyRecovery
text = sprintf(fmt, target.name, Vocab::hp, -value, digit)
Sound.play_recovery
end
@message_window.add_instant_text(text)
wait(30)
end
コード: 全て選択
#--------------------------------------------------------------------------
# ● MP ダメージ表示
# target : 対象者
# obj : スキルまたはアイテム
#--------------------------------------------------------------------------
def display_mp_damage(target, obj = nil)
return if target.dead?
return if target.mp_damage == 0
if target.absorbed # 吸収
if target.mp_damage > 99999999 #億
digit = '億'
value = target.mp_damage / 100000000
elsif target.mp_damage > 9999
digit = '万'
value = target.mp_damage / 10000
else
digit = ' '
value = target.mp_damage
end
fmt = target.actor? ? Vocab::ActorDrain : Vocab::EnemyDrain
text = sprintf(fmt, target.name, Vocab::mp, value, digit)
# MPダメージ
elsif target.mp_damage > 0 # 9999ダメージまで
if target.mp_damage > 99999999 #億
digit = '億'
value = target.mp_damage / 100000000
elsif target.mp_damage > 9999
digit = '万'
value = target.mp_damage / 10000
else
digit = ' '
value = target.mp_damage
end
fmt = target.actor? ? Vocab::ActorLoss : Vocab::EnemyLoss
text = sprintf(fmt, target.name, value, digit)
# 回復
elsif target.mp_damage < 0 # 9999ダメージまで
if target.mp_damage < -99999999 #億
digit = '億'
value = target.mp_damage / 100000000
elsif target.mp_damage < -9999
digit = '万'
value = target.mp_damage / 10000
else
digit = ' '
value = target.mp_damage
end
fmt = target.actor? ? Vocab::ActorRecovery : Vocab::EnemyRecovery
text = sprintf(fmt, target.name, Vocab::mp, -value, digit)
Sound.play_recovery
end
@message_window.add_instant_text(text)
wait(30)
end