Перейти к содержанию

Мод: Fallout 2 Mechanics Mini Rework. Переделка части геймплейных механик


DeKRuS

Рекомендуемые сообщения

Ссылка на тему NMA

Актуальная версия теперь будет тут: Ссылки на GitHub(Мультиязычная) и  Яндекс.Диск(Русская версия) (версия 1.98.4 от 02.06.2024)

 

Части мода влияющие на боевую составляющую игры зависят от настроек сложности боя в самой игре. Чем ниже уровень сложности тем реже и/или слабее действуют на игрока негативные эффекты.

 

Альтернативный режим стрельбы
Этот модуль добавляет Лазерному, Плазменному и Гаусс оружию альтернативный режим стрельбы.
- Альтернативный режим стрельбы активируется прицельным выстрелом в тело.

- В ".ini" файле можно включить режим, при котором каждый выстрел будет вызвать срабатывание эффекта альтернативной атаки.

- НПЦ также способны применять альтернативный режим стрельбы.

 

 

Лазерное оружие: гифка 700кб

Spoiler

LASER_SLOW.gif?raw=true


- Лазерное оружие наносит урон от оружия(+перки и критические эффекты) всем существам на линии между стрелком и целью.
- Альтернативный выстрел потребляет (2 + 1 * количество дополнительных целей) заряда батарей в магазине лазерного оружия.
- Максимальное количество дополнительных целей настраивается в .ini файле.
- Альтернативный режим увеличивает пробивание брони (все защиты целей от лазера умножаются на 0.5)
- Шанс попадания и вероятность критического удара рассчитывается отдельно для каждой цели.

 

Импульсное оружие: гифка 5100кб

Spoiler

PULSE-CHAIN.gif

 

- Импульсное и ЭМИ-оружие дальнего боя наносит урон от оружия (+ перки и критические эффекты) по «цепи» из основной цели и 2х ближайших существ.
- Максимальное расстояние между целями и максимальное количество дополнительных целей настраиваются в файле «F2MechanicsMiniRework.ini».
- Альтернативный режим стрельбы потребляет 3 единцы заряда оружия.
- Шанс критического попадания рассчитывается отдельно для каждой цели.

 

Гаусс оружие: гифка 1.84мб

Spoiler

GAUSS.gif?raw=true


- Гаусс оружие наносит урон от оружия (+ перки и критические эффекты) всем существам на линии выстрела.
- Максимальное количество дополнительных целей зависит от урона атакующего, силы снижения урона за каждую цель(настраивается в ini. файле) и показателей защиты у целей на линии.
- Шанс попадания и вероятность критического удара рассчитывается отдельно для каждой цели.

 

Плазменное оружие: гифка 700кб

Spoiler

PLASMA.gif?raw=true


- Плазменное оружие наносит урон от оружия (+ перки и критические эффекты) всем существам в радиусе вокруг основной цели.
- Радиус плазменного взрыва настраивается в .ini файле.
- Урон зависит от расстояния до главной цели. Чем больше дистанция тем меньше урон. (настраивается в .ini файле)
- Альтернативный выстрел потребляет 3 заряда батарей в магазине плазменного оружия.
- Вероятность критического удара рассчитывается отдельно для каждой цели.

 

Пистолеты и ПП: гифка 1200кб

Спойлер

PISTOLS_SMGS.gif?raw=true

- Неэнергетические пистолеты и пистолеты-пулеметы позволяют сделать два одиночных выстрела в тело одной и той же цели за стоимость одного прицельного выстрела.
- Первый выстрел (прицельный выстрел в тело) требует стандартной стоимости ОД, но потребляет на 1 ОД меньше, что позволяет вам сделать второй (неприцельный) выстрел по той же цели за 1 ОД.
- Вероятность попадания вторым выстрелом уменьшена на (15 + Wpn STR req * 3), но не может быть ниже 1/3 от первоначального шанса попадания.
- Использование инвентаря/смена оружия/использование предметов/перемещение/перезарядка/стрельба по другой цели прерывает применение способности.

 

Дробовики: гифка 250 кб

Спойлер

SHOTGUN.gif?raw=true

 

- Прицельный выстрел в тело отбрасывает врагов и может сбить их с ног.
- Воздействует на цели ближе, чем 10 гексов / половина максимальной дальности оружия.
- Тяжелые существа, такие как супермутанты/роботы/когти смерти/гигантские скорпионы, отбрасываются на меньшее расстояние и с меньшей вероятностью будут сбиты с ног.
 

Мод на Книги навыков добавлено в версии 1.90-1.91
Позволяет применять книги навыков на спутников для повышения их навыков, а также позволяет менять количество бонусных очков навыка и количество повышаемых навыков при прочтении книг.
(Совместим с F2, F2 EcCo, F1.5:Resurrection, Nevada, Sonora:Продавец книг в Фениксе, Et_Tu)

 

- Теперь книги навыков могут примерятся к разумным спутникам, для повышения соответствующих навыков. Бонус от прочтения книг сохраняется при повышении уровня спутника.
- Оригинальную формулу получения бонуса к навыку(и его максимальное значение) от прочтения книги можно как увеличить, так и изменить на фиксированное значение.
- Книги могут повышать до 2х навыков сразу, если прописать новый навык в "books.ini". Все книги стандартные книги и любые прописанные в "books.ini" работают с модом.
- Перк "Понимание" теперь повышает не только количество получаемых очков при чтении, но и максимально доступный уровень навыка для чтения.
- Мод работает и с уникальными книгами (Книга советов Fallout II, Nevada: Книга "Homo Ludens",Пособие по нейрохирургии)

Дополнительные настройки которые можно включить отдельно
- Книги можно читать в слух, навык будет увеличиваться у игрока и тому кому он читает книгу, или же у всей группы сразу в зависимости от выбранной опции.
- Наличие перка "Понимание" у игрока работает и у спутников.
- Можно разрешить читать книги и получать бонус от них неразумным спутникам на подобии собак и браминов.
- Для Fallout: Sonora. Если вы установите «FixedSkillInc» и «FixedSkill2Inc» на 0 или меньше, то прирост навыков будет соответствовать описанию книг (+4/+2).

 

Пример того как изменить книгу «Оружие и боеприпасы» используя "books.ini" в sfall, чтобы при чтении повышались навыки "Лёгкое оружие" и "Тяжёлое оружие".

Спойлер


#если файл "books.ini" отсутствует в папке с игрой, то его можно скачать от сюда (https://gitflic.ru/project/fakelshub/sfall/blob?file=config_files%2Fbooks.ini) или ещё от куда 
# Дальше смотрим на пример ниже. Для изменения оригинальных книг "overrideVanilla=" в "books.ini" может быть любым, если установлен мой мод.
# "count" в "books.ini" должен быть равен количеству изменённых и/или добавленных книг
# В квадратных скобках указать [1] порядковый номер новой/изменённой книги начиная с числа "1", порядок изменения/добавления книги, значения не имеет.

------- Начало примера---------
[1]
; book item PID («Оружие и боеприпасы» PID = 102, Большая научная книга = 73, Учебник первой помощи = 80, Настольная книга скаута=86,Электроника Дина=76, Химические журналы(только для Ф2 и 1.5) = 237), для других книг придётся гуглить
PID=102
; textID from proto.msg which displayed when reading book(«Оружие и боеприпасы» TextID = 805, Большая научная книга = 802, Учебник первой помощи = 804, Настольная книга скаута=806,Электроника Дина=803, Химические журналы(только для Ф2 и 1.5)=802)
TextID=805
; corresponding skill (номер навыка идёт по порядку сверху вниз начиная с Лёгкого оружия = 0, Тяжёлое оружие = 1, Энергетического оружие = 2, закачивая навыком натуралиста = 17)
; Skill=0 будет повышать "Лёгкое оружие" на величину установленную в "FixedSkillInc"
Skill=0
; Skill2 Добавляется только этим модом, и работает только с ним. 
; Skill2=1 будет повышать "Тяжёлое оружие" на величину установленную в "FixedSkill2Inc"
Skill2=1
------- конец примера---------

 

 

Прицельные промахи:

- Для попадания в глаза и пах теперь необходимо чтобы цель была повернута к атакующему лицом. Попадания прицельным выстрелом по глазам когда цель стоит к атакующему спиной будут всегда превращаться в попадания в голову, тоже самое происходит если цель лежит лицом в пол. Вместо паха выстрелы и удары со спины или "задних" боков будут попадать в тело или в одну из ног. ( У некоторых существ попасть в пах можно только со спины или задних боков - кентавры/собаки/брамины и др.)

- Промахи при прицельных атаках с вероятностью равной "шанс попадания в часть тела / 19" (т.е. максимум 5%) могут превратиться в попадание в соседнюю часть тела. (промах по глазам может стать попаданием в голову)

- Попадания в голову при условии что цель повернута лицом к атакующему могут привести к попаданию в глаза.

- Положение частей тела(и соответственно возможность прицельного попадания в них) меняется в зависимости от анимации цели (лежит лицом в небо/пол, валяется на боку, и.т.д.)

- При промахе есть вероятность попадания в случайную цель на пути пули/метательного оружия. 

 

Фиолетовым контуром выделены новые возможные цели, если выстрел не попадет в первоначальную цель (под красным прицелом).

 

Misstohit.jpg

 

 

- Для НПЦ увеличен шанс применения прицельных выстрелов до ~25% от всех одиночных атак.

- Существа мелкого размера (муравьи, богомолы, мелкие скорпионы) имеют больший шанс попасть по ногам и практически не могут попасть в голову. Но если цель лежит на полу, то шанс попадания в голову многократно увеличивается.

 

Резать или Колоть:

- Добавлена опция для изменения эффекта при атаке ножом в зависимости от анимации атаки (резать/колоть), работает как у игрока, так и у НПЦ:

1. Ножи:
    - Режущая атака:
      - Имеет увеличенный шанс попадания и зависит от ловкости цели и навыков ближнего боя атакующего.
      -  По слабо бронированным целям режущая атака с большей вероятностью нанесет максимальный урон, а не минимальный.
    - Колющая атака:
      - Пробивает часть сопротивления урону (DR) и порога урона (DT) цели в зависимости от показателей максимального урона ножа и бонусного урона в ближнем бою атакующего.
      - Увеличивает базовый шанс критического удара в 1,5 раза.

2. Кувалды, дубинки, погонялки для скота:
    - Взмах:
      - Больше не отбрасывают существ при попадании и имеют шанс сбить с ног в зависимости от нанесенного урона.
    - Толчок:
      - Имеет увеличенную дальность атаки.
      - Наносит до 40% больше урона целям, которые прижаты к другому объекту (например, стенам, существам или пейзажу) и не могут быть отброшены дальше, или если они ударяются об объект во время «скольжения».

 

Повреждение конечностей от урона взрывом:

- Полученный урон от гранат (включая плазменные, а для роботов также ЕМП ), гранатомётов и прочего оружие взрывного действия, если он превышает 10% от текущих!  очков здоровья может привести к повреждению рук/ног, поражению глаз. (Вероятность настраивается в ini файле и зависит также от некоторых показателей S.P.E.C.I.A.L. цели).

 

Изменение Яда  (Требуется выставить SpeedInterfaceCounterAnims = 2" в ddraw.ini):

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

- Урон от яда наносится в конце каждого хода отравленного существа в бою или каждые 5 секунд вне боевого режима.
- Урон от яда зависит от максимального здоровья существа, от уровня накопленного яда и может быть настроен в .ini файле.
- Если яда накопится больше 100 ед. наступает мгновенная смерть, может быть настроено/отключено в .ini файле.

- Хвосты рад скорпионов можно использовать для нанесения яда на колющее и режущее оружие игрока и компаньонов (со временем яд в хвосте заканчивается).

- Все НПЦ и компаньоны во время боя способны самостоятельно наносить яд на своё оружие, если у них в сумке есть хвосты радскорпиона. ( Шанс применения зависит от интеллекта и навыка натуралист у НПЦ).
- Все отравленные НПЦ и компаньоны как в бою, так и вне боя способны самостоятельно принимать антидот или применять стимуляторы/аптечки для сохранения своей жизни.
- С каждым применением на оружие в активной руке накладывается бафф яда(либо на не активную, если в активной нет подходящего оружия), который стакается до 10 зарядов (отображаются как перки в панели персонажа с указанием названия отравленного оружия), чем больше зарядов тем сильнее отравление, каждая успешная атака с вероятностью 33% может потратить 1 заряд яда с оружия, также заряды постепенно убывают если убрать отравленное оружие из рук(в сумку/ продать/потерять). Метательное оружие: отравляется вся пачка, можно не боятся выкинуть единственный отравленный нож.

- Добавлен перк "Консервация яда" доступный с 6 уровня и требующий науку 50+ либо навык натуралиста выше 70.
Перк увеличивает количество максимально наносимого яда на оружие и количество применений ядовитой железы радскорпиона. Уменьшает шанс потерять стаки яда при атаке отравленным оружием и скорость потери стаков яда пока оружие не активно. Добавляет отравление при стрельбе боеприпасами для инъектора.

 

Восстановление здоровья:

(Требуется выставить SpeedInterfaceCounterAnims = 2" и "AllowUnsafeScripting = 1 или 2" в ddraw.ini)

Заменяет мгновенное лечение стимулятором на постепенное восстановление здоровья

- Если разогнать "скорость восстановления"(Healing_rate, HR) выше 5, то здоровье начнет постепенно восстанавливаться каждый ход в бою и каждые 5 сек вне боя.

- Стимуляторы мгновенно восстанавливают  2-4 ед. здоровья и на 15 секунд (3 хода в бою) увеличивают скорость восстановления на 20 ед., в конце своего действия снижая скорость восстановления на 30 ед. на 1 игровую минуту.

- Наличие трейта "Ускоренный метаболизм" увеличивает эффективность лечения и значительно снижает штрафы накладываемые стимулятором и суперстимулятором.

- Количество восстанавливаемого здоровья зависит от максимального здоровья и величины скорости восстановления. (настраивается в .ini)

- Суперстимулятор мгновенно восстанавливает до 60 hp, при этом временно уменьшая  "скорость восстановления" в зависимости от фактически восстановленного hp. Если количество лечения превышает доступную "скорость восстановления", то через минуту СС наносит урон. Урон от последействия СС теперь зависит от количества фактически восстановленного здоровья и доступной на момент его применения "скорости восстановления". (если СС применен к существу без повреждений или с очень высокой "скоростью восстановления" и низкими повреждениями, то урон наносится не будет.)
-Также в файле настроек добавлена возможность включения лечения сломанных конечностей(как игроку, так и НПЦ) при помощи Суперстимулятора, при этом увеличивая штраф к  "скорости восстановления", а следовательно и возможный урон от последействия, и немного снижая количество восстанавливаемых ХП, в зависимости от количества и вида травм. (по умолчанию данная возможность отключена)

-Некоторые монстры имеют пассивную регенерацию (ванаминго/кентавры, можно отключить в ini файле). 

-Регенерация монстров как и лечение от стимулятора может временно снижаться или полностью прекратиться  при получении достаточного количества "ожогов"  от огненного или плазменного оружия. Эти "ожоги" действуют как на игрока, так и на НПЦ. (перк "Пироман" защищает от "ожога" при нанесении урона самому себе(гранаты, молотов) и увеличивает силу снижения регенерации у врагов. Состояние "ожога" проходит со временем.

- Добавлен бонусный перк "Регенерация", который автоматически добавляется игроку, если базовая "скорость восстановления" будет больше 5, позволяющий с шансом, зависящим от "скорости восстановления", исцелять травмы конечностей при тиках лечения, как в бою так и вне боя.

 

Всплывающие цифры урона от яда и лечения стимуляторами могут быть отключены в файле настроек

 


scr00003.png

 

 

Скрытность:
Убрана случайность из навыка скрытности, теперь зона обнаружения постепенно уменьшается с ростом уровня навыка игрока и зависит как от значения восприятия врагов, так и других факторов (например общего уровня освещения карты).
 
Обнаружение скрытности: (Желательно выставить "DontTurnOffSneakIfYouRun=1" в ddraw.ini во избежание конфликтов с подсветкой НПЦ на клавишу "Shift")
 
Цветовая индикация обнаружения скрытности работает для оригинальной и новой механики скрытности.
Пока крадущийся игрок находится в пределах видимости NPC, контур этого NPC будет выделен:
-        Зеленый          - Игрок не обнаружен, можно безопасно приближаться к NPC.
-         Желтый           - Игрок не обнаружен, но будет, если приблизится на 4 гекса.
-      Оранжевым       - Игрок не обнаружен, но будет, если приблизится на 1 гекс.
-    Ярко Красным     - Игрок обнаружен.
-   Темно Красным    -(при включённом моде на навык Кражи)  Игрок обнаружен, но НПЦ не заметит попытку кражи у своего союзника.
-          Серым            - (Туман войны в HRP от Mash отключён) Игрок не обнаружен, так как скрыт от НПЦ стеной или другим объектом блокирующим линию обзора.
 

Sneak-Detection.jpg

 
 
Карманная кража:
Оригинальная механика карманной кражи не учитывала восприятие цели, а также вероятность неудачи не зависела от навыка Кражи у игрока и была всегда одинакова как для 85% (а иногда и меньших значений), так и для 300%.
И еще одной неприятной особенностью оригинальной механики карманных краж было начало боя с участием каждого жителя города, когда карманная кража не удалась.
Данный мод создан для исправления влияния навыка у персонажа игрока на успех кражи и добавления возможности воровать предметы из рук НПЦ 
 
Спойлер

steal-chance-show.gif

 

 
Основные моменты:
- Отображения шанса успешной кражи) при наведении на предмет. При нажатии правой кнопкой по предмету с 0% шансом успеха отображает необходимый минимальный уровень навыка для совершения кражи
- В случае неудачи кражи вместо начала боя будет воспроизведена одна из "сценок" и наложен временный штраф на продажу, покупку и проверку навыков красноречия в диалогах.
- Штрафы будут постепенно уменьшаться и исчезать, если игрок в течение недели не был пойман на карманной краже в этом городе или не посещал его долгое время.
- Жертвы неудачной кражи или попытки заглянуть в карман будут пару дней помнить, что игрок уже пытался у них украсть, и в следующий раз их реакция будет жестче.
 
- Расчет вероятности успеха аналогичен исходной формуле с добавлением зависимости от восприятия цели и навыка кражи игрока.
- Если навык кражи развит более 140%, то за каждые 10 очков сверху максимальный шанс успешной кражи увеличивается на 1% (0,1% за 1 очко) до максимума в 99%.
- Когда навык превышает 160 + (текущее восприятие цели х 5) становится возможным воровать оружие и предметы из рук NPC. (уровень минимального навыка настраивается в .ini)
- Чтобы заглянуть в карман цели, вам нужно соответствовать минимальным требованиям к навыку.
- В случае неудачной попытки использовать навык кражи, цель может стать враждебной, наличие перка "Безобидный" значительно снижает этот шанс.
 
Отрицательные Модификаторы, повышающие требования к навыку и снижающие шанс успешной карманной кражи:
- Игрок стоит перед лицом цели.
- Игрок находится перед лицом ближайших союзников цели и виден им.
Отрицательные Модификаторы, уменьшающие шанс успешной карманной кражи:
- Вес и размер предмета (если не взят перк "Карманник")
- Количество предметов, украденных подряд.
 
Положительные Модификаторы, снижающие требования к навыкам и повышающие шанс успешной карманной кражи:
- Режим скрытности. Бонус зависит от уровня навыка скрытности + значительное увеличение бонуса, если цель не видит игрока.
- Условия слабой освещенности (пещеры, подвалы, ночь и т.п.) чем темнее тем проще заглянуть в карман.
  (С поправкой на наличие перка "Ночное видение")
- Цель без сознания/ослеплена (бонус зависит от тяжести состояния).
 
Дополнительно включаемые настройки:
- Первая попытка украсть всегда будет 100%, если вы достигли минимально необходимого навыка кражи. (обходной путь для уменьшения количества сохранений/загрузок)
- Последующие попытки, во избежание злоупотребления опытом за кражу, будут рассчитываться по формуле.
- Усложнение кражи предметов в зависимости от их стоимости, чем дороже, тем сложнее.
- Повышение сложности воровства у торговцев.
 
Аптечки, сумки доктора и парамедика:
- Использование навыка «Первая помощь» и навыка «Доктор» голыми руками без предметов не изменилось. (не конфликтует с ребалансом «Первой помощи» и  «Доктора» из FO2tweaks). 
- Аптечка и сумка доктора сохранили свои прежние бонусы к навыкам (+20% и +40% для улучшенных версий).
- Убран элемент случайности в количестве использований медицинских инструментов, теперь аптечки и сумка врача имеют индикатор оставшихся материалов. Аптечку можно использовать 5 раз, пока она не истощится, сумку врача 3 раза. Улучшенные версии (фельдшерская сумка и аптечка) можно использовать до 10 раз.
- Убран дневной лимит на использование медицинских инструментов. Количество использований ограничено только остатком в аптечке/сумке доктора.
- Каждое использование медицинских инструментов гарантированно восстанавливает некоторое количество здоровья, начиная от минимально возможного (проваленная проверка навыка) до среднего и максимального значений (успешная проверка навыка).
- Перк "Целитель" добавляет дополнительно 4-10 (2-5 для Follout et tu) здоровья к лечению за уровень способности.
- Исцеление не дает очков XP, но даётся 50 очков опыта за вылеченную конечность.
- Эффективность лечения ограничена 300% для обоих типов медицинских инструментов.
 
Аптечки:
- Можно использовать во время боя. Также ими могут пользоваться NPC и компаньоны. (зависит от интеллекта, тяжести травм и навыка первой помощи)
- Применение стоит 2 ОД.
- Эффективность лечения простой аптечки становится равна эффективности оригинального стимулятора (12-20 хп) при  ~80-90% навыке первой помощи.
 
Докторский саквояж и сумка парамедика:
- Можно использовать во время боя держа в активной руке и если уровень навыка доктора 50% или выше. Также ими могут пользоваться NPC и компаньоны, если их конечности травмированы. (зависит от интеллекта и навыка Доктора)
- Базовая стоимость 6 ОД. Стоимость снижается по мере роста навыка. ( 5 ОД при 100%, 4 ОД при 150% и так далее до 2 ОД при 250% навыке). 
- Эффективность лечения за ОД/навык выше, чем у аптечек. Количество исцеления также зависит от максимального здоровья и тяжести полученных травм.
- Шанс излечить травму рассчитывается для каждой конечности отдельно и ограничен 100% (80% навыка Доктора + 20% бонуса от саквояжа или 60% навыка + 40% бонуса сумки фельдшера).
 

Вопросы из первого сообщения

 

У меня появилась куча проблем и вопросов которые я надеюсь решить с вашей помощью:

  • 1. Исходная формула отравления все еще работает, её можно отключить или даже лучше переписать? (У меня были устаревшие headers (точнее вообще их не было) переделал старое поведение яда через hook_adjustpoison. Спасибо товарищу Сталину!
  • Можно ли сделать мой первый скрипт не используя hook_Combatturn? ( осознал что не надо)
  • 3. Существует ли аналог dude_obj для кричей? в первом скрипте через hook_combat turn, аналог это нулевой get_sfall_arg. Как можно выделить всех кричей с уровнем яда не переписывая все их прото id в ручную? 
  • 4. Можно ли уменьшить длительность медикаментов ниже 1 игровой минуты(12 ходов)? любые дробные значения в duration_time не приводят к результату. Можно, но пока нет hook скрипта, лучше так не делать. Ссылка на комментарий с описанием метода.
  • 5. Максимальный для всех существ  уровень скорости восстановления(Healing_rate) 30, минимальный 0, опытным путем я установил что истинные значения всё ж на месте. можно иметь отрицательный уровень и также больше 30, но на результат моих формул это не влияет.(set_stat_max,set_stat_min)
  • 6.Можно ли как-то отложить срабатывание скрипта после загрузки сейва? К примеру нужно чтобы процедура map_enter_p_proc срабатывала через энное количество (секунд/фреймов/тиков) загрузки карты? ( В процедуре  map_enter_p_proc сделал вызов другой процедуры через "call {procedure} in {delay};"

Спасибо за то что дочитали!

 

Изменено пользователем DeKRuS
Заголовок
Ссылка на комментарий

Приветствуем.

В EcCo есть ограничение на использование стимпаков, по умолчанию 2 стимпака, остальные требуют од на применение. 

Урон от яда - можно прописать в прошках (или убрать его).  Попутал с противоядием.

Думаю, что возможно за основу взять скрипт алкоголя... get_drunk

Кричи? Вы про Critters?

А так, ждите гуру. 

Скачивайте F2tools, там редакторы скриптов, прото-файлов итд... см. путеводитель.

Fallout 2Путеводитель по модам | FAQ | Перевод модов | Путеводитель по RP

Fallout Tactics: Путеводитель по модам | FAQ

База Данных: YD\YD\MF

Цитата: "Помогая другим, не забывай о себе..."

Ссылка на комментарий
1. Исходная формула отравления все еще работает, её можно отключить или даже лучше переписать? (может HOOK скрипт какой есть для этого? ( у меня в SFall Script Editor таких вариантов я не нашёл)

 

2. Можно ли сделать мой первый скрипт не используя hook_Combatturn? ( у меня выходило так что урон от яда проходил бесконечное число раз во время хода, пока весь яд не выветрится, но 1 раз за ход я смог сделать только через хук)

 

3. Существует ли аналог dude_obj для кричей? в первом скрипте через hook_combat turn, аналог это нулевой get_sfall_arg. Как можно выделить всех кричей с уровнем яда не переписывая все их прото id в ручную?

 

4. Можно ли уменьшить длительность медикаментов ниже 1 игровой минуты(12 ходов)? любые дробные значения в duration_time не приводят к результату

 

5. Максимальный для всех существ уровень скорости восстановления(Healing_rate) 30, минимальный 0, опытным путем я установил что истинные значения всё ж на месте. можно иметь отрицательный уровень и также больше 30, но на результат моих формул это не влияет.

 

6.Можно ли как-то отложить срабатывание скрипта после загрузки сейва? При малом количестве здоровья и наличии отравления приходится загружаться по несколько раз, пока не прокнет удача)

1. SFall Script Editor не обновляесться поэтому там пока ничего из последнего нет.

посмотри в документации в sfall там добавлялись крючки для яда и радиации. (давно добавлял и уже непомню что с помошью их можно делать).

 

2. Наверное нельзя.

 

3. Через массивы. Создаешь массив криттеров карты и проходишь по каждому (читай мануал по массивам).

 

4. Вроде нет, посмотри крючки для наркоты (если такие есть, непомню). если нет то нужно добавлять новый механизм / крючек.

 

5. -?

 

6. ваще непонял. делай проверку на загрузку.

 

Урон от яда - можно прописать в прошках (или убрать его).

не вводи в заблуждение.

Ссылка на комментарий

Скрипты конечно в стиле Foxx Ltd. стайл - нихрена не читаемо (не понятно).

 

2 скрипта можно объеденить в один, но это уже следующий уровень мастерсва, пока качайся на крысах)))

Ссылка на комментарий

Скрипты конечно в стиле Foxx Ltd. стайл - нихрена не читаемо (не понятно).

 

2 скрипта можно объеденить в один, но это уже следующий уровень мастерсва, пока качайся на крысах)))

Спасибо за рабочие советы! Правда меня даже крысы побили... и скриптов стало уже три, но благодаря докам из архива с нормальной версией "Script editor"а я всё ж смог запихнуть всё в один работоспособный файл) 

Подскажи, пожалуйста, как скрипты сделать более читаемыми? есть какие-то общепринятые стандарты их написания? или там просто нужно везде комментарии оставлять? 

 

И ещё по 6 вопросу, может так будет чуть понятнее, а то в первый раз  я там фигню написал:

6.Можно ли как-то отложить срабатывание скрипта после загрузки сейва? К примеру нужно чтобы процедура map_enter_p_proc срабатывала через энное количество (секунд/фреймов/тиков) загрузки карты?

Ссылка на комментарий

Подскажи, пожалуйста, как скрипты сделать более читаемыми? есть какие-то общепринятые стандарты их написания? или там просто нужно везде комментарии оставлять?

вместо тупых/голых цифр им даются определения с именами со смыслом.

например

#define  PoisonLowLevel    10

и вместо значения 10 в скрипте, по имени определения уже понятно о чем идет речь.

переменным тоже даются смысловые имена а не lvar01

 

6. нельзя отложить выполнение map_enter_p_proc, запуск отложенных действий нужно делать через таймерные события (если тебе это надо для боя, то это проблематично, так как тики в реалтайме не идут в бое).

если надо то есть функция up_time (непомню точно название) - тики которой идут нон-стоп (в реалтайме).

 

ps: читать конфиги get_ini_setting лучше один раз в переменную при загрузке/старте скрипта, а не каждый раз при вычислении, это повысит производительность скрипта, т.к. доступ к значению в файле не кэшируется.

Ссылка на комментарий

вместо тупых/голых цифр им даются определения с именами со смыслом.

например

#define  PoisonLowLevel    10

и вместо значения 10 в скрипте, по имени определения уже понятно о чем идет речь.

переменным тоже даются смысловые имена а не lvar01

 

6. нельзя отложить выполнение map_enter_p_proc, запуск отложенных действий нужно делать через таймерные события (если тебе это надо для боя, то это проблематично, так как тики в реалтайме не идут в бое).

если надо то есть функция up_time (непомню точно название) - тики которой идут нон-стоп (в реалтайме).

 

ps: читать конфиги get_ini_setting лучше один раз в переменную при загрузке/старте скрипта, а не каждый раз при вычислении, это повысит производительность скрипта, т.к. доступ к значению в файле не кэшируется.

Ещё раз спасибо за все ответы и помощь в целом! 

Я тут переписал и обновил скрипт в первом сообщении, чтобы он стал понятнее и мне указали на новые ошибки)

 

 

procedure start;
procedure poisonInRealTime;
procedure regenInRealTime;
procedure ModInTurnBased;
procedure Poisdmg;
procedure map_enter_p_proc;
 
#define max_hp  7
#define current_hp  35
#define healing_rate  14
#define luck  6
#define PoisonHighLevel  100
#define PoisonDeadlyLevel  149
 
 
 
 
Variable
         RegenTickHP,
         critter,
         PoisonTickDmg;
 
 
 
procedure start begin
   if (game_loaded) then begin
      register_hook_proc(27, ModInTurnBased);
      register_hook_proc(44, Poisdmg);
      call map_enter_p_proc();
   end
      set_global_script_type(0);
      set_global_script_repeat(360);
      call poisonInRealTime;
      call regenInRealTime();
end
 
procedure poisonInRealTime begin
   variable PoisonMod:= get_ini_setting("dek.ini|MAIN|PoisonMod");
   variable ShowModMSG := get_ini_setting("dek.ini|MAIN|ShowMSG");
   variable PoisonMaxHPpercentMult := get_ini_setting("dek.ini|Poison|PoisonMaxHPpercentMult");
   variable PoisonLevelMult := get_ini_setting("dek.ini|Poison|PoisonLevelMult");
   variable PoisonLevelDiv := get_ini_setting("dek.ini|Poison|PoisonLevelDiv");
   variable PoisonDecayDiv := get_ini_setting("dek.ini|Poison|PoisonDecayDiv");
   foreach (critter in list_as_array(0)) begin
      if Poisonmod != 0 and get_game_mode == 0 andAlso get_poison(Critter) > 0 andAlso (random(1, 10) > random(1, get_critter_stat(Critter, luck))) then begin
         if (PoisonMaxHPpercentMult < 1) then begin PoisonMaxHPpercentMult := 1; end
         PoisonTickDmg := round(get_critter_stat(critter, max_hp) / 100.00000 * PoisonMaxHPpercentMult * (get_poison(critter) * PoisonLevelMult / PoisonLevelDiv));
            if (PoisonTickDmg < 1) then begin PoisonTickDmg := random(0, 1); end
         critter_heal(critter, -PoisonTickDmg);
         poison(critter, -(1 + (PoisonTickDmg * 10 / PoisonDecayDiv)));
 
         if ShowModMSG != 0 andAlso PoisonTickDmg > 0 and critter == dude_obj then begin
            display_msg("Вы получаете " + PoisonTickDmg + " ед. урона от рт ядмод.");
         end
         if ShowModMSG != 0 andAlso PoisonTickDmg > 0 and critter != dude_obj then begin
            display_msg(critter + " получает " + PoisonTickDmg + " ед. урона от рт ядмод.");
         end
 
      end
   end
end
 
procedure regenInRealTime begin
   variable RegenMod := get_ini_setting("dek.ini|MAIN|RegenMod");
   variable ShowModMSG := get_ini_setting("dek.ini|MAIN|ShowMSG");
   variable RegenMaxHPpercentMult := get_ini_setting("dek.ini|MAIN|RegenMaxHPpercentMult");
   variable HealingRateMult := ("dek.ini|Regeneration|HealingRateMult");
   variable HealingRateDiv := ("dek.ini|Regeneration|HealingRateDiv");
   foreach (critter in list_as_array(0)) begin
      if RegenMod != 0 andAlso get_game_mode == 0  andAlso get_critter_stat(critter, healing_rate) > 5 andAlso get_critter_stat(critter, current_hp) < get_critter_stat(critter, max_hp) then begin
         if (RegenMaxHPpercentMult < 1) then begin RegenMaxHPpercentMult := 1; end
         RegenTickHP := round(get_critter_stat(critter, max_hp) / 100.00000 * RegenMaxHPpercentMult * (get_critter_stat(critter, healing_rate) * HealingRateMult / HealingRateDiv));
            if (RegenTickHP < 1) then begin RegenTickHP := 1; end
         critter_heal(critter, RegenTickHP);
       if ShowModMSG != 0 and critter == dude_obj then begin
         display_msg("Вы восстанавливаете " + RegenTickHP + " РТ ед. здоровья.");
       end
       else begin
         display_msg(critter +" восстанавливает " + RegenTickHP + " РТ ед. здоровья.");
       end
      end
   end
end
 
 
 
procedure ModInTurnBased begin
   variable CritterTurnStatus := get_sfall_arg;
   variable Critter := get_sfall_arg;
   variable RegenMod := get_ini_setting("dek.ini|MAIN|RegenMod");
   variable RegenMaxHPpercentMult := get_ini_setting("dek.ini|MAIN|RegenMaxHPpercentMult");
   variable HealingRateMult := ("dek.ini|Regeneration|HealingRateMult");
   variable HealingRateDiv := ("dek.ini|Regeneration|HealingRateDiv");
   variable PoisonMod:= get_ini_setting("dek.ini|MAIN|PoisonMod");
   variable PoisonMaxHPpercentMult := get_ini_setting("dek.ini|Poison|PoisonMaxHPpercentMult");
   variable PoisonLevelMult := get_ini_setting("dek.ini|Poison|PoisonLevelMult");
   variable PoisonLevelDiv := get_ini_setting("dek.ini|Poison|PoisonLevelDiv");
   variable PoisonDecayDiv := get_ini_setting("dek.ini|Poison|PoisonDecayDiv");
   variable ShowModMSG := get_ini_setting("dek.ini|MAIN|ShowMSG");
   if RegenMod != 0 then begin
      if (RegenMaxHPpercentMult < 1) then begin RegenMaxHPpercentMult := 1; end
      RegenTickHP := round(get_critter_stat(Critter, max_hp) / 100.00000 * RegenMaxHPpercentMult * (get_critter_stat(Critter, healing_rate) * HealingRateMult / HealingRateDiv));
      if (RegenTickHP < 1) then begin RegenTickHP := 1; end
      if (((CritterTurnStatus == 0) andAlso (get_critter_stat(Critter, healing_rate) > 5)) andAlso (get_critter_stat(Critter, current_hp) < get_critter_stat(Critter, max_hp))) then begin
      critter_heal(Critter, RegenTickHP);
      if Critter == dude_obj andAlso ShowModMSG != 0 then begin
         display_msg("Вы восстанавливаете " + RegenTickHP + " ТБ ед. здоровья.");
      end
      if Critter != dude_obj andAlso ShowModMSG != 0 then begin
         display_msg(obj_name(Critter) + " восстанавивает " + RegenTickHP + " ТБ ед. здоровья");
      end
      end
      PoisonTickDmg := round(get_critter_stat(Critter, max_hp) / 100.00000 * PoisonMaxHPpercentMult * (get_poison(Critter) * PoisonLevelMult / PoisonLevelDiv));
      if (PoisonTickDmg < 1) then begin PoisonTickDmg := random(0, 1); end
      if PoisonMod != 0 andAlso CritterTurnStatus == 0 andAlso CritterTurnStatus != -2 andAlso CritterTurnStatus != -1 andAlso (get_poison(Critter) > 0) andAlso (random(1, 10) > random(1, get_critter_stat(Critter, 6))) then begin
         critter_heal(Critter, -PoisonTickDmg);
         if PoisonTickDmg > 0 andAlso Critter == dude_obj andAlso ShowModMSG != 0 then begin
            display_msg("Вы получаете " + PoisonTickDmg + " ед. урона от турн ядмод.");
         end
         if PoisonTickDmg > 0 andAlso Critter != dude_obj andAlso ShowModMSG != 0 then begin
            display_msg(obj_name(Critter) + " получает " + PoisonTickDmg + " ед. урона от турн ядмод.");
         end
         poison(Critter, -(1 + (PoisonTickDmg * 10 / PoisonDecayDiv)));
      end
   end
end
 
procedure Poisdmg begin
   variable OriginalPoisonDecay := 0;
   variable OriginalPoisonDMG := 0;
   variable PoisonEcxessLevel := 0;
   variable PoisonMod:= get_ini_setting("dek.ini|MAIN|PoisonMod");
   variable PoisonMaxHPpercentMult := get_ini_setting("dek.ini|Poison|PoisonMaxHPpercentMult");
   variable PoisonLevelMult := get_ini_setting("dek.ini|Poison|PoisonLevelMult");
   variable PoisonLevelDiv := get_ini_setting("dek.ini|Poison|PoisonLevelDiv");
   variable PoisonDecayDiv := get_ini_setting("dek.ini|Poison|PoisonDecayDiv");
   variable ShowModMSG := get_ini_setting("dek.ini|MAIN|ShowMSG");
   Critter := get_sfall_arg;
   originalPoisonDecay := get_sfall_arg;
   originalPoisonDMG := get_sfall_arg;
   if PoisonMod != 0 then begin
      if get_poison(critter) >= PoisonDeadlyLevel then begin
         critter_heal(Critter,- (get_critter_stat(Critter, max_hp) * 10));
         display_msg(" Высокий уровень яда в крови ." + critter + " приводит к мгновенной смерти");
      end
      if (PoisonMaxHPpercentMult < 1) then begin PoisonMaxHPpercentMult := 1; end
      if  originalPoisonDMG < 0 then begin
         while get_poison(Critter) > 0 andAlso get_poison(Critter) < PoisonHighLevel andAlso not(combat_is_initialized) do begin
            PoisonTickDmg := round(get_critter_stat(Critter, max_hp) / 100.00000 * PoisonMaxHPpercentMult * get_poison(Critter) * PoisonLevelMult / PoisonLevelDiv);
            if (PoisonTickDmg < 1) then begin
               PoisonTickDmg := random(0, 1);
            end
            critter_heal(Critter, -PoisonTickDmg);
            poison(Critter, -(1 + (PoisonTickDmg * 10 / PoisonDecayDiv)));
            if PoisonTickDmg > 0 andAlso ShowModMSG != 0 andAlso Critter == dude_obj then begin
               display_msg("Вы получаете " + PoisonTickDmg + " ед. урона от ориг ядмод.");
            end
            if PoisonTickDmg > 0 andAlso ShowModMSG != 0 andAlso Critter != dude_obj then begin
               display_msg(Critter + " получает " + PoisonTickDmg + " ед. урона от ориг ядмод.");
            end
         end
      end
      end
         if get_poison(Critter) >= PoisonHighLevel then begin
            PoisonEcxessLevel := (get_poison(Critter) - PoisonHighLevel);
            poison(Critter, - (1 + PoisonEcxessLevel));
            PoisonTickDmg := round((get_critter_stat(Critter, max_hp) / 100.00000 * PoisonMaxHPpercentMult * (PoisonEcxessLevel * PoisonLevelMult / PoisonLevelDiv)));
            if (PoisonTickDmg < 0) then begin PoisonTickDmg := random(0, 1); end
            critter_heal(Critter, -PoisonTickDmg);
            if ShowModMSG != 1 andAlso PoisonTickDmg > 0 andAlso Critter == dude_obj then begin
               display_msg("Вы получаете " + PoisonTickDmg + " ед. урона от ориг ядмод.");
            end
            if ShowModMSG != 1 andAlso PoisonTickDmg > 0 andAlso Critter != dude_obj then begin
               display_msg(Critter + " получает " + PoisonTickDmg + " ед. урона от  оригядмод.");
            end
   end
end
 
procedure map_enter_p_proc begin
   Variable RegenMod := get_ini_setting("dek.ini|MAIN|RegenMod");
   if RegenMod != 0 then begin
      set_proto_data(40, 36, -2);
      set_proto_data(40, 40, 35);
      set_proto_data(40, 44, 14);
      set_proto_data(40, 48, 1);
      set_proto_data(40, 52, 6);
      set_proto_data(40, 56, 6);
      set_proto_data(40, 60, 1);
      set_proto_data(40, 64, 0);
      set_proto_data(40, 68, 0);
      set_proto_data(40, 72, -8);
      set_proto_data(40, 76, 60);
      set_proto_data(40, 80, 0);
      set_proto_data(40, 84, 0);
      set_proto_data(40, 88, 2);
      set_proto_data(144, 36, 35);
      set_proto_data(144, 40, 14);
      set_proto_data(144, 44, -1);
      set_proto_data(144, 48, 60);
      set_proto_data(144, 52, -50);
      set_proto_data(144, 56, 0);
      set_proto_data(144, 60, 1);
      set_proto_data(144, 64, -7);
      set_proto_data(144, 68, 10);
      set_proto_data(144, 72, 0);
      set_proto_data(144, 76, 1440);
      set_proto_data(144, 80, 0);
      set_proto_data(144, 84, 40);
      set_proto_data(144, 88, 0);
      set_proto_data(273, 36, -2);
      set_proto_data(273, 40, 35);
      set_proto_data(273, 44, 1);
      set_proto_data(273, 48, 2);
      set_proto_data(273, 52, 4);
      set_proto_data(273, 56, -1);
      set_proto_data(273, 60, 1);
      set_proto_data(273, 64, 3);
      set_proto_data(273, 68, 5);
      set_proto_data(273, 72, 0);
      set_proto_data(273, 76, 2);
      set_proto_data(273, 80, 2);
      set_proto_data(273, 84, 4);
      set_proto_data(273, 88, 1);
      set_proto_data(16777458, 232, get_ini_setting("dek.ini|CRITTER|WAHR"));
      set_proto_data(16777459, 232, get_ini_setting("dek.ini|CRITTER|TWAHR"));
      set_proto_data(16777570, 232, get_ini_setting("dek.ini|CRITTER|WAQHR"));
      set_proto_data(16777464, 232, get_ini_setting("dek.ini|CRITTER|CENHR"));
      set_proto_data(16777465, 232, get_ini_setting("dek.ini|CRITTER|MCENHR"));
   end
end

 

 

 

По поводу отложенного запуска. Я попробовал сделать его через вызов другой процедуры с помощью "call {procedure} in {delay};" внутри map_enter_p_proc, и оно сработало прям так как я и хотел! Почти( 

Вызывая с задержкой процедуру в которой есть массив (криттеров который - (0), с другими пока не проверял) получаю ничего, но та часть процедуры которой не нужен массив и никак с ним не связанная, выполняется как нужно - через {delay} секунд.  

 

foreach (critter in list_as_array(0)) begin

if get_poison(critter) > 0 then begin

чё-то делается должно;

end

 

если вместо critter поставить указание на конкретное существо (dude_obj к примеру) то "call in delay" работает прекрасно. я не до конца понял как работают массивы, может он тут временный и успевает удалиться если им сразу не воспользоваться?

 

И еще такой вопрос, а можно ли как-то экспортировать Lvar'ы(точнее их значение) из одной процедуры внутри скрипта в другую, для того чтобы get_ini_setting писалось 1 раз за весь скрипт? или это никакой оптимизации не даст? и может можно свои макросы написать? а то у меня куча раз повторяются одни и те же строчки, просто в разны хук_проках

Ссылка на комментарий

может он тут временный и успевает удалиться если им сразу не воспользоваться?

c call delay там не все так гладко, да массив мог удалиться. делай его сразу постоянным (только удалить не забудь а то так и будет размножаться).

или сделать процедуру critical (модификатор)

или так пометить кусок кода

start critical

...

end critical

 

глобальные переменные скрипта доступны из любого места этого же скипта.

кроме локальных которые непосредственно в процедуре объявляются.

 

делай макросы если хочешь.

Ссылка на комментарий

Зафиксировав массивы "Call in delay" сработал, но там потом полезли другие проблемы, правда get_game_mod помог. Но позже я решил свой вопрос иначе, просто разместил вызов процедур  сверху в низ в том порядке который мне был изначально нужен, до этого момента я считал что вызываются они все разом, а не по порядку :fool:

Хотелось бы еще пару вопросов задать)

- может есть какой аналог hs_cartravel только для пеших прогулок, который будет постоянно запускаться при движении по глобалу?
- По оптимизации, в доках пишут что если скрипт повторяется слишком часто, то это значит что делаешь что-то не так. на сколько страшен set_global_script_repeat(300)?

P.S. для интересующихся обновил инфу и скрипт в первом сообщении темы.

 

Ссылка на комментарий

300 не страшно. "страшно" 1-50.

 

может есть какой аналог hs_cartravel

вроде нету. делается обычный глобальный скрипт для глобальной карты (работает на глобальной карте) и контролируется время, когда игрок движется по карте время игры тикает.

Ссылка на комментарий

у меня возникли проблемы с "set_unique_id" и хочется узнать пару моментов:

Намбер ван: возможно ли и если да, то каким образом  сделать  "unset_unique_id" предмета зная его новый уникальный id? 

      unic_wp := set_unique_id(critter_inven_obj2(user, INVEN_TYPE_LEFT_HAND));
      unset_unique_id(obj_pid(unic_wp));
типа такого, но чтобы работало)
 
Намба тво: можно ли по уникальному id узнать оригинальные данные протофайла ну или хоть какието оригинальные данные предмета? get_proto_data возвращает -1 по всем оффсетам, proto_data - крашит игру, а OBJ_DATA_* (кроме OBJ_DATA_ID) дают 0.
 
и ласт ван: если уникальный предмет остался последним(в инвентаре) то он теряет свою уникальность и вновь начинает стакаться с предметами того же типа( предмет остался последним, но был в руке, то уникальность сохраняется), можно ли как-то с этим побороться?
Ссылка на комментарий

у меня возникли проблемы с "set_unique_id" и хочется узнать пару моментов:

Намбер ван: возможно ли и если да, то каким образом  сделать  "unset_unique_id" предмета зная его новый уникальный id? 

      unic_wp := set_unique_id(critter_inven_obj2(user, INVEN_TYPE_LEFT_HAND));
      unset_unique_id(obj_pid(unic_wp));
типа такого, но чтобы работало)
 
Намба тво: можно ли по уникальному id узнать оригинальные данные протофайла ну или хоть какието оригинальные данные предмета? get_proto_data возвращает -1 по всем оффсетам, proto_data - крашит игру, а OBJ_DATA_* (кроме OBJ_DATA_ID) дают 0.
 
и ласт ван: если уникальный предмет остался последним(в инвентаре) то он теряет свою уникальность и вновь начинает стакаться с предметами того же типа( предмет остался последним, но был в руке, то уникальность сохраняется), можно ли как-то с этим побороться?

 

1. нельзя так сделать.

2. ничего нельзя узнать по uID.

 

3. тут непонятно. что значит остался один? - уникальный предмет вообще неможет стакаться с другими уник. предметами.

Ссылка на комментарий

Для чего тебе set_unique_id/unset_unique_id?

 

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


добавлено через 35 сек.

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

Я тебя огорчу но яд действует только на/для Игрока. Уровень яда у других криттеров/напарников не обрабатывается движком игры никак! и его даже нельзя установить для них, движок игнорирует это.

Или ты там свою скриптовую механику обработки яда своял?

Ссылка на комментарий

Для чего тебе set_unique_id/unset_unique_id?

По началу я сделал так: при нанесении яда на оружие оно получало уникальный ИД (что бы не стакалось с другими), это позволяло только уникальному оружию отравлять врагов(а не как у меня сейчас - любому оружию с тем же именем протофайла, что и отравленное оружие) и яд мог быть нансён только на одно оружие единовременно(+ если противник подбирал такое оружие от теперь тоже мог при ударе травить игрока), проблема была в том что я не смог снять уникальность с  оружия которое уже не в руках и не в сумке (метательное/выбили из рук/продано).

 

хвост я сделал юзабельным через вот такое вот:

set_proto_data(tail, PROTO_IT_FLAGS, (get_proto_data(tail, PROTO_IT_FLAGS) + 2048));

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

set_proto_data(tail, PROTO_IT_FLAGS, 2048));?

 

И каким ты образом сделал отравление оружия? через перки?

Да, через фейковые перки. В первом сообщении я добавил скриншот, там можно увидеть, что  "заряды яда на оружии" это на самом деле уровни фейкового перка( с названием отравленного оружия), который может выдаваться как игроку так и криттерам, после  использования хвоста радскорпа.

вот этот скрин

20.png

 

 

суть моего костыля такова: если оружие в руке имеет анимацию ножа, копья, вакидзаси или это шипованный кастет то выдаётся фейковый перк, тому кто заюзал хвост, через

set_fake_perk_npc с при вязкой к имени протофайла оружия proto_data( left/right Hand, it_name)

Пока оружие с нужным именем(или как я сначала сделал с уникальным ID) в INVEN_TYPE_LEFT/RIGHT_HAND, то яд уменьшается только при нанесении урона в бою оружием с тем же именем что и у перка, а если такого оружия нет в руках, то перк постепенно уменьшается с течением времени( для этого постоянно приходится юзать set_fake_perk_npc внутри которого через has_fake_perk_npc получаю значение уровня перка на данный момент и уменьшаю это значение на 1)

а само отравление накладывается просто через HOOK_COMBATDAMAGE(нужен только атакующий и цель) если у атакующего есть перк и он использует оружие с подходящим именем, только тогда цель отравится через команду poison(target, уровень перка + рандом(1,3). 

Я тебя огорчу но яд действует только на/для Игрока. Уровень яда у других криттеров/напарников не обрабатывается движком игры никак! и его даже нельзя установить для них, движок игнорирует это.

И да и нет! яд действительно полностью работает только на игрока, криттеры никогда не получают урон и не уменьшают свой уровень яда со временем.  но! также оригинальный яд и hook_adjustpoison триггерятся у  криттеров   если они увеличивают свой уровень яда(к примеру в бою с радскорпионами и при применеии шприца с ядом), а также если был применён poison(critter, любое "+" / "-"значение).

но одного крючка на яд мало. поэтому ....

 

Или ты там свою скриптовую механику обработки яда своял?

в итоге я сделал для пошага, риалтайма  и  применении доктора/первой помощи свою механику яда, а для перемещения по глобалу\отдыху использовал крючок для оригинального яда.

Ссылка на комментарий

3. тут непонятно. что значит остался один? - уникальный предмет вообще неможет стакаться с другими уник. предметами.

к примеру: даю метательному ножу в правой руке уникальный ID, при этом в сумке лежит еще несколько штук. выкидываю все ножи (и из сумки и уникальный из рук), поднимаю. Всё как надо 1 нож не стакается с другими. 

но если выкинуть все ножи из сумки, а уникальный убрать из рук в сумку и начать поднимать не уникальные ножи(с пола или с окна лута из трупа), то теперь все ножи начинают стакаться. уникальный нож "теряет" свою уникальность.

 

1. нельзя так сделать.

2. ничего нельзя узнать по uID.

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

Только вот не знаю как снять уникальность у предмета который не в руках и не в инвентаре криттера.

Ссылка на комментарий

но если выкинуть все ножи из сумки, а уникальный убрать из рук в сумку и начать поднимать не уникальные ножи(с пола или с окна лута из трупа), то теперь все ножи начинают стакаться. уникальный нож "теряет" свою уникальность.

 

 

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

Только вот не знаю как снять уникальность у предмета который не в руках и не в инвентаре криттера.

Тогда это баг, посмотрю что-там с движком почему стакает.

 

Пока ты не вышел с карты, и знаешь указатель на предмет то можно снимать, в любом удобном месте.

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

Указатель на предмет теряется (становится не действителен) как только покидаешь карту.

 

Ты мне сегодня задал мозговой штурм, весь день думал как сделать чтобы предметы с уникальным ид стакались и не теряли свой ид. Ничего не придумал.

Ссылка на комментарий

Скрипты конечно в стиле Foxx Ltd. стайл - нихрена не читаемо (не понятно).

Ты в своё время меня подтолкнул писать скрипты самому, хотя я упорно сопротивлялся.

Какой учитель, такой и ученик  :gum:  :)

Ссылка на комментарий

Ты самоучка)

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

Первые уроки, ты мне давал, как раз по декомпилированым скриптам, на них я и подсел. Потом я пошёл править первую часть (никто ей не занимался) и это очень сильно пригодилось. Вся моя демо-версия Шакала (надо-бы альфу выпустить), так и делалась.

Ссылка на комментарий

С первой то понято, исходников то нет.

Я на неё тогда переключился и исходники (с HEADERS) сейчас плохо понимаю, мне проще декомпилировать скрипт и проверить, плюс твой sFallScriptEditor идеально диалоги подхватывает. Или он с исходниками тоже работает? Я не мог такого достичь.

Ссылка на комментарий

Или он с исходниками тоже работает? Я не мог такого достичь.

и так и так работает. Но редактору с не декомпилированными скриптами сложнее разбор кода делать.

вообще я диалоги вот так смотрю https://yadi.sk/i/mlnBa2EC2sZTWA (очень большая картинка)

Ссылка на комментарий

и так и так работает.

Я до сих пор не могу справится (при декомпиляции) с такой фигнёй //NOOP//

Ты мне раньше писал, что старым компилятором можно сделать, не работает.

Ссылка на комментарий

//NOOP// Ты мне раньше писал, что старым компилятором можно сделать, не работает.

совсем старым под дос. если в скрипте нет sfall функций.

или руками это все можно выправить.

Ссылка на комментарий

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйте новый аккаунт в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...