注册会员 登录
Project1 返回首页

喵呜喵5的树洞 https://rpg.blue/?291206 [收藏] [复制] [分享] [RSS]

日志

【脚本】Case

热度 9已有 2086 次阅读2014-6-17 18:48 |个人分类:脚本

=begin
===============================================================================
  Case By喵呜喵5
===============================================================================

【说明】

  “判断变量的值为1时执行XX事件,值为2时执行XX事件,值为3时执行XX事件...”
  像是这样的内容用默认的事件指令来写时要写好多个分支条件,看着极其不舒服

  这个脚本将类似case这样的Ruby语法移植到了事件中,
  使在事件中实现上面的过程变得清晰起来

  效果图:
  http://rm.66rpg.com/home.php?mod=space&uid=291206&do=blog&id=13466

=end
#==============================================================================
# 脚本部分
#==============================================================================
$m5script ||= {};$m5script[:M5Case20140617] = 20150803
class Game_Interpreter
  #--------------------------------------------------------------------------
  # ● 储存 Case 数据
  #--------------------------------------------------------------------------
  alias m5_20150803_marshal_dump marshal_dump
  def marshal_dump
    data = m5_20150803_marshal_dump
    data.push @m5case
    data
  end
  #--------------------------------------------------------------------------
  # ● 读取 Case 数据
  #--------------------------------------------------------------------------
  alias m5_20150803_marshal_load marshal_load
  def marshal_load(obj)
    @m5case = obj.pop
    m5_20150803_marshal_load(obj)
  end
  #--------------------------------------------------------------------------
  # ● 初始化
  #--------------------------------------------------------------------------
  alias m5_20140617_clear clear
  def clear
    m5_20140617_clear
    @m5case = [0]
  end
  #--------------------------------------------------------------------------
  # ● 执行事件
  #--------------------------------------------------------------------------
  alias m5_20140617_execute_command execute_command
  def execute_command
    return m5_20140617_execute_command if @m5case[0] == 0
    if @m5case[0] != 0
      flag = false
      @m5case[0].times {|indent| flag = true unless @m5case[indent+1][1]}
      return m5_20140617_execute_command unless flag
      command = @list[@index]
      m5_20140617_execute_command if command.code == 108
    end
  end
  #--------------------------------------------------------------------------
  # ● case
  #--------------------------------------------------------------------------
  alias m5_20140617_command_1081 command_108
  def command_108
    m5_20140617_command_1081
    return unless @comments[0] =~ (/^\s*case\s*.*?/)
    if @comments[0] =~ (/^\s*case\s*$/)
      comment = "true"
    else
      comment = @comments[0].clone
      comment.slice!(/^\s*case\s+.*?/) rescue ""
    end
    变量 = $game_variables
    @m5case[0] += 1
    @m5case[@m5case[0]] = [eval(comment),false,false]
  end
  #--------------------------------------------------------------------------
  # ● when
  #--------------------------------------------------------------------------
  alias m5_20140617_command_1082 command_108
  def command_108
    m5_20140617_command_1082
    return unless (@m5case[0] != 0 && @comments[0] =~ (/^\s*when\s+.*?/))
    comment = @comments[0].clone
    comment.slice!(/^\s*when\s+.*?/) rescue ""
    return if comment == ""
    变量 = $game_variables
    comment = eval("[#{comment}]")
    comment.each do |c|
      @m5case[@m5case[0]][1] = ( c == @m5case[@m5case[0]][0])
      if @m5case[@m5case[0]][1]
        @m5case[@m5case[0]][2] = true
        break
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● else
  #--------------------------------------------------------------------------
  alias m5_20140617_command_1084 command_108
  def command_108
    m5_20140617_command_1084
    return unless (@m5case[0] != 0 && @comments[0] =~ (/^\s*else\s*?/))
    return (@m5case[@m5case[0]][1] = false) if @m5case[@m5case[0]][2]
    @m5case[@m5case[0]][1] = true
  end
  #--------------------------------------------------------------------------
  # ● end
  #--------------------------------------------------------------------------
  alias m5_20140617_command_1083 command_108
  def command_108
    m5_20140617_command_1083
    return unless (@m5case[0] != 0 && @comments[0] =~ (/^\s*end\s*?/))
    @m5case[0] -= 1
  end
end

3

鸡蛋

鲜花

刚表态过的朋友 (3 人)

发表评论 评论 (4 个评论)

回复 taroxd 2014-6-18 18:23
喵的要是我要觉得烦就直接纯脚本解决...

还有,case后面不用跟true,这个脚本似乎不支持then,else后面似乎也必须要换行

果然还是直接用ruby脚本得了……

其实我现在在设想一个功能,“显示文字”这类功能中可以使用#{code}这种作弊的玩意儿……
回复 喵呜喵5 2014-6-18 19:33
taroxd: 喵的要是我要觉得烦就直接纯脚本解决...

还有,case后面不用跟true,这个脚本似乎不支持then,else后面似乎也必须要换行

果然还是直接用ruby脚本得了……

其 ...
仔细一想case后面确实没有跟着true的必要,于是重新修改了正则表达式把true的必要性去掉了
then和else这些不必换行的东西,既然都不必换行了为什么还要用事件,直接用ruby脚本得了…………
回复 taroxd 2014-6-18 20:03
[也就是需要返回值,所以习惯不换行版本了……抱歉。quote]喵呜喵5: 仔细一想case后面确实没有跟着true的必要,于是重新修改了正则表达式把true的必要性去掉了
then和else这些不必换行的东西,既然都不必换行了为什么还要用事件, ...[/quote]ruby原本的语法中,case后就不必要跟true

不过这种用法基本都会用if...elsif...else...end代替就是了

我一直把case语句当做表达式用的,也就是需要返回值,隐因此习惯了单行……抱歉了提出奇怪的问题
回复 xingmot 2014-7-15 08:22
好像还可以自己加一个开关 = $game_switches

facelist doodle 涂鸦笔

您需要登录后才可以评论 登录 | 注册会员

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

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

GMT+8, 2024-4-19 12:08

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

返回顶部