传染病状态脚本
RUBY 代码#==============================================================================
# ★ RGSS3 - 传染病状态脚本
#==============================================================================
# 功能说明:
# 在状态的备注栏中写入 ,即可让该状态每过指定回合传染给一名队友。
# 例如: 表示每3回合传染一次(无限循环,直到状态解除)。
#
# 使用说明:
# 1. 将此脚本放在 "▼ 插件脚本" 部分,Main 之前。
# 2. 在数据库“状态”选项卡中,为目标状态的备注栏添加 。
# 3. 自定义下方的 PLAGUE_SE 更改传染音效。
#==============================================================================
module PlagueState
# 传染时播放的音效(文件名,音量,音调)
PLAGUE_SE = ["Water5", 80, 100]
end
#==============================================================================
# ■ RPG::State
#==============================================================================
classRPG::State < RPG::BaseItem
#--------------------------------------------------------------------------
# ● 获取瘟疫传染回合数
#--------------------------------------------------------------------------
def plague_turns
return@plague_turnsunless@plague_turns.nil?
load_plague_notetag
return@plague_turns
end
#--------------------------------------------------------------------------
# ● 判断是否为瘟疫状态
#--------------------------------------------------------------------------
def plague_state?
return plague_turns > 0
end
#--------------------------------------------------------------------------
# ● 从备注中加载瘟疫标签
#--------------------------------------------------------------------------
def load_plague_notetag
@plague_turns = 0
ifself.note =~ /plague:\s*(\d+)/i
@plague_turns = $1.to_i
end
end
end
#==============================================================================
# ■ Game_Battler
#==============================================================================
class Game_Battler < Game_BattlerBase
#--------------------------------------------------------------------------
# ● 别名:添加状态
#--------------------------------------------------------------------------
alias plague_add_state add_state
def add_state(state_id)
plague_add_state(state_id)
state = $data_states
if state && state.plague_state?
@plague_counters ||= {}
@plague_counters = state.plague_turns
end
end
#--------------------------------------------------------------------------
# ● 别名:移除状态
#--------------------------------------------------------------------------
alias plague_remove_state remove_state
def remove_state(state_id)
plague_remove_state(state_id)
@plague_counters.delete(state_id)if@plague_counters
end
#--------------------------------------------------------------------------
# ● 获取瘟疫计数器
#--------------------------------------------------------------------------
def plague_counter(state_id)
@plague_counters ||= {}
return@plague_counters || 0
end
#--------------------------------------------------------------------------
# ● 设置瘟疫计数器
#--------------------------------------------------------------------------
def set_plague_counter(state_id, value)
@plague_counters ||= {}
@plague_counters = value
end
#--------------------------------------------------------------------------
# ● 回合结束时的瘟疫处理
#--------------------------------------------------------------------------
def process_plague_turn_end
returnunless@plague_counters && !@plague_counters.empty?
@plague_counters.each_keydo |state_id|
nextunless state?(state_id)
counter = @plague_counters
if counter > 0
counter -= 1
@plague_counters = counter
if counter == 0
spread_plague(state_id)
end
end
end
end
#--------------------------------------------------------------------------
# ● 传播瘟疫给队友(重置计数器实现周期传染)
#--------------------------------------------------------------------------
def spread_plague(state_id)
returnunless actor?
targets = $game_party.members.selectdo |member|
member.alive? && !member.state?(state_id)
end
returnif targets.empty?
target = targets.sample
# 为目标添加状态(目标会获得新计数器)
target.add_state(state_id)
# 播放传染音效
se = PlagueState::PLAGUE_SE
RPG::SE.new(se, se, se).play
# 显示战斗日志
if SceneManager.scene_is?(Scene_Battle)
state_name = $data_states.name
text = "#{target.name} 被传染了 #{state_name} !"
log_win = nil
if SceneManager.scene.respond_to?(:log_window) && SceneManager.scene.log_window
log_win = SceneManager.scene.log_window
else
log_win = SceneManager.scene.instance_variable_get(:@log_window)
end
log_win.add_text(text)if log_win
end
state = $data_states
if state && state.plague_state?
@plague_counters = state.plague_turns
end
end
#--------------------------------------------------------------------------
# ● 清除所有瘟疫计数器
#--------------------------------------------------------------------------
def clear_plague_counters
@plague_counters = {}
end
#--------------------------------------------------------------------------
# ● 别名:完全恢复时清除计数器
#--------------------------------------------------------------------------
alias plague_recover_all recover_all
def recover_all
plague_recover_all
clear_plague_counters
end
end
#==============================================================================
# ■ Scene_Battle
#==============================================================================
class Scene_Battle < Scene_Base
alias plague_turn_end turn_end
def turn_end
all_battle_members.eachdo |battler|
battler.process_plague_turn_end
end
plague_turn_end
end
end
#==============================================================================
# ■ Game_Party
#==============================================================================
class Game_Party < Game_Unit
alias plague_increase_steps increase_steps
def increase_steps
plague_increase_steps
process_plague_on_map
end
def process_plague_on_map
members.eachdo |actor|
actor.process_plague_turn_end
end
end
end
本帖来自P1论坛作者Ruigi,因Project1站服务器在国外有时候访问缓慢不方便作者交流学习,经联系P1站长fux2同意署名转载一起分享游戏制作经验,共同为国内独立游戏作者共同创造良好交流环境,原文地址:https://rpg.blue/forum.php?mod=viewthread&tid=498844若有侵权,发帖作者可联系底部站长QQ在线咨询功能删除,谢谢。
页:
[1]