Плохо! Плохо!:  0
Показано с 1 по 6 из 6

Тема: Занимательные формулы

  1. #1
    Супер-модератор Аватар для dirge
    Информация о пользователе
    Регистрация
    25.02.2013
    Сообщений
    924
    Репутация: 79 Добавить или отнять репутацию

    VX Ace Game Icon Занимательные формулы

    Занимательные формулы



    В Rpg Maker VX ACE, разработчики дали людям отличную функцию написания своих формул для навыков\предметов. И это, в свою очередь, дает нам очень много возможностей, помимо тех, что указы в выпадающей подсказке. Но давайте для начала немного поучимся элементарных фишек программирования. Нет, нам ненужно знать программирование сильно круто, чтобы делать классные формулы, достаточно элементарного ветвления условий и парочки подсказок от скриптеров. Те, кто хоть немного знакомы с программированием, это и так знают.


    Итак, что нам нужно знать?
    Во-первых, как выглядит условие в руби, а не в редакторе мейкера. А имеет оно следующий вид, для примера:

    Код:
    if b.id == 1
      500
    elsif b.id == 2
      300
    else
      100
    end

    Рассмотрим этот пример подробней. «If»(если) и есть наше условие, если что-то равно чему-то. В нашем примере «что-то», есть b.id и равно(==) оно 1. Что такое b.id? Ну, мы знаем по всплывающим подсказкам мейкера, что «a» в формуле отображает того, кто использует навык\предмет, а «b» цель, на которую используется навык\предмет. Значит, если id цели равно 1, формула нам вернет 500, а если b.id равно 2(elsif), то 300. Во всех других случаях(else), формула вернет 100. Вместо просто цифр, вы можете использовать другие формулы, например стандартную формулу атаки «a.atk * 4 - b.def * 2». Примечание, id работает только с героями, аналогом для врагов будет enemy_id.
    Итак, общее понятие про условия мы поняли. Но ведь такую вертикальную бадью мы не запихнем в строку формул. Поэтому это можно записать таким образом:

    Код:
    if b.id == 1; 500; elsif; 300; else; 100;  end;
    Это одно и то же с тем, что мы делали выше. Каждую новую строку мы отделяем «;». Для большей наглядности вы можете в блокноте писать первый вариант, так как с ним проще работать, а потом переводить во второй.

    Наша строка формул не безгранична, в нее можно вписать примерно 100 символов. Учитывайте это, когда будете делать свою формулу.
    Также есть способ делать короткое условие.

    Код:
    b.id == 1 ? 500 : 100
    Это все тоже наше условие, только без elsif, значит оно следующее - b.id равно 1? Если условие правдиво, то возвращаем 500, если нет, то 100. «:» показывает эту развилку, слева у нас правда, справа у нас ложь.

    Возможно, вы спросите для чего все это? Все очень просто, вдруг вам нужен будет предмет\навык, который будет делать что-то специфическое в зависимости от условия, например, кто-то из вашей пати не люди, и для них нужно что-то другое, чтобы восстановить их здоровье. Это можно реализовать как-то так:

    Код:
    (b.id==1 or b.id==3 or b.id==4) ? 500 : 0
    Такой предмет будет восстанавливать здоровье, только 1,3,4 герою в вашей базе данных, а на всех остальных не будут иметь никакого влияния. Возможно, позже я добавлю полезностей, которые можно будет использовать в формулах, так же много полезных вещей достать с англоязычной статьи.

    На самом деле можно найти много применений этим знаниям, но так же много чего можно заменить общими событиями, которые можно вставлять в навыки\предметы. Но все же, как по мне, такой вариант попроще, чем ваять общее событие и забивать переменные.

    На этом все, спасибо за внимание, надеюсь для кого-то эта статья будет полезной.

    Основанием для статьи стала англоязычная статья от Fomar0153, но не является переводом, все писалось от балды, взяты только примеры оттудова.
    Англ. статья от Fomar0153 - http://cobbtocs.co.uk/wp/?p=271

    Принимаю замечания по грамматике и просто правки.



    Примеры

    1. Допустим любимая еда, одного из персонажей в пати, клубника, а у другого на нее аллергия.
    Поэтому, если её ест, например, Эрик, то он восстанавливает дополнительные 100 ХП, а если её ест Натали, то она получает отравление. Как это будет выглядеть:
    Код:
    if b.id==1; 200; elsif b.id==2; b.add_state(2); 0; else; 100; end;
    Что же мы тут видим, если ID цели равно 1, то он восстановит 200 хп, если 2, то не восстановит ничего (0) и получит статус под номером 2 в базе данных(b.add_state(2)), по умолчанию это отравление, если же ID равно чему-то еще, то 100 хп.


    2. Допустим, у нас есть магия молнии, которая наносит больше урона, если её использовать на открытом воздухе. Определять персонаж в здании или на улице, мы будем с помощью переключателя.
    Вот что у нас получится:
    Код:
    $game_switches[x] ? 500 + a.mat * 4 – b.mdf * 2 :  200 + a.mat * 4 – b.mdf * 2
    Переключатель Х включен? Тогда будет использовать левая часть (500 + a.mat * 4 – b.mdf * 2), а если выключен, то правая (200 + a.mat * 4 – b.mdf * 2). Не забываем, (:) указывает на наше разветвление вкл\выкл или правда\ложь.


    3. Допустим, вы бы хотели, чтобы во время боя, навык использовал параметры кого-то другого, а не персонажа который использует навык. Например, навык Натали будет использовать параметры атаки Эрика.
    Код:
    $game_actors[1].atk * 4 – b.def * 2
    Все очень просто, почти то же самое, что стандартная атака, только значения atk Эрика.


    4. Допустим, мы хотим, чтобы определенные навыки, наносили больше урона определенным оружием.
    Код:
    a.weapons.include?($data_weapons[1]) ? 1000 : 200
    Оружие под номером 1 в базе данных($data_weapons[1]) надето на того кто использует умение\предмет(a.weapons.include?)? Если да, то 1000, если нет 200.


    5. Допустим, у нас есть персонаж азартный игрок, который будет бросать кости, чтобы нанести урон.
    Например, обычно, он наносит выпавшую суму чисел двух кубиков умноженную на 100, в случае дубля – удваивает наносимый урон, а если выбросит «глаза змеи» (две единицы) нанесет 10000.
    Для реализации такого нам понадобится назначить две локальные переменные, «с» и «d» (не используйте для этого «а» и «b», т.к. они уже и так используются)
    Вот что у нас выйдет:
    Код:
    c=1+rand(6);d=1+rand(6);if c==1 and d==1;10000;elsif c==d;c*400;else;(c+d)*100;end;
    Мы определяем локальную переменную «с», это один из наших кубиков. Что бы симулировать бросок, мы будем использовать rand(х), данная команда возвращает рандомное число, т.к. у нас х=6, то нам выпадет число от 0 до 5, т.к. отсчет идет от 0. И прибавляем единицу, чтобы получить значения как во время броска шестигранной кости. То же самое происходит и с нашим вторым кубиком, который «d». А дальше уже нам знакомые условия. Если «с» и «d» равно одному, наносим 10000, если «с» равно «d», то умножаем один из кубиков на 400 (стандартное умножение одного кубика 100, если выбросить дубль – станет 200, а так как у нас два кубика – 400). Во всех остальных случаях формула (c+d)*100.
    Последний раз редактировалось dirge; 17.07.2014 в 15:50.

  2. #2
    Хранитель Аватар для Inca
    Информация о пользователе
    Регистрация
    28.04.2008
    Адрес
    Тауантинсуйя. Лима.
    Сообщений
    2,401
    Записей в дневнике
    9
    Репутация: 70 Добавить или отнять репутацию

    По умолчанию

    Как же жалко, что для Эйса переработали весь принцип маппинга Каким бы практичным был бы мейкер с маппингом XP и обновлённым Ruby из Эйса.

  3. #3
    Супер-модератор Аватар для dirge
    Информация о пользователе
    Регистрация
    25.02.2013
    Сообщений
    924
    Репутация: 79 Добавить или отнять репутацию

    По умолчанию

    Ну это да, но щито поделать, деньги всему виной, как мне кажется. Ведь в таком случае покупают не только АСЕ, но и ХП остался популярным.

    Если у народа будет желание, можно устроить тоже самое, что и в оригинальной статье. Человек пишет сценарий, что должен делать навык\предмет, а все остальные пробуют его реализовать. Так у нас набьются свои примеры использования данной схемы. Можно конечно просто скопировать все примеры с англ. статьи, но так ведь неинтересно?)

  4. #4
    Авторитет Аватар для David Kristens
    Информация о пользователе
    Регистрация
    27.09.2010
    Адрес
    г.Хайдельберг (Германия)
    Сообщений
    1,711
    Записей в дневнике
    157
    Репутация: 66 Добавить или отнять репутацию

    По умолчанию

    Примеры тоже нелишнее...

  5. #5
    Супер-модератор Аватар для dirge
    Информация о пользователе
    Регистрация
    25.02.2013
    Сообщений
    924
    Репутация: 79 Добавить или отнять репутацию

    По умолчанию

    так то да, просто писал статью пока на работе сидел, а после уже так лень что-то делать... Позже, если не будет движения со своими задачками от людей, то просто перекатаю примеры с английского.
    Последний раз редактировалось dirge; 03.06.2014 в 21:47.

  6. #6
    Супер-модератор Аватар для dirge
    Информация о пользователе
    Регистрация
    25.02.2013
    Сообщений
    924
    Репутация: 79 Добавить или отнять репутацию

    По умолчанию

    UPDATE!
    Добавил примеры использования. Взял их из англоязычной статьи

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Социальные закладки

Социальные закладки

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •  
Занимательные формулы