Project1
标题:
各种攻击效果【魔法盾,吸血,吸蓝】
[打印本页]
作者:
芯☆淡茹水
时间:
2013-2-16 13:01
标题:
各种攻击效果【魔法盾,吸血,吸蓝】
本帖最后由 芯☆淡茹水 于 2013-2-16 14:35 编辑
无聊时做的小玩意儿,介绍请看脚本。
1,魔法盾状态:当角色或敌人处于该状态时,总伤害 = 脚本设置的 HP 伤害百分比/100 + SP 伤害百分比/100
2,吸血:当角色或敌人使用该吸血特技时,吸血量 = 总伤害 乘以 吸血 百分比/100
3,吸蓝:当角色或敌人使用该吸蓝特技时,吸蓝量 = 对象 SP 减少量 乘以 百分比/100
建议下载工程,里面的东西已经调好,可直接测试。
脚本:
#==============================================================================
#★【攻击效果】★ 《魔法盾,吸血,吸蓝》
#------------------------------------------------------------------------------
# by 芯☆淡茹水
#------------------------------------------------------------------------------
#(该脚本为简易版,不显示角色因吸血;吸蓝等HP,SP改变而显示的数字。)
#(角色具体的HP;SP改变的值,请看角色的HP;SP血槽。)
#==============================================================================
#◆ 使用方法:
# 复制该脚本,插入到 main 前。
#==============================================================================
#◆ 说明:
#------------------------------------------------------------------------------
#Ⅰ魔法盾: 使用“魔法盾”特技,附加一个“魔法盾”的状态。当角色处于该状态
# 时,受到的总伤害 = hp伤害 + sp伤害。hp,sp的具体伤害百分比,下面有设置。
#
# 当角色 sp = 0 时,自动解除该“魔法盾”状态,受到的伤害全部恢复为
# hp 伤害。也可在数据库设置该“魔法盾”状态解除的条件。(比如持续几回合)
#------------------------------------------------------------------------------
#Ⅱ吸血:这个不用多介绍,下面有吸血量是总伤害的百分比设置。
# (百分比的设置:比如设置为 50 也就是 50% 。 攻击敌人的伤害是 100 的话,
# 自身回复 HP 50 ;攻击敌人的伤害是 150 的话,自身回复 HP 75 ;,,,,)
#------------------------------------------------------------------------------
#Ⅲ吸蓝:使用吸蓝特技,被攻击者只减少 SP 。如果被攻击者 SP = 0 。使用吸蓝特技
# 的伤害为 0 ,吸蓝无效。下面有吸蓝量百分比设置。
#==============================================================================
#◆ 设置项:
#------------------------------------------------------------------------------
INT_STATE_ID = 10 #“魔法盾”状态 ID 。
INT_HP = 20 #“魔法盾”状态下 HP 减少的百分比。
INT_SP = 80 #“魔法盾”状态下 SP 减少的百分比。
SKILLRECOVER_HP_ID = 10 # 吸血特技 ID 。
RECOVER_HP = 50 # 吸的 HP 量为总伤害的百分比。
SKILLRECOVER_SP_ID = 11 # 吸蓝特技 ID 。
RECOVER_SP = 50 # 吸收的 SP 量为对方失去 SP 的百分比。
#==============================================================================
class Game_Battler
#---------------------------------------------------------------------------
def attack_effect(attacker)
self.critical = false
hit_result = (rand(100) < attacker.hit)
if hit_result == true
atk = [attacker.atk - self.pdef / 2, 0].max
self.damage = atk * (20 + attacker.str) / 20
self.damage *= elements_correct(attacker.element_set)
self.damage /= 100
if self.damage > 0
if rand(100) < 4 * attacker.dex / self.agi
self.damage *= 2
self.critical = true
end
if self.guarding?
self.damage /= 2
end
end
if self.damage.abs > 0
amp = [self.damage.abs * 15 / 100, 1].max
self.damage += rand(amp+1) + rand(amp+1) - amp
end
eva = 8 * self.agi / attacker.dex + self.eva
hit = self.damage < 0 ? 100 : 100 - eva
hit = self.cant_evade? ? 100 : hit
hit_result = (rand(100) < hit)
end
if hit_result == true
remove_states_shock
if states.include?(INT_STATE_ID)
if self.sp == 0
self.hp -= self.damage
remove_state(INT_STATE_ID)
else
self.hp -= self.damage * INT_HP / 100
self.sp -= self.damage * INT_SP / 100
end
else
self.hp -= self.damage
end
@state_changed = false
states_plus(attacker.plus_state_set)
states_minus(attacker.minus_state_set)
else
self.damage = "Miss"
self.critical = false
end
return true
end
#----------------------------------------------------------------------------
def skill_effect(user, skill)
self.critical = false
if ((skill.scope == 3 or skill.scope == 4) and self.hp == 0) or
((skill.scope == 5 or skill.scope == 6) and self.hp >= 1)
return false
end
effective = false
effective |= skill.common_event_id > 0
hit = skill.hit
if skill.atk_f > 0
hit *= user.hit / 100
end
hit_result = (rand(100) < hit)
effective |= hit < 100
if hit_result == true
power = skill.power + user.atk * skill.atk_f / 100
if power > 0
power -= self.pdef * skill.pdef_f / 200
power -= self.mdef * skill.mdef_f / 200
power = [power, 0].max
end
rate = 20
rate += (user.str * skill.str_f / 100)
rate += (user.dex * skill.dex_f / 100)
rate += (user.agi * skill.agi_f / 100)
rate += (user.int * skill.int_f / 100)
self.damage = power * rate / 20
self.damage *= elements_correct(skill.element_set)
self.damage /= 100
if self.damage > 0
if self.guarding?
self.damage /= 2
end
end
if skill.variance > 0 and self.damage.abs > 0
amp = [self.damage.abs * skill.variance / 100, 1].max
self.damage += rand(amp+1) + rand(amp+1) - amp
end
eva = 8 * self.agi / user.dex + self.eva
hit = self.damage < 0 ? 100 : 100 - eva * skill.eva_f / 100
hit = self.cant_evade? ? 100 : hit
hit_result = (rand(100) < hit)
effective |= hit < 100
end
if hit_result == true
if skill.power != 0 and skill.atk_f > 0
remove_states_shock
effective = true
end
last_hp = self.hp
if skill.id == SKILLRECOVER_SP_ID
if self.sp == 0
self.damage = 0
self.hp -= self.damage
else
self.sp -= self.damage
user.sp += self.damage * RECOVER_SP / 100
end
else
if states.include?(INT_STATE_ID)
if self.sp == 0
self.hp -= self.damage
remove_state(INT_STATE_ID)
else
self.hp -= self.damage * INT_HP / 100
self.sp -= self.damage * INT_SP / 100
end
else
self.hp -= self.damage
end
end
effective |= self.hp != last_hp
@state_changed = false
effective |= states_plus(skill.plus_state_set)
effective |= states_minus(skill.minus_state_set)
if skill.id == SKILLRECOVER_HP_ID
user.hp += self.damage * RECOVER_HP / 100
end
if skill.power == 0
self.damage = ""
unless @state_changed
self.damage = "Miss"
end
end
else
self.damage = "Miss"
end
unless $game_temp.in_battle
self.damage = nil
end
return effective
end
end
#==============================================================================
复制代码
工程:
攻击效果.rar
(188.96 KB, 下载次数: 380)
2013-2-16 13:01 上传
点击文件名下载附件
作者:
紫英晓狼1130
时间:
2013-2-16 13:57
看起来很实用,现在不在电脑上,请问"吸蓝"的脚本,是吸收为我方所用吗?
在注释里没有找到。
作者:
芯☆淡茹水
时间:
2013-2-16 14:03
本帖最后由 芯☆淡茹水 于 2013-2-16 14:29 编辑
紫英晓狼1130 发表于 2013-2-16 13:57
看起来很实用,现在不在电脑上,请问"吸蓝"的脚本,是吸收为我方所用吗?
在注释里没有找到。 ...
敌人伤害多少蓝,再根据脚本里设置的吸蓝百分比,使用吸蓝特技的角色恢复蓝 = 敌人伤害的蓝 乘以 百分比
吸蓝设的是 特技ID,如果敌人使用该特技,敌人也会吸蓝。
作者:
chd114
时间:
2013-3-24 21:48
如果敌人没蓝了吸蓝会不会依然有用?如果我想把吸蓝再做一个反馈要怎么改?
作者:
stevenrock
时间:
2013-3-29 00:09
不错哦,拿去研究研究
作者:
mengjiyao123
时间:
2013-9-25 11:16
多谢楼主分享
作者:
y967
时间:
2013-10-22 20:27
磨法盾和吸血的ID都是10?
作者:
终极骑士
时间:
2013-10-23 12:34
请问吸收的血量如何用“伤害美化脚本”显示?
作者:
诺比的影殇
时间:
2013-10-28 13:08
刚刚试了一下,很好用,谢谢LZ分享。
作者:
chd114
时间:
2013-12-23 15:09
发现你的战斗系统有两个BUG···开了魔法盾,如果伤害太小的话不掉魔力不减血,用了逆向动画的脚本后显示伤害的部分的脚本会卡住
$animation = 1#打开1号开关,动画倒着放:本脚本与添加SP伤害和动画冲突
module RPG
class Sprite < ::Sprite
def animation(animation, hit)
dispose_animation
@_animation = animation
return if @_animation == nil
@_animation_hit = hit
@_animation_duration = $game_switches[$animation] ? 1 : @_animation.frame_max
animation_name = @_animation.animation_name
animation_hue = @_animation.animation_hue
bitmap = RPG::Cache.animation(animation_name, animation_hue)
if @@_reference_count.include?(bitmap)
@@_reference_count[bitmap] += 1
else
@@_reference_count[bitmap] = 1
end
@_animation_sprites = []
if @_animation.position != 3 or not @@_animations.include?(animation)
for i in 0..15
sprite = ::Sprite.new(self.viewport)
sprite.bitmap = bitmap
sprite.visible = false
@_animation_sprites.push(sprite)
end
unless @@_animations.include?(animation)
@@_animations.push(animation)
end
end
update_animation
end
def loop_animation(animation)
return if animation == @_loop_animation
dispose_loop_animation
@_loop_animation = animation
return if @_loop_animation == nil
@_loop_animation_index = $game_switches[$animation] ? @_loop_animation.frame_max : 1
animation_name = @_loop_animation.animation_name
animation_hue = @_loop_animation.animation_hue
bitmap = RPG::Cache.animation(animation_name, animation_hue)
if @@_reference_count.include?(bitmap)
@@_reference_count[bitmap] += 1
else
@@_reference_count[bitmap] = 1
end
@_loop_animation_sprites = []
for i in 0..15
sprite = ::Sprite.new(self.viewport)
sprite.bitmap = bitmap
sprite.visible = false
@_loop_animation_sprites.push(sprite)
end
update_loop_animation
end
def update
super
if @_whiten_duration > 0
@_whiten_duration -= 1
self.color.alpha = 128 - (16 - @_whiten_duration) * 10
end
if @_appear_duration > 0
@_appear_duration -= 1
self.opacity = (16 - @_appear_duration) * 16
end
if @_escape_duration > 0
@_escape_duration -= 1
self.opacity = 256 - (32 - @_escape_duration) * 10
end
if @_collapse_duration > 0
@_collapse_duration -= 1
self.opacity = 256 - (48 - @_collapse_duration) * 6
end
if @_damage_duration > 0
@_damage_duration -= 1
case @_damage_duration
when 38..39
@_damage_sprite.y -= 4
when 36..37
@_damage_sprite.y -= 2
when 34..35
@_damage_sprite.y += 2
when 28..33
@_damage_sprite.y += 4
end
@_damage_sprite.opacity = 256 - (12 - @_damage_duration) * 32
if @_damage_duration == 0
dispose_damage
end
end
if @_animation != nil and (Graphics.frame_count % 2 == 0)
if $game_switches[$animation]
@_animation_duration += 1
else
@_animation_duration -= 1
end
update_animation
end
if @_loop_animation != nil and (Graphics.frame_count % 2 == 0)
update_loop_animation
if $game_switches[$animation]
@_loop_animation_index -= 1
if @_loop_animation_index < 0
@_loop_animation_index = @_loop_animation.frame_max - 1
end
else
@_loop_animation_index += 1
@_loop_animation_index %= @_loop_animation.frame_max
end
end
if @_blink
@_blink_count = (@_blink_count + 1) % 32
if @_blink_count < 16
alpha = (16 - @_blink_count) * 6
else
alpha = (@_blink_count - 16) * 6
end
self.color.set(255, 255, 255, alpha)
end
@@_animations.clear
end
def update_animation
continueflag = true
if $game_switches[$animation]
if @_animation_duration > @_animation.frame_max
continueflag = false
end
else
if @_animation_duration <= 0
continueflag = false
end
end
if continueflag
frame_index = @_animation.frame_max - @_animation_duration
cell_data = @_animation.frames[frame_index].cell_data
position = @_animation.position
animation_set_sprites(@_animation_sprites, cell_data, position)
for timing in @_animation.timings
if timing.frame == frame_index
animation_process_timing(timing, @_animation_hit)
end
end
else
dispose_animation
end
end
end
end
复制代码
欢迎光临 Project1 (https://rpg.blue/)
Powered by Discuz! X3.1