Строка 1: |
Строка 1: |
| ← [[Модификации:Индекс|Индекс]] | | ← [[Модификации:Индекс|Индекс]] |
− | {{Переведите}}
| + | |
− | This page explains how the game calculates NPC gift tastes. This is an advanced guide for mod developers.
| + | На этой странице объясняется, как игра вычисляет вкусы подарков NPC. Это расширенное руководство для разработчиков модов. |
| | | |
| ==Данные== | | ==Данные== |
| ===Источник=== | | ===Источник=== |
− | Вкусы подарков NPC хранятся в <tt>Content\Data\NPCGiftTastes.xnb</tt>, which can be [[Modding:Editing XNB files#unpacking|unpacked to edit]]. Here's the raw data as of {{version|1.5.1}} for reference: | + | Вкусы подарков NPC хранятся в <tt>Content\Data\Furniture.xnb</tt>, могут быть [[Модификации:Редактирование_XNB_файлов#Редактирование распакованных данных|извлечены для редактирования]]. Вот исходные данные по состоянию на {{version|1.5.1}} для примера: |
| | | |
− | {{collapse|Data|content=<syntaxhighlight lang="json"> | + | {{collapse|Данные|content=<syntaxhighlight lang="json"> |
| { | | { |
| "Universal_Love": "74 446 797 373 279", | | "Universal_Love": "74 446 797 373 279", |
Строка 51: |
Строка 51: |
| </syntaxhighlight>}} | | </syntaxhighlight>}} |
| | | |
− | ===Format=== | + | ===Формат=== |
− | The file contains two types of data:
| + | Файл содержит два типа данных: |
| | | |
| <ul> | | <ul> |
− | <li>''Universal tastes'' apply to all villagers. Their key is <tt>Universal_''Taste''</tt>, and their value is a space-delimited array of reference IDs ([[Modding:Object data|item ID]] if ≥0, category ID if <0). For example, consider this entry: | + | <li>''Универсальные вкусы'' применяется ко всем жителям. Их ключ - <tt>Universal_''Taste''</tt>, и их значение представляет собой массив ID, разделенных пробелами ([[Модификации:Объекты|ID объектов]] если ≥0, ID категории, если <0). Например, рассмотрим эту запись: |
| | | |
| <syntaxhighlight lang="json"> | | <syntaxhighlight lang="json"> |
Строка 61: |
Строка 61: |
| </syntaxhighlight> | | </syntaxhighlight> |
| | | |
− | This data means villagers should have a universal like for category -2, [[Modding:Object data|item 72]], etc.</li>
| + | Эти данные означают, что жители должны иметь универсальную запись для категории -2, [[Модификации:Объекты|предмет 72]], и т.д.</li> |
| | | |
− | <li>''Personal tastes'' apply to a specific villager. Their key is the villager's internal name (like <tt>Abigail</tt>), and their value alternates dialogue text with a list of reference IDs in this order: love, like, dislike, hate, and neutral. For example, consider Abigail's gift tastes: | + | <li>''Личные вкусы'' обратитесь к конкретному жителю. Их ключ - это внутреннее имя жителя(например, <tt>Abigail</tt>), и их значение чередует текст диалога со списком ID в следующем порядке: Любит, Нравится, Не нравится, Ненавидит и Равнодушна. Например, рассмотрим вкусы подарков Абигейл: |
| | | |
| <syntaxhighlight lang="json"> | | <syntaxhighlight lang="json"> |
Строка 69: |
Строка 69: |
| </syntaxhighlight> | | </syntaxhighlight> |
| | | |
− | By splitting the string with <tt>/</tt> as the delimiter, we can extract this data:
| + | Разделив строку с помощью <tt>/</tt> в качестве разделителя вы можете извлечь эти данные: |
| | | |
| {| class="wikitable" | | {| class="wikitable" |
| |- | | |- |
− | ! index | + | ! Индекс |
− | ! taste | + | ! Вкус |
− | ! reaction dialogue | + | ! Реакция |
− | ! reference IDs | + | ! ID |
| |- | | |- |
| | 0, 1 | | | 0, 1 |
− | | love | + | | Любит |
| | I seriously love this! You're the best, @! | | | I seriously love this! You're the best, @! |
| | 66 128 220 226 276 611 | | | 66 128 220 226 276 611 |
| |- | | |- |
| | 2, 3 | | | 2, 3 |
− | | like | + | | Нравится |
| | Hey, how'd you know I was hungry? This looks delicious! | | | Hey, how'd you know I was hungry? This looks delicious! |
| | ''none'' | | | ''none'' |
| |- | | |- |
| | 4, 5 | | | 4, 5 |
− | | dislike | + | | Не нравится |
| | What am I supposed to do with this? | | | What am I supposed to do with this? |
| | -5 -75 -79 16 245 246 | | | -5 -75 -79 16 245 246 |
| |- | | |- |
| | 6, 7 | | | 6, 7 |
− | | hate | + | | Ненавидит |
| | What were you thinking? This is awful! | | | What were you thinking? This is awful! |
| | 330 | | | 330 |
| |- | | |- |
| | 8, 9 | | | 8, 9 |
− | | neutral | + | | Равнодушна |
| | You brought me a present? Thanks. | | | You brought me a present? Thanks. |
| | ''none'' | | | ''none'' |
| |} | | |} |
| | | |
− | This data means she should personally love item 66 (Amethyst), dislike category -5 (eggs), etc.</li>
| + | Эти данные означают, что она должна любить предмет 66 (Аметист), не любить категорию -5 (яйца), и т.д.</li> |
| </ul> | | </ul> |
| | | |
− | ==How a gift taste is determined== | + | ==Как определяется вкус подарка== |
− | The data format allows tastes to conflict in multiple ways:
| + | Формат данных позволяет вкусам конфликтовать несколькими способами: |
| | | |
− | * between an [[Modding:Object data|item ID]] and category ID; | + | * между ID [[Модификации:Объекты|ID предмета]] и ID категории; |
− | * between a universal taste and personal taste; | + | * между универсальным вкусом и личным вкусом; |
− | * between conflicting values (''e.g.'', Jodi both loves and hates Daffodils (item ID 18) specifically); | + | * между конфликтующими ценностями (''например'', Джоди и любит, и ненавидит Нарциссы (ID предмета 18) в частности); |
− | * and any combination of the above (''e.g.'', between a universal item ID and personal category ID). | + | * и любая комбинация из вышеперечисленного ("например", между универсальным ID предмета и ID категории). |
| | | |
− | The game uses a rather complicated algorithm to determine how much an NPC likes an gift (see <tt>NPC::getGiftTasteForThisItem</tt>). Here's a cleaned up version of the algorithm in pseudocode:
| + | В игре используется довольно сложный алгоритм для определения того, насколько NPC нравится подарок (смотри <tt>NPC::getGiftTasteForThisItem</tt>). Вот очищенная версия алгоритма в псевдокоде: |
| | | |
| <pre> | | <pre> |
Строка 122: |
Строка 122: |
| bool HAS_UNIVERSAL_NEUTRAL_ID = false | | bool HAS_UNIVERSAL_NEUTRAL_ID = false |
| | | |
− | // part I: universal taste by category | + | // часть I: универсальный вкус по категориям |
| if category is universally loved: | | if category is universally loved: |
| TASTE = love | | TASTE = love |
Строка 132: |
Строка 132: |
| TASTE = dislike | | TASTE = dislike |
| | | |
− | // part II: universal taste by item ID | + | // часть II: универсальный вкус по ID предмета |
| if itemID is universally loved: | | if itemID is universally loved: |
| TASTE = love | | TASTE = love |
Строка 150: |
Строка 150: |
| HAS_UNIVERSAL_NEUTRAL_ID = true | | HAS_UNIVERSAL_NEUTRAL_ID = true |
| | | |
− | // part III: override neutral if it's from universal category | + | // часть III: переопределите нейтральный, если он из универсальной категории |
| if TASTE is neutral and not HAS_UNIVERSAL_NEUTRAL_ID: | | if TASTE is neutral and not HAS_UNIVERSAL_NEUTRAL_ID: |
| if item is edible but tastes bad (-300 > edibility < 0): | | if item is edible but tastes bad (-300 > edibility < 0): |
Строка 157: |
Строка 157: |
| TASTE = dislike | | TASTE = dislike |
| | | |
− | // part IV: sometimes override with personal tastes | + | // часть IV: иногда преобладают личные вкусы |
| if ((npc loves itemID OR (item has a category AND npc loves category)) AND (item has no category OR npc doesn't personally love category OR no universal taste for itemID) | | if ((npc loves itemID OR (item has a category AND npc loves category)) AND (item has no category OR npc doesn't personally love category OR no universal taste for itemID) |
| return love | | return love |
Строка 169: |
Строка 169: |
| return neutral | | return neutral |
| | | |
− | // part V: return taste if not overridden | + | // часть V: верните вкус, если не отменено |
| return TASTE | | return TASTE |
| </pre> | | </pre> |