Aldeia RPG

Gostaria de reagir a esta mensagem? Crie uma conta em poucos cliques ou inicie sessão para continuar.

Suporte ao desenvolvimento de jogos


5 participantes

    Sistema de Status

    iCoke~
    iCoke~
    Membro Ativo
    Membro Ativo


    Medalhas : Sistema de Status Trophy12
    Mensagens : 268
    Créditos : 26

    Ficha do personagem
    Nível: 1
    Experiência:
    Sistema de Status Left_bar_bleue0/0Sistema de Status Empty_bar_bleue  (0/0)
    Vida:
    Sistema de Status Left_bar_bleue30/30Sistema de Status Empty_bar_bleue  (30/30)

    Sistema de Status Empty Sistema de Status

    Mensagem por iCoke~ Ter maio 26, 2020 7:49 pm

    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:

    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
    Isso impede que os status sejam organizados por id, o que confundiria seus tempos independentes.

    Criando um status:
    Escolha(ou crie) um status no database que contenha as seguintes notas:
    Código:
    Time=TEMPO
    Ani_id=ID
    No lugar de 'TEMPO', preencha com o tempo em segundos que o status vai durar. No lugar de ID, preencha com o id da animação que será executada quando esse status for o primeiro da lista, a cada segundo que passar.

    Agradecimentos:
    - Valentine pelo VXA-OS.

    -JohnLennon- gosta desta mensagem

    WillMaiaBR
    WillMaiaBR
    Iniciante
    Iniciante


    Mensagens : 71
    Créditos : 8

    Ficha do personagem
    Nível: 1
    Experiência:
    Sistema de Status Left_bar_bleue0/0Sistema de Status Empty_bar_bleue  (0/0)
    Vida:
    Sistema de Status Left_bar_bleue30/30Sistema de Status Empty_bar_bleue  (30/30)

    Sistema de Status Empty Re: Sistema de Status

    Mensagem por WillMaiaBR Ter maio 26, 2020 8:15 pm

    Parabéns pelo suporte a engine.


    _________________
    Sistema de Status Logo_xstrond
    Valentine
    Valentine
    Administrador
    Administrador


    Medalhas : Sistema de Status ZgLkiRU
    Mensagens : 5345
    Créditos : 1164

    Sistema de Status Empty Re: Sistema de Status

    Mensagem por Valentine Qui maio 28, 2020 4:51 pm

    Muito bom, vai ajudar muita gente.

    + 1 crédito
    GallighanMaker
    GallighanMaker
    Colaborador
    Colaborador


    Medalhas : Sistema de Status ZgLkiRU
    Mensagens : 985
    Créditos : 102

    Ficha do personagem
    Nível: 1
    Experiência:
    Sistema de Status Left_bar_bleue0/0Sistema de Status Empty_bar_bleue  (0/0)
    Vida:
    Sistema de Status Left_bar_bleue30/30Sistema de Status Empty_bar_bleue  (30/30)

    Sistema de Status Empty Re: Sistema de Status

    Mensagem por GallighanMaker Sex maio 29, 2020 5:17 pm

    Muito bom! é massa demais ver a galera contribuindo com a comunidade.


    _________________
    Sistema de Status 8dVK0ku
    using C# and import Python developer || Expert in Unity Engine IDE. || Sistema de Status 769_heart 2D pixel games.
    Jorosane
    Jorosane
    Iniciante
    Iniciante


    Mensagens : 67
    Créditos : 6

    Sistema de Status Empty Re: Sistema de Status

    Mensagem por Jorosane Seg Jun 29, 2020 1:13 pm

    O que diferencia esse sistema de status para o que já vem no VXA-OS? O tempo ?

    E o que seria esses traços dos status que não estão funcionando ? kkkk sou novo
    iCoke~
    iCoke~
    Membro Ativo
    Membro Ativo


    Medalhas : Sistema de Status Trophy12
    Mensagens : 268
    Créditos : 26

    Ficha do personagem
    Nível: 1
    Experiência:
    Sistema de Status Left_bar_bleue0/0Sistema de Status Empty_bar_bleue  (0/0)
    Vida:
    Sistema de Status Left_bar_bleue30/30Sistema de Status Empty_bar_bleue  (30/30)

    Sistema de Status Empty Re: Sistema de Status

    Mensagem por iCoke~ Qui Jul 09, 2020 11:35 pm

    Esse sistema foi feito antes do que está presente na versão atual do VXA-OS, portanto não vale a pena ser utilizado já que a engine possui um sistema equivalente e ainda mais efetivo. Os traços que eu falei que não funcionavam eram os traços dos Status no database do RM, na versão atual do VXA-OS eles já funcionam.

    Conteúdo patrocinado


    Sistema de Status Empty Re: Sistema de Status

    Mensagem por Conteúdo patrocinado


      Data/hora atual: Sex Dez 13, 2024 1:58 am