기타

[KGC] 개요 스크립트

by 백호 posted Feb 21, 2009
?

단축키

Prev이전 문서

Next다음 문서

ESC닫기

크게 작게 위로 아래로 댓글로 가기 인쇄
현재 제가 퀘스트 창으로 쓰고 있는 스크립트입니다.
일루젼님께서 사용법이 필요하시다길래 올립니다.

사용법::
실행 스크립트는 $scene = Scene_Outline.new 입니다.
그러나 그냥 실행만 시켜서는 개요창에 제목이 표시되지 않습니다
그래서 따로 $game_system.outline_enable[0] = true를 스크립트로 실행해주셔야합니다.
그럼 첫번째 글을 읽을 수 있게 되고 $game_system.outline_enable[0] = true에서 [0]의 숫자를
바꿔주시면 다른 글도 표시됩니다.
단 첫번째 글의 번호가 0부터 시작합니다 두번째 글은 1, 세번째는 2가 되는거죠.
필요하시다면 예제도 올리겠습니다.

#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
#_/    ◆개요 - KGC_Outline◆
#_/----------------------------------------------------------------------------
#_/  개요를 열람하는 기능을 추가합니다.
#_/  Provides the function to show "Outline".
#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/

#==============================================================================
# ★ 커스터마이즈 항목 - Customize ★
#==============================================================================

module KGC
  # ◆개요 화면 배경 투과
  OLINE_BACK_TRANSPARENT = true
  # ◆스크롤 속도【단위:px】
  OLINE_SCROLL_SPEED = 8
  # ◆일련 번호를 묘화
  OLINE_SERIAL_NUMBER = false
  # ◆일련 번호의 자리수
  OLINE_SERIAL_NUMBER_DIGITS = 3
  # ◆무효인 개요는 표시하지 않는
  OLINE_HIDE_DISABLED = true
  # ◆완료 기호
  OLINE_COMPLETION_SYMBOL = "★"
  # ◆미완 기호
  OLINE_INCOMPLETION_SYMBOL = " "

  # ◆개요 내용
  #  ≪["타이틀", ["본문", ...]], ...≫
  #  본문은 , 배열의 각 요소가 1행에 상당.
  #    **** 제어 커멘드 ****
  #  \V[n]  : 변수 ID:n
  #  \G    : 소지금
  #  \N[n]  : ID:n 의 엑터명
  #  \EN[n] : ID:n 의 에너미명
  #  \IN[n] : ID:n 의 아이템명
  #  \WN[n] : ID:n 의 무기명
  #  \AN[n] : ID:n 의 방어용 기구명
  OLINE_CONTENTS = [
    ["(Main) '루스텐'촌장과의 만남",  # 제목
      ["[대지의 마을: 로렌] 중앙에 위치한 '루스텐' 촌장의 집으로",
      " 가서 '루스텐' 촌장에게 레뮤리아 대륙의 이야기를 들으라."]] #  내용
  ]  # -- Don't delete this line! --
end

#### OLINE_BACK_TRANSPARENT
### Makes the background of "Outline" transparency.

#### OLINE_SCROLL_SPEED
### Scroll speed. {Unit : pixel}

#### OLINE_SERIAL_NUMBER
### Draws the serial number.

#### OLINE_SERIAL_NUMBER_DIGITS
### Digits of the serial number.

#### OLINE_HIDE_DISABLED
### Hides disabled "Outline".

#### OLINE_COMPLETION_SYMBOL
### Completion symbol.

#### OLINE_INCOMPLETION_SYMBOL
### Incompletion symbol.


#### OLINE_CONTENTS
### Contents of "Outline".
#  << ["Title", ["Body", ...]], ... >>
#  In the "Body", each element of the array corresponds to one line.
#    **** Control statement ****
#  \V[n]  : Variable of ID:n
#  \G    : Money
#  \N[n]  : Actor's name of ID:n
#  \EN[n] : Enemies' name of ID:n
#  \IN[n] : Item's name of ID:n
#  \WN[n] : Weapon's name of ID:n
#  \AN[n] : Armor's name of ID:n

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

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

#--------------------------------------------------------------------------
# ● 개요 화면 호출
#--------------------------------------------------------------------------
def call_outline
  # 플레이어의 자세를 교정
  $game_player.straighten
  # 개요 화면으로 전환하고
  $scene = Scene_Outline.new(true)
end

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

#==============================================================================
# ■ Game_System
#==============================================================================

class Game_System
  attr_accessor :outline_enable, :outline_complete
  #--------------------------------------------------------------------------
  # ● 오브젝트 초기화
  #--------------------------------------------------------------------------
  alias initialize_KGC_Outline initialize
  def initialize
    initialize_KGC_Outline

    @outline_enable = []
    @outline_complete = []
  end
end

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

#==============================================================================
# ■ Module - KGC_Outline
#------------------------------------------------------------------------------
#  개요 처리에 사용하는 메소드입니다.
#==============================================================================

module KGC_Outline
  #--------------------------------------------------------------------------
  # ● 제어 커멘드 처리
  #    string : 처리 대상 캐릭터 라인
  #--------------------------------------------------------------------------
  def self.apply_control_statement(string)
    buf = string.dup
    buf.gsub!(/\V[(d+)]/i) { $game_variables[$1.to_i].to_s }
    buf.gsub!(/\G/i) { $game_party.gold.to_s }
    buf.gsub!(/\N[(d+)]/i) { $game_actors[$1.to_i].name }
    buf.gsub!(/\EN[(d+)]/i) { $data_enemies[$1.to_i].name }
    buf.gsub!(/\IN[(d+)]/i) { $data_items[$1.to_i].name }
    buf.gsub!(/\WN[(d+)]/i) { $data_weapons[$1.to_i].name }
    buf.gsub!(/\AN[(d+)]/i) { $data_armors[$1.to_i].name }
    return buf
  end
end

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

#==============================================================================
# ■ Window_OutlineList
#------------------------------------------------------------------------------
#  개요 일람을 표시하는 윈도우입니다.
#==============================================================================

class Window_OutlineList < Window_Selectable
  #--------------------------------------------------------------------------
  # ● 오브젝트 초기화
  #--------------------------------------------------------------------------
  def initialize
    super(80, 40, 480, 400)
    self.back_opacity = 160 if KGC::OLINE_BACK_TRANSPARENT
    self.index = 0
    self.z = 1000
    refresh
  end
  #--------------------------------------------------------------------------
  # ● 선택 개요 내용
  #--------------------------------------------------------------------------
  def outline
    return @data[self.index]
  end
  #--------------------------------------------------------------------------
  # ● 리프레쉬
  #--------------------------------------------------------------------------
  def refresh
    self.contents.dispose if self.contents != nil
    @data = []
    # 리스트 작성
    $game_system.outline_enable = [] if $game_system.outline_enable == nil
    $game_system.outline_complete = [] if $game_system.outline_complete == nil
    KGC::OLINE_CONTENTS.each_with_index { |oline, i|
      if $game_system.outline_enable[i]
        buf = oline
        buf << i
        @data << buf
      elsif !KGC::OLINE_HIDE_DISABLED
        @data << ["- - - - - - - -", nil, i]
      end
    }
    # 리스트 묘화
    @item_max = [@data.size, 1].max
    self.contents = Bitmap.new(self.width - 32, 32 * @item_max)
    if @data.size == 0
      @data << ["", nil, 0]
    else
      @data.each_index { |i| draw_item(i) }
    end
  end
  #--------------------------------------------------------------------------
  # ● 항목 묘화
  #--------------------------------------------------------------------------
  def draw_item(index)
    self.contents.fill_rect(0, 32 * index, self.width - 32, 32, Color.new(0, 0, 0, 0))
    # 타이틀 생성
    text = ($game_system.outline_complete[index] ?
      KGC::OLINE_COMPLETION_SYMBOL : KGC::OLINE_INCOMPLETION_SYMBOL) +
      (KGC::OLINE_SERIAL_NUMBER ? sprintf("%0*d : ",
      KGC::OLINE_SERIAL_NUMBER_DIGITS, @data[index][2] + 1) : "") +
      KGC_Outline::apply_control_statement(@data[index][0])
    # 묘화색 설정
    self.contents.font.color = $game_system.outline_enable[index] ?
      normal_color : disabled_color
    self.contents.draw_text(0, 32 * index, self.width - 32, 32, text)
  end
end

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

#==============================================================================
# ■ Window_OutlineTitle
#------------------------------------------------------------------------------
#  개요의 제목을 표시하는 윈도우입니다.
#==============================================================================

class Window_OutlineTitle < Window_Base
  #--------------------------------------------------------------------------
  # ● 오브젝트 초기화
  #--------------------------------------------------------------------------
  def initialize
    super(0, 0, 640, 64)
    self.contents = Bitmap.new(width - 32, height - 32)
    self.back_opacity = 160 if KGC::OLINE_BACK_TRANSPARENT
  end
  #--------------------------------------------------------------------------
  # ● 리프레쉬
  #    text  : 표시하는 캐릭터 라인
  #--------------------------------------------------------------------------
  def refresh(text)
    self.contents.clear
    text2 = KGC_Outline::apply_control_statement(text)
    self.contents.draw_text(0, 0, self.width - 32, 32, text2, 1)
  end
end

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

#==============================================================================
# ■ Window_Outline
#------------------------------------------------------------------------------
#  개요(의 내용)을 표시하는 윈도우입니다.
#==============================================================================

class Window_Outline < Window_Base
  #--------------------------------------------------------------------------
  # ● 오브젝트 초기화
  #--------------------------------------------------------------------------
  def initialize
    super(0, 64, 640, 416)
    self.back_opacity = 160 if KGC::OLINE_BACK_TRANSPARENT
    self.active = false
    refresh
  end
  #--------------------------------------------------------------------------
  # ● 리프레쉬
  #    oline : 개요
  #--------------------------------------------------------------------------
  def refresh(oline = nil)
    self.oy = 0
    self.contents.dispose if self.contents != nil
    return if oline == nil
    # 본문을 묘화
    self.contents = Bitmap.new(self.width - 32, 32 * oline.size)
    oline.each_with_index { |l ,i|
      next if l == nil
      text = KGC_Outline::apply_control_statement(l)
      self.contents.draw_text(0, i * 32, self.width - 32, 32, text)
    }
  end
  #--------------------------------------------------------------------------
  # ● 갱신
  #--------------------------------------------------------------------------
  def update
    super
    # 스크롤
    if self.active
      scroll_max = [self.contents.height - (self.height - 32), 0].max
      if Input.press?(Input::UP)
        self.oy = [self.oy - KGC::OLINE_SCROLL_SPEED, 0].max
      elsif Input.press?(Input::DOWN)
        self.oy = [self.oy + KGC::OLINE_SCROLL_SPEED, scroll_max].min
      elsif Input.repeat?(Input::L)
        self.oy = [self.oy - (self.height - 32), 0].max
      elsif Input.repeat?(Input::R)
        self.oy = [self.oy + (self.height - 32), scroll_max].min
      end
    end
  end
end

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

#==============================================================================
# ■ Scene_Outline
#------------------------------------------------------------------------------
#  개요 화면의 처리를 실시하는 클래스입니다.
#==============================================================================

class Scene_Outline
  #--------------------------------------------------------------------------
  # ● 오브젝트 초기화
  #    map_call : 맵으로부터의 호출 플래그
  #--------------------------------------------------------------------------
  def initialize(map_call = false)
    @map_call = map_call
  end
  #--------------------------------------------------------------------------
  # ● 메인 처리
  #--------------------------------------------------------------------------
  def main
    # 스프라이트 세트를 작성
    @spriteset = Spriteset_Map.new if KGC::OLINE_BACK_TRANSPARENT
    # 윈도우를 작성
    @list_window = Window_OutlineList.new
    @title_window = Window_OutlineTitle.new
    @content_window = Window_Outline.new
    # 트란지션 실행
    Graphics.transition
    # 메인 루프
    loop {
      Graphics.update
      Input.update
      update
      if $scene != self
        break
      end
    }
    # 트란지션 준비
    Graphics.freeze
    # 윈도우를 해방
    @list_window.dispose
    @title_window.dispose
    @content_window.dispose
    @spriteset.dispose if KGC::OLINE_BACK_TRANSPARENT
  end
  #--------------------------------------------------------------------------
  # ● 프레임 갱신
  #--------------------------------------------------------------------------
  def update
    # 윈도우 갱신
    @list_window.update
    @title_window.update
    @content_window.update
    # 액티브 윈도우 조작
    if @list_window.active
      update_list
    elsif @content_window.active
      update_content
    end
  end
  #--------------------------------------------------------------------------
  # ● 프레임 갱신 (리스트)
  #--------------------------------------------------------------------------
  def update_list
    # B 버튼이 밀렸을 경우
    if Input.trigger?(Input::B)
      # 캔슬 SE 을 연주
      $game_system.se_play($data_system.cancel_se)
      if @map_call
        # 맵 화면으로 전환하고
        $scene = Scene_Map.new
      else
        # 메뉴 화면으로 전환하고
        if $imported["MenuAlter"]
          index = KGC::MA_COMMANDS.index(12)
          if index != nil
            $scene = Scene_Menu.new(index)
          else
            $scene = Scene_Menu.new
          end
        else
          $scene = Scene_Menu.new
        end
      end
      return
    end
    # C 버튼이 밀렸을 경우
    if Input.trigger?(Input::C)
      outline = @list_window.outline
      # 열람할 수 없는 경우
      if outline[1] == nil
        # 버저 SE 를 연주
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      # 결정 SE 을 연주
      $game_system.se_play($data_system.decision_se)
      # 개요를 갱신
      @title_window.refresh(outline[0])
      @content_window.refresh(outline[1])
      # 윈도우 변환
      @list_window.active = false
      @list_window.z = 0
      @content_window.active = true
      @content_window.z = 1000
      return
    end
  end
  #--------------------------------------------------------------------------
  # ● 프레임 갱신 (본문)
  #--------------------------------------------------------------------------
  def update_content
    # B 버튼이 밀렸을 경우
    if Input.trigger?(Input::B)
      # 캔슬 SE 을 연주
      $game_system.se_play($data_system.cancel_se)
      # 윈도우 변환
      @list_window.active = true
      @list_window.z = 1000
      @content_window.active = false
      @content_window.z = 0
      return
    end
  end
end