Suporte ao desenvolvimento de jogos!


    MBS - Chat com NPCs por digitação

    Compartilhe
    avatar
    Masked maker
    Novato
    Novato

    Mensagens : 2
    Créditos : 0

    MBS - Chat com NPCs por digitação

    Mensagem por Masked maker em Ter Nov 19, 2013 9:22 am

    MBS - Chat com NPC por digitação


    por Masked


    Introdução:


    Esse script foi pedido do matheusco na CRM


    Características:


    Esse script cria a opção de inserir uma mensagem em uma caixa de texto ao conversar com um NPC, dependendo do que você escrever, o NPC responderá à mensagem


    Como usar:


    Configure no script, é possível configurar uma mensagem para quando o texto for inválido e um texto a ser escrito para sair da janela.
    Dentro do NPC[id] há as keywords (palavras reconhecidas) e as ReActions(reações, podem ser uma mensagem ou, se forem AÇÃO id, alterarão uma switch, como configurado na array ACTION[id], o id digitado depois de AÇÃO deve ser o id da ACTION
    Para iniciar um chat digite
    Código:
    MBS_NPC_Talk.npc_talk(id)
    OBS.: o id é o id do NPC configurado no script
    OBS²: As palavras chave não devem conter acentos


    Screenshots:





    Script:


    Código:
    module MBS_NPC_Talk_Config
      
      NPC = []    # Não mecha
      ACTION = [] # Não mecha
      # Configure a mensagem de texto errado:
      Dont_Understand_Message = "Hein? O que você disse?"
      # Configure o texto a ser digitado para sair do chat:
      End_Chat_Input = "Nada"
      
      NPC[0] = [
      KeyWords = [
      # Palavra chave
           "ola",                
           "espada",             
            "loja"             
    ],
    # Resposta, se for AÇÃO digite o id dela e configure-a em ACTIONS
    ReActions = [
    "Olá jogador",
    "Peça para ver minha loja que mostrarei as espadas que tenho disponíveis.",
     "AÇÃO 0"
    ]
            ]
    # Configuração das ações:


    # Configure a id da switch que a ação vai mudar, true para ON e false para OFF,
                #id   #On/Off   
    ACTION[0] = [1,     true]
    end














































    module Keys
      @getAsyncKeyState = Win32API.new('user32', 'GetAsyncKeyState', 'i', 'i')
      @last_array = Array.new(256, false)
      @trigger = Array.new(256, false)
      @press = Array.new(256, false)
      def self.update
        @trigger = Array.new(256, false)
        @press = Array.new(256, false)
        for i in 0..255
          @press[i] = (@getAsyncKeyState.call(i) == 0)? false : true
          if @last_array[i] == false and @press[i] == true
            @trigger[i] = true
          end
        end
        @last_array = @press
      end
      def self.trigger?(i)
        return @trigger[i]
      end
      def self.press?(i)
        return @press[i]
      end
    end
    module Input
      class << self
        alias keys_update update
      end
      def self.update
        self.keys_update
        Keys.update
      end
    end
    class Window_Name < Window_Base
      attr_reader   :name
      attr_reader   :index
      attr_reader   :max_char
      def initialize
        super(0, 416 - 200, 544, 200)
        @name = "Escreva aqui"
        @max_char = 20
        @default_name = @name
        @index = @name.size
        self.active = false
        refresh
        update_cursor
      end
      def restore_default
        @name = @default_name
        @index = @name.size
        refresh
        update_cursor
      end
      def add(character)
        if @index < @max_char and character != ''
          @name += character
          @index += 1
          refresh
          update_cursor
        end
      end
      def back
        if @index > 0
          name_array = @name.split(//)
          @name = ""
          for i in 0...name_array.size-1
            @name += name_array[i]
          end
          @index -= 1
          refresh
          update_cursor
        end
      end
      def item_rect(index)
        rect = Rect.new(0, 0, 0, 0)
        rect.x = 270 - (@max_char + 1) * 12 + index * 24
        rect.y = 36
        rect.width = 24
        rect.height = line_height
        return rect
      end
      def refresh
        self.contents.clear
        name_array = @name.split(//)
        for i in 0...@max_char
          c = name_array[i]
          c = '' if c == nil
          self.contents.draw_text(item_rect(i), c, 1)
        end
      end
      def update_cursor
        self.cursor_rect = item_rect(@index)
      end
      def update
        super
        update_cursor
      end
    end
    class MBS_NPC_Talk < Scene_MenuBase
      include MBS_NPC_Talk_Config
      CHARACTERS = [[65,'a'],[66,'b'],[67,'c'],[68,'d'],[69,'e'],[70,'f'],[71,'g'],[72,'h'],[73,'i'],[74,'j'],[75,'k'],[76,'l'],[77,'m'],[78,'n'],[79,'o'],[80,'p'],[81,'q'],[82,'r'],[83,'s'],[84,'t'],[85,'u'],[86,'v'],[87,'w'],[88,'x'],[89,'y'],[90,'z'],[48,'0'],[49,'1'],[50,'2'],[51,'3'],[52,'4'],[53,'5'],[54,'6'],[55,'7'],[56,'8'],[57,'9'],[32,' '],[96,'0'],[97,'1'],[98,'2'],[99,'3'],[100,'4'],[101,'5'],[102,'6'],[103,'7'],[104,'8'],[105,'9']]
      ENTER = 13
      BACKSPACE = 8
      LEFT_SHIFT = 160
      RIGHT_SHIFT = 161
      def start
        super
        @actor = $game_actors[$nome_id]
        @edit_window = Window_Name.new
      end
      def terminate
        super
        @edit_window.dispose
      end
      def update
        super
        @edit_window.update
        if Keys.trigger?(BACKSPACE)
          if @edit_window.index > 0
            @edit_window.back
          end
        elsif Keys.trigger?(ENTER)
    check_message
        end
        for i in CHARACTERS
          if Keys.trigger?(i[0])
           unless @edit_window.index == @edit_window.max_char
              case shift?
              when true
                @edit_window.add(i[1].upcase)
              when false
                @edit_window.add(i[1])
              end
            end
          end
        end
      end
      def shift?
        return (Keys.press?(LEFT_SHIFT) or Keys.press?(RIGHT_SHIFT))
      end
        def check_message
          if @edit_window.name == End_Chat_Input
            SceneManager.call(Scene_Map)
            end
          for n in 0..NPC[$nome_id].size
          if @edit_window.name.include?(NPC[$nome_id][0][n])
            if NPC[$nome_id][1][n].include?("AÇÃO ")
              action_id = NPC[$nome_id][1][n].sub("AÇÃO ", "").to_i
                SceneManager.call(Scene_Map)
                $game_switches[ACTION[action_id][0]] = ACTION[action_id][1]
            else
              SceneManager.call(Scene_Map)
              $game_message.add(NPC[$nome_id][1][n])
            end
          else
            SceneManager.call(Scene_Map)
            $game_message.clear
            $game_message.add(Dont_Understand_Message)
            end
          end
      end
    def self.npc_talk(id)
      $nome_id = id
      SceneManager.call(MBS_NPC_Talk)
    end
    end
     
    Demo:


    clique


    Créditos e Agradecimentos:


    - A mim, por criar e disponibilizar;
    - Ao matheusco, pela ideia;
    - Ao Raizen pelo script de inserir nome com o teclado, que eu usei de base.

      Data/hora atual: Sex Out 19, 2018 1:27 am