Project1

标题: 基础设置(将这个脚本放于插件脚本的最上方) [打印本页]

作者: taroxd    时间: 2014-5-21 15:26
标题: 基础设置(将这个脚本放于插件脚本的最上方)
本帖最后由 taroxd 于 2015-2-7 16:51 编辑

这个脚本十分重要,请务必放在本群组其他所有脚本的上方。
并且,我建议你将这个脚本放在所有插件脚本的最上方。



RUBY 代码复制
  1. #----------------------------------------------------------------------------
  2. # ● Taroxd 基础设置
  3. #    定义了一些经常会用到的方法。
  4. #----------------------------------------------------------------------------
  5. #
  6. # 模块或类
  7. #   方法名(参数) { block } / 别名 -> 返回值的类型或介绍
  8. #     方法的介绍。
  9. #     如果返回值没有给出,表明返回值无意义或没有确定的类型。
  10. #
  11. # Module
  12. #   get_access_control(method_name) -> Symbol or nil
  13. #     获取方法的访问控制。返回 :public, :protected, :private 或 nil(未定义)
  14. #     method_name 为字符串或符号(Symbol),下同。
  15. #
  16. #   def_after(method_name) { |args| block } -> method_name
  17. #   def_after(method_name, hook) -> method_name
  18. #     重定义方法 method_name。
  19. #     第一种形式中,将 block 定义为方法,在原方法之后调用。
  20. #     第二种形式中,
  21. #     * 如果 hook 为符号或字符串,那么会在原方法之后调用对应的方法。
  22. #     * 如果 hook 可以响应方法 call,那么会在原方法之后调用 call。
  23. #     * 如果 hook 是 UnboundMethod,那么会将 hook 绑定到对象后调用。
  24. #
  25. #     不改变原方法的返回值和访问控制。
  26. #     无论哪种调用,参数都和原来的参数相同。
  27. #     以下 def_* 的所有方法均有这两种形式。为了方便起见只写出第一种。
  28. #
  29. #     例:
  30. #     class Game_Actor < Game_Battler
  31. #       def_after :initialize do |actor_id|
  32. #         @my_attribute = actor_id
  33. #       end
  34. #     end
  35. #
  36. #   def_after!(method_name) { |args| block } -> method_name
  37. #     与 def_after 类似,但改变原方法的返回值。
  38. #
  39. #   def_before(method_name) { |args| block } -> method_name
  40. #     与 def_after 类似,但在原方法之前调用。
  41. #
  42. #   def_with(method_name) { |old, args| block } -> method_name
  43. #     与 def_after! 类似,但参数不同。old 参数原方法的返回值。
  44. #
  45. #   def_chain(method_name) { |old, args| block } -> method_name
  46. #     与 def_with 类似,但 old 参数为对应原方法的一个 Method 对象。
  47. #
  48. #   def_and(method_name) { |args| block } -> method_name
  49. #     与 def_after 类似,但仅当原方法的返回值为真时调用。
  50. #     仅当原方法的返回值为真时,才会改变原方法的返回值。
  51. #
  52. #   def_or(method_name) { |args| block } -> method_name
  53. #     与 def_after 类似,但仅当原方法的返回值为伪时调用。
  54. #     仅当原方法的返回值为假时,才会改变原方法的返回值。
  55. #
  56. #   def_if(method_name) { |args| block } -> method_name
  57. #     与 def_before 类似,但仅当调用结果为真时调用原方法。
  58. #     仅当调用的结果为假时,改变原方法的返回值为 nil。
  59. #
  60. #   def_unless(method_name) { |args| block } -> method_name
  61. #     与 def_before 类似,但仅当调用结果为假时调用原方法。
  62. #     仅当调用的结果为真时,改变原方法的返回值为 nil。
  63. #
  64. # Taroxd::ReadNote
  65. #   该模块由以下类 extend。
  66. #   RPG::BaseItem
  67. #   RPG::Map
  68. #   RPG::Event(将事件名称作为备注)
  69. #   RPG::Tileset
  70. #   RPG::Class::Learning
  71. #
  72. #   note_i(method_name, default = 0)
  73. #     定义方法 method_name,读取备注中 <method_name x> 形式的内容。其中 x 为整数。
  74. #     读取到的话,定义的方法会返回读取到的整数值,否则返回 default。
  75. #
  76. #   例:RPG::UsableItem.note_i :item_cost
  77. #
  78. #   note_f(method_name, default = 0.0)
  79. #     与 note_i 类似,但读取的是实数。
  80. #
  81. #   note_s(method_name, default = '')
  82. #     与 note_i 类似,但读取的是字符串。
  83. #
  84. #   note_bool(method_name)
  85. #     定义 method_name 方法,判断备注中是否存在 <method_name> 子字符串。
  86. #     特别地,若 method_name 以问号或感叹号结尾,读取内容中不需要包含问号、感叹号。
  87. #     (上面几个方法也是一样)
  88. #
  89. # Taroxd::DisposeBitmap
  90. #   dispose
  91. #     释放位图后调用父类的 dispose 方法。
  92. #
  93. # Spriteset_Map / Spriteset_Battle
  94. #   self.use_sprite(SpriteClass)
  95. #   self.use_sprite(SpriteClass) { block }
  96. #     在 Spriteset 中使用一个 SpriteClass 的精灵。
  97. #     如果给出 block,则生成精灵使用的参数是 block 在 Spriteset 的上下文中执行后的返回值。
  98. #     自动管理精灵的生成、更新、释放。
  99. #
  100. #    例:Spriteset_Map.use_sprite(Sprite_OnMap) { @viewport1 }
  101. #
  102. # Fixnum
  103. #   id -> self
  104. #     返回 self。这使得之后一些方法的参数既可以用数据库的数据,也可以用整数。
  105. #
  106. # Enumerable
  107. #   sum(base = 0) { |element| block }
  108. #     对所有元素 yield 后求和。base 为初始值。
  109. #     没有 block 参数时,对所有元素求和。
  110. #
  111. #   例:
  112. #   class Game_Unit
  113. #     def tgr_sum
  114. #       alive_members.sum(&:tgr)
  115. #     end
  116. #   end
  117. #
  118. #   pi(base = 1) { |element| block }
  119. #     与 sum 类似,但对所有元素求积。
  120. #
  121. # Game_BaseItem
  122. #   id / item_id -> Fixnum
  123. #     返回物品 id。
  124. #
  125. # Game_BattlerBase
  126. #   mtp -> Numeric
  127. #     返回 max_tp。
  128. #
  129. #   initialized? -> true
  130. #     返回 true。
  131. #
  132. # Game_Battler
  133. #   note_objects -> Enumerator
  134. #   note_objects { |obj| ... } -> self
  135. #     迭代战斗者拥有的所有带有备注的对象。
  136. #    (角色、职业、装备、技能、敌人、状态等)
  137. #     没有 block 给出时,返回 Enumerator 对象。
  138. #
  139. #   note -> String
  140. #     返回数据库对象的备注。
  141. #
  142. #   equips / weapons / armors -> []
  143. #     返回空数组。
  144. #
  145. #   skill?(skill) -> true / false
  146. #     判断是否拥有技能。skill 可以为技能 ID,也可以为 RPG::Skill 的实例。
  147. #
  148. #   skill_learn?(skill) -> true / false
  149. #     判断是否习得技能。skill 可以为技能 ID,也可以为 RPG::Skill 的实例。
  150. #
  151. # Game_Actor
  152. #   data_object -> RPG::Actor
  153. #     返回数据库对象,等价于 actor。
  154. #
  155. #   weapon?(item) / armor?(item) -> true / false
  156. #     检测是否装备对应的物品。item 可以为装备 ID,也可以为 RPG::EquipItem 的实例。
  157. #
  158. #   initialized? -> true / false
  159. #     判断角色是否已经初始化。
  160. #
  161. # Game_Enemy
  162. #   id -> Fixnum
  163. #     返回敌人 id。
  164. #
  165. #   data_object -> RPG::Enemy
  166. #     返回数据库对象,等价于 enemy。
  167. #
  168. #   skills -> Array
  169. #     返回敌人的所有技能实例的数组。
  170. #     skill? 方法判断是否拥有技能与该数组有关。
  171. #
  172. #   basic_skills -> Array
  173. #     返回敌人行动列表中的技能 ID 的数组(元素可以重复)。
  174. #     skill_learn? 方法判断是否学会技能与该数组有关。
  175. #
  176. # Game_Actors
  177. #   include Enumerable
  178. #
  179. #   each -> Enumerator
  180. #   each { |actor| block } -> self
  181. #     迭代已经初始化的每个角色。
  182. #     如果没有给出 block,返回一个 Enumerator 对象。
  183. #
  184. #   include?(actor)
  185. #     角色是否已经初始化。actor 可以为 Game_Actor / RPG::Actor 的对象或 ID。
  186. #
  187. # Game_Unit
  188. #   include Enumerable
  189. #
  190. #   each -> Enumerator
  191. #   each { |battler| block } -> self
  192. #     迭代队伍中的每个成员。
  193. #     如果没有给出 block,返回一个 Enumerator 对象。
  194. #     等价于 members.each。
  195. #
  196. #   each_member -> Enumerator / self
  197. #     each 的别名。
  198. #
  199. #   self[*args] / slice(*args) -> Game_Actor / Array / nil
  200. #     等价于 members[*args]
  201. #
  202. #   empty? -> true / false
  203. #     判断队伍是否为空。
  204. #
  205. #   size / length -> Integer
  206. #     返回队伍人数。
  207. #
  208. # Game_Party
  209. #   include?(actor) -> true / false
  210. #     队伍中是否存在角色。actor 可以为 Game_Actor / RPG::Actor 的对象或 ID。
  211. #
  212. # Game_Map
  213. #   id -> Fixnum
  214. #     返回地图 ID。
  215. #
  216. #   data_object -> RPG::Map
  217. #     返回数据库对象。
  218. #
  219. #   note -> String
  220. #     返回备注内容。
  221. #
  222. # Game_CharacterBase
  223. #   same_pos?(character) -> true / false
  224. #     判定是否处在相同位置。
  225. #     character 是任意能够响应方法 x 和 y 的对象。
  226. #     仅作为点(x, y)进行比较,不考虑 Game_Vehicle 的地图 ID 等问题。
  227. #
  228. #-----------------------------------------------------------------------------
  229.  
  230. module Taroxd end
  231.  
  232. module Taroxd::Def
  233.  
  234.   Singleton = Module.new { Object.send :include, self }
  235.   Module.send :include, self
  236.  
  237.   def get_access_control(sym)
  238.     return :public    if public_method_defined?    sym
  239.     return :protected if protected_method_defined? sym
  240.     return :private   if private_method_defined?   sym
  241.     nil
  242.   end
  243.  
  244.   template = lambda do |singleton|
  245.     if singleton
  246.       klass = 'singleton_class'
  247.       get_method = 'method'
  248.       define = 'define_singleton_method'
  249.     else
  250.       klass = 'self'
  251.       get_method = 'instance_method'
  252.       define = 'define_method'
  253.     end
  254.     %(
  255.       def <name>(sym, hook = nil, &b)
  256.         access = #{klass}.get_access_control sym
  257.         old = #{get_method} sym
  258.         if b
  259.           #{define} sym, &b
  260.           hook = #{get_method} sym
  261.         end
  262.         if hook.respond_to? :to_sym
  263.           hook = hook.to_sym
  264.           #{define} sym do |*args, &block|
  265.             <pattern_sym>
  266.           end
  267.         elsif hook.respond_to? :call
  268.           #{define} sym do |*args, &block|
  269.             <pattern_call>
  270.           end
  271.         elsif hook.kind_of? UnboundMethod
  272.           #{define} sym do |*args, &block|
  273.             <pattern_unbound>
  274.           end
  275.         end
  276.         #{klass}.send access, sym
  277.         sym
  278.       end
  279.     )
  280.   end
  281.  
  282.   # 保存模板和替换 'hook(' 字符串的字符
  283.   template = {false => template.call(false), true => template.call(true)}
  284.  
  285.   # 替换掉 pattern 中的语法
  286.   gsub_pattern = lambda do |pattern, singleton|
  287.     old = singleton ? 'old' : 'old.bind(self)'
  288.     pattern.gsub('*', '*args, &block')
  289.            .gsub(/old(\()?/) { $1 ? "#{old}.call(" : old }
  290.   end
  291.  
  292.   # 存入代替 "hook(" 的字符串
  293.   template['sym']     = '__send__(hook, '
  294.   template['call']    = 'hook.call('
  295.   template['unbound'] = 'hook.bind(self).call('
  296.  
  297.   # 获取定义方法内容的字符串
  298.   # 得到的代码较长,请输出查看
  299.   code = lambda do |name, pattern, singleton|
  300.     pattern = gsub_pattern.call(pattern, singleton)
  301.     template[singleton]
  302.       .sub('<name>', name)
  303.       .gsub(/<pattern_(\w+?)>/) { pattern.gsub('hook(', template[$1]) }
  304.   end
  305.  
  306.   main = TOPLEVEL_BINDING.eval('self')
  307.  
  308.   # 定义 def_ 系列方法的方法
  309.   define_singleton_method :def_ do |name, pattern|
  310.     name = "#{__method__}#{name}"
  311.     module_eval code.call(name, pattern, false)
  312.     Singleton.module_eval code.call("singleton_#{name}", pattern, true)
  313.     main.define_singleton_method name, &Kernel.method(name)
  314.   end
  315.  
  316.   # 实际定义 def_ 系列的方法
  317.   def_ :after,  'ret = old(*); hook(*); ret'
  318.   def_ :after!, 'old(*); hook(*)'
  319.   def_ :before, 'hook(*); old(*)'
  320.   def_ :with,   'hook(old(*), *)'
  321.   def_ :chain,  'hook(old, *)'
  322.   def_ :and,    'old(*) && hook(*)'
  323.   def_ :or,     'old(*) || hook(*)'
  324.   def_ :if,     'old(*) if hook(*)'
  325.   def_ :unless, 'old(*) unless hook(*)'
  326. end
  327.  
  328. module Taroxd::ReadNote
  329.  
  330.   include RPG
  331.   BaseItem.extend        self
  332.   Map.extend             self
  333.   Event.extend           self
  334.   Tileset.extend         self
  335.   Class::Learning.extend self
  336.  
  337.   # 获取 note 的方法
  338.   def note_method
  339.     :note
  340.   end
  341.  
  342.   # 事件名称作为备注
  343.   def Event.note_method
  344.     :name
  345.   end
  346.  
  347.   # 备注模板
  348.   def note_any(name, default, re, capture)
  349.     name = name.to_s
  350.     mark = name.slice!(/[?!]\Z/)
  351.     re = re.source if re.kind_of?(Regexp)
  352.     re = "/<#{name.gsub('_', '\s*')}#{re}>/i"
  353.     default = default.inspect
  354.     class_eval %{
  355.       def #{name}
  356.         return @#{name} if instance_variable_defined? :@#{name}
  357.         @#{name} = #{note_method} =~ #{re} ? (#{capture}) : (#{default})
  358.       end
  359.     }, __FILE__, __LINE__
  360.     alias_method name + mark, name if mark
  361.   end
  362.  
  363.   def note_i(name, default = 0)
  364.     note_any(name, default, '\s*(-?\d+)', '$1.to_i')
  365.   end
  366.  
  367.   def note_f(name, default = 0.0)
  368.     note_any(name, default, '\s*(-?\d+(?:\.\d+)?)', '$1.to_f')
  369.   end
  370.  
  371.   def note_s(name, default = '')
  372.     note_any(name, default, '\s*(\S.*)', '$1')
  373.   end
  374.  
  375.   def note_bool(name)
  376.     note_any(name, false, '', 'true')
  377.   end
  378. end
  379.  
  380. module Taroxd::DisposeBitmap
  381.   def dispose
  382.     bitmap.dispose if bitmap
  383.     super
  384.   end
  385. end
  386.  
  387. module Taroxd::SpritesetDSL
  388.  
  389.   # 方法名
  390.   CREATE_METHOD_NAME  = :create_taroxd_sprites
  391.   UPDATE_METHOD_NAME  = :update_taroxd_sprites
  392.   DISPOSE_METHOD_NAME = :dispose_taroxd_sprites
  393.  
  394.   # 定义管理精灵的方法
  395.   def self.extended(klass)
  396.     klass.class_eval do
  397.       sprites = nil
  398.  
  399.       define_method CREATE_METHOD_NAME do
  400.         sprites = klass.sprite_list.map do |sprite_class, get_args|
  401.           if get_args
  402.             sprite_class.new(*instance_eval(&get_args))
  403.           else
  404.             sprite_class.new
  405.           end
  406.         end
  407.       end
  408.  
  409.       define_method(UPDATE_METHOD_NAME)  { sprites.each(&:update)  }
  410.       define_method(DISPOSE_METHOD_NAME) { sprites.each(&:dispose) }
  411.     end
  412.   end
  413.  
  414.   def use_sprite(klass, &get_args)
  415.     sprite_list.push [klass, get_args]
  416.   end
  417.  
  418.   def sprite_list
  419.     @_taroxd_use_sprite ||= []
  420.   end
  421.  
  422.   # 在一系列方法上触发钩子
  423.   def sprite_method_hook(name)
  424.     def_after :"create_#{name}",  CREATE_METHOD_NAME
  425.     def_after :"update_#{name}",  UPDATE_METHOD_NAME
  426.     def_after :"dispose_#{name}", DISPOSE_METHOD_NAME
  427.   end
  428. end
  429.  
  430. class Fixnum < Integer
  431.   alias_method :id, :to_int
  432. end
  433.  
  434. module Enumerable
  435.   def sum(base = 0)
  436.     block_given? ? inject(base) { |a, e| a + yield(e) } : inject(base, :+)
  437.   end
  438.  
  439.   def pi(base = 1)
  440.     block_given? ? inject(base) { |a, e| a * yield(e) } : inject(base, :*)
  441.   end
  442. end
  443.  
  444. class Game_BaseItem
  445.   attr_reader :item_id
  446.   alias_method :id, :item_id
  447. end
  448.  
  449. class Game_BattlerBase
  450.  
  451.   def initialized?
  452.     true
  453.   end
  454.  
  455.   def mtp
  456.     max_tp
  457.   end
  458. end
  459.  
  460. class Game_Battler < Game_BattlerBase
  461.  
  462.   # 迭代拥有备注的对象
  463.   def note_objects
  464.     return to_enum(__method__) unless block_given?
  465.     states.each { |e| yield e }
  466.     equips.each { |e| yield e if e }
  467.     skills.each { |e| yield e }
  468.     yield data_object
  469.     yield self.class if actor?
  470.   end
  471.  
  472.   def regenerate_tp
  473.     self.tp += max_tp * trg
  474.   end
  475.  
  476.   def data_object
  477.     raise NotImplementedError
  478.   end
  479.  
  480.   def note
  481.     data_object.note
  482.   end
  483.  
  484.   def id
  485.     data_object.id
  486.   end
  487.  
  488.   def skills
  489.     (basic_skills | added_skills).sort.map { |id| $data_skills[id] }
  490.   end
  491.  
  492.   def equips
  493.     []
  494.   end
  495.   alias_method :weapons, :equips
  496.   alias_method :armors,  :equips
  497.   alias_method :basic_skills, :equips
  498.  
  499.   def skill?(skill)
  500.     basic_skills.include?(skill.id) || added_skills.include?(skill.id)
  501.   end
  502.  
  503.   def skill_learn?(skill)
  504.     basic_skills.include?(skill.id)
  505.   end
  506. end
  507.  
  508. class Game_Actor < Game_Battler
  509.  
  510.   alias_method :data_object, :actor
  511.  
  512.   def weapon?(weapon)
  513.     @equips.any? { |item| item.id == weapon.id && item.is_weapon? }
  514.   end
  515.  
  516.   def armor?(armor)
  517.     @equips.any? { |item| item.id == armor.id && item.is_armor? }
  518.   end
  519.  
  520.   def initialized?
  521.     $game_actors.include?(self)
  522.   end
  523.  
  524.   private
  525.  
  526.   def basic_skills
  527.     @skills
  528.   end
  529. end
  530.  
  531. class Game_Enemy < Game_Battler
  532.  
  533.   alias_method :data_object, :enemy
  534.   alias_method :id, :enemy_id
  535.  
  536.   def basic_skills
  537.     enemy.actions.map(&:skill_id)
  538.   end
  539. end
  540.  
  541. class Game_Actors
  542.  
  543.   include Enumerable
  544.  
  545.   def each
  546.     return to_enum(__method__) unless block_given?
  547.     @data.each { |actor| yield actor if actor }
  548.     self
  549.   end
  550.  
  551.   def include?(actor)
  552.     @data[actor.id]
  553.   end
  554. end
  555.  
  556. class Game_Unit
  557.  
  558.   include Enumerable
  559.  
  560.   def to_a
  561.     members
  562.   end
  563.  
  564.   def each
  565.     return to_enum(__method__) unless block_given?
  566.     members.each { |battler| yield battler }
  567.     self
  568.   end
  569.   alias_method :each_member, :each
  570.  
  571.   def [](*args)
  572.     members[*args]
  573.   end
  574.   alias_method :slice, :[]
  575.  
  576.   def empty?
  577.     members.empty?
  578.   end
  579.  
  580.   def size
  581.     members.size
  582.   end
  583.   alias_method :length, :size
  584. end
  585.  
  586. class Game_Party < Game_Unit
  587.   def include?(actor)
  588.     @actors.include?(actor.id)
  589.   end
  590. end
  591.  
  592. class Game_Map
  593.  
  594.   alias_method :id, :map_id
  595.  
  596.   def data_object
  597.     @map
  598.   end
  599.  
  600.   def note
  601.     @map.note
  602.   end
  603. end
  604.  
  605. class Game_CharacterBase
  606.   def same_pos?(character)
  607.     @x == character.x && @y == character.y
  608.   end
  609. end
  610.  
  611. class Spriteset_Map
  612.   extend Taroxd::SpritesetDSL
  613.   sprite_method_hook :timer
  614. end
  615.  
  616. class Spriteset_Battle
  617.   extend Taroxd::SpritesetDSL
  618.   sprite_method_hook :timer
  619. end
                                                            
作者: 狂乱月眼    时间: 2015-4-19 18:56
不行,如果技能卸下后效果依旧存在。
作者: aaa8625216    时间: 2017-4-20 23:53
289行错误




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1