Войти на сайт

Авторизация, ждите ...
×

ТЕМА: Имена событий

Имена событий 9 года 2 мес. назад #77814

  • strelokhalfer
  • strelokhalfer аватар
  • Вне сайта
  • Архитектор Миров
  • Знатный грамотей
  • Сообщений: 1640
  • Спасибо получено: 1078
  • 2 место Сбитая кодировкаОрганизатор конкурсов2 место Программист RubyДаритель СтимкеяПереводчик
Имена событий
Информация:
Автор: Я, то есть 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мб.
"Стрелок, что-то ты неочень похож на свой аватар..."(с)
Последнее редактирование: 8 года 8 мес. назад от strelokhalfer.
Администратор запретил публиковать записи гостям.
За этот пост поблагодарили: I_LORD, DeadElf79, Ren310, Демий, Bloknot

Имена событий 9 года 2 мес. назад #78505

  • Bloknot
  • Bloknot аватар
  • Вне сайта
  • Путник
  • Сообщений: 6
Спасибо!Интересненький скрипт.
. А так же, выводить имена в сообщениях.
Каким образом?

Администратор запретил публиковать записи гостям.

Имена событий 9 года 2 мес. назад #78515

  • MaltonTheWarrior
  • MaltonTheWarrior аватар
  • Вне сайта
  • Просветлённый
  • Любопытненький
  • Сообщений: 327
  • Спасибо получено: 340
  • Даритель Стимкея3 место ГотвПроект месяца 2 место1 место в ГотвВетеран3 место
Да ты прочти описание скрипта, там же все написано.
Для вывода в сообщении:
\En[maps_id][event_id]
Где:
maps_id - номер карты
event_id - номер события
Администратор запретил публиковать записи гостям.
Модераторы: NeKotZima
Время создания страницы: 0.227 секунд