Имена событий
Информация:
Автор: Я, то есть Strelokhalfer
Версия: 1.1
Тип: Компонент для работы с именами у событий.
Описание:
Данный скрипт позволяет считывать, проверять и менять имена
у определенных событий. А так же, выводить имена в сообщениях.
Код:=begin
Имена событий
Автор: strelokhalfer
Требования: Мозг и прямые руки :)
Описание:
Данный скрипт позволяет считывать, проверять и менять имена
у определенных событий. А так же, выводить имена в сообщениях.
Лицензия:
Скрипт защищён лицензией CC BY-NC-ND 4.0, что означает:
Вы МОЖЕТЕ распространять скрипт, использовать в проектах, НО:
Вы ОБЯЗАНЫ указать моё авторство.
Вы НЕ МОЖЕТЕ использовать скрипт в коммерческих проектах,
но вы МОЖЕТЕ узнать стоимость разрешения, написав мне на
[email protected]
Вы НЕ МОЖЕТЕ изменять данный скрипт или делать свой на основе этого.
Использование:
Для вывода в сообщении:
\En[maps_id][event_id]
Где:
maps_id - номер карты
event_id - номер события
Для вызова скрипта или для условия:
Events.get_name(maps_id, event_id) - получает или сравнивает имя
Где:
maps_id - номер карты
event_id - номер события
Events.set_name(maps_id, event_id, name) - устанавливает имя
Где:
maps_id - номер карты
event_id - номер события
name - новое имя события
Events.enter_eventname(map_id, event_id, maxchar) - ввод имени
Где:
maps_id - номер карты
event_id - номер события
maxchar - максимальная длина имени, необязателен, стандартно 10.
=end
$imported = {} if $imported.nil?
$imported["Halfer_events"] = true
class Window_Base
alias halfer_convert_escape_characters convert_escape_characters
def convert_escape_characters(text, *args, &block)
new_text = text.to_s.clone
#Зато я наконец-то разобрался с регулярками
new_text.gsub!(/\\/) { "\e" }
new_text.gsub!(/\e\e/) { "\\" }
new_text.gsub!(/\eEn\[(\d+)\]\[(\d+)\]/i) { Events.get_name($1.to_i, $2.to_i) }
halfer_convert_escape_characters(new_text, *args, &block)
end
end
module Events
def self.get_name(maps_id, event_id)
return "" if maps_id == 0 || event_id == 0
evname = load_data(format("Data/Map%03d.rvdata2", maps_id))
return evname.events[event_id].name
end
def self.set_name(maps_id, event_id, name)
evname = load_data(format("Data/Map%03d.rvdata2", maps_id))
evname.events[event_id].name = name
save_data(evname, format("Data/Map%03d.rvdata2", maps_id))
end
def self.enter_eventname(map_id, event_id, maxchar = 10)
SceneManager.call(Scene_Eventname)
SceneManager.scene.prepare(map_id, event_id, maxchar)
Fiber.yield
end
end
#Копируем класс ввода имени
class Scene_Eventname < Scene_MenuBase
def prepare(mapid, eventid, maxchar)
@mapid = mapid
@eventid = eventid
@maxchar = maxchar
end
def start
super
@event = Events.get_name(@mapid, @eventid)
@edit_window = Window_EventEdit.new(@event, @maxchar)
@input_window = Window_NameInput.new(@edit_window)
@input_window.set_handler(:ok, method(:on_input_ok))
end
def on_input_ok
Events.set_name(@mapid, @eventid, @edit_window.name)
return_scene
end
end
#Пришлось полностью скопировать класс ввода имени и править
class Window_EventEdit < Window_Base
#--------------------------------------------------------------------------
# * Атрибуты
#--------------------------------------------------------------------------
attr_reader :name # name
attr_reader :index # cursor position
attr_reader :max_char # maximum number of characters
#--------------------------------------------------------------------------
# * Инициализация
#--------------------------------------------------------------------------
def initialize(actor, max_char)
x = (Graphics.width - 360) / 2
y = (Graphics.height - (fitting_height(4) + fitting_height(9) + 8)) / 2
super(x, y, 360, fitting_height(4))
@actor = actor
@max_char = max_char
@default_name = @name = actor#.name[0, @max_char]
@index = @name.size
deactivate
refresh
end
#--------------------------------------------------------------------------
# * Веруть предыдущее(если нажать ОК при пустом окне)
#--------------------------------------------------------------------------
def restore_default
@name = @default_name
@index = @name.size
refresh
return !@name.empty?
end
#--------------------------------------------------------------------------
# * Добавить букву
#--------------------------------------------------------------------------
def add(ch)
return false if @index >= @max_char
@name += ch
@index += 1
refresh
return true
end
#--------------------------------------------------------------------------
# * Сдвиг назад на 1
#--------------------------------------------------------------------------
def back
return false if @index == 0
@index -= 1
@name = @name[0, @index]
refresh
return true
end
#--------------------------------------------------------------------------
# * Ширина графики лица NEED TO EXTERMINATE, ну или сделать отрисовку лица
#--------------------------------------------------------------------------
#~ def face_width
#~ return 96
#~ end
#--------------------------------------------------------------------------
# * Ширина буквы
#--------------------------------------------------------------------------
def char_width
text_size($game_system.japanese? ? "あ" : "A").width
end
#--------------------------------------------------------------------------
# * Get Coordinates of Left Side for Drawing Name
#--------------------------------------------------------------------------
def left
name_center = (contents_width) / 2
#~ name_center = (contents_width + face_width) / 2 - ВРЕМЕННО ОСТАВИТЬ!
name_width = (@max_char + 1) * char_width
return [name_center - name_width / 2, contents_width - name_width].min
end
#--------------------------------------------------------------------------
# * Получить прямоугольник отображаемых предметов
#--------------------------------------------------------------------------
def item_rect(index)
Rect.new(left + index * char_width, 36, char_width, line_height)
end
#--------------------------------------------------------------------------
# * Прямоугольник линии(ну называется так)
#--------------------------------------------------------------------------
def underline_rect(index)
rect = item_rect(index)
rect.x += 1
rect.y += rect.height - 4
rect.width -= 2
rect.height = 2
rect
end
#--------------------------------------------------------------------------
# * Получить цвет линии
#--------------------------------------------------------------------------
def underline_color
color = normal_color
color.alpha = 48
color
end
#--------------------------------------------------------------------------
# * Нарисовать подчеркивающую линию
#--------------------------------------------------------------------------
def draw_underline(index)
contents.fill_rect(underline_rect(index), underline_color)
end
#--------------------------------------------------------------------------
# * Нарисовать текст
#--------------------------------------------------------------------------
def draw_char(index)
rect = item_rect(index)
rect.x -= 1
rect.width += 4
change_color(normal_color)
draw_text(rect, @name[index] || "")
end
#--------------------------------------------------------------------------
# * Обновить
#--------------------------------------------------------------------------
def refresh
contents.clear
@max_char.times {|i| draw_underline(i) }
@name.size.times {|i| draw_char(i) }
cursor_rect.set(item_rect(@index))
end
end
Скачать:
Демо - Архив 7z, 1.3мб.