じ☆ve冰风 发表于 2024-4-20 02:14:32

自更新开关和变量(你用了会知道有多好用)

不行了不行了,允许我臭屁一下,我本来说好了所有插件都是成系列发布的,但这个我必须写一个脱壳(SEP core)的版本
因为,亲测TM实在是太!香!了!!!!

本来吗VA的事件出现条件长这样:

然后XP长这样:


所以有没有发现少了点什么?

你可能说,我用条件分歧不就行了,我很遗憾的告诉你,因为(地图、战斗事件)页面出现条件开关(也包括敌人的行动规律、公共事件的触发开关)中牵涉到地图上对角色图像的渲染,战斗中调哪个解释器等等方面,用条件分歧去模拟实现非常麻烦,而且由于可能要做事件消失,性能方面存在问题
你说,那我用全局并行事件实时更新我要的开关和变量。那我告诉你,你想要几个并行公共事件?不嫌卡吗?而且战斗中是没有并行事件的,并行事件在战斗中会挂起的。

但是,现在一切都不是问题了,各种只要设定一个公式就可以自己更新的开关和变量,你可以把条件玩儿出花来?VA有的你都有,VA没有的我也不允许你没有!
惟一的限制就是公式只能写39字符,没关系,我给了你变相突破的方案和各种简写方法

卷起来吧!
因为这个版本做成了独立插件,无法利用SEP core的扩展接口,所以简写那块并不具备扩展的功能,但……允许你写ruby干表达式这种事情……懂的都懂

想要SEP系列插件可扩展版的,我会尽快,修完RGSS新发现的bug就上新哈

RUBY 代码
#==============================================================================
# ■ 自更新开关变量独立版 v1.0 by SailCat
#------------------------------------------------------------------------------
#   方法:本脚本插入到Main之前使用,且需在所有依赖此脚本的其他插件之前
#   依赖:无
#   版本:v1.0 (Build 220122)
#   效果:开关和变量可以自更新(设置为自更新则无法进行赋值)
#   配置:自更新标记前导字符
#   冲突:无
#   说明:
#   1. 自更新的识别很简单:将变量或开关名称的首个字符写成前导字符即可
#      插件识别到前导字符,就会认为这是一个自更新的开关或者变量
#   2. 前导符是“=”(半角等号,可以配置)时,表示这是一个自更新的开关或变量
#      = 符号之后的部分,是用于自更新的 Ruby 表达式
#      由于输入长度限制,为便利书写,表达式中可使用以下标识符,注意大小写
#      标识符    等价表达式               说明               示例写法
#      ------------------------------------------------------------------------
#      \N      $game_actors               按ID号取角色(数组) \N.str
#      \P      $game_party.actors         按队序取角色(数组) \P.name
#      \E      $game_troop.enemies      按队序取敌人(数组) \E.level
#      \M      $game_map.events         按ID号取事件(哈希) \M
#      \L      $game_party.max_level      全队等级(值)       \L
#      \G      $game_party.gold         金钱(值)         \G
#      \B      $game_party.steps          步数(值)         \B
#      \T      $game_system.timer /       计时器(值)         \T
#                  Graphics.frame_rate      (换算为秒数)
#      \F      Graphics.frame_count /   游戏时间(值)       \F
#                  Graphics.frame_rate      (换算为秒数)
#      \C      $game_screen.weather_type天气 类型(值)      \C
#      \I      $game_party.item_number    道具 持有数(函数)\I(12)
#      \W      $game_party.weapon_number武器 持有数(函数)\W(2)
#      \A      $game_party.armor_number   防具 持有数(函数)\A(31)
#      .k?       .skill_learn?            技能 习得否(函数)\N.k?(6)
#      .w?       (过于复杂,略)             武器 装备否(函数)\N.w?(8)
#      .a?       (过于复杂,略)             防具 装备否(函数)\P.a?(9)
#      .s?       .state?                  状态 存在否(函数)\E.s?(3)
#      .i?       .include?                  集合 包含否(函数)\P.i?(\N)
#      --若将表达式开头加上反斜杠(\)符号会停止识别以上标识符,以下依然有效---
#      a         (过于复杂,略)             当前战斗者(仅战斗) a.maxhp
#      b         (过于复杂,略)             当前对象者(仅战斗) b.dead?
#      l         $game_player               主角               l.x
#      s         $game_switches             开关               s
#      v         $game_variables            变量               v
#      f         $game_self_switches      独立开关             f[]
#      m         $game_map                  地图数据             m.map_id
#      t         $game_temp               临时游戏数据         t.in_battle
#      y         $game_system               系统游戏数据         y.save_count
#      r         $game_screen               屏幕元素             r.tone.red
#   3. 表达式的执行上下文是Game_Switches或者Game_Variables,约等于没有上下文
#      所以并不存在事件系统中指定“本事件”或者类似的功能,书写时请注意
#   4. 出于游戏数据统一处理的需要,所有自更新开关会被强制转换为true或false
#      转换不成功的数据或运算失败的表达式,会自动识别成false,该功能不可关闭
#   5. 出于游戏数据统一处理的需要,所有自更新变量会被强制转换成整数
#      转换不成功的数据或运算失败的表达式,会自动识别成0,该功能可配置关闭
#   6. 由于编辑器输入限制,包括前导符在内的变量和开关名称最长40字符,无法突破
#      为了方便复杂条件的书写,本插件中的表达式功能额外提供以下判定写法
#      ss(开关编号集):指定范围编号的开关是否有至少1个为true
#      tt(开关编号集):指定范围编号的开关是否全部为true
#      vv(变量编号集):指定范围编号的变量是否有至少1个不为0
#      xx(变量编号集):指定范围编号的变量是否全部不为0
#      uu(变量编号集):指定范围编号的变量值之和
#==============================================================================
#==============================================================================
# ■ SailCat's 插件公用
#==============================================================================
module SailCat
module System_Config
    EVAL_PREFIX = ?=            # 自更新开关/变量 前导识别符
    DISABLE_SUB = ?\            # 自更新表达式停止宏替换标记符
    FORCE_INT_V = true            # 自更新的变量值是否强制转为整数
end
end

#==============================================================================
# ■ NameParser
#------------------------------------------------------------------------------
#   解析开关和变量名称的模块。
#==============================================================================
module NameParser
includeSailCat::System_Config
#--------------------------------------------------------------------------
# ● 表达式缓存和宏替换
#--------------------------------------------------------------------------
@@exp_cache = Hash.newdo |hash, exp|
    key = exp.clone
    unless exp == DISABLE_SUB
      exp.gsub!(/\\N/)    {"$game_actors"}
      exp.gsub!(/\\P/)    {"$game_party.actors"}
      exp.gsub!(/\\E/)    {"$game_troop.enemies"}
      exp.gsub!(/\\M/)    {"$game_map.events"}
      exp.gsub!(/\\L/)    {"$game_party.max_level"}
      exp.gsub!(/\\G/)    {"$game_party.gold"}
      exp.gsub!(/\\B/)    {"$game_party.steps"}
      exp.gsub!(/\\T/)    {"$game_system.timer / Graphics.frame_rate"}
      exp.gsub!(/\\F/)    {"Graphics.frame_count / Graphics.frame_rate"}
      exp.gsub!(/\\C/)    {"$game_screen.weather_type"}
      exp.gsub!(/\\I/)    {"$game_party.item_number"}
      exp.gsub!(/\\W/)    {"$game_party.weapon_number"}
      exp.gsub!(/\\A/)    {"$game_party.armor_number"}
      exp.gsub!(/\.k\?/){".skill_learn?"}
      exp.gsub!(/\.w\?/){".weapon_id=="}
      exp.gsub!(/\.a\?/){".to_a.map{|a|[a.armor1_id,a.armor2_id,"+
      "a.armor3_id,a.armor4_id]}.flatten.i?"}
      exp.gsub!(/\.s\?/){".state?"}
      exp.gsub!(/\.i\?/){".include?"}
    else
      exp.slice!(0, 1)
    end
    hash = exp
end
#--------------------------------------------------------------------------
# ● 表达式计算
#   exp : 名称中所含的表达式
#--------------------------------------------------------------------------
defself.parse(exp)
    lambda{|a, b, l, s, v, f, m, t, y, r| eval(@@exp_cache)}.call(
      $game_temp.in_battle ?
      $scene.instance_variable_get(:@active_battler) : nil,
      $game_temp.in_battle ?
      $scene.instance_variable_get(:@target_battlers) : nil,
      $game_player, $game_switches, $game_variables, $game_self_switches,
      $game_map, $game_temp, $game_system, $game_screen
    )
end
#--------------------------------------------------------------------------
# ● 辅助判定函数
#--------------------------------------------------------------------------
defself.ss(set);   set.to_a.any? {|id| $game_switches};            end
defself.tt(set);   set.to_a.all? {|id| $game_switches};            end
defself.vv(set);   set.to_a.any? {|id| $game_variables != 0};      end
defself.xx(set);   set.to_a.all? {|id| $game_variables != 0};      end
defself.uu(set);   set.to_a.inject(0){|a,id| a+$game_variables};   end
end

#==============================================================================
# ■ Game_Switches
#==============================================================================
class Game_Switches
includeSailCat::System_Config
#--------------------------------------------------------------------------
# ● 获取自更新开关
#   id : 开关 ID
#--------------------------------------------------------------------------
alias sailcat_autosw :[]
def[](id)
    if$data_system.switches.to_s == EVAL_PREFIX then
      !!NameParser::parse($data_system.switches)rescuefalse
    else
      sailcat_autosw(id)
    end
end
end

#==============================================================================
# ■ Game_Variables
#==============================================================================
class Game_Variables
includeSailCat::System_Config
#--------------------------------------------------------------------------
# ● 获取自更新变量
#   id : 变量 ID
#--------------------------------------------------------------------------
alias sailcat_autova :[]
def[](id)
    if$data_system.variables.to_s == EVAL_PREFIX then
      value = (NameParser::parse($data_system.variables)rescue0)
      FORCE_INT_V ? (value.to_irescue0) : value
    else
      sailcat_autova(id)
    end
end
end

             本帖来自P1论坛作者百里_飞柳,因Project1站服务器在国外有时候访问缓慢不方便作者交流学习,经联系P1站长fux2同意署名转载一起分享游戏制作经验,共同为国内独立游戏作者共同创造良好交流环境,原文地址:https://rpg.blue/forum.php?mod=viewthread&tid=488418若有侵权,发帖作者可联系底部站长QQ在线咨询功能删除,谢谢。
页: [1]
查看完整版本: 自更新开关和变量(你用了会知道有多好用)