Форум TeamX
   Home   Members  
Pages: [1] |   Go Down
 
Author Topic: Влияние макросов из MODREACT.h на нпс, игрока  (Read 1243 times)
Fakels
Пользователь
Posts: 337

Модный геймер


Влияние макросов из MODREACT.h на нпс, игрока
« on: 06 May 2008, 23:26:52 »

Обьясните на что влияют макросы MODREACT.h, на диалоги/репутацию/карму игрока.

Просмотрел с десяток скриптов нпс c использованием макроса GetReaction, но так и непонял как происходит дальнешее взаимодействие с диалогами, как меняются диалоги НПСа в зависимости от реакция игрока с которым ведется диалог, ведь в диалогах даже нет провеки на реакцию игрока с нпс'ом.
Были только использованы макросы, изменения реакции BottomReact/TopReact и им подобные, и то не во всех НПС, но что изменяется от этого, кроме произведенных изменений в локальных переменых использованых в modreact.h

зы. У меня сложилость впечитление что разработчики не использовали это должным образом.
« Last Edit: 06 May 2008, 23:28:37 by Fakels »

"Необходимо учесть все условия и тогда - нет проблем"
Jordan
Пользователь
Posts: 416

476228895
Re: Влияние макросов из MODREACT.h на нпс, игрока
« Reply #1 on: 07 May 2008, 12:12:41 »

Я сам пока не разбирался с этими макросами. Но в фоле1 они используются по полной, понижают, повышают репутацию персонажа, вот здесь исходники от первого фола посмотри может пригодится http://jordan631.narod.ru/f1ssl.7z, там нужно изменить гвары как в первом фоле и скомпилить компилятором от фола1 и будут исходники первого фола.

Воспрянет Россия, из праха отцов
Расправятся крылья, миллионов сердец
Поднимут все головы и грудью вздохнут
И громка скажут, что пришли
Мы пришли, со столетней войны
Wasteland Ghost
Администратор
Posts: 869

Маленькое Злое Привидение


Re: Влияние макросов из MODREACT.h на нпс, игрока
« Reply #2 on: 07 May 2008, 17:48:53 »

На самом деле очень малый процент персонажей Фола использует в диалоге такой параметр как "реакция". Хотя вычисляется её значение в скриптах всех (почти) NPC. В качестве примера могу посоветовать поковырять скрипт Линетт (VCLynett), там реакция используется достаточно активно.

PS К репутации реакция отношения не имеет.
« Last Edit: 07 May 2008, 17:50:40 by Wasteland Ghost »
Fakels
Пользователь
Posts: 337

Модный геймер


Re: Влияние макросов из MODREACT.h на нпс, игрока
« Reply #3 on: 24 August 2008, 21:44:27 »

Quote from: Wasteland Ghost on 07 May 2008, 17:48:53
В качестве примера могу посоветовать поковырять скрипт Линетт (VCLynett), там реакция используется достаточно активно.
Не особо, в основном по натыкали установки на разную реакцию, а на проверки как то [censored], только в двух нодах встретил проверку.

Quote
PS К репутации реакция отношения не имеет.
Зато от кармы и репутации в городе, зависит реакция персонажа.
« Last Edit: 24 August 2008, 22:54:17 by Wasteland Ghost »

"Необходимо учесть все условия и тогда - нет проблем"
Fakels
Пользователь
Posts: 337

Модный геймер


Re: Влияние макросов из MODREACT.h на нпс, игрока
« Reply #4 on: 24 August 2008, 21:53:34 »

Вот потыпался разобраться с работой этого чуда, и вот что вывел

Заголовочный файл 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(в меньшей степени), взаимосвязаны друг с другом значениями, изменения одной, повлияют на другие переменные.



Quote
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, либо вообще исключить. Вот такие мои соображения. Что скажите?

Quote
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.
« Last Edit: 24 August 2008, 22:40:20 by Fakels »

"Необходимо учесть все условия и тогда - нет проблем"
Wasteland Ghost
Администратор
Posts: 869

Маленькое Злое Привидение


Re: Влияние макросов из MODREACT.h на нпс, игрока
« Reply #5 on: 24 August 2008, 22:56:02 »

Fakels, достал материться. Не понимаешь по-хорошему будем по-плохому. Получай бан на неделю.
Pages: [1] |   Go Up