Project1
标题:
ARPG用范围性影响能力值的技能
[打印本页]
作者:
后知后觉
时间:
2010-9-30 19:22
标题:
ARPG用范围性影响能力值的技能
先说明一下.此纯属搞着玩= =
效果嘛.看下面的 flash.
使用说明请看脚本开头处和范例里的公共事件 1 号.
http://www.tudou.com/v/eMxKXG39yBg/v.swf
多余的话:
Tilemap 的闪烁感觉边缘太硬了.
换成 loop_animation 可能会好些.
但是那样貌似会又把一些遮挡物、不可通行的图块给覆盖住= =
要改 Tilemap 的闪烁颜色的话可以在脚本开头的 Colors 常量数组里改.
其索引对应相应状态的
定量值
还有就是想把范围矩形改成别的什么形状的话请自行处理= =
这玩意还可以扩展一下做做技能冷却/限制什么的.
当矩形消失的时候才能再次使用或使用别的这类技能.
有兴趣的话就自己动手做吧.嗯.
大概就是这样了.
注意事项:
同一个状态最好不要被多个技能使用.因为是以状态的ID为主键建立的范围矩形数据对象.
范例:
ArpgAuxiliarySkill.rar
(189.48 KB, 下载次数: 132)
2010-9-30 19:12 上传
点击文件名下载附件
脚本:
#==============================================================================
# ■ 本脚本来自 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 转载和使用时请保留此信息
#==============================================================================
复制代码
作者:
pudding
时间:
2010-9-30 20:52
{:2_42:} 好东西,移植到我的ARPG里 {:2_36:}
欢迎光临 Project1 (https://rpg.blue/)
Powered by Discuz! X3.1