| 赞 | 79 |
| VIP | |
| 好人卡 | |
| 积分 | 49 |
| 经验 | |
| 最后登录 | 2022-9-6 |
| 在线时间 | 425 小时 |
- 梦石
- 0
- 星屑
- 4881
- 在线时间
- 425 小时
- 注册时间
- 2019-10-22
- 回帖
- 647
|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有账号?注册会员
×
本帖最后由 坏数据 于 2020-2-10 14:43 编辑
自从入坑rm以来 随着自己的需求逐渐增多,慢慢地在论坛上外站上搜刮来的脚本已经不能满足我的需求了。
于是也就逐渐进入了学习脚本 - 魔改界面 - 修改功能 - 原创脚本的不归路
之前也写过几个自用的脚本 但是都没有好好整理 东一块西一块 别人拿了用不了
于是这次的天赋系统从最开始构思就考虑到了通用性 直接在空白工程里面开始写
现在分享出来
由于是算是第一个完完整整独立完成的原创脚本,里面很多包括代码结果 或者逻辑 或者方法的调用都非常的稚嫩
实例变量这个东西也是在这个脚本完成的末期才完全理解的
所以这里面可能还有很多不完善的地方 也可能有未曾预想到的bug 请大家多多包涵
因为设置错误或者其他问题导致的报错没有考虑在内
卖家秀
买家秀
基本功能都在代码描述里面了,没有范例,如果想要范例, 就新建空白工程然后丢进去, 地图上做一个可以给角色升级的事件,就可以完全测试这个脚本的功能了。
遇到什么bug或者有什么建议请回帖反馈 我会持续更新的(大概)
[fold=代码在此 【猛戳】][pre lang="ruby"]=begin
===============================================================================
【Baddata】技能树/天赋系统/天赋树 - 技能学习扩展
===============================================================================
MIT协议
【脚本使用说明书】
版本 Verson
v0.6
作者 Baddata
【说明】
在默认的技能界面中加入了一个技能树窗口
技能树有不同的层数 从上到下 为前置技能和高级技能
角色升级的时候可以获得技能点, 消耗技能点可以升级选中的技能
技能点不足无法学习技能
灰色技能为未达到学习需求,每一层的技能学习需要至少学会一个上层的技能
支持使用状态来制作被动技能,
被动技能不会显示在技能列表中,但是可以在技能树里面查看
状态本身没有描述文本
在备注栏里面用以下格式写备注,就会像技能的说明一样在技能树里面显示
<帮助 炙炎之力 - 提升使用者的炎属性伤害并维持五回合。> or <帮助 描述一下这个技能干蛤用的>
*把脚本插入Main之前即可
=end
module Baddata end
module Baddata::SKILLTREE
#根据角色设定技能树 true 根据职业设定技能树 false
SKILLTREE_BY_ACTOR = true
#角色每升 X 级获得 1技能点
LEVELUP_REQUIRE_POINT = 5
#技能树设置表 (此处仅仅作为范例,请自行设置)
SkillTree_Setting = [
#[#0层数, #1类型:1-技能 / 2-状态 ,#2技能/状态ID, #3角色/职业ID, #4消耗技能点]
#可选参数# [#5 需求上层技能掌握数量] - "2"代表上一层至少要学会2个技能才能点亮此技能
[1, 1, 100, 1, 1], #每一个数组代表一个技能
[1, 1, 101, 1, 1],
[2, 2, 21, 1, 1],
[2, 1, 103, 1, 1],
[2, 1, 104, 1, 1],
[2, 2, 22, 1, 1],
[3, 1, 106, 1, 1],
[3, 2, 23, 1, 1, 2], #此技能需要至少两个上一层的前置技能
[3, 1, 108, 1, 1],
[4, 1, 109, 1, 1],
[4, 1, 110, 1, 1],
[4, 1, 111, 1, 1],
[4, 1, 112, 1, 1],
[5, 1, 113, 1, 1],
[5, 1, 114, 1, 1],
[5, 1, 115, 1, 1],
[5, 1, 116, 1, 1],
[6, 1, 117, 1, 1],
[1, 1, 100, 2, 1],
[1, 1, 101, 2, 1],
[1, 2, 21, 2, 1],
[2, 1, 103, 2, 1],
[2, 1, 104, 2, 1],
[2, 2, 22, 2, 1],
[3, 1, 106, 2, 1],
[3, 2, 23, 2, 1],
[4, 1, 108, 2, 1],
]
end
#==============================================================================
# Log:
# 修复一层技能数量大于上层数量时图标位置错误
# 修复状态的备注描述文本无法输入空格
# 修复循环刷新导致的卡顿
# 修复光标"偷跑" 修复浮点数运算bug
# 修复切换角色时光标位置在不存在的技能上报错
# 加入第六参数(可选):需求上层技能掌握数量
# 状态作为被动不再在状态窗口中显示
# 修复因为死亡/完全回复导致的状态清除
# 修复更新状态回合数时报错
#
#==============================================================================
#如果你不清楚自己在做什么,请勿修改以下代码
class Game_BattlerBase
alias baddata011720_initialize initialize
def initialize
baddata011720_initialize
@passive = []
end
#--------------------------------------------------------------------------
# ● 获取当前状态的实例数组
#--------------------------------------------------------------------------
alias baddata011720_states states
def states
return baddata011720_states + @passive.collect {|id| $data_states[id] }
end
#--------------------------------------------------------------------------
# ● 检査是否含有某状态
#--------------------------------------------------------------------------
def passive?(passive_id)
@passive.include?(passive_id)
end
#--------------------------------------------------------------------------
# ● 获取当前状态的图标编号数组
#--------------------------------------------------------------------------
def state_icons
icons = states.collect {|state| @passive.include?(state.id)? 0 : state.icon_index}
icons.delete(0)
icons
end
end
class Game_Battler < Game_BattlerBase
#--------------------------------------------------------------------------
# ● 附加状态(被动)
#--------------------------------------------------------------------------
def add_passive(state_id)
@passive.push(state_id) if state_addable?(state_id)
refresh
reset_state_counts(state_id)
end
end
#==============================================================================
# ■ Window_SkillTree
#------------------------------------------------------------------------------
# 技能画面中,显示技能的窗口。
#==============================================================================
include Baddata::SKILLTREE
class Window_SkillTree < Window_Base
#--------------------------------------------------------------------------
# ● 定义实例变量
#--------------------------------------------------------------------------
attr_reader :help_window # 帮助窗口
#--------------------------------------------------------------------------
# ● 初始化对象
#--------------------------------------------------------------------------
def initialize(x, y, width, height)
super
@handler = {}
@actor = nil
@old_index
@cursor_index = 0
@skills4actor = []
@item_sprite = []
@viewportI = Viewport.new
@viewportI.z = 9999
deactivate
end
def index
@cursor_index
end
def index=(index)
@cursor_index = index
update_cursor
end
def skills4actor
@skills4actor
end
#--------------------------------------------------------------------------
# ● 设置角色
#--------------------------------------------------------------------------
def actor=(actor)
return if @actor == actor
@actor = actor
refresh
self.oy = 0
end
#--------------------------------------------------------------------------
# ● 绘制技能树
#--------------------------------------------------------------------------
def make_skill_tree
@skills4actor = SKILLTREE_BY_ACTOR ? SkillTree_Setting.select{|a| a[3] == @actor.id} : SkillTree_Setting.select{|a| a[3] == @actor.class_id}
@skills4actor.sort_by{|a| a[0]}
@skills4actor.each_with_index do |skill,index|
skilllevelcount = @skills4actor.count {|lv| lv[0] == skill[0]}
preskillscount = @skills4actor.count {|lv| lv[0] < skill[0]}
x = ((index-preskillscount) % skilllevelcount+1)* self.width / (skilllevelcount +1) - 24
y = skill[0] * 38
item = skill[1] == 1 ? $data_skills[skill[2]] : $data_states[skill[2]]
@item_sprite[index].dispose if @item_sprite[index]
@item_sprite[index] = Sprite.new(@viewportI)
@item_sprite[index].x = x + 12 + self.x
@item_sprite[index].y = y + 12 + self.y
@item_sprite[index].bitmap = draw_item(item,0,0,skill[1] == 1 ? @actor.skill_learn?(item) : @actor.passive?(item.id))
reach_level_required?(skill) ? @item_sprite[index].tone = Tone.new(0,0,0,0) : @item_sprite[index].tone = Tone.new(0,0,0,255)
@item_sprite[index].visible = self.visible
end
draw_text(-20,0,contents.width,line_height,"剩余技能点:",2)
draw_text(0,0,contents.width,line_height,($game_skill_points[@actor.name] /LEVELUP_REQUIRE_POINT).to_i,2)
end
#--------------------------------------------------------------------------
# ● 绘制项目
#--------------------------------------------------------------------------
def draw_item(item, x, y, enabled = true)
draw_icon_plus(item.icon_index, x, y, enabled)
end
#--------------------------------------------------------------------------
# ● 绘制图标
# enabled : 有效的标志。false 的时候使用半透明效果绘制
#--------------------------------------------------------------------------
def draw_icon_plus(icon_index, x, y, enabled = true)
output = Bitmap.new(36,36)
bitmap = Cache.system("Iconset")
rect = Rect.new(icon_index % 16 * 24, icon_index / 16 * 24, 24, 24)
output.blt(x, y, bitmap, rect, enabled ? 255 : 120)
output
end
#--------------------------------------------------------------------------
# ● 获取技能是否达到可以学习状态(彩色)
#--------------------------------------------------------------------------
def reach_level_required?(skill)
if skill[0] >= 2
skill_learned = false
state_had = false
counter = 0
@skills4actor.each do |a|
if @actor.skill_learn?($data_skills[a[2]]) && a[0] == skill[0]-1 && a[1] == 1
skill_learned = true
counter +=1
end
end
@skills4actor.each do |a|
if @actor.passive?(a[2]) && a[0] == skill[0]-1 && a[1] == 2
state_had = true
counter +=1
end
end
return counter >= skill[5] if skill[5]
return skill_learned || state_had
else
return true
end
end
#--------------------------------------------------------------------------
# ● 移动光标选择技能
#--------------------------------------------------------------------------
def set_cursor_index
@old_index = @cursor_index
last_skilllevelcount = @skills4actor.count {|lv| lv[0] == (cursor_at[0]-1)}
skilllevelcount = @skills4actor.count {|lv| lv[0] == cursor_at[0]}
@cursor_index -= 1 if Input.trigger?(:LEFT)
@cursor_index += 1 if Input.trigger?(:RIGHT) unless cursor_at == @skills4actor[-1]
@cursor_index -= last_skilllevelcount if Input.trigger?(:UP)
@cursor_index += skilllevelcount if Input.trigger?(:DOWN)
return @cursor_index = 0 if @cursor_index <= 0
return @cursor_index = @skills4actor.size-1 if @cursor_index >= @skills4actor.size-1
end
def cursor_at
@skills4actor[@cursor_index]
end
#--------------------------------------------------------------------------
# ● 更新光标
#--------------------------------------------------------------------------
def cursor_x
skilllevelcount = @skills4actor.count {|lv| lv[0] == cursor_at[0]}
preskillscount = @skills4actor.count {|lv| lv[0] < cursor_at[0]}
x = ((@cursor_index-preskillscount) % skilllevelcount+1)* self.width / (skilllevelcount +1) - 30
return x
end
def cursor_y
return cursor_at[0] * 38 - 6
end
def update_cursor
return unless cursor_movable?
set_cursor_index
cursor_rect.set(cursor_x, cursor_y, 36, 36)
end
#--------------------------------------------------------------------------
# ● 判定光标是否可以移动
#--------------------------------------------------------------------------
def cursor_movable?
active
end
#--------------------------------------------------------------------------
# ● 更改启用状态
#--------------------------------------------------------------------------
def active=(active)
super
update_cursor
call_update_help
end
#--------------------------------------------------------------------------
# ● 设置帮助
#--------------------------------------------------------------------------
def update_help_text
ch = contents.height
cw = contents.width
skill_name = cursor_at[1] == 1 ? $data_skills[cursor_at[2]].name : $data_states[cursor_at[2]].name
draw_text(0,ch-70,cw,line_height,"学习新技能")
draw_text(0,ch-70,cw,line_height,skill_name,2)
draw_text(0,ch-40,cw,line_height,"消耗技能点")
draw_text(0,ch-40,cw,line_height,@skills4actor[@cursor_index][4],2)
end
#--------------------------------------------------------------------------
# ● 设置帮助窗口
#--------------------------------------------------------------------------
def help_window=(help_window)
@help_window = help_window
call_update_help
end
#--------------------------------------------------------------------------
# ● 设置动作对应的处理方法
# method : 设置的处理方法 (Method 实例)
#--------------------------------------------------------------------------
def set_handler(symbol, method)
@handler[symbol] = method
end
#--------------------------------------------------------------------------
# ● 确认处理方法是否存在
#--------------------------------------------------------------------------
def handle?(symbol)
@handler.include?(symbol)
end
#--------------------------------------------------------------------------
# ● 调用处理方法
#--------------------------------------------------------------------------
def call_handler(symbol)
@handler[symbol].call if handle?(symbol)
end
#--------------------------------------------------------------------------
# ● 更新画面
#--------------------------------------------------------------------------
def update
super
update_cursor
refresh if @old_index != @cursor_index
process_handling
end
#--------------------------------------------------------------------------
# ● “确定”和“取消”的处理
#--------------------------------------------------------------------------
def process_handling
return unless open? && active
return process_ok if ok_enabled? && Input.trigger?(:C)
return process_cancel if cancel_enabled? && Input.trigger?(:B)
end
#--------------------------------------------------------------------------
# ● 获取确定处理的有效状态
#--------------------------------------------------------------------------
def ok_enabled?
handle?(:ok)
end
#--------------------------------------------------------------------------
# ● 获取取消处理的有效状态
#--------------------------------------------------------------------------
def cancel_enabled?
handle?(:cancel)
end
#--------------------------------------------------------------------------
# ● 按下确定键时的处理
#--------------------------------------------------------------------------
def process_ok
if reach_level_required?(cursor_at)#current_item_enabled?
Input.update
deactivate
call_ok_handler
else
Sound.play_buzzer
end
end
#--------------------------------------------------------------------------
# ● 调用“确定”的处理方法
#--------------------------------------------------------------------------
def call_ok_handler
call_handler(:ok)
end
#--------------------------------------------------------------------------
# ● 按下取消键时的处理
#--------------------------------------------------------------------------
def process_cancel
@cursor_index = 0
Sound.play_cancel
Input.update
deactivate
call_cancel_handler
end
#--------------------------------------------------------------------------
# ● 调用“取消”的处理方法
#--------------------------------------------------------------------------
def call_cancel_handler
call_handler(:cancel)
end
#--------------------------------------------------------------------------
# ● 调用帮助窗口的更新方法
#--------------------------------------------------------------------------
def call_update_help
update_help if active && @help_window
end
#--------------------------------------------------------------------------
# ● 更新帮助内容
#--------------------------------------------------------------------------
def update_help
@help_window.clear
if cursor_at[1] == 1
@help_window.set_item($data_skills[cursor_at[2]])
else
help_text = $data_states[cursor_at[2]].note.match(/<帮助 (.*)>/) ? $1.to_s : ""
@help_window.set_text(help_text)
end
end
#--------------------------------------------------------------------------
# ● 刷新
#--------------------------------------------------------------------------
def refresh
@item_sprite.each {|wtf| wtf.dispose}
create_contents
make_skill_tree
call_update_help
update_help_text
end
end
class Window_SkillCommand < Window_Command
#--------------------------------------------------------------------------
# ● 生成指令列表
#--------------------------------------------------------------------------
alias baddata011120_make_command_list make_command_list
def make_command_list
baddata011120_make_command_list
add_command("技能树", :skill_tree)
end
end
#==============================================================================
# ■ Scene_Skill
#------------------------------------------------------------------------------
# 技能画面
#==============================================================================
class Scene_Skill < Scene_ItemBase
include Baddata::SKILLTREE
#--------------------------------------------------------------------------
# ● 开始处理
#--------------------------------------------------------------------------
alias baddata01120_start start
def start
baddata01120_start
@skills4actor = []
create_skilltree_window
end
#--------------------------------------------------------------------------
# ● 生成指令窗口
#--------------------------------------------------------------------------
alias baddata011120_create_command_window create_command_window
def create_command_window
baddata011120_create_command_window
@command_window.set_handler(:skill_tree, method(:command_skill_tree))
end
#--------------------------------------------------------------------------
# ● 创建技能树窗口
#--------------------------------------------------------------------------
def create_skilltree_window
wy = @help_window.height
ww = @status_window.width#104*3
wx = Graphics.width - ww
wh = Graphics.height - @help_window.height
@skilltree_window = Window_SkillTree.new(wx,wy,ww,wh)
@skilltree_window.actor = @actor
@skilltree_window.help_window = @help_window
@skilltree_window.hide.deactivate
@skilltree_window.refresh
@skilltree_window.set_handler(:ok, method(:on_skill_ok))
@skilltree_window.set_handler(:cancel, method(:on_skill_cancel))
end
#--------------------------------------------------------------------------
# ● 指令“技能”
#--------------------------------------------------------------------------
def command_skill
@item_window.activate
@item_window.select_last
@skilltree_window.hide.deactivate if @skilltree_window
end
def command_skill_tree
@status_window.hide
@item_window.hide.deactivate
@skilltree_window.index = 0
@skilltree_window.show.activate
@skilltree_window.refresh
end
#--------------------------------------------------------------------------
# ● 读取光标位置
#--------------------------------------------------------------------------
def index
@skilltree_window.index
end
#--------------------------------------------------------------------------
# ● 读取Actor拥有的全部技能数组
#--------------------------------------------------------------------------
def Skills4actor
@skills4actor = SKILLTREE_BY_ACTOR ? SkillTree_Setting.select{|a| a[3] == @actor.id} : SkillTree_Setting.select{|a| a[3] == @actor.class_id}
end
#--------------------------------------------------------------------------
# ● 按下“确定”
#--------------------------------------------------------------------------
def on_skill_ok
determine_skill
@skilltree_window.refresh
@skilltree_window.activate
end
#--------------------------------------------------------------------------
# ● 按下“取消”
#--------------------------------------------------------------------------
def on_skill_cancel
@skilltree_window.hide.deactivate
@skilltree_window.refresh
@item_window.show
@status_window.show
@command_window.activate
end
#--------------------------------------------------------------------------
# ● 开始处理
#--------------------------------------------------------------------------
def determine_skill
selected_skill = @skilltree_window.skills4actor[index] #当前index指向技能
if selected_skill[1] == 1
unless @actor.skill_learn?($data_skills[selected_skill[2]])
if $game_skill_points[@actor.name] >= selected_skill[4] * LEVELUP_REQUIRE_POINT
@actor.learn_skill(selected_skill[2])
$game_skill_points[@actor.name] -= selected_skill[4] * LEVELUP_REQUIRE_POINT
Sound.play_ok
else
Sound.play_buzzer
end
print $game_skill_points[@actor.name]
print"\n"
end
else
unless @actor.passive?(selected_skill[2])
if $game_skill_points[@actor.name] >= selected_skill[4] * LEVELUP_REQUIRE_POINT
@actor.add_passive(selected_skill[2])
$game_skill_points[@actor.name] -= selected_skill[4] * LEVELUP_REQUIRE_POINT
Sound.play_ok
else
Sound.play_buzzer
end
print $game_skill_points[@actor.name]
print"\n"
end
end
end
#--------------------------------------------------------------------------
# ● 切换角色
#--------------------------------------------------------------------------
alias baddata011120on_actor_change on_actor_change
def on_actor_change
@skilltree_window.actor = @actor
baddata011120on_actor_change
end
end
#--------------------------------------------------------------------------
# ● 升级添加技能点
#--------------------------------------------------------------------------
class Game_Actor < Game_Battler
alias baddata011120_level_up level_up
def level_up
baddata011120_level_up
$game_skill_points[@name] = 1 unless $game_skill_points[@name]
$game_skill_points[@name] += 1
end
end
#--------------------------------------------------------------------------
# ● 存档保存技能点
#--------------------------------------------------------------------------
module DataManager
# 开始新游戏时增加$game_skill_points变量
DataManager.singleton_class.send(:alias_method, :badd_create_game_objects, :create_game_objects)
def self.create_game_objects
badd_create_game_objects
$game_skill_points = Hash.new
$game_skill_points.default = 1
end
# 存档时保存$game_skill_points变量
DataManager.singleton_class.send(:alias_method, :badd_make_save_contents, :make_save_contents)
def self.make_save_contents
contents = badd_make_save_contents
contents[:skill_points] = $game_skill_points
contents
end
# 读档时读取$game_skill_points变量
DataManager.singleton_class.send(:alias_method, :badd_extract_save_contents, :extract_save_contents)
def self.extract_save_contents(contents)
badd_extract_save_contents(contents)
$game_skill_points = contents[:skill_points]
end
end[/pre]
[/fold]
#===============================
#更新 1/17/20 2:00AM
#===============================
注意到了状态清除的问题,采用老鹰的建议进行修改
同时移除在状态窗口中显示技能树中的以状态设置被动产生的状态图标(绕口令) |
评分
-
查看全部评分
|