设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 383|回复: 0
打印 上一主题 下一主题

[原创发布] 仿《 DELTARUNE》战斗物品动态字幕评价脚本

[复制链接]

Lv3.寻梦者

梦石
1
星屑
1174
在线时间
58 小时
注册时间
2023-9-8
帖子
35
跳转到指定楼层
1
发表于 2026-4-22 00:27:27 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

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

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

x
RUBY 代码复制
  1. #==============================================================================
  2. # ■ 仿《德尔塔符文》战斗物品动态字幕评价
  3. #==============================================================================
  4. # 作者:瑞吉
  5. # 标签说明:
  6. #   单人:<C:角色ID, I:台词>
  7. #   双人:<C:使用者ID P:队友ID CI:使用者台词 PI:队友台词>
  8. #   多人:<M:使用者ID | US:使用者台词 | 队友ID1:台词1 | 队友ID2:台词2 | ...>
  9. # 适用范围:物品、技能
  10. #==============================================================================
  11.  
  12. module DataManager
  13.   class << self
  14.     alias load_database_subtitle_final load_database
  15.   end
  16.  
  17.   def self.load_database
  18.     load_database_subtitle_final
  19.     load_notetags_subtitle_final
  20.   end
  21.  
  22.   def self.load_notetags_subtitle_final
  23.     [$data_skills, $data_items, $data_weapons, $data_armors].each do |group|
  24.       group.each do |obj|
  25.         next if obj.nil?
  26.         obj.load_notetag_subtitle_final if obj.respond_to?(:load_notetag_subtitle_final)
  27.       end
  28.     end
  29.   end
  30. end
  31.  
  32. #==============================================================================
  33. # ■ RPG::BaseItem
  34. #==============================================================================
  35.  
  36. class RPG::BaseItem
  37.   attr_accessor :subtitle_map        # 单人
  38.   attr_accessor :subtitle_pair_map   # 双人
  39.   attr_accessor :multi_subtitle_map  # 多人 { user_id => { user_speech: 台词, targets: { target_id => 台词 } } }
  40.  
  41.   def load_notetag_subtitle_final
  42.     @subtitle_map = {}
  43.     @subtitle_pair_map = {}
  44.     @multi_subtitle_map = {}
  45.  
  46.     # 单人 <C:数字, I:台词>
  47.     self.note.scan(/<C:\s*(\d+)\s*[,,]\s*I:\s*(.+?)\s*>/i) do |match|
  48.       @subtitle_map[match[0].to_i] = match[1].to_s
  49.     end
  50.  
  51.     # 双人 <C:使用者ID P:队友ID CI:台词 PI:台词>
  52.     self.note.scan(/<C:\s*(\d+)\s*P:\s*(\d+)\s*CI:\s*(.+?)\s*PI:\s*(.+?)\s*>/i) do |match|
  53.       @subtitle_pair_map[[match[0].to_i, match[1].to_i]] = {
  54.         ci: match[2].to_s,
  55.         pi: match[3].to_s
  56.       }
  57.     end
  58.  
  59.     # 多人 <M:使用者ID | US:使用者台词 | 队友ID:台词 | ...>
  60.     self.note.scan(/<M:\s*(\d+)\s*\|\s*(.+?)\s*>/i) do |match|
  61.       user_id = match[0].to_i
  62.       content = match[1].to_s
  63.       target_map = {}
  64.       user_speech = nil
  65.  
  66.       content.split('|').each do |part|
  67.         part = part.strip
  68.         if part =~ /^US\s*:\s*(.+)/i
  69.           user_speech = $1.to_s.strip
  70.         elsif part =~ /^(\d+)\s*:\s*(.+)/i
  71.           target_map[$1.to_i] = $2.to_s.strip
  72.         end
  73.       end
  74.  
  75.       @multi_subtitle_map[user_id] = {
  76.         user_speech: user_speech,
  77.         targets: target_map
  78.       }
  79.     end
  80.   end
  81.  
  82.   def subtitle_for(actor_id)
  83.     return @subtitle_map[actor_id] if @subtitle_map.key?(actor_id)
  84.     return @subtitle_map[0] if @subtitle_map.key?(0)
  85.     nil
  86.   end
  87.  
  88.   def pair_subtitle_for(user_id, target_id)
  89.     @subtitle_pair_map[[user_id, target_id]]
  90.   end
  91.  
  92.   def multi_subtitle_for(user_id)
  93.     @multi_subtitle_map[user_id]
  94.   end
  95. end
  96.  
  97. #==============================================================================
  98. # ■ Scene_Battle
  99. #==============================================================================
  100.  
  101. class Scene_Battle < Scene_Base
  102.   alias use_item_subtitle_final use_item
  103.  
  104.   def use_item
  105.     @last_used_item = @subject.current_action.item
  106.     @last_user = @subject
  107.     @last_targets = @subject.current_action.make_targets.compact
  108.  
  109.     use_item_subtitle_final
  110.  
  111.     show_subtitle_final if should_show_subtitle_final?
  112.   end
  113.  
  114.   def should_show_subtitle_final?
  115.     return false unless @last_used_item.is_a?(RPG::UsableItem)
  116.     return false unless @last_used_item.respond_to?(:subtitle_for)
  117.  
  118.     item = @last_used_item
  119.     user = @last_user
  120.  
  121.     multi = item.multi_subtitle_for(user.id)
  122.     if multi
  123.       targets = multi[:targets]
  124.       return true if @last_targets.any? { |t| t.is_a?(Game_Actor) && targets.key?(t.id) }
  125.       return true if multi[:user_speech] && !multi[:user_speech].empty?
  126.     end
  127.  
  128.     @last_targets.each do |t|
  129.       return true if t.is_a?(Game_Actor) && item.pair_subtitle_for(user.id, t.id)
  130.     end
  131.  
  132.     return true if item.subtitle_for(user.id)
  133.  
  134.     false
  135.   end
  136.  
  137.   def show_subtitle_final
  138.     item = @last_used_item
  139.     user = @last_user
  140.     return unless @log_window
  141.  
  142.     # 1. 多人评价
  143.     multi_data = item.multi_subtitle_for(user.id)
  144.     if multi_data
  145.       targets_map = multi_data[:targets]
  146.       user_speech = multi_data[:user_speech]
  147.  
  148.       # 使用者台词
  149.       if user_speech && !user_speech.empty?
  150.         user_name = $game_actors[user.id].name
  151.         @log_window.add_text("#{user_name}:#{user_speech}")
  152.         wait(30)
  153.       end
  154.  
  155.       # 队友台词
  156.       shown = false
  157.       @last_targets.each do |target|
  158.         next unless target.is_a?(Game_Actor)
  159.         text = targets_map[target.id]
  160.         next unless text
  161.         name = $game_actors[target.id].name
  162.         @log_window.add_text("#{name}:#{text}")
  163.         wait(20)
  164.         shown = true
  165.       end
  166.  
  167.       if shown || user_speech
  168.         wait(30)
  169.         return
  170.       end
  171.     end
  172.  
  173.     # 2. 双人评价
  174.     @last_targets.each do |target|
  175.       next unless target.is_a?(Game_Actor)
  176.       pair = item.pair_subtitle_for(user.id, target.id)
  177.       if pair
  178.         user_name = $game_actors[user.id].name
  179.         target_name = $game_actors[target.id].name
  180.         @log_window.add_text("#{user_name}:#{pair[:ci]}\n#{target_name}:#{pair[:pi]}")
  181.         wait(60)
  182.         return
  183.       end
  184.     end
  185.  
  186.     # 3. 单人评价
  187.     single = item.subtitle_for(user.id)
  188.     if single
  189.       user_name = $game_actors[user.id].name
  190.       @log_window.add_text("#{user_name}:#{single}")
  191.       wait(60)
  192.     end
  193.   end
  194. end


更多图片 小图 大图
组图打开中,请稍候......

评分

参与人数 1+1 收起 理由
MireniamuYuki + 1 塞糖

查看全部评分

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

本版积分规则

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

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

GMT+8, 2026-6-4 21:03

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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