查看: 15985|回复: 20

[RMVA发布] CustomAdventure事件功能强化[6.23更新]

[复制链接]

无节操

梦石
0
星屑
608
在线时间
795 小时
注册时间
2009-2-6
回帖
3910

开拓者贵宾

发表于 2014-6-6 02:27:21 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 moy 于 2014-6-23 02:05 编辑

最近一直在填坑施工CustomAdventure,也经常在讨论区鬼混。
因为都是些小功能,且鉴于其中很多事件功能的冲突性不会太高同时也想找一些小白鼠帮忙测试,我决定发布这部分由我自己完成的脚本。如果在使用中出现什么问题希望能够得到回馈!如果有什么改进的建议也可以提,但是增加“定制的”功能我可能不会都响应。
更新记录
14.6.23  追加-自定义控制符变换(需脚本和RGSS3的基础知识)
14.6.9    追加-更换职业补丁
目录
  • 独立变量
    [fold=独立变量][pre lang="ruby" line="1"]#==============================================================================
    # ★ Custom Adventure 独立变量
    # -- Last Updated: 2014.6.2
    # -- by Moy
    # -- 转载请保留以上信息
    #==============================================================================
    #   本质上只是存了其他东西的独立开关,用set_selfvar(name,value)进行修改和新建,用
    # selfvar(name)来访问。name可以是从E~Z的字母,也可以是其他字符串,只要在数值上比"D"
    # 高就可以正常获得返回值。
    #==============================================================================
    # ■ Interpreter
    #==============================================================================
    class Game_Interpreter
      #--------------------------------------------------------------------------
      # ● 获取独立变量
      #--------------------------------------------------------------------------
      def selfvar(name)
        key = [@map_id, @event_id, name]
        $game_self_switches[key]
      end
      #--------------------------------------------------------------------------
      # ● 修改/新建独立变量
      #--------------------------------------------------------------------------
      def set_selfvar(name, value)
        key = [@map_id, @event_id, name]
        $game_self_switches[key] = value
      end
    end
    #==============================================================================
    # ■ Game_SelfSwitches
    #==============================================================================
    class Game_SelfSwitches
      #--------------------------------------------------------------------------
      # ● 获取独立开关
      #--------------------------------------------------------------------------
      def [](key)
        return @data[key] if key[2] > "D"
        @data[key] == true
      end
    end[/pre][/fold]
  • 强化物品选择
    [fold=强化物品选择][pre lang="ruby" line="1"]#==============================================================================
    # ☆ Custom Adventure 强化物品选择
    # -- Last Updated: 2014.5.23
    # -- by Moy
    # -- 转载请保留以上信息
    #==============================================================================
    #   本脚本使物品选择可以选取贵重物品以外的物品,只要给物品选择所选取的目标变量赋初值
    # 为以下几个。
    #     1 - 除贵重物品外的物品
    #     2 - 武器
    #     3 - 防具
    #     4 - 贵重物品
    #     5 - 装备品(武器和防具)
    #   另外在默认时选择的依然是贵重物品,但如果在使用完毕该变量后没有重新置0,还是会有
    # 选错成其他类型的可能,需注意。
    #==============================================================================
    #encoding:utf-8
    #==============================================================================
    # ■ Window_ItemList
    #==============================================================================
    class Window_ItemList < Window_Selectable
      #--------------------------------------------------------------------------
      # ● 查询列表中是否含有此物品
      #--------------------------------------------------------------------------
      alias ca_include? include?
      def include?(item)
        case @category
        when :item
          item.is_a?(RPG::Item) && !item.key_item?
        when :weapon
          item.is_a?(RPG::Weapon)
        when :armor
          item.is_a?(RPG::Armor)
        when :key_item
          item.is_a?(RPG::Item) && item.key_item?
        when :equip                           # 装备品策略
          item.is_a?(RPG::Weapon) || item.is_a?(RPG::Armor)
        else
          false
        end
      end
    end

    #==============================================================================
    # ■ Window_KeyItem
    #==============================================================================
    class Window_KeyItem < Window_ItemList
      #--------------------------------------------------------------------------
      # ● 开始输入的处理
      #--------------------------------------------------------------------------
      alias ca_start start
      def start
        @item_category = $game_variables[$game_message.item_choice_variable_id]
        self.category = :key_item
        self.category = :item     if @item_category == 1
        self.category = :weapon   if @item_category == 2
        self.category = :armor    if @item_category == 3
        self.category = :key_item if @item_category == 4
        self.category = :equip    if @item_category == 5   
        update_placement
        refresh
        select(0)
        open
        activate
      end
      #--------------------------------------------------------------------------
      # ● 查询此物品是否可用
      #     重写父类方法使其始终可选
      #--------------------------------------------------------------------------
      alias ca_enable? enable?
      def enable?(item)
        true
      end
    end

    #==============================================================================
    # ■ Game_Interpreter
    #==============================================================================
    class Game_Interpreter
      #--------------------------------------------------------------------------
      # ● 设置物品选择
      #--------------------------------------------------------------------------
      alias ca_setup_item_choice setup_item_choice
      def setup_item_choice(params)
        @chosen_id = params[0]
        @chosen_type = $game_variables[params[0]]
        $game_message.item_choice_variable_id = params[0]
      end
    end[/pre][/fold]
  • 强化数值输入
    [fold=强化数值输入][pre lang="ruby" line="1"]#==============================================================================
    # ☆ Custom Adventure 强化数值输入
    # -- Last Updated: 2014.5.23
    # -- by Moy
    # -- 转载请保留以上信息
    #==============================================================================
    #   本脚本使数值输入可以直接在上限处停止,并提示报错音,只要给目标变量赋初值即可。
    # 这样可以避免某些因为输入的数值出错而造成的糟糕体验。
    #   初值为0则和默认的数值输入一样,初值小于零则最大值为团队金钱,初值大于零则最大值
    # 为设定值。
    #==============================================================================
    #encoding:utf-8
    #==============================================================================
    # ■ Window_NumberInput
    #==============================================================================
    class Window_NumberInput < Window_Base
      #--------------------------------------------------------------------------
      # ● 开始输入的处理
      #--------------------------------------------------------------------------
      alias ca_start start
      def start
        @digits_max = $game_message.num_input_digits_max
        @number = $game_variables[$game_message.num_input_variable_id]
        @number = $game_party.gold if @number < 0
        @math_max = [[@number, 0].max, 10 ** @digits_max - 1].min
        @math_max = false if @math_max == 0
        @number = 0
        @index = 0
        update_placement
        create_contents
        refresh
        open
        activate
      end
      #--------------------------------------------------------------------------
      # ● 处理数字的更改
      #--------------------------------------------------------------------------
      alias ca_process_digit_change process_digit_change
      def process_digit_change
        return unless active
        if Input.repeat?(:UP) || Input.repeat?(:DOWN)
          old_num = @number
          place = 10 ** (@digits_max - 1 - @index)
          n = @number / place % 10
          @number -= n * place
          n = (n + 1) % 10 if Input.repeat?(:UP)
          n = (n + 9) % 10 if Input.repeat?(:DOWN)
          @number += n * place
          if  @math_max ? @number <= @math_max : true
            Sound.play_cursor
          else
            @number = @math_max
            Sound.play_cancel
          end
          refresh
        end
      end
    end
    [/pre][/fold]
  • 踩踏/置物判断
    [fold=踩踏/置物判断][pre lang="ruby" line="1"]#==============================================================================
    # ☆ Custom Adventure 踩踏/置物判断
    # -- Last Updated: 2014.6.3
    # -- by Moy
    # -- 转载请保留以上信息
    #==============================================================================
    #   本脚本判断一个在人物下层的事件是否被其他事件/角色踩踏
    #   对本事件使用只需要在分歧脚本中使用get_character(0).stepped_on?即可。
    #   判断别的事件请自行获取实例后使用。
    #==============================================================================
    # ■ Game_Event
    #==============================================================================
    class Game_Event < Game_Character
      #--------------------------------------------------------------------------
      # ● 判断本事件是否被其他事件/角色踩踏
      #--------------------------------------------------------------------------
      def stepped_on?
        stepped_by_events?(@x,@y) || stepped_by_player_characters?(@x, @y)
      end
      #--------------------------------------------------------------------------
      # ● 判断某位置是否被其他事件踩踏
      #--------------------------------------------------------------------------
      def stepped_by_events?(x, y)
        $game_map.events_xy_nt(x, y).any? do |event|
          event.normal_priority?
        end
      end
      #--------------------------------------------------------------------------
      # ● 判断某位置是否被主控角色踩踏
      #--------------------------------------------------------------------------
      def stepped_by_player_characters?(x, y)
        @priority_type == 0 && $game_player.collide?(x, y)
      end
    end
    [/pre][/fold]
  • 战斗日志追加
    [fold=战斗日志追加][pre lang="ruby" line="1"]#==============================================================================
    # ☆ Custom Adventure 战斗日志追加
    # -- Last Updated: 2014.6.6
    # -- by Moy
    # -- 转载请保留以上信息
    #==============================================================================
    #   本脚本只是简化直接追加战斗日志(BattleLog)的操作,省略一长串的书写,适用于使用
    # 默认脚本,或是并未废除Window_BattleLog的制作者。
    #==============================================================================
    # ■ Interpreter
    #==============================================================================
    class Game_Interpreter
      def add_battlelog(text)
        return unless SceneManager.scene.is_a?(Scene_Battle)
        SceneManager.scene.log_window.add_text(text)
      end
    end
    #==============================================================================
    # ■ Scene_Battle
    #==============================================================================
    class Scene_Battle < Scene_Base
      attr_reader   :log_window
    end[/pre][/fold]
  • 更换职业补丁
    [fold=更换职业补丁][pre lang="ruby" line="1"]#==============================================================================
    # ☆ Custom Adventure 更换职业补丁
    # -- Last Updated: 2014.6.9
    # -- by Moy
    # -- 转载请保留以上信息
    #==============================================================================
    #   本脚本只是用于方便的使用更改职业的全部功能,开关开启时将进行保留经验的转职。
    #==============================================================================
    module CA_EVENT
      CLASS_CHANGE_KEEP = 5 # 变换职业时是否保留经验值的开关
    end
    #==============================================================================
    # ■ Interpreter
    #==============================================================================
    class Game_Interpreter
      include CA_EVENT
      #--------------------------------------------------------------------------
      # ● 更改职业
      #--------------------------------------------------------------------------
      def command_321
        actor = $game_actors[@params[0]]
        keep_exp = $game_switches[CLASS_CHANGE_KEEP]
        actor.change_class(@params[1],keep_exp) if actor && $data_classes[@params[1]]
      end
    end[/pre][/fold]
     
EXTRA_STAGE



EXTRA~什么的只是噱头啦。以下脚本使用需要脚本基础,这里只提供框架,不进行具体编写。
看到某提问,想要用显示昵称啥的,脑洞一开就写了这个。还是那句话,工具给你了,怎么使用是各人的艺术了~
[fold=自定义控制符变换]
[pre lang="ruby" line="1"]#==============================================================================
# ☆ Custom Adventure 自定义控制符变换
# -- Last Updated: 2014.6.23
# -- by Moy
# -- 转载请保留以上信息
#==============================================================================
#   可以很方便的进行扩展的控制符变换,现在你可以使用显示文本做任何事了(笑),前提
# 是你知道该怎么做。
#==============================================================================
module CA_EVENT
  USE_CUSTOM_CONVERT = true     # 是否开启自定义控制符变换
  #--------------------------------------------------------------------------
  # 简单变换:     左侧是操作符,右侧是脚本实现
  #   以默认脚本为例就是\G
  #--------------------------------------------------------------------------
  SIMPLE_CONVERT = {
    "nl" => "p 1"
  }#SIMPLE_CONVERT
  #--------------------------------------------------------------------------
  # 数组形式变换: 左侧是操作符,右侧是脚本实现
  #   以默认脚本为例就是\V[n]
  #--------------------------------------------------------------------------
  ARRAY_CONVERT = {
    "nn" => "p $1.to_i"
  }#ARRAY_CONVERT
  # 变换的基础,勿动
  SIMPLE_CONVERT_BASE = /\e%s/.to_s
  ARRAY_CONVERT_BASE  = /\e%s\[(\d+)\]/i.to_s
end
#==============================================================================
# ■ Window_Base
#==============================================================================
class Window_Base < Window
  include CA_EVENT
  #--------------------------------------------------------------------------
  # ● 进行控制符的事前变换
  #    在实际绘制前、将控制符替换为实际的内容。
  #    为了减少歧异,文字「\」会被首先替换为转义符(\e)。
  #--------------------------------------------------------------------------
  alias ca_convert_escape_characters convert_escape_characters
  def convert_escape_characters(text)
    return ca_convert_escape_characters(text) unless USE_CUSTOM_CONVERT
    #------------------------------------------------------------------------
    # 默认部分
    #------------------------------------------------------------------------
    result = text.to_s.clone
    result.gsub!(/\\/)            { "\e" }
    result.gsub!(/\e\e/)          { "\\" }
    result.gsub!(/\eV\[(\d+)\]/i) { $game_variables[$1.to_i] }
    result.gsub!(/\eV\[(\d+)\]/i) { $game_variables[$1.to_i] }
    result.gsub!(/\eN\[(\d+)\]/i) { actor_name($1.to_i) }
    result.gsub!(/\eP\[(\d+)\]/i) { party_member_name($1.to_i) }
    result.gsub!(/\eG/i)          { Vocab::currency_unit }
    #------------------------------------------------------------------------
    # 自定义的实现
    #------------------------------------------------------------------------
    SIMPLE_CONVERT.each{|key,value|
    re = sprintf(SIMPLE_CONVERT_BASE,key)
    result.gsub!(/#{re}/){eval(value)}
    }
    ARRAY_CONVERT.each{|key,value|
    re = sprintf(ARRAY_CONVERT_BASE,key)
    result.gsub!(/#{re}/){eval(value)}
    }
    #------------------------------------------------------------------------
    result
  end
end[/pre]
[/fold]

评分

参与人数 9星屑 +1000 赞 +1 收起 理由
NextAustin7 + 1 精品文章
Fakmab + 15 无图啊…………
喵呜喵5 + 120 赤裸裸的要糖www
3106345123 + 10 塞糖
taroxd + 40 塞糖
fux2 + 300 塞糖
芙蕾娅 + 320 糖
冰蓝的马甲 + 15 moy酱~
kakarot + 180 糖

查看全部评分

Brandnew day, Brandnew Life
                             规 实在  中
暂为素材区版主,版其  琢磨
应援一下~
RPG制作大师授权素材推广计划

星君

梦石
0
星屑
83
在线时间
2980 小时
注册时间
2011-10-9
回帖
2234

贵宾短篇七萝莉正太组冠军

发表于 2014-6-6 02:41:09 | 显示全部楼层
moy前辈最近好活跃啊
顺便中间的那些#encoding:utf-8对强迫症来说很伤眼(/゚Д゚)/

点评

moy
最近在填坑嘛,所以时常逛逛,我发布这个决不是为了CA的预热!(  发表于 2014-6-6 02:48
moy
自己手动删除吧233,复制格式时的残留物,其实大部分情况都不用管编码,我就是懒得改了← ←  发表于 2014-6-6 02:44

回复

使用道具 举报

夜天の主

梦石
0
星屑
136
在线时间
1553 小时
注册时间
2008-4-13
回帖
2301

开拓者第4届短篇游戏比赛亚军

发表于 2014-6-6 07:22:52 | 显示全部楼层
子曾经曰过:好读书,毁人不倦
所以要不要把A君的历法脚本发出来害人


既然预热了就不要油库里地快填坑哦!不能油库里的馍胖不是好油库里哦!(乃到底是要还是不要油库里啊喂!
总之召唤一只严酷的监工指定馍胖为目标~(啥

点评

moy
请鞭笞我吧!(白目  发表于 2014-6-6 08:12
回复

使用道具 举报

老黄鸡

梦石
4
星屑
45692
在线时间
7947 小时
注册时间
2009-7-6
回帖
13335

MZ评测员RM创作大赛01组委会开拓者贵宾

发表于 2014-6-6 18:05:04 | 显示全部楼层
唔,number的问题有点恼人,我把number用户删了,然后帮moy酱编辑了一下

点评

moy
哦哦,3Q~,另外如果有什么意见就提233  发表于 2014-6-6 18:06
RGDirect - DirectX驱动的RGSS,点我了解.
(排满,暂停)RM全系列成套系统定制请联系QQ1213237796
不接受对其他插件维护的委托
回复

使用道具 举报

孤独守望

梦石
0
星屑
3144
在线时间
1535 小时
注册时间
2006-10-16
回帖
4223

开拓者贵宾

发表于 2014-6-7 12:42:40 | 显示全部楼层
怎样避免强迫症发作:
第一行顶行
#encoding:utf-8
=>
# I want to say here can be any thing that you want to write but anyway end by this word named encoding: utf-8

评分

参与人数 1星屑 +8 收起 理由
moy + 8 233!

查看全部评分

菩提本非树,明镜本非台。回头自望路漫漫。不求姻缘,但求再见。
本来无一物,何处惹尘埃。风打浪吹雨不来。荒庭遍野,扶摇难接。
不知道多久更新一次的博客
回复

使用道具 举报

头像被屏蔽
梦石
0
星屑
653
在线时间
3774 小时
注册时间
2011-2-26
回帖
1577

开拓者

发表于 2014-6-7 13:31:05 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复

使用道具 举报

梦石
0
星屑
86
在线时间
362 小时
注册时间
2013-12-8
回帖
420
发表于 2014-6-10 20:09:01 | 显示全部楼层
moy前辈,能否讲解一下战斗日志是有啥用来着?
手头没有RM抱歉了………………
柍念作yang三声。

龙→
回复

使用道具 举报

无节操

梦石
0
星屑
608
在线时间
795 小时
注册时间
2009-2-6
回帖
3910

开拓者贵宾

 楼主| 发表于 2014-6-10 20:22:02 | 显示全部楼层
柍若 发表于 2014-6-10 20:09
moy前辈,能否讲解一下战斗日志是有啥用来着?
手头没有RM抱歉了……………… ...

那个啊,就是VA默认战斗中会在左上角飘的战斗信息,如果没有用一些伤害popup什么的,伤害啊状态啊行动时的提示什么的都在那里。
因为通常没法直接往里添加信息,我为了配合一些用公共事件完成的功能(具体到我自己的话,是敌人使用的盗取金钱技能),所以弄了一个这个。这样在公共事件中直接使用的话,就是在左上角显示“被盗取XXX金币”之类的效果,而不是使用“显示文字”功能来显示。
总的来说是一个应用面比较狭窄的脚本,但是对于一些特定的用户来说似乎意外的会有用,因此也一并发布出来了。

点评

咦,这样啊,原来那个叫战斗日志_(:з」∠)_谢谢前辈耐心解答!!⊙▽⊙  发表于 2014-6-11 19:54
Brandnew day, Brandnew Life
                             规 实在  中
暂为素材区版主,版其  琢磨
应援一下~
RPG制作大师授权素材推广计划
回复

使用道具 举报

梦石
0
星屑
50
在线时间
492 小时
注册时间
2013-6-15
回帖
164
发表于 2014-6-12 12:47:29 | 显示全部楼层
好物!中考后再详细研究,先给个赞
回复

使用道具 举报

…あたしは天

梦石
0
星屑
2308
在线时间
4033 小时
注册时间
2010-10-4
回帖
10548

开拓者贵宾

发表于 2014-6-19 07:09:51 | 显示全部楼层
本帖最后由 taroxd 于 2014-6-19 07:46 编辑

关于“踩踏/置物判断"
判断是否被主角踩踏/判断是否被事件踩踏的方法,为什么要传入参数x, y?如果要传入,那么放在Game_Interpreter似乎更合适

然后我偷偷地抄袭到了这里(暂时在2L,没环境的痛苦……):https://rpg.blue/forum.php?mod=viewthread&tid=365976  
回复

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部