赞 | 5 |
VIP | 620 |
好人卡 | 38 |
积分 | 69 |
经验 | 125468 |
最后登录 | 2015-7-27 |
在线时间 | 1666 小时 |
Lv4.逐梦者
- 梦石
- 0
- 星屑
- 6860
- 在线时间
- 1666 小时
- 注册时间
- 2008-10-29
- 帖子
- 6710
|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
先说明一下.此纯属搞着玩= =
效果嘛.看下面的 flash.
使用说明请看脚本开头处和范例里的公共事件 1 号.
多余的话:
Tilemap 的闪烁感觉边缘太硬了.
换成 loop_animation 可能会好些.
但是那样貌似会又把一些遮挡物、不可通行的图块给覆盖住= =
要改 Tilemap 的闪烁颜色的话可以在脚本开头的 Colors 常量数组里改.
其索引对应相应状态的 定量值
还有就是想把范围矩形改成别的什么形状的话请自行处理= =
这玩意还可以扩展一下做做技能冷却/限制什么的.
当矩形消失的时候才能再次使用或使用别的这类技能.
有兴趣的话就自己动手做吧.嗯.
大概就是这样了.
注意事项:
同一个状态最好不要被多个技能使用.因为是以状态的ID为主键建立的范围矩形数据对象.
范例:
ArpgAuxiliarySkill.rar
(189.48 KB, 下载次数: 132)
脚本:
- #==============================================================================
- # ■ 本脚本来自 www.66rpg.com 转载和使用时请保留此信息
- #==============================================================================
- =begin
- 脚本作者:后知后觉
- 脚本功能:应用于地图上的直接战斗
- 可以在地图上设置某个矩形范围内
- 在这个范围内影响战斗者的能力值
- 并能让这个范围闪烁以醒目
- 使用方法:数据库状态的设置
- 定量:定量用来设置闪烁的颜色.0~10.一共11种.其中0为不无闪烁效果
- 经过 A 回合后 B%几率解除
- 因为是直接在地图上作战.所以这个貌似没什么用了.我就拿来用用了.
- A : 持续的时间.结果为 A * 20.
- 当 $game_system.update 被执行了 A * 20 次后该区域就消失
- B : 范围的长度.
- 在生成范围的时候要求设置一个中心点的x、y坐标
- 以该点为中心.B*2+1 为边长的矩形
- 这个矩形内对能力值的影响效果就是该状态的效果.
- 使用脚本 ArpgAuxiliarySkill.new(x,y,state_id,target)
- 来声场这个矩形对象.
- 其中x、y为中心店坐标,state_id 为状态id
- target 为作用对象类型.整数型.为 0 的时候对所有人有效.
- 默认 1 为对角色有效.2为对敌人有效.这个可以自定义决定.
- 只是用来做判断用.当要获取信息的时候传递进来的值与.new
- 的时候所保存的值相吻合的时候才会对能力值有影响。
- 这些能力值的影响本应该写进 Game_Battler 里去的.
- 不过冲突啊什么的最讨厌了.所以还是你自己写进去吧.
- 具体的应用到实际的计算当中请参考范例的公共事件1号.
- =end
- $hzhj_ArpgAuxiliarySkill.call if $hzhj_ArpgAuxiliarySkill
- class ArpgAuxiliarySkill
- Colors = [0,
- 0xf00,
- 0x0f0,
- 0x00f,
- 0xff0,
- 0xf0f,
- 0x0ff,
- 0xfff,
- 0xf84,
- 0x8f4,
- 0x84f]
- attr_reader :time
- attr_reader :x
- attr_reader :y
- attr_reader :key
- attr_reader :state
- attr_reader :rating
- attr_reader :range
- attr_reader :target
- attr_reader :start_x
- attr_reader :start_y
- attr_reader :end_x
- attr_reader :end_y
- def initialize(x, y, state_id, target = 0)
- @x = x
- @y = y
- @key = state_id
- @state = $data_states[state_id]
- @time = @state.hold_turn * 20
- @range = @state.auto_release_prob
- @target = target
- @rating = @state.rating
- $game_system.hzhj_hash[@key] = self
- set_flash_data
- end
- def update
- if @time > 0
- @time -= 1
- return
- end
- $game_system.hzhj_hash[@key] = nil
- reset_flash_data
- end
- def set_xyt(x, y, time)
- @x = x
- @y = y
- @time = time
- reset_flash_data
- end
- def set_flash_data
- @start_x = [@x - @range, 0].max
- @start_y = [@y - @range, 0].max
- @end_x = [@x + @range, $game_map.width - 1].min
- @end_y = [@y + @range, $game_map.height - 1].min
- for i in @start_x..@end_x
- for j in @start_y..@end_y
- if $game_map.passable?(i, j, 0)
- $game_map.flash_data[i, j] = Colors[@rating]
- end
- end
- end
- end
- def reset_flash_data
- $game_map.flash_data = Table.new($game_map.width, $game_map.height)
- values = $game_system.hzhj_hash.values
- values.delete(nil)
- for hzhj in values.sort!{|a,b|a.rating - b.rating}
- hzhj.set_flash_data
- end
- end
- end
- class Hzhj_Hash < Hash
- def initialize
- super
- end
- def []=(key, value)
- if self[key].nil?
- super(key, value)
- else
- if value.nil?
- super(key, value)
- else
- self[key].set_xyt(value.x, value.y, value.time)
- end
- end
- end
- def hit_rate(x, y, target)
- n = 100
- for hzhj in self.values
- next if hzhj.nil?
- if x.between?(hzhj.start_x, hzhj.end_x)
- if y.between?(hzhj.start_y, hzhj.end_y)
- if target == hzhj.target or hzhj.target == 0
- n *= hzhj.state.hit_rate / 100.0
- end
- end
- end
- end
- return Integer(n.round)
- end
- def maxhp_rate(x, y, target)
- n = 100
- for hzhj in self.values
- next if hzhj.nil?
- if x.between?(hzhj.start_x, hzhj.end_x)
- if y.between?(hzhj.start_y, hzhj.end_y)
- if target == hzhj.target or hzhj.target == 0
- n *= hzhj.state.maxhp_rate / 100.0
- end
- end
- end
- end
- return Integer(n.round)
- end
- def maxsp_rate(x, y, target)
- n = 100
- for hzhj in self.values
- next if hzhj.nil?
- if x.between?(hzhj.start_x, hzhj.end_x)
- if y.between?(hzhj.start_y, hzhj.end_y)
- if target == hzhj.target or hzhj.target == 0
- n *= hzhj.state.maxsp_rate / 100.0
- end
- end
- end
- end
- return Integer(n.round)
- end
- def str_rate(x, y, target)
- n = 100
- for hzhj in self.values
- next if hzhj.nil?
- if x.between?(hzhj.start_x, hzhj.end_x)
- if y.between?(hzhj.start_y, hzhj.end_y)
- if target == hzhj.target or hzhj.target == 0
- n *= hzhj.state.str_rate / 100.0
- end
- end
- end
- end
- return Integer(n.round)
- end
- def dex_rate(x, y, target)
- n = 100
- for hzhj in self.values
- next if hzhj.nil?
- if x.between?(hzhj.start_x, hzhj.end_x)
- if y.between?(hzhj.start_y, hzhj.end_y)
- if target == hzhj.target or hzhj.target == 0
- n *= hzhj.state.dex_rate / 100.0
- end
- end
- end
- end
- return Integer(n.round)
- end
- def agi_rate(x, y, target)
- n = 100
- for hzhj in self.values
- next if hzhj.nil?
- if x.between?(hzhj.start_x, hzhj.end_x)
- if y.between?(hzhj.start_y, hzhj.end_y)
- if target == hzhj.target or hzhj.target == 0
- n *= hzhj.state.agi_rate / 100.0
- end
- end
- end
- end
- return Integer(n.round)
- end
- def int_rate(x, y, target)
- n = 100
- for hzhj in self.values
- next if hzhj.nil?
- if x.between?(hzhj.start_x, hzhj.end_x)
- if y.between?(hzhj.start_y, hzhj.end_y)
- if target == hzhj.target or hzhj.target == 0
- n *= hzhj.state.int_rate / 100.0
- end
- end
- end
- end
- return Integer(n.round)
- end
- def atk_rate(x, y, target)
- n = 100
- for hzhj in self.values
- next if hzhj.nil?
- if x.between?(hzhj.start_x, hzhj.end_x)
- if y.between?(hzhj.start_y, hzhj.end_y)
- if target == hzhj.target or hzhj.target == 0
- n *= hzhj.state.atk_rate / 100.0
- end
- end
- end
- end
- return Integer(n.round)
- end
- def pdef_rate(x, y, target)
- n = 100
- for hzhj in self.values
- next if hzhj.nil?
- if x.between?(hzhj.start_x, hzhj.end_x)
- if y.between?(hzhj.start_y, hzhj.end_y)
- if target == hzhj.target or hzhj.target == 0
- n *= hzhj.state.pdef_rate / 100.0
- end
- end
- end
- end
- return Integer(n.round)
- end
- def mdef_rate(x, y, target)
- n = 100
- for hzhj in self.values
- next if hzhj.nil?
- if x.between?(hzhj.start_x, hzhj.end_x)
- if y.between?(hzhj.start_y, hzhj.end_y)
- if target == hzhj.target or hzhj.target == 0
- n *= hzhj.state.mdef_rate / 100.0
- end
- end
- end
- end
- return Integer(n.round)
- end
- def eva(x, y, target)
- n = 0
- for hzhj in self.values
- next if hzhj.nil?
- if x.between?(hzhj.start_x, hzhj.end_x)
- if y.between?(hzhj.start_y, hzhj.end_y)
- if target == hzhj.target or hzhj.target == 0
- n += hzhj.state.eva
- end
- end
- end
- end
- return Integer(n)
- end
- end
- class Game_System
- attr_reader :hzhj_hash
- alias hzhj_hash_game_system_initialize initialize
- def initialize
- hzhj_hash_game_system_initialize
- @hzhj_hash = Hzhj_Hash.new
- end
- alias hzhj_hash_game_system_update update
- def update
- hzhj_hash_game_system_update
- @hzhj_hash.values.each{|hzhj|hzhj.update if not hzhj.nil?}
- end
- end
- class Game_Map
- attr_accessor :flash_data
- alias hzhj_hash_game_map_setup setup
- def setup(*args)
- hzhj_hash_game_map_setup(*args)
- $game_system.hzhj_hash.clear
- @flash_data = Table.new(width, height)
- end
- end
- class Spriteset_Map
- alias hzhj_hash_spriteset_map_initialize initialize
- def initialize
- hzhj_hash_spriteset_map_initialize
- @tilemap.flash_data = $game_map.flash_data
- @tilemap.update
- end
- alias hzhj_hash_spriteset_map_update update
- def update
- if @tilemap.flash_data != $game_map.flash_data
- @tilemap.flash_data = $game_map.flash_data
- end
- hzhj_hash_spriteset_map_update
- end
- end
- callcc{|$hzhj_ArpgAuxiliarySkill|}
- #==============================================================================
- # ■ 本脚本来自 www.66rpg.com 转载和使用时请保留此信息
- #==============================================================================
复制代码 |
|