WorldofDiablo
Главная | Blood Rush - Форум | Регистрация | Вход
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Blood Rush
pashkevichДата: Среда, 22.12.2010, 14:56 | Сообщение # 1
Patriarch
Сообщений: 152
Статус: Offline
Blood Rush - постоянно действующий квест, позволяющий умелым игрокам заработать дополнительные руны и опыт.
Задача игрока - убивать как можно больше монстров, как можно более живучих, как можно быстрее и интенсивнее.
Квест начинается с заходом игрока в игру и заканчивается с получением награды. После получения награды квест начинается заново.
Кроме того, ваш текущий квест закончится с выходом из игры.
Квест доступен только в играх типа Expansion Ladder на уровне сложности Hell.
Квест могут выполнять только персонажи, имеющие уровень 60 или выше.

Для получения награды игроку необходимо набрать во внутриигровом чате (не выходить из игры!) слово reward.
Награду нельзя получить, если длительность вашего Blood Rush составляет менее часа или если вы убили слишком мало монстров.
Перед получением награды убедитесь, что у вас нет предмета "на курсоре", в противном случае он пропадёт при выдаче награды.

Награда - некоторое количество опыта, а кроме того - руна от Pul до Lo или 1000000 золота.

Рассмотрим теперь детально работу квеста и принцип вычисления награды.

Игрок убивает монстров в процессе выполнения квеста.
Под "игрок убивает" понимается - убивает сам игрок, его Summon (Shadow Master, Grizzly, Clay Golem, ловушки и т.д), Revived или Mercenary (наёмник).
Под "монстрами" понимаются любые враждебные существа за исключением (за убийство нижеследующих существ награда не начисляется):
- игроков и их Summon, Revived, Mercenary
- Diablo Clone, Uber Izual, Lilith, Uber Duriel
- всех монстров в локации Uber Tristram
- Talic, Madawc, Korlic ("Барбы", "Древние")

У игрока есть 3 скрытые характеристики - points, party_points и time.
points хранит количество очков, которые вы получили в результате собственноручного убийства монстров.
party_points хранит количество очков, которые вы получили в результате убийства монстров вашими сопартийцами.
time хранит время в секундах, прошедшее от начала квеста.
Следует помнить, что максимальное время жизни игры на Алькаре составляет 3 часа, а, следовательно, значение time не может превышать 10800 секунд.

При смерти монстра генерируется число monster_points. После этого:
- к points того игрока, который убил монстра, прибавляется monster_points, если в момент смерти монстра игрок не был мёртв, не умирал и не находился на расстоянии от монстра, превышающем 80 условных единиц.
- к party_points каждого игрока, который находится в одной party с убийцей монстра, прибавляется monster_points / 2, если в момент смерти монстра этот игрок-сопартиец не был мёртв, не умирал и не находился на расстоянии от монстра, превышающем 80 условных единиц.
80 условных единиц - это такое же расстояние, как и максимальное для получения опыта от сопартийцев. То есть если вам идёт опыт от ваших сопартийцев, то, скорее всего, и party_points у вас в этот момент получают соответствующее приращение.
Это расстояние примерно соответствует расстоянию между Waypoint в Kurast Docks и серединой мостика между Meshif и Ormus.

Теперь посмотрим - как получается monster_points.
Для этого сперва введём функцию одного аргумента rand(max). Значение этой функции - случайное (равномерно распределённое) целое число, лежащее в интервале от 0 до max - 1 (включительно).

Код:
monster_points = players_count_multiplier * monster_type_multiplier * (min_hp + rand(max_hp - min_hp + 1)) / 16

где:
1) min_hp и max_hp - минимальное и максимальное базовое здоровье для данного класса монстров данного уровня. То есть для любого Fallen (например) данного уровня эти два значения одинаковы, вне зависимости от того, сколько игроков находится в игре и является ли этот Fallen обычным монстром или боссом. Численные значения этих характеристик можно посмотреть на Arreat Summit и прочих ресурсах.

2) players_count_multiplier - число, зависящее от количества находящихся в игре игроков. Оно равно:
- 1, если игроков в игре менее 2
- 1.07, если в игре 2 игрока
- 1.1, если в игре более 2 игроков

3) monster_type_multiplier - число, зависящее от типа монстра. Оно равно:
- 1, если монстр - обычный
- 1.5, если монстр - Minion
- 2, если монстр - Unique (обычный случайный босс)
- 8, если монстр - Superunique (Bishibosh, The Countess, Geleb Flamefinger, Lord De Seis и т.д.)
- 2, если монстр - Champion, Ghostly или Fanatic
- 4, если монстр - Possessed
- 0.5, если монстр - Berserker
Этот множитель соответствует тому, во сколько раз здоровье у данного типа монстра больше, чем у обычного (за исключением Superunique).

Перейдём к рассмотрению того, что случается при попытке забрать свою награду при помощи команды reward.
Сперва вычисляется значение total_points:
Код:
total_points = | points, если party_points / 8 > points
total_points = | points + party_points, если party_points / 8 <= points

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

Далее выполняется проверка - если total_points < 1000000 или time < 3600, то награда не выдаётся, а игроку посылается текстовое сообщение "You must spill more blood!".

Введём функцию трёх аргументов dm(x, start, max):
Код:
dm(x, start, max) = | x, если x < start
dm(x, start, max) = | start + (x - start) * (max - start) / (x + max - 2 * start), если x >= start

Эта функция линейна до значения start, а после этого значения её рост плавно замедляется. Значение этой функции не превышает max.

Введём функцию двух аргументов pow(x, y), имеющую значение "x в степени y".

При вычислении награды сперва считается reward_value:
Код:
points_factor = points_multiplier * total_points / 6666666
intensity_factor = intensity_multiplier * total_points / (1000 * time)

reward_value = pow(dm(points_factor, 0.95, 1), 1.5) * dm(intensity_factor, 0.9, 1) * 124

reward_value - это оценка стоимости вашей награды в Пулах.
points_multiplier и intensity_multiplier - значения, зависящие от того, к какому классу принадлежит персонаж, какими скиллами пользуется.

Если у игрока, получающего награду, персонаж без телепорта, то points_multiplier = 1.1, иначе points_multiplier = 1.
Под "персонажем без телепорта" понимается персонаж, ни разу не использовавший в данной игре скилл Teleport.
Рассмотрим теперь - какие значения принимает intensity_multiplier.

1) Амазонка
- Если у Амазонки есть Телепорт, то intensity_multiplier = 1
- Иначе если у Амазонки базовый уровень (без всяких бонусов, "реально вложенные поинты") скиллов Lightning Fury и Charged Strike превышает 1, то intensity_multiplier = 1.3
- Иначе intensity_multiplier = 1.8

2) Волшебница
- Для Волшебницы intensity_multiplier = 1

3) Некромант
- Если у Некроманта есть Телепорт и базовый уровень скилла Poison Nova превышает 1, то intensity_multiplier = 1
- Иначе если у Некроманта нет Телепорта и базовый уровень скилла Poison Nova превышает 1, то intensity_multiplier = 1.3
- Иначе если у Некроманта есть Телепорт, то intensity_multiplier = 1.3
- Иначе intensity_multiplier = 1.8

4) Паладин
- Если у Паладина есть Телепорт, то intensity_multiplier = 1
- Иначе если у Паладина базовый уровень скиллов Blessed Hammer и Concentration превышает 1, то intensity_multiplier = 1.3
- Иначе intensity_multiplier = 1.8

5) Варвар
- Если у Варвара есть Телепорт, то intensity_multiplier = 1
- Иначе если Варвар хотя бы 1 раз за игру использовал скилл Whirlwind, то intensity_multiplier = 1.3
- Иначе intensity_multiplier = 1.8

6) Друид
- Если у Друида есть Телепорт, то intensity_multiplier = 1
- Иначе если у Друида базовый уровень скилла Tornado превышает 1, то intensity_multiplier = 1.3
- Иначе intensity_multiplier = 1.8

7) Убийца
- Если у Убийцы есть телепорт, то intensity_multiplier = 1
- Иначе если у Убийцы базовый уровень скилла Lightning Sentry превышает 1, то intensity_multiplier = 1.05
- Иначе intensity_multiplier = 1.6

Введём функцию одного аргумента floor(x). Значение этой функции - максимальное целое число, не превышающее x. Например, floor(1.5) = 1, floor(4.99) = 4, floor(100) = 100.

Считаем rune_value:
Код:
rune_value = pow(2, floor(ln(reward_value) / ln(2)))

ln(x) - логарифм натуральный от x.
(На самом деле, в коде это считается другим методом, а тут эта формула приведена для удобства записи и большей понятности.)

rune_value может принимать значения 1, 2, 4, 8, 16, 32 и 64. По смыслу это цена в Пулах некоторой руны (от Пула до Охма).

Далее случайным образом выбирается один из трёх вариантов награды:
- Если reward_value >= 2, то могут дать руну стоимости (в Пулах) rune_value, руну стоимости rune_value / 2 или руну стоимости rune_value * 2. То есть если у вас получилось, например, rune_value = 8 (Ist), то это значит, что вы можете получить либо Mal, либо Ist, либо Gul.
- Если reward_value < 2, то могут дать либо руну Pul, либо руну Um, либо 1000000 золота (утешительный приз).
Иными словами, при выдаче награды имеется элемент случайности. При прочих равных, максимальный доход может в четыре раза превышать минимальный доход.

Каждый из трёх вариантов имеет определённую вероятность. Для того, чтобы её найти, решается следующая система:
Код:
| 0.5 * rune_value * p1 + rune_value * p2 + 2 * rune_value * p3 = reward_value
| p1 + p2 + p3 = 1
| 0 <= p1 <= 1
| 0 <= p2 <= 1
| 0 <= p3 <= 1

p1, p2, p3 - вероятности.
В общем случае решение этой системы представляет из себя отрезок прямой в трёхмерном евклидовом пространстве. Поэтому в качестве результата выбирается случайная точка на этом отрезке.
Если reward_value < 2, то первое уравнение этой системы обращается в rune_value * p2 + 2 * rune_value * p3 = reward_value (золото - всё равно, что руна нулевой стоимости).

После этого, собственно, персонажу выдаётся награда. Руна помещается в инвентарь персонажа. Если инвентарь заполнен - кидается на землю под ноги персонажу.
Золото добавляется в Stash. Если всё золото не может поместиться в Stash, то остаток помещается в карман персонажу. Если весь остаток не помещается в карман, то излишек теряется.
После этого выдаётся текстовое сообщение, поздравляющее игрока и сообщающее ему - какую именно награду он получил.

Дополнительно игрок получает опыт. Эта часть награды численно равна (вне зависимости от уровня персонажа) rand(total_points).

После получения награды points, party_points и time игрока обнуляются.

Внимание! Maphack может блокировать сообщения от сервера! Для того, чтобы видеть их, в настройках вашего MH замените строку:
Message Filter Toggle: 1, -1, "Messages filter"
на
Message Filter Toggle: 0, -1, "Messages filter"

В C3PO необходимо отключить опцию Auto Squelch Noisy Chat Messages (закладка Key Config, группа More Auto Options).


Я хранитель СВЕТА, на границе тьмы, СВЕТ ковал мой меч для своей войны.
 
  • Страница 1 из 1
  • 1
Поиск:

Copyright Pashkevich & Company © 2024 Хостинг от uCoz