Project1
标题: 这个护盾的脚本,请大家伙看看 [打印本页]
作者: 踢腿水上飘 时间: 2017-2-22 12:00
标题: 这个护盾的脚本,请大家伙看看
本帖最后由 踢腿水上飘 于 2017-2-22 14:25 编辑
这个脚本可以提供一个护盾技能,使用后附加状态63,护盾值取决于变量84的值,上了护盾之后受到攻击先扣变量84的值,扣到0了才破盾扣血
但这个脚本有几个问题
一是如果给单体加护盾的话,就会出现给A上盾之后,再给B上盾就会把A的护盾刷新了……而且,即使给2个人都上了盾,护盾的总值也是不变的,比如护盾1000点,即便给2个人上盾,也只能吸收1000点总伤害,而不是分别吸收1000点伤害。
二是我在技能使用信息那里写的“全体队员获得了共\v[84]点护盾。”,但在测试中发现显示的是0点,,,好像原因是先显示使用时的信息,然后才给变量84赋值,这个问题好解决吗?
class Game_Actor
alias apply_guard_without_state apply_guard
def apply_guard(value)
value = apply_guard_without_state(value)
if state?(63) && value > 0 # 50 号状态
v = $game_variables
if v[84] >= value # 30 号变量
$Hurt_Shield = value
$Magic_Shield = "have"
v[84] -= value.to_i
0
else
value -= v[84]
$Hurt_Shield = value
$Magic_Shield = "have"
v[84] = 0
$game_party.members.each {|actor| actor.remove_state(84) }
value
end
else
$Magic_Shield = ""
value
end
end
end
class Game_ActionResult
#--------------------------------------------------------------------------
# ● 获取 HP 伤害的文字
#--------------------------------------------------------------------------
def hp_damage_text
if @hp_drain > 0
fmt = @battler.actor? ? Vocab::ActorDrain : Vocab::EnemyDrain
sprintf(fmt, @battler.name, Vocab::hp, @hp_drain)
elsif @hp_damage > 0
fmt = @battler.actor? ? Vocab::ActorDamage : Vocab::EnemyDamage
sprintf(fmt, @battler.name, @hp_damage)
elsif @hp_damage < 0
fmt = @battler.actor? ? Vocab::ActorRecovery : Vocab::EnemyRecovery
sprintf(fmt, @battler.name, Vocab::hp, -hp_damage)
elsif $Magic_Shield == "have"
fmt = "护盾抵消了%s点伤害,还剩下\\v[84]点护盾。"
sprintf(fmt,$Hurt_Shield.to_i)
else
fmt = @battler.actor? ? Vocab::ActorNoDamage : Vocab::EnemyNoDamage
sprintf(fmt, @battler.name)
end
end
end
class Game_Actor
alias apply_guard_without_state apply_guard
def apply_guard(value)
value = apply_guard_without_state(value)
if state?(63) && value > 0 # 50 号状态
v = $game_variables
if v[84] >= value # 30 号变量
$Hurt_Shield = value
$Magic_Shield = "have"
v[84] -= value.to_i
0
else
value -= v[84]
$Hurt_Shield = value
$Magic_Shield = "have"
v[84] = 0
$game_party.members.each {|actor| actor.remove_state(84) }
value
end
else
$Magic_Shield = ""
value
end
end
end
class Game_ActionResult
#--------------------------------------------------------------------------
# ● 获取 HP 伤害的文字
#--------------------------------------------------------------------------
def hp_damage_text
if @hp_drain > 0
fmt = @battler.actor? ? Vocab::ActorDrain : Vocab::EnemyDrain
sprintf(fmt, @battler.name, Vocab::hp, @hp_drain)
elsif @hp_damage > 0
fmt = @battler.actor? ? Vocab::ActorDamage : Vocab::EnemyDamage
sprintf(fmt, @battler.name, @hp_damage)
elsif @hp_damage < 0
fmt = @battler.actor? ? Vocab::ActorRecovery : Vocab::EnemyRecovery
sprintf(fmt, @battler.name, Vocab::hp, -hp_damage)
elsif $Magic_Shield == "have"
fmt = "护盾抵消了%s点伤害,还剩下\\v[84]点护盾。"
sprintf(fmt,$Hurt_Shield.to_i)
else
fmt = @battler.actor? ? Vocab::ActorNoDamage : Vocab::EnemyNoDamage
sprintf(fmt, @battler.name)
end
end
end
作者: QQ蚊子湯 时间: 2017-2-22 13:33
你之前解這一題的時候不是就會加實例變量了嗎~
https://rpg.blue/forum.php?mod=v ... peid%26typeid%3D479
作者: 踢腿水上飘 时间: 2017-2-22 14:17
本帖最后由 踢腿水上飘 于 2017-2-22 14:21 编辑
那是别人的脚本啊,我并不会……
给每个人分别上盾真是头大
作者: QQ蚊子湯 时间: 2017-2-22 14:31
class Game_Actor
attr_accessor :description
def description
@description || actor.description
end
end
可以依樣畫葫蘆阿
把說明改成護盾 (變數名)
文字改成數字而已 (變數值)
計算傷害的時候調用 傷害-self.護盾值方法 (此為理解用的偽代碼)
你想加判斷可以創一個方法 (理解用偽代碼)
def 護盾?
@護盾值 > 0
end
(類似你上面用全局變量$Magic_Shield做的事情)
總之就是你把$Hurt_Shield改成@Hurt_Shield就可以個別判斷了
作者: QQ蚊子湯 时间: 2017-2-27 07:44
本帖最后由 QQ蚊子湯 于 2017-2-27 07:45 编辑
連假早上有點空閒,寫個給你參考
我沒怎麼改你的結構,只改我想吐血的部分www
你可以感受一下實例變量和全局變量的不同之處
class Game_Actor
attr_accessor :game_Shield
attr_accessor :magic_Shield
def add_state(state_id)
super
self.game_Shield =500 if state_id == 50
end
def apply_guard(value)
super
if state?(50) && value > 0 # 50 号状态
v = @game_Shield
if v >= value
@hurt_Shield = value
@magic_Shield = true
@game_Shield -= value.to_i
return 0
else
value -= v
@hurt_Shield = value
@magic_Shield = true
@game_Shield = 0
self.remove_state(50)
value
end
else
@magic_Shield = false
value
end
end
end
class Game_ActionResult
#--------------------------------------------------------------------------
# ● 获取 HP 伤害的文字
#--------------------------------------------------------------------------
def hp_damage_text
if @hp_drain > 0
fmt = @battler.actor? ? Vocab::ActorDrain : Vocab::EnemyDrain
sprintf(fmt, @battler.name, Vocab::hp, @hp_drain)
elsif @hp_damage > 0
fmt = @battler.actor? ? Vocab::ActorDamage : Vocab::EnemyDamage
sprintf(fmt, @battler.name, @hp_damage)
elsif @hp_damage < 0
fmt = @battler.actor? ? Vocab::ActorRecovery : Vocab::EnemyRecovery
sprintf(fmt, @battler.name, Vocab::hp, -hp_damage)
elsif @battler.magic_Shield == true
fmt = "护盾抵消了%s点伤害,还剩下#{@battler.game_Shield}点护盾。"
@battler.magic_Shield = false
sprintf(fmt,@Hurt_Shield.to_i)
else
fmt = @battler.actor? ? Vocab::ActorNoDamage : Vocab::EnemyNoDamage
sprintf(fmt, @battler.name)
end
end
end
class Game_Actor
attr_accessor :game_Shield
attr_accessor :magic_Shield
def add_state(state_id)
super
self.game_Shield =500 if state_id == 50
end
def apply_guard(value)
super
if state?(50) && value > 0 # 50 号状态
v = @game_Shield
if v >= value
@hurt_Shield = value
@magic_Shield = true
@game_Shield -= value.to_i
return 0
else
value -= v
@hurt_Shield = value
@magic_Shield = true
@game_Shield = 0
self.remove_state(50)
value
end
else
@magic_Shield = false
value
end
end
end
class Game_ActionResult
#--------------------------------------------------------------------------
# ● 获取 HP 伤害的文字
#--------------------------------------------------------------------------
def hp_damage_text
if @hp_drain > 0
fmt = @battler.actor? ? Vocab::ActorDrain : Vocab::EnemyDrain
sprintf(fmt, @battler.name, Vocab::hp, @hp_drain)
elsif @hp_damage > 0
fmt = @battler.actor? ? Vocab::ActorDamage : Vocab::EnemyDamage
sprintf(fmt, @battler.name, @hp_damage)
elsif @hp_damage < 0
fmt = @battler.actor? ? Vocab::ActorRecovery : Vocab::EnemyRecovery
sprintf(fmt, @battler.name, Vocab::hp, -hp_damage)
elsif @battler.magic_Shield == true
fmt = "护盾抵消了%s点伤害,还剩下#{@battler.game_Shield}点护盾。"
@battler.magic_Shield = false
sprintf(fmt,@Hurt_Shield.to_i)
else
fmt = @battler.actor? ? Vocab::ActorNoDamage : Vocab::EnemyNoDamage
sprintf(fmt, @battler.name)
end
end
end
作者: newface 时间: 2019-2-17 20:58
我用了楼上改良版的脚本,发现未使用护盾技能时攻击敌人有时会报错,报错是45行enemy什么的,不知道是怎么回事。
而当友方附加护盾时,提示永远是吸收了0伤害,护盾剩余数倒是正确,但是好像如果一次性伤害大于护盾数,则没有任何吸收造成没有减免的伤害,这好像也不对吧?
欢迎光临 Project1 (https://rpg.blue/) |
Powered by Discuz! X3.1 |