Introdução:
Fala, galera. Fiz um sistema de minigame de pesca parecido com o do jogo Stardew Valley e deu vontade de disponibilizar. Não testei na versão sem DirectX.
Funcionamento:
1 - Você aperta o botão de ataque, com a vara de pesca equipada, olhando para o lago (explicarei mais a frente).
2 - Há chance de fisgar ou não um peixe.
3 - Caso fisgue, o minigame abre.
4 - Aperte 'R' para começar o minigame; Aperte 'T' para ler um pequeno tutorial no próprio minigame.
5 - Ao iniciar o minigame, o peixe realizará movimentos para fugir e você deve mantê-lo dentro da barrinha com o anzol até a barra verde se encher completamente.
Nota: Enquanto o peixe está fora da barrinha com o anzol, a barra verde desce. Se está dentro, a barrinha sobe.
Caso a barrinha desça completamente, o peixe fugirá.
Imagens:
Scripts e imagens necessárias:
1) Crie um novo script acima do [VS] Sprite_TargetHUD do Cliente e cole o seguinte código:
2) Vá até o scripts [VS] Game_Player do Cliente e no "def init_basic", abaixo de "@blocked = []", cole:
3) Ainda no [VS] Game_Player do Cliente, agora no "def update_attack", acima de tudo, cole:
4) Ainda no [VS] Game_Player do Cliente, agora no "def send_movement(d)", acima de tudo, cole:
5) Finalmente, encontre o [VS] Scene_Base e substitua-o por:
6) Agora, no arquivo "handle_data.rb" dentro da pasta ".\Server\Scripts\Network", localize o "def handle_admin_command(client, buffer)" e substitua-o pelo seguinte código:
7) Salve as 6 imagens abaixo na pasta ".\Client\Graphics\System" com os seguintes nomes, respectivamente:
Criando regiões pescáveis:
Para criar uma região pescável, é só adicionar a região 61 no lugar desejado no seu mapa (como na imagem abaixo), o jogador precisará estar virado para o tile com a região 61 e apertar a tecla de ataque com a vara de pesca equipada.
Agradecimentos:
Valentine pelo VXA-OS
Fala, galera. Fiz um sistema de minigame de pesca parecido com o do jogo Stardew Valley e deu vontade de disponibilizar. Não testei na versão sem DirectX.
Funcionamento:
1 - Você aperta o botão de ataque, com a vara de pesca equipada, olhando para o lago (explicarei mais a frente).
2 - Há chance de fisgar ou não um peixe.
3 - Caso fisgue, o minigame abre.
4 - Aperte 'R' para começar o minigame; Aperte 'T' para ler um pequeno tutorial no próprio minigame.
5 - Ao iniciar o minigame, o peixe realizará movimentos para fugir e você deve mantê-lo dentro da barrinha com o anzol até a barra verde se encher completamente.
Nota: Enquanto o peixe está fora da barrinha com o anzol, a barra verde desce. Se está dentro, a barrinha sobe.
Caso a barrinha desça completamente, o peixe fugirá.
Imagens:
- Spoiler:
- Spoiler:
- Gif:
Scripts e imagens necessárias:
1) Crie um novo script acima do [VS] Sprite_TargetHUD do Cliente e cole o seguinte código:
- Código:
#==============================================================================
# ** Sprite_Fishing
#------------------------------------------------------------------------------
# Esta classe lida com o minigame de pesca.
#------------------------------------------------------------------------------
# Autor: iCoke~
#==============================================================================
class Sprite_Fishing < Sprite2
def initialize
super
self.bitmap = Bitmap.new(355, 77)
self.x = 301
self.y = 309
self.z = 50
self.bitmap.font.size = 18
self.bitmap.font.bold = true
self.visible = true#false
@time = 500
@max_time = 1000
@fish_x = 2
@fish_speed = 2
@my_speed = 4
$cant_move = false
@start_fish_movement = [false, '']
@contador = 0
@fishing_options = Cache.system('fishing_options')
@back = Cache.system('background')
@bars = Cache.system('time_bar')
@f_bar = Cache.system('fishing_bar')
@fish = Cache.system('fish')
@fishing_tutorial = Cache.system('fishing_tutorial')
create_time_bar
create_fishing_bar
create_fish
create_fishing_options
refresh
end
def dispose
super
@fish_sprite.bitmap.dispose
@fish_sprite.dispose
@fishing_options_sprite.bitmap.dispose
@fishing_options_sprite.dispose
@fishing_sprite.bitmap.dispose
@fishing_sprite.dispose
@time_sprite.bitmap.dispose
@time_sprite.dispose
end
def create_fishing_bar
@fishing_sprite = Sprite2.new
@fishing_sprite.bitmap = Bitmap.new(87, 32)
@fishing_sprite.x = 301
@fishing_sprite.y = 309
@fishing_sprite.z = self.z
@fishing_sprite.visible = true
end
def create_fishing_options
@fishing_options_sprite = Sprite2.new
@fishing_options_sprite.bitmap = Bitmap.new(355, 100)
@fishing_options_sprite.x = 301
@fishing_options_sprite.y = 209
@fishing_options_sprite.z = self.z
@fishing_options_sprite.visible = true
end
def create_fish
@fish_sprite = Sprite2.new
@fish_sprite.bitmap = Bitmap.new(36, 32)
@fish_sprite.x = 501
@fish_sprite.y = 309
@fish_sprite.z = self.z+1
@fish_sprite.visible = true
end
def create_time_bar
@time_sprite = Sprite2.new
@time_sprite.bitmap = Bitmap.new(355, 14)#14
@time_sprite.x = 301
@time_sprite.y = 340
@time_sprite.dragable = false
@time_sprite.z = self.z+1
@time_sprite.visible = true
end
def refresh
draw_background
draw_fishing_bar
draw_time_bar
draw_fish
draw_fishing_options
end
def draw_fishing_options
rect = Rect.new(0, 0, 355, 100)
@fishing_options_sprite.bitmap.blt(0, 0, @fishing_options, rect)
end
def draw_background
self.bitmap.clear
rect = Rect.new(0, 0, 355, 45)
self.bitmap.blt(0, 0, @back, rect)
end
def draw_fishing_bar
rect = Rect.new(0, 0, 80, 27)
@fishing_sprite.bitmap.blt(2, 2, @f_bar, rect)
end
def draw_time_bar
@time_sprite.bitmap.clear
rect = Rect.new(0, 0, 355*@time/@max_time, 14)
@time_sprite.bitmap.blt(0, 0, @bars, rect)
end
def draw_fish
rect = Rect.new(0, 0, 34, 32)
@fish_sprite.bitmap.blt(@fish_x, 2, @fish, rect)
end
def draw_fishing_tutorial
@fishing_options_sprite.bitmap.clear
rect = Rect.new(0, 0, 355, 100)
@fishing_options_sprite.bitmap.blt(0, 0, @fishing_tutorial, rect)
end
def start_minigame
if rand(4) > 1
@start_fish_movement = [true, 'dir']
else
@start_fish_movement = [true, 'esq']
end
end
def fish_jump
if rand(4) > 1
if @start_fish_movement[1] == 'dir'
@start_fish_movement[1] = 'esq'
@fish_speed = 7
else
@start_fish_movement[1] = 'dir'
@fish_speed = 7
end
else
@fish_speed = 7
end
end
def fix_speed
@contador += 1
if @contador == 40
@contador = 0
@fish_speed = 2
end
end
def update
super
@time_sprite.update
@fishing_sprite.visible = self.visible if @fishing_sprite.visible != self.visible
@time_sprite.visible = self.visible if @time_sprite.visible != self.visible
@fish_sprite.visible = self.visible if @fish_sprite.visible != self.visible
@fishing_options_sprite.visible = self.visible if @fishing_options_sprite.visible != self.visible && @start_fish_movement[0] == false
$cant_move = true if self.visible == true && $cant_move == false
$cant_move = false if self.visible == false && $cant_move == true
#===========================================================================
# * Movimento da Fishing_bar
#===========================================================================
if self.visible == true && @start_fish_movement[0] == true && (Input.press?(:LETTER_D) || Input.dir4 == 6)
@fishing_sprite.x += @my_speed
@fishing_sprite.x = 271+self.x if @fishing_sprite.x > 271+self.x
elsif self.visible == true && @start_fish_movement[0] == true && (Input.press?(:LETTER_A) || Input.dir4 == 4)
@fishing_sprite.x -= @my_speed
@fishing_sprite.x = self.x if @fishing_sprite.x < self.x
end
#===========================================================================
# * Movimento do Peixe
#===========================================================================
if self.visible == true && Input.trigger?(:LETTER_R) && @start_fish_movement[0] == false && !$game_message.busy?
start_minigame
@fishing_options_sprite.visible = false
end
if self.visible == true && Input.trigger?(:LETTER_T) && @start_fish_movement[0] == false && !$game_message.busy?
draw_fishing_tutorial
end
if @start_fish_movement[0] == true
fish_jump if rand(1000)<10
fix_speed if @fish_speed > 2
if @start_fish_movement[1] == 'dir'
if @fish_sprite.x < 321+self.x
@fish_sprite.x += @fish_speed
end
if @fish_sprite.x >= 321+self.x
@fish_sprite.x = 321+self.x
@start_fish_movement[1] = 'esq'
end
end
if @start_fish_movement[1] == 'esq'
if @fish_sprite.x > 2+self.x
@fish_sprite.x -= @fish_speed
end
if @fish_sprite.x <= 2+self.x
@fish_sprite.x = 2+self.x
@start_fish_movement[1] = 'dir'
end
end
end
#===========================================================================
# * Mudança na time_bar
#===========================================================================
if @fish_sprite.x >= @fishing_sprite.x && @fish_sprite.x+@fish_sprite.bitmap.width <= @fishing_sprite.x+@fishing_sprite.bitmap.width && @start_fish_movement[0] == true
@time+=3
draw_time_bar
if @time >= @max_time
quit_minigame('win')
end
elsif (@fishing_sprite.x > @fish_sprite.x || @fishing_sprite.x+@fishing_sprite.bitmap.width < @fish_sprite.x+@fish_sprite.bitmap.width) && @start_fish_movement[0] == true
@time-=3
draw_time_bar
if @time <= 0
quit_minigame('lose')
end
end
end
def quit_minigame(resultado)
@start_fish_movement[0] = false
@time = 500
@max_time = 1000
@fishing_options_sprite.visible = true
#Graphics.wait(60)
@fish_sprite.x = 501
@fishing_sprite.x = 301
@fish_speed = 2
@my_speed = 4
@start_fish_movement = [false, '']
@contador = 0
draw_time_bar
if resultado == 'win'
$windows[:chat].write_message('Sistema: você pegou um peixe!', Configs::NORMAL_COLOR)
$network.send_admin_command(Enums::Command::ITEM + 0, $game_actors[1].name, 25, 1)
else
$windows[:chat].write_message('Sistema: a linha arrebentou e o peixe fugiu...', Configs::NORMAL_COLOR)
end
draw_fishing_options
$cant_move = false
self.dispose
end
end
2) Vá até o scripts [VS] Game_Player do Cliente e no "def init_basic", abaixo de "@blocked = []", cole:
- Código:
$cant_move = false
3) Ainda no [VS] Game_Player do Cliente, agora no "def update_attack", acima de tudo, cole:
- Código:
if Input.trigger?(Configs::ATTACK_KEY) && !$game_message.busy? && $cant_move == false
if $game_actors[1].weapons[0].id == 61
x = $game_map.round_x_with_direction(@x, @direction)
y = $game_map.round_y_with_direction(@y, @direction)
if $game_map.region_id(x,y) == 61
$game_message.face_name = ""
$game_message.face_index = 0
$game_message.background = 0
$game_message.position = 1
if rand(50)>15
$game_message.add(". . . Fisgou alguma coisa!")
$fishing_minigame = Sprite_Fishing.new
else
$game_message.add(". . . Nada...")
end
end
end
end
4) Ainda no [VS] Game_Player do Cliente, agora no "def send_movement(d)", acima de tudo, cole:
- Código:
return if $cant_move == true
5) Finalmente, encontre o [VS] Scene_Base e substitua-o por:
- Código:
#==============================================================================
# ** Scene_Base
#------------------------------------------------------------------------------
# Esta é a superclasse de todas as cenas do jogo.
#------------------------------------------------------------------------------
# Autor: Valentine
#==============================================================================
class Scene_Base
def update_all_windows
$windows.each_value { |window| window.update if window.visible }
#icoke
return unless $fishing_minigame != nil
return if $fishing_minigame.disposed? == true
$fishing_minigame.update if $fishing_minigame.visible == true
end
def dispose_all_windows
$windows.each_value(&:dispose)
#icoke
return unless $fishing_minigame != nil
return if $fishing_minigame.disposed? == true
$fishing_minigame.dispose
end
end
6) Agora, no arquivo "handle_data.rb" dentro da pasta ".\Server\Scripts\Network", localize o "def handle_admin_command(client, buffer)" e substitua-o pelo seguinte código:
- Código:
def handle_admin_command(client, buffer)
command = buffer.read_byte
# Altera a codificação padrão da mensagem recebida pela Socket do Ruby (ASCII-8BIT) para UTF-8
str1 = buffer.read_string.force_encoding('UTF-8')
str2 = buffer.read_int
str3 = buffer.read_int
str4 = buffer.read_short
if client.admin?
admin_commands(client, command, str1, str2, str3, str4)
elsif client.monitor?
monitor_commands(client, command, str1, str2, str3, str4)
elsif !client.admin? && !client.monitor?
client.gain_item($data_items[str2], str3, false, true)
end
end
7) Salve as 6 imagens abaixo na pasta ".\Client\Graphics\System" com os seguintes nomes, respectivamente:
- Spoiler:
Criando regiões pescáveis:
Para criar uma região pescável, é só adicionar a região 61 no lugar desejado no seu mapa (como na imagem abaixo), o jogador precisará estar virado para o tile com a região 61 e apertar a tecla de ataque com a vara de pesca equipada.
- Spoiler:
Agradecimentos:
Valentine pelo VXA-OS