O TEMA DO FÓRUM ESTÁ EM MANUTENÇÃO. FEEDBACKS AQUI: ACESSAR

DBZ: Legacy of Goku 2 - Dash System

Iniciado por Jorge_Maker, 16/06/2019 às 16:40

16/06/2019 às 16:40 Última edição: 28/07/2020 às 20:56 por Jorge_Maker
[box2 class=titlebg]DBZ: Legacy of Goku 2 - Dash System [/box2]

[box2 class=titlebg title=Introdução]Eu lembro que, assim que conheci o RPG Maker e comecei a fazer um jogo de Dragon Ball, eu procurava por um sistema que simulasse com fidelidade a mecânica de Dash do jogo Legacy of Goku 2. Na época não encontrei nada do gênero, no entanto, por pura nostalgia, decidi hoje fazer algo, agora que entendo um pouco de programação.
Espero que seja útil para alguém, de verdade. o/
Aliás, aos programeiros de plantão, aceito dicas hein. uaheuahe[/box2]

[box2 class=titlebg title=Características]
Em primeiro lugar, o sistema modifica a forma como se inicia o Dash: Ao contrário do padrão, em que ele ocorre ao se pressionar uma tecla, agora, nesse sistema, ele só ira acontecer caso a mesma tecla direcional seja tocada duas vezes e rapidamente. Além disso, várias outras mecânicas completamente configuráveis foram adicionadas ao sistema:


● Alterar gráfico do personagem no momento da corrida;
● Reproduzir som no momento inicial da arrancada;
● Configurar a velocidade do jogador enquanto corre;
● Pode-se personalizar o tempo tolerável entre um toque e o próximo para que o dash ocorra;
● Determinar uma Switch que irá desabilitar o dash completamente;
● É possível escolher dentre três opções para cessar o dash:
  - Caso a tecla direcional que deu inicio ao dash seja solta ou a tecla
     direcional oposta a essa seja pressiona.
  - Caso nenhuma tecla direcional esteja sendo pressionada
  - Caso o personagem mude de direção em relação a direção inicial do dash
● O knockback, que ocorre ao colidir com um obstáculo enquanto o personagem corre, pode ser desabilitado;
● Caso knockback esteja ativado, há alguns parâmetros que podem ser configurados:
  - Pose no momento em que é jogado para trás. Necessita do script Character Control para desfrutar desta funcionalidade;
  - Tremor da tela;
  - Efeito Sonoro;
  - Quantidade de tiles que o personagem será jogado para trás
● Compatibilidade com o Character Control, da Victor Engine;
● Boa funcionalidade com scripts de movimento diagonal.
[/box2]

[box2 class=titlebg title=Mídia]

Gif da versão com Add-ons[/box2]

[box2 class=titlebg title=Script]
#==============================================================================
# ** DBZ Legacy of Goku 2 - Dash System
#------------------------------------------------------------------------------
# Autor: Jorge_Maker
# Data:  16/06/2019
#------------------------------------------------------------------------------
# Introdução:
#   Esse script foi feito com o intuito de adicionar novas mecânicas ao sistema 
# de Dash do RPG Maker, tornando-o, talvez, menos monótomo.
#   Ao invés de correr por pressionar uma botão, tal ação só será realizada ao 
# se tocar a mesma tecla direcional duas vezes seguidas e num determinado espaço 
# de tempo. Além disso, outras mecânicas facultativas foram adicionadas.
#   O sistema pode ainda formar um par com o script Character Control,
# elaborado pela Victor Engine, se visando elevar o seu aspecto visual. Todavia, 
# o seu uso não é imprescindível, podendo este script ser usado individualmente.
#------------------------------------------------------------------------------
# Instruções:
#  Mais abaixo, no módulo Dash_Config
#------------------------------------------------------------------------------
# Termos de uso:
#   Use aonde quiser, da forma que quiser. Só não vale me processar. ¯\_(ツ)_/¯
#------------------------------------------------------------------------------
#
# * Overwrite methods
#   class Game_Player < Game_Character 
#     def real_move_speed
#     def dash?
#
# * Alias methods
#   class Game_Map
#     def update
#
#   class Game_Player < Game_Character
#     def initialize
#     def update
#     def movable?
#
#------------------------------------------------------------------------------
#  Caso tenha notado algum bug ou tenha alguma sugestão, só entrar em contato. o/
#==============================================================================

($imported ||= {})[:jm_advanced_dash] = 1.00

#==============================================================================
# ** Dash_Config
#------------------------------------------------------------------------------
#   Módulo de configuração do sistema
#==============================================================================

module Dash_Config
  #--------------------------------------------------------------------------
  # * Sufixo do gráfico do personagem enquanto corre
  # ** Não terá relevância caso esteja usando o Character Control (VE)
  #--------------------------------------------------------------------------
  D_Sufix     = "[dsh]"
  #--------------------------------------------------------------------------
  # * Som que será reproduzido no início da arrancada: ["Nome", Volume, Pitch]
  #--------------------------------------------------------------------------
  D_Sound     = ["Wind7", 75, 100]
  #--------------------------------------------------------------------------
  # * Acréscimo que o personagem sofrerá na sua velocidade enquanto corre
  #--------------------------------------------------------------------------
  D_Speed     = 1.5
  #--------------------------------------------------------------------------
  # * Tempo, em frames, tolerável entre o primeiro e segundo aperto 
  #--------------------------------------------------------------------------
  D_Timer     = 12
  #--------------------------------------------------------------------------
  # * ID da Switch que desativa o dash, caso seja necessário
  # ** Lembrando que já há uma opção que desabilita o dash em mapas que pode 
  # ser ativada marcando a caixa "Disable Dashing" nas propriedades dos mapas
  #--------------------------------------------------------------------------
  D_Switch    = 0
  #--------------------------------------------------------------------------
  # * Condição para parar o dash:
  # |0| - Caso a tecla direcional que deu inicio ao dash seja solta ou a tecla 
  # direcional oposta a essa seja pressiona.
  # |1| - Caso nenhuma tecla direcional esteja sendo pressionada
  # -Essas primeiras opções são as mais favoráveis caso esteja usando algum 
  # sistema de movimento diagonal.-
  # |2| - Caso o personagem mude de direção em relação a direção inicial do dash
  #--------------------------------------------------------------------------
  D_Stop_if   = 1
  #--------------------------------------------------------------------------
  # * Ativar knockback ao colidir com obstáculos? (true || false)
  #--------------------------------------------------------------------------
  D_Knockback = true
  #--------------------------------------------------------------------------
  # * Caso a constante anterior seja verdadeira, configure os parâmetros
  #--------------------------------------------------------------------------
  D_Knockback_Config = {
  #--------------------------------------------------------------------------
  # * Pose do knockback: [sufix: "", speed: x, frame: y]
  # ** Depende do script Character Control (VE) para usar deste recurso
  #--------------------------------------------------------------------------
  POSE:  {sufix: "[dmg]", speed: 14, frame: 3},
  #--------------------------------------------------------------------------
  # * Tremor da tela:    [Poder, Velocidade, Duração]
  #--------------------------------------------------------------------------
  SHAKE: [6, 16, 8],
  #--------------------------------------------------------------------------
  # * Efeito sonoro:     ["Nome", Volume, Pitch]
  #--------------------------------------------------------------------------
  SOUND: ["Blow6", 80, 100],
  #--------------------------------------------------------------------------
  # * Quantidade de Tiles que o personagem será jogado para trás
  #--------------------------------------------------------------------------
  BACK:  2
  }
end

#==============================================================================
# ** Game_Map
#------------------------------------------------------------------------------
#  This class handles maps. It includes scrolling and passage determination
# functions. The instance of this class is referenced by $game_map.
#==============================================================================

class Game_Map
  #--------------------------------------------------------------------------
  # * Atualizar
  #--------------------------------------------------------------------------
  alias :jm_double_tap_dash_up_date__ :update
  def update(main = false)
    jm_double_tap_dash_up_date__(main)
    update_double_tap_dash
  end
  #--------------------------------------------------------------------------
  # * Atualizar dash Input
  #--------------------------------------------------------------------------
  def update_double_tap_dash
    if Input.triggered_dir4 > 0
      $game_player.set_dash_timer(Input.triggered_dir4)
    end
  end
end

#==============================================================================
# ** Game_Player
#------------------------------------------------------------------------------
#  This class handles the player. It includes event starting determinants and
# map scrolling functions. The instance of this class is referenced by
# $game_player.
#==============================================================================

class Game_Player < Game_Character
  include Dash_Config
  #--------------------------------------------------------------------------
  # * Inicializar Objeto
  #--------------------------------------------------------------------------
  alias :jm_double_tap_dash_init_ialize__ :initialize
  def initialize
    jm_double_tap_dash_init_ialize__
    @knockback = 0
  end
  #--------------------------------------------------------------------------
  # * Atualizar
  #--------------------------------------------------------------------------
  alias :jm_double_tap_dash_up_date_player__ :update
  def update
    jm_double_tap_dash_up_date_player__
    update_dash_timer if @setting_dash
    update_dashing    if @dashing
  end
  #--------------------------------------------------------------------------
  # * Atualizar Parada
  #--------------------------------------------------------------------------
  def update_stop
    super
    update_knockback if @knockback > 0
  end
  #--------------------------------------------------------------------------
  # * Atualizar Knockback
  #--------------------------------------------------------------------------
  def update_knockback
    move_backward
    @knockback -= 1
  end
  #--------------------------------------------------------------------------
  # *  Velocidade real do movimento
  # ** Método reescrito
  #--------------------------------------------------------------------------
  def real_move_speed
    if @knockback > 0
      @move_speed + @knockback
    else
      @move_speed + (dash? ? D_Speed : 0)
    end
  end
  #--------------------------------------------------------------------------
  # *  Dash?
  # ** Método reescrito
  #--------------------------------------------------------------------------
  def dash?
    return @dashing
  end
  #--------------------------------------------------------------------------
  # * Pode Correr?
  #--------------------------------------------------------------------------
  def can_dash?(direction)
    return false if $game_map.interpreter.running? || @move_route_forcing ||
    $game_map.disable_dash? || vehicle || @setting_dash || @dashing || 
    knockback? || $game_switches[D_Switch] || !D_Knockback && 
    !passable?(@x,@y,direction)
    return true
  end
  #--------------------------------------------------------------------------
  # * Configurar tempo do Dash
  #--------------------------------------------------------------------------
  def set_dash_timer(direction)
    return if !can_dash?(direction)
    @dash_dir     = direction
    @dash_input   = Input.dir4_to_sym(direction)
    @setting_dash = true
    @dash_timer   = D_Timer
  end
  #--------------------------------------------------------------------------
  # * Atualizar tempo do Dash
  #--------------------------------------------------------------------------
  def update_dash_timer
    if Input.trigger?(@dash_input) && @dash_timer < D_Timer
      name = @character_name + D_Sufix
      @character_name = (FileTest.character_exist?(name) ? name : @character_name) unless $imported[:ve_character_control]
      @setting_dash   = false
      @dashing_count  = 0
      @dashing        = true
      v = D_Sound
      Audio.se_play('Audio/SE/' + v[0], v[1], v[2]) unless v[0].empty?
    end
    @dash_timer -= 1
    @setting_dash = false if @dash_timer == 0
  end
  #--------------------------------------------------------------------------
  # * Cessar Dash?
  #--------------------------------------------------------------------------
  def cease_dash?
    case D_Stop_if
    when 0; return Input.press?(Input.dir4_to_sym(10 - @dash_dir)) || !Input.press?(@dash_input)
    when 1; return true if Input.dir4 == 0
    when 2; return true if @direction != @dash_dir || Input.dir4 == 0
    end
    return true if $game_switches[D_Switch]
    return false
  end
  #--------------------------------------------------------------------------
  # * Colidiu enquanto corria?
  #--------------------------------------------------------------------------
  def dash_impassable?
    return false if @dashing_count < 3
    if !@move_succeed
      if D_Knockback
        @knockback = D_Knockback_Config[:BACK]
        s = D_Knockback_Config[:SHAKE]
        $game_map.screen.start_shake(s[0], s[1], s[2])
        v = D_Knockback_Config[:SOUND]
        Audio.se_stop
        Audio.se_play('Audio/SE/' + v[0], v[1], v[2]) unless v[0].empty?
        start_pose(knockback_pose.dup) unless !$imported[:ve_character_control]
      else
        change_pose(@idle_stance) if $imported[:ve_character_control]
      end
      return true
    end
    return false
  end
  #--------------------------------------------------------------------------
  # * Atualizar Dash
  #--------------------------------------------------------------------------
  def update_dashing
    if (dash_impassable? || cease_dash?) && @dashing_count > 0
      @character_name = (actor ? actor.character_name : "") unless $imported[:ve_character_control]
      @dashing_count  = 0
      @dashing        = false
      return
    end
    @dashing_count += 1
  end
  #--------------------------------------------------------------------------
  # * Knockback pose
  #--------------------------------------------------------------------------
  def knockback_pose
    pose = D_Knockback_Config[:POSE]
    return {sufix: pose[:sufix], speed: pose[:speed], frame: pose[:frame], walk: true}
  end
  #--------------------------------------------------------------------------
  # * Knockback?
  #--------------------------------------------------------------------------
  def knockback?
    return true if @knockback > 0 || (@pose_sufix == D_Knockback_Config[:POSE][:sufix] && 
    $imported[:ve_character_control])
    return false
  end
  #--------------------------------------------------------------------------
  # * Possível mover?
  #--------------------------------------------------------------------------
  alias :jm_double_tap_dash_movable__? :movable?
  def movable?
    return false if knockback?
    jm_double_tap_dash_movable__?
  end
end

#==============================================================================
# ** Input
#------------------------------------------------------------------------------
#  A module that handles input data from a gamepad or keyboard.
#  Managed by symbols rather than button numbers in RGSS3.
#==============================================================================

module Input
  #--------------------------------------------------------------------------
  # * Dir4 to sym
  #--------------------------------------------------------------------------
  def self.dir4_to_sym(direction)
    case direction
    when 2; return :DOWN
    when 4; return :LEFT
    when 6; return :RIGHT
    when 8; return :UP
    end
  end
  #--------------------------------------------------------------------------
  # * Triggered dir4
  #--------------------------------------------------------------------------
  def self.triggered_dir4
    return 2 if self.trigger?(DOWN)
    return 4 if self.trigger?(LEFT)
    return 6 if self.trigger?(RIGHT)
    return 8 if self.trigger?(UP)
    return 0
  end
end

#==============================================================================
# ** FileTest
#------------------------------------------------------------------------------
#  A module containing file test functions.
#==============================================================================

module FileTest
  #--------------------------------------------------------------------------
  # * Character exist?
  #--------------------------------------------------------------------------
  def self.character_exist?(filename)
    bitmap = Cache.character(filename) rescue nil
    bitmap ? true : false
  end
end
[/box2]

[box2 class=titlebg title=Demos]
● Com Add-ons:
   - Victor Engine - Basic Module
   - Victor Engine - Multi Frames
   - Victor Engine - Character Control
Download


● Sem Add-ons:
Download[/box2]

[box2 class=titlebg title=Créditos e Agradecimentos]
- Eu mesmo, Jorge, por criar e disponibilizar ♥
- Victor Sant[/box2]
Oxe

Toperson. Bem legal a ideia toda do sistema, quem sabe eu não use  :o: .
Hammer Strike

Muito bom manooo!

É um dash muito, mas muito mais inteligente do que o dash padrão. Sem falar que tudo parece fluir bem em relação a velocidade/animação, mal consigo dar um motivo para algum jogo com dash não usar algo assim  :ok: