| 赞 | 2 |
| VIP | |
| 好人卡 | |
| 积分 | 2 |
| 经验 | |
| 最后登录 | 2023-1-17 |
| 在线时间 | 192 小时 |
- 梦石
- 0
- 星屑
- 173
- 在线时间
- 192 小时
- 注册时间
- 2011-3-13
- 回帖
- 31
|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有账号?注册会员
×
这两个脚本因为都引用了Game Action的targets_for_opponents所以放在一起会有一个无效
脚本盲表示不知道该从哪里改
把脚本放上来求修改- #==============================================================================
- # +++ MOG - Scope EX (v1.5) +++
- #==============================================================================
- # By Moghunter
- # https://atelierrgss.wordpress.com/
- #==============================================================================
- # Adiciona a característica de área de impacto da ação baseado na posição
- # e o tamanho do sprite do alvo.
- # Por exemplo, uma habilidade de explosão vai acertar apenas os inimigos que
- # estiverem em volta do alvo inicial.
- # O script adiciona também a função de incluir todos os alvos da tela, aliados
- # e inimigos juntos.
- #==============================================================================
- # Adicione a Tag abaixo na caixa de comentários de notas para definir a área de
- # impacto da habilidade.
- #
- # <Scope Range = X1 - X2 - Y1 - Y2>
- #
- # Y1
- #
- # X1 X2
- #
- # Y2
- #
- # Ex -> <Scope Range = 100 - 32 - 64 - 32>
- #
- #==============================================================================
- # Incluir todos os alvos da tela. (Inimigos e Aliados)
- #==============================================================================
- #
- # <All Targets>
- #
- #==============================================================================
- # Histórico
- #==============================================================================
- # v1.5 Correção de ativar o sistema sem fazer comentário na caixa de notas.
- # v1.4 Compatibilidade com MOG Sprite Actor.
- # v1.3 Melhoria no cálculo de área em alvos únicos.
- # v1.2 Melhoria no sistema de calculo baseado no tamanho do sprite.
- # v1.1 Possibilidade de definir a área específica para cada lado.
- #
- #==============================================================================
- $imported = {} if $imported.nil?
- $imported[:mog_scope_ex] = true
- module MOG_SCOPE_EX
- #============================================================================
- # Definição do modo que vai ser calculado a área do alvo.
- #
- # 0 - Baseado apenas na posição X e Y. (ignorando o tamanho do sprite)
- # 1 - Baseado na posição X e Y + o tamanho do sprite do alvo.
- # (Alvos grandes tem maior area de impacto)
- #
- #============================================================================
- SCOPE_TYPE = 1
- #============================================================================
- # Definição da porcentágem total do tamanho sprite, para ser efetuado o
- # calculo. (Apenas se o valor do SCOPE_TYPE estiver no 1)
- # Por exemplo, definindo o valor de 100% o sistema vai considerar 100% do
- # tamanho do sprite para fazer o calculo.
- #============================================================================
- # SPRITE_SIZE_RANGE = [WIDTH %, HEIGHT %]
- #============================================================================
- SPRITE_SIZE_RANGE = [80,70]
- end
- #==============================================================================
- # ■ Game Battler
- #==============================================================================
- class Game_Battler < Game_BattlerBase
- attr_accessor :sprite_size
-
- #--------------------------------------------------------------------------
- # * Initialize
- #--------------------------------------------------------------------------
- alias mog_scope_ex_initialize initialize
- def initialize
- @sprite_size = [0,0,true]
- mog_scope_ex_initialize
- end
- end
- #==============================================================================
- # ■ Sprite Battler
- #==============================================================================
- class Sprite_Battler < Sprite_Base
- #--------------------------------------------------------------------------
- # * Update Bitmap
- #--------------------------------------------------------------------------
- alias mog_scope_ex_update_bitmap update_bitmap
- def update_bitmap
- @battler.sprite_size = [bitmap.width,bitmap.height,true] if bitmap
- mog_scope_ex_update_bitmap
- end
- end
- #==============================================================================
- # ■ Scene Battle
- #==============================================================================
- class Scene_Battle < Scene_Base
- #--------------------------------------------------------------------------
- # * Show Normal Animation
- #--------------------------------------------------------------------------
- alias mog_scope_ex_show_normal_animation show_normal_animation
- def show_normal_animation(targets, animation_id, mirror = false)
- new_targets = []
- targets.each do |t| new_targets.push(t) if t.sprite_size[2] end
- targets = new_targets
- mog_scope_ex_show_normal_animation(targets, animation_id, mirror)
- targets.each do |t| t.sprite_size[2] = true end
- end
-
- end
- #==============================================================================
- # ■ Game Action
- #==============================================================================
- class Game_Action
- include MOG_SCOPE_EX
- #--------------------------------------------------------------------------
- # * Make Targets
- #--------------------------------------------------------------------------
- def make_targets
- if $imported[:mog_battler_motion] != nil and $imported[:mog_sprite_actor] != nil
- return @subject.pre_target if @subject != nil and @subject.pre_target != nil
- end
- if !forcing && subject.confusion?
- confusion_target
- elsif item.for_opponent?
- targets_for_opponents
- elsif item.for_friend?
- targets_for_friends
- else
- []
- end
- end
-
- #--------------------------------------------------------------------------
- # * Confusion Target
- #--------------------------------------------------------------------------
- def confusion_target
- case subject.confusion_level
- when 1 ; new_targets = make_new_targets([opponents_unit.random_target],0)
- when 2
- if rand(2) == 0
- new_targets = make_new_targets([opponents_unit.random_target],0)
- else
- new_targets = make_new_targets([friends_unit.random_target],1)
- end
- else
- new_targets = make_new_targets([friends_unit.random_target],1)
- end
- end
-
- #--------------------------------------------------------------------------
- # * Targets for Opponents
- #--------------------------------------------------------------------------
- def targets_for_opponents
- if item.for_random?
- org_target = Array.new(item.number_of_targets) { opponents_unit.random_target }
- new_targets = make_new_targets(org_target,0)
- elsif item.for_one?
- num = 1 + (attack? ? subject.atk_times_add.to_i : 0)
- if @target_index < 0
- org_target = [opponents_unit.random_target] * num
- new_targets = make_new_targets(org_target,0)
- else
- org_target = [opponents_unit.smooth_target(@target_index)] * num
- new_targets = make_new_targets(org_target,0)
- end
- else
- return (opponents_unit.alive_members + friends_unit.alive_members) if all_targets
- return opponents_unit.alive_members
- end
- end
-
- #--------------------------------------------------------------------------
- # * All Targets
- #--------------------------------------------------------------------------
- def all_targets
- return true if @item.object.note =~ /<All Targets>/
- return false
- end
-
- #--------------------------------------------------------------------------
- # * Targets for Allies
- #--------------------------------------------------------------------------
- def targets_for_friends
- if item.for_user?
- new_targets = make_new_targets([subject],1)
- elsif item.for_dead_friend?
- if item.for_one?
- org_target = [friends_unit.smooth_dead_target(@target_index)]
- new_targets = make_new_targets(org_target,2)
- else
- org_target = friends_unit.dead_members
- new_targets = make_new_targets(org_target,2)
- end
- elsif item.for_friend?
- if item.for_one?
- org_target = [friends_unit.smooth_target(@target_index)]
- new_targets = make_new_targets(org_target,1)
- else
- return (opponents_unit.alive_members + friends_unit.alive_members) if all_targets
- return friends_unit.alive_members
- end
- end
- end
-
- #--------------------------------------------------------------------------
- # * Make New Targets
- #--------------------------------------------------------------------------
- def make_new_targets(target,type = 0)
- targets = []
- if all_targets
- members = (opponents_unit.alive_members + friends_unit.alive_members) if type <= 1
- members = friends_unit.dead_members if type == 2
- else
- members = opponents_unit.alive_members if type == 0
- members = friends_unit.alive_members if type == 1
- members = friends_unit.dead_members if type == 2
- end
- for t in target
- for m in members
- targets.push(m) if t == m
- next if t == m
- (targets.push(m); m.sprite_size[2] = false) if scope_range?(t,m)
- end
- end
- return targets
- end
-
- #--------------------------------------------------------------------------
- # * Scope Range
- #--------------------------------------------------------------------------
- def scope_range?(user,target)
- t_r2 = [user.screen_x, user.screen_y] rescue nil
- t_r3 = [target.screen_x, target.screen_y] rescue nil
- return false if t_r2 == nil or t_r3 == nil
- s_r = [0,0,0,0] ; s_p = [0,0]
- s_r = [$1.to_i,$2.to_i,$3.to_i,$4.to_i] if @item.object.note =~ /<Scope Range = (\d+) - (\d+) - (\d+) - (\d+)>/
- return false if s_r == [0,0,0,0]
- if SCOPE_TYPE > 0
- s_p = [target.sprite_size[0] / 2, target.sprite_size[1]]
- s_p[0] = s_p[0] * SPRITE_SIZE_RANGE[0] / 100
- s_p[1] = s_p[1] * SPRITE_SIZE_RANGE[1] / 100
- end
- return false if !t_r3[0].between?(t_r2[0] - (s_r[0] + s_p[0]), t_r2[0] + (s_r[1] + s_p[0]))
- return false if !t_r3[1].between?(t_r2[1] - s_r[2], t_r2[1] + s_r[3] + s_p[1])
- return true
- end
-
- end
复制代码 [pre lang="ruby"]#==============================================================================
# ■ 敵對心腳本@ネ実ツクールスレ
#------------------------------------------------------------------------------
# VX ACE敵対心設定。
# (可通過HP變動設定累積仇恨。)
#------------------------------------------------------------------------------
# ■ 規格
# ・給予損害,將HP恢復等增加敵對。
# ※100傷害 or HP100回復時敵対心100増加。
# ・受到傷害時,會降低敵對心。
# ・[敵對]×的[狙撃率]值最大的角色將是敵人的目標。
# ・若[敵對]×的[狙撃率]值最大的結果是多個時,靠前的角色會成為目標。
# ・如果影響範圍是隨機的,會忽略敵意,狙撃率。
# ・若隊員全員的敵対心都是0時、會和原本乱数決定目標。
# ・戦闘不能時敵対心歸0。
#------------------------------------------------------------------------------
# ■ 使用方法 -一-
# ◆制作産生敵對値但無傷害的技能。
# ・在技能的備註中設定敵對値。
# 例)増加敵對値100。
# <敵対心 100>
# ◆制作減少敵對値害的技能。
# ・在技能的備註中現設定敵對値。
# ※敵対心減少以数値百分比計算。
# 例)減少敵対心50%。
# <敵対心 -50>
# ◆可在傷害中計算式中使用敵対心。
# ・計算式用“a.hat”書式、來參照現在的敵対心。
# 例)ロイエ的傷害計算式
# a.hat * a.tp * 0.001
#------------------------------------------------------------------------------
# ■ 使用方法 -二-
# ◆制作將自方隊員的敵對値轉移到自己身上。
# ①在資料庫中制作一個状態。
# a.任意制作一個状態名。
# 例)敵意減、敵対心下降等
# b.状態解除条件設定最短解除。
# 例)自動解除時間:回合完結時
# 継続回合数:0 ~ 0
# c.把信息設定自方隊員得到這状態。
# 例)から敵対心を盗んだ。
# ②在資料庫制作以下的轉移敵対心的技能。
# a.効果範囲:設定成自方隊員単体。
# b.使用可能時:設定成戦鬥時。
# c.使用効果設定成付加①所作成状態。
# d.附註成盗取敵対心。数値為盗取敵対心的比例(%)。
# 例)盗取敵対心50%。
# <盗む敵対心 50>
#------------------------------------------------------------------------------
# ■ 使用方法 -三-
# ◆目の前のパーティメンバーに敵対心をなすり付けるスキルを作る。
# ※並び順にて使用者の直前の生存メンバーが対象になります。
# ①データベースでステートを以下のように作成します。
# a.名前に“だまし討ち”が含まれるステートを作成します。
# b.ステートの解除条件を以下のように設定します。
# 例)自動解除のタイミング:行動終了時
# 継続ターン数:1 ~ 1
# c.この状態jaが解除されたときのメッセージを設定します。
# 例)は、だまし討ちの効果がきれた。
# ②データベースでだまし討ちステートを付加するスキルを作成します。
# a.効果範囲:使用者 に設定します。
# b.使用可能時:バトルのみ に設定します。
# c.使用効果に①で作ったステート付加を設定します。
#------------------------------------------------------------------------------
# ■ 使用方法 -四-
# ◆設定被傷害時敵対心下降的特徴。
# ・装備、状態等的附註進行以下的設定。
# 例)敵対心減少量10%下降。
# <敵対心減少量-10>
# ※各装備、技能効果可累積。
# ◆設定技能/道具使用時敵対心上升量減小的特徴。
# ・装備、状態等的附註進行以下的設定。
# 例)敵対心上昇量50%低下(半減)。
# <敵対心上昇量-50>
# ※各装備、技能効果可累積。
#==============================================================================
class Game_BattlerBase
#--------------------------------------------------------------------------
# ● 敵対心の上限の設定
#--------------------------------------------------------------------------
# 累積ヘイトの上限
MAX_HATE = 99999999
#--------------------------------------------------------------------------
# ● 公開インスタンス変数
#--------------------------------------------------------------------------
attr_accessor :hat # ヘイト
#--------------------------------------------------------------------------
# ● オブジェクト初期化 ※エイリアス
#--------------------------------------------------------------------------
alias enmity_initialize initialize
def initialize
enmity_initialize
@hat = 0
end
#--------------------------------------------------------------------------
# ● だまし討ちのステート ID を取得
#--------------------------------------------------------------------------
def damashi_state_id
$data_states.find {|state| return state.id if state.name.include?("だまし討ち") if state != nil}
end
end
class RPG::BaseItem
#--------------------------------------------------------------------------
# ● 敵対心減少量を取得
#--------------------------------------------------------------------------
def hate_down_depth
/<敵対心減少量-(\d+)>/ =~ note ? $1.to_i * 0.01 : 0
end
#--------------------------------------------------------------------------
# ● 敵対心上昇量を取得
#--------------------------------------------------------------------------
def hate_up_depth
/<敵対心上昇量-(\d+)>/ =~ note ? $1.to_i * 0.01 : 0
end
end
class RPG::UsableItem
#--------------------------------------------------------------------------
# ● メモから敵対心を取得
#--------------------------------------------------------------------------
def add_hate
/<敵対心\s*(\S+)>/ =~ note ? $1.to_i : 0
end
#--------------------------------------------------------------------------
# ● メモから盗む敵対心を取得
#--------------------------------------------------------------------------
def steal_hate
/<盗む敵対心\s*(\d+)>/ =~ note ? $1.to_i : 0
end
end
class Game_Battler < Game_BattlerBase
#--------------------------------------------------------------------------
# ● ヘイトのクリア
#--------------------------------------------------------------------------
def clear_hate
self.hat = 0
end
#--------------------------------------------------------------------------
# ● 戦闘不能になる ※エイリアス
#--------------------------------------------------------------------------
alias enmity_die die
def die
enmity_die
clear_hate
end
#--------------------------------------------------------------------------
# ● ヘイトの処理
#--------------------------------------------------------------------------
def execute_enmity(user, item)
item.add_hate < 0 ? user.hat *= (item.add_hate * -0.01) : user.hat += item.add_hate
if user.state?(damashi_state_id)
ta_target = $game_party.alive_members.index(user) -1
ta_target = 0 if ta_target < 1
$game_party.alive_members[ta_target].hat += @result.hp_damage.abs
else
user.hat += @result.hp_damage.abs * (1 - user.hate_up_plus)
end
self.hat -= @result.hp_damage * (1 - self.hate_down_plus) if @result.hp_damage > 0
if item.steal_hate > 0
steal_hates = self.hat * (item.steal_hate * 0.01)
user.hat += steal_hates
self.hat -= steal_hates
end
user.hat = MAX_HATE if user.hat > MAX_HATE
self.hat = 0 if self.hat < 0
end
#--------------------------------------------------------------------------
# ● スキル/アイテムの使用者側への効果 ※エイリアス
#--------------------------------------------------------------------------
alias enmity_item_user_effect item_user_effect
def item_user_effect(user, item)
enmity_item_user_effect(user, item)
execute_enmity(user, item)
end
#--------------------------------------------------------------------------
# ● 戦闘開始処理 ※エイリアス
#--------------------------------------------------------------------------
alias enmity_on_battle_start on_battle_start
def on_battle_start
enmity_on_battle_start
clear_hate
end
#--------------------------------------------------------------------------
# ● 敵対心減少量の合計
#--------------------------------------------------------------------------
def hate_down_plus
feature_objects.inject(0.0){|r,i| r + i.hate_down_depth}
end
#--------------------------------------------------------------------------
# ● 敵対心上昇量の合計
#--------------------------------------------------------------------------
def hate_up_plus
feature_objects.inject(0.0){|r,i| r + i.hate_up_depth}
end
end
class Game_Unit
#--------------------------------------------------------------------------
# ● タゲを取得
#--------------------------------------------------------------------------
def top_hat
if hat_sum > 0
alive_members.sort {|a,b| b.hat * b.tgr - a.hat * a.tgr}[0]
else
random_target
end
end
#--------------------------------------------------------------------------
# ● ヘイトの合計を計算
#--------------------------------------------------------------------------
def hat_sum
alive_members.inject(0) {|r, member| r + member.hat }
end
#--------------------------------------------------------------------------
# ● ターゲットのランダムな決定(敵対心無視)
#--------------------------------------------------------------------------
def random_target_true
return alive_members[rand(alive_members.size)]
end
end
class Game_Action
#--------------------------------------------------------------------------
# ● 敵に対するターゲット ※再定義
#--------------------------------------------------------------------------
def targets_for_opponents
if item.for_random?
Array.new(item.number_of_targets) { opponents_unit.random_target_true }
elsif item.for_one?
num = 1 + (attack? ? subject.atk_times_add.to_i : 0)
if @target_index < 0
[opponents_unit.top_hat] * num
else
[opponents_unit.smooth_target(@target_index)] * num
end
else
opponents_unit.alive_members
end
end
end
[/pre] |
|