仿《 DELTARUNE》战斗物品动态字幕评价脚本
RUBY 代码#==============================================================================
# ■ 仿《德尔塔符文》战斗物品动态字幕评价
#==============================================================================
# 作者:瑞吉
# 标签说明:
# 单人:
# 双人:
# 多人:
# 适用范围:物品、技能
#==============================================================================
module DataManager
class{ user_speech: 台词, targets: { target_id => 台词 } } }
def load_notetag_subtitle_final
@subtitle_map = {}
@subtitle_pair_map = {}
@multi_subtitle_map = {}
# 单人
self.note.scan(//i)do |match|
@subtitle_map.to_i] = match.to_s
end
# 双人
self.note.scan(//i)do |match|
@subtitle_pair_map[.to_i, match.to_i]] = {
ci: match.to_s,
pi: match.to_s
}
end
# 多人
self.note.scan(//i)do |match|
user_id = match.to_i
content = match.to_s
target_map = {}
user_speech = nil
content.split('|').eachdo |part|
part = part.strip
if part =~ /^US\s*:\s*(.+)/i
user_speech = $1.to_s.strip
elsif part =~ /^(\d+)\s*:\s*(.+)/i
target_map[$1.to_i] = $2.to_s.strip
end
end
@multi_subtitle_map = {
user_speech: user_speech,
targets: target_map
}
end
end
def subtitle_for(actor_id)
return@subtitle_mapif@subtitle_map.key?(actor_id)
return@subtitle_mapif@subtitle_map.key?(0)
nil
end
def pair_subtitle_for(user_id, target_id)
@subtitle_pair_map[]
end
def multi_subtitle_for(user_id)
@multi_subtitle_map
end
end
#==============================================================================
# ■ Scene_Battle
#==============================================================================
class Scene_Battle < Scene_Base
alias use_item_subtitle_final use_item
def use_item
@last_used_item = @subject.current_action.item
@last_user = @subject
@last_targets = @subject.current_action.make_targets.compact
use_item_subtitle_final
show_subtitle_final if should_show_subtitle_final?
end
def should_show_subtitle_final?
returnfalseunless@last_used_item.is_a?(RPG::UsableItem)
returnfalseunless@last_used_item.respond_to?(:subtitle_for)
item = @last_used_item
user = @last_user
multi = item.multi_subtitle_for(user.id)
if multi
targets = multi[:targets]
returntrueif@last_targets.any? { |t| t.is_a?(Game_Actor) && targets.key?(t.id)}
returntrueif multi[:user_speech] && !multi[:user_speech].empty?
end
@last_targets.eachdo |t|
returntrueif t.is_a?(Game_Actor) && item.pair_subtitle_for(user.id, t.id)
end
returntrueif item.subtitle_for(user.id)
false
end
def show_subtitle_final
item = @last_used_item
user = @last_user
returnunless@log_window
# 1. 多人评价
multi_data = item.multi_subtitle_for(user.id)
if multi_data
targets_map = multi_data[:targets]
user_speech = multi_data[:user_speech]
# 使用者台词
if user_speech && !user_speech.empty?
user_name = $game_actors.name
@log_window.add_text("#{user_name}:#{user_speech}")
wait(30)
end
# 队友台词
shown = false
@last_targets.eachdo |target|
nextunless target.is_a?(Game_Actor)
text = targets_map
nextunless text
name = $game_actors.name
@log_window.add_text("#{name}:#{text}")
wait(20)
shown = true
end
if shown || user_speech
wait(30)
return
end
end
# 2. 双人评价
@last_targets.eachdo |target|
nextunless target.is_a?(Game_Actor)
pair = item.pair_subtitle_for(user.id, target.id)
if pair
user_name = $game_actors.name
target_name = $game_actors.name
@log_window.add_text("#{user_name}:#{pair[:ci]}\n#{target_name}:#{pair[:pi]}")
wait(60)
return
end
end
# 3. 单人评价
single = item.subtitle_for(user.id)
if single
user_name = $game_actors.name
@log_window.add_text("#{user_name}:#{single}")
wait(60)
end
end
end
本帖来自P1论坛作者Ruigi,因Project1站服务器在国外有时候访问缓慢不方便作者交流学习,经联系P1站长fux2同意署名转载一起分享游戏制作经验,共同为国内独立游戏作者共同创造良好交流环境,原文地址:https://rpg.blue/forum.php?mod=viewthread&tid=498846若有侵权,发帖作者可联系底部站长QQ在线咨询功能删除,谢谢。
页:
[1]