메뉴

확장 스테이터스 화면 - KGC

by 카르와푸딩의아틀리에 posted Aug 19, 2009
?

단축키

Prev이전 문서

Next다음 문서

ESC닫기

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

#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
#_/    ◆ 확장 스테이터스 화면 - KGC_ExtendedStatusScene ◆ VX ◆
#_/    ◇ Last update : 2009/08/19 ◇
#_/----------------------------------------------------------------------------
#_/  스테이터스 화면에 표시하는 내용을 상세화합니다.
#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/

$data_states = load_data("Data/States.rvdata") if $data_states == nil
$data_system = load_data("Data/System.rvdata") if $data_system == nil

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

module KGC
module ExtendedStatusScene
  # ◆ 프로필
  PROFILE = []
  # 여기에서 아래로
  #  PROFILE[액터 ID] = '프로필'
  # 그렇다고 하는 서식에서 설정.
  # 개행하는 경우는, 개행하고 싶은 위치에 | 를 입력.
  PROFILE[1] =
    '프로필 테스트 |' +
    '|' +
    '구w키drftgy자기 lp;@:「'

  # ◆ 커멘드
  #  커멘드를 표시하고 싶은 순서에 기술.
  #  표시하고 싶지 않은 커멘드는 생략가능 (0 개는 안 됨).
  #   :param   .. 파라미터
  #   :resist  .. 내성
  #   :profile .. 프로필
  COMMANDS = [:param, :resist, :profile]

  # ◆ 커멘드명
  COMMAND_NAME = {
    :param   => "능력치",
    :resist  => "내성",
    :profile => "프로필",
  }

  # ◆ 파라미터명
  PARAMETER_NAME = {
    :element_resist => "속성 내성",
    :state_resist   => "스테이트 내성",
  }  # ← 이것은 지우지 않는 것!

  # ◆ 속성 내성의 표기 방법
  #   0 .. 수치
  #   1 .. 차트 (≪비트 맵 확장≫ 이 필요)
  RESIST_STYLE = 1
  # ◆ 내성의 수치
  #   0 .. 속성: 100 으로 통상, 99 이하는 경감 (마이너스는 흡수), 101 이상은 약점
  #        스테이트: 부가 성공율 (걸리기 쉬움)
  #   1 .. 속성: 0 으로 통상, 플러스는 경감 (101 이상은 흡수), 마이너스는 약점
  #        스테이트: 부가 회피율 (걸리기 어려움)
  RESIST_NUM_STYLE = 1

  # ◆ 차트색
  CHART_LINE_COLOR  = Color.new(128, 255, 128)  # 라인색
  CHART_BASE_COLOR  = Color.new(128, 192, 255)  # 베이스색
  CHART_FLASH_COLOR = Color.new(128, 255, 128)  # 플래시색
  # ◆ 차트를 매끈하게 한다
  #   true  : 고품질, 저속
  #   false : 저품질, 고속
  CHART_HIGHQUALITY = true

  #  이하의 항목은 ≪몬스터 도감≫ 과 호환성이 있습니다.
  #  ≪몬스터 도감≫ 측의 설정을 카피해도 상관하지 않습니다.

  # ◆ 속성 내성을 조사하는 범위
  #  내성을 조사하는 속성의 ID 를 배열에 격납.
  #  .. (이)나 ... (을)를 사용한 범위 지정도 가능.
  ELEMENT_RANGE = [1..16]
  # ◆ 속성의 아이콘
  #  각 속성에 대응하는 아이콘의 번호를 지정.
  #  배열의 첨자가 속성 ID 에 대응.
  ELEMENT_ICON = [nil,                       # ID:0 는 더미
     50,   1,   4,  14,  24,  12, 189, 136,  # 격투 흡수
    104, 105, 106, 107, 108, 109, 110, 111,  # 불길 암흑
  ]  # ← 이것은 지우지 않는 것!
  # ◆ 스테이트 내성을 조사하는 범위
  #  내성을 조사하는 스테이트의 ID 를 배열에 격납.
  #  기술 방법은 ELEMENT_RANGE 와 같이.
  STATE_RANGE = [1...$data_states.size]
end
end

 

#==============================================================================
# ☆ 커스터마이즈 항목 종료 - Customize END ☆
#==============================================================================

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

module KGC::ExtendedStatusScene
  module_function
  #--------------------------------------------------------------------------
  # ○ Range 와 Integer 의 배열을 Integer 의 배열에 변환 (중복 요소는 배제)
  #--------------------------------------------------------------------------
  def convert_integer_array(array, type = nil)
    result = []
    array.each { |i|
      case i
      when Range
        result |= i.to_a
      when Integer
        result |= [i]
      end
    }
    case type
    when :element
      result.delete_if { |x| x >= $data_system.elements.size }
    when :state
      result.delete_if { |x|
        x >= $data_states.size ||
        $data_states[x].nonresistance ||
        $data_states[x].priority == 0
      }
    end
    return result
  end

  # 체크하는 속성 리스트
  CHECK_ELEMENT_LIST = convert_integer_array(ELEMENT_RANGE, :element)
  # 체크하는 스테이트 리스트
  CHECK_STATE_LIST   = convert_integer_array(STATE_RANGE, :state)
end

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

#==============================================================================
# □ Window_StatusCommand
#------------------------------------------------------------------------------
#   스테이터스 화면에서, 표시하는 내용을 선택하는 윈도우입니다.
#==============================================================================

class Window_StatusCommand < Window_Command
  #--------------------------------------------------------------------------
  # ● 오브젝트 초기화
  #--------------------------------------------------------------------------
  def initialize
    commands = []
    KGC::ExtendedStatusScene::COMMANDS.each { |c|
      commands << KGC::ExtendedStatusScene::COMMAND_NAME[c]
    }
    super(160, commands)
    self.height = WLH * 5 + 32
    self.active = true
  end
  #--------------------------------------------------------------------------
  # ○선택중의 커멘드 취득
  #--------------------------------------------------------------------------
  def command
    return KGC::ExtendedStatusScene::COMMANDS[index]
  end
  #--------------------------------------------------------------------------
  # ● 커서를 1 페이지 뒤로 이동
  #--------------------------------------------------------------------------
  def cursor_pagedown
    return if Input.repeat?(Input::R)
    super
  end
  #--------------------------------------------------------------------------
  # ● 커서를 1 페이지전에 이동
  #--------------------------------------------------------------------------
  def cursor_pageup
    return if Input.repeat?(Input::L)
    super
  end
end

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

#==============================================================================
# ■ Window_Status
#==============================================================================

class Window_Status < Window_Base
  #--------------------------------------------------------------------------
  # ● 오브젝트 초기화
  #     actor : 액터
  #--------------------------------------------------------------------------
  def initialize(actor)
    super(160, 0, Graphics.width - 160, WLH * 5 + 32)
    @actor = actor
    refresh
  end
  #--------------------------------------------------------------------------
  # ● 리프레쉬
  #--------------------------------------------------------------------------
  def refresh
    self.contents.clear
    draw_basic(104, 0)
    draw_exp(104, WLH * 3)
  end
  #--------------------------------------------------------------------------
  # ● 기본 정보의 묘화
  #     x : 묘화처 X 좌표
  #     y : 묘화처 Y 좌표
  #--------------------------------------------------------------------------
  def draw_basic(x, y)
    draw_actor_face(@actor, 0, (contents.height - 96) / 2)
    draw_actor_name(@actor, x, y)
    draw_actor_class(@actor, x + 120, y)
    draw_actor_level(@actor, x, y + WLH)
    draw_actor_state(@actor, x, y + WLH * 2)
    draw_actor_hp(@actor, x + 120, y + WLH)
    draw_actor_mp(@actor, x + 120, y + WLH * 2)
  end
  #--------------------------------------------------------------------------
  # ● 경험치 정보의 묘화
  #     x : 묘화처 X 좌표
  #     y : 묘화처 Y 좌표
  #--------------------------------------------------------------------------
  def draw_exp(x, y)
    if $imported["GenericGauge"]
      draw_actor_exp(@actor, x, y + WLH * 0, 240)
      draw_actor_next_exp(@actor, x, y + WLH * 1, 240)
    end

    s1 = @actor.exp_s
    s2 = @actor.next_rest_exp_s
    s_next = sprintf(Vocab::ExpNext, Vocab::level)
    self.contents.font.color = system_color
    self.contents.draw_text(x, y + WLH * 0, 180, WLH, Vocab::ExpTotal)
    self.contents.draw_text(x, y + WLH * 1, 180, WLH, s_next)
    self.contents.font.color = normal_color

    unless $imported["GenericGauge"]
      self.contents.draw_text(x, y + WLH * 0, 240, WLH, s1, 2)
      self.contents.draw_text(x, y + WLH * 1, 240, WLH, s2, 2)
    end
  end
end

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

#==============================================================================
# □ Window_StatusDetail
#------------------------------------------------------------------------------
#   스테이터스 화면에서, 액터의 상세 정보를 표시하는 윈도우입니다.
#==============================================================================

class Window_StatusDetail < Window_Base
  #--------------------------------------------------------------------------
  # ○공개 인스턴스 변수
  #--------------------------------------------------------------------------
  attr_reader   :category
  #--------------------------------------------------------------------------
  # ● 오브젝트 초기화
  #     actor : 액터
  #--------------------------------------------------------------------------
  def initialize(actor)
    @category = nil
    y = WLH * 5 + 32
    super(0, y, Graphics.width, Graphics.height - y)
    create_chart_sprite
    @actor    = actor
    @duration = 0
    self.z = z
  end
  #--------------------------------------------------------------------------
  # ○레이더-차트 스프라이트 작성
  #--------------------------------------------------------------------------
  def create_chart_sprite
    @chart_sprite = Sprite_Base.new
    @chart_sprite.bitmap = Bitmap.new(height - 32, height - 32)
    @chart_sprite.ox = @chart_sprite.width  / 2
    @chart_sprite.oy = @chart_sprite.height / 2
    @chart_sprite.blend_type = 1
    @chart_sprite.opacity = 0
    @chart_sprite.visible = false
  end
  #--------------------------------------------------------------------------
  # ● 파기
  #--------------------------------------------------------------------------
  def dispose
    @chart_sprite.bitmap.dispose
    @chart_sprite.dispose
    super
  end
  #--------------------------------------------------------------------------
  # ○ Z 좌표 설정
  #--------------------------------------------------------------------------
  def z=(value)
    super(value)
    @chart_sprite.z = z + 1 if @chart_sprite != nil
  end
  #--------------------------------------------------------------------------
  # ○카테고리 설정
  #--------------------------------------------------------------------------
  def category=(category)
    return if @category == category
    @category = category
    refresh
  end
  #--------------------------------------------------------------------------
  # ● 리프레쉬
  #--------------------------------------------------------------------------
  def refresh
    @chart_sprite.visible = false
    return if @category == nil

    self.contents.clear
    case @category
    when :param
      draw_parameter
    when :resist
      draw_resistance
    when :profile
      draw_profile
    end
  end
  #--------------------------------------------------------------------------
  # ○파라미터 묘화
  #--------------------------------------------------------------------------
  def draw_parameter
    y = 0
    (4).times { |i|
      draw_actor_parameter(@actor, 0, y, i)
      y += WLH
    }
    if $imported["SkillCPSystem"] && KGC::SkillCPSystem::SHOW_STATUS_CP
      draw_actor_cp(@actor, 0, y, 156)
      y += WLH
    end
    if $imported["EquipExtension"] && KGC::EquipExtension::SHOW_STATUS_EP
      draw_actor_ep(@actor, 0, y, 156)
      y += WLH
    end

    x = 192
    self.contents.font.color = system_color
    self.contents.draw_text(x, 0, 120, WLH, Vocab::equip)
    @actor.equips.each_with_index { |item, i|
      draw_item_name(item, x, WLH * (i + 1))
    }
  end
  #--------------------------------------------------------------------------
  # ○내성 묘화
  #--------------------------------------------------------------------------
  def draw_resistance
    x = 0
    x = draw_element_resistance(x, 0)
    x = draw_state_resistance(x, 0)
  end
  #--------------------------------------------------------------------------
  # ○속성 내성 묘화
  #     x, y : 묘화처 X, Y
  #    묘화 종료시의 X 좌표를 돌려준다.
  #--------------------------------------------------------------------------
  def draw_element_resistance(x, y)
    self.contents.font.color = system_color
    self.contents.draw_text(x, y, 120, WLH,
      KGC::ExtendedStatusScene::PARAMETER_NAME[:element_resist])
    self.contents.font.color = normal_color
    y += WLH

 

if KGC::ExtendedStatusScene::RESIST_STYLE == 0 || !$imported["BitmapExtension"]
      return draw_element_resistance_num(x, y)
    else
      @chart_sprite.visible = true
      return draw_element_resistance_chart(x, y)
    end
  end
  #--------------------------------------------------------------------------
  # ○속성 내성 묘화 (수치)
  #     x, y : 묘화처 X, Y
  #    묘화 종료시의 X 좌표를 돌려준다.
  #--------------------------------------------------------------------------
  def draw_element_resistance_num(x, y)
    origin_y = y
    KGC::ExtendedStatusScene::CHECK_ELEMENT_LIST.each { |i|
      if y + WLH > contents.height
        x += 84
        y  = origin_y
      end
      draw_icon(KGC::ExtendedStatusScene::ELEMENT_ICON[i], x, y)
      n = @actor.element_rate(i)
      n = 100 - n if KGC::ExtendedStatusScene::RESIST_NUM_STYLE == 1
      rate = sprintf("%4d%%", n)
      self.contents.draw_text(x + 24, y, 52, WLH, rate, 2)
      y += WLH
    }
    return (x + 96)
  end
  #--------------------------------------------------------------------------
  # ○속성 내성 묘화 (차트)
  #     x, y : 묘화처 X, Y
  #    묘화 종료시의 X 좌표를 돌려준다.
  #--------------------------------------------------------------------------
  def draw_element_resistance_chart(x, y)
    r  = (contents.height - y - 48) / 2
    cx = x + r + 24
    cy = y + r + 24
    elements = KGC::ExtendedStatusScene::CHECK_ELEMENT_LIST

    pw = 1
    if KGC::ExtendedStatusScene::CHART_HIGHQUALITY
      Bitmap.smoothing_mode = TRGSSX::SM_ANTIALIAS
      pw = 2
    end

    # 라인
    color = KGC::ExtendedStatusScene::CHART_BASE_COLOR.clone
    self.contents.draw_regular_polygon(cx, cy, r, elements.size, color, pw)
    color.alpha = color.alpha * 5 / 8
    self.contents.draw_spoke(cx, cy, r, elements.size, color, pw)
    self.contents.draw_regular_polygon(cx, cy, r * 2 / 3,
      elements.size, color, pw)
    self.contents.draw_regular_polygon(cx, cy, r / 3,
      elements.size, color, pw)

    # 차트
    points = []
    elements.each_with_index { |e, i|
      n   = @actor.element_rate(e)
      n   = 100 - n if KGC::ExtendedStatusScene::RESIST_NUM_STYLE == 1
      n   = [[n, -100].max, 200].min
      dr  = r * (n + 100) / 100 / 3
      rad = Math::PI * (360.0 * i / elements.size - 90.0) / 180.0
      dx  = cx + Integer(dr * Math.cos(-rad))
      dy  = cy + Integer(dr * Math.sin(rad))
      points << [dx, dy]

      dx = cx + Integer((r + 12) * Math.cos(-rad)) - 12
      dy = cy + Integer((r + 12) * Math.sin(rad))  - 12
      draw_icon(KGC::ExtendedStatusScene::ELEMENT_ICON[e], dx, dy)
    }
    self.contents.draw_polygon(points,
      KGC::ExtendedStatusScene::CHART_LINE_COLOR, 2)

    # 플래시
    color = KGC::ExtendedStatusScene::CHART_FLASH_COLOR
    @chart_sprite.bitmap.clear
    @chart_sprite.bitmap.fill_polygon(points, Color.new(0, 0, 0, 0), color)
    @chart_sprite.ox = cx
    @chart_sprite.oy = cy
    @chart_sprite.x  = self.x + cx + 16
    @chart_sprite.y  = self.y + cy + 16

    Bitmap.smoothing_mode = TRGSSX::SM_DEFAULT

    return (x + cx + r + 36)
  end
  #--------------------------------------------------------------------------
  # ○스테이트 내성 묘화
  #     x, y : 묘화처 X, Y
  #    묘화 종료시의 X 좌표를 돌려준다.
  #--------------------------------------------------------------------------
  def draw_state_resistance(x, y)
    self.contents.font.color = system_color
    self.contents.draw_text(x, y, 120, WLH,
      KGC::ExtendedStatusScene::PARAMETER_NAME[:state_resist])
    y += WLH

    origin_y = y
    self.contents.font.color = normal_color
    KGC::ExtendedStatusScene::CHECK_STATE_LIST.each { |i|
      state = $data_states[i]
      next if state == nil

      if y + WLH > contents.height
        x += 76
        y  = origin_y
      end
      draw_icon(state.icon_index, x, y)
      n = @actor.state_probability(i)
      n = 100 - n if KGC::ExtendedStatusScene::RESIST_NUM_STYLE == 1
      rate = sprintf("%3d%%", n)
      self.contents.draw_text(x + 24, y, 44, WLH, rate, 2)
      y += WLH
    }
    return x
  end
  #--------------------------------------------------------------------------
  # ○프로필 묘화
  #--------------------------------------------------------------------------
  def draw_profile
    profile = KGC::ExtendedStatusScene::PROFILE[@actor.id]
    return if profile == nil

    profile.split(/|/).each_with_index { |line, i|
      self.contents.draw_text(0, WLH * i, contents.width, WLH, line)
    }
  end
  #--------------------------------------------------------------------------
  # ● 프레임 갱신
  #--------------------------------------------------------------------------
  def update
    super
    update_chart
  end
  #--------------------------------------------------------------------------
  # ○차트 갱신
  #--------------------------------------------------------------------------
  def update_chart
    return if @chart_sprite == nil

    case @duration
    when 0..11
      @chart_sprite.zoom_x  = @chart_sprite.zoom_y = @duration / 11.0
      @chart_sprite.opacity = 255
    when 12..27
      @chart_sprite.zoom_x  = @chart_sprite.zoom_y = 1
      @chart_sprite.opacity = (27 - @duration) * 16
    end
    @duration = (@duration + 1) % Graphics.frame_rate
  end
end

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

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

class Scene_Status < Scene_Base
  #--------------------------------------------------------------------------
  # ● 오브젝트 초기화
  #     actor_index   : 액터 인덱스
  #     command_index : 커멘드 인덱스
  #--------------------------------------------------------------------------
  def initialize(actor_index = 0, command_index = 0)
    @actor_index   = actor_index
    @command_index = command_index
  end
  #--------------------------------------------------------------------------
  # ● 개시 처리
  #--------------------------------------------------------------------------
  alias start_KGC_ExtendedStatusScene start
  def start
    start_KGC_ExtendedStatusScene

    @command_window = Window_StatusCommand.new
    @command_window.index = @command_index
    @detail_window = Window_StatusDetail.new(@actor)
    @detail_window.category = @command_window.command
  end
  #--------------------------------------------------------------------------
  # ● 종료 처리
  #--------------------------------------------------------------------------
  alias terminate_KGC_ExtendedStatusScene terminate
  def terminate
    terminate_KGC_ExtendedStatusScene

    @command_window.dispose
    @detail_window.dispose
  end
  #--------------------------------------------------------------------------
  # ● 다음의 액터의 화면으로 전환해
  #--------------------------------------------------------------------------
  def next_actor
    @actor_index += 1
    @actor_index %= $game_party.members.size
    $scene = Scene_Status.new(@actor_index, @command_window.index)
  end
  #--------------------------------------------------------------------------
  # ● 전의 액터의 화면으로 전환해
  #--------------------------------------------------------------------------
  def prev_actor
    @actor_index += $game_party.members.size - 1
    @actor_index %= $game_party.members.size
    $scene = Scene_Status.new(@actor_index, @command_window.index)
  end
  #--------------------------------------------------------------------------
  # ● 프레임 갱신
  #--------------------------------------------------------------------------
  alias update_KGC_ExtendedStatusScene update
  def update
    @command_window.update
    @detail_window.update
    @detail_window.category = @command_window.command

    update_KGC_ExtendedStatusScene
  end
end

Untitled-2 copy.jpg Untitled-3 copy.jpg

TAG •