메뉴

KGC - 커스텀 메뉴 커멘드 (번역)

by 듀란테 posted Jul 27, 2015
?

단축키

Prev이전 문서

Next다음 문서

ESC닫기

크게 작게 위로 아래로 댓글로 가기 인쇄

일단 원문 링크 올리겠습니다.

http://ytomy.sakura.ne.jp/tkool/rpgtech/php/tech.php?tool=VX&cat=tech_vx/menu&tech=custom_menu_command

 

그리고 이것은, 주석부분을 제가 번역해서 올린겁니다.

 

구글 번역기로 한것이라 맞을지 않맞을지 확실하게는 몰라서, 문제가 생기면 원문링크로 가서 스크립트를 확인해봐주시길 바랍니다.

 

참고로 만약 중복이면 말씀해주세요.

자삭합니다.

 

#여기 밑부터 스크립트입니다. ↓

 

# _ / _ / _ / _ / _ / _ / _ / _ / _ / _ / _ / _ / _ / _ / _ / _ / _ / _ / _ / _ / _ / _ / _ / _ / _ / _ / _ / _ / _ / _ / _ / _ / _ / _ / _ / _ / _ / _ / _ /
 # _ / ◆ 사용자 지정 메뉴 명령 - KGC_CustomMenuCommand ◆ VX ◆
 # _ / ◇ Last update : 2008/08/28 ◇
 # _ / ----------------------------------------------- -----------------------------
 # _ / 메뉴 명령을 자유롭게 정렬합니다.
 # _ / =============================================== =============================
 # _ / 재정이 많기 때문에 가능한 "소재"의 상단에 배치하십시오.
 # _ / "레쿠토루과 검은 사자 문장"덤 스크립트 아래에 소개합니다.
 # _ / _ / _ / _ / _ / _ / _ / _ / _ / _ / _ / _ / _ / _ / _ / _ / _ / _ / _ / _ / _ / _ / _ / _ / _ / _ / _ / _ / _ / _ / _ / _ / _ / _ / _ / _ / _ / _ / _ /

 # ================================================= =============================
 # ★ 사용자 정의 항목 - Customize ★
 # ================================================= =============================

module KGC
module CustomMenuCommand
# ◆ 메뉴 명령 목록
  # 메뉴 화면에 표시되는 명령을 "표시 할 순서"에 설명합니다.
  # 사용하지 않는 명령은 쓰지 않아도 상관 없습니다.
  # ** 대응표 **
  # 0 .. 아이템 1 .. 스킬 2 .. 장비 3 .. 상태 4 .. 세이브 5 .. 게임 종료
  #
  # ** 다음은 해당 기능을 도입하지 않으면 사용할 수 없습니다.
  # 10 .. 파티 편성 (멀티 파티)
  # 11..AP 뷰어 (스킬 습득 장비)
  # 12 .. 스킬 설정 (스킬 CP 제)
  # 13 .. 난이도 설정 (전투 난이도)
  # 14 .. 매개 변수 배분 (매개 변수 배분)
  # 15 .. 몬스터 도감 (몬스터 도감)
  #
  # ** 다음은 "레쿠토루과 검은 사자 문장"덤 스크립트
  # ** [ExMenu_CustomCommand] 용입니다.
  # ** '줄거리'등을 추가하는 경우에 사용하십시오.
  # 100 .. 명령 1 개째
  # 101 .. 명령 2 번째
  # 102 .. 명령 3 번째
  # (이후 199까지 사용 가능)
  MENU_COMMANDS = [0, 1, 2, 3, 12, 14, 11, 10, 13, 100, 15, 4, 5]

 # ◆ 메뉴 명령의 최대 행수
  ROW_MAX = 10
end
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

$imported = {} if $imported == nil
$imported["CustomMenuCommand"] = true

module KGC::CustomMenuCommand
  # [ExMenu_CustomCommand] 도입판정
  EXMNU_CTCMD_OK = defined?(EXMNU_CTCMD_COMMANDS)
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

#==============================================================================
# □ KGC::Commands
#==============================================================================

module KGC
module Commands
  module_function
  #--------------------------------------------------------------------------
  # ○ 상태 화면 호출
  # actor_index : 배우 인덱스
  #--------------------------------------------------------------------------
  def call_status(actor_index = 0)
    return if $game_temp.in_battle
    $game_temp.next_scene = :menu_status
    $game_temp.next_scene_actor_index = actor_index
    $game_temp.menu_command_index = {}
  #--------------------------------------------------------------------------
  # ○ 아이템 화면의 호출
  #--------------------------------------------------------------------------
  def call_item
    return if $game_temp.in_battle
    $game_temp.next_scene = :menu_item
    $game_temp.next_scene_actor_index = 0
    $game_temp.menu_command_index = {}
  end
  #--------------------------------------------------------------------------
  # ○ 스킬 화면의 호출
  # actor_index : 배우 인덱스
  #--------------------------------------------------------------------------
  def call_skill(actor_index = 0)
    return if $game_temp.in_battle
    $game_temp.next_scene = :menu_skill
    $game_temp.next_scene_actor_index = actor_index
    $game_temp.menu_command_index = {}
  end
  #--------------------------------------------------------------------------
  # ○ 장비 화면의 호출
  # actor_index : 배우 인덱스
  #--------------------------------------------------------------------------
  def call_equip(actor_index = 0)
    return if $game_temp.in_battle
    $game_temp.next_scene = :menu_equip
    $game_temp.next_scene_actor_index = actor_index
    $game_temp.menu_command_index = {}
  end
  end
end
end

class Game_Interpreter
  include KGC::Commands
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

#==============================================================================
# ■ Game_Temp
#==============================================================================

class Game_Temp
  #--------------------------------------------------------------------------
  # ● 공개 인스턴스 변수
  #--------------------------------------------------------------------------
  attr_accessor :menu_command_index          #메뉴 명령의 인덱스
  attr_accessor :next_scene_actor_index   # 다음 장면의 배우 인덱스
  #--------------------------------------------------------------------------
  # ● 객체 초기화
  #--------------------------------------------------------------------------
  alias initialize_KGC_CustomMenuCommand initialize
  def initialize
    initialize_KGC_CustomMenuCommand

    @menu_command_index = {}
    @next_scene_actor_index = 0
  end
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

#==============================================================================
# ■ Scene_Map
#==============================================================================

class Scene_Map < Scene_Base
  #--------------------------------------------------------------------------
  # ● 화면 전환 실행
  #--------------------------------------------------------------------------
  alias update_scene_change_KGC_CustomMenuCommand update_scene_change
  def update_scene_change
    return if $game_player.moving?    # 플레이어의 이동 중?

    case $game_temp.next_scene
    when :menu_item
      call_menu_item
    when :menu_skill
      call_menu_skill
    when :menu_equip
      call_menu_equip
    when :menu_status
      call_menu_status
    else
      update_scene_change_KGC_CustomMenuCommand
    end
  end
  #--------------------------------------------------------------------------
  # ○ 아이템 화면으로 전환
  #--------------------------------------------------------------------------
  def call_menu_item
    $game_temp.next_scene = nil
    $scene = Scene_Item.new
  end
  #--------------------------------------------------------------------------
  # ○ 스킬 화면으로 전환
  #--------------------------------------------------------------------------
  def call_menu_skill
    $game_temp.next_scene = nil
    $scene = Scene_Skill.new($game_temp.next_scene_actor_index)
    $game_temp.next_scene_actor_index = 0
  end
  #--------------------------------------------------------------------------
  # ○ 장비 화면으로 전환
  #--------------------------------------------------------------------------
  def call_menu_equip
    $game_temp.next_scene = nil
    $scene = Scene_Equip.new($game_temp.next_scene_actor_index)
    $game_temp.next_scene_actor_index = 0
  end
  #--------------------------------------------------------------------------
  # ○ 상태 화면으로 전환
  #--------------------------------------------------------------------------
  def call_menu_status
    $game_temp.next_scene = nil
    $scene = Scene_Status.new($game_temp.next_scene_actor_index)
    $game_temp.next_scene_actor_index = 0
  end
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

#==============================================================================
# ■ Scene_Menu
#==============================================================================

class Scene_Menu < Scene_Base
  #--------------------------------------------------------------------------
  # ● 명령 창 만들기
  #--------------------------------------------------------------------------
  def create_command_window
    commands = create_command_list
    @command_window = Window_Command.new(160, commands)
    @command_window.height = [@command_window.height,
      KGC::CustomMenuCommand::ROW_MAX * Window_Base::WLH + 32].min
    @command_window.index = [@menu_index, commands.size - 1].min
    set_command_enabled
  end
  #--------------------------------------------------------------------------
  # ○ 명령 목록 작성
  # 명령 이름의 목록을 반환한다.
  #--------------------------------------------------------------------------
  def create_command_list
    commands = []
    index_list = {}
    @exmenu_command_scene = {}
    @disabled_command_index = []

    KGC::CustomMenuCommand::MENU_COMMANDS.each_with_index { |c, i|
      case c
      when 0         # 아이템
        index_list[:item] = commands.size
        commands << Vocab.item
      when 1         # 스킬
        index_list[:skill] = commands.size
        commands << Vocab.skill
      when 2         # 장비
        index_list[:equip] = commands.size
        commands << Vocab.equip
      when 3         # 상태
        index_list[:status] = commands.size
        commands << Vocab.status
      when 4         # 저장
        index_list[:save] = commands.size
        commands << Vocab.save
      when 5         # 게임 종료
        index_list[:game_end] = commands.size
        commands << Vocab.game_end
      when 10        # 파티 편성
        next unless $imported["LargeParty"]
        index_list[:partyform] = commands.size
        @__command_partyform_index = commands.size
        commands << Vocab.partyform
      when 11        # AP 뷰어
        next unless $imported["EquipLearnSkill"]
        index_list[:ap_viewer] = commands.size
        @__command_ap_viewer_index = commands.size
        commands << Vocab.ap_viewer
      when 12        # 스킬 설정
        next unless $imported["SkillCPSystem"]
        index_list[:set_battle_skill] = commands.size
        @__command_set_battle_skill_index = commands.size
        commands << Vocab.set_battle_skill
      when 13        # 전투 난이도
        next unless $imported["BattleDifficulty"]
        index_list[:set_difficulty] = commands.size
        @__command_set_difficulty_index = commands.size
        commands << KGC::BattleDifficulty.get[:name]
      when 14        # 매개 변수 배분
        next unless $imported["DistributeParameter"]
        index_list[:distribute_parameter] = commands.size
        @__command_distribute_parameter_index = commands.size
        commands << Vocab.distribute_parameter
      when 15        # 몬스터 도감
        next unless $imported["EnemyGuide"]
        index_list[:enemy_guide] = commands.size
        @__command_enemy_guide_index = commands.size
        commands << Vocab.enemy_guide
      when 100..199  # ExMenu_CustomCommand
        next unless KGC::CustomMenuCommand::EXMNU_CTCMD_OK  # 사용 불가라면 다음
        excommand = EXMNU_CTCMD_COMMANDS[c - 100]           # 명령 index 취득
        unless command_visible?(excommand) || command_inputable?(excommand)
          next                                              # 보이지 않는이면 다음
        end
        index_list[excommand[2]] = commands.size
        commands << excommand[2]
        @exmenu_command_scene[excommand[2]] = excommand[3]
      end
    }
    $game_temp.menu_command_index = index_list
    return commands
  end
  #--------------------------------------------------------------------------
  # ○ 명령의 유효 상태 설정
  #--------------------------------------------------------------------------
  def set_command_enabled
    disable_items = []
    # 파티 인원이 0 명인 경우
    if $game_party.members.size == 0
      disable_items.push(:item, :skill, :equip, :status, :partyform,
        :ap_viewer, :set_battle_skill, :distribute_parameter)
    end
    # 저장 금지의 경우
    if $game_system.save_disabled
      disable_items.push(:save)
    end

    # 파티 편성 금지의 경우
    if $imported["LargeParty"] && !$game_party.partyform_enable?
      disable_items.push(:partyform)
    end

    # [ExMenu_CustomCommand] 판정
    if KGC::CustomMenuCommand::EXMNU_CTCMD_OK
      disable_items += get_exmenu_disable_commands
    end

    # 지정 항목을 비활성화
    disable_items.each { |i|
      if $game_temp.menu_command_index.has_key?(i)
        index = $game_temp.menu_command_index[i]
        @command_window.draw_item(index, false)
        @disabled_command_index << index
      end
    }
  end
  #--------------------------------------------------------------------------
  # ○ [ExMenu_CustomCommand] 잘못된 명령 취득
  #--------------------------------------------------------------------------
  def get_exmenu_disable_commands
    disable_items = []
    $game_temp.menu_command_index.each { |k, v|
      next unless k.is_a?(String)
      # 해당 명령 찾기
      command = EXMNU_CTCMD_COMMANDS.find { |c| c[2] == k }
      next if command == nil
      # 유효 상태를 판정
      unless command_inputable?(command)
        disable_items.push(k)
      end
    }
    return disable_items
  end
  #--------------------------------------------------------------------------
  # ● 명령 선택의 업데이트
  #--------------------------------------------------------------------------
  def update_command_selection
    if Input.trigger?(Input::B)
      Sound.play_cancel
      $scene = Scene_Map.new
    elsif Input.trigger?(Input::C)
      index = @command_window.index
      unless command_enabled?(index)  # 잘못된 명령
        Sound.play_buzzer
        return
      end
      Sound.play_decision

      # [ExMenu_CustomCommand]
      excommand = nil
      if KGC::CustomMenuCommand::EXMNU_CTCMD_OK
        excommand = @command_window.commands[index]
      end

      # 전환 장면 판정
      case index
      when $game_temp.menu_command_index[:item]      # 아이템
        $scene = Scene_Item.new
      when $game_temp.menu_command_index[:skill],    # 기술, 장비, 상태
          $game_temp.menu_command_index[:equip],
          $game_temp.menu_command_index[:status]
        start_actor_selection
      when $game_temp.menu_command_index[:save]      # 저장
        $scene = Scene_File.new(true, false, false)
      when $game_temp.menu_command_index[:game_end]  # 게임 종료
        $scene = Scene_End.new
      when $game_temp.menu_command_index[excommand]  # [ExMenu_CustomCommand]
        $game_party.last_menu_index = index
        $scene = eval("#{@exmenu_command_scene[excommand]}.new")
      end
    end
  end
  #--------------------------------------------------------------------------
  # ○ 명령 유효 판정
  # index : 명령 index
  #--------------------------------------------------------------------------
  def command_enabled?(index)
    # メニュー
    if $game_system.save_disabled &&
        index == $game_temp.menu_command_index[:save]
      return false
    end

    # [ExMenu_CustomCommand]
    if KGC::CustomMenuCommand::EXMNU_CTCMD_OK
      command = @command_window.commands[index]
      if @disabled_command_index.include?($game_temp.menu_command_index[command])
        return false
      end
    end

    # メンバー 0 人
    if $game_party.members.size == 0 &&
        @disabled_command_index.include?(index)
      return false
    end

    return true
  end
  #--------------------------------------------------------------------------
  # ● 액터 선택의 업데이트
  #--------------------------------------------------------------------------
  def update_actor_selection
    if Input.trigger?(Input::B)
      Sound.play_cancel
      end_actor_selection
    elsif Input.trigger?(Input::C)
      $game_party.last_actor_index = @status_window.index
      Sound.play_decision

      case @command_window.index
      when $game_temp.menu_command_index[:skill]   # 스킬
        $scene = Scene_Skill.new(@status_window.index)
      when $game_temp.menu_command_index[:equip]   # 장비
        $scene = Scene_Equip.new(@status_window.index)
      when $game_temp.menu_command_index[:status]  # 상태
        $scene = Scene_Status.new(@status_window.index)
      end
    end
  end
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

#==============================================================================
# ■ Scene_Item
#==============================================================================

class Scene_Item < Scene_Base
  #--------------------------------------------------------------------------
  # ● 원래 화면으로 돌아 가기
  #--------------------------------------------------------------------------
  def return_scene
    if $game_temp.menu_command_index.has_key?(:item)
      $scene = Scene_Menu.new($game_temp.menu_command_index[:item])
    else
      $scene = Scene_Map.new
    end
  end
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

#==============================================================================
# ■ Scene_Skill
#==============================================================================

class Scene_Skill < Scene_Base
  #--------------------------------------------------------------------------
  # ● 원래 화면으로 돌아 가기
  #--------------------------------------------------------------------------
  def return_scene
    if $game_temp.menu_command_index.has_key?(:skill)
      $scene = Scene_Menu.new($game_temp.menu_command_index[:skill])
    else
      $scene = Scene_Map.new
    end
  end
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

#==============================================================================
# ■ Scene_Equip
#==============================================================================

class Scene_Equip < Scene_Base
  #--------------------------------------------------------------------------
  # ● 원래 화면으로 돌아 가기
  #--------------------------------------------------------------------------
  def return_scene
    if $game_temp.menu_command_index.has_key?(:equip)
      $scene = Scene_Menu.new($game_temp.menu_command_index[:equip])
    else
      $scene = Scene_Map.new
    end
  end
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

#==============================================================================
# ■ Scene_Status
#==============================================================================

class Scene_Status < Scene_Base
  #--------------------------------------------------------------------------
  # ● 원래 화면으로 돌아 가기
  #--------------------------------------------------------------------------
  def return_scene
    if $game_temp.menu_command_index.has_key?(:status)
      $scene = Scene_Menu.new($game_temp.menu_command_index[:status])
    else
      $scene = Scene_Map.new
    end
  end
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

#==============================================================================
# ■ Scene_File
#==============================================================================

class Scene_File < Scene_Base
  #--------------------------------------------------------------------------
  # ● 원래 화면으로 돌아 가기
  #--------------------------------------------------------------------------
  alias return_scene_KGC_CustomMenuCommand return_scene
  def return_scene
    if @from_title || @from_event
      return_scene_KGC_CustomMenuCommand
    elsif $game_temp.menu_command_index.has_key?(:save)
      $scene = Scene_Menu.new($game_temp.menu_command_index[:save])
    else
      $scene = Scene_Map.new
    end
  end
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

#==============================================================================
# ■ Scene_End
#==============================================================================

class Scene_End < Scene_Base
  #--------------------------------------------------------------------------
  # ● 원래 화면으로 돌아 가기
  #--------------------------------------------------------------------------
  def return_scene
    if $game_temp.menu_command_index.has_key?(:game_end)
      $scene = Scene_Menu.new($game_temp.menu_command_index[:game_end])
    else
      $scene = Scene_Map.new
    end
  end
end

 

#여기까지가 스크립트 ↑

일단 제가 아는부분에서 간단하게 사용방법을 가르쳐 드리자면

      when 0         # 아이템
        index_list[:item] = commands.size
        commands << Vocab.item
      when 1         # 스킬
        index_list[:skill] = commands.size
        commands << Vocab.skill
      when 2         # 장비
        index_list[:equip] = commands.size
        commands << Vocab.equip
      when 3         # 상태
        index_list[:status] = commands.size
        commands << Vocab.status
      when 4         # 저장
        index_list[:save] = commands.size
        commands << Vocab.save
      when 5         # 게임 종료
        index_list[:game_end] = commands.size
        commands << Vocab.game_end

 

스크립트의 요부분에서 when 0,1,2,3,4,5 이부분에 숫자를 바꾸시면 메뉴창의 순서도 바뀝니다.(굳이 위치를 옮길 필요는 없음)

예시로, When 0인 아이템을 When 3으로 바꾸고 When 3인 상태를 When 0으로 바꿔주시면

메뉴창을 킬경우

 상태, 스킬, 장비, 아이템, 저장, 게임 종료

이순으로 설정됩니다.

 

그럼 이만 스피드웨건은 쿨하게 물러나지.