Advertisement
deadelf79

Tsukihime's Event Wrapper (перевод DeadElf79)

Jul 30th, 2015
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 54.19 KB | None | 0 0
  1. =begin
  2. #==============================================================================
  3.  ** Event Wrapper
  4.  Автор: Tsukihime
  5.  Переводчик: DeadElf79
  6.  Дата релиза: Июль 10, 2012
  7.  Дата перевода: 05.05 - 07.05.2015, 30.07.2015, 02.08.2015
  8. ------------------------------------------------------------------------------
  9.  ** Список изменений
  10.  Февраль 14, 2015
  11.    - добавлена поддерержка удаления сторонних событий по вызову
  12.  Декабрь 16, 2014
  13.    - исправлен асинхронный спавн ивентов из параллельных событий
  14.  Ноябрь 5, 2013
  15.    - добавлен простой экспорт событий, чтобы вы могли посмотреть их
  16.    прямо из редактора, если захотите
  17.    - исправлена ошибка, при которой конвертация булевых значений
  18.    происходила неправильно
  19.  Декабрь 18, 2012
  20.    - удалено хранение оригинального блока. Позднее будет заменено
  21.    на строку для правильного марашлинга (сериализации)
  22.  Октябрь 7, 2012
  23.    - исправлена ошибка, когда паттерны ивентов нельзя было использовать
  24.  Август 16, 2012
  25.    - добавлены методы экземпляра для класса EventBuilder
  26.  Август 14, 2012
  27.    - добавлена команда "delete". Использовать для сторонних событий!
  28.  Август 2,2012
  29.    - улучшен код ветвления условий. Теперь принимается вызов скрипта
  30.  Июль 11,2012
  31.    - добавлено управление движением (move_route)
  32.    - добавлен конвертор для возможности использовать 0/1 или true/false
  33.    - команда add_message может принимать массив строк теперь
  34.    - добавлен отдельный класс EventBuilder для сторонних событий
  35.  Июль 10, 2012
  36.    - реализовано создание содержимого ивента при помощи DSL
  37.    - добавлена возможность создавать условия
  38.    - добавлена куча функций из оригинального редактора событий
  39.  Июль 9, 2012
  40.    - Первый релиз
  41. ------------------------------------------------------------------------------
  42.  Данный скрипт создает обёртку (wrapper) для работы над экземплярами
  43.  класса RPG::Event, добавляя дополнительные методы для создания
  44.  и наполнения событий при помози скриптов. Все названия команд
  45.  перенесены из окна редактора событий, чтобы вы могли
  46.  сразу же использовать привычные команды.
  47.  
  48.  Пример создания нового события.
  49.  1. Создайте экземпляр класса Event и укажите координаты, где появится событие
  50.  
  51.        event = Event.new(2, 4)
  52.  2. Укажите один или несколько параметров события, например, графику персонажа
  53.  
  54.         event.character_name = "actor1"
  55.        
  56.     Вы также можете указать графику персонажа для каждой страницы события
  57.     по отдельности:
  58.    
  59.         event.page[0].character_name = "actor1"
  60.    
  61.     Так как первая страница в событии имеет номер 0 (запомните это!),
  62.     то оба примера кода выше делают одно и то же.
  63.     Вы также можете указать текущую страницу (необходимо для создания
  64.     содержимого для всех страниц, кроме нулевой).
  65.    
  66.        event.set_page(n)
  67.        
  68.     n - номер страницы
  69.  
  70.  3. Укажите условия для выбранных страниц события.
  71.     Подробнее об это - см. класс Event_Condition
  72.      
  73.     # это значит, что переключатель 2 должен быть ВКЛ.
  74.        event.condition.switch1_id = 2
  75.        
  76.     # актёр под номером 4 должен быть в партии
  77.        event.condition.actor_id = 4
  78.  
  79.  4. Не забудьте добавить только что созданное событие на карту
  80.     (в данном примере - на текущую).
  81.  
  82.        $game_map.add_event(event)
  83.        
  84.        
  85.  Теперь, освоив азы, вы можете создать отдельные функции в редакторе скриптов,
  86.  которые будут вызывать создание определенных событий тогда, когда
  87.  вам это будет нужно. Вы можете добавить эти функции в Game_Interpreter
  88.  или создать для них отдельный модуль или класс.
  89.  
  90.  Я покажу вам еще несколько примеров. На сей раз - создание содержимого
  91.  события, то есть добавление в него команд и условий. Мной был добавлен
  92.  специальный класс Event_Builder для того, чтобы вы могли
  93.  использовать синтаксис, отличный от привычного синтаксиса Ruby,
  94.  который будет при это куда удобнее.
  95.  
  96.  Все методы доступны в классе EventCommands.
  97.  
  98.  Давайте создадим наше первое сообщение, которое будет показано
  99.  при активации события (когда игрок на него нажмёт)
  100.    
  101.    event.build {
  102.    # зададим название файла графики лиц и укажем номер лица в файле
  103.    # (отсчёт идёт от нуля)
  104.       show_text("actor1", 1)
  105.    # зададим текст для сообщения, чтобы оно не было пустым
  106.       add_message("Приветствую тебя, игрок!")
  107.    }
  108.    
  109.  При создании содержимого события вы можете добавлять условия,
  110.  окно с возможностью выбора и многие другие вещи.
  111.  
  112.  Данный пример показывает, как вы можете создать список
  113.  вариантов для выбора и также установить действия,
  114.  которые будут осуществлены при выборе.
  115.  
  116.     event.build {
  117.        show_text("actor1", 1)
  118.        add_message("Что ты хотел бы восстановить?")
  119.        show_choices(["Здоровье", "Ману", "Мир во всем мире"], 0)
  120.        choice_branch(0) {
  121.           show_text("actor1", 1)
  122.           add_message("Так будь здоров и не кашляй")
  123.        }
  124.        choice_branch(1) {
  125.           show_text("actor1", 1)
  126.           add_message("Скушай вот этот кристалл, полегчает")
  127.        }
  128.        choice_branch(2) {
  129.           show_text("actor1", 1)
  130.           add_message("Ишь чего захотел!")
  131.        }
  132.     }
  133.  
  134.  Если вы знаете Ruby, то вы может использовать и его синтаксис
  135.  при создании событий тоже. Вот, например, этот скрипт
  136.  отобразит окно выбора с именами всех членов партии (Game_Party)
  137.  и после выбора одного из них, покажет его имя, уровень и класс
  138.  в обычном окне как если бы это был диалог.
  139.    
  140.     event.build {
  141.       show_text("actor2", 5)
  142.       add_message("Which party member do you wish to view?")
  143.       actors = $game_party.members.collect {|actor| actor.name }
  144.       show_choices(actors, 0)
  145.      
  146.       $game_party.members.each_with_index { |actor, i|
  147.         choice_branch(i) {
  148.           show_text(actor.face_name, actor.face_index)
  149.           add_message("%s is a level %d %s" %[actor.name, actor.level, actor.class.name])
  150.         }
  151.       }
  152.     }
  153.    
  154.  А этот пример демонстрирует работу с движением событий.
  155.  
  156.  event.build {
  157.     route = MoveRoute.new
  158.     route.build {
  159.     # Шаг вверх
  160.       move_up
  161.     # Два шага вниз
  162.       move_down(2)
  163.     # "Короткая" запись распространенных движений
  164.     # Сделаем 2 шага влево, а затем еще 2 - вправо.
  165.       move("2L2R")
  166.     }
  167.     set_move_route(-1, route)
  168.  }
  169.  
  170.  "Короткая" запись позволяет указать направления движения события одной небольшой строкой,
  171.  которая избавит вас от копирования одних и тех же повторяющихся команд
  172.  по несколько раз подряд.
  173.  
  174.  Без короткой записи:
  175.  event.build {
  176.     route = MoveRoute.new
  177.     route.build {
  178.         move_up
  179.         move_up
  180.         move_up
  181.         move_up
  182.         # Или
  183.         move_up(4)
  184.     }
  185.  }
  186.  
  187.  "Короткая" запись:
  188.  event.build {
  189.     route = MoveRoute.new
  190.     route.build {
  191.         move("4U")
  192.     }
  193.  }
  194.  
  195.  Список символов для "короткой" записи:
  196.  U - вверх
  197.  D - вниз
  198.  L - влево
  199.  R - вправо
  200.  
  201.  Q -
  202.  W -
  203.  A -
  204.  S -
  205.  
  206.  Небольшой пример использования условий в событии (не для страниц, а именно
  207.  внутри них):
  208.  def make_condition_event(x, y)
  209.     event = Event.new(x, y)
  210.     event.character_name = "actor1"
  211.     event.character_index = 2
  212.     event.build {
  213.       cond_if("$game_actors[1].level > 5") {
  214.         show_text("actor1", 2)
  215.         add_message("Приветствую! Как ты вырос!")
  216.         change_followers(true)
  217.       }
  218.       cond_else {
  219.         show_text("actor1", 2)
  220.         add_message("Твой уровень недостаточно высок для меня")
  221.       }
  222.     }
  223.     $game_map.add_event(event)
  224.   end
  225.  
  226.  Вы можете экспортировать ваше событие ("вшить" его в карту) при помощи
  227.  вызова следующего скрипта:
  228.     EventWrapper.export_event(map_id,x,y,event)
  229.  
  230.    
  231. #==============================================================================
  232. =end
  233. $imported = {} if $imported.nil?
  234. $imported["Event_Wrapper"] = true  
  235. #==============================================================================
  236. # ** Здесь начинается скрипт
  237. #==============================================================================
  238.  
  239. module Tsuki
  240.   module Event_Wrapper
  241.    
  242.     # Следующая строка объясняет какую-то неведомую переводчику магию
  243.     # This hash maps "nice" names to internal ID's used by conditional branches
  244.     Cond_Table = {
  245.       "switch"      => 0,
  246.       "variable"    => 1,  # ["variable", ID, value, value, operation]
  247.       "self-switch" => 2,
  248.       "timer"       => 3,
  249.       "actor"       => 4,
  250.       "enemy"       => 5,
  251.       "character"   => 6,
  252.       "gold"        => 7,
  253.       "item"        => 8,
  254.       "weapon"      => 9,
  255.       "armor"       => 10,
  256.       "button"      => 11,
  257.       "script"      => 12,
  258.       "vehicle"     => 13
  259.     }
  260.    
  261.     Move_String_Regex = /(\d*)([UDLRQWAS])/
  262.   end
  263. end
  264.  
  265. module EventWrapper
  266.  
  267.   def self.export_event(map_id, x, y, event)
  268.     event = Marshal.load(Marshal.dump(event))
  269.     filename = sprintf("Data/Map%03d.rvdata2", map_id)
  270.     map = load_data(filename)
  271.    
  272.     new_id = map.events.keys.max + 1
  273.     rawEvent = to_raw_event(event, x, y)
  274.     rawEvent.id = new_id
  275.     map.events[new_id] = rawEvent
  276.     save_data(map, filename)
  277.   end
  278.  
  279.   def self.to_raw_event(event, x, y)
  280.        
  281.     event.pages.each do |page|
  282.      
  283.       # Запишем все проверки условий
  284.       condition = RPG::Event::Page::Condition.new
  285.       condition.switch1_valid = page.condition.switch1_valid
  286.       condition.switch2_valid  = page.condition.switch2_valid
  287.       condition.variable_valid  = page.condition.variable_valid
  288.       condition.self_switch_valid  = page.condition.self_switch_valid
  289.       condition.item_valid  = page.condition.item_valid
  290.       condition.actor_valid  = page.condition.actor_valid
  291.       condition.switch1_id  = page.condition.switch1_id
  292.       condition.switch2_id  = page.condition.switch2_id
  293.       condition.variable_id  = page.condition.variable_id
  294.       condition.variable_value  = page.condition.variable_value
  295.       condition.self_switch_ch  = page.condition.self_switch_ch
  296.       condition.item_id  = page.condition.item_id
  297.       condition.actor_id  = page.condition.actor_id
  298.       page.condition = condition
  299.      
  300.       # А также пропишем все пути движения в событие
  301.       page.list.each do |cmd|
  302.         if cmd.code == 205
  303.           rawRoute = RPG::MoveRoute.new
  304.           route = cmd.parameters[1]
  305.           rawRoute.repeat = route.repeat
  306.           rawRoute.skippable = route.skippable
  307.           rawRoute.wait = route.wait
  308.           rawRoute.list = route.list
  309.           cmd.parameters[1] = rawRoute
  310.         end
  311.       end
  312.     end
  313.    
  314.     ev = RPG::Event.new(x, y)
  315.     ev.name = event.name
  316.     ev.pages = event.pages
  317.     return ev
  318.   end
  319. end
  320.  
  321. # Данный класс содержит обёртку (wrapper) всех команд, присутствующих в событиях.
  322. # Используется классом Event для конвертации скриптов в события.
  323.  
  324. class EventCommands
  325.  
  326.   def initialize(list, indent)
  327.     @indent = indent
  328.     @list = list
  329.     @choices = []
  330.   end
  331.  
  332.   # Вставляет команду события в список. Пустая команда может быть
  333.   # использована для индикации конца текущей ветки условия или страницы.
  334.   def add_command(code, parameters=[])
  335.     @list.insert(@list.size - 1, RPG::EventCommand.new(code, @indent, parameters))
  336.   end
  337.  
  338.   #-----------------------------------------------------------------------------
  339.   #
  340.   #-----------------------------------------------------------------------------
  341.   def eval_bool(value)
  342.     return 0 if value.is_a?(TrueClass)
  343.     return 1 if value.is_a?(FalseClass)
  344.     return value
  345.   end
  346.  
  347.   def process_block(&block)
  348.     EventCommands.new(@list, @indent + 1).instance_eval(&block)
  349.   end
  350.  
  351.   def process_method(receiver, method_name, *args)
  352.     other_eb = receiver.send(method_name, *args)
  353.     @list.insert(@list.size - 1, *other_eb.list[0...-1])
  354.   end
  355.  
  356.   def method_missing(m, *args, &block)  
  357.     raise "Error in Event Builder: there's no method called `#{m}`"  
  358.   end  
  359.   #=============================================================================
  360.   # Команды, управляющие сообщениями
  361.   #=============================================================================
  362.  
  363.   # установка окна сообщений
  364.   def show_text(face_name="", face_index=0, background=0, position=2)
  365.     add_command(101, [face_name, face_index, background, position])
  366.   end
  367.  
  368.   # добавляет текст в окно сообщений. этот метод должен быть вызван
  369.   # сразу же после метода show_text.
  370.   # заметьте: управляющие символы должы иметь два слеша, чтобы
  371.   # быть правильно отображёнными впоследствии, например
  372.   # "Значение второй переменной - \\v[2]"
  373.   # вы можете добавить несколько строк, каждая из которых станет
  374.   # отдельным сообщением
  375.   def add_message(*strings)
  376.     strings.each {|str| add_command(401, [str]) }
  377.   end
  378.  
  379.   # добавляет окно выбора
  380.   #    choices: array of strings (eg: ["yes", "no"])
  381.   #    cancel_option: какой из вариантов будет применен по умолчанию
  382.   #     если не выбран ни один из вариантов:
  383.   #        0 = никакой
  384.   #        1 = первый
  385.   #        2 = второй, ...
  386.   #        5 = branch
  387.   def show_choices(choices, cancel_option)
  388.     add_command(102, [choices, cancel_option])
  389.   end
  390.  
  391.   # Устанавливает проверку выбора из окна выбора,
  392.   # а также действие для каждого из возможных вариантов
  393.   #    index: 0 - первый вариант, 1 - второй, 2 - третий и т.д.
  394.   #    name: опционально. не имеет смысла, на самом деле
  395.   def choice_branch(index, name="", &block)
  396.     name = @choices[index]
  397.     add_command(402, [index, name])
  398.     process_block(&block)
  399.   end
  400.  
  401.   # не уверен, может быть, это конец?
  402.   def end_choices
  403.     add_command(404)
  404.   end
  405.  
  406.   # ввод числа
  407.   def input_number(var_id, digit)
  408.     add_command(103, [var_id, digit])
  409.   end
  410.  
  411.   # Помещает ID клюевого предмета в выбранную переменную
  412.   def select_key_item(var_id)
  413.     add_command(104, [var_id])
  414.   end
  415.  
  416.   # отображение прокручивающегося текста
  417.   #    string_list: массив строк, которые должны быть отображены
  418.   #    speed: скорость прокрутки
  419.   #    fast_forward: пользователь может ускорять прокрутку
  420.   def show_scrolling_text(string_list, speed=2, fast_forward=false)
  421.     add_command(105, [speed, fast_forward])
  422.     string_list.each { |str| add_command(405, [str]) }
  423.   end
  424.  
  425.   #=============================================================================
  426.   # Управление переменными, переключателями и таймером)
  427.   #=============================================================================
  428.   # Пояснение: batch_process, который упоминается ниже - это
  429.  
  430.   # устанавливает значение переключателя
  431.   #   start_var: номер переключателя (при batch_process - номер первого из списка)
  432.   #   end_var: при batch_process - номер последнего из списка
  433.   #   value: 0 for True, 1 for False
  434.   def control_switches(start_var, end_var, bool)
  435.     value = eval_bool(bool)
  436.     add_command(121, [start_var, end_var, value])
  437.   end
  438.  
  439.   #   start_var: номер переменной (при batch_process - номер первого из списка)
  440.   #   end_var: при batch_process - номер последнего из списка
  441.   def control_variables(*args)
  442.     add_command(122, args)
  443.   end
  444.  
  445.   # устанавливает значение для self-switch
  446.   #    id: название свича, который будет измненен. По умолчанию это "A", "B", "C" или "D"
  447.   #    bool: 0 = ВКЛ; 1 = ВЫКЛ
  448.   def control_self_switch(id, bool)
  449.     value = eval_bool(bool)
  450.     add_command(123, [id, value])
  451.   end
  452.  
  453.   # запускает таймер на указанное время
  454.   def start_timer(minutes, seconds)
  455.     add_command(124, [0, minutes * 60 + seconds])
  456.   end
  457.  
  458.   # останавливает таймер
  459.   def stop_timer
  460.     add_command(124, [1])
  461.   end
  462.  
  463.   #=============================================================================
  464.   # Команды управления ходом действий
  465.   #=============================================================================
  466.  
  467.   # Проверка условия, IF. Не слишком дружелюбное, необходимо точно
  468.   # знать, чего вы хотите добиться и как это правильно записать
  469.   #      type: ID из встренной хэш-таблицы для проверки условия (пример: switch)
  470.   #      args: массив аргументов к заданному условию
  471.   def cond_if(*args, &block)
  472.    
  473.     # По умолчанию производит проверку условия по скрипту
  474.     #add_command(111, args)
  475.     add_command(111, [12, args[0]])
  476.     process_block(&block)
  477.   end
  478.  
  479.   # Проверка условия "иначе", ELSE. Требует проверки условия IF.
  480.   def cond_else(&block)
  481.     add_command(411)
  482.     process_block(&block)
  483.   end
  484.  
  485.   # Обязательно необходимо закрывать ветки проверов.
  486.   def cond_end
  487.     add_command(412)
  488.   end
  489.  
  490.   # Бесконечный цикл, LOOP
  491.   def loop(&block)
  492.     add_command(112)
  493.     process_block(&block)
  494.     add_command(413)
  495.   end
  496.  
  497.   # Выход из цикла
  498.   def break_loop
  499.     add_command(113)
  500.   end
  501.  
  502.   def exit_event
  503.     add_command(115)
  504.   end
  505.  
  506.   # Вызов общего события
  507.   def call_common_event(common_id)
  508.     add_command(117, [common_id])
  509.   end
  510.  
  511.   # Установка метки
  512.   def label(str)
  513.     add_command(118, [str])
  514.   end
  515.  
  516.   # Переход к установленной метке
  517.   def goto_label(str)
  518.     add_command(119, [str])
  519.   end
  520.  
  521.   # Добавление комментария (для работы дополнительных скриптов, не иначе)
  522.   def add_comment(comment)
  523.     add_command(108, [comment])
  524.   end
  525.  
  526.   #=============================================================================
  527.   # Команды, связанные с партией
  528.   #=============================================================================
  529.  
  530.   #-----------------------------------------------------------------------------
  531.   # Command_125: Изменение количества золота
  532.   #-----------------------------------------------------------------------------
  533.   def add_gold(count=1, value_type=0)
  534.     add_command(125, [0, value_type, count])
  535.   end
  536.  
  537.   def lose_gold(count=1, value_type=0)
  538.     add_command(125, [1, value_type, count])
  539.   end
  540.  
  541.   #-----------------------------------------------------------------------------
  542.   # Command_126: Добавление/удаление предмета
  543.   #   id: номер предмета в базе данных
  544.   #   count: количество предметов или номер переменной из $game_variables
  545.   #   type: определеяет тип предыдущей переменной.
  546.   #         если type = 0, то count - константа
  547.   #         если type = 1, то count - номер переменной
  548.   #-----------------------------------------------------------------------------
  549.   def add_item(id, count, type=0)
  550.     add_command(126, [id, 0, type, count])
  551.   end
  552.  
  553.   def lose_item(id, count, type=0)
  554.     add_command(126, [id, 1, type, count])
  555.   end
  556.   #-----------------------------------------------------------------------------
  557.   # Command_127 and 128: Добавление/удаление оружия и брони
  558.   #   id: номер предмета в базе данных
  559.   #   count: количество предметов или номер переменной из $game_variables
  560.   #   type: определеяет тип предыдущей переменной.
  561.   #         если type = 0, то count - константа
  562.   #         если type = 1, то count - номер переменной
  563.   #   include_equip: используется для удаления надетых оружия или брони
  564.   #                  (возможен неточный перевод)
  565.   #-----------------------------------------------------------------------------
  566.   def add_weapon(id, count, type, include_equip)
  567.     add_command(127, [id, 0, type, count, include_equip])
  568.   end
  569.  
  570.   def lose_weapon(id, count, type, include_equip)
  571.     add_command(127, [id, 1, type, count, include_equip])
  572.   end
  573.  
  574.   def add_armor(id, count, type, include_equip)
  575.     add_command(128, [id, 0, type, count, include_equip])
  576.   end
  577.  
  578.   def lose_armor(id, count, type, include_equip)
  579.     add_command(128, [id, 1, type, count, include_equip])
  580.   end
  581.  
  582.   #-----------------------------------------------------------------------------
  583.   # Command_129: Изменение состава партии
  584.   #    actor_id: номер актёра из базы данных, которого нужно добавить/удалить
  585.   #    initialize: вернуть характеристики персонажа к тем, что в базе данных
  586.   #               0 - нет, 1 - да
  587.   #-----------------------------------------------------------------------------
  588.   def add_actor(actor_id, initialize=0)
  589.     add_command(129, [actor_id, 0, initialize])
  590.   end
  591.  
  592.   def lose_actor(actor_id, initialize=0)
  593.     add_command(129, [actor_id, 1, initialize])
  594.   end
  595.  
  596.   # Изменение количества здоровья у всех членов партии разом
  597.   #    amount: количество здоровья или же ID переменной, в которой есть это значение
  598.   #    value_type: 0 = константа, 1 = значение переменной
  599.   #    allow_knockout: возможность убить всех при отрицитальном значении amount
  600.   #
  601.   # operand (3rd element) is always "increase" since the amount can be negative
  602.   def change_party_hp(amount, value_type=0, allow_knockout=false)
  603.      add_command(311, [0, 0, 0, value_type, amount, allow_knockout])
  604.   end
  605.  
  606.   # аналогично - изменяет количество маны
  607.   def change_party_mp(amount, value_type=0)
  608.     add_command(312, [0, 0, 0, value_type, amount])
  609.   end
  610.  
  611.   # Накладывает статус на всю партию
  612.   def add_party_state(state_id)
  613.     add_command(313, [0, 0, 0, state_id])
  614.   end
  615.  
  616.   # Снимает статус со всей партии
  617.   def remove_party_state(state_id)
  618.     add_command(313, [0, 0, 1, state_id])
  619.   end
  620.  
  621.   #=============================================================================
  622.   # Команды, связанные с актерами
  623.   #=============================================================================
  624.  
  625.   #=============================================================================
  626.   # Команды, связанные с движением
  627.   #=============================================================================
  628.  
  629.   # Перемещает игрока на опеределенную карту
  630.   #   type: тип телепортации:
  631.   #       0 - в map_id записан точный номер карты, а в x и y - точные координаты
  632.   #       1 - в map_id,x и y записаны номера переменных, в которых есть координаты
  633.   #   direction: направление
  634.   #       0 - не менять
  635.   #       2 - вниз
  636.   #       4 - влево
  637.   #       6 - вправо
  638.   #       8 - вверх
  639.   #   fadeout: визуальный переход
  640.   #       1 - как обычно (затемнение)
  641.   #       1 - высветление (белый экран)
  642.   #       1 - не использовать перехода вообще
  643.   def transfer_player(type, map_id, x, y, direction=0, fadeout=0)
  644.     add_command(201, [type, map_id, x, y, direction, fadeout])
  645.   end
  646.  
  647.   # transfers vehicle to a map
  648.   #    vehicle: 0 = boat, 1 = ship, 2 = airship
  649.   #    type: 0 = direct designation, 1 = variable designation
  650.   def set_vehicle_location(vehicle, type, map_id, x, y)
  651.     add_command(202, [vehicle, type, map_id, x, y])
  652.   end
  653.  
  654.   # changes the event location
  655.   #    type: 0 = direct designation, 1 = variable designation
  656.   def set_event_location(event_id, type, x, y, direction)
  657.     add_command(203, [event_id, type, x, y, direction])
  658.   end
  659.  
  660.   # swaps event location with another event
  661.   def swap_event_location(event_id, target_event_id, direction)
  662.     set_event_location(event_id, 2, target_event_id, 0, direction)
  663.   end
  664.  
  665.   def scroll_map(direction, distance, speed=4)
  666.     add_command(204, [direction, distance, speed])
  667.   end
  668.  
  669.   #   event_id: -1 = игрок, 0 = "это событие", 1+ = любое событие,
  670.   #     имеющееся на карте
  671.   #   move_route: a RPG::MoveRoute (or wrapped Move_Route) object
  672.   def set_move_route(event_id, move_route)
  673.     add_command(205, [event_id, move_route])
  674.    
  675.     # now add each move route as a separate command just for the editor
  676.     move_route.list.each do |move_cmd|
  677.       add_command(505, [move_cmd])
  678.     end
  679.   end
  680.  
  681.  
  682.   # Войти/выйти из транспорта
  683.   def toggle_vehicle
  684.     add_command(206)
  685.   end
  686.  
  687.   #=============================================================================
  688.   # Команды, связанные с персонажами
  689.   #=============================================================================
  690.  
  691.   # turn on or off player invisibility
  692.   #    bool: 0 = ON, 1 = OF
  693.   def change_transparency(bool)
  694.     value = eval_bool(bool)
  695.     add_command(211, [value])
  696.   end
  697.  
  698.   # turn on or off followers
  699.   #    bool: 0 = ON, 1 = OFF
  700.   def change_followers(bool)
  701.     value = eval_bool(bool)
  702.     add_command(216, [value])
  703.   end
  704.  
  705.   def gather_followers
  706.     add_command(217)
  707.   end
  708.  
  709.   def show_animation(animation_id, event_id, wait_completion=true)
  710.     add_command(212, [event_id, animation_id, wait_completion])
  711.   end
  712.  
  713.   #-----------------------------------------------------------------------------
  714.   # plays balloon animation above character
  715.   #    balloon_id: Id of the balloon animation
  716.   #    event_id: -1 = player; 0 = this event; 1 or up = specific event
  717.   #    wait_completion: true or false
  718.   #-----------------------------------------------------------------------------
  719.   def show_balloon_icon(balloon_id=0, event_id=0, wait_completion=true)
  720.     add_command(213, [event_id, balloon_id, wait_completion])
  721.   end
  722.  
  723.   def erase
  724.     add_command(214)
  725.   end
  726.  
  727.   # custom command. Deletes the event permanently.
  728.   def delete
  729.     add_command(214)
  730.     add_command(215)
  731.   end
  732.   #=============================================================================
  733.   # Команды, связанные с эффектами экрана
  734.   #=============================================================================
  735.  
  736.   def fadeout_screen
  737.     add_command(221)
  738.   end
  739.  
  740.   def fadein_screen
  741.     add_command(222)
  742.   end
  743.  
  744.   # tints the screen to the specified color.
  745.   #    color is an array of the form (red, green, blue, gray)
  746.   def tint_screen(color, frames, wait_completion=true)
  747.     add_command(223, [Color.new(*color), frames, wait_completion])
  748.   end
  749.  
  750.   # color is an array of the form (red, green, blue, strength)
  751.   def flash_screen(color, frames, wait_completion=true)
  752.     add_command(224, [Color.new(*color), frames, wait_completion])
  753.   end
  754.  
  755.   def shake_screen(power, speed, frames, wait_completion=true)
  756.     add_command(225, [power, speed, frames, wait_completion])
  757.   end
  758.  
  759.   #=============================================================================
  760.   # Команды, связанные со временем
  761.   #=============================================================================
  762.  
  763.   def wait(frames)
  764.     add_command(230, [frames])
  765.   end
  766.  
  767.   #=============================================================================
  768.   # Команды, связанные с Изображениями и Погодой
  769.   #=============================================================================
  770.  
  771.   # Show a picture
  772.   #    origin: 0 for upper left, 1 for center
  773.   #    coord_type: 0 for constant, 1 for variable designation
  774.   def show_picture(id, name, origin, coord_type, x, y, zoom_x, zoom_y, opacity, blend_type)
  775.     add_command(231, [id, name, origin, coord_type, x, y, zoom_x, zoom_y, opacity, blend_type])
  776.   end
  777.  
  778.   def move_picture(id, origin, coord_type, x, y, zoom_x, zoom_y, opacity, blend_type, frames=60, wait_complete=true)
  779.     name = $game_screen.pictures[id].name
  780.     add_command(232, [id, name, origin, coord_type, x, y, zoom_x, zoom_y, opacity, blend_type, frames, wait_complete])
  781.   end
  782.    
  783.   def rotate_picture(id, speed)
  784.     add_command(233, [id, speed])
  785.   end
  786.  
  787.   def tint_picture(id, color, frames=60, wait_complete=true)
  788.     add_command(234, [id, Color.new(*color), frames, wait_complete])
  789.   end
  790.  
  791.   def erase_picture(id)
  792.     add_command(235, [id])
  793.   end
  794.  
  795.   # changes the weather
  796.   #    type: one of :none, :rain, :storm, :snow
  797.   def set_weather_effects(type, power, frames=0, wait_complete=false)
  798.     add_command(236, [type, power, frames, wait_complete])
  799.   end
  800.  
  801.   #=============================================================================
  802.   # Команды, связанные с музыкой и звуком
  803.   #=============================================================================
  804.   def play_bgm(filename, volume=80, pitch=100)
  805.     add_command(241, [RPG::BGM.new(filename, volume, pitch)])
  806.   end
  807.  
  808.   def fadeout_bgm(seconds)
  809.     add_command(242, [seconds])
  810.   end
  811.  
  812.   def save_bgm
  813.     add_command(243)
  814.   end
  815.  
  816.   def replay_bgm
  817.     add_command(244)
  818.   end
  819.  
  820.   def play_bgs(filename, volume=80, pitch=100)
  821.     add_command(245, [RPG::BGS.new(filename, volume, pitch)])
  822.   end
  823.  
  824.   def fadeout_bgs(seconds)
  825.     add_command(246, [seconds])
  826.   end
  827.  
  828.   def play_me(filename, volume=100, pitch=100)
  829.     add_command(249, [RPG::ME.new(filename, volume, pitch)])
  830.   end
  831.  
  832.   def play_se(filename, volume=80, pitch=100)
  833.     add_command(250, [RPG::SE.new(filename, volume, pitch)])
  834.   end
  835.  
  836.   def stop_se
  837.     add_command(251)
  838.   end
  839.  
  840.   #=============================================================================
  841.   # Команды, управляющие сценами
  842.   #=============================================================================
  843.  
  844.   # id: troop ID or variable ID
  845.   # enc_type: 0 = direct designation, 1 = variable
  846.   def call_battle(id, enc_type=0, can_escape=false, can_lose=false, &block)
  847.     add_command(301, [enc_type, id, can_escape, can_lose])
  848.    
  849.     if (can_lose || can_escape)
  850.       #hack because call_battle shouldn't be indenting
  851.       @indent -= 1
  852.       process_block(&block)
  853.       # insert 'branch end'
  854.       add_command(604)
  855.     end
  856.   end
  857.  
  858.   def battle_win(&block)
  859.     add_command(601)
  860.     process_block(&block)
  861.   end
  862.  
  863.   def battle_lose(&block)
  864.     add_command(603)
  865.     process_block(&block)
  866.   end
  867.  
  868.   def battle_escape(&block)
  869.     add_command(602)
  870.     process_block(&block)
  871.   end
  872.  
  873.   # Same as call battle except treated as random encounter
  874.   def random_battle(can_escape=false, can_lose=false)
  875.     call_battle(0, 2, can_escape, can_lose)
  876.   end
  877.  
  878.   # opens the shop scene
  879.   #    item_type: 0 for item, 1 for weapon, 2 for armor
  880.   #    id: database ID of the item
  881.   #    price_type: 0 for standard, 1 for custom
  882.   #    amount: 0 for standard, > 0 for custom
  883.   def call_shop(item_type, id, price_type=0, amount=0, purchase_only=false)
  884.     add_command(302, [item_type, id, price_type, amount, purchase_only])
  885.   end
  886.  
  887.   # for adding additional items to the shop
  888.   def add_shop_item(item_type, id, price_type, amount)
  889.     add_command(605, [item_type, id, price_type, amount])
  890.   end
  891.  
  892.   def process_name(actor_id, max_chars)
  893.     add_command(303, [actor_id, max_chars])
  894.   end
  895.  
  896.   def open_menu_screen
  897.     add_command(351)
  898.   end
  899.  
  900.   def open_save_screen
  901.     add_command(352)
  902.   end
  903.  
  904.   def game_over
  905.     add_command(353)
  906.   end
  907.  
  908.   def return_title
  909.     add_command(354)
  910.   end
  911.   #=============================================================================
  912.   # System Settings commands
  913.   #=============================================================================
  914.  
  915.   def change_battle_bgm(name, volume=100, pitch=100)
  916.     add_command(132, [RPG::BGM.new(name, volume, pitch)])
  917.   end
  918.  
  919.   # change battle victory ME
  920.   def change_battle_me(name, volume=80, pitch=100)
  921.     add_command(133, [RPG::ME.new(name, volume, pitch)])
  922.   end
  923.  
  924.   # enable/disable opening save scene
  925.   def change_save_access(bool)
  926.     value = eval_bool(bool)
  927.     add_command(134, [value])
  928.   end
  929.  
  930.   # enable/disable opening menu
  931.   def change_menu_access(bool)
  932.     value = eval_bool(bool)
  933.     add_command(135, [value])
  934.   end
  935.  
  936.   # enable/disable encounters
  937.   def change_encounter(bool)
  938.     value = eval_bool(bool)
  939.     add_command(136, [value])
  940.   end
  941.  
  942.   # enable/disable formation change
  943.   def change_formation_access(bool)
  944.     value = eval_bool(bool)
  945.     add_command(137, [value])
  946.   end
  947.  
  948.   # Changes the color of the window.
  949.   def change_window_color(color)
  950.     add_command(138, [Color.new(*color)])
  951.   end
  952.  
  953.   # change character sprite and face picture
  954.   def change_actor_graphics(actor_id, char_name, char_index, face_name, face_index)
  955.     add_command(322, [actor_id, char_name, index, face_name, face_index])
  956.   end
  957.  
  958.   # change character sprite
  959.   def change_actor_char(actor_id, char_name, char_index)
  960.     face_name = $game_actors[actor_id].face_name
  961.     face_index = $game_actors[actor_id].face_index
  962.     change_actor_graphics(actor_id, char_name, char_index, face_name, face_index)
  963.   end
  964.  
  965.   # change face picture
  966.   def change_actor_face(actor_id, face_name, face_index)
  967.     char_name = $game_actors[actor_id].character_name
  968.     char_index = $game_actors[actor_id].character_index
  969.     change_actor_graphics(actor_id, char_name, char_index, face_name, face_index)
  970.   end
  971.  
  972.   # change vehicle sprite
  973.   #    vehicle_id: 0 = boat, 1 = ship, 2 = airship
  974.   def change_vehicle_graphic(vehicle_id, name, index)
  975.     add_command(323, [vehicle_id, name, index])
  976.   end
  977.  
  978.   #=============================================================================
  979.   # Movie commands
  980.   #=============================================================================
  981.  
  982.   # play a movie
  983.   def play_move(name)
  984.     add_command(261, [name])
  985.   end
  986.  
  987.   #=============================================================================
  988.   # Map commands
  989.   #=============================================================================
  990.  
  991.   # Enable/disable map name display when entering map
  992.   #    value: 0 = disable, 1 = enable
  993.   def change_map_name_display(value)
  994.     add_command(281, [value])
  995.   end
  996.  
  997.   # switch to the specified tileset by ID
  998.   def change_tileset(tileset_id)
  999.     add_command(282, [tileset_id])
  1000.   end
  1001.  
  1002.   # change the battleback
  1003.   def change_battleback(front_name, back_name)
  1004.     add_command(283, [front_name, back_name])
  1005.   end
  1006.  
  1007.   def change_parallax(name, h_loop, v_loop, h_scroll, v_scroll)
  1008.     add_command(284, [name, h_loop, v_loop, h_dir, v_dir])
  1009.   end
  1010.  
  1011.   def get_location_info
  1012.   end
  1013.  
  1014.   #=============================================================================
  1015.   # Battle commands
  1016.   #=============================================================================
  1017.  
  1018.   #=============================================================================
  1019.   # Advanced commands
  1020.   #=============================================================================
  1021.  
  1022.   def call_script(script)
  1023.     add_command(355, [script])
  1024.   end
  1025. end
  1026.  
  1027. class MoveCommands
  1028.  
  1029.   # note that all move command codes are available in Game_Character
  1030.  
  1031.   def initialize(list)
  1032.     @list = list
  1033.     @northDir = 8 # default "facing up"
  1034.   end
  1035.  
  1036.   def add_command(code, parameters=[])
  1037.     @list.insert(@list.size - 1, RPG::MoveCommand.new(code, parameters))
  1038.   end
  1039.  
  1040.   def move(string)
  1041.     cmds = string.scan(Tsuki::Event_Wrapper::Move_String_Regex)
  1042.     cmds.each do |cmd|
  1043.       num = cmd[0].empty? ? 1 : cmd[0].to_i rescue 1
  1044.       case cmd[1]
  1045.       when "U"; code = 4
  1046.       when "D"; code = 1
  1047.       when "L"; code = 2
  1048.       when "R"; code = 3
  1049.       when "Q"; code = 7
  1050.       when "W"; code = 8
  1051.       when "A"; code = 5
  1052.       when "S"; code = 6
  1053.       end
  1054.       num.times do |i|
  1055.         add_command(code)
  1056.       end
  1057.     end
  1058.   end
  1059.  
  1060.   # compass-direction based movement
  1061.  
  1062.   def set_north(direction)
  1063.     @northDir = direction
  1064.   end
  1065.  
  1066.   def move_north(count=1)
  1067.     case @northDir
  1068.     when 2
  1069.       move_down(count)
  1070.     when 4
  1071.       move_left(count)
  1072.     when 6
  1073.       move_right(count)
  1074.     when 8
  1075.       move_up(count)
  1076.     end
  1077.   end
  1078.  
  1079.   def move_west(count=1)
  1080.     case @northDir
  1081.     when 2
  1082.       move_right(count)
  1083.     when 4
  1084.       move_down(count)
  1085.     when 6
  1086.       move_up(count)
  1087.     when 8
  1088.       move_left(count)
  1089.     end
  1090.   end
  1091.  
  1092.   def move_east(count=1)
  1093.     case @northDir
  1094.     when 2
  1095.       move_left(count)
  1096.     when 4
  1097.       move_up(count)
  1098.     when 6
  1099.       move_down(count)
  1100.     when 8
  1101.       move_right(count)
  1102.     end
  1103.   end
  1104.  
  1105.   def move_south(count=1)
  1106.     case @northDir
  1107.     when 2
  1108.       move_up(count)
  1109.     when 4
  1110.       move_right(count)
  1111.     when 6
  1112.       move_left(count)
  1113.     when 8
  1114.       move_down(count)
  1115.     end
  1116.   end
  1117.  
  1118.   def turn_north
  1119.     case @northDir
  1120.     when 2
  1121.       turn_down
  1122.     when 4
  1123.       turn_left
  1124.     when 6
  1125.       turn_right
  1126.     when 8
  1127.       turn_up
  1128.     end
  1129.   end
  1130.  
  1131.   def turn_east
  1132.     case @northDir
  1133.     when 2
  1134.       turn_left
  1135.     when 4
  1136.       turn_up
  1137.     when 6
  1138.       turn_down
  1139.     when 8
  1140.       turn_right
  1141.     end
  1142.   end
  1143.  
  1144.   def turn_west
  1145.     case @northDir
  1146.     when 2
  1147.       turn_right
  1148.     when 4
  1149.       turn_down
  1150.     when 6
  1151.       turn_up
  1152.     when 8
  1153.       turn_left
  1154.     end
  1155.   end
  1156.  
  1157.   def turn_south
  1158.     case @northDir
  1159.     when 2
  1160.       turn_up
  1161.     when 4
  1162.       turn_right
  1163.     when 6
  1164.       turn_left
  1165.     when 8
  1166.       turn_down
  1167.     end
  1168.   end
  1169.  
  1170.   def move_down(count=1)
  1171.     count.times { |i| add_command(1) }
  1172.   end
  1173.  
  1174.   def move_left(count=1)
  1175.     count.times { |i| add_command(2) }
  1176.   end
  1177.  
  1178.   def move_right(count=1)
  1179.     count.times { |i| add_command(3) }
  1180.   end
  1181.  
  1182.   def move_up(count=1)
  1183.     count.times { |i| add_command(4) }
  1184.   end
  1185.  
  1186.   def move_lower_left(count=1)
  1187.     count.times { |i| add_command(5) }
  1188.   end
  1189.  
  1190.   def move_lower_right(count=1)
  1191.     count.times { |i| add_command(6) }
  1192.   end
  1193.  
  1194.   def move_upper_left(count=1)
  1195.     count.times { |i| add_command(7) }
  1196.   end
  1197.  
  1198.   def move_upper_right(count=1)
  1199.     count.times { |i| add_command(8) }
  1200.   end
  1201.  
  1202.   def move_random(count=1)
  1203.     count.times { |i| add_command(9) }
  1204.   end
  1205.  
  1206.   def move_toward_player(count=1)
  1207.     count.times { |i| add_command(10) }
  1208.   end
  1209.  
  1210.   def move_away_from_player(count=1)
  1211.     count.times { |i| add_command(11) }
  1212.   end
  1213.  
  1214.   def step_forward(count=1)
  1215.     count.times { |i| add_command(12) }
  1216.   end
  1217.  
  1218.   def step_backward(count=1)
  1219.     count.times { |i| add_command(13) }
  1220.   end
  1221.  
  1222.   def jump(count=1)
  1223.     count.times { |i| add_command(14) }
  1224.   end
  1225.  
  1226.   def wait(frames)
  1227.     add_command(15, [frames])
  1228.   end
  1229.  
  1230.   def turn_down
  1231.     add_command(16)
  1232.   end
  1233.  
  1234.   def turn_left
  1235.     add_command(17)
  1236.   end
  1237.  
  1238.   def turn_right
  1239.     add_command(18)
  1240.   end
  1241.  
  1242.   def turn_up
  1243.     add_command(19)
  1244.   end
  1245.  
  1246.   def turn90_right(count=1)
  1247.     count.times { |i| add_command(20) }
  1248.   end
  1249.  
  1250.   def turn90_left(count=1)
  1251.     count.times { |i| add_command(21) }
  1252.   end
  1253.  
  1254.   def turn180(count=1)
  1255.     count.times { |i| add_command(22) }
  1256.   end
  1257.  
  1258.   # turn 90 degrees right or left
  1259.   def turn90_random(count=1)
  1260.     count.times { |i| add_command(23) }
  1261.   end
  1262.  
  1263.   def turn_random(count=1)
  1264.     count.times { |i| add_command(24) }
  1265.   end
  1266.  
  1267.   def turn_toward_player
  1268.     add_command(25)
  1269.   end
  1270.  
  1271.   def turn_away_from_player
  1272.     add_command(26)
  1273.   end
  1274.  
  1275.   def change_switch(id, value)
  1276.     value == 0 ? add_command(27, [id]) : add_command(28, [id])
  1277.   end
  1278.  
  1279.   def change_speed(number)
  1280.     add_command(29, [number])
  1281.   end
  1282.  
  1283.   def change_freq(number)
  1284.     add_command(30, [number])
  1285.   end
  1286.  
  1287.   # value: 0 = ON, 1 = OFF
  1288.   def walk_anim(value)
  1289.     value == 0 ? add_command(31) : add_command(32)
  1290.   end
  1291.  
  1292.   # value: 0 = ON, 1 = OFF
  1293.   def step_anim(value)
  1294.     value == 0 ? add_command(33) : add_command(34)
  1295.   end
  1296.  
  1297.   # value: 0 = ON, 1 = OFF
  1298.   def direction_fix(value)
  1299.     value == 0 ? add_command(35) : add_command(36)
  1300.   end
  1301.  
  1302.   # value: 0 = ON, 1 = OFF
  1303.   def through(value)
  1304.     value == 0 ? add_command(37) : add_command(38)
  1305.   end
  1306.  
  1307.   # value: 0 = ON, 1 = OFF
  1308.   def transparent(value)
  1309.     value == 0 ? add_command(39) : add_command(40)
  1310.   end
  1311.  
  1312.   def change_graphic(name, index)
  1313.     add_command(41, [name, index])
  1314.   end
  1315.  
  1316.   def change_opacity(value)
  1317.     add_command(42, [value])
  1318.   end
  1319.  
  1320.   def change_blending(value)
  1321.     add_command(43, [value])
  1322.   end
  1323.  
  1324.   def play_se(name, volume=80, pitch=100)
  1325.     add_command(44, [RPG::SE.new(name, volume, pitch)])
  1326.   end
  1327.  
  1328.   def call_script(string)
  1329.     add_command(45, [string])
  1330.   end
  1331. end
  1332.  
  1333. # This is a wrapper for RPG::MoveRoute. It provides methods that allow you
  1334. # to create move routes easily
  1335.  
  1336. class MoveRoute < RPG::MoveRoute
  1337.  
  1338.   # Instance Variables
  1339.   #    repeat
  1340.   #    skippable
  1341.   #    wait
  1342.   #    list
  1343.   def initialize
  1344.     super
  1345.     @repeat = false
  1346.     @skippable = true
  1347.   end
  1348.  
  1349.   def build(&block)
  1350.     MoveCommands.new(@list).instance_eval(&block)
  1351.   end
  1352. end
  1353.  
  1354. # This is a standalone event builder. It returns an event command list
  1355. # which you can then assign to an event to use. This allows you to
  1356. # write re-usable event creation methods
  1357.  
  1358. class EventBuilder
  1359.  
  1360.   attr_reader :list
  1361.  
  1362.   # this is preferred, since you can actually pass around a builder
  1363.   def initialize(list=nil, &block)
  1364.     @list = list || [RPG::EventCommand.new]
  1365.     @indent = 0
  1366.     EventCommands.new(@list, @indent).instance_eval(&block)
  1367.   end
  1368.  
  1369.   # if you just need to quickly build something
  1370.   def self.build(list=nil, &block)
  1371.     @list = list || [RPG::EventCommand.new]
  1372.     @indent = 0
  1373.     EventCommands.new(@list, @indent).instance_eval(&block)
  1374.     return @list
  1375.   end
  1376. end
  1377.  
  1378. # This is a wrapper for RPG::Event. It provides methods that allow you to
  1379. # create event commands the way you would do it with the editor
  1380.  
  1381. class Event < RPG::Event
  1382.  
  1383.   attr_reader :condition
  1384.   attr_reader :graphic
  1385.   attr_reader :list
  1386.  
  1387.   def initialize(x=0, y=0)
  1388.     super
  1389.     @page = @pages[0] = create_page
  1390.     @condition = @page.condition = Event_Condition.new
  1391.     @graphic = @page.graphic
  1392.     @list = @page.list
  1393.     @indent = 0
  1394.   end
  1395.  
  1396.   # change the current page.
  1397.   def set_page(page_number)
  1398.     @page = @pages[page_number] ||= create_page
  1399.     @condition = @page.condition
  1400.     @graphic = @page.graphic
  1401.     @list = @page.list
  1402.   end
  1403.  
  1404.   # create a new page, set some defaults
  1405.   def create_page
  1406.     page = RPG::Event::Page.new
  1407.     page.condition = Event_Condition.new
  1408.     page.priority_type = 1
  1409.     return page
  1410.   end
  1411.  
  1412.   # A builder method that recursively evaluates a block of commands
  1413.   # and creates the appropriate RPG::EventCommand objects.
  1414.   def build(&block)
  1415.     #@orig_block = block
  1416.     EventCommands.new(@list, @indent).instance_eval(&block)
  1417.   end
  1418.  
  1419.   # rebuilds all of the event's pages
  1420.   def rebuild
  1421.     # Not supported atm since proc's cannot be lambda'd
  1422.     #EventCommands.new(@list, @indent).instance_eval(&@orig_block)
  1423.   end
  1424.  
  1425.   #=============================================================================
  1426.   # Event page property related methods.
  1427.   #=============================================================================
  1428.  
  1429.   # set the event command list with the given list
  1430.   def list=(list)
  1431.     @page.list = list
  1432.   end
  1433.  
  1434.   def move_type=(type)
  1435.     @page.move_type = type
  1436.   end
  1437.  
  1438.   def move_speed=(speed)
  1439.     @page.move_speed = speed
  1440.   end
  1441.  
  1442.   def move_frequency=(freq)
  1443.     @page.move_frequency = freq
  1444.   end
  1445.  
  1446.   def move_route=(route)
  1447.     @page.move_route = route
  1448.   end
  1449.  
  1450.   def walk_anime=(bool)
  1451.     @page.walk_anime = bool
  1452.   end
  1453.  
  1454.   def step_anime=(bool)
  1455.     @page.step_anime = bool
  1456.   end
  1457.  
  1458.   def direction_fix=(bool)
  1459.     @page.direction_fix = bool
  1460.   end
  1461.  
  1462.   def through=(bool)
  1463.     @page.through = bool
  1464.   end
  1465.  
  1466.   # The priority type
  1467.   #   0: below characters
  1468.   #   1: same as characters
  1469.   #   2: above characters
  1470.   def priority_type=(type)
  1471.     @page.priority_type = type
  1472.   end
  1473.  
  1474.   # The event trigger
  1475.   #   0: action button
  1476.   #   1: player touch
  1477.   #   2: event touch
  1478.   #   3: autorun
  1479.   #   4: parallel
  1480.   def trigger=(trigger_id)
  1481.     @page.trigger = trigger_id
  1482.   end
  1483.  
  1484.   #=============================================================================
  1485.   # Event graphic related methods. Same as accessing
  1486.   # event.pages[page_num].graphic
  1487.   #=============================================================================
  1488.   def tile_id=(id)
  1489.     @graphic.tile_id = id
  1490.   end
  1491.  
  1492.   def direction=(dir)
  1493.     @graphic.direction = dir
  1494.   end
  1495.  
  1496.   def pattern=(index)
  1497.     @graphic.pattern = index
  1498.   end
  1499.  
  1500.   def character_name=(name)
  1501.     @graphic.character_name = name
  1502.   end
  1503.  
  1504.   def character_index=(index)
  1505.     @graphic.character_index = index
  1506.   end
  1507. end
  1508.  
  1509. class Event_Condition < RPG::Event::Page::Condition
  1510.   #=============================================================================
  1511.   # Event conditions related methods. If a condition is specified then
  1512.   # it is automatically valid
  1513.   #=============================================================================
  1514.   def switch1_id=(switch_id)
  1515.     @switch1_valid = true
  1516.     @switch1_id = switch_id
  1517.   end
  1518.  
  1519.   def switch2_id=(switch_id)
  1520.     @switch2_valid = true
  1521.     @switch2_id = switch_id
  1522.   end
  1523.  
  1524.   def variable_cond=(var_id, value)
  1525.     @variable_valid = true
  1526.     @variable_id = var_id
  1527.     @variable_value = value
  1528.   end
  1529.  
  1530.   def self_switch=(letter)
  1531.     @self_switch_valid = true
  1532.     @self_switch_ch = letter
  1533.   end
  1534.  
  1535.   def item_id=(id)
  1536.     @item_valid = true
  1537.     @item_id = id
  1538.   end
  1539.  
  1540.   def actor_id=(id)
  1541.     @actor_valid = true
  1542.     @actor_id = id
  1543.   end
  1544. end
  1545.  
  1546. # Сторонние события, созданные скриптами, не сохраняются в данных карты
  1547. # (файлах с именем MapXXX.rvdata2), поэтому мы копируем их
  1548. # в модуль Game_System, чтобы они не потерялись при переходе с карты на карту
  1549.  
  1550. class Game_System
  1551.  
  1552.   def init_custom_events(map_id)
  1553.     @custom_events = {} if @custom_events.nil?
  1554.     @custom_events[map_id] = {} if @custom_events[map_id].nil?
  1555.   end
  1556.  
  1557.   def add_custom_event(map_id, event)
  1558.     init_custom_events(map_id)
  1559.     @custom_events[map_id][event.id] = event
  1560.     SceneManager.scene.refresh_spriteset if SceneManager.scene_is?(Scene_Map)
  1561.     $game_temp.queue_event(event)
  1562.   end
  1563.  
  1564.   def remove_custom_event(map_id, event_id)
  1565.     init_custom_events(map_id)
  1566.     @custom_events[map_id].delete(event_id)
  1567.     SceneManager.scene.refresh_spriteset if SceneManager.scene_is?(Scene_Map)
  1568.   end
  1569.  
  1570.   def clear_custom_events(map_id)
  1571.     init_custom_events(map_id)
  1572.     @custom_events[map_id] = {}
  1573.     SceneManager.scene.refresh_spriteset if SceneManager.scene_is?(Scene_Map)
  1574.   end
  1575.  
  1576.   def get_custom_events(map_id)
  1577.     init_custom_events(map_id)
  1578.     return @custom_events[map_id]
  1579.     SceneManager.scene.refresh_spriteset if SceneManager.scene_is?(Scene_Map)
  1580.   end
  1581. end
  1582.  
  1583. class Game_Temp
  1584.  
  1585.   attr_reader :queued_add_events
  1586.  
  1587.   alias :th_event_wrapper_initialize :initialize
  1588.   def initialize
  1589.     th_event_wrapper_initialize
  1590.     clear_queued_events
  1591.   end
  1592.  
  1593.   def queue_event(event)
  1594.     @queued_add_events[event.id] = event
  1595.   end
  1596.  
  1597.   def clear_queued_events
  1598.     @queued_add_events = {}
  1599.   end
  1600. end
  1601.  
  1602. class Game_Map
  1603.  
  1604.   alias :th_event_wrapper_setup_events :setup_events
  1605.   def setup_events
  1606.     th_event_wrapper_setup_events
  1607.     $game_system.get_custom_events(@map_id).each {|i, event|
  1608.       @events[i] = Game_Event.new(@map_id, event)
  1609.     }
  1610.   end
  1611.  
  1612.   alias :th_event_wrapper_update_events :update_events
  1613.   def update_events
  1614.     th_event_wrapper_update_events
  1615.     add_queued_events
  1616.   end
  1617.  
  1618.   def add_event(event)
  1619.     return unless event
  1620.     puts "event valid"
  1621.     # Находим доступный номер для ивента
  1622.     if $game_temp.queued_add_events.empty?
  1623.       index = @events.empty? ? 1 : @events.keys.max + 1
  1624.     else
  1625.       index = $game_temp.queued_add_events.keys.max + 1
  1626.     end
  1627.     event.id = index
  1628.     # Сохраняем его в $game_system, так как он не привязан к карте
  1629.     $game_system.add_custom_event(@map_id, event)
  1630.    
  1631.     # Правка из версии от 10.6.12
  1632.     @events[index] = Game_Event.new(@map_id, event)
  1633.     SceneManager.scene.refresh_spriteset if SceneManager.scene_is?(Scene_Map)
  1634.   end
  1635.  
  1636.   def remove_event(event_id, map_id=$game_map.map_id)
  1637.     @events.delete(event_id)
  1638.     $game_system.remove_custom_event(map_id, event_id)    
  1639.   end
  1640.  
  1641.   #-----------------------------------------------------------------------------
  1642.   # В этом методе находятся все события, которые должны быть добавлены
  1643.   #-----------------------------------------------------------------------------
  1644.   def add_queued_events
  1645.     events = $game_temp.queued_add_events
  1646.     return if events.empty?
  1647.     events.each do |index, ev|
  1648.       @events[index] = Game_Event.new(@map_id, ev)
  1649.     end    
  1650.     events.clear
  1651.     SceneManager.scene.refresh_spriteset if SceneManager.scene_is?(Scene_Map)
  1652.   end
  1653. end
  1654.  
  1655. class Scene_Map
  1656.  
  1657.   def refresh_spriteset
  1658.     @spriteset.refresh_characters
  1659.   end
  1660. end
  1661.  
  1662. class Game_Interpreter
  1663.  
  1664.   def command_215
  1665.     map_id = $game_map.map_id # bad implementation
  1666.     $game_system.remove_custom_event(map_id, @event_id)
  1667.   end
  1668. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement