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
OBS²: As palavras chave não devem conter acentos
Screenshots:
Script:
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.
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²: 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.