Игромеханика[]
Атрибуты Править[]
- Стартовое значение атрибутов задается в GSDL (экземпляр Player_Trait).
- Атрибуты могут увеличиваться предметами, размещенными в слотах экипировки персонажа.
- Атрибуты увеличиваются с ростом соответствующей специализации.
- Если специализация сброшена - соответствующий атрибут понижается на соответствующую величину.
- Повышение специализации на 1 автоматически увеличивает атрибут на 1.
- Текущие специализации:
Номер |
Увеличивающийся от использования специализации атрибут |
Родительский навык |
Специализация |
1 |
Сила |
Ближний бой |
Рукопашный бой |
2 |
Ловкость |
Ближний бой |
Режущее оружие |
3 |
Восприятие |
Стрельба |
Пистолеты |
4 |
Сила |
Стрельба |
Дробовики |
5 |
Ловкость |
Стрельба |
Автоматы |
6 |
Восприятие |
Стрельба |
Винтовки |
7 |
Сила |
Стрельба |
Ручные пулеметы |
8 |
Ловкость |
Стрельба |
Пистолет-пулемет |
9 |
Ловкость |
Медицина |
Первая помощь |
10 |
Интеллект |
Медицина |
Хирургия |
Прокачка телосложения[]
- Прокачка данного атрибута отличается от прокачки всех остальных, т.к. на телосложение не завязаны специализации. Поэтому алгоритмически телосложение прокачивается следующим образом:
- Определяется максимально прокачанный навык:
- Текущая величина атрибута Телосложение = МЕНЬШЕЕ_ЦЕЛОЕ_ОТ(5 + 0.75 * Текущее значение максимально прокачанного навыка)
- После изменения величины атрибута Телосложение выполняется пересчет очков жизни и очков выносливости.
Свойства навыка[]
- Текущее значение навыка (целое число от 0 до 20, стартовое значение = 0 (определяется в GSDL, в PlayerTtaits)
- Текущее количество очков опыта (unsigned int32, стартовое значение = 0)
- При повышении значения навыка, текущее кол-во очков опыта = (максимальное кол-во очков опыта - текущее кол-во очков опыта).
- Максимальное количество очков опыта до повышения уровня (unsigned int32, стартовое значение = 100). При превышении данной величины навык повышается, а максимальное количество обновляется по формуле:
- Максимальное количество очков опыта (МКОО) = МКОО * 2
Т.е. прогрессия следующая:
Текущий уровень навыка |
Сколько нужно набить, чтобы перейти на следующий уровень навыка |
0 |
100 |
1 |
200 |
2 |
400 |
3 |
800 |
4 |
1600 |
5 |
3200 |
6 |
6400 |
7 |
12800 |
8 |
25600 |
9 |
51200 |
10 |
102400 |
11 |
204800 |
12 |
409600 |
13 |
819200 |
14 |
1638400 |
15 |
3276800 |
16 |
6553600 |
17 |
13107200 |
18 |
26214400 |
19 |
52428800 |
20 |
104857600 |
Навык "Ближний бой"[]
Основной механизм расчета удара[]
Последовательность расчета удара после атаки следующая:
- Определяется попадание в персонажа против уклонения персонажа.
- Определяется вероятность нанесения критического удара против избежания крита.
- Определяется количество нанесенного вреда в здоровье (часть нейтрализуется броней и превращается в удар по выносливости) с учетом крита.
- Если игроки находятся не в соседних гексах - никаких проверок нет и сразу считается, что удар не нанесен.
- Стоимость в ОД удара в кулачном бою = 5.
- Стоимость во временных характеристиках удара в кулачном бою = 10.
- Расчет попадания в режиме кулачного боя описан здесь следующим образом: если каждый следующий пункт выполняется только в том случае, если успешен предыдущий.
- Определяем попадание во врага с учетом его уклонения. Рассчет попадания во врага состоит из следующих этапов:
1. Определение вероятности нанесения успешного удара нашим персонажем. Вероятность нанесения успешного удара = 49 + (Навык "Ближний бой" * 1.25) + (Специализация "Рукопашный бой" * 5) + Бонусы персонажа. 2. Снижение вероятности за счет уклонения врага (в формуле, разумеется параметры врага). Вероятность уклонения = Атрибут "Ловкость" + Атрибут "Восприятие" + Навык "Ближний бой" + Специализация "Рукопашный бой" * 3 + Бонусы врага. 3. Непосредственно определение попадания. Мы попали, если случайное число от 1 до 100 меньше или равно (Вероятность нанесения успешного удара - Вероятность уклонения).
- В случае, если мы попали - пытаемся определить - нанесли ли мы критические повреждения. Это определяется следующим образом:
1. Определяем вероятность нанесения критических повреждений. Вероятность крита = Атрибут "Ловкость" + Навык "Ближний бой" * 2.5 + Специализация "Рукопашный бой" * 6 + Бонусы персонажа. 2. Определяем вероятность избегания критических повреждений Вероятность избегания крита = (Атрибут "Ловкость" + Атрибут "Восприятие") / 2 + Навык "Ближний бой" / 4 + Специализация "Рукопашный бой" + Бонусы врага. 3. Определение нанесения критического удара. Мы нанесли критический удар, если случайное число от 1 до 100 меньше или равно (Вероятность крита - Вероятность избегания крита).
- Определяем нанесенный вред.
1. Определяем абсолютный вред. 1. Абсолютный вред для рукопашного боя = Случайное число от (Атрибут "Сила" / 2) до (Атрибут "Сила" * 1.5). 1. Абсолютный вред для холодного оружия = Случайное число от минимального и максимального вреда данного конкретного оружия + Атрибут "Сила" + бонусы. 1. Если повреждения не критические - весь вред уходит в выносливость, а остаток (если выносливости не хватило) - в здоровье. Вред по выносливости = (Текущая Выносливость < Абсолютный вред ) ? Абсолютный вред - Текущая Выносливость : Абсолютный вред. 1. Определяем сколько остатков вреда ушло в здоровье. Остаточный вред = Абсолютный вред - Вред по выносливости. Вред в здоровье = (Остаточный вред > 0) ? Остаточный вред : 0. 1. Отнимаем вред по здоровью от здоровья игрока. Если текущее здоровье меньше, чем отнимаемое - персонаж помер (упокой Господь его душу).
Навык "Стрельба"[]
Ролевая модель в стрельбе участвует в двух этапах:
- Определение угла отклонения для оружия, перед вылетом пули "из ствола".
- Рассчет критического попадания.
- Рассчет нанесенного вреда.
- Выделения опыта.
Расчет углового отклонения[]
При расчете углового отклонения ролевая система пользуется следующими понятиями:
- "Разброс" оружия. Зависят от конкретного оружия. Так например для снайперки этот размер может быть меньше чем у автомата. Таким образом мы реализуем разброс в зависимости от конкретного оружия. Наиточнейшее оружие имеет разброс равный площади цели. Это означает, что на оптимальной дистанции совершенное оружие стреляет ровно в диапазоне размера цели.
- Модификатор разброса. Зависит от навыков и специализаций персонажа. Различен для каждого из видов оружия. Рассчитывается следующим образом:
Модификатор разброса (МР) = (1 + (0.7 - 0.65/20 * Навык "Стрельба") + (0.8 - 0.75/5 * Соответствующая оружию специализация)) * GSDL::FireArm::TargetSize * GSDL::Ammo::Precision_Mod
Далее используются следующие сокращения:
- Начало оптимального расстояния (НОР)
- Максимальное оптимальное расстояние (МОР)
- Максимальная дальность оружия (МДО)
Конец оптимального расстояния (КОР) зависит только от параметра оружия.
Случайным образом определяем направление на данном диапазоне и пускаем симуляцию полета пули.
- Для расчета попадания необходимо определить размеры цели. Предполагается, что в данный момент размер цели = 0.3 метра. Требуется вынос данной характеристики в конфигурационный файл.
Основной механизм расчета вреда[]
Последовательность расчета вреда после успешного повреждения следующая:
- Определяется вероятность нанесения критического удара против избежания крита.
- Определяется количество нанесенного вреда в здоровье (часть нейтрализуется броней и превращается в удар по выносливости) с учетом крита.
В данном навыке использование различных типов оружия отражается лишь на отдельных функциональных блоках общего алгоритма, поэтому различия будут указаны по ходу расчетов.
Определение критического попадания[]
Критические попадания возможны только на оптимальной дистанции! Для разных типов оружия вероятность критического попадания определяется по-разному:
Оружие |
Атрибут 1 |
Атрибут 2 |
Пистолет |
Ловкость * 3 |
Восприятие |
Пистолет-пулеметы |
Ловкость * 2 |
Восприятие * 2 |
Дробовик |
Сила * 2 |
Восприятие * 2 |
Автомат |
Ловкость * 2 |
Восприятие * 2 |
Винтовка |
Ловкость * 2 |
Восприятие * 2 |
Ручной пулемет |
Сила * 3 |
Восприятие * 1 |
1. Определяем вероятность нанесения критических повреждений Вероятность крита = (Атрибут 1 + Атрибут 2) / 4 + Навык "Стрельба"/4 + Специализация * 2 2. Определяем вероятность избегания критических повреждений Вероятность избегания крита = (Атрибут "Ловкость" + Атрибут "Восприятие") / 2 + Навык "Стрельба" / 8 + Специализация 3. Определение нанесения критического удара Мы нанесли критический удар, если случайное число от 1 до 100 меньше или равно (Вероятность крита - Вероятность избегания крита).
Определяется количество нанесенного вреда в здоровье[]
1. Определяем абсолютный вред. Если вред наносится не на оптимальной дистанции: Абсолютный вред = Случайное число от минимального и максимального вреда данного конкретного оружия Если вред наносится на оптимальной дистанции: MIN_DAMAGE = (Максимальный вред оружия в руках у игрока - Минимальный вред оружия) / 2 + Минимальный вред оружия Абсолютный вред = Случайное число от MIN_DAMAGE до максимального вреда конкретного оружия 1. Если повреждения не критические - определяем, сколько абсолютного вреда было преобразовано при помощи брони врага в удар по выносливости. Если повреждения критические, то весь вред уходит в здоровье, выносливость не теряется и армор не учитывается. Компенсация броней = (Класс брони > GSDL::Ammo::Armor_LochProbe) ? Класс брони - GSDL::Ammo::Armor_LochProbe : 0 Вред по выносливости = (Абсолютный вред > Компенсация броней) ? Компенсация броней : Абсолютный вред 1. Определяем сколько остатков вреда ушло в здоровье. Остаточный вред = Абсолютный вред - Вред по выносливости Вред в здоровье = (Остаточный вред > 0) ? Остаточный вред : 0
- Если текущих очков выносливости у игрока меньше чем нанесенный вред, то все что есть нейтрализует сначала остатки выносливости, а остатки идут во вред здоровью.
Начисление опыта по мобу[]
- Начисление опыта в навык или специализацию выполняется сразу после успешного выполнения действия
- Опыт начисляется только если вред был нанесен по мобу
- Начисление опыта за нанесение вреда выполняется следующим образом:
- Определяем разницу между уровнем моба и игрока
- Нормализуем разницу от -4 до 4, если она выходит за эти рамки и прибавляем 4. Таким образом получаем множитель опыта.
- Умножаем множитель опыта на нанесенный вред и получаем начисляемый опыт пропорционально пулу моба
- Округляем начисляемый опыт в меньшую сторону
- Половину начисляемого опыта отправляем в навык и специализацию
- Если навык или специализация повышаются, то остаток опыта переходит в следующий ранг
- Опыт за отлечивание начисляется следующим образом:
- Вычисляем модификатор опыта (МО) = (Макс. кол-во жизни у пациента / Максимальное кол-во очков действий, излечиваемых предметом)
- Нормализуем модификатор опыта (МО) = Если МО больше двух - снижаем до двух
- Начисляемый опыт равен = Количество по факту излеченных очков действия * Модификатор опыта (пропорционально пулу моба)
- Округляем начисляемый опыт в меньшую сторону
- Половину начисляемого опыта отправляем в навык и специализацию
- Если навык или специализация повышаются, то остаток опыта переходит в следующий ранг
- Начисление опыта за нанесение вреда выполняется следующим образом:
Навык "Медицина"[]
- Излечение состоит из одной единственной операции - проверки количества отлеченных ХП и прибавления этого количества как модификатора к опыту.
- Лечение без лечащих предметов (бинты, аптечка и т.п.) невозможно. Возможно пополнение жизни при помощи дорогостоящих средств не требующих навыков.
- У лечилки есть минимальная и максимальная планка отлечения (heal_min, heal_max).
- При увеличении навыка минимальная планка сдвигается от 0 до 100% до максимальной по формуле:
<>o
- Также минимальный и максимальный пороги увеличиваются при помощи специализации следующим образом:
<>o <>o
Пример:
<tbody> </tbody>
Уровень специализации |
Минимальный порог лечения предметом |
Максимальный порог лечения предметом |
Минимум с учетом спецухи |
Максимум с учетом спецухи |
0 |
100 |
200 |
100 |
200 |
1 |
100 |
200 |
120 |
240 |
2 |
100 |
200 |
140 |
280 |
3 |
100 |
200 |
160 |
320 |
4 |
100 |
200 |
180 |
360 |
5 |
100 |
200 |
200 |
400 |
Специализации[]
- Текущее значение специализации (целое число от 0 до 5, стартовое значение = 0 (задается в GSDL, в <a href="https://wiki.vr-ocean/moin.cgi/PlayerTtaits">PlayerTtaits</a>. -1 означает, что специализация выключена)
- Текущее количество очков опыта (unsigned int32, стартовое значение = 0)
- При повышении значения специализации, текущее кол-во очков опыта = (максимальное кол-во очков опыта - текущее кол-во очков опыта).
- Максимальное количество очков опыта до повышения уровня (unsigned int32, стартовое значение = 1250). При превышении данной величины специализация повышается, а максимальное количество пересчитывается по формуле:Максимальное количество очков опыта (МКОО) = 1250 * (2 в степени "соответствующая величина специализации"*3)
<tbody> </tbody>
Текущий уровень специализации |
Сколько нужно набить, чтобы перейти на следующий уровень специализации |
0 |
1250 |
1 |
10000 |
2 |
80000 |
3 |
640000 |
4 |
5120000 |
5 |
40960000 |
- При увеличении специализации, на 1 увеличивается также и ее атрибут, если специализация увеличилась до 3-х.
- При этом любой атрибут (без бонусов от шмота) не должен быть больше 20 и не должен быть больше уровня игрока.
- Специализации берутся с 4-го уровня
Связи специализаций с атрибутами[]
<tbody> </tbody>
Номер |
Увеличивающийся от использования специализации атрибут |
Родительский навык |
Специализация |
1 |
Сила |
Ближний бой |
Рукопашный бой |
2 |
Ловкость |
Ближний бой |
Режущее оружие |
3 |
Восприятие |
Стрельба |
Пистолеты |
4 |
Сила |
Стрельба |
Дробовики |
5 |
Ловкость |
Стрельба |
Автоматы |
6 |
Восприятие |
Стрельба |
Винтовки |
7 |
Сила |
Стрельба |
Ручные пулеметы |
8 |
Ловкость |
Стрельба |
Пистолет-пулемет |
9 |
Ловкость |
Медицина |
Первая помощь |
10 |
Интеллект |
Медицина |
Хирургия |
Стоимость специализаций[]
<tbody> </tbody>
Количество уже взятых специализаций |
Стоимость специализации |
0 |
Бесплатно |
1 |
1000 афро |
2 |
10 голда |
3 |
50 голда |
4 |
100 голда |
5 и более |
200 голда |
Механизм сброса специализации[]
- Технологически сброс специализации работает следующим образом:
- Уменьшается на единицу счетчик выбранных специализаций.
- У сбрасываемой специализации происходит следующее:
- Атрибут, связанный со специализацией уменьшается на текущее значение специализации.
- Текущее значение специализации приравнивается нулю.
- "Текущее количество очков опыта" приравнивается нулю.
- "Максимальное количество очков опыта до повышения уровня" приравнивается стартовому значению (1250).
Уровень персонажа[]
- Как такового уровня персонажа в игре нет (система навыков и специализаций распределяет опыт между ними, не храня опыт централизованно). Однако во многих случаях для определения сложности используется следующее определение: уровень игрока равен максимальному значению навыка.
Очки действия[]
- Как определяется максимальный пул очков действия?
- Максимальный пул очков действия = 50 + (Величина максимального навыка * 5).
Максимальный переносимый вес[]
- Максимально переносимый вес определяется по следующей формуле:
- Максимально переносимый вес = 30 + Атрибут "Сила" * 2
Здоровье персонажа[]
- Количество очков жизни у персонажа = Сила * 4 + Телосложение * 20
- Количество очков выносливости у персонажа = Ловкость * 4 + Телосложение * 20
Регенерация[]
- Регенерация зависит от телосложения. Каждую минуту количество очков жизни увеличивается на значение, равное атрибуту "Телосложение" (в случае если текущее количество очков жизни от 100% до 30% или на 1 (единицу), если кол-во очков жизни от 30% до 1%.
- Процесс регенерации жизни отнимает выносливость. Каждое 1 отрегенерированное очко жизни отнимает 1 очко выносливости.
- Регенерация увеличивает выносливость каждую минуту на 1 очко выносливости.
Восстановление выносливости[]
- Восстановить выносливость можно как при помощи регенерации, так и ускоренно при помощи расходных предметов вроде еды и воды, а также различных транквилизаторов. Восстановление выносливости не требует навыка.
Броня[]
- Принцип работы брони: суммарный класс брони означает то количество вреда, которое попадет не в здоровье, а в стамину. К примеру:
<tbody> </tbody>
Наносимый вред |
Класс брони |
Итоговый вред по здоровью |
Итоговый вред по стамине |
100 |
60 |
40 |
60 |
100 |
120 |
0 |
100 |
100 |
0 |
100 |
0 |
- Как определяется базовая броня персонажа?
- Базовый Класс Брони = (Ловкость * 3 + Восприятие)/2.