#============================================================================== # 斗螃蟹制作-技能熟练度,配合技能跑CP条改版 #------------------------------------------------------------------------------ # 更新记录: # 2023.11.22 第一版 # 2023.12.14 第二版-增加读档检测是否有使用法术次数数组,避免存档不兼容 #============================================================================== #============================================================================== # 使用说明 #============================================================================== #每个角色有skill_use_number数组储存技能使用次数 #每次使用了技能后在skill_use_number对应位置加1 #选择技能时判断使用次数大于几,在技能后面增加[1级][2级][3级]指标以提示玩家 #使用技能时判断使用次数大于几,根据不同的等级给角色加上不同的状态 #来实现不同行动速度 #如果想要更改某个对应ID角色的技能使用次数 #在事件里可以用下一行脚本(注意不要带第一个#,这里用#是注释用) #$game_actors[角色ID].skill_use_num[法术ID] = 想要修改的次数 #例如 #$game_actors[1].skill_use_num[2] = 10 #意思是第一个角色的第二个技能使用次数修改为10次 #另外注意对应角色第一次入队后才能使用这个代码,未初始化就用这个代码会报错 #只要入队后即使离队也可以使用 #============================================================================== # 自定义部分 #============================================================================== module DPX end module DPX::Skill_Proficiency Skill_number = 81 #技能总数量,根据数据库来写,注意是数据库技能数量+1(数组索引从0开始) Upgrade_to_2 = 5 #升到2级需要使用多少次,也就使用Upgrade_to_2次后,立马升级为等级2 Upgrade_to_3 = 10 #升到3级需要使用多少次 #三个等级对应的状态ID State_Proficiency1 = 17 State_Proficiency2 = 18 State_Proficiency3 = 19 #敌人没有技能熟练度升级要求 State_Proficiency_Enemy = 18 #这里给的是等级二,默认敌人是等级二速度 end #============================================================================== # 主代码 #============================================================================== #-------------------------------------------------------------------------- # ● 技能使用次数变量定义 #-------------------------------------------------------------------------- #下面的代码是兼容旧的,未定义skill_use_num存档的 class Game_Actors attr_accessor :data end class Scene_Load include DPX::Skill_Proficiency alias DPX_read_save_data read_save_data def read_save_data(file) DPX_read_save_data(file) for i in $game_actors.data if i != nil if i.skill_use_num==nil i.skill_use_num = Array.new(Skill_number, 0) end end end end end #接下来是创建角色时定义skill_use_num class Game_Actor < Game_Battler include DPX::Skill_Proficiency #-------------------------------------------------------------------------- # ● 定义实例变量 #-------------------------------------------------------------------------- attr_accessor :skill_use_num # 技能使用次数 #一个1*n的数组,存储的是角色使用技能的次数,序号对应的是技能ID #每个角色都跟着一个这个 #-------------------------------------------------------------------------- # ● 觉悟特技 # skill_id : 特技 ID #-------------------------------------------------------------------------- alias old_initialize initialize def initialize(actor_id) old_initialize(actor_id) @skill_use_num = Array.new(Skill_number, 0)#建立全是0元素的数组,好比较大小 end end #-------------------------------------------------------------------------- # ● 技能次数叠加和附加状态 #-------------------------------------------------------------------------- class Scene_Battle include DPX::Skill_Proficiency def DPX_skill_use_num_up(actor,skill) if actor.is_a?(Game_Actor) actor.skill_use_num[skill.id] += 1 end end def DPX_skill_state(actor,skill_id) if actor.skill_use_num[skill_id] < Upgrade_to_2 actor.add_state(State_Proficiency1) elsif actor.skill_use_num[skill_id].between?(Upgrade_to_2 ,Upgrade_to_3-1) actor.add_state(State_Proficiency2) elsif actor.skill_use_num[skill_id] >= Upgrade_to_3 actor.add_state(State_Proficiency3) end end end #-------------------------------------------------------------------------- # ● 技能等级展示 #-------------------------------------------------------------------------- class Window_Skill < Window_Selectable include DPX::Skill_Proficiency def DPX_skill_level_show(actor,skill) if actor.skill_use_num[skill.id] < Upgrade_to_2 return "[1级]" elsif actor.skill_use_num[skill.id].between?(Upgrade_to_2 ,Upgrade_to_3-1) return "[2级]" elsif actor.skill_use_num[skill.id] >= Upgrade_to_3 return "[3级]" end end alias DPX_draw_item draw_item def draw_item(index) skill = @data[index] if @actor.skill_can_use?(skill.id) self.contents.font.color = normal_color else self.contents.font.color = disabled_color end x = 4 + index % 2 * (288 + 32) y = index / 2 * 32 rect = Rect.new(x, y, self.width / @column_max - 32, 32) self.contents.fill_rect(rect, Color.new(0, 0, 0, 0)) bitmap = RPG::Cache.icon(skill.icon_name) opacity = self.contents.font.color == normal_color ? 255 : 128 self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24), opacity) skill_level = DPX_skill_level_show(@actor,skill) self.contents.draw_text(x + 28, y, 204, 32, skill.name+skill_level, 0) self.contents.draw_text(x + 232, y, 48, 32, skill.sp_cost.to_s, 2) end end #----------
# ▼▲▼ XRXS65. CP制御ターンシステム ver.β ▼▲▼ built 201120 # by 桜雅 在土 #============================================================================== # □ カスタマイズポイント #============================================================================== class Game_System def new_DPX_temp @DPX_skill_temp = [] #防止旧存档不兼容 @DPX_target_temp = [] @DPX_Battler_temp = [] end def add_DPX_temp(active_battler,skill,target_battlers) @DPX_Battler_temp.push(active_battler) @DPX_skill_temp.push(skill) @DPX_target_temp.push(target_battlers) end def get_DPX_temp(active_battler) for j in @DPX_Battler_temp if j == active_battler a_index = @DPX_Battler_temp.index(j) skill = @DPX_skill_temp[a_index] target_battlers = @DPX_target_temp[a_index] return [skill,target_battlers] end end end def remove_DPX_temp(active_battler) for i in @DPX_Battler_temp if i == active_battler a_index = @DPX_Battler_temp.index(i) @DPX_Battler_temp.delete_at(a_index) @DPX_skill_temp.delete_at(a_index) @DPX_target_temp.delete_at(a_index) end end end end module XRXS65 # # 「バトルスピード」(数値が高いほど早い) # SPEED = 0.4 # # 戦闘開始時 CP。 固定値と占有率 # CP_PRESET_FIXNUM = 0 CP_PRESET_RATIO = 1.0 # # 转向控制器(nil:有效计数/转向。 ターンコントローラ (nil : カウント/ターンを有効。 # 数值:拥有该索引的敌人支配) 数値 : そのインデックスをもつエネミーが支配) # TC = 0 # # 计数/回合(TC有效时忽略) カウント/ターン (TCが有効な場合は無視) # CPT = 40 # # CP 条皮肤スキン # SKIN = "123" # スキンファイル名(Graphics/Windowskinsフォルダ) LINE_HEIGHT = 6 # スキンの"一行"の縦幅[単位:ピクセル] # # 表示位置セッティング # X_OFFSET = 160 # 横位置 Y_OFFSET = 464 # 縦位置 ALIGN = 2 #(CP仪表的位置。0:靠左1:中间2:靠右)「位置揃え」(CPメーターの位置。0:左寄せ 1:中央 2:右寄せ) MAX = 4 # 確保するサイズ[単位:~人分] # # アクターコマンドがポップしたときの効果音 # COMMAND_UP_SE = "Audio/SE/decision.wav" end #============================================================================== # --- CP メーターの描画情報の取得 --- (Game_Battlerにインクルードされます) #============================================================================== module XRXS_CP #-------------------------------------------------------------------------- # ○ スキンライン (スキンの何行目を使うか) #-------------------------------------------------------------------------- def cp_linetype # CP フルの場合はスキンの 2 行目を使う return 2 if self.cp_full? # 通常はスキンの 1 行目を使う return 1 end #-------------------------------------------------------------------------- # ○ メーター量[単位:%] #-------------------------------------------------------------------------- def cp_lineamount # 戦闘不能の場合は 0 %として表示させる return 0 if self.dead? # CP値を%値に変換して返却する return 100 * self.cp / self.max_cp end end # # カスタマイズポイントここまで。 #------------------------------------------------------------------------------ #============================================================================== # --- XRXS. CP機構 --- #============================================================================== module XRXS_CP_SYSTEM #---------------------------------------------------------------------------- # ○ 合計 AGI の取得 #---------------------------------------------------------------------------- def self.total_agi total = 0 for battler in $game_party.actors + $game_troop.enemies total += battler.agi end return total end end #============================================================================== # --- バトラーにCP機能を追加 モジュール --- #============================================================================== module XRXS_CP include DPX::Skill_Proficiency #-------------------------------------------------------------------------- # ○ 最大 CP の取得 #-------------------------------------------------------------------------- def max_cp return 65535 end #-------------------------------------------------------------------------- # ○ CP の取得と設定 #-------------------------------------------------------------------------- def cp return @cp == nil ? @cp = 0 : @cp end def cp=(n) #@cp = [[n.to_i, 0].max, self.max_cp].min if self.states.include?(State_Proficiency1)#判断玩家,敌人的状态是熟练度1、2施法状态 @cp = [[n.to_i, 0].max, max_cp].min elsif self.states.include?(State_Proficiency2) @cp = [[n.to_i, 0].max, max_cp].min else @cp = [[n.to_i, 0].max, 50000].min end end #-------------------------------------------------------------------------- # ○ CP 初期設定 #-------------------------------------------------------------------------- def cp_preset #percent = self.max_cp * XRXS65::CP_PRESET_RATIO * (rand(16) + 16) * self.agi / XRXS_CP_SYSTEM.total_agi / 24 percent = 50000 * XRXS65::CP_PRESET_RATIO * (rand(16) + 16) * self.agi / XRXS_CP_SYSTEM.total_agi / 24 self.cp = XRXS65::CP_PRESET_FIXNUM + percent end #-------------------------------------------------------------------------- # ○ CP值增长速度 CP カウントアップ #-------------------------------------------------------------------------- def cp_update if self.states.include?(State_Proficiency1) self.cp += XRXS65::SPEED * 4096 /10 elsif self.states.include?(State_Proficiency2) self.cp += XRXS65::SPEED * 4096 /3 else #self.cp += XRXS65::SPEED * 4096 * self.agi / XRXS_CP_SYSTEM.total_agi self.cp += XRXS65::SPEED * 4096 * self.agi / 200 end end #-------------------------------------------------------------------------- # ○ 判断CP是否满了 CP 満タン? #-------------------------------------------------------------------------- def cp_full? if self.states.include?(State_Proficiency1) return @cp == 65535 elsif self.states.include?(State_Proficiency2) return @cp == 65535 else # return @cp == self.max_cp return @cp == 50000 end end end class Game_Battler include XRXS_CP alias DPX_remove_states_shock remove_states_shock def remove_states_shock if self.damage > 0 #必须伤害大于0才行,否则治疗也会打断 for i in @states.clone if rand(100) < $data_states[i].shock_release_prob if self.states.include?(State_Proficiency1) || self.states.include?(State_Proficiency2) $game_system.remove_DPX_temp(self) #p "检测到状态,受到攻击,返还一部分CP" self.cp = 25000 end remove_state(i) end end end end #更改状态解除判断准则,只要受到伤害都会解除状态 alias DPX_skill_effect skill_effect def skill_effect(user, skill) # 清除会心一击标志 self.critical = false # 特技的效果范围是 HP 1 以上的己方、自己的 HP 为 0、 # 或者特技的效果范围是 HP 0 的己方、自己的 HP 为 1 以上的情况下 if ((skill.scope == 3 or skill.scope == 4) and self.hp == 0) or ((skill.scope == 5 or skill.scope == 6) and self.hp >= 1) # 过程结束 return false end # 清除有效标志 effective = false # 公共事件 ID 是有效的情况下,设置为有效标志 effective |= skill.common_event_id > 0 # 第一命中判定 hit = skill.hit if skill.atk_f > 0 hit *= user.hit / 100 end hit_result = (rand(100) < hit) # 不确定的特技的情况下设置为有效标志 effective |= hit < 100 # 命中的情况下 if hit_result == true # 计算威力 power = skill.power + user.atk * skill.atk_f / 100 if power > 0 power -= self.pdef * skill.pdef_f / 200 power -= self.mdef * skill.mdef_f / 200 power = [power, 0].max end # 计算倍率 rate = 20 rate += (user.str * skill.str_f / 100) rate += (user.dex * skill.dex_f / 100) rate += (user.agi * skill.agi_f / 100) rate += (user.int * skill.int_f / 100) # 计算基本伤害 self.damage = power * rate / 20 # 属性修正 self.damage *= elements_correct(skill.element_set) self.damage /= 100 # 伤害符号正确的情况下 if self.damage > 0 # 防御修正 if self.guarding? self.damage /= 2 end end # 分散 if skill.variance > 0 and self.damage.abs > 0 amp = [self.damage.abs * skill.variance / 100, 1].max self.damage += rand(amp+1) + rand(amp+1) - amp end # 第二命中判定 eva = 8 * self.agi / user.dex + self.eva hit = self.damage < 0 ? 100 : 100 - eva * skill.eva_f / 100 hit = self.cant_evade? ? 100 : hit hit_result = (rand(100) < hit) # 不确定的特技的情况下设置为有效标志 effective |= hit < 100 end # 命中的情况下 if hit_result == true #▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲ # 威力 0 以外的物理攻击的情况下 #if skill.power != 0 and skill.atk_f > 0 if skill.power != 0 #我不想要只有物理攻击才会消除 # 状态冲击解除 remove_states_shock # 设置有效标志 effective = true end # HP 的伤害减法运算 last_hp = self.hp self.hp -= self.damage effective |= self.hp != last_hp # 状态变化 @state_changed = false effective |= states_plus(skill.plus_state_set) effective |= states_minus(skill.minus_state_set) # 威力为 0 的场合 if skill.power == 0 # 伤害设置为空的字串 self.damage = "" # 状态没有变化的情况下 unless @state_changed # 伤害设置为 "Miss" self.damage = "Miss" end end # Miss 的情况下 else # 伤害设置为 "Miss" self.damage = "Miss" end # 不在战斗中的情况下 unless $game_temp.in_battle # 伤害设置为 nil self.damage = nil end # 过程结束 return effective end end #============================================================================== # --- ガード機能 --- #============================================================================== class Game_Battler #-------------------------------------------------------------------------- # ○ ガードフラグ #-------------------------------------------------------------------------- def guarding=(n) @guarding = n end #-------------------------------------------------------------------------- # ● 防御中判定 [再定義] #-------------------------------------------------------------------------- def guarding? return @guarding end end #============================================================================== # ---演员“判断可输入命令”没有CP就不能命令---(没到达终点不能行动) # ---アクター「コマンド入力可能判定」:CPがないとコマンドしない --- #============================================================================== module XRXS_CP_INPUTABLE include DPX::Skill_Proficiency def inputable? #防止技能条到终点后又输入指令 if self.states.include?(State_Proficiency1) || self.states.include?(State_Proficiency2) return false else return (self.cp_full? and super) end end end class Game_Actor < Game_Battler include XRXS_CP_INPUTABLE end #============================================================================== # --- 敌人“判断可输入命令”没有CP就不能命令---(没到达终点不能行动) # --- エネミー「行動可能判定」:CPがないとコマンドしない --- #============================================================================== module XRXS_CP_MOVABLE def movable? return (self.cp_full? and super) end end class Game_Enemy < Game_Battler include XRXS_CP_MOVABLE end #============================================================================== # --- 战斗时CP计数 --- # --- 戦闘時 CPカウント --- #============================================================================== module XRXS_CP_Battle #-------------------------------------------------------------------------- # ○ パーティ全員の CP を初期設定 #-------------------------------------------------------------------------- def cp_preset_party for actor in $game_party.actors actor.cp_preset end end #-------------------------------------------------------------------------- # ○ トループ全員の CP を初期設定 #-------------------------------------------------------------------------- def cp_preset_troop for enemy in $game_troop.enemies enemy.cp_preset end end #-------------------------------------------------------------------------- # ○ バトラー全員の CP をカウントアップ #-------------------------------------------------------------------------- def cp_update for battler in $game_party.actors + $game_troop.enemies battler.cp_update end end end class Scene_Battle include XRXS_CP_Battle alias DPX_main main def main $game_system.new_DPX_temp DPX_main() end end #============================================================================== # ■ Scene_Battle #============================================================================== class Scene_Battle alias DPX_battle_end battle_end def battle_end(result) $game_system.new_DPX_temp #战斗结束后需要把暂存信息清空 DPX_battle_end(result) end #-------------------------------------------------------------------------- # ● メイン処理 #-------------------------------------------------------------------------- alias xrxs65_main main def main # エクストラスプライトの初期化 @extra_sprites = [] if @extra_sprites == nil # CP の初期化 cp_preset_party # CP メーターの作成 CP仪表的制作 @cp_meters = CP_Meters.new # CP メーターをエクストラスプライトへ登録 @extra_sprites.push(@cp_meters) # 呼び戻す xrxs65_main # メーターの解放 @cp_meters.dispose end #-------------------------------------------------------------------------- # ● 战斗阶段开始 プレバトルフェーズ開始 #-------------------------------------------------------------------------- alias xrxs65_start_phase1 start_phase1 def start_phase1 # 呼び戻す xrxs65_start_phase1 # CP の初期化 cp_preset_troop # CP メーターの更新 @cp_meters.refresh # インデックスを計算 #@cp_escape_actor_command_index = @actor_command_window.height/32 - 1 # アクターコマンドウィンドウに追加 #@actor_command_window.add_command("逃げる") #if !$game_temp.battle_can_escape # @actor_command_window.disable_item(@cp_escape_actor_command_index) #end end #-------------------------------------------------------------------------- # ● 派对命令阶段开始 パーティコマンドフェーズ開始 #-------------------------------------------------------------------------- alias xrxs65_start_phase2 start_phase2 def start_phase2 # 呼び戻す xrxs65_start_phase2 # パーティコマンドウィンドウを無効化 @party_command_window.active = false @party_command_window.visible = false # 強制的にフェイズ 2 を保持 @phase = 2 # ただし、既に行動可能者が存在する場合は 3 へ start_phase3 if anybody_movable? end #-------------------------------------------------------------------------- # ○ CP制での ターンのカウント #-------------------------------------------------------------------------- def cp_turn_count $game_temp.battle_turn += 1 # バトルイベントの全ページを検索 for index in 0...$data_troops[@troop_id].pages.size # このページのスパンが [ターン] の場合 if $data_troops[@troop_id].pages[index].span == 1 # 実行済みフラグをクリア $game_temp.battle_event_flags[index] = false end end end #-------------------------------------------------------------------------- # ●帧更新(派对命令阶段) フレーム更新 (パーティコマンドフェーズ) #-------------------------------------------------------------------------- alias xrxs65_update_phase2 update_phase2 def update_phase2 # パーティコマンドウィンドウのインデックスを無効化 @party_command_window.index = -1 # 呼び戻す xrxs65_update_phase2 # 例外補正 @turn_count_time = 1 if @turn_count_time == nil # ターンのカウント if @turn_count_time > 0 @turn_count_time -= 1 if @turn_count_time == 0 cp_turn_count @turn_count_time = XRXS65::CPT if XRXS65::TC == nil end end # CP のフレーム更新 cp_update @cp_meters.refresh # フル CP のバトラーが存在する場合、ターン開始 start_phase3 if anybody_movable? end #-------------------------------------------------------------------------- # ○ フル CP バトラーが存在するか? #-------------------------------------------------------------------------- def anybody_movable? for battler in $game_party.actors + $game_troop.enemies return true if battler.cp_full? end return false end #-------------------------------------------------------------------------- # ● アクターコマンドウィンドウのセットアップ #-------------------------------------------------------------------------- alias xrxs65_phase3_setup_command_window phase3_setup_command_window def phase3_setup_command_window # 効果音の再生 Audio.se_play(XRXS65::COMMAND_UP_SE) rescue nil # 呼び戻す xrxs65_phase3_setup_command_window end #-------------------------------------------------------------------------- # ● フレーム更新 (アクターコマンドフェーズ : 基本コマンド) #-------------------------------------------------------------------------- alias xrxs_bsp1_update_phase3_basic_command update_phase3_basic_command def update_phase3_basic_command # C ボタンが押された場合 if Input.trigger?(Input::C) # アクターコマンドウィンドウのカーソル位置で分岐 case @actor_command_window.index when @cp_escape_actor_command_index # 逃げる if $game_temp.battle_can_escape # 決定 SE を演奏 $game_system.se_play($data_system.decision_se) # アクションを設定 @active_battler.current_action.kind = 0 @active_battler.current_action.basic = 4 # 次のアクターのコマンド入力へ phase3_next_actor else # ブザー SE を演奏 $game_system.se_play($data_system.buzzer_se) end return end end # 呼び戻す xrxs_bsp1_update_phase3_basic_command end #-------------------------------------------------------------------------- # ● メインフェーズ開始 #-------------------------------------------------------------------------- alias xrxs65_start_phase4 start_phase4 def start_phase4 # ターン数を引くことによって擬似的にカウントに変化を起こさせない $game_temp.battle_turn -= 1 # フラグを退避 save_flags = $game_temp.battle_event_flags.dup # 呼び戻す xrxs65_start_phase4 # フラグを復旧 $game_temp.battle_event_flags = save_flags end #-------------------------------------------------------------------------- # ● 行動順序作成 #-------------------------------------------------------------------------- alias xrxs65_make_action_orders make_action_orders def make_action_orders # 呼び戻す xrxs65_make_action_orders # CPが不足している場合は @action_battlers から除外する for battler in @action_battlers.dup @action_battlers.delete(battler) unless battler.cp_full? end end #-------------------------------------------------------------------------- # ● 帧更新(主阶段步骤2:动作开始) フレーム更新 (メインフェーズ ステップ 2 : アクション開始) #这是到达终点了,使用动作,需要判断是否用了技能 #-------------------------------------------------------------------------- alias xrxs65_update_phase4_step2 update_phase4_step2 def update_phase4_step2 # ガードの解除 #▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼ #dpx-使用技能的CP达到65536则施展技能 # 如果不是强制行动 unless @active_battler.current_action.forcing # 限制为 [s熟练度1、2] 的情况下 if @active_battler.states.include?(State_Proficiency1) || @active_battler.states.include?(State_Proficiency2) #p "开始使用技能" #make_skill_action_result的定制版本,从全局的Temp里面选取 temp_list = $game_system.get_DPX_temp(@active_battler) @skill = temp_list[0] #DPX-增加技能使用次数 DPX_skill_use_num_up(@active_battler,@skill) # 如果不是强制行动 unless @active_battler.current_action.forcing # 因为 SP 耗尽而无法使用的情况下 unless @active_battler.skill_can_use?(@skill.id) # 清除强制行动对像的战斗者 $game_temp.forcing_battler = nil # 移至步骤 1 @phase4_step = 1 return end end # 消耗 SP @active_battler.sp -= @skill.sp_cost # 刷新状态窗口 @status_window.refresh # 在帮助窗口显示特技名 @help_window.set_text(@skill.name, 1) # 设置动画 ID @animation1_id = @skill.animation1_id @animation2_id = @skill.animation2_id # 设置公共事件 ID @common_event_id = @skill.common_event_id # 设置对像侧战斗者 #set_target_battlers(@skill.scope) # 应用特技效果 @target_battlers=[] @target_battlers = temp_list[1] for target in @target_battlers target.skill_effect(@active_battler, @skill) end @active_battler.cp = 0 #CP条清零 #@cp_meters.refresh #移除施法状态 @active_battler.remove_state(State_Proficiency1) @active_battler.remove_state(State_Proficiency2) #清除暂时存储的施法者,技能,受法者ID $game_system.remove_DPX_temp(@active_battler) #$game_temp.forcing_battler = nil # 例外補正 return if @active_battler == nil #回合计数 if @active_battler.is_a?(Game_Enemy) and @active_battler.index == XRXS65::TC cp_turn_count end @phase4_step = 3 #不需要选择,直接挪到步骤三 return end end @active_battler.guarding = false #DPX-跑技能条 case @active_battler.current_action.kind when 0 # 基本 # CPの消費 @active_battler.cp = 0 when 1 # 特技 @skill = $data_skills[@active_battler.current_action.skill_id] #不需要修改cp值,附加状态 @cp_meters.refresh if @active_battler.is_a?(Game_Actor)#如果行动发出者是玩家 DPX_skill_state(@active_battler,@skill.id) #根据熟练度增加法术状态 else if @active_battler.skill_can_use?(@skill.id) @active_battler.add_state(State_Proficiency_Enemy)#敌人默认是2级熟练度,增加2级法术状态 elsif @skill.id==90#会心一击特殊技能,不需要消耗sp,剧情用 @active_battler.add_state(State_Proficiency3) else @active_battler.current_action.kind = 0 update_phase4_step2 end end #如果是熟练度3,直接施法 if @active_battler.states.include?(State_Proficiency3) @active_battler.remove_state(State_Proficiency3) @active_battler.cp = 0 # 清除对像战斗者 @target_battlers = [] #make_skill_action_result # 消耗 SP @active_battler.sp -= @skill.sp_cost # 刷新状态窗口 @status_window.refresh # 在帮助窗口显示特技名 @help_window.set_text(@skill.name, 1) # 设置动画 ID @animation1_id = @skill.animation1_id @animation2_id = @skill.animation2_id # 设置公共事件 ID @common_event_id = @skill.common_event_id # 设置对像侧战斗者 set_target_battlers(@skill.scope) # 应用特技效果 for target in @target_battlers target.skill_effect(@active_battler, @skill) end # 移至步骤 3 if @phase4_step == 2 @phase4_step = 3 end return elsif @active_battler.states.include?(State_Proficiency1) || @active_battler.states.include?(State_Proficiency2) #需要将行动人物ID,skill和target暂时存储起来,在CP=65535施法时使用 @target_battlers=[] set_target_battlers(@skill.scope) $game_system.add_DPX_temp(@active_battler,@skill,@target_battlers) # 清除行动强制对像的战斗者 $game_temp.forcing_battler = nil # 移至步骤 1 @phase4_step = 1 return end when 2 # 物品 @active_battler.cp = 0 end #▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲ # CP メーターの更新 @cp_meters.refresh # 呼び戻す xrxs65_update_phase4_step2 #继续原生update_phase4_step2脚本 # 例外補正 return if @active_battler == nil # ターンコントローラ if @active_battler.is_a?(Game_Enemy) and @active_battler.index == XRXS65::TC cp_turn_count end end #-------------------------------------------------------------------------- # ● 基本行动制作结果 基本アクション 結果作成 #这是防御、逃跑的CP更新 #-------------------------------------------------------------------------- alias xrxs65_make_basic_action_result make_basic_action_result def make_basic_action_result # 呼び戻す xrxs65_make_basic_action_result # 防御の場合 if @active_battler.current_action.basic == 1 @active_battler.guarding = true return end # パーティの逃亡の場合 if @active_battler.current_action.basic == 4 # 逃走可能ではない場合 if $game_temp.battle_can_escape == false # ブザー SE を演奏 $game_system.se_play($data_system.buzzer_se) return end # パーティ全員の CP をクリア 派对全员的CP通关成功 for actor in $game_party.actors actor.cp = 0 end # CP メーターの更新 @cp_meters.refresh # 逃走処理 update_phase2_escape return end end #-------------------------------------------------------------------------- # ● 帧更新(主阶段步骤5:伤害表示) フレーム更新 (メインフェーズ ステップ 5 : ダメージ表示) #-------------------------------------------------------------------------- alias xrxs65_update_phase4_step5 update_phase4_step5 def update_phase4_step5 # 召回 呼び戻す xrxs65_update_phase4_step5 # CP メーターの更新 @cp_meters.refresh end end #============================================================================== # --- CP メーターをまとめて管理するクラス、表示関係はすべてココ --- #============================================================================== class CP_Meters #-------------------------------------------------------------------------- # ○ オブジェクト初期化 #-------------------------------------------------------------------------- def initialize # メーター群の生成 @meters = [] for i in 0...$game_party.actors.size make_meter(i) end refresh end #-------------------------------------------------------------------------- # ○ リフレッシュ #-------------------------------------------------------------------------- def refresh # 戦闘メンバー数の変更を判別 for i in @meters.size...$game_party.actors.size make_meter(i) end for i in $game_party.actors.size...@meters.size @meters[i].dispose @meters[i] = nil end @meters.compact! # 表示更新 for i in 0...$game_party.actors.size actor = $game_party.actors[i] @meters[i].line = actor.cp_linetype @meters[i].amount = actor.cp_lineamount end end #-------------------------------------------------------------------------- # ○ メーターひとつの生成 #-------------------------------------------------------------------------- def make_meter(i) # スキンの取得 skin = RPG::Cache.windowskin(XRXS65::SKIN) # space = 640 / XRXS65::MAX case XRXS65::ALIGN when 0 actor_x = i * space + 4 when 1 actor_x = (space * ((XRXS65::MAX - $game_party.actors.size)/2.0 + i)).floor when 2 actor_x = (i + XRXS65::MAX - $game_party.actors.size) * space + 4 end meter = MeterSprite.new(skin, XRXS65::LINE_HEIGHT) meter.x = actor_x + XRXS65::X_OFFSET - skin.width meter.y = XRXS65::Y_OFFSET @meters[i] = meter end #-------------------------------------------------------------------------- # ○ 可視状態 #-------------------------------------------------------------------------- def visible=(b) @meters.each{|sprite| sprite.visible = b } end #-------------------------------------------------------------------------- # ○ 解放 #-------------------------------------------------------------------------- def dispose @meters.each{|sprite| sprite.dispose } end end #============================================================================== # --- XRXS. レクタンギュラーメーター表示・極 --- #============================================================================== class MeterSprite < Sprite #-------------------------------------------------------------------------- # ○ オブジェクト初期化 #-------------------------------------------------------------------------- def initialize(skin, line_height) @skin = skin @width = @skin.width @height = line_height @line = 1 @amount = 0 @base_sprite = Sprite.new @base_sprite.bitmap = @skin @base_sprite.src_rect.set(0, 0, @width, @height) @base_sprite.z = 601 super() self.z = @base_sprite.z + 1 self.bitmap = @skin self.line = 1 end #-------------------------------------------------------------------------- # ○ 値の設定 #-------------------------------------------------------------------------- def line=(n) @line = n refresh end def amount=(n) @amount = n refresh end def refresh self.src_rect.set(0, @line * @height, @width * @amount / 100, @height) end #-------------------------------------------------------------------------- # ○ 座標の設定 #-------------------------------------------------------------------------- def x=(n) super @base_sprite.x = n end def y=(n) super @base_sprite.y = n end #-------------------------------------------------------------------------- # ○ 解放 #-------------------------------------------------------------------------- def dispose @base_sprite.dispose super end end
# ▼▲▼ XRXS65A. CP制御ターンシステム「シンセ・ゲージ」 ▼▲▼ built201202 # by 桜雅 在土 #============================================================================== # □ カスタマイズポイント #============================================================================== class XRXS65A #-------------------------------------------------------------------------- # 「アイコン設定」 #-------------------------------------------------------------------------- DEFAULT = "怪物行动条.png" # 默认图标(未设定均为此) # 人物图标 记述方式: ID名ー程序图标 ICONS = { 1=>"行动条-主角1.png", 4=>"行动条-主角4.png", 7=>"行动条-主角7.png", } # 怪物图标 记述方式: ID名ー程序图标 ICONE = { 1=>"行动条-幽灵.png", 2=>"行动条-蜥蜴.png", 21=>"行动条-食人魔.png", } #-------------------------------------------------------------------------- # 「シンセ・ゲージ」 #-------------------------------------------------------------------------- SKIN = "CPLine" # スキン X = 400 # X 座標 Y = 36 # Y 座標 # 闪烁时光芒的颜色 Flash_color = Color.new(255, 255, 255, 128) # 闪烁时间 Flash_duration = 5 # 闪烁间隔 Flash_interval = 10 end #============================================================================== # --- CP メーターをまとめて管理するクラス、表示関係はすべてココ --- [再定義] #============================================================================== #以下代码是实现CP条图标闪烁 class Game_System def new_DPX_ICON_temp @ICON_Sprite_temp=[] end def push_DPX_ICON_temp(set) @ICON_Sprite_temp.push(set) end def get_DPX_ICON_temp return @ICON_Sprite_temp end alias dpx_icon_initialize initialize def initialize @iCON_target = [] dpx_icon_initialize end def get_DPX_self_temp(self_v) @iCON_target = [] @iCON_target = self_v end def get_icon_target return @iCON_target end def reset_icon_target set = $game_system.get_DPX_ICON_temp for i in set if @iCON_target.is_a?(Arrow_Actor) if @iCON_target.actor == i[1] i[0].update end elsif @iCON_target.is_a?(Arrow_Enemy) if @iCON_target.enemy == i[1] i[0].update end end end @iCON_target = [] end end class Arrow_Enemy < Arrow_Base alias DPX_update update def update DPX_update() $game_system.get_DPX_self_temp(self) end end class Arrow_Actor < Arrow_Base alias DPX_update2 update def update DPX_update2() $game_system.get_DPX_self_temp(self) end end class Scene_Battle alias dPX_Arrow_update update def update dPX_Arrow_update() cpicon_update end alias old_main main def main @count = 0 old_main end def cpicon_update set = $game_system.get_DPX_ICON_temp for i in set iCON_target = $game_system.get_icon_target if iCON_target != [] && iCON_target != nil i[0].update if iCON_target.is_a?(Arrow_Actor) if iCON_target.actor == i[1] @count += 1 CPicon_flash(@count,i) @count = 0 if @count == 20 else cpicon_reset end else if iCON_target.enemy == i[1] @count += 1 CPicon_flash(@count,i) @count = 0 if @count == 20 else cpicon_reset end end end end end alias dpx_update_phase4 update_phase4 def update_phase4 $game_system.reset_icon_target dpx_update_phase4 end alias dpx_update_phase3 update_phase3 def update_phase3 $game_system.reset_icon_target dpx_update_phase3 end def CPicon_flash(count,set) if count % XRXS65A::Flash_interval == 0 set[0].flash(XRXS65A::Flash_color, XRXS65A::Flash_duration) else end end def cpicon_reset end end class CP_Meters #-------------------------------------------------------------------------- # ○ オブジェクト初期化 #-------------------------------------------------------------------------- def initialize # シンセゲージの生成 @base = Sprite.new @base.bitmap = RPG::Cache.windowskin(XRXS65A::SKIN).dup @base.x = XRXS65A::X @base.y = XRXS65A::Y @base.z = XRXS65A::X @width = @base.bitmap.width - 12 @height = @base.bitmap.height @icon_set = [] $game_system.new_DPX_ICON_temp refresh end #-------------------------------------------------------------------------- # ○ リフレッシュ #-------------------------------------------------------------------------- def refresh # 生成すべきバトラーの取得 need_initializes = [] for battler in $game_party.actors + $game_troop.enemies exist = false for set in @icon_set exist |= (set[1] == battler) end need_initializes.push(battler) unless exist end for battler in need_initializes iconname = nil if battler.is_a?(Game_Actor) iconname = XRXS65A::ICONS[battler.id] else iconname = XRXS65A::ICONE[battler.id] end if iconname == nil iconname = XRXS65A::DEFAULT end sprite = Sprite.new sprite.bitmap = RPG::Cache.icon(iconname).dup sprite.y = XRXS65A::Y + @height / 2 - 12 @icon_set.push([sprite, battler]) #DPX修改 $game_system.push_DPX_ICON_temp([sprite, battler]) end # 更新 for set in @icon_set set[0].x = XRXS65A::X + @width * set[1].cp / set[1].max_cp - 12 set[0].z = set[0].x set[0].visible = false if set[1].dead? or !set[1].exist? if set[1].dead? or !set[1].exist? $game_system.remove_DPX_temp(set[1]) end #解决复活后图标消失 set[0].visible = true if !set[1].dead? or set[1].exist? set[0].update end end #-------------------------------------------------------------------------- # ○ 可視状態 #-------------------------------------------------------------------------- def visible=(b) @base.visible = b @icon_set.each{|set| set[0].visible = b } end #-------------------------------------------------------------------------- # ○ 解放 #-------------------------------------------------------------------------- def dispose @base.dispose @icon_set.each{|set| set[0].dispose } $game_system.new_DPX_ICON_temp end end
377.92 KB, 阅读权限: 10, 下载次数: 23
附件中包含了人物行动条图标的psd文件
soulsaga 发表于 2023-12-26 09:54
也可以弄合体技....
soulsaga 发表于 2023-12-29 12:48
也可以写个降低施法被中断概率的状态
甚至霸体
还有附加了特定状态的攻击才能打断等等 ...
欢迎光临 Project1 (https://rpg.blue/) | Powered by Discuz! X3.1 |