Вот потыпался разобраться с работой этого чуда, и вот что вывелЗаголовочный файл MODREACT.H использует 4 локальные переменные.
LVAR_reaction (0) - Значение реакции
LVAR_got_reaction (2) - Устанавливается в 1 при первом запуске макроса GetReaction, и не играет никакой роли, в определении реакции.
LVAR_base_reaction (3) - Стартовая реакции персонажа против игрока, зависит от обоих криттеров от значения их харизм.
LVAR_reaction_level (1) - Возможные уровни реакции: REACTION_LEVEL_ABYSMAL (-4)
REACTION_LEVEL_HORRIBLE (-3)
REACTION_LEVEL_BAD (-2)
REACTION_LEVEL_POOR (-1)
REACTION_LEVEL_NEUTRAL (0)
REACTION_LEVEL_DECENT (1)
REACTION_LEVEL_GOOD (2)
REACTION_LEVEL_GREAT (3)
REACTION_LEVEL_EXCELLENT (4)
Вызов макроса GetReaction;
При запуске происходит установка лок. переменных.
LVAR_reaction: всегда сбрасывается в 0.
Происходит вычисления в переменной LVAR_base_reaction - ((харизма_чуза - харизма_криттера) * 5)
при учете харизм криттеров значения в этой переменной могут быть такими +45...-45, а максимально допустимые +100...-100.
LVAR_got_reaction - устанавливается в 1 для предотвращения повторного анализа (при повторном запуске макроса)базовой реакции в LVAR_base_reaction
.... дальше производится вычисление
Статус Кармы игрока, и ее бонус (value*Karma_Perception)/1000 //в оригинале бонус кармы не учитывается в силу закомментированой строки.
Репутация в текущем городе (value/2)
Проверка реакции на Работорговца. Терпимый -25, Очень Нетерпимый -50, Любящий +25
Проверка влияния перка PERK_Presence (10*level_perk)
Так же учитывается TRAIT_Sex_Appeal, и пол игрока. Противоположный +20, такой-же -20
И статус убийцы детей Childkiller -30
....
После всех вычислений происходит суммирование в LVAR_reaction всех значений.
LVAR_reaction + LVAR_base_reaction + значение с полученными вычислениями
После завершения работы макроса все переменные будут содержать значения полученной реакции,
кроме переменной LVAR_reaction_level, оно равно предыдущему значению (или нулю (NEUTRAL) при первом запуске).
Таким образом в LVAR_reaction_level и LVAR_base_reaction, запоминаются реакции криттера на прошлые действия игрока.
Перед вызовом GetReaction, еще необходимо определить некоторые переменные:
Evil_Critter=False(0)/True(1) - Нпс является плохим персонажем, то есть все негативные значения, пойдут на положительную реакции персонажа.
Slavery_Tolerant - Отношение персонажа к репутации игрока Работорговца. Допустимые значения см. в MODREACT.H
Karma_Perception - процент отражения кармы игрока на реакцию персонажа. Значения: 1...100%
Пример работы GetReaction:
Персонаж: Добрый (Evil_Critter=0)
Харизма персонажа-8, Игрока-6
Karma_Perception = 50%
Имеем Карму 350 (это у нас статус DEFENDER)
Репутация в городе 16 (статус Liked)
Статуса работорговца есть, и персонаж относится к этому не терпимо (SLAVE_INTOLERANT).
Есть TRAIT_Sex_Appeal, и персонаж того же пола, что и игрок.
Получаем:
LVAR_base_reaction = (6-8)*5=(-10)
карма = (350*50)/1000=17
статус DEFENDERа = +5
репутация города = 16/2=8
работорговец = -25
секс = -20
Суммируем: (-10)+17+5+8+(-25)+(-20)=(-25)
Итого:
LVAR_reaction = -25 REACTION_BAD
LVAR_base_reaction = -10 REACTION_POOR
LVAR_reaction_level = -2 REACTION_LEVEL_BAD //если произвести вызов макроса ReactToLevel
Теперь что бы оценить реакцию персонажа в диалогах мы можем:
В самом простом варианте можно использовать значения в LVAR_reaction_level и Макросы проверки (пункт 1 см. ниже)
А чтобы повлиять на реакцию можно использовать Макросы установки реакции (пункт 2).
Можно использовать другой вариант с проверкой значения в LVAR_base_reaction
ее значения таковы:
REACTION_BOTTOM (-100)
REACTION_ABYSMAL (-75)
REACTION_HORRIBLE (-50)
REACTION_BAD (-25)
REACTION_POOR (-10)
REACTION_NEUTRAL (0)
REACTION_DECENT (10)
REACTION_GOOD (25)
REACTION_GREAT (50)
REACTION_EXCELLENT (75)
REACTION_TOP (100)
Влиять на переменную можно также макросами. см. ниже.
Вообще все три переменные LVAR_reaction_level, LVAR_base_reaction, LVAR_reaction(в меньшей степени), взаимосвязаны друг с другом значениями, изменения одной, повлияют на другие переменные.
1. Макросы проверки уровня реакции:
horrible_critter_reaction (local_var(LVAR_reaction_level) <= REACTION_LEVEL_HORRIBLE)
bad_critter_reaction (local_var(LVAR_reaction_level) <= REACTION_LEVEL_BAD)
neutral_critter_reaction (local_var(LVAR_reaction_level) == REACTION_LEVEL_NEUTRAL)
good_critter_reaction (local_var(LVAR_reaction_level) >= REACTION_LEVEL_GOOD)
2. Макросы установки уровня реакции:
set_bad_critter_reaction set_local_var(LVAR_reaction_level, REACTION_LEVEL_BAD);
ReactToLevel
set_neutral_critter_reaction set_local_var(LVAR_reaction_level, REACTION_LEVEL_NEUTRAL);
ReactToLevel
set_good_critter_reaction set_local_var(LVAR_reaction_level, REACTION_LEVEL_GOOD);
ReactToLevel <- здесь будет устанавливаться вара LVAR_reaction_level от значения в LVAR_reaction.
И здесь я толком не понял зачем тут нужен вызов ReactToLevel так как от значения LVAR_reaction будет устанавливаться вара LVAR_reaction_level, а значение то в LVAR_reaction не изменено, возможно здесь ошибка бисовцев и должен стоять вызов макроса LevelToReact, в котором будет уже происходить выравнивание в переменной LVAR_base_reaction от значения LVAR_reaction_level, либо вообще исключить. Вот такие мои соображения.
Что скажите?3. Установка всех реакций на максимальное значение.
TopReact set_local_var(LVAR_base_reaction,REACTION_TOP);
set_local_var(LVAR_reaction_level,REACTION_LEVEL_EXCELLENT)
3.1. Поднять уровень реакции на один уровень в LVAR_reaction_level, и одновременно выравнить базовую реакцию в LVAR_base_reaction
UpReactLevel set_local_var(LVAR_reaction_level,(local_var(LVAR_reaction_level)+1));
if (local_var(LVAR_reaction_level) > REACTION_LEVEL_EXCELLENT) then
set_local_var(LVAR_reaction_level,REACTION_LEVEL_EXCELLENT);
LevelToReact <- здесь будет происходить выравнивание переменной LVAR_base_reaction от
значения LVAR_reaction_level.
4. Установка всех реакций на минимальное значение.
BottomReact set_local_var(LVAR_reaction_level,REACTION_LEVEL_ABYSMAL);
set_local_var(LVAR_base_reaction,REACTION_BOTTOM)
4.1 Опустить уровень реакции на один уровень (LVAR_reaction_level) и одновременно выравнить базовую реакцию в LVAR_base_reaction
DownReactLevel set_local_var(LVAR_reaction_level,(local_var(LVAR_reaction_level)-1));
if (local_var(LVAR_reaction_level) < REACTION_LEVEL_ABYSMAL) then
set_local_var(LVAR_reaction_level,REACTION_LEVEL_ABYSMAL);
LevelToReact
5. Есть еще макрос с помощью которого можно осуществлять регулировку реакции персонажа на определенную величину.
ReactionAdjust(X) set_local_var(LVAR_base_reaction,(local_var(LVAR_base_reaction) + X));
set_local_var(LVAR_reaction,(local_var(LVAR_reaction) + X));
ReactToLevel <- здесь будет устанавливаться вара LVAR_reaction_level от значения в LVAR_reaction.