查看: 3341|回复: 8

[已经解决] 求给这个特技升级脚本增加几个功能

[复制链接]
梦石
0
星屑
105
在线时间
2107 小时
注册时间
2011-2-23
回帖
72
发表于 2013-1-19 09:17:06 | 显示全部楼层 |阅读模式
悬赏12星屑已解决
1、特技升级到一定等级自动学会新技能。(就是下面66行开始那里,可以自己设定的那种就可以)。
2、特技升级到一定等级,自动学会新技能的同时,遗忘旧技能,并且新的技能保留旧技能的等级。(这个不知道能不能实现。其实是为了实现一种技能升级到一定程度以后,可以增加更多功能的效果,比如变成群攻。就是1号技能(单体攻击)达到一定等级之后变成2号技能(群攻),但是游戏画面看起来还是那个特技,只是功能改了。)
3、460行那里被我自己改成用图片显示了,可是显示的位置实在是太囧了,不知道能不能顺便帮忙改成按照角色的坐标位置显示?
自己感觉好像就是加上学习和遗忘的语句和判断特技现在的等级的问题,应该不是很难吧?v不够可以再加的,希望有哪位可以帮忙。谢谢~

[pre lang="" line="1"]#==============================================================================
# ■ スキルアップデート   Ver. 4.4.0                     
#     スキルごとにレベル制を導入する
#     戦闘中にスキルを使用するほど、威力上昇、消費SP減少、命中率上昇
#


module Skill_updata
  S_MIGHT = []
  S_COST = []
  S_HIT = []
  S_LEVEL = []
  S_INTER = []
  S_SLOPE = []
  S_ANIME = []
  S_ELEMENT = []
  S_STATE_P = []
  S_STATE_N = []
#==============================================================================
# □ 自定义内容
#==============================================================================
  # 威力上升使用true/false
  SKILL_MIGHT_UP = true
  
  # SP消耗减少使用true/false
  SP_COST_DOWN = true      
  
  # 命中率上升使用true/false
  SKILL_HIT_UP = true      
  
  # 属性变化的使用true/false
  ELEMENT_CHANGE = true   
  
  # 状态变化的使用true/false
  STATE_CHANGE = true
  
  # 显示特技等级上升true/false
  SHOW_SKILL_LV_UP = true
  
  # 等级上升的声效,不用的时候就=nil
  SKILLUP_SE = "056-Right02"
  
  # 菜单使用计数true/false
  MENU_COUNT = true

  # 升级所需次数
  UPDATA_INTERVAL = 0
  
  # 等级上限
  LEVEL_LIMIT = 30

  # 威力上升率(%%)
  MIGHT_RATE = 5
  
  # SP消耗减少率(%)
  COST_RATE = 1
  
  # 命中上升率(%)
  HIT_RATE = 3

  #----------------------------------------------------------------------------
  # 特别技能的详细设定,57和61号特技分别是十字斩和扫荡,大家最熟悉的两个招数
  #----------------------------------------------------------------------------
  
  # 界限水平
  # S_LEVEL[技艺ID]=[角色ID=>界限,…]
  S_LEVEL[59] = {1=>18, 2=>12, 3=>5, 4=>12, 5=>12, 6=>12, 7=>12, 8=>12}
  S_LEVEL[60] = {1=>12, 2=>18, 3=>15, 4=>12, 5=>12, 6=>12, 7=>12, 8=>12}
     
  # 技艺&actor威力上升率
  # S_MIGHT[技艺ID]=[角色ID=>威力上升率,…]
  S_MIGHT[59] = {1=>8, 2=>2, 3=>5, 4=>2, 5=>2, 6=>2, 7=>2, 8=>2}
  S_MIGHT[60] = {1=>2, 2=>8, 3=>5, 4=>2, 5=>2, 6=>2, 7=>2, 8=>2}

  # 技艺&actorSP消费减少率
  # S_COST[技艺ID]=[角色ID=>SP消费减少率,…]
  S_COST[59] = {1=>8, 2=>2, 3=>5, 4=>2, 5=>2, 6=>2, 7=>2, 8=>2}
  S_COST[60] = {1=>2, 2=>8, 3=>5, 4=>2, 5=>2, 6=>2, 7=>2, 8=>2}

  # 技艺&actor命中率
  # S_HIT[技艺ID]=[角色ID=>命中上升率,…]
  S_HIT[59] = {1=>2, 2=>1, 3=>1, 4=>1, 5=>1, 6=>1, 7=>1, 8=>1}
  S_HIT[60] = {1=>1, 2=>2, 3=>1, 4=>1, 5=>1, 6=>1, 7=>1, 8=>1}

  #----------------------------------------------------------------------------
  # 技能成长的具体调节
  #----------------------------------------------------------------------------
  # 技艺的增长图形
  # 0:使用技艺一定回数的话提高水平
  # 1:技艺一定回数+每水平の使用提高水平
  SKILL_PATTERN = 1
  
  # 技艺水平上升间隔每(使用几回Lv提高)
  #   ※没有设定的情况→基本设定被适应
  # S_INTER[技艺ID]=[actorID=>上升间隔,…]
  S_INTER[81] = {1=>5, 2=>8, 3=>8, 4=>8, 5=>8, 6=>8, 7=>8, 8=>8}
  
  # スキルレベル上昇の傾き(パターン1を使用する場合のみ必要)
  #   ※設定がない場合は1となります。
  # S_SLOPE[スキルID] = [アクターID=>上昇の傾き, …]
  S_SLOPE[57] = {1=>5, 2=>8, 3=>8, 4=>8, 5=>8, 6=>8, 7=>8, 8=>8}

  #----------------------------------------------------------------------------
  # 技艺增长的话使之动画变化
  #  记录格式: S_ANIME[技艺ID] = [角色ID=>[[等级, 动画ID]], ・・・]
  #----------------------------------------------------------------------------
  # 实施技艺增长的动画变化?
  USE_S_ANIME = true
  
  # 設定例
  # 1号角色,57号特技,lv5,lv10动画变化
  # 2号角色,Lv.11动画变化
  S_ANIME[57] = {1=>[[5, 69], [10, 70]], 2=>[[11, 70]]}

  #----------------------------------------------------------------------------
  # 属性変化/状态変化
  #----------------------------------------------------------------------------
  # 属性変化
  # S_ELEMENT[技艺ID] = {角色ID=>{水平=>[属性ID,属性ID…]}, ・・・・}
  S_ELEMENT[57] = {1=>{1=>[1], 2=>[2], 3=>[3]}, 2=>{1=>[2], 2=>[5]}}

  # 状态変化+
  # S_STATE_P[技艺ID] = {角色ID=>{水平=>[属性ID,属性ID…]}, ・・・・}
  S_STATE_P[57] = {1=>{1=>[1], 2=>[2], 3=>[3]}, 2=>{1=>[2], 2=>[5]}}

  # 状态変化-
  # S_STATE_N[技艺ID] = {角色ID=>{水平=>[属性ID,属性ID…]}, ・・・・}
  S_STATE_N[57] = {1=>{1=>[1], 2=>[2], 3=>[3]}, 2=>{1=>[2], 2=>[5]}}

#==============================================================================
# □ 自定义内容终了
#==============================================================================
end


class Game_Actor
  include Skill_updata
  attr_accessor   :skill_use      # スキル使用回数
  attr_accessor   :skill_level    # スキルレベル
  attr_accessor   :skill_power    # スキル威力更新値
  attr_accessor   :skill_sp_cost  # スキルSP消費更新値
  attr_accessor   :skill_hit      # スキル命中率
  attr_accessor   :skill_up       # レベルアップフラグ
  attr_accessor   :skill_list     # スキルEXPリスト
  alias skill_updata_init setup
  def setup(actor_id)
    skill_updata_init(actor_id)
    @skill_use = []
    @skill_level = []
    @skill_power = []
    @skill_sp_cost = []
    @skill_hit = []
    @skill_up = false
    @skill_list = []
    for id in 1...$data_skills.size
      @skill_use[id] = 0
      @skill_level[id] = 0
      @skill_power[id] = $data_skills[id].power
      @skill_sp_cost[id] = $data_skills[id].sp_cost
      @skill_hit[id] = $data_skills[id].hit
      @skill_list[id] = make_skill_list(id)
    end
  end

  #--------------------------------------------------------------------------
  # ● スキルEXP 計算
  #--------------------------------------------------------------------------
  def make_skill_list(skill_id)
    interval = S_INTER[skill_id]
    up_interval = ( (interval != nil and interval[@actor_id] != nil) ? interval[@actor_id] : UPDATA_INTERVAL )
    slope = S_SLOPE[skill_id]
    up_slope = ( (slope != nil and slope[@actor_id] != nil) ? slope[@actor_id] : 1 )
    limit = S_LEVEL[skill_id]
    limit_lv = ( (limit != nil and limit[@actor_id] != nil) ? limit[@actor_id] : LEVEL_LIMIT )
    list = []
    list[0] = 0
    for lv in 1...limit_lv+1
      exp = 0
      case SKILL_PATTERN
      when 0
        exp = up_interval * lv
      when 1
        exp = list[lv-1] + up_slope * lv + up_interval
      end
      list[lv] = exp.truncate
    end
    return list
  end
end


class Game_Battler
  include Skill_updata
  #--------------------------------------------------------------------------
  # ● スキルの効果適用
  #     user  : スキルの使用者 (バトラー)
  #     skill : スキル
  #--------------------------------------------------------------------------
  alias skill_effect_update skill_effect
  def skill_effect(user, skill)
    up_flag = false
    if user.is_a?(Game_Actor) and ($scene.is_a?(Scene_Battle) or MENU_COUNT)
      skill_update_main(user, skill)
      skill_base = skill.dup
      # 威力上昇
      if SKILL_MIGHT_UP
        skill.power = user.skill_power[skill.id]
      end
      # 命中率上昇
      if SKILL_HIT_UP
        skill.hit = user.skill_hit[skill.id]
      end
      # 属性変化
      if ELEMENT_CHANGE and S_ELEMENT != []
        ele1 = S_ELEMENT[skill.id]
        if ele1 != nil and ele1[user.id] != nil
          ele2 = ele1[user.id]
          if ele2 != [] and ele2[user.skill_level[skill.id]] != nil
            skill.element_set = ele2[user.skill_level[skill.id]]
          end
        end
      end
      # ステート変化
      if STATE_CHANGE
        if S_STATE_P != []
          pst1 = S_STATE_P[skill.id]
          if pst1 != nil and pst1[user.id] != nil
            pst2 = pst1[user.id]
            if pst2 != nil and pst2[user.skill_level[skill.id]] != nil
              skill.plus_state_set = pst2[user.skill_level[skill.id]]
              p skill.plus_state_set
            end
          end
        end
        if S_STATE_N != []
          nst1 = S_STATE_N[skill.id]
          if nst1 != nil and nst1[user.id] != nil
            nst2 = nst1[user.id]
            if nst1 != nil and nst2[user.skill_level[skill.id]] != nil
              skill.minus_state_set = nst2[user.skill_level[skill.id]]
            end
          end
        end
      end
      up_flag = true
    end
    ret = skill_effect_update(user, skill)    # 原物
    if up_flag
      skill = skill_base
      # Miss時には後戻し
      if self.damage == "Miss"
        skill_use_recount(user, skill)
      end
    end
    return ret
  end
  
  #--------------------------------------------------------------------------
  # ● スキルアップデータメイン
  #--------------------------------------------------------------------------
  def skill_update_main(actor, skill)
    # スキル使用回数のカウント
    actor.skill_use[skill.id] += 1
    # リミット取得
    limit = S_LEVEL[skill.id]
    s_limit = ( (limit != nil and limit[actor.id] != nil) ? limit[actor.id] : LEVEL_LIMIT)
    # 書き換え限界到達
    if s_limit == false or actor.skill_level[skill.id] < s_limit
      # レベルアップ間隔取得
      interval = actor.skill_list[skill.id]
      # 書き換え回数到達
      if actor.skill_use[skill.id] == interval[actor.skill_level[skill.id]+1]
        # スキルレベル上昇
        actor.skill_level[skill.id] += 1
        actor.skill_up = true
        # 威力上昇 = 有効
        if SKILL_MIGHT_UP
          might = S_MIGHT[skill.id]
          might_rate = ((might != nil and might[actor.id] != nil) ? might[actor.id] : MIGHT_RATE)
          # 補正値更新
          actor.skill_power[skill.id] += skill.power * might_rate / 100
          actor.skill_power[skill.id] = actor.skill_power[skill.id].truncate
        end
        # SP消費減少 = 有効
        if SP_COST_DOWN
          cost = S_COST[skill.id]
          cost_rate = ((cost != nil and cost[actor.id] != nil) ? cost[actor.id] : COST_RATE)
          actor.skill_sp_cost[skill.id] -= skill.sp_cost * cost_rate / 100
          actor.skill_sp_cost[skill.id] = actor.skill_sp_cost[skill.id].truncate
          # SP消費が0以下はありえない
          if actor.skill_sp_cost[skill.id] < 0
            actor.skill_sp_cost[skill.id] = 0
          end
        end
        # 命中率上昇 = 有効
        if SKILL_HIT_UP
          hit = S_HIT[skill.id]
          hit_rate = ((hit != nil and hit[actor.id] != nil) ? hit[actor.id] : HIT_RATE)
          actor.skill_hit[skill.id] += skill.hit * hit_rate / 100
          actor.skill_hit[skill.id] = actor.skill_hit[skill.id].truncate
          # 100以上はありえない
          if actor.skill_hit[skill.id] > 100
            actor.skill_hit[skill.id] = 100
          end
        end
      end
    end
  end
  
  #--------------------------------------------------------------------------
  # ● 再カウント
  #--------------------------------------------------------------------------
  def skill_use_recount(actor, skill)
    if actor.skill_up
      actor.skill_level[skill.id] -= 1
      # 威力を再計算
      if SKILL_MIGHT_UP
        actor.skill_power[skill.id] = skill.power
        might = S_MIGHT[skill.id]
        might_rate = ((might != nil and might[actor.id] != nil) ? might[actor.id] : MIGHT_RATE)
        for i in 1...actor.skill_level[skill.id]
          actor.skill_power[skill.id] += skill.power * might_rate / 100
          actor.skill_power[skill.id] = actor.skill_power[skill.id].truncate
        end
      end
      # SP消費再計算
      if SP_COST_DOWN
        actor.skill_sp_cost[skill.id] = skill.sp_cost
        cost = S_COST[skill.id]
        cost_rate = ((cost != nil and cost[actor.id] != nil) ? cost[actor.id] : COST_RATE)
        for i in 1...actor.skill_level[skill.id]
          actor.skill_sp_cost[skill.id] -= skill.sp_cost * cost_rate / 100
          actor.skill_sp_cost[skill.id] = actor.skill_sp_cost[skill.id].truncate
        end
        # SP消費が0以下はありえない
        if actor.skill_sp_cost[skill.id] < 0
          actor.skill_sp_cost[skill.id] = 0
        end
      end
      # 命中率再計算
      if SKILL_HIT_UP
        actor.skill_hit[skill.id] = skill.hit
        hit = S_HIT[skill.id]
        hit_rate = ((hit != nil and hit[actor.id] != nil) ? hit[actor.id] : HIT_RATE)
        for i in 1...actor.skill_level[skill.id]
          actor.skill_hit[skill.id] += skill.hit * hit_rate / 100
          actor.skill_hit[skill.id] = actor.skill_hit[skill.id].truncate
        end
        # 100以上はありえない
        if actor.skill_hit[skill.id] > 100
          actor.skill_hit[skill.id] = 100
        end
      end
      actor.skill_up = false
    end
    actor.skill_use[skill.id] -= 1
  end
end

#==============================================================================
# スキル成長によるアニメーション変化
#==============================================================================
class Scene_Battle
  include Skill_updata
  #--------------------------------------------------------------------------
  # ● フレーム更新 (メインフェーズ ステップ 4 : 対象側アニメーション)
  #--------------------------------------------------------------------------
  alias update_phase4_step4_skillup update_phase4_step4
  def update_phase4_step4
    update_phase4_step4_skillup
    if @active_battler.is_a?(Game_Actor) and USE_S_ANIME
      s_anime = S_ANIME[@skill.id]
      # 設定がないなら無視
      if s_anime != nil and s_anime[@active_battler.id] != nil
        s_anime_set = s_anime[@active_battler.id]
        for i in 0...s_anime_set.size
          s_anime_def = s_anime_set
          # 規定レベル以上
          if @active_battler.skill_level[@skill.id] >= s_anime_def[0]
            # 対象側アニメーション
            for target in @target_battlers
              target.animation_id = s_anime_def[1]
            end
          end
        end
      end
    end
  end
end

#==============================================================================
# 以下、レベルアップ表示部分(レベルアップ表示がいらないなら消してもOK)
#==============================================================================
class Scene_Battle
  include Skill_updata
  if SHOW_SKILL_LV_UP
  #--------------------------------------------------------------------------
  # ● フレーム更新 (メインフェーズ ステップ 2 : アクション開始)
  #--------------------------------------------------------------------------
  alias update_phase4_step2_skillup update_phase4_step2
  def update_phase4_step2
    if @active_battler.is_a?(Game_Actor)
      @active_battler.skill_up = false
    end
    @skillup = false
    update_phase4_step2_skillup   # 原物
  end

  #--------------------------------------------------------------------------
  # ● フレーム更新 (メインフェーズ ステップ 3 : 行動側アニメーション)
  #--------------------------------------------------------------------------
  alias update_phase4_step3_skillup update_phase4_step3
  def update_phase4_step3
    if @active_battler.is_a?(Game_Actor) and @active_battler.skill_up != false
      @skillup = true
      @skill_up_window = Window_Skillup.new(@active_battler)
      if SKILLUP_SE != nil
        Audio.se_play("Audio/SE/" + SKILLUP_SE)
        sleep(0.1)
      end
    end
    update_phase4_step3_skillup
  end

  #--------------------------------------------------------------------------
  # ● フレーム更新 (メインフェーズ ステップ 5 : ダメージ表示)
  #--------------------------------------------------------------------------
  alias update_phase4_step5_skillup update_phase4_step5
  def update_phase4_step5
    if @active_battler.is_a?(Game_Actor) and @skillup
      @skill_up_window.dispose
      @active_battler.skill_up = false
      @skillup = false
    end
    update_phase4_step5_skillup     # 原物
  end

  #--------------------------------------------------------------------------
  # ● フレーム更新
  #--------------------------------------------------------------------------
  alias update_skillup update
  def update
    if @active_battler.is_a?(Game_Actor) and @active_battler.skill_up and @skillup
      @skill_up_window.contents_opacity -= 4
    end
    update_skillup              # 原物
  end
  end # if SHOW_SKILL_LV_UP
end

class Window_Skillup < Window_Base
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #     actor : アクター
  #--------------------------------------------------------------------------
  def initialize(actor)
    super(actor.screen_x-140, 260, 250, 64)
    self.contents = Bitmap.new(width - 32, height - 32)
    self.opacity = 0
    bitmap = RPG::Cache.picture("美化/特技升級提示") #改成用图片显示,可是位置……
    self.contents.blt(80, 0, bitmap, bitmap.rect)
   # self.contents.font.color = Color.new(255, 64, 0)
  # self.contents.draw_text(80, 0, 150, 32, "特级升级!")
  end
end



#==============================================================================
# 以下、再定義部分を含む(SP消費減少の機能がいらないなら消してもOK)
#==============================================================================
class Window_Skill < Window_Selectable
  #--------------------------------------------------------------------------
  # ● 項目の描画
  #     index : 項目番号
  #--------------------------------------------------------------------------
  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)
#-修正-----
    @actor.skill_level[skill.id] = 0 if @actor.skill_level[skill.id] == nil
    name_level = skill.name + "(" + @actor.skill_level[skill.id].to_s + ")"
    self.contents.draw_text(x + 28, y, 204, 32, name_level, 0)
    @actor.skill_sp_cost[skill.id] = skill.sp_cost if @actor.skill_sp_cost[skill.id] == nil
    self.contents.draw_text(x + 232, y, 48, 32, @actor.skill_sp_cost[skill.id].to_s, 2)
#----------
  end
end

class Scene_Skill
  #--------------------------------------------------------------------------
  # ● フレーム更新 (ターゲットウィンドウがアクティブの場合)
  #--------------------------------------------------------------------------
  def update_target
    # B ボタンが押された場合
    if Input.trigger?(Input::B)
      # キャンセル SE を演奏
      $game_system.se_play($data_system.cancel_se)
      # ターゲットウィンドウを消去
      @skill_window.active = true
      @target_window.visible = false
      @target_window.active = false
      return
    end
    # C ボタンが押された場合
    if Input.trigger?(Input::C)
      # SP 切れなどで使用できなくなった場合
      unless @actor.skill_can_use?(@skill.id)
        # ブザー SE を演奏
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      # ターゲットが全体の場合
      if @target_window.index == -1
        # パーティ全体にスキルの使用効果を適用
        used = false
        for i in $game_party.actors
          used |= i.skill_effect(@actor, @skill)
        end
      end
      # ターゲットが使用者の場合
      if @target_window.index <= -2
        # ターゲットのアクターにスキルの使用効果を適用
        target = $game_party.actors[@target_window.index + 10]
        used = target.skill_effect(@actor, @skill)
      end
      # ターゲットが単体の場合
      if @target_window.index >= 0
        # ターゲットのアクターにスキルの使用効果を適用
        target = $game_party.actors[@target_window.index]
        used = target.skill_effect(@actor, @skill)
      end
      # スキルを使った場合
      if used
        # スキルの使用時 SE を演奏
        $game_system.se_play(@skill.menu_se)
#-----修正------------------------------------------------------
        @actor.skill_sp_cost[@skill.id] = @skill.sp_cost if @actor.skill_sp_cost[@skill.id] == nil
        # SP 消費
        @actor.sp -= @actor.skill_sp_cost[@skill.id]
#---------------------------------------------------------------
        # 各ウィンドウの内容を再作成
        @status_window.refresh
        @skill_window.refresh
        @target_window.refresh
        # 全滅の場合
        if $game_party.all_dead?
          # ゲームオーバー画面に切り替え
          $scene = Scene_Gameover.new
          return
        end
        # コモンイベント ID が有効の場合
        if @skill.common_event_id > 0
          # コモンイベント呼び出し予約
          $game_temp.common_event_id = @skill.common_event_id
          # マップ画面に切り替え
          $scene = Scene_Map.new
          return
        end
      end
      # スキルを使わなかった場合
      unless used
        # ブザー SE を演奏
        $game_system.se_play($data_system.buzzer_se)
      end
      return
    end
  end
end

class Scene_Battle
  include Skill_updata
  #--------------------------------------------------------------------------
  # ● スキルアクション 結果作成
  #--------------------------------------------------------------------------
  alias make_skill_action_result_skill_update make_skill_action_result
  def make_skill_action_result
    make_skill_action_result_skill_update
    # SP 消費
    if SP_COST_DOWN and @active_battler.is_a?(Game_Actor)
      @active_battler.sp += @skill.sp_cost
      @active_battler.sp -= @active_battler.skill_sp_cost[@skill.id]
    end
  end
end

class Game_Battler
  #--------------------------------------------------------------------------
  # ● スキルの使用可能判定
  #     skill_id : スキル ID
  #--------------------------------------------------------------------------
  alias skill_update_can_use? skill_can_use?
  def skill_can_use?(skill_id)
    ret = skill_update_can_use?(skill_id)
    if !ret and SP_COST_DOWN
      # SP が足りない場合は使用不可となった?
      if $data_skills[skill_id].sp_cost > self.sp
        if self.is_a?(Game_Actor)
          skill_sp_cost = self.skill_sp_cost[skill_id]
          if skill_sp_cost < self.sp
            ret = true
          end
        end
      end
    end
    return ret
  end
end

#==============================================================================
# イベントスクリプト操作
#==============================================================================
class Interpreter
  include Skill_updata
  #--------------------------------------------------------------------------
  # ● スキルレベル設定(レベルセット)
  #     actor_id  :   アクターID
  #     skill_id  :   スキルID
  #     level     :   設定レベル
  #--------------------------------------------------------------------------
  def set_skill_level(actor_id, skill_id, level)
    actor = $game_actors[actor_id]
    skill = $data_skills[skill_id]
    # リミット取得
    limit = S_LEVEL[skill_id]
    s_limit = ( (limit != nil and limit[actor.id] != nil) ? limit[actor.id] : LEVEL_LIMIT)
    if level > s_limit or level < 0
      return
    end
    # レベル
    actor.skill_level[skill.id] = level
    # 使用回数
    use_list = actor.skill_list[skill.id]
    actor.skill_use[skill.id] = use_list[level]
    # 威力を再計算
    if SKILL_MIGHT_UP
      actor.skill_power[skill.id] = skill.power
      might = S_MIGHT[skill.id]
      might_rate = ((might != nil and might[actor.id] != nil) ? might[actor.id] : MIGHT_RATE)
      for i in 0...level
        actor.skill_power[skill.id] += skill.power * might_rate / 100
        actor.skill_power[skill.id] = actor.skill_power[skill.id].truncate
      end
    end
    # SP消費再計算
    if SP_COST_DOWN
      actor.skill_sp_cost[skill.id] = skill.sp_cost
      cost = S_COST[skill.id]
      cost_rate = ((cost != nil and cost[actor.id] != nil) ? cost[actor.id] : COST_RATE)
      for i in 0...level
        actor.skill_sp_cost[skill.id] -= skill.sp_cost * cost_rate / 100
        actor.skill_sp_cost[skill.id] = actor.skill_sp_cost[skill.id].truncate
      end
      # SP消費が0以下はありえない
      if actor.skill_sp_cost[skill.id] < 0
        actor.skill_sp_cost[skill.id] = 0
      end
    end
    # 命中率再計算
    if SKILL_HIT_UP
      actor.skill_hit[skill.id] = skill.hit
      hit = S_HIT[skill.id]
      hit_rate = ((hit != nil and hit[actor.id] != nil) ? hit[actor.id] : HIT_RATE)
      for i in 0...level
        actor.skill_hit[skill.id] += skill.hit * hit_rate / 100
        actor.skill_hit[skill.id] = actor.skill_hit[skill.id].truncate
      end
      # 100以上はありえない
      if actor.skill_hit[skill.id] > 100
        actor.skill_hit[skill.id] = 100
      end
    end
  end
  
  #--------------------------------------------------------------------------
  # ● スキルレベル設定(レベルアップ)
  #     actor_id  :   アクターID
  #     skill_id  :   スキルID
  #--------------------------------------------------------------------------
  def skill_level_up(actor_id, skill_id)
    actor = $game_actors[actor_id]
    set_skill_level(actor_id, skill_id, actor.skill_level[skill_id]+1)
  end
  
  #--------------------------------------------------------------------------
  # ● スキルレベル設定(レベルダウン)
  #     actor_id  :   アクターID
  #     skill_id  :   スキルID
  #--------------------------------------------------------------------------
  def skill_level_down(actor_id, skill_id)
    actor = $game_actors[actor_id]
    set_skill_level(actor_id, skill_id, actor.skill_level[skill_id]-1)
  end
end

#==============================================================================
#==============================================================================[/pre]

最佳答案

查看完整内容

我用了你给我那个脚本还是会显示对话框,于是我就去google找了一下,找到了这个脚本的最新版本4.4升级到5.2了。 我在5.2的基础上给你添加了功能,你先测试一下。 1、打开工程后读取进度,我已经打了几场,下一场技能就会升级。 2、进入战斗后,使用十字斩,会升级,删除十字斩领悟扫荡,扫荡会继承十字斩的技能等级。 3、再次使用扫荡,会领悟火炎。 你可以打开工程测试一下设置其他技能会不会报错,搜索羞射了。 ...
梦石
0
星屑
47
在线时间
976 小时
注册时间
2011-4-30
回帖
846
发表于 2013-1-19 09:17:07 | 显示全部楼层
君子兰 发表于 2013-1-19 11:04
好的,我自己没有改之前是这样的。
#================================================================ ...

Project2.rar (207.29 KB, 下载次数: 105)

我用了你给我那个脚本还是会显示对话框,于是我就去google找了一下,找到了这个脚本的最新版本4.4升级到5.2了。

我在5.2的基础上给你添加了功能,你先测试一下。

1、打开工程后读取进度,我已经打了几场,下一场技能就会升级。

2、进入战斗后,使用十字斩,会升级,删除十字斩领悟扫荡,扫荡会继承十字斩的技能等级。

3、再次使用扫荡,会领悟火炎。

你可以打开工程测试一下设置其他技能会不会报错,搜索羞射了。

点评

好的,感谢您啊!我先试试看~  发表于 2013-1-19 13:47
湿滑落式骑!
回复

使用道具 举报

梦石
0
星屑
47
在线时间
976 小时
注册时间
2011-4-30
回帖
846
发表于 2013-1-19 10:45:16 | 显示全部楼层
我尝试了一下,提几个问题

1、你需要的是升级后学习?遗忘?继承?这功能当然类似的,但是细分需要做成三个功能,是都需要还是只需要替换技能继承等级?

2、升级前为什么会跳出个对话框显示[1]?你还改过些什么?
湿滑落式骑!
回复

使用道具 举报

梦石
0
星屑
105
在线时间
2107 小时
注册时间
2011-2-23
回帖
72
 楼主| 发表于 2013-1-19 10:56:24 | 显示全部楼层
本帖最后由 君子兰 于 2013-1-19 11:59 编辑
羞射了 发表于 2013-1-19 11:45
我尝试了一下,提几个问题

1、你需要的是升级后学习?遗忘?继承?这功能当然类似的,但是细分需要做成三 ...


1、里面的1和2我希望是分成两个的,问题1就是纯粹的比如技能a达到了一定等级之后,就学会技能b。
问题2则是就类似“继承”吧。就是比如技能a到了8级之后,学会技能b,而技能a则被遗忘,而技能b在学会的时候就已经是8级了这样,……我的语言表达能力比较差,真是不好意思!不知道这个会不会很难?主要就是希望原本技能a比如设定的是单体攻击,但是8级以后可以自动变成全体攻击。但是我个人对脚本不是太懂,这样的设定太难了,所以才想可不可以通过这个特技升级的脚本来实现?


2、问题3里面提到的,我把那个升级提示改成用图片提示了,不知道是不是有关系?(就是460行的那里,原来用文字直接显示的被我注释掉了,自己加的用图片显示)。其他的地方应该都没有修改了……
回复

使用道具 举报

梦石
0
星屑
47
在线时间
976 小时
注册时间
2011-4-30
回帖
846
发表于 2013-1-19 11:00:13 | 显示全部楼层
君子兰 发表于 2013-1-19 10:56
1、里面的1和2我希望是分成两个的,问题1就是纯粹的比如技能a达到了一定等级之后,就学会技能b。
问题2则 ...

有没有原版的这个脚本给我贴一下。
湿滑落式骑!
回复

使用道具 举报

梦石
0
星屑
105
在线时间
2107 小时
注册时间
2011-2-23
回帖
72
 楼主| 发表于 2013-1-19 11:04:43 | 显示全部楼层
羞射了 发表于 2013-1-19 12:00
有没有原版的这个脚本给我贴一下。

好的,我自己没有改之前是这样的。
[pre lang="" line="1"]#==============================================================================
# ■ スキルアップデート   Ver. 4.4.0                     
#------------------------------------------------------------------------------
#     スキルごとにレベル制を導入する
#     戦闘中にスキルを使用するほど、威力上昇、消費SP減少、命中率上昇
#==============================================================================

module Skill_updata
  S_MIGHT = []
  S_COST = []
  S_HIT = []
  S_LEVEL = []
  S_INTER = []
  S_SLOPE = []
  S_ANIME = []
  S_ELEMENT = []
  S_STATE_P = []
  S_STATE_N = []
#==============================================================================
# □ 自定义内容
#==============================================================================
  # 威力上升使用true/false
  SKILL_MIGHT_UP = true
  
  # SP消耗减少使用true/false
  SP_COST_DOWN = true      
  
  # 命中率上升使用true/false
  SKILL_HIT_UP = true      
  
  # 属性变化的使用true/false
  ELEMENT_CHANGE = true   
  
  # 状态变化的使用true/false
  STATE_CHANGE = true
  
  # 显示特技等级上升true/false
  SHOW_SKILL_LV_UP = true
  
  # 等级上升的声效,不用的时候就=nil
  SKILLUP_SE = "056-Right02"
  
  # 菜单使用计数true/false
  MENU_COUNT = true

  # 升级所需次数
  UPDATA_INTERVAL = 0
  
  # 等级上限
  LEVEL_LIMIT = 10

  # 威力上升率(%%)
  MIGHT_RATE = 5
  
  # SP消耗减少率(%)
  COST_RATE = 5
  
  # 命中上升率(%)
  HIT_RATE = 1

  #----------------------------------------------------------------------------
  # 特别技能的详细设定,57和61号特技分别是十字斩和扫荡,大家最熟悉的两个招数
  #----------------------------------------------------------------------------
  
  # 界限水平
  # S_LEVEL[技艺ID]=[角色ID=>界限,…]
  S_LEVEL[59] = {1=>18, 2=>12, 3=>5, 4=>12, 5=>12, 6=>12, 7=>12, 8=>12}
  S_LEVEL[60] = {1=>12, 2=>18, 3=>15, 4=>12, 5=>12, 6=>12, 7=>12, 8=>12}
     
  # 技艺&actor威力上升率
  # S_MIGHT[技艺ID]=[角色ID=>威力上升率,…]
  S_MIGHT[59] = {1=>8, 2=>2, 3=>5, 4=>2, 5=>2, 6=>2, 7=>2, 8=>2}
  S_MIGHT[60] = {1=>2, 2=>8, 3=>5, 4=>2, 5=>2, 6=>2, 7=>2, 8=>2}

  # 技艺&actorSP消费减少率
  # S_COST[技艺ID]=[角色ID=>SP消费减少率,…]
  S_COST[59] = {1=>8, 2=>2, 3=>5, 4=>2, 5=>2, 6=>2, 7=>2, 8=>2}
  S_COST[60] = {1=>2, 2=>8, 3=>5, 4=>2, 5=>2, 6=>2, 7=>2, 8=>2}

  # 技艺&actor命中率
  # S_HIT[技艺ID]=[角色ID=>命中上升率,…]
  S_HIT[59] = {1=>2, 2=>1, 3=>1, 4=>1, 5=>1, 6=>1, 7=>1, 8=>1}
  S_HIT[60] = {1=>1, 2=>2, 3=>1, 4=>1, 5=>1, 6=>1, 7=>1, 8=>1}

  #----------------------------------------------------------------------------
  # 技能成长的具体调节
  #----------------------------------------------------------------------------
  # 技艺的增长图形
  # 0:使用技艺一定回数的话提高水平
  # 1:技艺一定回数+每水平の使用提高水平
  SKILL_PATTERN = 1
  
  # 技艺水平上升间隔每(使用几回Lv提高)
  #   ※没有设定的情况→基本设定被适应
  # S_INTER[技艺ID]=[actorID=>上升间隔,…]
  S_INTER[81] = {1=>5, 2=>8, 3=>8, 4=>8, 5=>8, 6=>8, 7=>8, 8=>8}
  
  # スキルレベル上昇の傾き(パターン1を使用する場合のみ必要)
  #   ※設定がない場合は1となります。
  # S_SLOPE[スキルID] = [アクターID=>上昇の傾き, …]
  S_SLOPE[57] = {1=>5, 2=>8, 3=>8, 4=>8, 5=>8, 6=>8, 7=>8, 8=>8}

  #----------------------------------------------------------------------------
  # 技艺增长的话使之动画变化
  #  记录格式: S_ANIME[技艺ID] = [角色ID=>[[等级, 动画ID]], ・・・]
  #----------------------------------------------------------------------------
  # 实施技艺增长的动画变化?
  USE_S_ANIME = true
  
  # 設定例
  # 1号角色,57号特技,lv5,lv10动画变化
  # 2号角色,Lv.11动画变化
  S_ANIME[57] = {1=>[[5, 69], [10, 70]], 2=>[[11, 70]]}

  #----------------------------------------------------------------------------
  # 属性変化/状态変化
  #----------------------------------------------------------------------------
  # 属性変化
  # S_ELEMENT[技艺ID] = {角色ID=>{水平=>[属性ID,属性ID…]}, ・・・・}
  S_ELEMENT[57] = {1=>{1=>[1], 2=>[2], 3=>[3]}, 2=>{1=>[2], 2=>[5]}}

  # 状态変化+
  # S_STATE_P[技艺ID] = {角色ID=>{水平=>[属性ID,属性ID…]}, ・・・・}
  S_STATE_P[57] = {1=>{1=>[1], 2=>[2], 3=>[3]}, 2=>{1=>[2], 2=>[5]}}

  # 状态変化-
  # S_STATE_N[技艺ID] = {角色ID=>{水平=>[属性ID,属性ID…]}, ・・・・}
  S_STATE_N[57] = {1=>{1=>[1], 2=>[2], 3=>[3]}, 2=>{1=>[2], 2=>[5]}}

#==============================================================================
# □ 自定义内容终了
#==============================================================================
end


class Game_Actor
  include Skill_updata
  attr_accessor   :skill_use      # スキル使用回数
  attr_accessor   :skill_level    # スキルレベル
  attr_accessor   :skill_power    # スキル威力更新値
  attr_accessor   :skill_sp_cost  # スキルSP消費更新値
  attr_accessor   :skill_hit      # スキル命中率
  attr_accessor   :skill_up       # レベルアップフラグ
  attr_accessor   :skill_list     # スキルEXPリスト
  alias skill_updata_init setup
  def setup(actor_id)
    skill_updata_init(actor_id)
    @skill_use = []
    @skill_level = []
    @skill_power = []
    @skill_sp_cost = []
    @skill_hit = []
    @skill_up = false
    @skill_list = []
    for id in 1...$data_skills.size
      @skill_use[id] = 0
      @skill_level[id] = 0
      @skill_power[id] = $data_skills[id].power
      @skill_sp_cost[id] = $data_skills[id].sp_cost
      @skill_hit[id] = $data_skills[id].hit
      @skill_list[id] = make_skill_list(id)
    end
  end

  #--------------------------------------------------------------------------
  # ● スキルEXP 計算
  #--------------------------------------------------------------------------
  def make_skill_list(skill_id)
    interval = S_INTER[skill_id]
    up_interval = ( (interval != nil and interval[@actor_id] != nil) ? interval[@actor_id] : UPDATA_INTERVAL )
    slope = S_SLOPE[skill_id]
    up_slope = ( (slope != nil and slope[@actor_id] != nil) ? slope[@actor_id] : 1 )
    limit = S_LEVEL[skill_id]
    limit_lv = ( (limit != nil and limit[@actor_id] != nil) ? limit[@actor_id] : LEVEL_LIMIT )
    list = []
    list[0] = 0
    for lv in 1...limit_lv+1
      exp = 0
      case SKILL_PATTERN
      when 0
        exp = up_interval * lv
      when 1
        exp = list[lv-1] + up_slope * lv + up_interval
      end
      list[lv] = exp.truncate
    end
    return list
  end
end


class Game_Battler
  include Skill_updata
  #--------------------------------------------------------------------------
  # ● スキルの効果適用
  #     user  : スキルの使用者 (バトラー)
  #     skill : スキル
  #--------------------------------------------------------------------------
  alias skill_effect_update skill_effect
  def skill_effect(user, skill)
    up_flag = false
    if user.is_a?(Game_Actor) and ($scene.is_a?(Scene_Battle) or MENU_COUNT)
      skill_update_main(user, skill)
      skill_base = skill.dup
      # 威力上昇
      if SKILL_MIGHT_UP
        skill.power = user.skill_power[skill.id]
      end
      # 命中率上昇
      if SKILL_HIT_UP
        skill.hit = user.skill_hit[skill.id]
      end
      # 属性変化
      if ELEMENT_CHANGE and S_ELEMENT != []
        ele1 = S_ELEMENT[skill.id]
        if ele1 != nil and ele1[user.id] != nil
          ele2 = ele1[user.id]
          if ele2 != [] and ele2[user.skill_level[skill.id]] != nil
            skill.element_set = ele2[user.skill_level[skill.id]]
          end
        end
      end
      # ステート変化
      if STATE_CHANGE
        if S_STATE_P != []
          pst1 = S_STATE_P[skill.id]
          if pst1 != nil and pst1[user.id] != nil
            pst2 = pst1[user.id]
            if pst2 != nil and pst2[user.skill_level[skill.id]] != nil
              skill.plus_state_set = pst2[user.skill_level[skill.id]]
              p skill.plus_state_set
            end
          end
        end
        if S_STATE_N != []
          nst1 = S_STATE_N[skill.id]
          if nst1 != nil and nst1[user.id] != nil
            nst2 = nst1[user.id]
            if nst1 != nil and nst2[user.skill_level[skill.id]] != nil
              skill.minus_state_set = nst2[user.skill_level[skill.id]]
            end
          end
        end
      end
      up_flag = true
    end
    ret = skill_effect_update(user, skill)    # 原物
    if up_flag
      skill = skill_base
      # Miss時には後戻し
      if self.damage == "Miss"
        skill_use_recount(user, skill)
      end
    end
    return ret
  end
  
  #--------------------------------------------------------------------------
  # ● スキルアップデータメイン
  #--------------------------------------------------------------------------
  def skill_update_main(actor, skill)
    # スキル使用回数のカウント
    actor.skill_use[skill.id] += 1
    # リミット取得
    limit = S_LEVEL[skill.id]
    s_limit = ( (limit != nil and limit[actor.id] != nil) ? limit[actor.id] : LEVEL_LIMIT)
    # 書き換え限界到達
    if s_limit == false or actor.skill_level[skill.id] < s_limit
      # レベルアップ間隔取得
      interval = actor.skill_list[skill.id]
      # 書き換え回数到達
      if actor.skill_use[skill.id] == interval[actor.skill_level[skill.id]+1]
        # スキルレベル上昇
        actor.skill_level[skill.id] += 1
        actor.skill_up = true
        # 威力上昇 = 有効
        if SKILL_MIGHT_UP
          might = S_MIGHT[skill.id]
          might_rate = ((might != nil and might[actor.id] != nil) ? might[actor.id] : MIGHT_RATE)
          # 補正値更新
          actor.skill_power[skill.id] += skill.power * might_rate / 100
          actor.skill_power[skill.id] = actor.skill_power[skill.id].truncate
        end
        # SP消費減少 = 有効
        if SP_COST_DOWN
          cost = S_COST[skill.id]
          cost_rate = ((cost != nil and cost[actor.id] != nil) ? cost[actor.id] : COST_RATE)
          actor.skill_sp_cost[skill.id] -= skill.sp_cost * cost_rate / 100
          actor.skill_sp_cost[skill.id] = actor.skill_sp_cost[skill.id].truncate
          # SP消費が0以下はありえない
          if actor.skill_sp_cost[skill.id] < 0
            actor.skill_sp_cost[skill.id] = 0
          end
        end
        # 命中率上昇 = 有効
        if SKILL_HIT_UP
          hit = S_HIT[skill.id]
          hit_rate = ((hit != nil and hit[actor.id] != nil) ? hit[actor.id] : HIT_RATE)
          actor.skill_hit[skill.id] += skill.hit * hit_rate / 100
          actor.skill_hit[skill.id] = actor.skill_hit[skill.id].truncate
          # 100以上はありえない
          if actor.skill_hit[skill.id] > 100
            actor.skill_hit[skill.id] = 100
          end
        end
      end
    end
  end
  
  #--------------------------------------------------------------------------
  # ● 再カウント
  #--------------------------------------------------------------------------
  def skill_use_recount(actor, skill)
    if actor.skill_up
      actor.skill_level[skill.id] -= 1
      # 威力を再計算
      if SKILL_MIGHT_UP
        actor.skill_power[skill.id] = skill.power
        might = S_MIGHT[skill.id]
        might_rate = ((might != nil and might[actor.id] != nil) ? might[actor.id] : MIGHT_RATE)
        for i in 1...actor.skill_level[skill.id]
          actor.skill_power[skill.id] += skill.power * might_rate / 100
          actor.skill_power[skill.id] = actor.skill_power[skill.id].truncate
        end
      end
      # SP消費再計算
      if SP_COST_DOWN
        actor.skill_sp_cost[skill.id] = skill.sp_cost
        cost = S_COST[skill.id]
        cost_rate = ((cost != nil and cost[actor.id] != nil) ? cost[actor.id] : COST_RATE)
        for i in 1...actor.skill_level[skill.id]
          actor.skill_sp_cost[skill.id] -= skill.sp_cost * cost_rate / 100
          actor.skill_sp_cost[skill.id] = actor.skill_sp_cost[skill.id].truncate
        end
        # SP消費が0以下はありえない
        if actor.skill_sp_cost[skill.id] < 0
          actor.skill_sp_cost[skill.id] = 0
        end
      end
      # 命中率再計算
      if SKILL_HIT_UP
        actor.skill_hit[skill.id] = skill.hit
        hit = S_HIT[skill.id]
        hit_rate = ((hit != nil and hit[actor.id] != nil) ? hit[actor.id] : HIT_RATE)
        for i in 1...actor.skill_level[skill.id]
          actor.skill_hit[skill.id] += skill.hit * hit_rate / 100
          actor.skill_hit[skill.id] = actor.skill_hit[skill.id].truncate
        end
        # 100以上はありえない
        if actor.skill_hit[skill.id] > 100
          actor.skill_hit[skill.id] = 100
        end
      end
      actor.skill_up = false
    end
    actor.skill_use[skill.id] -= 1
  end
end

#==============================================================================
# スキル成長によるアニメーション変化
#==============================================================================
class Scene_Battle
  include Skill_updata
  #--------------------------------------------------------------------------
  # ● フレーム更新 (メインフェーズ ステップ 4 : 対象側アニメーション)
  #--------------------------------------------------------------------------
  alias update_phase4_step4_skillup update_phase4_step4
  def update_phase4_step4
    update_phase4_step4_skillup
    if @active_battler.is_a?(Game_Actor) and USE_S_ANIME
      s_anime = S_ANIME[@skill.id]
      # 設定がないなら無視
      if s_anime != nil and s_anime[@active_battler.id] != nil
        s_anime_set = s_anime[@active_battler.id]
        for i in 0...s_anime_set.size
          s_anime_def = s_anime_set
          # 規定レベル以上
          if @active_battler.skill_level[@skill.id] >= s_anime_def[0]
            # 対象側アニメーション
            for target in @target_battlers
              target.animation_id = s_anime_def[1]
            end
          end
        end
      end
    end
  end
end

#==============================================================================
# 以下、レベルアップ表示部分(レベルアップ表示がいらないなら消してもOK)
#==============================================================================
class Scene_Battle
  include Skill_updata
  if SHOW_SKILL_LV_UP
  #--------------------------------------------------------------------------
  # ● フレーム更新 (メインフェーズ ステップ 2 : アクション開始)
  #--------------------------------------------------------------------------
  alias update_phase4_step2_skillup update_phase4_step2
  def update_phase4_step2
    if @active_battler.is_a?(Game_Actor)
      @active_battler.skill_up = false
    end
    @skillup = false
    update_phase4_step2_skillup   # 原物
  end

  #--------------------------------------------------------------------------
  # ● フレーム更新 (メインフェーズ ステップ 3 : 行動側アニメーション)
  #--------------------------------------------------------------------------
  alias update_phase4_step3_skillup update_phase4_step3
  def update_phase4_step3
    if @active_battler.is_a?(Game_Actor) and @active_battler.skill_up != false
      @skillup = true
      @skill_up_window = Window_Skillup.new(@active_battler)
      if SKILLUP_SE != nil
        Audio.se_play("Audio/SE/" + SKILLUP_SE)
        sleep(0.1)
      end
    end
    update_phase4_step3_skillup
  end

  #--------------------------------------------------------------------------
  # ● フレーム更新 (メインフェーズ ステップ 5 : ダメージ表示)
  #--------------------------------------------------------------------------
  alias update_phase4_step5_skillup update_phase4_step5
  def update_phase4_step5
    if @active_battler.is_a?(Game_Actor) and @skillup
      @skill_up_window.dispose
      @active_battler.skill_up = false
      @skillup = false
    end
    update_phase4_step5_skillup     # 原物
  end

  #--------------------------------------------------------------------------
  # ● フレーム更新
  #--------------------------------------------------------------------------
  alias update_skillup update
  def update
    if @active_battler.is_a?(Game_Actor) and @active_battler.skill_up and @skillup
      @skill_up_window.contents_opacity -= 4
    end
    update_skillup              # 原物
  end
  end # if SHOW_SKILL_LV_UP
end

class Window_Skillup < Window_Base
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #     actor : アクター
  #--------------------------------------------------------------------------
  def initialize(actor)
    super(actor.screen_x-140, 260, 250, 64)
    self.contents = Bitmap.new(width - 32, height - 32)
    self.opacity = 0
    self.contents.font.color = Color.new(255, 64, 0)
    self.contents.draw_text(80, 0, 150, 32, "特技升级!")
  end
end



#==============================================================================
# 以下、再定義部分を含む(SP消費減少の機能がいらないなら消してもOK)
#==============================================================================
class Window_Skill < Window_Selectable
  #--------------------------------------------------------------------------
  # ● 項目の描画
  #     index : 項目番号
  #--------------------------------------------------------------------------
  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)
#-修正-----
    @actor.skill_level[skill.id] = 0 if @actor.skill_level[skill.id] == nil
    name_level = skill.name + "(" + @actor.skill_level[skill.id].to_s + ")"
    self.contents.draw_text(x + 28, y, 204, 32, name_level, 0)
    @actor.skill_sp_cost[skill.id] = skill.sp_cost if @actor.skill_sp_cost[skill.id] == nil
    self.contents.draw_text(x + 232, y, 48, 32, @actor.skill_sp_cost[skill.id].to_s, 2)
#----------
  end
end

class Scene_Skill
  #--------------------------------------------------------------------------
  # ● フレーム更新 (ターゲットウィンドウがアクティブの場合)
  #--------------------------------------------------------------------------
  def update_target
    # B ボタンが押された場合
    if Input.trigger?(Input::B)
      # キャンセル SE を演奏
      $game_system.se_play($data_system.cancel_se)
      # ターゲットウィンドウを消去
      @skill_window.active = true
      @target_window.visible = false
      @target_window.active = false
      return
    end
    # C ボタンが押された場合
    if Input.trigger?(Input::C)
      # SP 切れなどで使用できなくなった場合
      unless @actor.skill_can_use?(@skill.id)
        # ブザー SE を演奏
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      # ターゲットが全体の場合
      if @target_window.index == -1
        # パーティ全体にスキルの使用効果を適用
        used = false
        for i in $game_party.actors
          used |= i.skill_effect(@actor, @skill)
        end
      end
      # ターゲットが使用者の場合
      if @target_window.index <= -2
        # ターゲットのアクターにスキルの使用効果を適用
        target = $game_party.actors[@target_window.index + 10]
        used = target.skill_effect(@actor, @skill)
      end
      # ターゲットが単体の場合
      if @target_window.index >= 0
        # ターゲットのアクターにスキルの使用効果を適用
        target = $game_party.actors[@target_window.index]
        used = target.skill_effect(@actor, @skill)
      end
      # スキルを使った場合
      if used
        # スキルの使用時 SE を演奏
        $game_system.se_play(@skill.menu_se)
#-----修正------------------------------------------------------
        @actor.skill_sp_cost[@skill.id] = @skill.sp_cost if @actor.skill_sp_cost[@skill.id] == nil
        # SP 消費
        @actor.sp -= @actor.skill_sp_cost[@skill.id]
#---------------------------------------------------------------
        # 各ウィンドウの内容を再作成
        @status_window.refresh
        @skill_window.refresh
        @target_window.refresh
        # 全滅の場合
        if $game_party.all_dead?
          # ゲームオーバー画面に切り替え
          $scene = Scene_Gameover.new
          return
        end
        # コモンイベント ID が有効の場合
        if @skill.common_event_id > 0
          # コモンイベント呼び出し予約
          $game_temp.common_event_id = @skill.common_event_id
          # マップ画面に切り替え
          $scene = Scene_Map.new
          return
        end
      end
      # スキルを使わなかった場合
      unless used
        # ブザー SE を演奏
        $game_system.se_play($data_system.buzzer_se)
      end
      return
    end
  end
end

class Scene_Battle
  include Skill_updata
  #--------------------------------------------------------------------------
  # ● スキルアクション 結果作成
  #--------------------------------------------------------------------------
  alias make_skill_action_result_skill_update make_skill_action_result
  def make_skill_action_result
    make_skill_action_result_skill_update
    # SP 消費
    if SP_COST_DOWN and @active_battler.is_a?(Game_Actor)
      @active_battler.sp += @skill.sp_cost
      @active_battler.sp -= @active_battler.skill_sp_cost[@skill.id]
    end
  end
end

class Game_Battler
  #--------------------------------------------------------------------------
  # ● スキルの使用可能判定
  #     skill_id : スキル ID
  #--------------------------------------------------------------------------
  alias skill_update_can_use? skill_can_use?
  def skill_can_use?(skill_id)
    ret = skill_update_can_use?(skill_id)
    if !ret and SP_COST_DOWN
      # SP が足りない場合は使用不可となった?
      if $data_skills[skill_id].sp_cost > self.sp
        if self.is_a?(Game_Actor)
          skill_sp_cost = self.skill_sp_cost[skill_id]
          if skill_sp_cost < self.sp
            ret = true
          end
        end
      end
    end
    return ret
  end
end

#==============================================================================
# イベントスクリプト操作
#==============================================================================
class Interpreter
  include Skill_updata
  #--------------------------------------------------------------------------
  # ● スキルレベル設定(レベルセット)
  #     actor_id  :   アクターID
  #     skill_id  :   スキルID
  #     level     :   設定レベル
  #--------------------------------------------------------------------------
  def set_skill_level(actor_id, skill_id, level)
    actor = $game_actors[actor_id]
    skill = $data_skills[skill_id]
    # リミット取得
    limit = S_LEVEL[skill_id]
    s_limit = ( (limit != nil and limit[actor.id] != nil) ? limit[actor.id] : LEVEL_LIMIT)
    if level > s_limit or level < 0
      return
    end
    # レベル
    actor.skill_level[skill.id] = level
    # 使用回数
    use_list = actor.skill_list[skill.id]
    actor.skill_use[skill.id] = use_list[level]
    # 威力を再計算
    if SKILL_MIGHT_UP
      actor.skill_power[skill.id] = skill.power
      might = S_MIGHT[skill.id]
      might_rate = ((might != nil and might[actor.id] != nil) ? might[actor.id] : MIGHT_RATE)
      for i in 0...level
        actor.skill_power[skill.id] += skill.power * might_rate / 100
        actor.skill_power[skill.id] = actor.skill_power[skill.id].truncate
      end
    end
    # SP消費再計算
    if SP_COST_DOWN
      actor.skill_sp_cost[skill.id] = skill.sp_cost
      cost = S_COST[skill.id]
      cost_rate = ((cost != nil and cost[actor.id] != nil) ? cost[actor.id] : COST_RATE)
      for i in 0...level
        actor.skill_sp_cost[skill.id] -= skill.sp_cost * cost_rate / 100
        actor.skill_sp_cost[skill.id] = actor.skill_sp_cost[skill.id].truncate
      end
      # SP消費が0以下はありえない
      if actor.skill_sp_cost[skill.id] < 0
        actor.skill_sp_cost[skill.id] = 0
      end
    end
    # 命中率再計算
    if SKILL_HIT_UP
      actor.skill_hit[skill.id] = skill.hit
      hit = S_HIT[skill.id]
      hit_rate = ((hit != nil and hit[actor.id] != nil) ? hit[actor.id] : HIT_RATE)
      for i in 0...level
        actor.skill_hit[skill.id] += skill.hit * hit_rate / 100
        actor.skill_hit[skill.id] = actor.skill_hit[skill.id].truncate
      end
      # 100以上はありえない
      if actor.skill_hit[skill.id] > 100
        actor.skill_hit[skill.id] = 100
      end
    end
  end
  
  #--------------------------------------------------------------------------
  # ● スキルレベル設定(レベルアップ)
  #     actor_id  :   アクターID
  #     skill_id  :   スキルID
  #--------------------------------------------------------------------------
  def skill_level_up(actor_id, skill_id)
    actor = $game_actors[actor_id]
    set_skill_level(actor_id, skill_id, actor.skill_level[skill_id]+1)
  end
  
  #--------------------------------------------------------------------------
  # ● スキルレベル設定(レベルダウン)
  #     actor_id  :   アクターID
  #     skill_id  :   スキルID
  #--------------------------------------------------------------------------
  def skill_level_down(actor_id, skill_id)
    actor = $game_actors[actor_id]
    set_skill_level(actor_id, skill_id, actor.skill_level[skill_id]-1)
  end
end

#==============================================================================
#==============================================================================
[/pre]
回复

使用道具 举报

梦石
0
星屑
105
在线时间
2107 小时
注册时间
2011-2-23
回帖
72
 楼主| 发表于 2013-1-19 14:26:27 | 显示全部楼层
本帖最后由 君子兰 于 2013-1-19 15:32 编辑
羞射了 发表于 2013-1-19 14:39
我用了你给我那个脚本还是会显示对话框,于是我就去google找了一下,找到了这个脚本的最新版本4.4升级 ...


大人对不起,您给的那个范例测试时没有问题,
可是这个脚本升级版的好像改了很多东西,跟我原本用的那些脚本冲突很厉害。所以我只好按照您修改了的地方,把那些东西搬到原来那个4.4版的里面去。
因为我自己几乎不懂脚本,所以也不知道搬得到底行不行,可是进去之后其他特技都还可以用的,就是在您新加的那里设定了id的技能用了就会报错,您能看得出是什么原因吗?
無題.jpg

自己改后的脚本我也贴出来吧,您能再帮忙看一下吗?谢谢您~
改的是129行,203行,275行,都是照搬的您原来改过的那些地方,就只有一个SkillUpdate,因为在原来的4.4版里面是用的Skill_updata,所以让我给改了……

ms[pre lang="" line="1"]#==============================================================================
# ■ スキルアップデート   Ver. 4.4.0                     
#     スキルごとにレベル制を導入する
#     戦闘中にスキルを使用するほど、威力上昇、消費SP減少、命中率上昇

module Skill_updata
  S_MIGHT = []
  S_COST = []
  S_HIT = []
  S_LEVEL = []
  S_INTER = []
  S_SLOPE = []
  S_ANIME = []
  S_ELEMENT = []
  S_STATE_P = []
  S_STATE_N = []
#==============================================================================
# □ 自定义内容
#==============================================================================
  # 威力上升使用true/false
  SKILL_MIGHT_UP = true
  
  # SP消耗减少使用true/false
  SP_COST_DOWN = true      
  
  # 命中率上升使用true/false
  SKILL_HIT_UP = true      
  
  # 属性变化的使用true/false
  ELEMENT_CHANGE = true   
  
  # 状态变化的使用true/false
  STATE_CHANGE = true
  
  # 显示特技等级上升true/false
  SHOW_SKILL_LV_UP = true
  
  # 等级上升的声效,不用的时候就=nil
  SKILLUP_SE = "056-Right02"
  
  # 菜单使用计数true/false
  MENU_COUNT = true

  # 升级所需次数
  UPDATA_INTERVAL = 0
  
  # 等级上限
  LEVEL_LIMIT = 30

  # 威力上升率(%%)
  MIGHT_RATE = 5
  
  # SP消耗减少率(%)
  COST_RATE = 1
  
  # 命中上升率(%)
  HIT_RATE = 3

  #----------------------------------------------------------------------------
  # 特别技能的详细设定,57和61号特技分别是十字斩和扫荡,大家最熟悉的两个招数
  #----------------------------------------------------------------------------
  
  # 界限水平
  # S_LEVEL[技艺ID]=[角色ID=>界限,…]
  S_LEVEL[59] = {1=>18, 2=>12, 3=>5, 4=>12, 5=>12, 6=>12, 7=>12, 8=>12}
  S_LEVEL[60] = {1=>12, 2=>18, 3=>15, 4=>12, 5=>12, 6=>12, 7=>12, 8=>12}
     
  # 技艺&actor威力上升率
  # S_MIGHT[技艺ID]=[角色ID=>威力上升率,…]
  S_MIGHT[59] = {1=>8, 2=>2, 3=>5, 4=>2, 5=>2, 6=>2, 7=>2, 8=>2}
  S_MIGHT[60] = {1=>2, 2=>8, 3=>5, 4=>2, 5=>2, 6=>2, 7=>2, 8=>2}

  # 技艺&actorSP消费减少率
  # S_COST[技艺ID]=[角色ID=>SP消费减少率,…]
  S_COST[59] = {1=>8, 2=>2, 3=>5, 4=>2, 5=>2, 6=>2, 7=>2, 8=>2}
  S_COST[60] = {1=>2, 2=>8, 3=>5, 4=>2, 5=>2, 6=>2, 7=>2, 8=>2}

  # 技艺&actor命中率
  # S_HIT[技艺ID]=[角色ID=>命中上升率,…]
  S_HIT[59] = {1=>2, 2=>1, 3=>1, 4=>1, 5=>1, 6=>1, 7=>1, 8=>1}
  S_HIT[60] = {1=>1, 2=>2, 3=>1, 4=>1, 5=>1, 6=>1, 7=>1, 8=>1}

  #----------------------------------------------------------------------------
  # 技能成长的具体调节
  #----------------------------------------------------------------------------
  # 技艺的增长图形
  # 0:使用技艺一定回数的话提高水平
  # 1:技艺一定回数+每水平の使用提高水平
  SKILL_PATTERN = 1
  
  # 技艺水平上升间隔每(使用几回Lv提高)
  #   ※没有设定的情况→基本设定被适应
  # S_INTER[技艺ID]=[actorID=>上升间隔,…]
  S_INTER[81] = {1=>5, 2=>8, 3=>8, 4=>8, 5=>8, 6=>8, 7=>8, 8=>8}
  
  # スキルレベル上昇の傾き(パターン1を使用する場合のみ必要)
  #   ※設定がない場合は1となります。
  # S_SLOPE[スキルID] = [アクターID=>上昇の傾き, …]
  S_SLOPE[57] = {1=>5, 2=>8, 3=>8, 4=>8, 5=>8, 6=>8, 7=>8, 8=>8}

  #----------------------------------------------------------------------------
  # 技艺增长的话使之动画变化
  #  记录格式: S_ANIME[技艺ID] = [角色ID=>[[等级, 动画ID]], ・・・]
  #----------------------------------------------------------------------------
  # 实施技艺增长的动画变化?
  USE_S_ANIME = true
  
  # 設定例
  # 1号角色,57号特技,lv5,lv10动画变化
  # 2号角色,Lv.11动画变化
  S_ANIME[57] = {1=>[[5, 69], [10, 70]], 2=>[[11, 70]]}

  #----------------------------------------------------------------------------
  # 属性変化/状态変化
  #----------------------------------------------------------------------------
  # 属性変化
  # S_ELEMENT[技艺ID] = {角色ID=>{水平=>[属性ID,属性ID…]}, ・・・・}
  S_ELEMENT[57] = {1=>{1=>[1], 2=>[2], 3=>[3]}, 2=>{1=>[2], 2=>[5]}}

  # 状态変化+
  # S_STATE_P[技艺ID] = {角色ID=>{水平=>[属性ID,属性ID…]}, ・・・・}
  S_STATE_P[57] = {1=>{1=>[1], 2=>[2], 3=>[3]}, 2=>{1=>[2], 2=>[5]}}

  # 状态変化-
  # S_STATE_N[技艺ID] = {角色ID=>{水平=>[属性ID,属性ID…]}, ・・・・}
  S_STATE_N[57] = {1=>{1=>[1], 2=>[2], 3=>[3]}, 2=>{1=>[2], 2=>[5]}}
  
  
  #----------------------------------------------------------------------------
# 羞射了新增定制功能
#----------------------------------------------------------------------------
  S_LEARN=[];S_CHANGE = []
  # 领悟技能(true:有効 | false:無効)
  SKILL_LEARN = true
  # 替换技能并继承等级(true:有効 | false:無効)
  SKILL_CHANGE = true
# S_LEARN[技能ID] = {角色=>{技能等级=>[领悟技能ID…]}, ・・・・}
  S_LEARN[57] = {1=>{2=>61}, 2=>{2=>8}}
# S_CHANGE[技能ID] = {角色=>{技能等级=>[替换技能ID…]}, ・・・・}
  S_CHANGE[61] = {1=>{2=>62}, 2=>{2=>7}}

#==============================================================================
# □ 自定义内容终了
#==============================================================================
end


class Game_Actor
  include Skill_updata
  attr_accessor   :skill_use      # スキル使用回数
  attr_accessor   :skill_level    # スキルレベル
  attr_accessor   :skill_power    # スキル威力更新値
  attr_accessor   :skill_sp_cost  # スキルSP消費更新値
  attr_accessor   :skill_hit      # スキル命中率
  attr_accessor   :skill_up       # レベルアップフラグ
  attr_accessor   :skill_list     # スキルEXPリスト
  alias skill_updata_init setup
  def setup(actor_id)
    skill_updata_init(actor_id)
    @skill_use = []
    @skill_level = []
    @skill_power = []
    @skill_sp_cost = []
    @skill_hit = []
    @skill_up = false
    @skill_list = []
    for id in 1...$data_skills.size
      @skill_use[id] = 0
      @skill_level[id] = 0
      @skill_power[id] = $data_skills[id].power
      @skill_sp_cost[id] = $data_skills[id].sp_cost
      @skill_hit[id] = $data_skills[id].hit
      @skill_list[id] = make_skill_list(id)
    end
  end

  #--------------------------------------------------------------------------
  # ● スキルEXP 計算
  #--------------------------------------------------------------------------
  def make_skill_list(skill_id)
    interval = S_INTER[skill_id]
    up_interval = ( (interval != nil and interval[@actor_id] != nil) ? interval[@actor_id] : UPDATA_INTERVAL )
    slope = S_SLOPE[skill_id]
    up_slope = ( (slope != nil and slope[@actor_id] != nil) ? slope[@actor_id] : 1 )
    limit = S_LEVEL[skill_id]
    limit_lv = ( (limit != nil and limit[@actor_id] != nil) ? limit[@actor_id] : LEVEL_LIMIT )
    list = []
    list[0] = 0
    for lv in 1...limit_lv+1
      exp = 0
      case SKILL_PATTERN
      when 0
        exp = up_interval * lv
      when 1
        exp = list[lv-1] + up_slope * lv + up_interval
      end
      list[lv] = exp.truncate
    end
    return list
  end
end

  #--------------------------------------------------------------------------
  # ● 羞射了领悟技能
  #--------------------------------------------------------------------------
  def skill_learn(skill, actor)
    new_skill_id = S_LEARN[skill.id][actor.id][actor.skill[skill.id].level]
    return get_data(new_skill_id, S_LEARN, skill.id, actor.id)
  end
  #--------------------------------------------------------------------------
  # ● 羞射了替换技能
  #--------------------------------------------------------------------------
  def skill_change(skill, actor)
    new_skill_id = S_CHANGE[skill.id][actor.id][actor.skill[skill.id].level]
    return get_data(new_skill_id, S_CHANGE, skill.id, actor.id)
  end


class Game_Battler
  include Skill_updata
  #--------------------------------------------------------------------------
  # ● スキルの効果適用
  #     user  : スキルの使用者 (バトラー)
  #     skill : スキル
  #--------------------------------------------------------------------------
  alias skill_effect_update skill_effect
  def skill_effect(user, skill)
    up_flag = false
    if user.is_a?(Game_Actor) and ($scene.is_a?(Scene_Battle) or MENU_COUNT)
      skill_update_main(user, skill)
      skill_base = skill.dup
      # 威力上昇
      if SKILL_MIGHT_UP
        skill.power = user.skill_power[skill.id]
      end
      # 命中率上昇
      if SKILL_HIT_UP
        skill.hit = user.skill_hit[skill.id]
      end
      # 属性変化
      if ELEMENT_CHANGE and S_ELEMENT != []
        ele1 = S_ELEMENT[skill.id]
        if ele1 != nil and ele1[user.id] != nil
          ele2 = ele1[user.id]
          if ele2 != [] and ele2[user.skill_level[skill.id]] != nil
            skill.element_set = ele2[user.skill_level[skill.id]]
          end
        end
      end
      # ステート変化
      if STATE_CHANGE
        if S_STATE_P != []
          pst1 = S_STATE_P[skill.id]
          if pst1 != nil and pst1[user.id] != nil
            pst2 = pst1[user.id]
            if pst2 != nil and pst2[user.skill_level[skill.id]] != nil
              skill.plus_state_set = pst2[user.skill_level[skill.id]]
              p skill.plus_state_set
            end
          end
        end
        if S_STATE_N != []
          nst1 = S_STATE_N[skill.id]
          if nst1 != nil and nst1[user.id] != nil
            nst2 = nst1[user.id]
            if nst1 != nil and nst2[user.skill_level[skill.id]] != nil
              skill.minus_state_set = nst2[user.skill_level[skill.id]]
            end
          end
        end
      end
      up_flag = true
    end
   
       #羞射了执行
    #===================================================================
    if Skill_updata::SKILL_LEARN and Skill_updata::S_LEARN[skill.id] != nil
      user.learn_skill(Skill_updata.skill_learn(skill, user))
    end
    if Skill_updata::SKILL_CHANGE and Skill_updata::S_CHANGE[skill.id] != nil
      user.learn_skill(Skill_updata.skill_change(skill, user))
      user.skill[Skill_updata.skill_change(skill, user)].level = user.skill[skill.id].level
      user.forget_skill(skill.id)
    end
    #===================================================================
    ret = skill_effect_update(user, skill)    # 原物
    if up_flag
      skill = skill_base
      # Miss時には後戻し
      if self.damage == "Miss"
        skill_use_recount(user, skill)
      end
    end
    return ret
  end
  
  #--------------------------------------------------------------------------
  # ● スキルアップデータメイン
  #--------------------------------------------------------------------------
  def skill_update_main(actor, skill)
    # スキル使用回数のカウント
    actor.skill_use[skill.id] += 1
    # リミット取得
    limit = S_LEVEL[skill.id]
    s_limit = ( (limit != nil and limit[actor.id] != nil) ? limit[actor.id] : LEVEL_LIMIT)
    # 書き換え限界到達
    if s_limit == false or actor.skill_level[skill.id] < s_limit
      # レベルアップ間隔取得
      interval = actor.skill_list[skill.id]
      # 書き換え回数到達
      if actor.skill_use[skill.id] == interval[actor.skill_level[skill.id]+1]
        # スキルレベル上昇
        actor.skill_level[skill.id] += 1
        actor.skill_up = true
        # 威力上昇 = 有効
        if SKILL_MIGHT_UP
          might = S_MIGHT[skill.id]
          might_rate = ((might != nil and might[actor.id] != nil) ? might[actor.id] : MIGHT_RATE)
          # 補正値更新
          actor.skill_power[skill.id] += skill.power * might_rate / 100
          actor.skill_power[skill.id] = actor.skill_power[skill.id].truncate
        end
        # SP消費減少 = 有効
        if SP_COST_DOWN
          cost = S_COST[skill.id]
          cost_rate = ((cost != nil and cost[actor.id] != nil) ? cost[actor.id] : COST_RATE)
          actor.skill_sp_cost[skill.id] -= skill.sp_cost * cost_rate / 100
          actor.skill_sp_cost[skill.id] = actor.skill_sp_cost[skill.id].truncate
          # SP消費が0以下はありえない
          if actor.skill_sp_cost[skill.id] < 0
            actor.skill_sp_cost[skill.id] = 0
          end
        end
        # 命中率上昇 = 有効
        if SKILL_HIT_UP
          hit = S_HIT[skill.id]
          hit_rate = ((hit != nil and hit[actor.id] != nil) ? hit[actor.id] : HIT_RATE)
          actor.skill_hit[skill.id] += skill.hit * hit_rate / 100
          actor.skill_hit[skill.id] = actor.skill_hit[skill.id].truncate
          # 100以上はありえない
          if actor.skill_hit[skill.id] > 100
            actor.skill_hit[skill.id] = 100
          end
        end
      end
    end
  end
  
  #--------------------------------------------------------------------------
  # ● 再カウント
  #--------------------------------------------------------------------------
  def skill_use_recount(actor, skill)
    if actor.skill_up
      actor.skill_level[skill.id] -= 1
      # 威力を再計算
      if SKILL_MIGHT_UP
        actor.skill_power[skill.id] = skill.power
        might = S_MIGHT[skill.id]
        might_rate = ((might != nil and might[actor.id] != nil) ? might[actor.id] : MIGHT_RATE)
        for i in 1...actor.skill_level[skill.id]
          actor.skill_power[skill.id] += skill.power * might_rate / 100
          actor.skill_power[skill.id] = actor.skill_power[skill.id].truncate
        end
      end
      # SP消費再計算
      if SP_COST_DOWN
        actor.skill_sp_cost[skill.id] = skill.sp_cost
        cost = S_COST[skill.id]
        cost_rate = ((cost != nil and cost[actor.id] != nil) ? cost[actor.id] : COST_RATE)
        for i in 1...actor.skill_level[skill.id]
          actor.skill_sp_cost[skill.id] -= skill.sp_cost * cost_rate / 100
          actor.skill_sp_cost[skill.id] = actor.skill_sp_cost[skill.id].truncate
        end
        # SP消費が0以下はありえない
        if actor.skill_sp_cost[skill.id] < 0
          actor.skill_sp_cost[skill.id] = 0
        end
      end
      # 命中率再計算
      if SKILL_HIT_UP
        actor.skill_hit[skill.id] = skill.hit
        hit = S_HIT[skill.id]
        hit_rate = ((hit != nil and hit[actor.id] != nil) ? hit[actor.id] : HIT_RATE)
        for i in 1...actor.skill_level[skill.id]
          actor.skill_hit[skill.id] += skill.hit * hit_rate / 100
          actor.skill_hit[skill.id] = actor.skill_hit[skill.id].truncate
        end
        # 100以上はありえない
        if actor.skill_hit[skill.id] > 100
          actor.skill_hit[skill.id] = 100
        end
      end
      actor.skill_up = false
    end
    actor.skill_use[skill.id] -= 1
  end
end

#==============================================================================
# スキル成長によるアニメーション変化
#==============================================================================
class Scene_Battle
  include Skill_updata
  #--------------------------------------------------------------------------
  # ● フレーム更新 (メインフェーズ ステップ 4 : 対象側アニメーション)
  #--------------------------------------------------------------------------
  alias update_phase4_step4_skillup update_phase4_step4
  def update_phase4_step4
    update_phase4_step4_skillup
    if @active_battler.is_a?(Game_Actor) and USE_S_ANIME
      s_anime = S_ANIME[@skill.id]
      # 設定がないなら無視
      if s_anime != nil and s_anime[@active_battler.id] != nil
        s_anime_set = s_anime[@active_battler.id]
        for i in 0...s_anime_set.size
          s_anime_def = s_anime_set
          # 規定レベル以上
          if @active_battler.skill_level[@skill.id] >= s_anime_def[0]
            # 対象側アニメーション
            for target in @target_battlers
              target.animation_id = s_anime_def[1]
            end
          end
        end
      end
    end
  end
end

#==============================================================================
# 以下、レベルアップ表示部分(レベルアップ表示がいらないなら消してもOK)
#==============================================================================
class Scene_Battle
  include Skill_updata
  if SHOW_SKILL_LV_UP
  #--------------------------------------------------------------------------
  # ● フレーム更新 (メインフェーズ ステップ 2 : アクション開始)
  #--------------------------------------------------------------------------
  alias update_phase4_step2_skillup update_phase4_step2
  def update_phase4_step2
    if @active_battler.is_a?(Game_Actor)
      @active_battler.skill_up = false
    end
    @skillup = false
    update_phase4_step2_skillup   # 原物
  end

  #--------------------------------------------------------------------------
  # ● フレーム更新 (メインフェーズ ステップ 3 : 行動側アニメーション)
  #--------------------------------------------------------------------------
  alias update_phase4_step3_skillup update_phase4_step3
  def update_phase4_step3
    if @active_battler.is_a?(Game_Actor) and @active_battler.skill_up != false
      @skillup = true
      @skill_up_window = Window_Skillup.new(@active_battler)
      if SKILLUP_SE != nil
        Audio.se_play("Audio/SE/" + SKILLUP_SE)
        sleep(0.1)
      end
    end
    update_phase4_step3_skillup
  end

  #--------------------------------------------------------------------------
  # ● フレーム更新 (メインフェーズ ステップ 5 : ダメージ表示)
  #--------------------------------------------------------------------------
  alias update_phase4_step5_skillup update_phase4_step5
  def update_phase4_step5
    if @active_battler.is_a?(Game_Actor) and @skillup
      @skill_up_window.dispose
      @active_battler.skill_up = false
      @skillup = false
    end
    update_phase4_step5_skillup     # 原物
  end

  #--------------------------------------------------------------------------
  # ● フレーム更新
  #--------------------------------------------------------------------------
  alias update_skillup update
  def update
    if @active_battler.is_a?(Game_Actor) and @active_battler.skill_up and @skillup
      @skill_up_window.contents_opacity -= 4
    end
    update_skillup              # 原物
  end
  end # if SHOW_SKILL_LV_UP
end

class Window_Skillup < Window_Base
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #     actor : アクター
  #--------------------------------------------------------------------------
  def initialize(actor)
    super(actor.screen_x-140, 260, 250, 64)
    self.contents = Bitmap.new(width - 32, height - 32)
    self.opacity = 0
   
    self.contents.font.color = Color.new(255, 64, 0)
   self.contents.draw_text(80, 0, 150, 32, "特级升级!")
  end
end



#==============================================================================
# 以下、再定義部分を含む(SP消費減少の機能がいらないなら消してもOK)
#==============================================================================
class Window_Skill < Window_Selectable
  #--------------------------------------------------------------------------
  # ● 項目の描画
  #     index : 項目番号
  #--------------------------------------------------------------------------
  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)
#-修正-----
    @actor.skill_level[skill.id] = 0 if @actor.skill_level[skill.id] == nil
    name_level = skill.name + "(" + @actor.skill_level[skill.id].to_s + ")"
    self.contents.draw_text(x + 28, y, 204, 32, name_level, 0)
    @actor.skill_sp_cost[skill.id] = skill.sp_cost if @actor.skill_sp_cost[skill.id] == nil
    self.contents.draw_text(x + 232, y, 48, 32, @actor.skill_sp_cost[skill.id].to_s, 2)
#----------
  end
end

class Scene_Skill
  #--------------------------------------------------------------------------
  # ● フレーム更新 (ターゲットウィンドウがアクティブの場合)
  #--------------------------------------------------------------------------
  def update_target
    # B ボタンが押された場合
    if Input.trigger?(Input::B)
      # キャンセル SE を演奏
      $game_system.se_play($data_system.cancel_se)
      # ターゲットウィンドウを消去
      @skill_window.active = true
      @target_window.visible = false
      @target_window.active = false
      return
    end
    # C ボタンが押された場合
    if Input.trigger?(Input::C)
      # SP 切れなどで使用できなくなった場合
      unless @actor.skill_can_use?(@skill.id)
        # ブザー SE を演奏
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      # ターゲットが全体の場合
      if @target_window.index == -1
        # パーティ全体にスキルの使用効果を適用
        used = false
        for i in $game_party.actors
          used |= i.skill_effect(@actor, @skill)
        end
      end
      # ターゲットが使用者の場合
      if @target_window.index <= -2
        # ターゲットのアクターにスキルの使用効果を適用
        target = $game_party.actors[@target_window.index + 10]
        used = target.skill_effect(@actor, @skill)
      end
      # ターゲットが単体の場合
      if @target_window.index >= 0
        # ターゲットのアクターにスキルの使用効果を適用
        target = $game_party.actors[@target_window.index]
        used = target.skill_effect(@actor, @skill)
      end
      # スキルを使った場合
      if used
        # スキルの使用時 SE を演奏
        $game_system.se_play(@skill.menu_se)
#-----修正------------------------------------------------------
        @actor.skill_sp_cost[@skill.id] = @skill.sp_cost if @actor.skill_sp_cost[@skill.id] == nil
        # SP 消費
        @actor.sp -= @actor.skill_sp_cost[@skill.id]
#---------------------------------------------------------------
        # 各ウィンドウの内容を再作成
        @status_window.refresh
        @skill_window.refresh
        @target_window.refresh
        # 全滅の場合
        if $game_party.all_dead?
          # ゲームオーバー画面に切り替え
          $scene = Scene_Gameover.new
          return
        end
        # コモンイベント ID が有効の場合
        if @skill.common_event_id > 0
          # コモンイベント呼び出し予約
          $game_temp.common_event_id = @skill.common_event_id
          # マップ画面に切り替え
          $scene = Scene_Map.new
          return
        end
      end
      # スキルを使わなかった場合
      unless used
        # ブザー SE を演奏
        $game_system.se_play($data_system.buzzer_se)
      end
      return
    end
  end
end

class Scene_Battle
  include Skill_updata
  #--------------------------------------------------------------------------
  # ● スキルアクション 結果作成
  #--------------------------------------------------------------------------
  alias make_skill_action_result_skill_update make_skill_action_result
  def make_skill_action_result
    make_skill_action_result_skill_update
    # SP 消費
    if SP_COST_DOWN and @active_battler.is_a?(Game_Actor)
      @active_battler.sp += @skill.sp_cost
      @active_battler.sp -= @active_battler.skill_sp_cost[@skill.id]
    end
  end
end

class Game_Battler
  #--------------------------------------------------------------------------
  # ● スキルの使用可能判定
  #     skill_id : スキル ID
  #--------------------------------------------------------------------------
  alias skill_update_can_use? skill_can_use?
  def skill_can_use?(skill_id)
    ret = skill_update_can_use?(skill_id)
    if !ret and SP_COST_DOWN
      # SP が足りない場合は使用不可となった?
      if $data_skills[skill_id].sp_cost > self.sp
        if self.is_a?(Game_Actor)
          skill_sp_cost = self.skill_sp_cost[skill_id]
          if skill_sp_cost < self.sp
            ret = true
          end
        end
      end
    end
    return ret
  end
end

#==============================================================================
# イベントスクリプト操作
#==============================================================================
class Interpreter
  include Skill_updata
  #--------------------------------------------------------------------------
  # ● スキルレベル設定(レベルセット)
  #     actor_id  :   アクターID
  #     skill_id  :   スキルID
  #     level     :   設定レベル
  #--------------------------------------------------------------------------
  def set_skill_level(actor_id, skill_id, level)
    actor = $game_actors[actor_id]
    skill = $data_skills[skill_id]
    # リミット取得
    limit = S_LEVEL[skill_id]
    s_limit = ( (limit != nil and limit[actor.id] != nil) ? limit[actor.id] : LEVEL_LIMIT)
    if level > s_limit or level < 0
      return
    end
    # レベル
    actor.skill_level[skill.id] = level
    # 使用回数
    use_list = actor.skill_list[skill.id]
    actor.skill_use[skill.id] = use_list[level]
    # 威力を再計算
    if SKILL_MIGHT_UP
      actor.skill_power[skill.id] = skill.power
      might = S_MIGHT[skill.id]
      might_rate = ((might != nil and might[actor.id] != nil) ? might[actor.id] : MIGHT_RATE)
      for i in 0...level
        actor.skill_power[skill.id] += skill.power * might_rate / 100
        actor.skill_power[skill.id] = actor.skill_power[skill.id].truncate
      end
    end
    # SP消費再計算
    if SP_COST_DOWN
      actor.skill_sp_cost[skill.id] = skill.sp_cost
      cost = S_COST[skill.id]
      cost_rate = ((cost != nil and cost[actor.id] != nil) ? cost[actor.id] : COST_RATE)
      for i in 0...level
        actor.skill_sp_cost[skill.id] -= skill.sp_cost * cost_rate / 100
        actor.skill_sp_cost[skill.id] = actor.skill_sp_cost[skill.id].truncate
      end
      # SP消費が0以下はありえない
      if actor.skill_sp_cost[skill.id] < 0
        actor.skill_sp_cost[skill.id] = 0
      end
    end
    # 命中率再計算
    if SKILL_HIT_UP
      actor.skill_hit[skill.id] = skill.hit
      hit = S_HIT[skill.id]
      hit_rate = ((hit != nil and hit[actor.id] != nil) ? hit[actor.id] : HIT_RATE)
      for i in 0...level
        actor.skill_hit[skill.id] += skill.hit * hit_rate / 100
        actor.skill_hit[skill.id] = actor.skill_hit[skill.id].truncate
      end
      # 100以上はありえない
      if actor.skill_hit[skill.id] > 100
        actor.skill_hit[skill.id] = 100
      end
    end
  end
  
  #--------------------------------------------------------------------------
  # ● スキルレベル設定(レベルアップ)
  #     actor_id  :   アクターID
  #     skill_id  :   スキルID
  #--------------------------------------------------------------------------
  def skill_level_up(actor_id, skill_id)
    actor = $game_actors[actor_id]
    set_skill_level(actor_id, skill_id, actor.skill_level[skill_id]+1)
  end
  
  #--------------------------------------------------------------------------
  # ● スキルレベル設定(レベルダウン)
  #     actor_id  :   アクターID
  #     skill_id  :   スキルID
  #--------------------------------------------------------------------------
  def skill_level_down(actor_id, skill_id)
    actor = $game_actors[actor_id]
    set_skill_level(actor_id, skill_id, actor.skill_level[skill_id]-1)
  end
end

#==============================================================================
#==============================================================================
[/pre]

回复

使用道具 举报

梦石
0
星屑
47
在线时间
976 小时
注册时间
2011-4-30
回帖
846
发表于 2013-1-19 15:48:50 | 显示全部楼层
君子兰 发表于 2013-1-19 14:26
大人对不起,您给的那个范例测试时没有问题,
可是这个脚本升级版的好像改了很多东西,跟我原本用的那些 ...

Project4.rar (195.83 KB, 下载次数: 98)

这个是直接在你给我的未修改版本上改的,几个要点说一下。

首先首次技能升级会出现个提示框,这个不知道怎么回事,懒得看,不过第二次升级就不出现了,不知道你这边会不会出来。

这个技能升级与5.2版区别在于,5.2版本会攻击后补上本该学到的技能,而这个版本必须在技能升级时才会领悟,错过了就学不了了。

比如假设扫荡lv1时候可以学火炎,那么领悟扫荡删除十字斩后,扫荡是继承的十字斩等级,比如说2,那么之前设置的lv1领悟火炎就无法学会了。
湿滑落式骑!
回复

使用道具 举报

梦石
0
星屑
105
在线时间
2107 小时
注册时间
2011-2-23
回帖
72
 楼主| 发表于 2013-1-19 16:10:15 | 显示全部楼层
本帖最后由 君子兰 于 2013-1-19 17:12 编辑
羞射了 发表于 2013-1-19 16:48
这个是直接在你给我的未修改版本上改的,几个要点说一下。

首先首次技能升级会出现个提示框,这个不知 ...


这个在我这边完全可以,也不会出现提示框,真的是太感谢您了!
刚刚看了很久新版和旧版的对比,真的增加了很多东西,自己乱改看来真的是不行啊!orz
不过想想还是认可了您之前给的那个新版的答案。如果万一还有其他有这方面需要的人搜到这里的话,在没有冲突的情况下,还是用新一点的版本会比较好吧~~
总之谢谢您了!

点评

啊,不好意思,我看错了,把你看成我了……==b  发表于 2013-1-19 16:23
是的,真的谢谢您啦~~~  发表于 2013-1-19 16:22
哈哈,你也是好心人~  发表于 2013-1-19 16:18
回复

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部