查看: 74|回复: 0

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

[复制链接]
  • TA的每日心情
    开心
    6 天前
  • 签到天数: 33 天

    连续签到: 1 天

    [LV.5]常住居民I

    2022

    主题

    32

    回帖

    7144

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    VIP
    0
    卡币
    5074
    OK点
    16
    积分
    7144
    发表于 同元一千年八月九日(秋) | 显示全部楼层 |阅读模式
    不行了不行了,允许我臭屁一下,我本来说好了所有插件都是成系列发布的,但这个我必须写一个脱壳(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. # ■ NameParser
    75. #------------------------------------------------------------------------------
    76. #   解析开关和变量名称的模块。
    77. #==============================================================================
    78. module NameParser
    79.   includeSailCat::System_Config
    80.   #--------------------------------------------------------------------------
    81.   # ● 表达式缓存和宏替换
    82.   #--------------------------------------------------------------------------
    83.   @@exp_cache = Hash.newdo |hash, exp|
    84.     key = exp.clone
    85.     unless exp[0] == DISABLE_SUB
    86.       exp.gsub!(/\\N/)    {"$game_actors"}
    87.       exp.gsub!(/\\P/)    {"$game_party.actors"}
    88.       exp.gsub!(/\\E/)    {"$game_troop.enemies"}
    89.       exp.gsub!(/\\M/)    {"$game_map.events"}
    90.       exp.gsub!(/\\L/)    {"$game_party.max_level"}
    91.       exp.gsub!(/\\G/)    {"$game_party.gold"}
    92.       exp.gsub!(/\\B/)    {"$game_party.steps"}
    93.       exp.gsub!(/\\T/)    {"$game_system.timer / Graphics.frame_rate"}
    94.       exp.gsub!(/\\F/)    {"Graphics.frame_count / Graphics.frame_rate"}
    95.       exp.gsub!(/\\C/)    {"$game_screen.weather_type"}
    96.       exp.gsub!(/\\I/)    {"$game_party.item_number"}
    97.       exp.gsub!(/\\W/)    {"$game_party.weapon_number"}
    98.       exp.gsub!(/\\A/)    {"$game_party.armor_number"}
    99.       exp.gsub!(/\.k\?/)  {".skill_learn?"}
    100.       exp.gsub!(/\.w\?/)  {".weapon_id=="}
    101.       exp.gsub!(/\.a\?/)  {".to_a.map{|a|[a.armor1_id,a.armor2_id,"+
    102.         "a.armor3_id,a.armor4_id]}.flatten.i?"}
    103.       exp.gsub!(/\.s\?/)  {".state?"}
    104.       exp.gsub!(/\.i\?/)  {".include?"}
    105.     else
    106.       exp.slice!(0, 1)
    107.     end
    108.     hash[key] = exp
    109.   end
    110.   #--------------------------------------------------------------------------
    111.   # ● 表达式计算
    112.   #     exp : 名称中所含的表达式
    113.   #--------------------------------------------------------------------------
    114.   defself.parse(exp)
    115.     lambda{|a, b, l, s, v, f, m, t, y, r| eval(@@exp_cache[exp])}.call(
    116.       $game_temp.in_battle ?
    117.         $scene.instance_variable_get(:@active_battler) : nil,
    118.       $game_temp.in_battle ?
    119.         $scene.instance_variable_get(:@target_battlers) : nil,
    120.       $game_player, $game_switches, $game_variables, $game_self_switches,
    121.       $game_map, $game_temp, $game_system, $game_screen
    122.     )
    123.   end
    124.   #--------------------------------------------------------------------------
    125.   # ● 辅助判定函数
    126.   #--------------------------------------------------------------------------
    127.   defself.ss(set);   set.to_a.any? {|id| $game_switches[id]};            end
    128.   defself.tt(set);   set.to_a.all? {|id| $game_switches[id]};            end
    129.   defself.vv(set);   set.to_a.any? {|id| $game_variables[id] != 0};      end
    130.   defself.xx(set);   set.to_a.all? {|id| $game_variables[id] != 0};      end
    131.   defself.uu(set);   set.to_a.inject(0){|a,id| a+$game_variables[id]};   end
    132. end
    133. #==============================================================================
    134. # ■ Game_Switches
    135. #==============================================================================
    136. class Game_Switches
    137.   includeSailCat::System_Config
    138.   #--------------------------------------------------------------------------
    139.   # ● 获取自更新开关
    140.   #     id : 开关 ID
    141.   #--------------------------------------------------------------------------
    142.   alias sailcat_autosw :[]
    143.   def[](id)
    144.     if$data_system.switches[id].to_s[0] == EVAL_PREFIX then
    145.       !!NameParser::parse($data_system.switches[id][1..-1])rescuefalse
    146.     else
    147.       sailcat_autosw(id)
    148.     end
    149.   end
    150. end
    151. #==============================================================================
    152. # ■ Game_Variables
    153. #==============================================================================
    154. class Game_Variables
    155.   includeSailCat::System_Config
    156.   #--------------------------------------------------------------------------
    157.   # ● 获取自更新变量
    158.   #     id : 变量 ID
    159.   #--------------------------------------------------------------------------
    160.   alias sailcat_autova :[]
    161.   def[](id)
    162.     if$data_system.variables[id].to_s[0] == EVAL_PREFIX then
    163.       value = (NameParser::parse($data_system.variables[id][1..-1])rescue0)
    164.       FORCE_INT_V ? (value.to_irescue0) : value
    165.     else
    166.       sailcat_autova(id)
    167.     end
    168.   end
    169. end
    复制代码

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

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?立即注册

    x
    天天去同能,天天有童年!
    回复 论坛版权

    使用道具 举报

    ahome_bigavatar:guest
    ahome_bigavatar:welcomelogin
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|手机版|小黑屋|同能RPG制作大师 ( 沪ICP备12027754号-3 )

    GMT+8, 2024-5-4 00:30 , Processed in 0.063843 second(s), 51 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.

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