Project1
标题:
[难以理解的脚本]技能升级卷轴
[打印本页]
作者:
timiesea
时间:
2014-9-17 00:53
标题:
[难以理解的脚本]技能升级卷轴
技能升级卷轴:在非战斗状态下使用该卷轴会将已经学会的技能替换成另外一个还没有学会的技能,达到技能升级的目的。
要点:
1.要遗忘的技能必须已经学会。
2.要学习的技能必须还没有学会。
3.如果没有符合以上的要求,该角色就不能使用技能升级卷轴。
由于《RMVA》的默认使用效果只有学会技能,而没有遗忘技能。因此需要用备注以及脚本来实现。
读取备注的脚本:
#==============================================================================
# ■ [VX] 读取rmvx备注栏
# [VX] ReadNote
#----------------------------------------------------------------------------
# 使用说明:
# 【例】在vx数据库比如1号物品的备注栏里写: 耐久度 = 10
# 读取时使用: p $data_items[1].read_note('耐久度')
# 几点注意:
# ① 支持汉字,英文忽略大小写
# ② 等号右边遵循ruby语法格式,例如:
# test1 = 1 #=> 1
# test2 = "a" #=> "a"
# test3 = true #=> true
# test4 = [1,2,3] #=> [1,2,3]
# test5 = {"orz"=>1} #=> {"orz"=>1}
# ③ 等号忽略空格,以下均正确:
# test = nil; test= nil; test =nil; test=nil
#----------------------------------------------------------------------------
# 更新作者: 沉影不器
# 许可协议: FSL
# 项目版本: 2.02.1001
# 引用网址: http://rpg.blue/thread-99474-1-1.html
#----------------------------------------------------------------------------
# - *2.02.1001* (2010-10-01) By 沉影不器
# *修复引用方法带Binding的错误
#
# - *2.01.0806* (2010-08-06) By 沉影不器
# *完全用eval执行文本,进一步简化代码
#
# - *2.00.0729* (2010-07-29) By 沉影不器
# *改用eval执行赋值内容,支持浮点.数组.哈希等
# *强制忽略大小写
# *简化脚本
#
# - *1.11.0824* (2008-08-24) By 沉影不器
# *修正rmvx英文帮助带来的类名错误
#
# - *1.10.0821* (2008-08-21) By 沉影不器
# *扩展到支持rmvx数据库内所有带备注栏的选项
# *改了一下算法,使备注栏的注释也同ruby语法一样忽略空格
#
# - *1.02.0819* (2008-08-19) By 沉影不器
# *直接成为RPG::BaseItem内一个函数,简化使用方法
#
# - *1.00.0818* (2008-08-18) By 沉影不器
# *初版
#==============================================================================
$fscript = {} if $fscript == nil
$fscript["ReadNote"] = "2.02.1001"
#==============================================================================
# ■ RPG
#==============================================================================
module RPG
#=============================================================================
# ■ ReadNote
#=============================================================================
module ReadNote
def self.read(str, section, mismatch = nil)
str.each_line do |line|
## 不希望忽略大小写,则删掉下一行最后一个i
eval("#{line}; return #{section}") if line =~ /^\s*#{section}\s*=/i
end
return mismatch
end
end
#=============================================================================
# ■ BaseItem
#=============================================================================
class BaseItem
#-------------------------------------------------------------------------
# ○ 读取rmvx备注栏指定字段
# section : 字段名
# mismatch : 未匹配时的返回值
#-------------------------------------------------------------------------
def read_note(section, mismatch = nil)
ReadNote.read(self.note, section, mismatch)
end
end
end
#encoding:utf-8
#==============================================================================
# ■ Game_Map
#------------------------------------------------------------------------------
# 管理地图的类。拥有卷动地图以及判断通行度的功能。
# 本类的实例请参考 $game_map 。
#==============================================================================
#encoding:utf-8
#==============================================================================
# ■ Game_Map
#------------------------------------------------------------------------------
# 管理地图的类。拥有卷动地图以及判断通行度的功能。
# 本类的实例请参考 $game_map 。
#==============================================================================
class Game_Map
#-------------------------------------------------------------------------
# ○ 读取rmvx备注栏指定字段
# section : 字段名
# mismatch : 未匹配时的返回值
#-------------------------------------------------------------------------
def read_note(section, mismatch = nil)
return RPG::ReadNote.read(@map.note, section, mismatch);
end
end
复制代码
以上的脚本也适用于《RMVA》
判断角色是否能够使用技能升级卷轴:
#encoding:utf-8
#==============================================================================
# ■ Game_Battler
#------------------------------------------------------------------------------
# 处理战斗者的类。Game_Actor 和 Game_Enemy 类的父类。
#==============================================================================
class Game_Battler < Game_BattlerBase
#--------------------------------------------------------------------------
# ● 技能/物品的应用测试
# 如果使用目标的 HP 或者 MP 全满时,禁止使用恢复道具。
# ● 新增功能:当使用技能升级卷轴时,没有拥有旧的技能就不能使用。
#--------------------------------------------------------------------------
def item_test(user, item)
bool = true;#特殊使用条件的判断。如果不需要判断,则默认通过,以防BUG!
#以下为判断角色是否学会了旧的技能
#read_note函数在第6脚本
oldSkill = item.read_note("需要技能");#获取旧技能ID
newSkill = item.read_note("学会技能");#获取新技能ID
if nil != oldSkill #如果旧技能ID不等于nil,即需要判断是否学会旧技能
#如果旧技能已经学会并且新技能没有学会
if user.skill_learn?($data_skills[oldSkill])
if !user.skill_learn?($data_skills[newSkill])
bool = true; #通过条件
else
bool = false;
end
else
bool = false; #不通过条件
end
end
#id为19(作者)的角色不能使用任何道具
if user.id == 19
bool = false;
end
#有其他特殊的判断需要仿造以上例子新增if语句,用bool记录条件是否通过
if bool#只有在特殊条件满足时才判断一般条件
return false if item.for_dead_friend? != dead?
return true if $game_party.in_battle
return true if item.for_opponent?
return true if item.damage.recover? && item.damage.to_hp? && hp < mhp
return true if item.damage.recover? && item.damage.to_mp? && mp < mmp
return true if item_has_any_valid_effects?(user, item)
return false
else#特殊条件如果不满足则直接返回false,无需判断一般条件
return false;
end
end
end
复制代码
技能升级卷轴的效果:
#encoding:utf-8
#==============================================================================
# ■ Game_Battler
#------------------------------------------------------------------------------
# 处理战斗者的类。Game_Actor 和 Game_Enemy 类的父类。
#==============================================================================
class Game_Battler < Game_BattlerBase
#--------------------------------------------------------------------------
# ● 升级技能:根据传入的user和item,来升级指定角色的技能
# ● 判断角色是否满足升级技能的条件在脚本“物品的特殊使用判定”的17行-25行
#--------------------------------------------------------------------------
def learn_skill_by_item(user, item)
#read_note函数在第6脚本
oldSkill = item.read_note("需要技能");#获取旧技能ID
if oldSkill != nil#如果物品的效果是技能升级
#read_note函数在第6脚本
newSkill = item.read_note("学会技能");#获取新技能ID
user.forget_skill(oldSkill);#遗忘掉旧技能
user.learn_skill(newSkill);#领悟新的技能
end
end
end
复制代码
#encoding:utf-8
#==============================================================================
# ■ Game_Battler
#------------------------------------------------------------------------------
# 处理战斗者的类。Game_Actor 和 Game_Enemy 类的父类。
#
# ■修改后的类融合了新增的几个功能
#==============================================================================
class Game_Battler < Game_BattlerBase
#--------------------------------------------------------------------------
# ● 对技能/物品使用者的效果
#--------------------------------------------------------------------------
def item_user_effect(user, item)
user.tp += item.tp_gain * user.tcr
#以下函数在第3脚本
learn_skill_by_item(user, item);#升级技能
end
end
复制代码
技能升级卷轴需要添加以下备注:
需要技能 = id
学会技能 = id
欢迎光临 Project1 (https://rpg.blue/)
Powered by Discuz! X3.1