设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 3623|回复: 12
打印 上一主题 下一主题

[原创发布] 自更新开关和变量(你用了会知道有多好用)

[复制链接]

Lv5.捕梦者 (版主)

遠航の猫咪

梦石
3
星屑
23201
在线时间
2387 小时
注册时间
2005-10-15
帖子
1166

开拓者

跳转到指定楼层
1
发表于 2022-1-22 01:28:43 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

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

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

然后XP长这样:


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

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

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

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

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

RUBY 代码复制
  1. #==============================================================================
  2. # ■ [Automated Switches/Variables Indie] 自更新开关变量独立版 v1.0 by SailCat
  3. #------------------------------------------------------------------------------
  4. #   方法:本脚本插入到Main之前使用,且需在所有依赖此脚本的其他插件之前
  5. #   依赖:无
  6. #   版本:v1.0 (Build 220122)
  7. #   效果:开关和变量可以自更新(设置为自更新则无法进行赋值)
  8. #   配置:自更新标记前导字符
  9. #   冲突:无
  10. #   说明:
  11. #     1. 自更新的识别很简单:将变量或开关名称的首个字符写成前导字符即可
  12. #        插件识别到前导字符,就会认为这是一个自更新的开关或者变量
  13. #     2. 前导符是“=”(半角等号,可以配置)时,表示这是一个自更新的开关或变量
  14. #        = 符号之后的部分,是用于自更新的 Ruby 表达式
  15. #        由于输入长度限制,为便利书写,表达式中可使用以下标识符,注意大小写
  16. #        标识符    等价表达式                 说明                 示例写法
  17. #      ------------------------------------------------------------------------
  18. #        \N        $game_actors               按ID号取角色(数组) \N[1].str
  19. #        \P        $game_party.actors         按队序取角色(数组) \P[0].name
  20. #        \E        $game_troop.enemies        按队序取敌人(数组) \E[2].level
  21. #        \M        $game_map.events           按ID号取事件(哈希) \M[3]
  22. #        \L        $game_party.max_level      全队等级(值)       \L
  23. #        \G        $game_party.gold           金钱(值)           \G
  24. #        \B        $game_party.steps          步数(值)           \B
  25. #        \T        $game_system.timer /       计时器(值)         \T
  26. #                    Graphics.frame_rate      (换算为秒数)
  27. #        \F        Graphics.frame_count /     游戏时间(值)       \F
  28. #                    Graphics.frame_rate      (换算为秒数)
  29. #        \C        $game_screen.weather_type  天气 类型(值)      \C
  30. #        \I        $game_party.item_number    道具 持有数(函数)  \I(12)
  31. #        \W        $game_party.weapon_number  武器 持有数(函数)  \W(2)
  32. #        \A        $game_party.armor_number   防具 持有数(函数)  \A(31)
  33. #        .k?       .skill_learn?              技能 习得否(函数)  \N[1].k?(6)
  34. #        .w?       (过于复杂,略)             武器 装备否(函数)  \N[4].w?(8)
  35. #        .a?       (过于复杂,略)             防具 装备否(函数)  \P[2].a?(9)
  36. #        .s?       .state?                    状态 存在否(函数)  \E[5].s?(3)
  37. #        .i?       .include?                  集合 包含否(函数)  \P.i?(\N[7])
  38. #      --若将表达式开头加上反斜杠(\)符号会停止识别以上标识符,以下依然有效---
  39. #        a         (过于复杂,略)             当前战斗者(仅战斗) a.maxhp
  40. #        b         (过于复杂,略)             当前对象者(仅战斗) b[0].dead?
  41. #        l         $game_player               主角                 l.x
  42. #        s         $game_switches             开关                 s[23]
  43. #        v         $game_variables            变量                 v[112]
  44. #        f         $game_self_switches        独立开关             f[[1,2,"A"]]
  45. #        m         $game_map                  地图数据             m.map_id
  46. #        t         $game_temp                 临时游戏数据         t.in_battle
  47. #        y         $game_system               系统游戏数据         y.save_count
  48. #        r         $game_screen               屏幕元素             r.tone.red
  49. #     3. 表达式的执行上下文是Game_Switches或者Game_Variables,约等于没有上下文
  50. #        所以并不存在事件系统中指定“本事件”或者类似的功能,书写时请注意
  51. #     4. 出于游戏数据统一处理的需要,所有自更新开关会被强制转换为true或false
  52. #        转换不成功的数据或运算失败的表达式,会自动识别成false,该功能不可关闭
  53. #     5. 出于游戏数据统一处理的需要,所有自更新变量会被强制转换成整数
  54. #        转换不成功的数据或运算失败的表达式,会自动识别成0,该功能可配置关闭
  55. #     6. 由于编辑器输入限制,包括前导符在内的变量和开关名称最长40字符,无法突破
  56. #        为了方便复杂条件的书写,本插件中的表达式功能额外提供以下判定写法
  57. #        ss(开关编号集):指定范围编号的开关是否有至少1个为true
  58. #        tt(开关编号集):指定范围编号的开关是否全部为true
  59. #        vv(变量编号集):指定范围编号的变量是否有至少1个不为0
  60. #        xx(变量编号集):指定范围编号的变量是否全部不为0
  61. #        uu(变量编号集):指定范围编号的变量值之和
  62. #==============================================================================
  63. #==============================================================================
  64. # ■ SailCat's 插件公用
  65. #==============================================================================
  66. module SailCat
  67.   module System_Config
  68.     EVAL_PREFIX = ?=              # 自更新开关/变量 前导识别符
  69.     DISABLE_SUB = ?\              # 自更新表达式停止宏替换标记符
  70.     FORCE_INT_V = true            # 自更新的变量值是否强制转为整数
  71.   end
  72. end
  73.  
  74. #==============================================================================
  75. # ■ NameParser
  76. #------------------------------------------------------------------------------
  77. #   解析开关和变量名称的模块。
  78. #==============================================================================
  79. module NameParser
  80.   include SailCat::System_Config
  81.   #--------------------------------------------------------------------------
  82.   # ● 表达式缓存和宏替换
  83.   #--------------------------------------------------------------------------
  84.   @@exp_cache = Hash.new do |hash, exp|
  85.     key = exp.clone
  86.     unless exp[0] == DISABLE_SUB
  87.       exp.gsub!(/\\N/)    { "$game_actors" }
  88.       exp.gsub!(/\\P/)    { "$game_party.actors" }
  89.       exp.gsub!(/\\E/)    { "$game_troop.enemies" }
  90.       exp.gsub!(/\\M/)    { "$game_map.events" }
  91.       exp.gsub!(/\\L/)    { "$game_party.max_level" }
  92.       exp.gsub!(/\\G/)    { "$game_party.gold" }
  93.       exp.gsub!(/\\B/)    { "$game_party.steps" }
  94.       exp.gsub!(/\\T/)    { "$game_system.timer / Graphics.frame_rate" }
  95.       exp.gsub!(/\\F/)    { "Graphics.frame_count / Graphics.frame_rate" }
  96.       exp.gsub!(/\\C/)    { "$game_screen.weather_type" }
  97.       exp.gsub!(/\\I/)    { "$game_party.item_number" }
  98.       exp.gsub!(/\\W/)    { "$game_party.weapon_number" }
  99.       exp.gsub!(/\\A/)    { "$game_party.armor_number" }
  100.       exp.gsub!(/\.k\?/)  { ".skill_learn?" }
  101.       exp.gsub!(/\.w\?/)  { ".weapon_id==" }
  102.       exp.gsub!(/\.a\?/)  { ".to_a.map{|a|[a.armor1_id,a.armor2_id,"+
  103.         "a.armor3_id,a.armor4_id]}.flatten.i?" }
  104.       exp.gsub!(/\.s\?/)  { ".state?" }
  105.       exp.gsub!(/\.i\?/)  { ".include?" }
  106.     else
  107.       exp.slice!(0, 1)
  108.     end
  109.     hash[key] = exp
  110.   end
  111.   #--------------------------------------------------------------------------
  112.   # ● 表达式计算
  113.   #     exp : 名称中所含的表达式
  114.   #--------------------------------------------------------------------------
  115.   def self.parse(exp)
  116.     lambda {|a, b, l, s, v, f, m, t, y, r| eval(@@exp_cache[exp])}.call(
  117.       $game_temp.in_battle ?
  118.         $scene.instance_variable_get(:@active_battler) : nil,
  119.       $game_temp.in_battle ?
  120.         $scene.instance_variable_get(:@target_battlers) : nil,
  121.       $game_player, $game_switches, $game_variables, $game_self_switches,
  122.       $game_map, $game_temp, $game_system, $game_screen
  123.     )
  124.   end
  125.   #--------------------------------------------------------------------------
  126.   # ● 辅助判定函数
  127.   #--------------------------------------------------------------------------
  128.   def self.ss(set);   set.to_a.any? {|id| $game_switches[id]};            end
  129.   def self.tt(set);   set.to_a.all? {|id| $game_switches[id]};            end
  130.   def self.vv(set);   set.to_a.any? {|id| $game_variables[id] != 0};      end
  131.   def self.xx(set);   set.to_a.all? {|id| $game_variables[id] != 0};      end
  132.   def self.uu(set);   set.to_a.inject(0){|a,id| a+$game_variables[id]};   end
  133. end
  134.  
  135. #==============================================================================
  136. # ■ Game_Switches
  137. #==============================================================================
  138. class Game_Switches
  139.   include SailCat::System_Config
  140.   #--------------------------------------------------------------------------
  141.   # ● 获取自更新开关
  142.   #     id : 开关 ID
  143.   #--------------------------------------------------------------------------
  144.   alias sailcat_autosw :[]
  145.   def [](id)
  146.     if $data_system.switches[id].to_s[0] == EVAL_PREFIX then
  147.       !!NameParser::parse($data_system.switches[id][1..-1]) rescue false
  148.     else
  149.       sailcat_autosw(id)
  150.     end
  151.   end
  152. end
  153.  
  154. #==============================================================================
  155. # ■ Game_Variables
  156. #==============================================================================
  157. class Game_Variables
  158.   include SailCat::System_Config
  159.   #--------------------------------------------------------------------------
  160.   # ● 获取自更新变量
  161.   #     id : 变量 ID
  162.   #--------------------------------------------------------------------------
  163.   alias sailcat_autova :[]
  164.   def [](id)
  165.     if $data_system.variables[id].to_s[0] == EVAL_PREFIX then
  166.       value = (NameParser::parse($data_system.variables[id][1..-1]) rescue 0)
  167.       FORCE_INT_V ? (value.to_i rescue 0) : value
  168.     else
  169.       sailcat_autova(id)
  170.     end
  171.   end
  172. end

评分

参与人数 7星屑 +150 +7 收起 理由
taeckle + 1 大神威武!
u0113802 + 1 精品文章
enghao_lim + 1 这点子香得不行
灯笼菜刀王 + 1 好创意
RyanBern + 150 + 1 精品文章
89444640 + 1 塞糖
涅炎 + 1 精品文章

查看全部评分

SailCat (小猫子·要开心一点) 共上站 24 次,发表过 11 篇文章 上 次 在: [2006年01月28日11:41:18 星期六] 从 [162.105.120.91] 到本站一游。

Lv6.析梦学徒

老鹰

梦石
40
星屑
34745
在线时间
6741 小时
注册时间
2012-5-26
帖子
3259

极短24评委极短23参与极短22参与极短21评委老司机慢点开短篇十吟唱者组别冠军开拓者剧作品鉴家

2
发表于 2022-1-22 12:39:15 | 只看该作者
666
就相当于打包了一些条件公式,变成单个开关或变量就能调用
的确会是很方便的制作策略

点评

在此之前,要做到同样的自定义判定事件页效果,一般得是在默认移动路径那里用脚本hack……但是战斗事件就没法管了(VA战斗事件的条件也比XP丰富)  发表于 2022-1-22 13:21
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
39021
在线时间
5719 小时
注册时间
2006-11-10
帖子
6619
3
发表于 2022-3-1 10:54:30 | 只看该作者
这个idea非常好, 节省了相当多的改造步骤, 我很喜欢~~

评分

参与人数 1+1 收起 理由
taeckle + 1 精品文章

查看全部评分

回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
581
在线时间
100 小时
注册时间
2021-8-27
帖子
41
4
发表于 2022-12-3 13:48:41 | 只看该作者
我想用 但是我看的似懂非懂 能讲解一下么 我是个比较笨的人
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
292
在线时间
68 小时
注册时间
2022-11-22
帖子
13
5
发表于 2022-12-4 07:37:45 | 只看该作者
好像很厉害的样子
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
6757
在线时间
593 小时
注册时间
2017-11-10
帖子
688

极短21参与

6
发表于 2022-12-4 10:08:28 | 只看该作者
请问大神,可以实现文章显示一个动态的脸图(根据角色目前的脸图变化)吗
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
24
星屑
7507
在线时间
249 小时
注册时间
2020-12-4
帖子
306

极短24获奖极短23获奖极短22获奖

7
发表于 2022-12-8 11:32:23 | 只看该作者
好强大的思路和脚本

不过,关于脚本的运行,想问一下,这些开关变量的数值更新是随着对应$game变量变换的那一刻变换,还是每一帧都在读取$game数据然后给开关变量赋值
(感觉应该是前者,不过脚本白痴看不懂是如何实现的 hhhhh 想学习一下)

点评

噢...内个,能不能劳烦猫大做一个DEBUG提示什么的,变量表达式不小心写错了的话,直接爆SyntaxError,程序多了有时候不知错误源~~0.0  发表于 2022-12-9 01:13
唔~~~谢谢解答,这确实是最节约算力资源的方式!  发表于 2022-12-9 00:11
都不是,是在系统需要读这个变量的时候,读取时发现它是个自动更新的变量,就会去计算绑定的数据把值返回来,这种变量本身没法赋值,是只读的  发表于 2022-12-8 23:38
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
1
星屑
10103
在线时间
4433 小时
注册时间
2005-10-22
帖子
6962

开拓者贵宾

8
发表于 2022-12-11 04:07:42 | 只看该作者

喵哈哈哈哈,我觉得挂在事件页第一行的位置当条件更好用,并且也没有40个字符的问题。

当然,我已经在用更离谱的方法了。
我们还是来改编辑器吧。

点评

精品文章  发表于 2022-12-11 13:31
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-27 16:11

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表