Introdução:
Fala, pessoal. Esse é um sistema que eu tinha feito há um tempo já, e agora atualizei ele pra versão mais recente do VXA-OS. É um sistema que possibilita a visualização dos status que o personagem possui, por meio de ícones na HUD.
Explicações:
- Mostra o ícone de cada status possuído.
- Mostra o nome e o tempo restante de cada status ao passar o mouse por cima do ícone.
- Cada status tem um tempo independente. Portanto, se você receber um status que dura 15 segundos, esperar 10 segundos e então receber outro status que dura 30 segundos, estará faltando 5 segundos para acabar o primeiro e 30 segundos para acabar o segundo.
- O tempo máximo de cada status é configurado nas notas.
- Exibe a animação do primeiro status da lista.
IMPORTANTE:
- Por enquanto os traços dos status não estão funcionando, talvez isso seja implementado no VXA-OS mais pra frente.
- Eu deixei dois 'defs' dentro do script que eu estou disponibilizando, são eles:
1) 'def apply_state_effect0(id)', que ocorre por possuir um status.
2) 'apply_state_effect1(id)', que ocorre uma vez por segundo, ao possuir um status.
Use-os como desejar.
Imagens:
Scripts:
1) Substitua o '[VS] Sprite_HUD' do Cliente por esse:
2) No script '[VS] Sprite_Cursor' do Cliente, acima do 'def update', adicione:
e, ainda dentro do '[VS] Sprite_Cursor', agora dentro do 'def update', adicione a linha:
3) Localize o script '[RM] Game_Battler', localize o 'def add_new_state', e dentro dele, remova a seguinte linha:
Criando um status:
Escolha(ou crie) um status no database que contenha as seguintes notas:
Agradecimentos:
- Valentine pelo VXA-OS.
Fala, pessoal. Esse é um sistema que eu tinha feito há um tempo já, e agora atualizei ele pra versão mais recente do VXA-OS. É um sistema que possibilita a visualização dos status que o personagem possui, por meio de ícones na HUD.
Explicações:
- Mostra o ícone de cada status possuído.
- Mostra o nome e o tempo restante de cada status ao passar o mouse por cima do ícone.
- Cada status tem um tempo independente. Portanto, se você receber um status que dura 15 segundos, esperar 10 segundos e então receber outro status que dura 30 segundos, estará faltando 5 segundos para acabar o primeiro e 30 segundos para acabar o segundo.
- O tempo máximo de cada status é configurado nas notas.
- Exibe a animação do primeiro status da lista.
IMPORTANTE:
- Por enquanto os traços dos status não estão funcionando, talvez isso seja implementado no VXA-OS mais pra frente.
- Eu deixei dois 'defs' dentro do script que eu estou disponibilizando, são eles:
1) 'def apply_state_effect0(id)', que ocorre por possuir um status.
2) 'apply_state_effect1(id)', que ocorre uma vez por segundo, ao possuir um status.
Use-os como desejar.
Imagens:
- Spoiler:
- Spoiler:
Scripts:
1) Substitua o '[VS] Sprite_HUD' do Cliente por esse:
- Código:
#==============================================================================
# ** Sprite_HUD
#------------------------------------------------------------------------------
# Esta classe lida com a exibição de HP, MP, experiência,
# face e nível do jogador.
#------------------------------------------------------------------------------
# Autor: Valentine
# Edições por iCoke~
#==============================================================================
class Sprite_HUD < Sprite2
attr_reader :exp_sprite
def initialize
super
self.bitmap = Bitmap.new(255, 107)
self.x = 11
self.y = 9
self.z = 50
self.bitmap.font.size = 18
self.bitmap.font.bold = true
@back = Cache.system('HUD')
@bars = Cache.system('HUDBars')
$states_list = [] #Lista com os tempos e 'subtempos' de cada state.
create_exp_bar
create_tool_tip
refresh
end
def create_tool_tip
#$name_viewport = Viewport.new
#$name_viewport.z = 50
@tool_tip = Sprite2.new(viewport)
@tool_tip.bitmap = Bitmap.new(100, 50)
@tool_tip.bitmap.fill_rect(@tool_tip.bitmap.rect, Color.new(0, 0, 0, 160))
@tool_tip.bitmap.draw_text(@tool_tip.bitmap.rect, "", 1)
@tool_tip.visible = false
end
def dispose
super
if @tool_tip
@tool_tip.bitmap.dispose
@tool_tip.dispose
end
@exp_sprite.bitmap.dispose
@exp_sprite.dispose
end
def visible=(visible)
super
@tool_tip.visible = false if @tool_tip
end
def update_tool_tip
return unless @tool_tip && visible
@tool_tip.visible = $in_states_area[0]
if @tool_tip.visible
@tool_tip.x = Mouse.x + 18 + @tool_tip.bitmap.width > Graphics.width ? Graphics.width - @tool_tip.bitmap.width : Mouse.x + 18
@tool_tip.y = Mouse.y + 18 + @tool_tip.bitmap.height > Graphics.height ? Graphics.height - @tool_tip.bitmap.height : Mouse.y + 18
end
if $in_states_area[1] != nil
@tool_tip.bitmap.fill_rect(@tool_tip.bitmap.rect, Color.new(0, 0, 0, 160))
@tool_tip.bitmap.font.color.set(crisis_color)
@tool_tip.bitmap.draw_text(0, 2, @tool_tip.bitmap.width, 17, $in_states_area[1].name.to_s, 1)
max_time = Note.read_number('Time', $data_states[$in_states_area[1].id].note)
n = (Mouse.x-118)/21
return if $states_list[n] == nil || $states_list[n][0] == nil
actual_time = max_time - $states_list[n][0]
@tool_tip.bitmap.font.color.set(normal_color)
@tool_tip.bitmap.draw_text(0, 24, @tool_tip.bitmap.width, 17, "Tempo: " + actual_time.to_s + " s", 1)
end
end
def create_exp_bar
@exp_sprite = Sprite2.new
@exp_sprite.bitmap = Bitmap.new(308, 22)
@exp_sprite.bitmap.font.size = 18
@exp_sprite.bitmap.font.bold = true
@exp_sprite.x = adjust_x
@exp_sprite.y = adjust_y
@exp_sprite.dragable = true
@exp_sprite.z = self.z
end
def adjust_x
Graphics.width / 2 - 109
end
def adjust_y
Graphics.height - 28
end
def states_list_changed?
return true if @old_states_size != $game_actors[1].states.size
return false
end
def refresh
draw_background
draw_face
draw_hp_bar
draw_mp_bar
draw_exp_bar
draw_level
draw_status
@old_states_size = $game_actors[1].states.size
end
def draw_background
self.bitmap.clear
rect = Rect.new(0, 0, 248, 98)
self.bitmap.blt(7, 0, @back, rect)
end
def draw_face
return if $game_actors[1].face_name.empty?
face = Cache.face($game_actors[1].face_name)
rect = Rect.new($game_actors[1].face_index % 4 * 96, $game_actors[1].face_index / 4 * 96, 96, 96)
self.bitmap.blt(8, 1, face, rect)
end
def draw_hp_bar
rect = Rect.new(0, 0, 123 * $game_actors[1].hp / $game_actors[1].mhp, 26)
self.bitmap.blt(107, 2, @bars, rect)
self.bitmap.draw_text(111, 7, 25, 18, Vocab::hp_a)
self.bitmap.draw_text(0, 7, 229, 18, "#{$game_actors[1].hp}/#{$game_actors[1].mhp}", 2)
end
def draw_mp_bar
rect = Rect.new(0, 26, 123 * $game_actors[1].mp / $game_actors[1].mmp, 26)
self.bitmap.blt(107, 30, @bars, rect)
self.bitmap.draw_text(111, 35, 25, 18, Vocab::mp_a)
self.bitmap.draw_text(0, 35, 229, 18, "#{$game_actors[1].mp}/#{$game_actors[1].mmp}", 2)
end
def draw_exp_bar
@exp_sprite.bitmap.clear
rect1 = Rect.new(0, 98, @exp_sprite.bitmap.width, @exp_sprite.bitmap.height)
rect2 = Rect.new(0, 52, 308 * $game_actors[1].now_exp / $game_actors[1].next_exp, @exp_sprite.bitmap.height)
exp = $game_actors[1].level >= Configs::MAX_LEVEL ? Vocab::MaxLevel : convert_gold($game_actors[1].next_exp - $game_actors[1].now_exp)
@exp_sprite.bitmap.blt(0, 0, @back, rect1)
@exp_sprite.bitmap.blt(0, 0, @bars, rect2)
@exp_sprite.bitmap.draw_text(4, 2, 25, 18, Vocab::Exp)
@exp_sprite.bitmap.draw_text(0, 2, 308, 18, exp, 1)
end
def draw_level
rect = Rect.new(0, 120, 29, 30)
self.bitmap.blt(0, 77, @back, rect)
self.bitmap.draw_text(0, 83, 30, 18, $game_actors[1].level, 1)
end
def draw_status
for i in 0..$game_actors[1].states.size-1
return if $game_actors[1].states.size == 0
status_id = $game_actors[1].states[i].id
icon = Cache.system('Iconset')
rect = Rect.new(0+24*status_id, 24, 24, 24)
self.bitmap.blt(104+24*i, 68, icon, rect)
end
end
def update
super
@exp_sprite.update
update_tool_tip
refresh if states_list_changed?
if $states_list.size < $game_actors[1].states.size
$states_list.push([0, 0])
end
end
end
#================================================================================
# ** Scene_Map
#--------------------------------------------------------------------------------
# por iCoke~
#================================================================================
# * Parte que conta o tempo dos states e os elimina após ter cumprido o tempo má-
# ximo. Além disso, aplica alguns efeitos de status.
#--------------------------------------------------------------------------------
class Scene_Map
alias state_update update
def update
state_update
a = $states_list.size-1
for i in 0..a
if $game_actors[1].states.size > 0
apply_state_effect0($game_actors[1].states[i].id) if $game_actors[1].states[i] != nil
return if $states_list[i] == nil
return if $game_actors[1].states[i] == nil
max_time = Note.read_number('Time', $data_states[$game_actors[1].states[i].id].note)
$states_list[i][1] += 1
if $states_list[i][1] >= 40
$states_list[i][0] += 1
$states_list[i][1] = 0
apply_state_effect1($game_actors[1].states[i].id)
if $states_list[i][0] >= max_time
$states_list[i][1] = 0
$states_list[i][0] = 0
s = $game_actors[1].states[i]
$states_list.delete_at(i)
$game_actors[1].erase_state(s.id)
end
end
end
end
end
#==============================================================================
# * Aqui você configura o efeito que ocorre devido a possuir o status
#==============================================================================
def apply_state_effect0(id)
end
#==============================================================================
# * Aqui você configura o efeito que ocorre uma vez por segundo
#==============================================================================
def apply_state_effect1(id)
ani_id = Note.read_number('Ani_id', $data_states[$game_actors[1].states[0].id].note)
$game_player.animation_id = ani_id #Mostra a animação do primeiro status da lista
end
end
2) No script '[VS] Sprite_Cursor' do Cliente, acima do 'def update', adicione:
- Código:
def in_area?(x = 0, y = 0, w = width, h = height)
Mouse.x >= x && Mouse.x <= x + w && Mouse.y >= y && Mouse.y <= y + h
end
def show_tool_tip
if in_area?(116, 78, 21+21*10, 22) && $game_actors[1].states.size > 0
n = (Mouse.x-118)/21
return if $game_actors[1].states[n.abs] == nil
$in_states_area = [true, $game_actors[1].states[n.abs]]
else
$in_states_area = [false, nil]
end
end
e, ainda dentro do '[VS] Sprite_Cursor', agora dentro do 'def update', adicione a linha:
- Código:
show_tool_tip
3) Localize o script '[RM] Game_Battler', localize o 'def add_new_state', e dentro dele, remova a seguinte linha:
- Código:
sort_states
Criando um status:
Escolha(ou crie) um status no database que contenha as seguintes notas:
- Código:
Time=TEMPO
Ani_id=ID
Agradecimentos:
- Valentine pelo VXA-OS.