Project1

标题: 多路线系统 [打印本页]

作者: taroxd    时间: 2014-6-20 15:40
标题: 多路线系统
本帖最后由 taroxd 于 2015-1-17 16:31 编辑

@d
RUBY 代码复制
  1. #------------------------------------------------------
  2. # ● require Taroxd基础设置,全局变量存档
  3. #------------------------------------------------------
  4. #
  5. #  一条路线,包括玩家位置,队伍成员,持有物品等。
  6. #  游戏中的变量和开关是所有路线共有的。
  7. #  该脚本可以进行路线的切换。
  8. #  游戏开始时,路线 id 为 0。
  9. #
  10. #  进入空路线时,队伍无成员,不持有任何物品。玩家的位置不变。
  11. #  建议用以下方式来初始化一条路线:
  12. #  淡出画面 - Route.current.id = id - 初始化路线 - 淡入画面
  13. #
  14. #  -- 用法 -- 在事件脚本中输入 --
  15. #    Route.current.id:获取当前路线的 id。
  16. #    Route.current.id = id:
  17. #      切换到第 id 号路线,无淡入淡出效果。
  18. #    set_route(id):
  19. #      切换到第 id 号路线,有淡入淡出效果。
  20. #    merge_route(id):将第 id 号路线合并入当前路线,并清除第 id 号路线。
  21. #    Route.current.clear(id):清除第 id 号路线。
  22. #------------------------------------------------------
  23.  
  24. # 路线类,保存了路线 id 和数据。该类的实例会存入存档。
  25. class Taroxd::Route
  26.  
  27.   # 数据
  28.   class Contents
  29.  
  30.     attr_reader :party, :map_id, :x, :y, :d
  31.  
  32.     def initialize
  33.       @party = $game_party
  34.       @map_id = $game_map.map_id
  35.       @x = $game_player.x
  36.       @y = $game_player.y
  37.       @d = $game_player.direction
  38.     end
  39.  
  40.     def restore
  41.       $game_party = @party
  42.       $game_player.reserve_transfer(@map_id, @x, @y, @d)
  43.     end
  44.   end
  45.  
  46.   class << self
  47.     def new
  48.       Taroxd::Global[:route] ||= super
  49.     end
  50.  
  51.     alias_method :current, :new
  52.  
  53.   end
  54.  
  55.   attr_reader :id
  56.  
  57.   def initialize
  58.     @id = 0
  59.     @data = []   # Contents 实例的数组
  60.   end
  61.  
  62.   def id=(id)
  63.     return if @id == id
  64.     @data[@id] = Contents.new
  65.     @id = id
  66.     contents = @data[id]
  67.     contents ? contents.restore : init_route
  68.   end
  69.  
  70.   # 合并路线
  71.   def <<(id)
  72.     if @id != id && @data[id]
  73.       $game_party.merge_party(@data[id].party)
  74.       clear(id)
  75.     end
  76.     self
  77.   end
  78.  
  79.   def clear(id = nil)
  80.     id ? @data[id] = nil : @data.clear
  81.   end
  82.  
  83.   private
  84.  
  85.   # 进入一条新路线时执行的内容
  86.   def init_route
  87.     $game_party = Game_Party.new
  88.   end
  89. end
  90.  
  91. class Game_Interpreter
  92.  
  93.   Route = Taroxd::Route
  94.  
  95.   # 设置路线
  96.   def set_route(id)
  97.     return if $game_party.in_battle
  98.     command_221           # 淡出画面
  99.     Route.current.id = id
  100.     Fiber.yield while $game_player.transfer?
  101.     command_222           # 淡入画面
  102.   end
  103.  
  104.   # 合并路线
  105.   def merge_route(id)
  106.     Route.current << id
  107.     $game_player.refresh
  108.     $game_map.need_refresh = true
  109.   end
  110. end
  111.  
  112. class Game_Party < Game_Unit
  113.  
  114.   # 合并金钱、角色、物品
  115.   def merge_party(other)
  116.     gold, actors, items, weapons, armors = other.merge_contents
  117.     gain_gold(gold)
  118.     @actors |= actors
  119.     merge_item @items,   items,   $data_items
  120.     merge_item @weapons, weapons, $data_weapons
  121.     merge_item @armors,  armors,  $data_armors
  122.   end
  123.  
  124.   protected
  125.  
  126.   def merge_contents
  127.     [@gold, @actors, @items, @weapons, @armors]
  128.   end
  129.  
  130.   private
  131.  
  132.   def merge_item(to, from, database)
  133.     to.merge!(from) do |id, v1, v2|
  134.       [v1 + v2, max_item_number(database[id])].min
  135.     end
  136.   end
  137. end
   




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