O que é?
É uma modificação que eu fiz nos scripts "[INP] Mouse" e "[SPR] Sprite_Hotkey" para fazer com que a utilização das skills seja parecida com a do jogo Ragnarok Online.
O que mudou?
Antes, você selecionava o monstro e apertava a tecla na hotkey para usar a skill no monstro selecionado. Agora você aperta a tecla na hotkey, o mouse muda o cursor(sinalizando que tem uma skill armazenada), e então você clica no monstro com o mouse para liberar a skill nele.
Além de liberar a skill, o personagem também fala o nome da skill, como em Ragnarok.
Se mudar de ideia e não quiser mais usar a skill, é só clicar em qualquer tile.
Scripts:
[INP] Mouse:
- Código:
#===============================================================================
# ** Mouse
#-------------------------------------------------------------------------------
# By Valentine, Cybersam and Astro_mech
# Editado por iCoke~ (Skills estilo Ragnarok)
#===============================================================================
class Mouse
# Apagar ícone original do cursor
Win32API.new('user32', 'ShowCursor', 'i', 'i').call(0)
# Win32 API
ScreenToClient = Win32API.new('user32', 'ScreenToClient', %w(l p), 'i')
GetCursorPos = Win32API.new('user32', 'GetCursorPos', 'p', 'i')
GetClientRect = Win32API.new('user32', 'GetClientRect', %w(l p), 'i')
GetPrivateProfileStringA = Win32API.new('kernel32', 'GetPrivateProfileStringA', %w(p p p p l p), 'l')
FindWindowA = Win32API.new('user32', 'FindWindowA', %w(p p), 'l')
# Outras configurações dos ícones do mouse
MOUSE_ICON = {}
MOUSE_ICON["Default"] = "Cursor01"
MOUSE_ICON["Enemy"] = "001-Weapon01"
MOUSE_ICON["Player"] = "Cursor02"
MOUSE_ICON["NPC"] = "Cursor02"
MOUSE_ICON["SKILL"] = "skillcursor"
#--------------------------------------------------------------------------
# * Variáveis Públicas
#--------------------------------------------------------------------------
attr_reader :x
attr_reader :y
attr_accessor :target_type
attr_accessor :target
attr_accessor :object
#--------------------------------------------------------------------------
# * Inicialização dos Objetos
#--------------------------------------------------------------------------
def initialize
$skilling = false
@icon = MOUSE_ICON["Default"]
@sprite = Sprite.new
@sprite.bitmap = RPG::Cache.icon(@icon)
@sprite.z = 999999999
@sprite2 = Sprite.new
@sprite2.z = @sprite.z - 1
@target_type = 0
@target = 0
@object = 0
update
end
#--------------------------------------------------------------------------
# * Obtenção da Posição do Cursor
#--------------------------------------------------------------------------
def get_cursor_pos
pos = [0, 0].pack('ll')
GetCursorPos.call(pos)
ScreenToClient.call(HWND, pos)
return pos.unpack('ll')
end
#--------------------------------------------------------------------------
# * Obtenção do Identificador
#--------------------------------------------------------------------------
def self.find_window
game_name = "\0" * 256
GetPrivateProfileStringA.call('Game', 'Title', '', game_name, 255, ".\\Game.ini")
game_name.delete!("\0")
return FindWindowA.call('RGSS Player', game_name)
end
#--------------------------------------------------------------------------
# * Obtenção do Cumprimento da Tela
#--------------------------------------------------------------------------
def get_client_rect
rect = [0, 0, 0, 0].pack('l4')
GetClientRect.call(HWND, rect)
return rect.unpack('l4')[2..3]
end
#--------------------------------------------------------------------------
# * Reiniciar
#--------------------------------------------------------------------------
def reset
@icon = MOUSE_ICON["Default"]
@sprite.bitmap.dispose if @sprite.bitmap != nil
@sprite.bitmap = RPG::Cache.icon(@icon)
end
#--------------------------------------------------------------------------
# * Definição do Ícone
#--------------------------------------------------------------------------
def set_icon=(icon)
@sprite2.bitmap.dispose if @sprite2.bitmap != nil
@sprite2.bitmap = RPG::Cache.icon(icon)
end
#--------------------------------------------------------------------------
# * Reiniciar Gráfico
#--------------------------------------------------------------------------
def reset_sprite
return if @object == 0
clear_icon unless Input.press?(Input::Key['Mouse Left'])
end
#--------------------------------------------------------------------------
# * Apagar Ícone
#--------------------------------------------------------------------------
def clear_icon
@object = 0
self.set_icon = ""
end
#--------------------------------------------------------------------------
# * Apagar Alvo
#--------------------------------------------------------------------------
def clear_target
if @target_type > 0
$game_map.events[@target.id].opacity = 255 if @target_type == 1
@target.opacity = 255 if @target_type == 2
@target_type = 0
@target = 0
end
end
#--------------------------------------------------------------------------
# * Atualização do Frame
#--------------------------------------------------------------------------
def update
# Atualiza as coordenadas do ícone
@x, @y = get_cursor_pos
@sprite.x = @x if !@sprite.disposed? and @sprite.x != @x
@sprite.y = @y if !@sprite.disposed? and @sprite.y != @y
@sprite2.x = @x - 13 unless @sprite2.disposed?
@sprite2.y = @y - 13 unless @sprite2.disposed?
if $scene.is_a?(Scene_Map)
# Se o mouse foi clicado
mouse_interactive if Input.trigger?(Input::Key['Mouse Left'])
mouse_netinteractive if Input.trigger?(Input::Key['Mouse Right'])
# Se o mouse está sobre
check_icon_to_icon
#sistema de mouse pra skill
if $skilling == true
@icon = MOUSE_ICON["SKILL"]
@sprite.bitmap.dispose if @sprite.bitmap != nil or @sprite.bitmap.disposed?
@sprite.bitmap = RPG::Cache.icon(@icon)
end
#----------------------------------------------------------------
# * Sistema de skill estilo ragnarok
#----------------------------------------------------------------
#Atacando monstros.
if $skilling == true and Input.trigger?(Input::Key['Mouse Left']) and @target_type == 1
if $game_party.actors[0].sp >= $data_skills[$memorize].sp_cost
if $data_skills[$memorize].scope != 1
$data_skills[$memorize].scope = 1
$scene.skill_window.use_skill($memorize)
$game_player.show_text($data_skills[$memorize].name + "!")
clear_skill_mouse
else
$scene.skill_window.use_skill($memorize)
$game_player.show_text($data_skills[$memorize].name + "!")
clear_skill_mouse
end
else
Game_Chat.add("SP insuficiente!", Color.new(200, 0, 0))
clear_skill_mouse
end
#Atacando Players.
elsif $skilling == true and Input.trigger?(Input::Key['Mouse Left']) and @target_type == 2
if $game_party.actors[0].sp >= $data_skills[$memorize].sp_cost
if $data_skills[$memorize].scope != 3 and $data_skills[$memorize].power < 0
$data_skills[$memorize].scope = 3
$scene.skill_window.use_skill($memorize)
$game_player.show_text($data_skills[$memorize].name + "!")
clear_skill_mouse
else
$data_skills[$memorize].scope = 1
$scene.skill_window.use_skill($memorize)
$game_player.show_text($data_skills[$memorize].name + "!")
clear_skill_mouse
end
else
Game_Chat.add("SP insuficiente!", Color.new(200, 0, 0))
clear_skill_mouse
end
#Buffs próprios
elsif $skilling == true and Input.trigger?(Input::Key['Mouse Left']) and tile_x == $game_player.x and tile_y == $game_player.y and @target_type != 2
if $game_party.actors[0].sp >= $data_skills[$memorize].sp_cost
if $data_skills[$memorize].power < 0
$data_skills[$memorize].scope = 3
$scene.skill_window.use_skill($memorize)
$game_player.show_text($data_skills[$memorize].name + "!")
clear_skill_mouse
else
clear_skill_mouse
end
else
Game_Chat.add("SP insuficiente!", Color.new(200, 0, 0))
clear_skill_mouse
end
elsif $skilling == true and Input.trigger?(Input::Key['Mouse Left']) and @target_type == 0
clear_skill_mouse
end
end
end
def clear_skill_mouse
$memorize = 0
$skilling = false
clear_target
end
#--------------------------------------------------------------------------
# * Sobre a janela?
#--------------------------------------------------------------------------
def over_window?
for w in $game_temp.windows
return true if w.visible and w.in_area?
end
return false
end
#--------------------------------------------------------------------------
# * Definição do Ícone de Acordo Com o Comentário
#--------------------------------------------------------------------------
def check_icon_to_icon
object = get_allobject
if object[0]
if object[1].is_a?(Game_Event)
list = comment_include(object[1], "Mouse")
return if list == nil
# Conferir o que tem na lista
for key in MOUSE_ICON.keys
next if !list.include?(key)
next if @icon == MOUSE_ICON[key]
return if @object > 0
@icon = MOUSE_ICON[key]
@sprite.bitmap.dispose if @sprite.bitmap != nil or @sprite.bitmap.disposed?
@sprite.bitmap = RPG::Cache.icon(@icon)
end
elsif object[1].is_a?(Game_NetPlayer)
if @icon != MOUSE_ICON["Player"]
return if @object > 0
@icon = MOUSE_ICON["Player"]
@sprite.bitmap.dispose if @sprite.bitmap != nil or @sprite.bitmap.disposed?
@sprite.bitmap = RPG::Cache.icon(@icon)
end
end
elsif @icon != MOUSE_ICON["Default"]
@icon = MOUSE_ICON["Default"]
@sprite.bitmap.dispose if @sprite.bitmap != nil or @sprite.bitmap.disposed?
@sprite.bitmap = RPG::Cache.icon(@icon)
end
end
#--------------------------------------------------------------------------
# * Sistema Interativo
#--------------------------------------------------------------------------
def mouse_interactive
# Verificar se há algo na posição
object = get_object
# Se for um evento
if object[0] and object[1].is_a?(Game_Event)
# Obter a posição correta
pos = get_pos(object[1])
# Retornar se não houver posição
return if pos == nil
return if @object > 0
return if over_window?
# Mover a posição
$game_player.turn_to(object[1]) if !in_direction?($game_player, object[1])
# Selecionar evento
list = comment_include(object[1], "ABS")
unless list.nil?
if $game_map.events[object[1].id].opacity == 150
$game_map.events[object[1].id].opacity = 255
@target_type = 0
@target = 0
elsif $game_map.events[object[1].id].opacity != 150
$game_map.events[object[1].id].opacity = 150
@target.opacity = 255 if @target_type == 2
$game_map.events[@target.id].opacity = 255 if @target_type == 1
@target_type = 1
@target = object[1]
@target = 0 if $ABS.enemies[@target.id] == nil
end
end
end
# Verificar se há algo na posição
object = get_netobj
# Se for um jogador
if object[0] and object[1].is_a?(Game_NetPlayer)
# Obter a posição correta
pos = get_pos(object[1])
# Retornar se não houver posição
return if pos == nil
return if @object > 0
return if over_window?
# Mover a posição
$game_player.turn_to(object[1]) if !in_direction?($game_player, object[1])
# Selecionar jogador
return if !in_range?($game_player, object[1], 20)
if object[1].opacity == 150
object[1].opacity = 255
@target_type = 0
@target = 0
else
object[1].opacity = 150
@target.opacity = 255 if @target_type == 2
$game_map.events[@target.id].opacity = 255 if @target_type == 1
@target_type = 2
@target = object[1]
end
end
# Se não há nada de movimento
return if !$game_map.passable?(tile_x, tile_y, 0, $game_player)
return if @object > 0
return if over_window?
return if $dragging
$game_player.find_path(tile_x, tile_y) if Config::ATTACK == "Mouse" and @target != 0 and tile_x == @target.x and tile_y == @target.y and $game_temp.follow == 1 or Config::PATH_FIND
end
#--------------------------------------------------------------------------
# * Mouse Interativo do Jogador
#--------------------------------------------------------------------------
def mouse_netinteractive
# Verificar se há algo na posição
object = get_netobj
if object[0] and object[1].is_a?(Game_NetPlayer)
# Obter a posição correta
pos = get_pos(object[1])
# Retornar se não houver posição
return if pos == nil
# Mover a posição
$game_player.turn_to(object[1]) if !in_direction?($game_player, object[1])
# Retornar se não estiver no alcance
return if !in_range?($game_player, object[1], 20)
# Iniciar
$scene.netcommand_window.active_netcommand(@x, @y, object[1])
end
end
#--------------------------------------------------------------------------
# * Obtenção da Posição
#--------------------------------------------------------------------------
def get_pos(object)
return [tile_x - 1, tile_y] if $game_map.passable?(tile_x - 1, tile_y, 0, object)
return [tile_x, tile_y - 1] if $game_map.passable?(tile_x, tile_y - 1, 0, object)
return [tile_x + 1, tile_y] if $game_map.passable?(tile_x + 1, tile_y, 0, object)
return [tile_x, tile_y + 1] if $game_map.passable?(tile_x, tile_y + 1, 0, object)
return nil
end
#--------------------------------------------------------------------------
# * Obtenção do Objeto
#--------------------------------------------------------------------------
def get_object
for event in $game_map.events.values
return [true, event] if event.x == tile_x and event.y == tile_y
end
return [false, nil]
end
#--------------------------------------------------------------------------
# * Obtenção do Objeto do Jogador
#--------------------------------------------------------------------------
def get_netobj
for player in Network.mapplayers.values
return [true, player] if player.x == tile_x and player.y == tile_y
end
return [false, nil]
end
#--------------------------------------------------------------------------
# * Obtenção de Todos os Objetos
#--------------------------------------------------------------------------
def get_allobject
for player in Network.mapplayers.values
return [true, player] if player.x == tile_x and player.y == tile_y
end
for event in $game_map.events.values
return [true, event] if event.x == tile_x and event.y == tile_y
end
return [false, nil]
end
#--------------------------------------------------------------------------
# * Obtenção do Comentário
#--------------------------------------------------------------------------
def comment_include(*args)
list = *args[0].list
trigger = *args[1]
return nil if list == nil
return nil unless list.is_a?(Array)
for item in list
next if item.code != 108
par = item.parameters[0].split(' ')
return item.parameters[0] if par[0] == trigger
end
return nil
end
#--------------------------------------------------------------------------
# * No Alcance?(Elemento, Objeto, Alcance) - Near Fantastica
#--------------------------------------------------------------------------
def in_range?(element, object, range)
x = (element.x - object.x) * (element.x - object.x)
y = (element.y - object.y) * (element.y - object.y)
r = x + y
return true if r <= (range * range)
return false
end
#--------------------------------------------------------------------------
# * Na Direção?(Elemento, Objeto) - Near Fantastica
#--------------------------------------------------------------------------
def in_direction?(element, object)
return true if element.direction == 2 and object.y >= element.y and object.x == element.x
return true if element.direction == 4 and object.x <= element.x and object.y == element.y
return true if element.direction == 6 and object.x >= element.x and object.y == element.y
return true if element.direction == 8 and object.y <= element.y and object.x == element.x
return false
end
#--------------------------------------------------------------------------
# * Retorna a Atual Coordenada X do Azulejo do Mouse que Está Sobre o Mapa
#--------------------------------------------------------------------------
def tile_x
return ((($game_map.display_x.to_f / 4.0).floor + @x.to_f) / 32.0).floor
end
#--------------------------------------------------------------------------
# * Retorna a Atual Coordenada Y do Azulejo do Mouse que Está Sobre o Mapa
#--------------------------------------------------------------------------
def tile_y
return ((($game_map.display_y.to_f / 4.0).floor + @y.to_f) / 32.0).floor
end
# Impede o bug do F2
HWND = self.find_window
end
[SPR] Sprite_Hotkey:
- Código:
#==============================================================================
# ** Sprite_Hotkey
#------------------------------------------------------------------------------
# By Valentine
# Editado por iCoke~ (Skills estilo Ragnarok)
#==============================================================================
class Sprite_Hotkey < RPG::Sprite
#--------------------------------------------------------------------------
# * Variáveis Públicas
#--------------------------------------------------------------------------
attr_accessor :exhausted
#--------------------------------------------------------------------------
# * Inicialização dos Objetos
#--------------------------------------------------------------------------
def initialize
super()
self.bitmap = Bitmap.new(30 * Config::MAX_HOTKEYS, 26)
$game_temp.windows << self
self.x = 235
self.y = 13
self.z = 999
self.bitmap.font.size = 12
@picture1 = RPG::Cache.picture("Hotkey1")
@picture2 = RPG::Cache.picture("Hotkey2")
@exhausted = 0
@size = 30
@memory = 0
$memorize = 0
refresh
end
#--------------------------------------------------------------------------
# * Atualização do Frame
#--------------------------------------------------------------------------
def update
use
remove if in_area?
if @exhausted > 0
@exhausted += 1
if @exhausted == 3 * 10
@exhausted = 0
end
end
end
#--------------------------------------------------------------------------
# * Atualização
#--------------------------------------------------------------------------
def refresh
self.bitmap.clear
for i in 1..Config::MAX_HOTKEYS
x = (i - 1) % Config::MAX_HOTKEYS * @size
self.bitmap.blt(x, 0, @picture1, Rect.new(0, 0, @picture1.width, @picture1.height))
next if $game_party.actors[0].hotkey[i] == 0 or $game_party.actors[0].hotkey[i] == nil
if $game_party.actors[0].hotkey[i] >= 0
item = $data_skills[$game_party.actors[0].hotkey[i]]
else
item = $data_items[$game_party.actors[0].hotkey[i] * - 1]
end
icon = RPG::Cache.icon(item.icon_name)
self.bitmap.blt(x + 1, 1, icon, Rect.new(0, 0, icon.width, icon.height))
# Se for item
if $game_party.actors[0].hotkey[i] < 0
self.bitmap.font.color = Color.new(0, 0, 0)
self.bitmap.draw_text(x + 27 - self.bitmap.text_size($game_party.item_number($game_party.actors[0].hotkey[i] * - 1).to_s).width, 6, 36, 32, $game_party.item_number($game_party.actors[0].hotkey[i] * - 1).to_s)
self.bitmap.font.color = Color.new(255, 255, 255)
self.bitmap.draw_text(x + 26 - self.bitmap.text_size($game_party.item_number($game_party.actors[0].hotkey[i] * - 1).to_s).width, 5, 36, 32, $game_party.item_number($game_party.actors[0].hotkey[i] * - 1).to_s)
end
end
self.bitmap.blt(0, 0, @picture2, Rect.new(0, 0, @picture2.width, @picture2.height))
end
#--------------------------------------------------------------------------
# * Usar Item/Magia da Hotkey
#--------------------------------------------------------------------------
def use
return if $scene.box_active
for i in 1..Config::MAX_HOTKEYS
if Input.repeat?(48 + i)
if $game_party.actors[0].hotkey[i] != 0 and $game_party.actors[0].hotkey[i] != nil
# A condição do exausted já é feita dentro dos defs abaixo
if $game_party.actors[0].hotkey[i] >= 0
# $scene.skill_window.use_skill($game_party.actors[0].hotkey[i])
$mouse.clear_target
$memorize = $game_party.actors[0].hotkey[i]
$skilling = true
else
$scene.item_window.use_item($game_party.actors[0].hotkey[i]* -1, i)
end
end
end
end
end
#--------------------------------------------------------------------------
# * Adicionar Item
#--------------------------------------------------------------------------
def add_item(k)
if $scene.item_window.item != nil
if $scene.item_window.item.id != 0 and $scene.item_window.item.is_a?(RPG::Item)
return if $scene.item_window.item.id == Config::GOLD_ID
$game_party.actors[0].hotkey[k] = $scene.item_window.item.id * -1
end
end
end
#--------------------------------------------------------------------------
# * Adicionar Magia
#--------------------------------------------------------------------------
def add_skill(k)
if $scene.skill_window.skill != nil
if $scene.skill_window.skill.id != 0
$game_party.actors[0].hotkey[k] = $scene.skill_window.skill.id
end
end
end
#--------------------------------------------------------------------------
# * Remoção do Item/Magia
#--------------------------------------------------------------------------
def remove
for i in 0..Config::MAX_HOTKEYS-1
if Input.trigger?(Input::Key['Mouse Right']) and in_area?([(i * @size), 0, @picture1.width, @picture1.height])
$game_party.actors[0].hotkey[i + 1] = 0
refresh
end
end
end
#--------------------------------------------------------------------------
# * Memorização do Item/Magia na Hotkey
#--------------------------------------------------------------------------
def select_skill
for i in 0..Config::MAX_HOTKEYS-1
if !Input.press?(Input::Key['Mouse Left']) and in_area?([(i * @size), 0, @picture1.width, @picture1.height])
# Item
if $mouse.object == 1
add_item(i + 1)
# Magia
elsif $mouse.object == 2
add_skill(i + 1)
end
refresh
end
end
end
end
Imagem necessária na pasta Graphics/Icons:
Nomeie-a de "skillcursor" sem aspas.
Screenshots:
Edit:
Percebi que não funcionava para outros players, portanto o código [INP] Mouse foi corrigido e agora funciona corretamente.
Agora você pode:
- Atacar monstro
- Curar monstro
- Atacar player
- Curar player
- Curar a si mesmo
Créditos:
Valentine pelos scripts.
iCoke~ pela edição no modo de utilizar as skills.
Última edição por iCoke~ em Ter Jan 10, 2017 1:01 am, editado 2 vez(es)