Project1

标题: RPG的转职系统,哪位帮我找出直接转职的 [打印本页]

作者: 夺爱    时间: 2009-7-2 15:51
标题: RPG的转职系统,哪位帮我找出直接转职的
本帖最后由 凌辰 于 2009-7-2 18:20 编辑

RPG的转职系统,
哪位帮我找出直接转职的。
意思就是不调用$scene = Scene_JobChange.new,选择职业界面。
而是直接和 事件对话,直接转职的,哪位可以帮我找出那段脚本。
不知道理解了没。。

#==============================================================================
# 本脚本来自www.66RPG.com,使用和转载请保留此信息
#==============================================================================


#==============================================================================
#     ◆ 転職システム - job_change◆
#------------------------------------------------------------------------------
#  某RPG的转职系统
#==============================================================================

#描绘职业
JOB_POP = true

#原始职业编号(无职业)
JOB_ID = 10

#角色们的初期职业编号
JOB_ID_ARRAY = [1,4,3,4,1,8,9,7]

#职业的最大等级
JOB_LV_MAX = 3

#显示技能学习
JOB_CHANGE_SKILL = true

#职业能力值变化设定(百分率)
#[职业名, HP, MP, 力量, 灵巧, 速度, 魔, [每一级职业可以学会的特技编号], [升级所需战斗次数]]
#无职业设置为全100即可
#[0,57,58,59,60]表示职业的2、3、4、5级学会特技编号为57、58、59、60
#[1,2,3,4]表示升2级需要战斗至少1次

JOB_LIST = [


  ["无职业",  100, 100, 100, 100, 100, 100, [ 0, 57, 58, 59, 60], [1, 2, 3, 4]],#2
  ["焰兵",    110, 130, 110, 110, 100, 150, [ 0, 61, 62, 63, 64], [1, 2, 3, 4]],#3
  ["斗兵",    120, 100, 120, 120, 140, 100, [ 0, 65, 66, 67, 68], [1, 3, 3, 4]],
  ["-----",   100, 100, 100, 100, 100, 100, [ 0, 69, 70, 71, 72], [1, 2, 3, 4]],
  ["烈将",    120, 140, 120, 120, 140, 220, [ 0, 73, 74, 75, 76], [1, 2, 3, 4]],
  ["战骑",    130, 100, 150, 140, 200, 100, [ 0, 77, 78, 79, 80], [1, 2, 3, 4]],
  ["-----",   100, 100, 100, 100, 100, 100, [ 7, 11, 15, 30, 32], [1, 2, 3, 4]],
  ["职业7",    80, 105,  80, 100,  90, 110, [ 1,  4,  0,  5,  6], [1, 2, 3, 4]],
  ["职业8",    130,  80, 130, 110, 110, 110, [ 0, 80, 76, 64, 72], [1, 3, 6, 10]],
  ["职业9",   130,  80, 130, 110, 110, 110, [21, 24, 27, 30, 32], [1, 3, 6, 10]],
  ["无职业",     100, 100, 100, 100, 100, 100]
  ]
#——这个不用改
JOB_SIZE = JOB_LIST.size - 1
#==============================================================================
# ■ Game_Actor
#------------------------------------------------------------------------------
#   アクターを扱うクラスです。このクラスは Game_Actors クラス ($game_actors)
# の内部で使用され、Game_Party クラス ($game_party) からも参照されます。
#==============================================================================

class Game_Actor < Game_Battler
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #     actor_id : アクター ID
  #--------------------------------------------------------------------------
  def initialize(actor_id)
    super()
    if JOB_ID_ARRAY[actor_id - 1] != nil && JOB_ID_ARRAY[actor_id - 1] != JOB_SIZE
      @job_id = JOB_ID_ARRAY[actor_id - 1]
    else
      @job_id = JOB_ID
    end
    @job_level = []
    @job_exp = []
    setup(actor_id)
  end
  #--------------------------------------------------------------------------
  # ● セットアップ
  #     actor_id : アクター ID
  #--------------------------------------------------------------------------
  def setup(actor_id)
    actor = $data_actors[actor_id]
    @actor_id = actor_id
    @name = actor.name
    @character_name = actor.character_name
    @character_hue = actor.character_hue
    @battler_name = actor.battler_name
    @battler_hue = actor.battler_hue
    @class_id = actor.class_id
    @weapon_id = actor.weapon_id
    @armor1_id = actor.armor1_id
    @armor2_id = actor.armor2_id
    @armor3_id = actor.armor3_id
    @armor4_id = actor.armor4_id
    @level = actor.initial_level
    @exp_list = Array.new(101)
    make_exp_list
    @exp = @exp_list[@level]
    @skills = []
    @hp = maxhp
    @sp = maxsp
    @states = []
    @states_turn = {}
    @maxhp_plus = 0
    @maxsp_plus = 0
    @str_plus = 0
    @dex_plus = 0
    @agi_plus = 0
    @int_plus = 0
    # スキル習得
    for i in 1..@level
      for j in $data_classes[@class_id].learnings
        if j.level == i
          learn_skill(j.skill_id)
        end
      end
    end
   
    if JOB_LIST[@job_id][7][0] != 0
      learn_skill(JOB_LIST[@job_id][7][0])
    end
   
    for i in 0...JOB_SIZE
      if @job_id == i
        @job_level.push(1)
        @job_exp.push(0)
      else
        @job_level.push(0)
        @job_exp.push(0)
      end
    end
   
    # オートステートを更新
    update_auto_state(nil, $data_armors[@armor1_id])
    update_auto_state(nil, $data_armors[@armor2_id])
    update_auto_state(nil, $data_armors[@armor3_id])
    update_auto_state(nil, $data_armors[@armor4_id])
  end
  #--------------------------------------------------------------------------
  # ● 基本 MaxHP の取得
  #--------------------------------------------------------------------------
  def base_maxhp
    return $data_actors[@actor_id].parameters[0, @level] * JOB_LIST[@job_id][1] / 100
  end
  #--------------------------------------------------------------------------
  # ● 基本 MaxSP の取得
  #--------------------------------------------------------------------------
  def base_maxsp
    return $data_actors[@actor_id].parameters[1, @level] * JOB_LIST[@job_id][2] / 100
  end
  #--------------------------------------------------------------------------
  # ● 基本腕力の取得
  #--------------------------------------------------------------------------
  def base_str
    n = $data_actors[@actor_id].parameters[2, @level] * JOB_LIST[@job_id][3] / 100
    weapon = $data_weapons[@weapon_id]
    armor1 = $data_armors[@armor1_id]
    armor2 = $data_armors[@armor2_id]
    armor3 = $data_armors[@armor3_id]
    armor4 = $data_armors[@armor4_id]
    n += weapon != nil ? weapon.str_plus : 0
    n += armor1 != nil ? armor1.str_plus : 0
    n += armor2 != nil ? armor2.str_plus : 0
    n += armor3 != nil ? armor3.str_plus : 0
    n += armor4 != nil ? armor4.str_plus : 0
    return [[n, 1].max, 999].min
  end
  #--------------------------------------------------------------------------
  # ● 基本器用さの取得
  #--------------------------------------------------------------------------
  def base_dex
    n = $data_actors[@actor_id].parameters[3, @level] * JOB_LIST[@job_id][4] / 100
    weapon = $data_weapons[@weapon_id]
    armor1 = $data_armors[@armor1_id]
    armor2 = $data_armors[@armor2_id]
    armor3 = $data_armors[@armor3_id]
    armor4 = $data_armors[@armor4_id]
    n += weapon != nil ? weapon.dex_plus : 0
    n += armor1 != nil ? armor1.dex_plus : 0
    n += armor2 != nil ? armor2.dex_plus : 0
    n += armor3 != nil ? armor3.dex_plus : 0
    n += armor4 != nil ? armor4.dex_plus : 0
    return [[n, 1].max, 999].min
  end
  #--------------------------------------------------------------------------
  # ● 基本素早さの取得
  #--------------------------------------------------------------------------
  def base_agi
    n = $data_actors[@actor_id].parameters[4, @level] * JOB_LIST[@job_id][5] / 100
    weapon = $data_weapons[@weapon_id]
    armor1 = $data_armors[@armor1_id]
    armor2 = $data_armors[@armor2_id]
    armor3 = $data_armors[@armor3_id]
    armor4 = $data_armors[@armor4_id]
    n += weapon != nil ? weapon.agi_plus : 0
    n += armor1 != nil ? armor1.agi_plus : 0
    n += armor2 != nil ? armor2.agi_plus : 0
    n += armor3 != nil ? armor3.agi_plus : 0
    n += armor4 != nil ? armor4.agi_plus : 0
    return [[n, 1].max, 999].min
  end
  #--------------------------------------------------------------------------
  # ● 基本魔力の取得
  #--------------------------------------------------------------------------
  def base_int
    n = $data_actors[@actor_id].parameters[5, @level] * JOB_LIST[@job_id][6] / 100
    weapon = $data_weapons[@weapon_id]
    armor1 = $data_armors[@armor1_id]
    armor2 = $data_armors[@armor2_id]
    armor3 = $data_armors[@armor3_id]
    armor4 = $data_armors[@armor4_id]
    n += weapon != nil ? weapon.int_plus : 0
    n += armor1 != nil ? armor1.int_plus : 0
    n += armor2 != nil ? armor2.int_plus : 0
    n += armor3 != nil ? armor3.int_plus : 0
    n += armor4 != nil ? armor4.int_plus : 0
    return [[n, 1].max, 999].min
  end
  #--------------------------------------------------------------------------
  # ● 基本 MaxHP の取得
  #--------------------------------------------------------------------------
  def base_maxhp_false
    return $data_actors[@actor_id].parameters[0, @level]
  end
  #--------------------------------------------------------------------------
  # ● 基本 MaxSP の取得
  #--------------------------------------------------------------------------
  def base_maxsp_false
    return $data_actors[@actor_id].parameters[1, @level]
  end
  #--------------------------------------------------------------------------
  # ● 基本腕力の取得
  #--------------------------------------------------------------------------
  def base_str_false
    n = $data_actors[@actor_id].parameters[2, @level]
    return [[n, 1].max, 999].min
  end
  #--------------------------------------------------------------------------
  # ● 基本器用さの取得
  #--------------------------------------------------------------------------
  def base_dex_false
    n = $data_actors[@actor_id].parameters[3, @level]
    return [[n, 1].max, 999].min
  end
  #--------------------------------------------------------------------------
  # ● 基本素早さの取得
  #--------------------------------------------------------------------------
  def base_agi_false
    n = $data_actors[@actor_id].parameters[4, @level]
    return [[n, 1].max, 999].min
  end
  #--------------------------------------------------------------------------
  # ● 基本魔力の取得
  #--------------------------------------------------------------------------
  def base_int_false
    n = $data_actors[@actor_id].parameters[5, @level]
    return [[n, 1].max, 999].min
  end
  #--------------------------------------------------------------------------
  # ● クラス名の取得
  #--------------------------------------------------------------------------
  def job_name
    return JOB_LIST[@job_id][0]
  end
  #--------------------------------------------------------------------------
  # ● ジョブ ID の取得
  #--------------------------------------------------------------------------
  def job_id
    return @job_id
  end
  #--------------------------------------------------------------------------
  # ● ジョブ LV の取得
  #--------------------------------------------------------------------------
  def job_level_get(get_job)
    return @job_level[get_job]
  end
  #--------------------------------------------------------------------------
  # ● ジョブ ID の変更
  #     job_id : 新しいジョブ ID
  #--------------------------------------------------------------------------
  def job_id=(job_id)
    @job_id = job_id
    if @job_level[@job_id] == 0
      @job_level[@job_id] += 1
      if JOB_LIST[@job_id][7][0] != 0
        learn_skill(JOB_LIST[@job_id][7][0])
      end
    end
    @hp = [@hp, self.maxhp].min
    @sp = [@sp, self.maxsp].min
  end
  #--------------------------------------------------------------------------
  # ● ジョブ LV の変更
  #     job_id    : ジョブ ID
  #     job_level : LV @job_level
  #--------------------------------------------------------------------------
  def job_level(job_id, job_level)
    job_level > JOB_LV_MAX ? job_level = 5 : job_level
    if job_level > @job_level[job_id]
      for i in @job_level[job_id]...job_level
        if JOB_LIST[job_id][7] != 0# &&
          learn_skill(JOB_LIST[job_id][7])
        end
      end
    end
    job_level <= 1 ? @job_exp[job_id] = 0 : @job_exp[job_id] = JOB_LIST[job_id][8][job_level - 1]
    job_level == 0 ? @job_level[job_id] = 0 : @job_level[job_id] = job_level
  end
  #--------------------------------------------------------------------------
  # ● 戦闘時の処理
  #--------------------------------------------------------------------------
  def job_battler
    if @job_id != JOB_SIZE && @job_level[@job_id] != JOB_LV_MAX
      @job_exp[@job_id] += 1
      if JOB_LIST[@job_id][8][@job_level[@job_id] - 1] <= @job_exp[@job_id]
        $job_level_up = true
        if JOB_LIST[@job_id][7][@job_level[@job_id]] != 0
          learn_skill(JOB_LIST[@job_id][7][@job_level[@job_id]])
          $job_skill = JOB_LIST[@job_id][7][@job_level[@job_id]]
        end
        @job_level[@job_id] += 1
      end
    end
  end
end

#-------------------------------------------------------------------------------

#==============================================================================
# ■ Window_Base
#------------------------------------------------------------------------------
#   ゲーム中のすべてのウィンドウのスーパークラスです。
#==============================================================================

class Window_Base < Window
  #--------------------------------------------------------------------------
  # ● クラスの描画
  #     actor : アクター
  #     x     : 描画先 X 座標
  #     y     : 描画先 Y 座標
  #--------------------------------------------------------------------------
  def draw_actor_class(actor, x, y)
    self.contents.font.color = normal_color
    if JOB_POP && actor.job_name != "无职业"
      self.contents.draw_text(x, y, 236, 32, actor.job_name)
    else
      self.contents.draw_text(x, y, 236, 32, actor.class_name)   
    end
  end
end

#-------------------------------------------------------------------------------

#==============================================================================
# ■ Window_JobCommand
#------------------------------------------------------------------------------
#   転職画面のコマンド表示するウィンドウです。
#==============================================================================

class Window_JobCommand < Window_Selectable
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #     actor : アクター
  #--------------------------------------------------------------------------
  def initialize(actor)
    super(0, 0, 240, 480)
    @item_max = JOB_LIST.size
    self.contents = Bitmap.new(width - 32, @item_max * 32)
    @actor = actor
    refresh
    self.index = 0
    self.active = true
  end
  #--------------------------------------------------------------------------
  # ● リフレッシュ
  #--------------------------------------------------------------------------
  def refresh
    self.contents.clear
    for i in 0...JOB_LIST.size
      self.contents.draw_text(4, i * 32, 181, 32, JOB_LIST[0])
    end
  end
end

#-------------------------------------------------------------------------------

#==============================================================================
# ■ Window_JobStatus
#------------------------------------------------------------------------------
#   転職画面でステータスを表示するウィンドウです。
#==============================================================================

class Window_JobStatus < Window_Base
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #     actor : アクター
  #--------------------------------------------------------------------------
  def initialize(actor)
    super(240, 0, 400, 480)
    self.contents = Bitmap.new(width - 32, height - 32)
    @actor = actor
    @sprite = Sprite.new
    refresh
  end
  #--------------------------------------------------------------------------
  # ● リフレッシュ
  #--------------------------------------------------------------------------
  def refresh(jobcommand = 0)
    @sprite = Sprite.new
    @sprite.bitmap = RPG::Cache.battler(@actor.battler_name, @actor.battler_hue)
    @sprite.x = 260
    @sprite.y = 30
    @sprite.z = 9999
    self.contents.clear
    self.contents.font.color = system_color
    self.contents.draw_text(4, 0 * 32, 190, 32, "HP", 2)
    self.contents.draw_text(4, 1 * 32, 190, 32, "MP", 2)
    self.contents.draw_text(4, 2 * 32, 190, 32, $data_system.words.str, 2)
    self.contents.draw_text(4, 3 * 32, 190, 32, $data_system.words.dex, 2)
    self.contents.draw_text(4, 4 * 32, 190, 32, $data_system.words.agi, 2)
    self.contents.draw_text(4, 5 * 32, 190, 32, $data_system.words.int, 2)
    for i in 0...6
      draw_actor_parameter(@actor, 200, i * 32, i, jobcommand)
    end
    if jobcommand != JOB_SIZE
      txt = ""
      for i in 0...JOB_LV_MAX
        if @actor.job_level_get(jobcommand) > i
          txt += "是"
        end
      end
      if txt == ""
        txt += "否"
      end
      self.contents.draw_text(4, 6.5 * 32, 260, 32, txt,2)
      self.contents.font.color = system_color
      self.contents.draw_text(4, 6.5 * 32, 220, 32, "已经是当前所处职业")
      if JOB_CHANGE_SKILL
        self.contents.draw_text(4, 8 * 32, 112, 32, "学会特技")
        h = 0
        for i in 0...JOB_LV_MAX
          if JOB_LIST[jobcommand][7] != 0
            skill = $data_skills[JOB_LIST[jobcommand][7]]
            self.contents.font.color = system_color
            u = i + 1
            self.contents.draw_text(48, i * 32 + 288 - h, 364, 32, "达到LV" + u.to_s)
            self.contents.font.color = normal_color
#            self.contents.draw_text(158, i * 32 + 288 - h, 364, 32, skill.name)
          else
            h += 32
          end
        end
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● パラメータの描画
  #     actor : アクター
  #     x     : 描画先 X 座標
  #     y     : 描画先 Y 座標
  #     type  : パラメータの種類 (0~6)
  #--------------------------------------------------------------------------
  def draw_actor_parameter(actor, x, y, type, job)
    case type
    when 0
      parameter_name = actor.maxhp
      parameter_value = actor.base_maxhp_false * JOB_LIST[job][1] / 100
    when 1
      parameter_name = actor.maxsp
      parameter_value = actor.base_maxsp_false * JOB_LIST[job][2] / 100
    when 2
      parameter_name = actor.str
      parameter_value = actor.base_str_false * JOB_LIST[job][3] / 100
    when 3
      parameter_name = actor.dex
      parameter_value = actor.base_dex_false * JOB_LIST[job][4] / 100
    when 4
      parameter_name = actor.agi
      parameter_value = actor.base_agi_false * JOB_LIST[job][5] / 100
    when 5
      parameter_name = actor.int
      parameter_value = actor.base_int_false * JOB_LIST[job][6] / 100
    end
    self.contents.font.color = normal_color
    self.contents.draw_text(x, y, 64, 32, parameter_name.to_s, 2)
    self.contents.draw_text(x + 66, y, 32, 32, " ⇒ ", 1)
    self.contents.font.color = parameter_value < parameter_name ? text_color(2) :
    parameter_value == parameter_name ? normal_color : text_color(3)
    self.contents.draw_text(x + 80, y, 64, 32, parameter_value.to_s, 2)
    self.contents.font.color = normal_color
  end
  def dispose
    super   
    @sprite.bitmap.dispose
    @sprite.dispose
  end  
end

#-------------------------------------------------------------------------------

#==============================================================================
# ■ Scene_JobChange
#------------------------------------------------------------------------------
#   転職画面処理を行うクラスです。
#==============================================================================

class Scene_JobChange
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #     actor_index : アクターインデックス
  #--------------------------------------------------------------------------
  def initialize(actor_index = 0)
    @actor_index = actor_index
  end
  #--------------------------------------------------------------------------
  # ● メイン処理
  #--------------------------------------------------------------------------
  def main
    # アクターを取得
    @actor = $game_party.actors[@actor_index]
    # ウィンドウを作成
    @command_window = Window_JobCommand.new(@actor)
    @status_window = Window_JobStatus.new(@actor)
    # トランジション実行
    Graphics.transition
    # メインループ
    loop do
      # ゲーム画面を更新
      Graphics.update
      # 入力情報を更新
      Input.update
      # フレーム更新
      update
      # 画面が切り替わったらループを中断
      if $scene != self
        break
      end
    end
    # トランジション準備
    Graphics.freeze
    # ウィンドウを解放
    @command_window.dispose
    @status_window.dispose
  end
  #--------------------------------------------------------------------------
  # ● フレーム更新
  #--------------------------------------------------------------------------
  def update
    # ウィンドウを更新
    @command_window.update
    @status_window.update
    if @now_jobcommand != @command_window.index
      # カーソル位置によって表示する画面を変える
      @status_window.refresh(@command_window.index)
      @now_jobcommand = @command_window.index
    end
    # B ボタンが押された場合
    if Input.trigger?(Input::B)
      # キャンセル SE を演奏
      $game_system.se_play($data_system.cancel_se)
      # マップ画面に切り替え
      $scene = Scene_Map.new
      return
    end
    if Input.repeat?(Input::C)
      # 決定 SE を演奏
      $game_system.se_play($data_system.decision_se)
      @actor.job_id = @command_window.index
      # マップ画面に切り替え
      $scene = Scene_Map.new
    end   
    if Input.trigger?(Input::L)
      $game_system.se_play($data_system.decision_se)
      id = @actor_index-1
      if id == -1
        id = $game_party.actors[$game_party.actors.size-1]
      end
      $scene = Scene_JobChange.new(id)
    end
    if Input.trigger?(Input::R)
      $game_system.se_play($data_system.decision_se)
      id = @actor_index+1
      if id == $game_party.actors.size
        id = 0
      end
      $scene = Scene_JobChange.new(id)
    end
  end
end

#------------------------------------------------------------------------------

#==============================================================================
# ■ Scene_CommandName
#------------------------------------------------------------------------------
#  パーティ選択画面の処理を行うクラスです。
#==============================================================================

class Scene_CommandName
  #--------------------------------------------------------------------------
  # ● メイン処理
  #--------------------------------------------------------------------------
  def main
    # スプライトセットを作成
    @spriteset = Spriteset_Map.new
    # コマンドウィンドウを作成
    s = []
    for i in 0...$game_party.actors.size
      actor = $game_party.actors
      s = actor.name
    end
    @command_window = Window_Command.new(192, s)
    @command_window.back_opacity = 160
    @command_window.x = 320 - @command_window.width / 2
    @command_window.y = 240 - @command_window.height / 2
    # トランジション実行
    Graphics.transition
    # メインループ
    loop do
      # ゲーム画面を更新
      Graphics.update
      # 入力情報を更新
      Input.update
      # フレーム更新
      update
      # 画面が切り替わったらループを中断
      if $scene != self
        break
      end
    end
    # トランジション準備
    Graphics.freeze
    # ウィンドウを解放
    @command_window.dispose
    @spriteset.dispose
  end
  #--------------------------------------------------------------------------
  # ● フレーム更新
  #--------------------------------------------------------------------------
  def update
    # コマンドウィンドウを更新
    @command_window.update
    # B ボタンが押された場合
    if Input.trigger?(Input::B)
      # キャンセル SE を演奏
      $game_system.se_play($data_system.cancel_se)
      # マップ画面に切り替え
      $scene = Scene_Map.new
      return
    end
    # C ボタンが押された場合
    if Input.repeat?(Input::C)
      # 決定 SE を演奏
      $game_system.se_play($data_system.decision_se)
      # 転職画面に切り替え
      $scene = Scene_JobChange.new(@command_window.index)
    end
  end
end


#-------------------------------------------------------------------------------

#==============================================================================
# ■ Window_JobBattle
#------------------------------------------------------------------------------
#  バトル終了時に、職業のLVアップなどを表示するウィンドウです。
#==============================================================================

class Window_JobBattle < Window_Base
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #     exp       : EXP
  #     gold      : ゴールド
  #     treasures : トレジャー
  #--------------------------------------------------------------------------
  def initialize(txt)
    @txt = txt
    super(320, 0, 320, @txt.size * 32 + 32)
    self.y = 160 - height / 2
    self.contents = Bitmap.new(width - 32, height - 32)
    self.back_opacity = 160
    self.visible = false
    refresh
  end
  #--------------------------------------------------------------------------
  # ● リフレッシュ
  #--------------------------------------------------------------------------
  def refresh
    self.contents.clear
    self.contents.font.color = normal_color
    y = 0
    for i in [email protected]
      if i % 2 == 0
        self.contents.draw_text(4, y, 288, 32, @txt.name + "的职业等级上升了")
        y += 32
      else
        if @txt != 0
          self.contents.draw_text(4, y, 288, 32, @txt[i - 1].name + " 领悟 " + @txt.name + " !")
          y += 32
        end
      end
    end
  end
end

#-------------------------------------------------------------------------------

#==============================================================================
# ■ Scene_Battle (分割定義 2)
#------------------------------------------------------------------------------
#   バトル画面の処理を行うクラスです。
#==============================================================================

class Scene_Battle
  #--------------------------------------------------------------------------
  # ● メイン処理
  #--------------------------------------------------------------------------
  def main
    # 戦闘用の各種一時データを初期化
    $game_temp.in_battle = true
    $game_temp.battle_turn = 0
    $game_temp.battle_event_flags.clear
    $game_temp.battle_abort = false
    $game_temp.battle_main_phase = false
    $game_temp.battleback_name = $game_map.battleback_name
    $game_temp.forcing_battler = nil
    # バトルイベント用インタプリタを初期化
    $game_system.battle_interpreter.setup(nil, 0)
    # トループを準備
    @troop_id = $game_temp.battle_troop_id
    $game_troop.setup(@troop_id)
    # アクターコマンドウィンドウを作成
    s1 = $data_system.words.attack
    s2 = $data_system.words.skill
    s3 = $data_system.words.guard
    s4 = $data_system.words.item
    @actor_command_window = Window_Command.new(160, [s1, s2, s3, s4])
    @actor_command_window.y = 160
    @actor_command_window.back_opacity = 160
    @actor_command_window.active = false
    @actor_command_window.visible = false
    # その他のウィンドウを作成
    @party_command_window = Window_PartyCommand.new
    @help_window = Window_Help.new
    @help_window.back_opacity = 160
    @help_window.visible = false
    @status_window = Window_BattleStatus.new
    @message_window = Window_Message.new
    # スプライトセットを作成
    @spriteset = Spriteset_Battle.new
    # ウェイトカウントを初期化
    @wait_count = 0
    # トランジション実行
    if $data_system.battle_transition == ""
      Graphics.transition(20)
    else
      Graphics.transition(40, "Graphics/Transitions/" +
        $data_system.battle_transition)
    end
    # プレバトルフェーズ開始
    start_phase1
    # メインループ
    loop do
      # ゲーム画面を更新
      Graphics.update
      # 入力情報を更新
      Input.update
      # フレーム更新
      update
      # 画面が切り替わったらループを中断
      if $scene != self
        break
      end
    end
    # マップをリフレッシュ
    $game_map.refresh
    # トランジション準備
    Graphics.freeze
    # ウィンドウを解放
    @actor_command_window.dispose
    @party_command_window.dispose
    @help_window.dispose
    @status_window.dispose
    @message_window.dispose
    if @skill_window != nil
      @skill_window.dispose
    end
    if @item_window != nil
      @item_window.dispose
    end
    if @result_window != nil
      @result_window.dispose
    end
    if @job_window != nil
      @job_window.dispose
    end
    # スプライトセットを解放
    @spriteset.dispose
    # タイトル画面に切り替え中の場合
    if $scene.is_a?(Scene_Title)
      # 画面をフェードアウト
      Graphics.transition
      Graphics.freeze
    end
    # 戦闘テストからゲームオーバー画面以外に切り替え中の場合
    if $BTEST and not $scene.is_a?(Scene_Gameover)
      $scene = nil
    end
  end
  #--------------------------------------------------------------------------
  # ● アフターバトルフェーズ開始
  #--------------------------------------------------------------------------
  def start_phase5
    # フェーズ 5 に移行
    @phase = 5
    # バトル終了 ME を演奏
    $game_system.me_play($game_system.battle_end_me)
    # バトル開始前の BGM に戻す
    $game_system.bgm_play($game_temp.map_bgm)
    # EXP、ゴールド、トレジャーを初期化
    exp = 0
    gold = 0
    treasures = []
    # ループ
    for enemy in $game_troop.enemies
      # エネミーが隠れ状態でない場合
      unless enemy.hidden
        # 獲得 EXP、ゴールドを追加
        exp += enemy.exp
        gold += enemy.gold
        # トレジャー出現判定
        if rand(100) < enemy.treasure_prob
          if enemy.item_id > 0
            treasures.push($data_items[enemy.item_id])
          end
          if enemy.weapon_id > 0
            treasures.push($data_weapons[enemy.weapon_id])
          end
          if enemy.armor_id > 0
            treasures.push($data_armors[enemy.armor_id])
          end
        end
      end
    end
    # トレジャーの数を 6 個までに限定
    treasures = treasures[0..5]
    # EXP 獲得
    for i in 0...$game_party.actors.size
      actor = $game_party.actors
      if actor.cant_get_exp? == false
        last_level = actor.level
        actor.exp += exp
        if actor.level > last_level
          @status_window.level_up(i)
        end
      end
    end
    # ゴールド獲得
    $game_party.gain_gold(gold)
    # トレジャー獲得
    for item in treasures
      case item
      when RPG::Item
        $game_party.gain_item(item.id, 1)
      when RPG::Weapon
        $game_party.gain_weapon(item.id, 1)
      when RPG::Armor
        $game_party.gain_armor(item.id, 1)
      end
    end
   
   
    # バトルリザルトウィンドウを作成
    @result_window = Window_BattleResult.new(exp, gold, treasures)
    # ウェイトカウントを設定
    @phase5_wait_count = 100
    job_exp = []
    $job_level_up = false
    $job_skill = 0
    for i in 0...$game_party.actors.size
      actor = $game_party.actors
      actor.job_battler
      if $job_level_up
        job_exp.push($game_party.actors, $data_skills[$job_skill])
        $job_level_up = false
        $job_skill = 0
      end
    end
    if job_exp.empty?
      @result_window.x = 160
    else
      @job_window = Window_JobBattle.new(job_exp)
    end
   
   
  end
  #--------------------------------------------------------------------------
  # ● フレーム更新 (アフターバトルフェーズ)
  #--------------------------------------------------------------------------
  def update_phase5
    # ウェイトカウントが 0 より大きい場合
    if @phase5_wait_count > 0
      # ウェイトカウントを減らす
      @phase5_wait_count -= 1
      # ウェイトカウントが 0 になった場合
      if @phase5_wait_count == 0
        # リザルトウィンドウを表示
        @result_window.visible = true
        if @job_window != nil
          @job_window.visible = true
        end
        # メインフェーズフラグをクリア
        $game_temp.battle_main_phase = false
        # ステータスウィンドウをリフレッシュ
        @status_window.refresh
      end
      return
    end
    # C ボタンが押された場合
    if Input.trigger?(Input::C)
      # バトル終了
      battle_end(0)
    end
  end
end

#-------------------------------------------------------------------------------

#==============================================================================
# ■ Window_Status2
#------------------------------------------------------------------------------
#  職業のLVなどを画面で表示するウィンドウです。
#==============================================================================

class Window_Status2 < Window_Base
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #     actor : アクター
  #--------------------------------------------------------------------------
  def initialize(actor)
    super(0, 0, 640, 480)
    if JOB_SIZE > 24
      if JOB_SIZE % 6 == 0
        width = JOB_SIZE / 6 * 160 - (JOB_SIZE / 6 * 5)
      else
        width = JOB_SIZE / 6 * 160 + 120 - (JOB_SIZE / 6 * 5)
      end
    else
      width = 640
    end
    self.contents = Bitmap.new(width - 32, height - 32)
    self.visible = false
    @actor = actor
    refresh
  end
  #--------------------------------------------------------------------------
  # ● リフレッシュ
  #--------------------------------------------------------------------------
  def refresh
    self.contents.clear
    for i in 0...JOB_SIZE
      x = i / 6 * 152
      y = i % 6 * 76
      txt = ""
      job_name = JOB_LIST[0]      
      for j in 0...JOB_LV_MAX
        if @actor.job_level_get(i) > j
          txt += "☆"
        end
      end
      self.contents.draw_text(x, y + 32, 152, 32, txt)
      self.contents.draw_text(x, y, 152, 32, job_name)
    end
  end
end

#-------------------------------------------------------------------------------

#==============================================================================
# ■ Scene_Status
#------------------------------------------------------------------------------
#  ステータス画面の処理を行うクラスです。
#==============================================================================

class Scene_Status
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #     actor_index : アクターインデックス
  #--------------------------------------------------------------------------
  def initialize(actor_index = 0, equip_index = 0)
    @actor_index = actor_index
  end
  #--------------------------------------------------------------------------
  # ● メイン処理
  #--------------------------------------------------------------------------
  def main
    # アクターを取得
    @actor = $game_party.actors[@actor_index]
    # ステータスウィンドウを作成
    @status_window = Window_Status.new(@actor)
    @status2_window = Window_Status2.new(@actor)
    # トランジション実行
    Graphics.transition
    # メインループ
    loop do
      # ゲーム画面を更新
      Graphics.update
      # 入力情報を更新
      Input.update
      # フレーム更新
      update
      # 画面が切り替わったらループを中断
      if $scene != self
        break
      end
    end
    # トランジション準備
    Graphics.freeze
    # ウィンドウを解放
    @status_window.dispose
    @status2_window.dispose
  end
  #--------------------------------------------------------------------------
  # ● フレーム更新
  #--------------------------------------------------------------------------
  def update
    # C ボタンが押された場合
    if Input.trigger?(Input::C)
      # 決定 SE を演奏
      $game_system.se_play($data_system.decision_se)
      @status_window.visible = !@status_window.visible
      @status2_window.visible = !@status2_window.visible
    end
    # B ボタンが押された場合
    if Input.trigger?(Input::B)
      # キャンセル SE を演奏
      $game_system.se_play($data_system.cancel_se)
      # メニュー画面に切り替え
      $scene = Scene_Menu.new(3)
      return
    end
    # R ボタンが押された場合
    if Input.trigger?(Input::R)
      # カーソル SE を演奏
      $game_system.se_play($data_system.cursor_se)
      # 次のアクターへ
      @actor_index += 1
      @actor_index %= $game_party.actors.size
      # 別のステータス画面に切り替え
      $scene = Scene_Status.new(@actor_index)
      return
    end
    # L ボタンが押された場合
    if Input.trigger?(Input::L)
      # カーソル SE を演奏
      $game_system.se_play($data_system.cursor_se)
      # 前のアクターへ
      @actor_index += $game_party.actors.size - 1
      @actor_index %= $game_party.actors.size
      # 別のステータス画面に切り替え
      $scene = Scene_Status.new(@actor_index)
      return
    end
    if JOB_SIZE > 24 && @status2_window.visible
      # 方向ボタンの右が押された場合
      if Input.trigger?(Input::RIGHT)
        if @status2_window.ox != (JOB_SIZE % 6 == 0 ? (JOB_SIZE / 6 - 4) * 152 : (JOB_SIZE / 6 - 3) * 152)
          @status2_window.ox += 152
          $game_system.se_play($data_system.cursor_se)
        end
      end
      # 方向ボタンの左が押された場合
      if Input.trigger?(Input::LEFT)
        if @status2_window.ox != 0
          @status2_window.ox -= 152
          $game_system.se_play($data_system.cursor_se)
        end
      end
    end
  end
end

#==============================================================================
# 本脚本来自www.66RPG.com,使用和转载请保留此信息
#==============================================================================

————————————————————
标题已修改,请遵守版规。

作者: kakarot    时间: 2009-7-2 15:58
不是高手的某飘过~

按LZ所说MS不用脚本用事件就好了~
先在数据库职业选项卡下将各种职业设定好,然后跟事件对话的时候执行更改职业就好了~
作者: 夺爱    时间: 2009-7-2 16:07
你要看看脚本。#[职业名, HP, MP, 力量, 灵巧, 速度, 魔, 】
不用脚本,用事件,这些东西能力百分比就没了!
作者: kakarot    时间: 2009-7-2 16:28
要更改能力百分比的话用事件做有两种办法:
1是把以上参数分别代入某个变量,然后按比例操作后执行增减能力值,增减幅度为操作后的变量就好了~
举例而言,想让角色A的力量在转职后变为原来的150%,那么就先将A的力量值代入临时变量L,再执行变量操作L=LX0.5,然后增减角色能力值,选力量,增加变量L的值就可以了;
2是把相关角色属性连带着职业一起设置,就是在角色选项卡里设置和某角色名字相同的不同职业以及其相关职业的能力值。这个方法若是角色、职业比较少的话可以试试,多了的话就太繁琐了点,不推荐。

咱是事件党,就咱对这段脚本的肤浅理解来看MS直接从里面截出一段来转职是不行的,要进行修改之后再调用才能实现~若是LZ执意要从脚本里面截取的话..等等看有没有脚本达人来给LZ弄吧~
以上
作者: 465889216    时间: 2009-7-2 18:51
提示: 作者被禁止或删除 内容自动屏蔽




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1