#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
#_/ ◆ 확장 스테이터스 화면 - 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