diff --git a/.gitignore b/.gitignore index d64a764..93714f6 100644 --- a/.gitignore +++ b/.gitignore @@ -174,3 +174,4 @@ cython_debug/ TEST* TEST*/ +/docs/.vs diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..4b6c42e --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,50 @@ +{ + "cSpell.words": [ + "Аард", + "автосохранение", + "бафф", + "Бьянко", + "взаимоисключают", + "вопроизведения", + "Гвинт", + "дебафф", + "заспавнить", + "Игни", + "Ирден", + "катсцена", + "катсцену", + "катсцены", + "Каэр", + "Квестовые", + "квестовых", + "кооэффициэнт", + "Корво", + "маунтере", + "Морхен", + "прогрузки", + "респаун", + "саундбанки", + "сhunk", + "сomplexity", + "чанки", + "Aard", + "affeted", + "Blackscreen", + "Deact", + "Despawn", + "dont", + "Gwint", + "Igni", + "lxgdark", + "mappin", + "Minigame", + "playgo", + "QMFT", + "QSCSM", + "questeblocks", + "respawn", + "spawnset", + "spawnsets", + "Yrden" + ] +} \ No newline at end of file diff --git a/VERSION b/VERSION index 7d2ed7c..cd57a8b 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.1.4 +2.1.5 diff --git a/docs/assets/images/unnoficial_docs/base/dlc/add_dlc_quest_structure.webp b/docs/assets/images/unnoficial_docs/base/dlc/add_dlc_quest_structure.webp new file mode 100644 index 0000000..e2b6520 Binary files /dev/null and b/docs/assets/images/unnoficial_docs/base/dlc/add_dlc_quest_structure.webp differ diff --git a/docs/assets/images/unnoficial_docs/base/dlc/create_dlc_quest.webp b/docs/assets/images/unnoficial_docs/base/dlc/create_dlc_quest.webp new file mode 100644 index 0000000..f6f20f7 Binary files /dev/null and b/docs/assets/images/unnoficial_docs/base/dlc/create_dlc_quest.webp differ diff --git a/docs/assets/images/unnoficial_docs/base/dlc/set_quest_dlc_definition.webp b/docs/assets/images/unnoficial_docs/base/dlc/set_quest_dlc_definition.webp new file mode 100644 index 0000000..e9f8c0c Binary files /dev/null and b/docs/assets/images/unnoficial_docs/base/dlc/set_quest_dlc_definition.webp differ diff --git a/docs/assets/images/unnoficial_docs/references/quests/generale_quest.webp b/docs/assets/images/unnoficial_docs/references/quests/generale_quest.webp new file mode 100644 index 0000000..1c2b7e9 Binary files /dev/null and b/docs/assets/images/unnoficial_docs/references/quests/generale_quest.webp differ diff --git a/docs/assets/images/unnoficial_docs/references/quests/quest_cyclic_structure.webp b/docs/assets/images/unnoficial_docs/references/quests/quest_cyclic_structure.webp new file mode 100644 index 0000000..6c6f29f Binary files /dev/null and b/docs/assets/images/unnoficial_docs/references/quests/quest_cyclic_structure.webp differ diff --git a/docs/assets/images/unnoficial_docs/references/quests/quest_debug.webp b/docs/assets/images/unnoficial_docs/references/quests/quest_debug.webp new file mode 100644 index 0000000..53efd8c Binary files /dev/null and b/docs/assets/images/unnoficial_docs/references/quests/quest_debug.webp differ diff --git a/docs/assets/images/unnoficial_docs/references/quests/quest_debug_dlc77_phase.webp b/docs/assets/images/unnoficial_docs/references/quests/quest_debug_dlc77_phase.webp new file mode 100644 index 0000000..808a7fe Binary files /dev/null and b/docs/assets/images/unnoficial_docs/references/quests/quest_debug_dlc77_phase.webp differ diff --git a/docs/assets/images/unnoficial_docs/references/quests/quest_debug_sample.webp b/docs/assets/images/unnoficial_docs/references/quests/quest_debug_sample.webp new file mode 100644 index 0000000..7964615 Binary files /dev/null and b/docs/assets/images/unnoficial_docs/references/quests/quest_debug_sample.webp differ diff --git a/docs/assets/images/unnoficial_docs/references/quests/quest_editor_connect.webp b/docs/assets/images/unnoficial_docs/references/quests/quest_editor_connect.webp new file mode 100644 index 0000000..4fafda9 Binary files /dev/null and b/docs/assets/images/unnoficial_docs/references/quests/quest_editor_connect.webp differ diff --git a/docs/assets/images/unnoficial_docs/references/quests/quest_editor_navigate.webp b/docs/assets/images/unnoficial_docs/references/quests/quest_editor_navigate.webp new file mode 100644 index 0000000..0c15205 Binary files /dev/null and b/docs/assets/images/unnoficial_docs/references/quests/quest_editor_navigate.webp differ diff --git a/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/camera_node1.webp b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/camera_node1.webp new file mode 100644 index 0000000..534f297 Binary files /dev/null and b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/camera_node1.webp differ diff --git a/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/camera_node2.webp b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/camera_node2.webp new file mode 100644 index 0000000..c59d1e3 Binary files /dev/null and b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/camera_node2.webp differ diff --git a/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/camera_node3.webp b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/camera_node3.webp new file mode 100644 index 0000000..8d8646e Binary files /dev/null and b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/camera_node3.webp differ diff --git a/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/camera_node4.webp b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/camera_node4.webp new file mode 100644 index 0000000..a19ebdc Binary files /dev/null and b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/camera_node4.webp differ diff --git a/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/flow_node1.webp b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/flow_node1.webp new file mode 100644 index 0000000..4df4eeb Binary files /dev/null and b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/flow_node1.webp differ diff --git a/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/flow_node2.webp b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/flow_node2.webp new file mode 100644 index 0000000..57d45dd Binary files /dev/null and b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/flow_node2.webp differ diff --git a/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/flow_node3.webp b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/flow_node3.webp new file mode 100644 index 0000000..8e8433c Binary files /dev/null and b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/flow_node3.webp differ diff --git a/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/flow_node4.webp b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/flow_node4.webp new file mode 100644 index 0000000..e219f3e Binary files /dev/null and b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/flow_node4.webp differ diff --git a/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/game_control_node1.webp b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/game_control_node1.webp new file mode 100644 index 0000000..5a3add7 Binary files /dev/null and b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/game_control_node1.webp differ diff --git a/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/game_control_node2.webp b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/game_control_node2.webp new file mode 100644 index 0000000..61e07c7 Binary files /dev/null and b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/game_control_node2.webp differ diff --git a/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/game_control_node3.webp b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/game_control_node3.webp new file mode 100644 index 0000000..7ab59f6 Binary files /dev/null and b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/game_control_node3.webp differ diff --git a/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/game_control_node4.webp b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/game_control_node4.webp new file mode 100644 index 0000000..3e48189 Binary files /dev/null and b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/game_control_node4.webp differ diff --git a/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/game_control_node5.webp b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/game_control_node5.webp new file mode 100644 index 0000000..8e27dd5 Binary files /dev/null and b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/game_control_node5.webp differ diff --git a/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/game_control_node6.webp b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/game_control_node6.webp new file mode 100644 index 0000000..46cc223 Binary files /dev/null and b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/game_control_node6.webp differ diff --git a/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/game_control_node7.webp b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/game_control_node7.webp new file mode 100644 index 0000000..424adb4 Binary files /dev/null and b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/game_control_node7.webp differ diff --git a/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/game_control_node8.webp b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/game_control_node8.webp new file mode 100644 index 0000000..2a9212f Binary files /dev/null and b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/game_control_node8.webp differ diff --git a/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/game_control_node9.webp b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/game_control_node9.webp new file mode 100644 index 0000000..2b8c6f6 Binary files /dev/null and b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/game_control_node9.webp differ diff --git a/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/gameplay_node1.webp b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/gameplay_node1.webp new file mode 100644 index 0000000..7aa2557 Binary files /dev/null and b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/gameplay_node1.webp differ diff --git a/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/gameplay_node10.webp b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/gameplay_node10.webp new file mode 100644 index 0000000..283866e Binary files /dev/null and b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/gameplay_node10.webp differ diff --git a/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/gameplay_node11.webp b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/gameplay_node11.webp new file mode 100644 index 0000000..c21512b Binary files /dev/null and b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/gameplay_node11.webp differ diff --git a/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/gameplay_node12.webp b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/gameplay_node12.webp new file mode 100644 index 0000000..73831a1 Binary files /dev/null and b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/gameplay_node12.webp differ diff --git a/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/gameplay_node13.webp b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/gameplay_node13.webp new file mode 100644 index 0000000..e1cc5ec Binary files /dev/null and b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/gameplay_node13.webp differ diff --git a/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/gameplay_node14.webp b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/gameplay_node14.webp new file mode 100644 index 0000000..f61f2d9 Binary files /dev/null and b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/gameplay_node14.webp differ diff --git a/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/gameplay_node2.webp b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/gameplay_node2.webp new file mode 100644 index 0000000..bde3d11 Binary files /dev/null and b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/gameplay_node2.webp differ diff --git a/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/gameplay_node3.webp b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/gameplay_node3.webp new file mode 100644 index 0000000..9f1e836 Binary files /dev/null and b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/gameplay_node3.webp differ diff --git a/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/gameplay_node4.webp b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/gameplay_node4.webp new file mode 100644 index 0000000..0d1504f Binary files /dev/null and b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/gameplay_node4.webp differ diff --git a/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/gameplay_node5.webp b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/gameplay_node5.webp new file mode 100644 index 0000000..6ab8f5a Binary files /dev/null and b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/gameplay_node5.webp differ diff --git a/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/gameplay_node6.webp b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/gameplay_node6.webp new file mode 100644 index 0000000..c44affd Binary files /dev/null and b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/gameplay_node6.webp differ diff --git a/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/gameplay_node7.webp b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/gameplay_node7.webp new file mode 100644 index 0000000..ed2b221 Binary files /dev/null and b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/gameplay_node7.webp differ diff --git a/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/gameplay_node8.webp b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/gameplay_node8.webp new file mode 100644 index 0000000..5ca723a Binary files /dev/null and b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/gameplay_node8.webp differ diff --git a/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/gameplay_node9.webp b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/gameplay_node9.webp new file mode 100644 index 0000000..870b4d8 Binary files /dev/null and b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/gameplay_node9.webp differ diff --git a/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/helper_node1.webp b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/helper_node1.webp new file mode 100644 index 0000000..f14bb66 Binary files /dev/null and b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/helper_node1.webp differ diff --git a/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/helper_node2.webp b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/helper_node2.webp new file mode 100644 index 0000000..ddf8aec Binary files /dev/null and b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/helper_node2.webp differ diff --git a/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/journal_node1.webp b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/journal_node1.webp new file mode 100644 index 0000000..0d85557 Binary files /dev/null and b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/journal_node1.webp differ diff --git a/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/journal_node2.webp b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/journal_node2.webp new file mode 100644 index 0000000..9acbd33 Binary files /dev/null and b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/journal_node2.webp differ diff --git a/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/journal_node3.webp b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/journal_node3.webp new file mode 100644 index 0000000..ba5d055 Binary files /dev/null and b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/journal_node3.webp differ diff --git a/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/journal_node4.webp b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/journal_node4.webp new file mode 100644 index 0000000..b2901f4 Binary files /dev/null and b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/journal_node4.webp differ diff --git a/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/journal_node5.webp b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/journal_node5.webp new file mode 100644 index 0000000..8e9d8f0 Binary files /dev/null and b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/journal_node5.webp differ diff --git a/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/journal_node6.webp b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/journal_node6.webp new file mode 100644 index 0000000..0412dff Binary files /dev/null and b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/journal_node6.webp differ diff --git a/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/logical_node1.webp b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/logical_node1.webp new file mode 100644 index 0000000..48db6af Binary files /dev/null and b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/logical_node1.webp differ diff --git a/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/logical_node2.webp b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/logical_node2.webp new file mode 100644 index 0000000..5e0d3cb Binary files /dev/null and b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/logical_node2.webp differ diff --git a/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/playgo_node1.webp b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/playgo_node1.webp new file mode 100644 index 0000000..5112703 Binary files /dev/null and b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/playgo_node1.webp differ diff --git a/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/scenes_node1.webp b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/scenes_node1.webp new file mode 100644 index 0000000..f3ae00f Binary files /dev/null and b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/scenes_node1.webp differ diff --git a/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/scenes_node2.webp b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/scenes_node2.webp new file mode 100644 index 0000000..d12a43e Binary files /dev/null and b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/scenes_node2.webp differ diff --git a/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/scenes_node3.webp b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/scenes_node3.webp new file mode 100644 index 0000000..10e83cd Binary files /dev/null and b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/scenes_node3.webp differ diff --git a/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/scenes_node4.webp b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/scenes_node4.webp new file mode 100644 index 0000000..fa27b4f Binary files /dev/null and b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/scenes_node4.webp differ diff --git a/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/scenes_node5.webp b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/scenes_node5.webp new file mode 100644 index 0000000..b4f5057 Binary files /dev/null and b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/scenes_node5.webp differ diff --git a/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/script_node1.webp b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/script_node1.webp new file mode 100644 index 0000000..d6e9177 Binary files /dev/null and b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/script_node1.webp differ diff --git "a/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/\321\201omplexity_node1.webp" "b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/\321\201omplexity_node1.webp" new file mode 100644 index 0000000..aa02872 Binary files /dev/null and "b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/\321\201omplexity_node1.webp" differ diff --git "a/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/\321\201omplexity_node2.webp" "b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/\321\201omplexity_node2.webp" new file mode 100644 index 0000000..b07d7a6 Binary files /dev/null and "b/docs/assets/images/unnoficial_docs/references/quests/quest_nodes/\321\201omplexity_node2.webp" differ diff --git a/docs/assets/images/unnoficial_docs/references/quests/quest_ray.webp b/docs/assets/images/unnoficial_docs/references/quests/quest_ray.webp new file mode 100644 index 0000000..e762671 Binary files /dev/null and b/docs/assets/images/unnoficial_docs/references/quests/quest_ray.webp differ diff --git a/docs/assets/images/unnoficial_docs/references/quests/quest_sample.webp b/docs/assets/images/unnoficial_docs/references/quests/quest_sample.webp new file mode 100644 index 0000000..9ef2674 Binary files /dev/null and b/docs/assets/images/unnoficial_docs/references/quests/quest_sample.webp differ diff --git a/docs/changelog.md b/docs/changelog.md index 1e9a6f8..c6e45d2 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -4,9 +4,11 @@ *** -- 2.1.3 - Добавлены справочнки для [DLC Definition](unnoficial_docs/references/dlc/dlc_definition.md) и [DLC Mounters](unnoficial_docs/references/dlc/dlc_mounters.md) +- 2.1.5 - Добавлен набор статей о квестах: + [1](unnoficial_docs/references/quest/general.md), [2](unnoficial_docs/references/quest/editor.md), [3](unnoficial_docs/references/quest/blocks.md), [4](unnoficial_docs/references/quest/debug.md), [5](unnoficial_docs/references/quest/examples.md), [6](unnoficial_docs/references/quest/conditions_and_functions.md), [7](unnoficial_docs/base/dlc/dlc_mods/dlc_quest.md) +- 2.1.3 - Добавлены справочники для [DLC Definition](unnoficial_docs/references/dlc/dlc_definition.md) и [DLC Mounters](unnoficial_docs/references/dlc/dlc_mounters.md) - 2.1.0-2.1.3 - Начат [цикл](unnoficial_docs/base/dlc/index.md) пошагового руководства по созданию DLC-модов -- 2.1.0 - Добавдены справочники: [Asset Browser](unnoficial_docs/references/editors/asset_browser.md), [редактор локализуемых строк (Localized Strings Editor)](unnoficial_docs/references/editors/localized_strings_editor.md) +- 2.1.0 - Добавлены справочники: [Asset Browser](unnoficial_docs/references/editors/asset_browser.md), [редактор локализуемых строк (Localized Strings Editor)](unnoficial_docs/references/editors/localized_strings_editor.md) - 2.0.8 - Добавлена [страница](unnoficial_docs/guides/create_new_hud_medallion.md) - 2.0.7 - Добавлена [страница](unnoficial_docs/base/loading_screens.md), отредактирована [страница](unnoficial_docs/guides/create_usm_video.md) - 2.0.6 - Добавлена [страница](unnoficial_docs/guides/create_usm_video.md) diff --git a/docs/unnoficial_docs/base/dlc/dlc_mods/dlc_quest.md b/docs/unnoficial_docs/base/dlc/dlc_mods/dlc_quest.md new file mode 100644 index 0000000..f631d1b --- /dev/null +++ b/docs/unnoficial_docs/base/dlc/dlc_mods/dlc_quest.md @@ -0,0 +1,86 @@ +--- +tags: + - dlc + - quest + - reddlc + - w2quest + - w2phase + +status: new +--- + +# Квестовый DLC-мод + +Если ваш мод содержит хотя бы минимальное сюжетное взаимодействие с игроком, вам обязательно потребует реализовать свой **DLC-квест**. В отличии от модификации основной игры, квест в DLC запускается одновременно с главным квестом игры и не не может изменять текущий сюжет. Таким образом этот вариант подходит, если вы планируете добавлять новые сюжетные события или крупные DLC сюжеты по типу "Каменные сердца" или "Кровь и Вино". + +!!! info "Примечание" + Подробнее о понятии **квеста** и принципе его работы читайте в [соответствующем разделе](../../../references/quest/general.md) справки. + +## Создание файла квеста + +Перейдите в папку вашего DLC (далее в примере будет использоваться имя dlc77) и создайте папки так, чтобы они образовывали путь **"dlc --> dlc77 --> data --> quests"**. Внутри созданной папки, нажмите правой кнопкой мыши на пустое место и выберите пункт меню **"Create --> Quest"**. В качестве имени файла используйте **"dlc77_quest"**. +![create_dlc_quest.webp](../../../../assets/images/unnoficial_docs/base/dlc/create_dlc_quest.webp) + +После того, как вы создадите и откроете файл, вы заметите, что он не содержит вообще никаких блоков. Это нормально, однако в таком виде этот фал бесполезен и даже не будет запущен. Чтобы файл мог выполнятся, нужно добавить стартовый блок. + +Для создания стартового блока, нажмите правой кнопкой мыши на пустом месте холста (с серым фоном) и в открывшемся меню выберите **"Complexity management --> Start"**. Сохраните файл через меню **"File --> Save"** или комбинацию клавиш ++ctrl+s++. После этого редактор пока можно закрыть. + +## Настройка файла DLC + +Для того, чтобы игра узнала о новом файле квеста, который необходимо запустить параллельно с остальными, нам необходимо указать соответствующий [маунтер](../../../references/dlc/dlc_mounters.md) в [определение](../dlc_steps/step_4.md) нашего DLC. + +Перейдите в корневую папку вашего DLC и откройте ранее созданный файл **.reddlc**. В открывшемся окне выделите строку **"mounters"** и справа нажмите на зеленую иконку ➕. В результате нажатия появится новая пустая строка строка. Теперь выделите эту строку и нажмите на красный перевернутый треугольник -🔻. В результате откроется окно со списком маунтеров, в котором нужно будет выбрать элемент с названием **"CR4QuestDLCMounter"**. Сделайте двойной щелчок по маунтеру, чтобы добавить его DLC. + +Добавленный маунтер содержит четыре свойства, подробнее о которых вы можете посмотреть [здесь](../../../references/dlc/dlc_mounters.md/#cr4questdlcmounter), однако нас сейчас интересует только поле **"quest"**, которое содержит пусть к нашему файлу квеста. + +Не закрывая окно **DLC Definition**, прейдите в [Asset Browser](../../../references/editors/asset_browser.md) и вернитесь к нашему файлу **"dlc77_quest"**. Выделите его и переключитесь снова на окно **DLC Definition**. Нажмите на свойство **"quest"** и после на появившуюся справа зеленую стрелочку ⬅. Путь к вашему файлу квест будет задан. +![set_quest_dlc_definition.webp](../../../../assets/images/unnoficial_docs/base/dlc/set_quest_dlc_definition.webp) + +Закройте окно редактирования **DLC Definition** и в появившемся запросе на сохранение, нажмите **"Yes"**. Теперь игра знает о вашем файле квеста и будет запускать его при старте игры (как новой, так и из сохранения). + +## Структура квеста + +Как было описано в [основном материале](../../../references/quest/general.md) о работе квестов, для удобства работы с большой структурой, нам необходимо дробить логики на отдельные фазы (файлы формата **w2phase**). Мало того, если изучить существующие файлы квестов, разработчики стараются и вовсе не размещать никакой логики в самом фале квеста, а старт основных действий запускают с файла фазы, который обычно носит название содержащее слово **"structure" (структура)**. Давайте поступим так же. + +Перейдите в папку с файлом квеста и рядом уже с имеющимся файлом создайте файл фазы **w2phase** с именем **"dlc77_structure"** (пункт контекстного меню **"Create --> Phase"**). + +!!! info "Примечание" + Вынос логики в фал фазы, а так же имя файла, не является жестким требованием, однако подобный нейминг и разбивка по файлам, позволяет избегать массы проблем в будущем. + +После создания файла нам так же требуется указать в нем точку входа, через которую [луч](../../../references/quest/general.md/#_4) квеста попадет внутрь. Откройте файл **"dlc77_structure"** и с помощью контекстного меню **"Complexity management --> In"** добавьте входной блок. Сохраните и закройте файл. Теперь когда фаза создана ее можно добавить в основной файл квеста. + +Откройте файл квеста **"dlc77_quest"** и добавьте блок **"Complexity management --> Phase"**. Разместите блок фазы справа от блока **Start** и соедините блоки между собой (как показано в [руководстве](../../../references/quest/editor.md) по редактору квестов). + +Теперь выделите блок фазы и слева в списке свойств укажите в свойстве **phase** путь к фалу **"dlc77_structure.w2phase"** (выделив нужный файл в Asset Browser, и нажав зеленую стрелочку в окне нужного свойства). +![add_dlc_quest_structure.webp](../../../../assets/images/unnoficial_docs/base/dlc/add_dlc_quest_structure.webp) + +!!! warning "Важно!" + Если вы решите добавить фазу в файл квеста до того как создадите блок **In** внутри фазы, то в блоке фазы у вас не будет точки для входящего соединения. Это связано с тем, что внутри фазы может быть множество разных блоков **In** и от их количества будет зависеть число входящих соединений для блока фазы. + + После того как вы добавите блок **In** внутри фазы, вернитесь в квест, нажмите ++пкм++ на блок фазы и в контекстном меню выберите пункт **Rebuild sockets** + +Теперь внутри файла фазы **"dlc77_structure"** мы можем описывать структуру нашего квеста (в том числе добавляя новые фазы, формируя любой уровень вложенности). + +## Пример квеста + +Для закрепления понимания работы квеста, давайте выполним простой пример, который покажет, что файл квеста корректно используется игрой. + +Откройте файл **"dlc77_structure.w2phase"** и справа от блока In добавьте блок **"Scripting --> Script"**. Соедините блоки линией и выделите блок **Script**. Слева в окне свойств выберите свойство **functionName** и нажмите на красный треугольник 🔻. В открывшемся окне найдите **DisplayHudMessage**. После выбора скрипта в низу основных свойств блока появится набор свойств, доступных только для этого скрипта. В свойстве **localisedStringKey** укажите **"dlc77_desc"** (значение взято для примера, а вы можете указать любой ключ строки из [Localized Strings Editor](../../../references/editors/localized_strings_editor.md)). + +Теперь в REDkit запустите сохраненную игру (или используя шаблон **.redgame**) и при появлении игрока вы увидите ваше сообщение. +![test_dlc_quest.webp](../../../../assets/images/unnoficial_docs/base/dlc/test_dlc_quest.webp) + +## Послесловие + +Лучший способ научится программировать квесты - это изучение существующих квестов в основной игре и дополнениях, однако эти структуры могут показаться очень большими и сложными для новичков. + +Благо на сайте с официальной документацией REDkit, разработчики разместили тестовый мод [Mariska's Wonderland](https://cdprojektred.atlassian.net/wiki/spaces/W3REDkit/pages/28770305/Demo+Mod+Mariska+s+Wonderland), который можно скачать в виде zip-архива и открыть в REDkit. Там вы найдете фал **"mariska_test_quest"**, описывающий короткий сюжет этого мода и позволяющий изучать редактор квестов на более простом примере. + +!!! warning "Важно!" + Ни в коем случае не воспринимайте структуру и имена файлов в моде "Mariska's Wonderland" как руководство к действию. Данный мод сделан в ознакомительных целях и не отвечает требованиям к размещению фалов и их именам, но хорошо подходит для изучения написания квестов. + +*** +Автор: lxgdark + +*Документация поддерживается участниками сообщества [REDkit RU](https://discord.gg/kRTEy8KcNa)* +*** diff --git a/docs/unnoficial_docs/base/dlc/dlc_steps/step_1.md b/docs/unnoficial_docs/base/dlc/dlc_steps/step_1.md index f02912d..c2517ba 100644 --- a/docs/unnoficial_docs/base/dlc/dlc_steps/step_1.md +++ b/docs/unnoficial_docs/base/dlc/dlc_steps/step_1.md @@ -2,25 +2,26 @@ tags: - dlc - reddlc - -status: new - --- + # Шаг 1: Определение пространства ID для локализации + ## Общие сведения + Перед началом любых действий в рамках мода, нужно обязательно определить пространство ID для локализации. Так как на игру можно установить более одного мода, а моды DLC с вероятностью в 99% содержат строки, нужно убедится что внутренние ссылки на ID строки не будет конфликтовать между модами. Для этого существует возможность установить стартовый ID с которого начнутся ваши идентификаторы строк в рамках DLC. !!! info "Примечание" - Собственные идентификаторы можно начинать с 10 000 000 (десять миллионов), однако не рекомендуется использовать именно это число, так как это наиболее очевидный выбор для других моддеров. + Собственные идентификаторы можно начинать с 10 000 000 (десять миллионов), однако не рекомендуется использовать именно это число, так как это наиболее очевидный выбор для других создателей модов. В качестве первых цифр мы рекомендуем использовать номер вашего DLC (см следующий шаг), а затем шесть нолей для достижения необходимого размера числа. Например, если номер вашего DLC 77, пространство ID будет начинаться с 77000000. ## Установка пространства идентификаторов + Для установки пространства идентификаторов перейдите в **_View --> Settings --> Mod Project Settings_** и в поле **Project ID space** задайте стартовый идентификатор. ![id_space.webp](../../../../assets/images/unnoficial_docs/base/dlc/id_space.webp) @@ -29,4 +30,4 @@ status: new Автор: lxgdark *Документация поддерживается участниками сообщества [REDkit RU](https://discord.gg/kRTEy8KcNa)* -*** \ No newline at end of file +*** diff --git a/docs/unnoficial_docs/base/dlc/dlc_steps/step_2.md b/docs/unnoficial_docs/base/dlc/dlc_steps/step_2.md index 24f56b9..c5b4e3f 100644 --- a/docs/unnoficial_docs/base/dlc/dlc_steps/step_2.md +++ b/docs/unnoficial_docs/base/dlc/dlc_steps/step_2.md @@ -3,10 +3,8 @@ tags: - dlc - reddlc - mod_name - -status: new - --- + # Шаг 2: Имя мода Имя мода условно можно разделить на две части: @@ -14,7 +12,7 @@ status: new !!! docs "[Внутреннее имя](#_1)" Это имя вы будете использовать для внедрения в структуру текущей игры. -!!! docs "[Пубдикуемое имя](#_2)" +!!! docs "[Публикуемое имя](#_2)" То которое вы будет использовать при размещении мода на разных площадках. ## Внутреннее имя diff --git a/docs/unnoficial_docs/base/dlc/dlc_steps/step_3.md b/docs/unnoficial_docs/base/dlc/dlc_steps/step_3.md index c7dde91..b6fbdc1 100644 --- a/docs/unnoficial_docs/base/dlc/dlc_steps/step_3.md +++ b/docs/unnoficial_docs/base/dlc/dlc_steps/step_3.md @@ -3,10 +3,8 @@ tags: - dlc - reddlc - structure - -status: new - --- + # Шаг 3: Структура папок После выполнения предыдущих шагов, можно приступать к созданию места, где будут хранится все файлы мода. @@ -16,7 +14,7 @@ status: new Дальнейшие действия будут отличатся в зависимости от того будет ли в вашем DLC новый мир или нет. !!! docs "[Новый мир](#_1)" - Вы планируете создавть новый мир. + Вы планируете создавать новый мир. !!! docs "[Существующий мир](#_2)" Вы планируете добавлять контент в рамках существующих миров. @@ -36,14 +34,15 @@ status: new При переходе в папку DLC вы заметите, что там уже создан ряд папок связанных с добавленным игровым миром. Именно поэтому мы выполняем этот шаг так рано, так как это позволит минимизировать работу в будущем, а так же автоматизирует часть работы по неймингу папок. !!! info "Примечание" - Дальнейшую работу с миром пока можно отложить и продолжить начальниые настройки мода. + Дальнейшую работу с миром пока можно отложить и продолжить начальные настройки мода. ## Существующий мир + Если ваше DLC не предполагает создания нового мира, то для начала достаточно создать папку с именем DLC внутри папки "dlc". Как вы уже можете заметить в этой папке множество других DLC от самих разработчиков. Это хорошо, так как это поможет подсматривать структуру папок для создания единого стиля. ![create_empty_dlc_struct.webp](../../../../assets/images/unnoficial_docs/base/dlc/create_empty_dlc_struct.webp) !!! warning "Важно!" - Не спешите наполнять вашу папку подпапками, так как многие структуры папок создаются автоматически при выполнении определенных действий. Старайтесь создавать папки, только когда об этом сказано в конкретной статье руководства, дибо когда вы уверены, что ее расположение структурно верно! + Не спешите наполнять вашу папку подпапками, так как многие структуры папок создаются автоматически при выполнении определенных действий. Старайтесь создавать папки, только когда об этом сказано в конкретной статье руководства, либо когда вы уверены, что ее расположение структурно верно! *** Автор: lxgdark diff --git a/docs/unnoficial_docs/base/dlc/dlc_steps/step_4.md b/docs/unnoficial_docs/base/dlc/dlc_steps/step_4.md index 39d6a12..611ac43 100644 --- a/docs/unnoficial_docs/base/dlc/dlc_steps/step_4.md +++ b/docs/unnoficial_docs/base/dlc/dlc_steps/step_4.md @@ -3,10 +3,8 @@ tags: - dlc - reddlc - dlc_definition - -status: new - --- + # Шаг 4: Определение DLC На данный момент вы провели все подготовительные работы, однако сама игра ничего не знает о ваших намерениях и все предшествующие действия никак на нее не повлияют. @@ -23,20 +21,22 @@ status: new ![set_reddlc_property.webp](../../../../assets/images/unnoficial_docs/base/dlc/set_reddlc_property.webp) На первом этапе достаточно будет настроить только основные свойства(не имеющие значка (+) на скрине), а свойства **mounters** и **languagePacks** по ходу разработки мода. !!! info "Примечание" - Работа с mounters будет показана в тех статьях, где потребуется соответсвующий маунтер, однако заранее ознакомится с общим списком mounters можно [здесь](../../../references/dlc/dlc_mounters.md) + Маунтеры (Mounters) - это набор подключаемых настроек, оповещающих игру о наличии в DLC разных аспектов модификации, таких как квесты или модификации внешнего вида персонажей (а так же многое другое). + + Работа с mounters будет показана в тех статьях, где потребуется соответствующий маунтер, однако заранее ознакомится с общим списком mounters можно [здесь](../../../references/dlc/dlc_mounters.md) Итак задайте значения для основных свойств: - **id** - ИД вашего DLC. ИД должен быть уникальным значением, показывающим принадлежность к вашему DLC. Разработчики рекомендуют формат dlc_xxx_yyy, поэтому мы сделаем также. В качестве ИД укажите, например **dlc_077_001** !!! info "Примечание" - Причина по которой формат именни такой, связна с тем, что у вас может быть более отдного DLC Definition для вашего мода. Например один для внедрения в основноую игру, а второй для самостоятельного запуска из главного меню. Именно поэтому нужен формат имени, где xxx - это номер dlс, а yyy - это порядковый номер DLC Definition + Причина по которой формат имени такой, связна с тем, что у вас может быть более одного DLC Definition для вашего мода. Например один для внедрения в основную игру, а второй для самостоятельного запуска из главного меню. Именно поэтому нужен формат имени, где xxx - это номер dlс, а yyy - это порядковый номер DLC Definition - **localizedNameKey** - это внешнее название нашего мода, которое будет отображаться в игре. Необходимо указать ключ к локализованной строке. Благо мы его заготовили [ранее](../dlc_steps/step_2.md). В нашем примере тут будет указано **dlc77_title** - **localizedDescriptionKey** - то же самое что и выше, только нужен для строки описания мода. Тут используем **dlc77_desc**. - **initiallyEnabled** - определяет включено ли DLC по умолчанию. Если нет, игроку нужно самостоятельно поставить галочку, чтобы мод появился в игре. - **visibleInDLCMenu** - определит можно ли включить/выключить мод из меню игры **Настройки > Игровой процесс**. Выбор настройки зависит от сложности вашего DLC. Если DLC включает квесты и отдельные миры, то лучше поставить тут красный крестик, так как отключения мода сломает сохранения. - **requiredByGameSave** - настройка как раз на случай описанный выше. Если поставить зеленый крестик, то игра при загрузке сохранения будет требовать наличие этого мода. Выберите эту настройку если ваш DLC включает квесты или отдельные миры. -На этом стартовые настройки вашего DLC можно считать завершенными. Дальнейший порядок дейтвий завит от типа DLC и степени влияния на основную игру. +На этом стартовые настройки вашего DLC можно считать завершенными. Дальнейший порядок действий завит от типа DLC и степени влияния на основную игру. *** Автор: lxgdark diff --git a/docs/unnoficial_docs/base/dlc/index.md b/docs/unnoficial_docs/base/dlc/index.md index d4829f9..16bdf6f 100644 --- a/docs/unnoficial_docs/base/dlc/index.md +++ b/docs/unnoficial_docs/base/dlc/index.md @@ -2,10 +2,8 @@ tags: - dlc - reddlc - -status: new - --- + # DLC моды ## Общие сведения @@ -21,7 +19,7 @@ DLC-моды являются модификациями игры, которы
-- **Шаг 1** +- **Шаг 1** *** @@ -29,7 +27,7 @@ DLC-моды являются модификациями игры, которы [:octicons-arrow-right-24: Перейти](dlc_steps/step_1.md) -- **Шаг 2** +- **Шаг 2** *** @@ -37,7 +35,7 @@ DLC-моды являются модификациями игры, которы [:octicons-arrow-right-24: Перейти](dlc_steps/step_2.md) -- **Шаг 3** +- **Шаг 3** *** @@ -45,10 +43,24 @@ DLC-моды являются модификациями игры, которы [:octicons-arrow-right-24: Перейти](dlc_steps/step_3.md) -- **Шаг 4** +- **Шаг 4** *** Определение DLC. - [:octicons-arrow-right-24: Перейти](dlc_steps/step_4.md) \ No newline at end of file + [:octicons-arrow-right-24: Перейти](dlc_steps/step_4.md) + +
+ +## Базовые варианты DLC-модов + +
+ +- **Квесты** + + *** + + DLC-мод определяющий новый квест (**w2quest**). + + [:octicons-arrow-right-24: Перейти](dlc_mods/dlc_quest.md) diff --git a/docs/unnoficial_docs/references/dlc/dlc_definition.md b/docs/unnoficial_docs/references/dlc/dlc_definition.md index e115bdc..4417c45 100644 --- a/docs/unnoficial_docs/references/dlc/dlc_definition.md +++ b/docs/unnoficial_docs/references/dlc/dlc_definition.md @@ -3,10 +3,8 @@ tags: - dlc - reddlc - dlc_definition - -status: new - --- + # Описание DLC Definition Файл DLC Definition - это файл с расширением **.reddlc**, является ключевым элементом при создании DLC для игрового проекта. В нем содержатся настройки и инструкции, определяющие ресурсы и пути к ним в вашем DLC. Кроме того, он управляет процессом загрузки и монтирования этих ресурсов. @@ -17,7 +15,7 @@ status: new Доступные mounters описаны [здесь](../dlc/dlc_mounters.md) -## Своства DLC Definition +## Свойства DLC Definition ### **id** @@ -25,7 +23,7 @@ status: new !!! info "Примечание" Используйте формат dlc_xxx_yyy (например dlc_077_001). - Причина по которой формат именни такой, связна с тем, что у вас может быть более отдного DLC Definition для вашего мода. Например один для внедрения в основноую игру, а второй для самостоятельного запуска из главного меню. Именно поэтому нужен формат имени, где xxx - это номер dlс, а yyy - это порядковый номер DLC Definition + Причина по которой формат имени такой, связна с тем, что у вас может быть более одного DLC Definition для вашего мода. Например один для внедрения в основную игру, а второй для самостоятельного запуска из главного меню. Именно поэтому нужен формат имени, где xxx - это номер dlс, а yyy - это порядковый номер DLC Definition ### **localizedNameKey** diff --git a/docs/unnoficial_docs/references/dlc/dlc_mounters.md b/docs/unnoficial_docs/references/dlc/dlc_mounters.md index b2c17a0..1c802b2 100644 --- a/docs/unnoficial_docs/references/dlc/dlc_mounters.md +++ b/docs/unnoficial_docs/references/dlc/dlc_mounters.md @@ -3,9 +3,6 @@ tags: - dlc - reddlc - dlc_mounters - -status: new - --- # DLC Mounters @@ -19,7 +16,7 @@ DLC Mounters - это набор настроек вашего DLC, которы **quest** - путь к файлу квеста, описывающего ваше DLC. -**taintFact** - путь к файлу, содержащему факты, влияющие на игру или квесты. +**taintFact** - имя факта, который "загрязняет" ваше сохранение. Проще говоря, если в сохранении будет найден такой факт, то при запуске игры из этого сохранения повторная инициализация квеста не произойдет. **sceneVoiceTagsTableFilePath** - путь к файлу с тегами голосовых сцен, используемыми в квестах. diff --git a/docs/unnoficial_docs/references/editors/asset_browser.md b/docs/unnoficial_docs/references/editors/asset_browser.md index 4415979..b9db86e 100644 --- a/docs/unnoficial_docs/references/editors/asset_browser.md +++ b/docs/unnoficial_docs/references/editors/asset_browser.md @@ -3,9 +3,6 @@ tags: - editor - asset - browser - -status: new - --- # Asset Browser diff --git a/docs/unnoficial_docs/references/editors/localized_strings_editor.md b/docs/unnoficial_docs/references/editors/localized_strings_editor.md index f0ae817..f2914a8 100644 --- a/docs/unnoficial_docs/references/editors/localized_strings_editor.md +++ b/docs/unnoficial_docs/references/editors/localized_strings_editor.md @@ -3,9 +3,6 @@ tags: - editor - localization - strings - -status: new - --- # Редактор локализуемых строк (Localized Strings Editor) diff --git a/docs/unnoficial_docs/references/quest/blocks.md b/docs/unnoficial_docs/references/quest/blocks.md new file mode 100644 index 0000000..b0bc88d --- /dev/null +++ b/docs/unnoficial_docs/references/quest/blocks.md @@ -0,0 +1,567 @@ +--- +tags: + - quest + - editor + - questeblocks + - основы + - w2quest + - w2phase + +status: new +--- + +# Квестовые блоки + +Редактор квестов содержит множество блоков, выполняющих самые разные задачи, которые логично сгруппировать так, как они сгруппированы в контекстном меню при их добавлении. Рассмотрим все блоки по порядку. + +## Camera (Камера) + +!!! warning "Важно!" + Все блоки раздела "Камера" можно считать устаревшими, так как они лишь единожды используются в основной игре. Вероятно эти блоки являются отголосками прошлых версий движка. + +### Activate Game Camera + +![camera_node1.webp](../../../assets/images/unnoficial_docs/references/quests/quest_nodes/camera_node1.webp) + +Активирует главную игровую камеру. Этот блок пригодится, если ранее вы установили статическую камеру (например так, чтобы камера смотрела на игрока спереди в каком то месте игры). Блок позволит вернут камеру за спину игрока в стандартное положение. + +* **blendTime** - указывает время за которое произоидет переход от другой камеры. 0, если хотите, чтобы установка произошла моментально. + +### Run Static Camera + +![camera_node2.webp](../../../assets/images/unnoficial_docs/references/quests/quest_nodes/camera_node2.webp) + +Активирует статическую камеру, заранее установленную в игровом мире. + +* **cameraTag** - тег камеры, которую вы хотите активировать. + +### Static Camera Sequence + +![camera_node3.webp](../../../assets/images/unnoficial_docs/references/quests/quest_nodes/camera_node3.webp) + +Создает последовательные переходы между статическими камерами, установленными в мире. + +* **cameras** - массив тегов нужных камер +* **maxWaitTimePerCamera** - максимальное время ожидания перед переходом к следующей камере. + +### Switch Static Camera + +![camera_node4.webp](../../../assets/images/unnoficial_docs/references/quests/quest_nodes/camera_node4.webp) + +Используется для плавного переключения между двумя статическими камерами, присутствующими в мире (первая камера уже должна быть активирована перед вызовом этого блока). + +* **nextCameraTag** - тег камеры, к которой должен произойти плавный переход. + +## Complexity management (Управление сложностью) + +### Start/In + +![сomplexity_node1.webp](../../../assets/images/unnoficial_docs/references/quests/quest_nodes/сomplexity_node1.webp) + +Отвечает за вход в квест/фазу. Блок **Start** используется в квесте и определяет начало квеста. Блок **In** используется в фазе и является точкой входа в фазу. У фазы может быть более одного блока **In** для реализации разных логик входа в фазу уровнем выше (для этого у каждого **In** нужно задать свойство **socketID**). + +### End/Out + +Отвечает за прекращение работы квеста/фазы. Блок **End** используется в контексте квеста и знаменует полное завершение всех действий внутри заданного квеста. Блок **Out** используется в фазах и полностью завершает выполнение всех логик внутри фазы. + +### Phase + +![сomplexity_node2.webp](../../../assets/images/unnoficial_docs/references/quests/quest_nodes/сomplexity_node2.webp) + +Фаза - это, по сути, папка, используемая для структурирования квеста. Технически они не обязательны, но рекомендуется добавить их для лучшей структуры. Они также могут иметь собственный внешний **w2phase** или быть встроенным в родительский файл. + +* **phase** - Ссылка на файл **w2phase**. Может быть оставлена пустой и, в таком случае она будет встроена в родительскую систему. +* **requiredWorld** — ждёт, пока игрок окажется в нужном мире, чтобы начать сигнал. Необязательное свойство. Удобно если вы хотите, чтобы какая то часть сюжета запустилась при попадании игрока в нужны мир и при этом избавляет от необходимости заводить под это отдельный факт. +* **isBlackscreenPhase** — сохраняет чёрный экран до завершения фазы и достижения сигнала выхода. Используется для очистки контента после сцены или квеста, чтобы игрок его не видел (например, при исчезновении NPC или для прятания некоторых реквизитов). +* **blackscreenFadeDuration** — как быстро черный экран появляется/исчезает. +* **saveMode** — определяет, может ли игрок сохранить игру, пока сигнал находится внутри этой фазы. Удобно, если вы хотите создать какие то ситуации, которые не дают сохранить игру до их окончания. +* **soundsBanksDependency** — Выбирайте, какие саундбанки принудительно загружать, когда эта фаза активна. +* **playGoChunk** — выбирает, какой фрагмент контента загрузить для фазы. Chunk (чанки) - это заранее заготовленные наборы игровых ресурсов, которые можно загрузить при входе в фазу, что обеспечит правильную работоспособность логик внутри фазы (например если требуется, чтобы прогрузился некий NPC). Это свойство связано с настройками requiredWorld и soundsBanksDependency, которые вместе обеспечивают корректную подготовку всех ресурсов для фазы. + +## Flow control (Управление потоком) + +### Condition + +![flow_node1.webp](../../../assets/images/unnoficial_docs/references/quests/quest_nodes/flow_node1.webp) + +Проверяет, является ли конкретное условие в данный момент **True** или **False**, и немедленно выпускает сигнал через соответствующий выход. + +* **questCondition** - условие, которое нужно проверить. На выбор предоставляется множество готовых условий, каждое из которых имеет собственные настройки. Основной набор условий и примеры их использования приведены на отдельной [странице](conditions_and_functions.md/#_2). + +### Cut Control + +![flow_node2.webp](../../../assets/images/unnoficial_docs/references/quests/quest_nodes/flow_node2.webp) + +Используется, чтобы завершить ожидание, действие или целую фазу по сценарному условию, не дожидаясь, пока будут выполнены исходные условия этих узлов. Это похоже на выключение света в комнате, не заходя в неё. Как пример использования - ограничение времени на решение задачи (например, "найди улику за 60 секунд"). Вместо того чтобы создавать сложную систему отсчёта, вы можете использовать **Pause** и деактивировать реакцию на улику через **Cut Control** по истечении времени прервав всю логику работы с найденной уликой. + +* **permanent** - ключевое свойство, определяющее возможность повторной активации узла. **False** - связанный узел теряет только текущий сигнал. Если позже новый луч войдёт в этот узел, он активируется как обычно. **True** - связанный узел навсегда отключается. Любой последующий луч, входящий в него, будет проигнорирован + +### Pause + +![flow_node3.webp](../../../assets/images/unnoficial_docs/references/quests/quest_nodes/flow_node3.webp) + +Один из самых важных узлов в графе квестов. Удерживает сигнал внутри, пока не будет выполнено заданное условие. После выполнения условий сигнал выходит из выхода. + +* **conditions** - список условий, который должны выполнится, прежде чем пауза будет снята (должны быть выполнены все условия). На выбор предоставляется множество готовых условий, каждое из которых имеет собственные настройки. Основной набор условий и примеры их использования приведены на отдельной [странице](conditions_and_functions.md/#_2). + +### Random + +![flow_node4.webp](../../../assets/images/unnoficial_docs/references/quests/quest_nodes/flow_node4.webp) + +Выпускает луч в произвольную выходную точку. Этот блок поможет при необходимости сгенерировать случайное действие. Например вы хотите, чтобы при посещении какой то локации погода сменилась на случайную. Присоединив к выходным точкам скрипты смены погоды, луч попадет в случайный. + +* **++пкм++ на блок + "Add output"** - добавить еще одну выходную точку +* **++пкм++ на блок + "Add termination input"** - добавить входящую точку которая прекращает работу блока. Пригодится если при каком то условии луч попавший в блок, не должен уйти дальше. + +## Game systems control (Управление игровыми системами) + +### Change World + +![game_control_node1.webp](../../../assets/images/unnoficial_docs/references/quests/quest_nodes/game_control_node1.webp) + +Переносит игрока в указанный игровой мир. + +* **worldFilePath** - путь к файлу мира w2w. Не рекомендуется указывать. Вместо этого выберите обозначение мира в следующем свойстве. +* **newWorld** - внутреннее обозначение мира, в который нужно переместить игрока. +!!! warning "Важно!" + Если ваш мод включает новый мир, то его необходимо добить как [DLC-мод](../../base/dlc/index.md). Имя вашего мира для данного списка можно будет задать в [маунтере](../dlc/dlc_mounters.md) **CR4WorldDLCMounter** вашего [DLC Definition](../dlc/dlc_definition.md). Формат имени **"AN_MyWorldName"**. +* **loadingMovieName** - Видео, которе нужно проиграть перед загрузкой мира (путь к файлу формата [.usm](../../guides/create_usm_video.md)). Используйте, если это первое посещение мира и вы хотите показать какое то вступительное видео. +* **targetTag** - тэг точки на карте, куда будет телепортирован игрок при смене мира. + +### Checkpoint + +![game_control_node2.webp](../../../assets/images/unnoficial_docs/references/quests/quest_nodes/game_control_node2.webp) + +Сохраняет игру. Нужен, чтобы в важных сюжетных точках позаботится о сохранении и не откатывать игрока далеко назад в случае чего. + +* **enableSaving** - можно использовать как запрет на сохранение, если поставить **False (красный крестик)**. Запрет на сохранение останется до следующего места, где он будет разрешен. Аналог этой операции есть в скриптах, поэтому **текущее свойство рекомендуется всегда использовать со значением True (зеленая галочка)**. +* **ignoreSaveLocks** - сохранит игру игнорируя любы запреты на сохранение (если таковые были заданы ранее). Используйте только в очень важных местах сюжета. + +### Denied Area + +![game_control_node3.webp](../../../assets/images/unnoficial_docs/references/quests/quest_nodes/game_control_node3.webp) + +Включает/отключает запрещающую зону на карте мира. Нужно, если у вас установлена зона которая запрещает доступ NPC и вы хотите в процессе отключить ее работу. + +* **entityTag** - тэг запрещающей зоны на карте. +* **enabled** - работает ли запрещающая зона. **True (зеленая галочка)**, если зона активна и NPC не могут ее посещать. **False (красный крестик)**, чтобы выключить зону и сделать ее доступной для NPC. + +### FactsDB Change + +![game_control_node4.webp](../../../assets/images/unnoficial_docs/references/quests/quest_nodes/game_control_node4.webp) + +Важнейший блок, позволяющий управлять [фактами](general.md/#_6) игры. + +* **factID** - текстовый идентификатор факта. +* **value** - значение которое нужно задать или прибавить к факту. +* **setExactValue** - **True (зеленая галочка)**, если вы хотите, чтобы было установлено то значение, что задано в **value**. **False (красный крестик)**, чтобы прибавить к текущему значению факта значение из **value** (отрицательные значения тоже работают). + +### Hide/Show layers + +![game_control_node5.webp](../../../assets/images/unnoficial_docs/references/quests/quest_nodes/game_control_node5.webp) + +Используется для отображения и скрытия слоев в мире. У этого есть две основные цели: показать изменения в мире, зависящие от действий игрока / времени, и оптимизировать игру, чтобы не загружать слишком много квестовых объектов, когда они не нужны. + +* **world** - В каком мире показывать/скрывать слой. Если не указать, то поиск слоя будет происходить в текущем мире (в том в котором игрок, на момент вызова блока). +* **layersToShow** - список слоев для отображения. +* **layersToHide** - список слоев для скрытия. +* **syncOperation** - если установлено значение **False**, слои отображаются/скрываются асинхронно (это означает, что может быть небольшая задержка в изменении состоянии слоев). Если установлено значение **True**, изменение происходит в одном и том же кадре (что может привести к снижению производительности, в зависимости от количества объектов в слоях). Для достижения наилучшей производительности старайтесь скрывать/показывать слои до загрузки мира с указанием **False**. Если же необходимо изменить видимость слоев этом мире, то стройте вашу логику так, чтобы игрок был на расстоянии и также используйте **False**. Значение **True** используйте в сценариях где вам по задумке нужно что-то показать или скрыть прямо перед игроком. + +### Manage Fast Travel + +![game_control_node6.webp](../../../assets/images/unnoficial_docs/references/quests/quest_nodes/game_control_node6.webp) + +Управление точками быстрого перемещения. Позволяет сделать столбы для перемещения активными/не активными, а также видимыми/скрытыми на карте. Например Каэр Морхен виден на карте, но вы не сможете в него попасть, пока не будет активирован/отображен столб для быстрого перемещения. + +* **operation** - выберите что делать с точками быстрого перемещения. Существует три варианта: управление активностью и видимостью (*QMFT_EnableAndShow*), управление только активностью (*QMFT_EnableOnly*) и управление только видимостью (*QMFT_ShowOnly*). +* **enable** - **False (красный крестик)** для деактивации точки быстрого перемещения. **True (зеленая галочка)** - для активации точки быстрого перемещения. Влияет на то, сможет ли игрок использовать точку, подойдя к ней. Это свойство не сработает если в **operation** выбрано управление видимостью (*QMFT_ShowOnly*). +* **show** - **False (красный крестик)** для скрытия точки быстрого перемещения. **True (зеленая галочка)** - для показа точки быстрого перемещения. Влияет на то, видна ли точка на карте. Это свойство не сработает если в **operation** выбрано управление активностью (*QMFT_EnableOnly*). +* **affectedAreas** - коллекция миров в которых мы управляем точками быстрого перемещения. +* **affetedFastTravelPoints**- список тэгов, тех точек быстрого перемещения, на которые влияет операция. + +### Manage Switch + +![game_control_node7.webp](../../../assets/images/unnoficial_docs/references/quests/quest_nodes/game_control_node7.webp) + +Управляет переключателями в игре. Этот блок позволяет управлять различными интерактивными объектами в игре, которые имеют состояния (например рычаги или двери). + +* **switchTag** - тег переключателя в мире. +* **operations** - коллекция операций, которые нудно применить к переключателю. Например вы хотите закрыть и заблокировать дверь (две операции). +* **force** - **False (красный крестик)** проигнорирует операцию, если состояние невыполнимо или уже то, что мы пытаемся сделать. **True (зеленая галочка)** - если мы принудительно вводим переключатель в указанное состояние. +* **skipEvents** - **True (зеленая галочка)** - чтобы пропустить все события, которые привязаны к действию переключателя. Например некоторые объекты на уровне шаблона имеют сопутствующие события, происходящие при переключении. Это свойство позволит их проигнорировать. + +### Minigame + +![game_control_node8.webp](../../../assets/images/unnoficial_docs/references/quests/quest_nodes/game_control_node8.webp) + +Запускает мини-игру (Гвинт или кулачный бой). + +* **minigame** - выберите из списка вариант мини-игры + +Кулачный бой: + +* **fightAreaTag** - тэг области в которой находится игрок и его соперники. +* **playerPosTag** - тэг точки в которой находится игрок в начале боя (будет телепортирован в эту точку). +* **toTheDeath** - **True (зеленая галочка)** если хотите чтобы бой продолжался смерти (игрока или всех соперников). **False (красный крестик)** и тогда бой закончится при низком здоровье игрока (или всех участников). +* **endsWithBlackscreen** - **True (зеленая галочка)** если в конце мини-игры нужно увести экран в затемнение. Используйте, если сразу после вы планируете показывать сцену, где будет выход из затемнения. +* **enemies** - коллекция врагов, участвующих в схватке. Каждый элемент состоит из двух свойств: *npcTag* - тэг противника, *startingPosTag* - тэг точки на которой он появляется в бою. + +Гвинт: + +* **deckName** - название колоды, которую будет использовать враг. +* **difficulty** - уровень сложности противника. +* **aggression** - стратегия игрока противника. Варьируется от оборонительной до очень агрессивной. +* **allowMultipleMatches** - **True (зеленая галочка)** разрешает несколько партий подряд (матч-реванш). +* **forceFaction** - применяется для выбора колоды которой сыграет игрок. Например, если вы проводите турнир, где игроки поочереди играют разными колодами фракций. *GwintFaction_Neutral* - оставит колоду игрока. + +### Time Management + +![game_control_node9.webp](../../../assets/images/unnoficial_docs/references/quests/quest_nodes/game_control_node9.webp) + +Позволяет управлять временем в игре. + +**CPauseTimeFunction** - ставит время на паузу или возобновляет его. Удобно для больших сюжетных моментов в которых важно сохранить текущее время игры. + +* **pause** - **True (зеленая галочка)**, чтобы поставить время на паузу. **False (красный крестик)**, чтобы возобновить время. + +**CSetTimeFunction** - установить игровое время на конкретное значение. + +* **newTime** - устанавливает указанное игровое время +* **callEvents** - отправляет события связанные со временем. Например, если есть какая то реакция на смену дня и ночи, то событие будет сгенерировано и пнет эту реакцию. + +**CShiftTimeFunction** - сдвигает игровое время на указанное значение. + +* **timeShift** - на сколько часов, минут, секунд изменить время. +* **callEvents** - отправляет события связанные со временем. Например, если есть какая то реакция на смену дня и ночи, то событие будет сгенерировано и пнет эту реакцию. + +## Gameplay (Игровой процесс) + +### Encounter full respawn + +![gameplay_node1.webp](../../../assets/images/unnoficial_docs/references/quests/quest_nodes/gameplay_node1.webp) + +Используется для полного перезапуска столкновения (*Encounter*). Основная идея — сбросить его до исходного состояния. Например, если игрок убил всех противников в зоне, вы можете использовать этот блок, чтобы все враги снова появились при выполнении определенных условий. + +* **encounterTag** - тэг зоны столкновения (*Encounter Area*) на карте. + +### Encounter manager + +![gameplay_node2.webp](../../../assets/images/unnoficial_docs/references/quests/quest_nodes/gameplay_node2.webp) + +Используется для контроля встреч (*Encounters*) напрямую из логики квеста. Пригодится, когда вам нужно динамически включать, отключать встречу или управлять её фазами в процессе выполнения квеста. + +* **encounterTag** - тэг зоны столкновения (*Encounter Area*) на карте. +* **enableEncounter** - включение или выключение встречи. Устанавливает, будет ли встреча активна при выполнении этого блока квеста. Если **False (красный крестик)**, встреча не начнется. +* **forceDespawnDetached** - принудительная выгрузка открепленных существ. Если установлено в **True (зеленая галочка)**, блок принудительно удалит всех NPC, которые были «откреплены» от встречи. Обычно это происходит, когда существо начинает преследовать игрока за пределами области встречи (**Encounter Area**). Полезно для «очистки» мира после завершения квеста. +* **encounterSpawnPhase** - запуск с определенной фазы. Позволяет запустить встречу не с ее фазы по умолчанию (*Default Phase*), а сразу с другой фазы, заданной в графе встречи (*Encounter Graph*) . Если указано **"None"**, будет использована фаза по умолчанию. + +### Encounter manual activation + +![gameplay_node3.webp](../../../assets/images/unnoficial_docs/references/quests/quest_nodes/gameplay_node3.webp) + +Отдельный блок, позволяющий запустить или прекратить столкновение (*Encounter*) + +* **encounterTag** - тэг зоны столкновения (*Encounter Area*) на карте. +* **deactivateEncounter** - **False (красный крестик)**, чтобы активировать (запустить) столкновение. **True (зеленая галочка)** для деактивации. + +### Encounter phase setter + +![gameplay_node4.webp](../../../assets/images/unnoficial_docs/references/quests/quest_nodes/gameplay_node4.webp) + +Позволяет указать конкретную фазу для встречи (столкновения). + +* **encounterTag** - тэг зоны столкновения (*Encounter Area*) на карте. +* **encounterSpawnPhase** - выбор определенной фазы. Позволяет выбрать фазу из графа встреч (*Encounter Graph*). Если указано **"None"**, будет использована фаза по умолчанию. + +### Entity Motion + +![gameplay_node5.webp](../../../assets/images/unnoficial_docs/references/quests/quest_nodes/gameplay_node5.webp) + +Это блок интерполяции (плавного перехода) состояния сущности. Её основная задача — не просто переместить предмет из точки A в точку B, а плавно и контролируемо изменить его позицию, поворот (вращение) и/или масштаб в пространстве за заданное время, следуя определённой кривой анимации. На практике это позволяет реализовать разные эффекты, как например, парящий предмет, или плавный сдвиг камня, заслонявшего пещеру. + +* **entityTag** - тэг сущности для которой применяется перемещение. +* **duration** - длительность анимации перемещения в секундах. +* **targetTransform** - начальные координаты сущности. Можно не указывать, если сущность уже расположена в мире на нужных координатах. +* **positionDelta** - смещение позиции сущности. +* **rotationDelta** - поворот сущности. +* **scaleDelta** - изменение масштаба сущности (увеличение или уменьшение). +* **animationCurve** - кривая анимации. Позволяет управлять поведением анимации, например более быстрая в начале и медленная в конце. + +### Fast forward communities + +![gameplay_node6.webp](../../../assets/images/unnoficial_docs/references/quests/quest_nodes/gameplay_node6.webp) + +Этот блок предназначен для тонкого контроля над процессом "перемотки" NPC, чтобы избежать багов и неестественного поведения. Так как у NPC размещенных с помощью *Community* есть различные расписания и сценарии поведения, могут возникнуть ситуации когда потребуется быстро привести поведение NPC к текущему времени суток. Этот блок поможет привести NPC к тому состоянии, которому они должны соответствовать в текущий игровой момент. + +* **manageBlackscreen** - **True (зеленая галочка)**, чтобы процесс "перемотки" быс скрыт за черным экраном. Обязательно ставьте True, если игрок находится радом с NPC, для которых применяется блок. +* **respawnEveryone** - принудительный респаун всех NPC. Если **True (зеленая галочка)**, узел полностью удалит и заново создаст всех NPC, сбросив их состояние. Рекомендуется использовать только в крайних сценариях. +* **dontSpawnHostilesClose** - **True (зеленая галочка)**, чтобы враждебные NPC не появились рядом с игроком. Этот пункт поможет избежать ситуаций, когда из-за "перемотки" при выходе из затемнения на игрока сразу нападут враги. +* **timeLimit** - лимит времени, на которое игра можете перемотать NPC. Если указано **-1**, то перемотка не имеет ограничений и NPC будут приведены к текущему игровому времени. А, например, значение 3600 переметет NPC всего на игровой час вперед. + +### Interest point emitter + +![gameplay_node7.webp](../../../assets/images/unnoficial_docs/references/quests/quest_nodes/gameplay_node7.webp) + +Вероятно устаревший блок. В игре не разу не используется. Вероятно заменой этого блока стал блок представленный ниже. + +### Look at + +![gameplay_node8.webp](../../../assets/images/unnoficial_docs/references/quests/quest_nodes/gameplay_node8.webp) + +Позволяет управлять вниманием (взглядом) различных NPC. Применяется в активных сценах (когда диалог между персонажами происходит в процессе игры). Например, вы исследуете помещение, пока NPC что-то рассказывает вам. Данный блок позволит сделать так, чтобы NPC следил за вами взглядом (поворачивая голову или даже все тело). + +* **actor** - тэг NPC, который будет следить взглядом. +* **target** - тэг персонажа, за которым нужно следить взглядом. Чаще всего это игрок (*PLAYER*), но можно указать и другого NPC для более сложных взаимодействий. +* **enabled** - **True (зеленая галочка)** для активации процесса отслеживания или **False (красный крестик)** для прекращения. +* **type** - тип отслеживания. Например, еси нужно зафиксировать взгляд на одной точке, или чтобы он динамически следил за целью. +* **duration** - продолжительность отслеживания в секундах. Например NPC смотрит на игрока 5 секунд. пока звучит его реплика, а после продолжает идти по своим делам. +* **canCloseEyes** - разрешено ли закрывать глаза. Для живых персонажей (при высоких **duration**) используйте **True (зеленая галочка)**, чтобы избежать эффекта куклы. +* **forceCloseEyes** - принудительно закрыть глаза. Глаза будут закрыты до конца действия блока. +* **speed** - коэффициент скорости для поворота головы/тела. 0 - стандартная скорость. +* **level** - уровень отслеживания. От простого слежения глазами, до полного поворота тела в сторону **target**. +* **range** - дистанция на которой действует отслеживание (в метрах). Если объект выйдет за приделы дистанции, то блок прекратит работу. 0 - без ограничений по дистанции. +* **gameplayRange** - то же самое, что предыдущий пункт, но с учетом влияния на поведение игры и внутреннюю логику. Обычно оба этих свойства имеют одинаковое значение. +* **limitDeact** - ограничить деактивацию. Используйте, чтобы отслеживание не было деактивировано другими алгоритмами игры. +* **instant** - позволяет мгновенно перевести взгляд (повернуть тело/голову) на цель. Используйте с осторожностью, если уверены, что игрок это не увидит. +* **staticPoint** - координаты статической точки на которой сосредоточен взгляд. Работает только в связке *DLT_StaticPoint* для **type**. +* **headRotationRatio** - разрешенный поворот головы (в градусах). Для **level** со значением *LL_Head* не имеет смысла (ставить 0), однако для **LL_Body** это значение позволяет отвязать поворот головы от поворота тела, делая слежение более естественным. Для второго случая используйте значение в от 50 до 150 градусов (наиболее естественный угол отклонения). +* **eyesLookAtConvergenceWeight** - кооэффициэнт сведение взгляда. Делает взгляд более естественным на разных дистанциях. +* **eyesLookAtIsAdditive** - указывает, что анимация слежения должна сливаться с текущей анимацией. Делает анимацию более естественной и плавной, но пренебрегает некоторыми значениями заданными выше. +* **eyesLookAtDampScale** - корректирует естественность поворота глаз. Довольно редкий сценарий использования. Например если нужно создать эффект пьяных глаз. + +### Play animation + +![gameplay_node9.webp](../../../assets/images/unnoficial_docs/references/quests/quest_nodes/gameplay_node9.webp) + +Проигрывает анимацию для указанной сущности в мире (например мост, дверь или рычаг). + +* **entityTag** - тэг сущности для которой проигрывается анимация. +* **animationName** - имя анимации. Это имя должно быть определено среди пакетов анимаций, подключенных к сущности. +* **operation** - операция с анимацией (воспроизведение, пауза или остановка). +* **playCount** - количество повторений анимации. +* **playLengthScale** - множитель скорости. 1 — нормальная скорость. 0.5 — вдвое медленнее, 2.0 — вдвое быстрее. Полезно для создания различных эффектов (например медленное открытие тяжелой двери). +* **playPropertyCurveMode** - направление анимации (с начала в конец или с конца в начало). +* **rewindTime** - время которое нужно пропустить в начале анимации (чтобы воспроизвести ее, например с середины). + +### Reward + +![gameplay_node10.webp](../../../assets/images/unnoficial_docs/references/quests/quest_nodes/gameplay_node10.webp) + +Вручает игроку указанную награду (например по итогам выполнения квеста). Теоретически может использоваться для вручения награды другим персонажам, но механика игры построена так, что этот блок практически всегда используется для вручения награды игроку. + +* **rewardName**- имя награды (определено в файлах игры или DLC). +* **targetEntityTag** - тэг персонажа, которому вручается награда. Практически всегда *PLAYER*. + +### Spawn Not Streamed Boat + +![gameplay_node11.webp](../../../assets/images/unnoficial_docs/references/quests/quest_nodes/gameplay_node11.webp) + +Вероятно устаревший блок либо остаток от нереализованной системы лодочных гонок. В игре ни разу не использовался. + +### Spawn Player's Vehicle + +![gameplay_node12.webp](../../../assets/images/unnoficial_docs/references/quests/quest_nodes/gameplay_node12.webp) + +Позволяет заспавнить (загрузить) средство передвижения в указанной точке. Например когда вы входите в усадьбу Корво Бьянко, этот блок загрузит лошадь в конюшне. Либо если вы уплыли с острова на лодке, а затем снова переместились на этот остров, можно снова подгрузить лодку к причалу. + +* **vehicleType** - тип средства передвижения (лошадь или лодка). +* **spawnPointTag** - тэг точки в мире, куда нужно заспавнить средство передвижения. + +### Story phase setter + +![gameplay_node13.webp](../../../assets/images/unnoficial_docs/references/quests/quest_nodes/gameplay_node13.webp) + +Управляет активацией/деактивацией определенных фаз взаимодействия с NPC (*Community*). Важный блок для организации сюжетных изменений для NPC. + +* **spawnsets** - коллекция действий, варианты которых определены ниже. + +**CActivateStoryPhase** - активировать фазу. + +* **spawnset** - путь к файлу *Community* (**.w2comm**), который содержит NPC. +* **phase** - имя фазы, которую нужно активировать. +* **streamingPartition** - настройка для продвинутых пользователей. Оставьте пустым. + +**CDeactivateSpawnset** - деактивировать *Community*. + +* **spawnset** - путь к файлу *Community* (**.w2comm**), который необходимо деактивировать (NPC будет выгружен из игры). + +## Helper tools (Вспомогательные инструменты) + +!!! info "Примечание" + Блоки из этого раздела не влияют на игру и ее механики. Данные блоки используются сугубо для комментирования и обозначения блоков и предназначены для внутренней работы с графом квестов. + +### Comment block + +![helper_node1.webp](../../../assets/images/unnoficial_docs/references/quests/quest_nodes/helper_node1.webp) + +Позволяет обернуть группу блоков, указав общий комментарий. Применяется для внутреннего обозначения, например при совместной работе, чтобы другой разработчик понял логику либо выполнил доработки из комментария. + +* **commentGraphBlockText** - текст комментария, которые будет отображаться в заголовке блока. +* **titleColor** - цвет заголовка в блоке. + +### Description note + +![helper_node2.webp](../../../assets/images/unnoficial_docs/references/quests/quest_nodes/helper_node2.webp) + +Блок заметка, который можно разместить в любом месте редактора. Поможет не забыть какую то логику или будущие доработки. + +* **caption** - заголовок блока. +* **descriptionText** - текст внутри блока, который и будет вашей заметкой. + +## Journal (Журнал) + +### Entry + +![journal_node1.webp](../../../assets/images/unnoficial_docs/references/quests/quest_nodes/journal_node1.webp) + +Активирует запись в журнале. + +* **entry** - ссылка за запись в журнале. +* **showInfoOnScreen** - **True (зеленая галочка)**, если хотите, чтобы информация об активации записи журнала была показана на экране. + +### Map Pin State + +![journal_node2.webp](../../../assets/images/unnoficial_docs/references/quests/quest_nodes/journal_node2.webp) + +Управляет точками на карте, которые связаны с записью журнала. Обычно при активации задания в журнале, на карте обозначается некоторая точка (или радиус) что связаны с этим заданием. Некоторых логиках вам может потребоваться не сразу показывать эти точки или скрывать их при каких то условиях. Например игрок идет по следу из улик и вам нужно активировать (показать) следующую улику на карте, только после того как игрок найдет предыдущую. + +* **mappinEntry** - ссылка на элемент журнала, связанного с этой точкой на карте. +* **enableOnlyIfLatest** - значок станет видимым только если он является последним (самым новым) в цепочке связанных значков для текущей цели. Как раз применяется для системы последовательной активации точек при их нахождении игроком. +* **disableAllOtherMapPins** - если **True (зеленая галочка)**, при активации этого значка все остальные значки в рамках одного задания будут автоматически отключены. Так же позволяет реализовывать последовательное перемещение по точкам, при этом убирая уже пройденные. + +### Objective Counter + +![journal_node3.webp](../../../assets/images/unnoficial_docs/references/quests/quest_nodes/journal_node3.webp) + +Используется для отслеживания выполнения количественных задач, управляя счётчиком у конкретной цели в журнале. Например, если по заданию нужно убить три волка, вы можете после убийства волка увеличивать счетчик в задании с помощью этого блока. + +* **manualObjective** - указывает на запись в журнале (objective), счётчик которой нужно изменить. +* **showInfoOnScreen** - **True (зеленая галочка)**, если хотите, чтобы информация об изменении счетчика была показана на экране. + +Блок имеет три входящих точки: + +* **Increment** - увеличивает значение счётчика на 1. +* **Decrement** - уменьшает значение счётчика на 1. +* **Reset** - сбрасывает значение счётчика в 0. Пригодится, если по заданию нужно убить три волка за определенное время. Если игрок не вложился, счетчик будет сброшен. + +### Quest + +![journal_node4.webp](../../../assets/images/unnoficial_docs/references/quests/quest_nodes/journal_node4.webp) + +Основной способ работы с журналом заданий. С помощью этого блока вы чаще всего будете управлять заданиями в журнале, переводя их в различные состояния. + +* **questEntry** - ссылка на задание в журнале. +* **showInfoOnScreen** - **True (зеленая галочка)**, если хотите, чтобы информация об изменении состояния задания была показана на экране. +* **track** - **True (зеленая галочка)**, если хотите, чтобы это задание стало отслеживаемым (текущим основным для игрока). +* **enableAutoSave** - стоит ли делать автосохранение после изменения состояния журнала. + +### Quest Monster Known + +![journal_node5.webp](../../../assets/images/unnoficial_docs/references/quests/quest_nodes/journal_node5.webp) + +Предназначена для заполнения бестиария новой записью. + +* **manualQuest** - ссылка на запись журнала, которая связана с записью в бестиарии. + +### Track Quest + +![journal_node6.webp](../../../assets/images/unnoficial_docs/references/quests/quest_nodes/journal_node6.webp) + +Позволяет направить внимание игрока на конкретный этап задания. + +* **questEntry** - ссылка на задание в журнале. +* **objectiveEntry** - ссылка на конкретную цель (этап) в рамках указанного задания. + +## Logical (Логические) + +### And + +![logical_node1.webp](../../../assets/images/unnoficial_docs/references/quests/quest_nodes/logical_node1.webp) + +Пропустит луч дальше, если сигнал пришел во все входящие точки. ++пкм++ на блок, чтобы добавить еще входящих точек. Применяется, если для продвижения по квесту, обязательно исполнения нескольких условий. + +### Xor + +![logical_node2.webp](../../../assets/images/unnoficial_docs/references/quests/quest_nodes/logical_node2.webp) + +Единожды пропустит луч, если сигнал прошел через любую входящую точку. Все остальные входящие сигналы будут игнорироваться. Применяется, если нужно активировать событие по одному из нескольких вариантов. Например вы нашли улику или смогли разговорить крестьянина. Событие будет запущено, а срабатывание других условий проигнорировано. + +## PlayGo + +### Activate Content + +![playgo_node1.webp](../../../assets/images/unnoficial_docs/references/quests/quest_nodes/playgo_node1.webp) + +Заранее активирует фрагмент игрового контента. Этот блок выполняет задачу по оптимизации игры. + +* **playGoChunk** - сhunk (чанки) это заранее заготовленные наборы игровых ресурсов, которые можно загрузить в нужный момент, что позволит избежать прогрузки контента на глазах у игрока. + +## Scenes (Сцены) + +### Context Dialog + +![scenes_node1.webp](../../../assets/images/unnoficial_docs/references/quests/quest_nodes/scenes_node1.webp) + +Встраивает одну сцену в другую. Это блок позволяет дополнить существующую сцену новым диалогом. очень удобно, если вы делаете DLC и ходите внедрить в имеющийся игровой диалог новые варианты взаимодействий. + +* **scene** - путь к файлу сцены, которую нужно встроить. +* **targetScene** - путь к файлу с целевой сценой, в которую мы встраиваем свою. + +### Interaction Dialog + +![scenes_node2.webp](../../../assets/images/unnoficial_docs/references/quests/quest_nodes/scenes_node2.webp) + +Добавляет для указанного NPC интеракитный диалог. Это позволяет подойти к NPC и начать с ним диалог, настроенный этим блоком. + +* **scene** - ссылка на файл сцены. +* **actorTags** - тэг NPC с которым активируется интеракитный диалог. +* **interrupt** - **True (зеленая галочка)**, чтобы при начале интеракитного диалога прервать предыдущие взаимодействия. + +### Scene + +![scenes_node3.webp](../../../assets/images/unnoficial_docs/references/quests/quest_nodes/scenes_node3.webp) + +Запускает указанную сцену (катсцену). + +* **scene** - ссылка на файл сцены. +* **forcingMode** - режим принудительной активации. Поможет убедится, что все необходимое для сцены, будет присутствовать на уровне. +* **interrupt** - **True (зеленая галочка)**, если сцену может прервать игрок или игровое событие (например нападение монстра). +* **shouldFadeOnLoading** - **True (зеленая галочка)**, если хотите чтобы перед запуском сцены экран ушел в затемнение. При таком значении вы должны позаботится о выходе из затемнения внутри сцены. +* **playGoChunk** - сhunk (чанки) это заранее заготовленные наборы игровых ресурсов, которые можно загрузить в нужный момент, что позволит избежать прогрузки контента на глазах у игрока. + +### Scene prepare + +![scenes_node4.webp](../../../assets/images/unnoficial_docs/references/quests/quest_nodes/scenes_node4.webp) + +Подготавливает сцену для ее вопроизведения. Это позволяет загрузить нужные ресурсы в память заранее и избежать подвисания в начале воспроизведения тяжелой сцены. + +Содержит коллекцию сцен, которые нужно подготовить (**storyScenes**): + +* **scene** - ссылка на файл сцены. +* **input** - имя входящей точки по которой пойдет путь сцены. Если не указано, в память будет загружена вся сцена. + +### Scripted Dialog + +![scenes_node5.webp](../../../assets/images/unnoficial_docs/references/quests/quest_nodes/scenes_node5.webp) + +Вероятно устаревший блок. Не используется в основной игре. + +## Scripting (Скрипты) + +!!! warning "Важно!" + Практически все блоки в этом разделе позволяют точечно управлять игровыми скриптами. Это сложные механики требующие отдельных статей на каждый такой блок, поэтому они не будут тут рассмотрены (кроме одного, см ниже). + +### Script + +![script_node1.webp](../../../assets/images/unnoficial_docs/references/quests/quest_nodes/script_node1.webp) + +Это очень важный блок, который позволяет выполнить игровой скрипт. Огромное число операций в игре выполняется через скрипты, не говоря о том, что вы можете сами их написать. Согласно логике работы блока, вам нужно выбрать один из множества скриптов списке и после появятся дополнительные поля для настройки. Так как это важная часть создания квестов, часть существующих скриптов описаны вы [этой](conditions_and_functions.md/#_3) статье. + +* **functionName** - имя функции из большого списка. Если вы написали свою функцию, она так тут появится. +* **saveMode** - режим участия этого скрипта в сохранении. **QSCSM_SaveBlocker** - не позволит сохранить игру, пока скрипт не закончится. **QSCSM_Restart** - даст сохранить игру, но при загрузке сохранения, этот блок выполнится заново. + +*** +Автор: lxgdark + +*Документация поддерживается участниками сообщества [REDkit RU](https://discord.gg/kRTEy8KcNa)* +*** diff --git a/docs/unnoficial_docs/references/quest/conditions_and_functions.md b/docs/unnoficial_docs/references/quest/conditions_and_functions.md new file mode 100644 index 0000000..25a3780 --- /dev/null +++ b/docs/unnoficial_docs/references/quest/conditions_and_functions.md @@ -0,0 +1,371 @@ +--- +tags: + - quest + - conditions + - functions + - основы + - w2quest + - w2phase + +status: new +--- + +# Руководство по условиям и функциям в квестовых блоках + +Здесь описаны основные условия и функции, которые можно использовать в редакторе квестов REDkit. Это не полный список, но он поможет понять основные возможности. + +## Условия + +Используются в различных блоках квестов, например, для создания пауз или проверок. + +### **1. CQuestActorCondition** — Условия для актеров + +| Условие | Описание | +|---------|----------| +| **HasModifier** | `True`, если у актера/игрока есть выбранный бафф или дебафф. | +| **HasWeaponDrawn** | `True`, если актер держит любое оружие в руках. | +| **Health** | `True`, если процент здоровья актера соответствует условию. Проверяет Vitality или Essence. | +| **IsInVehicle** | `True`, если актер находится на указанном транспортном средстве. | + +### **2. CQuestFightCondition** — Условия боя + +Проверяет состояние боя для актера или игровой сущности с указанным тегом: + +| Состояние | Для кого | Когда срабатывает | +|-----------|----------|-------------------| +| **Killed** | Актеры | Когда актер убит. | +| **Stunned** | Актеры | Во время оглушения + 1 секунда после. | +| **Hit_By_Aard** | Игровые сущности | 1 секунда после удара знаком Аард. | +| **Hit_By_Igni** | Игровые сущности | 1 секунда после удара знаком Игни. | +| **Hit_By_Yrden** | Игровые сущности | 1 секунда после удара знаком Ирден. | +| **Hit** | Сущности | 1 секунда после получения любого урона. | + +### **3. CQuestScriptedCondition** — Скриптовые условия + +| Условие | Описание | +|---------|----------| +| **ActorIsDespawned** | `True`, когда все актеры с указанным тегом деспавнены. | +| **BookHasBeenRead** | `True`, если игрок прочитал указанную книгу. | +| **Container** | Проверяет, пусты ли все контейнеры с тегом. | +| **EntityComponentEnabled** | `True`, если компонент сущности включен. | +| **EntityComponentExists** | `True`, если у сущности есть указанный компонент. | +| **IsItemEquipped** | `True`, если предмет экипирован игроком. | +| **IsItemQuantityMet** | Проверяет количество предметов в инвентаре (по имени, категории или тегу). | +| **IsItemUsed** | `True`, если предмет был использован из инвентаря (факт длится 3 секунды). | +| **OilApplied** | `True`, когда масло нанесено на указанный тип меча. | +| **UsedFocus** | `True`, когда игрок в режиме концентрации. | +| **UsedMedallion** | `True`, при активации медальона. | +| **WasMeditating** | Срабатывает при медитации:
• **hours** — количество часов медитации
• **dayPart** — до какой части дня (рассвет/полдень/закат/полночь)
• **meditateToHour** — медитация до указанного часа. | + +!!! info "Примечание" + Учитывается суммарное время медитации, даже если оно разбито на несколько сеансов. + +--- + +## Функции + +Используются в блоках [Script](conditions_and_functions.md/#script) в графах квестов. + +### **1. AddItemQuest** + +Добавляет предметы в инвентарь. + +- **targetTag** — тег цели +- **itemName** — имя предмета +- **quantity** — количество +- **items** — массив предметов (опционально) + +### **2. AddNPCModifierQuest** + +Добавляет баффы/дебаффы NPC. + +- **npcTag** — тег NPC +- **buffEffects** — массив эффектов + +### **3. DespawnNPCsWithTag** + +Деспавнит всех актеров с указанным тегом. + +### **4. DoorChangeState** + +Меняет состояние дверей. + +- **tag** — тег дверей +- **newState** — новое состояние: + - `Open` / `Close` — открыть/закрыть + - `RemoveLock` — убрать замок + - `Enable` / `Disable` — включить/выключить + - `Lock` — добавить замок + +### **5. DrawWeaponQuest** + +Заставляет игрока обнажить оружие. + +### **6. EnableOrDisableContainers** + +Включает/выключает контейнеры. + +- **containersTag** — тег контейнеров +- **containerEnabled** — `True`/`False` + +### **7. EntityComponentQuest** + +Включает/выключает компонент сущности. + +- **tag** — тег сущности +- **componentName** — имя компонента +- **bEnable** — `True`/`False` + +### **8. EquipItemQuest** + +Экипирует или снимает предмет. + +- **targetTag** — тег цели +- **itemName** — имя предмета +- **unequip** — снять (`True`/`False`) +- **toHand** — экипировать в руку (только для NPC) + +### **9. FadeInQuest / 10. FadeOutQuest** + +Плавное появление/затемнение. + +- **fadeTime** — время в секундах + +### **11. ForceTargetQuest** + +Заставляет NPC атаковать указанную цель. + +- **npcTag** — тег NPC +- **targetTag** — тег цели + +### **12. HorseWhistle** + +Геральт зовёт лошадь. + +### **13. KillPlayer** + +Убивает игрока. + +- **ignoreImmortalityMode** — игнорировать бессмертие (`True`/`False`) + +### **14. ModifyNPCAbilityQuest** + +Добавляет/удаляет способность NPC. + +- **npcTag** — тег NPC +- **abilityName** — имя способности +- **remove** — удалить (`True`/`False`) + +### **15. PlayEffectQuest** + +Активирует/деактивирует эффект. + +- **entityTag** — тег сущности +- **effectName** — имя эффекта +- **activate** — активировать (`True`/`False`) +- **persistentEffect** — постоянный эффект (`True`/`False`) + +### **16. RemoveItemQuest** + +Удаляет предмет из инвентаря. + +- **entityTag** — тег сущности +- **item_name** — имя предмета +- **quantity** — количество (опционально) + +### **17. ResetFactQuest** + +Сбрасывает факт в 0. + +- **factID** — ID факта + +### **18. RestoreMusicQuest** + +Восстанавливает громкость музыки. + +### **19. SetGroupAttitudeQuest** + +Устанавливает отношение между группами. + +- **srcGroup** — исходная группа +- **dstGroup** — целевая группа +- **attitude** — отношение +- **affiliation** — принадлежность + +### **20. SetHealthQuest** + +Устанавливает здоровье актера. + +- **targetTag** — тег цели +- **healthPerc** — процент здоровья +- **relative** — относительно текущего (`True`/`False`) + +### **21. SetImmortalQuest** + +Изменяет режим бессмертия. + +- **targetTag** — тег цели +- **immortalityMode** — режим бессмертия + +### **22. SoundEventOnActorQuest** + +Проигрывает звук на актере. + +- **actorTag** — тег актера +- **eventName** — имя звукового события + +### **23. SoundEventQuest** + +Проигрывает звук без привязки к точке. + +- **eventName** — имя звукового события + +### **24. SwitchComponentStateQuest** + +Включает/выключает компонент объектов. + +- **shouldBeEnabled** — включить (`True`/`False`) +- **objectTag** — тег объектов +- **componentName** — имя компонента + +### **25. TransferPlayerItemsQuest** + +Передаёт предметы между игроком и контейнером. + +- **designatedContainerTag** — тег контейнера +- **itemSelectionType** — тип выбора предметов +- **steelSword, silverSword…** — категории предметов (`True`/`False`) +- **fromContainerToPlayer** — направление передачи (`True` = из контейнера в игрока) + +### **26. TutorialMessage** + +Показывает обучающее сообщение. + +- **type** — тип сообщения (подсказка/всплывающее) +- **journalEntry** — запись из журнала + +### **27. RemoveErrandsFromNoticeboard** + +Удаляет указанное поручение со всех досок объявлений, соответствующих заданному тегу. После удаления доска автоматически обновляется, чтобы изменения сразу отобразились для игрока. + +- **boardTag** — тег доски объявлений +- **errandName** — имя поручения + +### **28. AddErrandsToTheNoticeBoard** + +Добавляет одно или несколько поручений на все доски объявлений с указанным тегом. Для передачи данных используется массив структур `ErrandDetailsList`. Опциональный параметр `forceActivate` позволяет повторно активировать уже добавленное поручение, если оно ранее было скрыто или деактивировано. + +- **boardTag** — тег доски +- **errandDetailsList** — массив структур `ErrandDetailsList` с описанием поручений +- **forceActivate** — принудительно активировать поручение, если оно уже было добавлено ранее (`True`/`False`) + +### **29. FocusClueManager** + +Управляет состоянием фокус-улик (объектов типа `W3MonsterClue`), используемых системой ведьмачьего чутья. Позволяет изменять параметры группы улик по общему тегу, что избавляет от необходимости управлять каждым объектом отдельно. Функция ищет все объекты с заданным тегом в текущей сцене и применяет указанные параметры через метод `SetAttributes`. Если тег не задан или пуст, выполнение прекращается. + +- **tag** — тег улик (если пуст — функция не выполняется) +- **isAvailable** — доступна ли для использования в фокусе +- **isInteractive** — можно ли взаимодействовать +- **isReusable** — можно ли использовать повторно +- **isVisible** — отображается ли в режиме чутья +- **wasDetected** — считается ли уже обнаруженной +- **isIgnoringFM** — игнорирует ли режим Focus Mode +- **action** — режим применения параметров (`FCAA_ForceSet`, `FCAA_SetToTrue`, `FCAA_SetToFalse`, `FCAA_Switch`) + +### **30. SetImmortalQuest** + +Устанавливает режим бессмертия для всех акторов с заданным тегом. Функция ищет всех персонажей по тегу `targetsTag` и применяет выбранный режим бессмертия, который определяет, как актор будет реагировать на урон. Если акторов с указанным тегом не найдено, в лог записывается ошибка. + +- **targetTag** — тег акторов +- **immortalityMode** — режим бессмертия: + - `AIM_None` — обычная уязвимость + - `AIM_Immortal` — получает урон, но не умирает + - `AIM_Invulnerable` — полностью неуязвим + - `AIM_Unconscious` — теряет сознание вместо смерти +- **unconsciousMinDuration** — минимальная длительность бессознательного состояния (только для `AIM_Unconscious`) + +### **31. AddQuestMappinToNoticeboard** + +Добавляет квестовый маркер на карту через доску объявлений. Функция ищет все объекты типа `W3NoticeBoard` по тегу `noticeboardTag` и добавляет на каждую из них маркер, связанный с указанной сущностью. Используется в контенте досок объявлений для указания цели задания или места начала квеста после прочтения объявления. + +- **noticeboardTag** — тег доски объявлений +- **entityTag** — тег сущности, для которой создаётся маркер +- **entityType** — тип сущности: + - `AQMTN_Actor` — актор (NPC) + - `AQMTN_NonActor` — не-актор (объект, триггер) + +### **32. EnableDynamicMappin** + +Включает или выключает отображение динамических маркеров на карте через `CCommonMapManager`. Функция не создаёт игровые объекты, а только управляет видимостью уже существующих сущностей на карте и миникарте. Используется для поэтапного раскрытия целей квеста и навигации игрока. + +- **tag** — тег маркера +- **mappinType** — тип маркера (например, `EDM_QuestAvailable`, `EDM_MonsterNest`, `EDM_HorseRacingNPC` и др.) +- **enable** — показать (`True`) или скрыть (`False`) + +### **33. SetGroupAttitudeQuest** + +Глобально изменяет отношение одной группы ИИ к другой на уровне всей игровой системы. Определяет, как все персонажи из группы `srcGroup` будут относиться ко всем персонажам из группы `dstGroup`. Используется для крупных сюжетных сдвигов, таких как изменение отношений между фракциями. + +- **srcGroup** — исходная группа +- **dstGroup** — целевая группа +- **attitude** — отношение (`AIA_Friendly`, `AIA_Neutral`, `AIA_Hostile`) + +### **34. AssignNPCGroupAttitudeQuest** + +Назначает NPC базовую группу отношения (фракцию). Функция находит всех NPC по тегу `npcTag` и переводит их в указанную группу `attGroup`, что определяет, как данный NPC будет восприниматься другими персонажами в системе ИИ по умолчанию. + +- **npcTag** — тег NPC +- **attGroup** — группа отношения + +### **35. AssignNPCTemporaryGroupAttitudeQuest** + +Временно изменяет группу отношения для NPC. В отличие от базовой группы, временная группа имеет приоритет и может быть динамически включена или отключена. После отключения NPC возвращается к своему обычному поведению. Параметр `priority` определяет силу переопределения относительно других источников влияния (например, знака Аксий, сценарных сцен). + +- **npcTag** — тег NPC +- **attGroup** — временная группа отношения +- **priority** — приоритет переопределения (`AGP_SpawnTree`, `AGP_Axii`, `AGP_Fistfight`, `AGP_Scenes` и др.) +- **set** — включить (`True`) или выключить (`False`) временное отношение + +### **36. ForgetTargetQuest** + +Заставляет NPC «забыть» все известные цели. Все NPC, найденные по тегу `npcTag`, очищают память о ранее замеченных актёрах, что используется для сброса агрессии и завершения боевых состояний. + +- **npcTag** — тег NPC + +### **37. SetAttitudeTowardsNPC** + +Устанавливает конкретное отношение NPC к определённому актёру. В отличие от глобальных настроек, функция действует точечно: каждый NPC с тегом `npcTag` получает заданное отношение к актёру с тегом `targetTag`. Полезно для сценарных ситуаций, где нужно изменить поведение отдельных персонажей без влияния на общую систему отношений. + +- **npcTag** — тег NPC +- **targetTag** — тег цели +- **attitude** — отношение (`AIA_Friendly`, `AIA_Neutral`, `AIA_Hostile`) + +--- + +## Структуры + +### **ErrandDetailsList** + +Используется для описания поручения на доске объявлений. Каждый экземпляр соответствует одной записи на доске и содержит все необходимые данные для отображения, принятия и выполнения задания. + +| Поле | Тип | Описание | +|------|-----|----------| +| **errandStringKey** | string | Ключ локализованного названия поручения | +| **newQuestFact** | string | Факт, добавляемый при принятии задания | +| **requiredFact** | string | Факт, необходимый для отображения поручения | +| **forbiddenFact** | string | Факт, блокирующий отображение поручения | +| **addedItemName** | name | Имя предмета, выдаваемого при принятии | +| **displayAsFluff** | bool | Декоративное (неигровое) объявление | +| **posX**, **posY** | int | Координаты отображения на доске (UI) | +| **errandPosition** | int | Порядковый номер на доске | + +--- + +!!! info "Примечание" + Это не все доступные условия и функции в REDkit, только основные и часто используемые. + +*** +Автор: lxgdark, grandvel + +*Документация поддерживается участниками сообщества [REDkit RU](https://discord.gg/kRTEy8KcNa)* +*** diff --git a/docs/unnoficial_docs/references/quest/debug.md b/docs/unnoficial_docs/references/quest/debug.md new file mode 100644 index 0000000..0c01f5c --- /dev/null +++ b/docs/unnoficial_docs/references/quest/debug.md @@ -0,0 +1,53 @@ +--- +tags: + - quest + - основы + - w2quest + - w2phase + +status: new +--- + +# Отладка квестов + +## Запуск отладки + +В процессе тестирования квестов вам, вероятно, потребуется отслеживать текущее состояние вашего сюжета, а так же понимать какое значение в данный момент имеют те или иные факты. К счастью разработчики предоставили инструмент, который нам в этом поможет. + +Для начала запустите игру в REDkit с помощью файла сохранения или используя шаблон **.redgame**. После того как игра запустится нажмите клавишу ++"Pause/Break"++ для передачи фокуса в редактор. Теперь в главном окне выберите пункт меню **"Tools --> Debuggers --> Quests Debugger"**, чтобы открыть отладчик квестов. + +По умолчанию окно отладчика будет пустым, так как нам нужно выбрать файл квеста, который мы хотим просматривать. +Для этого внизу выберите вкладку **"Callstack"** и раскройте список **"Active quests"**. В списке будут представлены все файлы квестов выполняющиеся в игре. Раскрывая списки элементов со значком планеты вы увидите два типа элементов: шестеренка, отображающая фазу как группу и прямоугольник, позволяющий эту фазу открыть (двойной щелчок). +![quest_debug.webp](../../../assets/images/unnoficial_docs/references/quests/quest_debug.webp) + +Открыв нужный квест вы можете осуществлять навигацию по нему как в обычном [редакторе квестов](editor.md). + +## Работа с отладчиком + +Несмотря на то, что отладчик во многом похож на обычный редактор квестов, он все же имеет существенные отличия связанные с цветовой индикацией. Во-первых если, фаза в которой вы находитесь активна, то цвет фона на холсте будет красным. Во-вторых, блок на котором сейчас остановился луч, будет иметь желтую обводку. + +Например, блок фазы на картинке выше имеет желтую обводку, что значит, что луч внутри блока. Так же фон холста красный, что значит, что на луч активен и находится на одно из уровней вложенности. + +Однако, если перейти в фазу из показанного выше примера, то мы увидим серый фон и отсутствие желтой обводки на блоках. Это связано с тем, что луч прошел все блоки, но не покинул фазу, так как у фазы нет соединенного блока **Out**. +![quest_debug_dlc77_phase.webp](../../../assets/images/unnoficial_docs/references/quests/quest_debug_dlc77_phase.webp) + +Это наглядный пример не верного проектирования, так как отсутствие блока **Out** имеет смысл только при наличии зацикленных структур внутри фазы. Благо пример построен на основе квеста из [тестового DLC](../../base/dlc/dlc_mods/dlc_quest.md), поэтому мы можем не переживать относительно неразумного расходования ресурсов ПК, так как в будущем квест будет доработан. + +Если же изучить содержимое правильно-написанной фазы из существующих квестов, мы увидим более реалистичную картину. +![quest_debug_sample.webp](../../../assets/images/unnoficial_docs/references/quests/quest_debug_sample.webp) + +Например на этом скрине мы наглядно видим, что луч ожидает выполнения некого условия в блоке паузы и, как только это условие выполняется, луч продолжит свой путь выполняя заложенную далее логику. К слову вы можете видеть это в режиме онлайн, если поместите отладчик на второй экран, пока на первом будете выполнять тестовый забег. + +## Факты + +Как уже говорилось в [основном руководстве](general.md/#_6) одна из важных частей проектирование квестов, это установка и реагирование на факты. Логично предположить, что мы хотели бы понимать какие факты уже были установлены (и с каким значением). К счастью отладчик квестов предоставляет и такую возможность. Для этого в нижней панели перейдите на вкладку **"Facts DB"**. + +В этой вкладке вы увидите список всех загруженных фактов игры (все что были загружены из сохранения или были установлены за время тестового забега но не те, что еще не разу не были установлены). К сожалению окно не дает нам никаких фильтров, кроме поиска по имени, поэтому в идеале вы должны знать название факта, который ищите. После того, как вы найдете нужный факт и выделите его, в правой части окошка появится записи о том, когда и с каким значением этот факт был установлен. + +!!! info "Примечание" + Чтобы в будущем избежать проблем при поиске фактов относящихся к вашему моду, стоит в названии ваших фактов делать некоторую идентификационную приписку. Например, если у вас DLC-мод, то приписывайте в названии факта имя этого мода (например **dlc77_q001_start_fact**). +*** +Автор: lxgdark + +*Документация поддерживается участниками сообщества [REDkit RU](https://discord.gg/kRTEy8KcNa)* +*** diff --git a/docs/unnoficial_docs/references/quest/editor.md b/docs/unnoficial_docs/references/quest/editor.md new file mode 100644 index 0000000..b09718b --- /dev/null +++ b/docs/unnoficial_docs/references/quest/editor.md @@ -0,0 +1,90 @@ +--- +tags: + - quest + - editor + - questeditor + - основы + - w2quest + - w2phase + +status: new +--- + +# Редактор файлов квестов + +Для файлов формата **w2quest** и **w2phase** существует встроенный редактор - редактор квестов. Так как оба типа файла по сути своей отличаются лишь назначением (см. [основы](general.md)) работа с обоими типами файлов полностью идентичная. + +!!! info "Примечание" + Данное руководство не является исчерпывающим и охватывает лишь наиболее важные функции редактора. + +Для начала работы с редактором откройте или создайте файл формата **w2quest** или **w2phase**. В качестве примера в [Asset Browser](../../../references/editors/asset_browser.md) перейдем в папку **quests** и найдем там файл **witcher3_quest.w2quest**. Это главный файл квеста всей игры, на примере которого мы и рассмотрим основные функции редактора. + +## Навигация + +Основной блок редактора, на котором расположены все квестовые блоки представляет из себя бесконечный холст, который мы можем передвигать с помощью зажатой ++пкм++ и менять его масштаб с помощью ++"вращения колеса мыши"++. + +Так как часть блоков представляют из себя блоки фаз ([подробнее](general.md/#работа-с-файлами-квеста)), хранящие в себе вложенную структуру, вы можете перейти внутрь с помощью ++"двойного щелчка лкм"++. ++"Двойной щелчок лкм"++ по пустому месту холста подымет вас на уровень выше. + +Для определения уровня вложенности при навигации по фазам вам, вероятно, будет важно понимать как далеко вы забрались от первоначального файла. Для этого в левом верхнем углу холста есть набор салатовых прямоугольников. Самый нижний из них будет обведен красным, показывая ваше текущее местоположение в глубине вложенности. + +![quest_editor_navigate.webp](../../../assets/images/unnoficial_docs/references/quests/quest_editor_navigate.webp) + +## Управление + +При работе в редакторе большую часть времени вы будете создавать, настраивать и соединять блоки. + +Для создания блока нажмите ++пкм++ на пустом месте холста и, в открывшемся контекстном меню, выберите блок, который вы хотите добавить. Новый блок появится в том месте, где вы кликнули и не будет ни с чем соединен. + +Для перемещения блока наведите на него мышь и, зажав ++лкм++, перетащите блок в нужное место холста. ++пкм++ по блоку, вызовет его контекстное меню с важными действиями для блока. + +Теперь необходимо соединить блок с другими блоками. Для этого наведите мышь на черный квадрат слева (**входная точка**) или справа (**выходная точка**) от блока. Зажмите ++лкм++ и ведите до черного квадрата у другого блока. + +![quest_editor_connect.webp](../../../assets/images/unnoficial_docs/references/quests/quest_editor_connect.webp) + +!!! warning "Важно!" + Распространение [луча](general.md/#принцип-работы-квеста-луч) по квесту происходит слева на право, поэтому вы не сможете соединить выходную точку одного блока с выходной точкой другого. Так же вы не сможете соединить выходные и входные точки одного блока. Однако соединять выходные и входные точки разных блоков вы можете в любом порядке и на любой дистанции. Кроме того соединительные точки не имеют ограничений по количеству входящих или исходящих соединений. + +После размещения блока вам потребуется настроить его, указав свойства блока. Для этого выделите его с помощью ++пкм++ и перейдите в левую колонку редактора. Там вы увидите полный набор свойств выделенного блока и сможете настроить, указав необходимы значения. + +!!! info "Примечание" + Некоторые блоки имеют разное количество входных и выходных точек и их число может меняться в зависимости от настроек. Для таких блоков имеет смысл сначала указать настройки и только потом соединять его с остальными блоками. + +## Полезные действия + +### Пересборка соединительных точек + +Существует типы блоков, у которых количество входных точек определяется в отдельном фале этого блока. Таким блоками, например, являются блоки вызова игровых сцен или блоки фаз. Иногда редактор не подхватывает изменения в количестве соединительных точек, поэтому вам будет полезна функция **Rebuild sockets**. Для этого нажмите ++пкм++ на нужный блок и, в открывшемся контекстном меню, выберите соответствующий пункт. + +### Отключение/удаление соединений + +Если в процессе работы вам потребуется временно отключить какое либо соединение, вам достаточно просто нажать на соединение с помощью ++лкм++. После такого действия линия соединения станет полупрозрачной, а по середине ее пути появится красный крестик. + +Если же вы хотите удалить соединение, то вам нужно нажать ++пкм++ на соединительную точку и в контекстном меню выбрать **"Break All Links"** (для отсоединения от точки всех линий) или **"Break Link To"** (для выбора конкретного блока от которого нужно отсоединится). + +### Удаление блоков + +Несмотря на то, что удаление блоков может оказаться очевидной операцией не все так просто. Во-первых да, удалить блок можно либо с помощью контекстного меню, либо с помощью ++del++ когда блок выбран, однако если квест сохранен и внедрен в игру, на месте удаленного блока появится блок **Deletion marker**, который является заглушкой задача которого сохранить непрерывность **луча** при загрузке сохранений, а так же пометить место, где что-то было удалено. Удалить сам **Deletion marker** нельзя, как как он является частью системы безопасности. + +Если вы осознаете свои действия и точно уверены, что **Deletion marker** вам не нужен, вам потребуется отсоединить от него все линии (см. выше) и затем нажать на иконку веника 🧹 в левом верхнем углу редактора. Появится окно которое предложит удалить все блоки не соединенные линией с другими блоками. Нажав **Yes** вы уберете **Deletion marker** (а с ним и все прочие не соединенные блоки). + +### Поиск блоков + +В файле по типу **witcher3_quest.w2quest** огромная структура и тысяч блоков на множестве уровней. Найти что либо в такой структуре методом перебора может быть очень сложно, поэтому разработчики предоставили инструмент поиска блоков. + +Для открытия окна поиска нажмите на значок лупы чуть выше редактора свойств (или откройте пункт меню **"Edit --> Find"**). В открывшемся окне вы найдете множество способов для поиска блоков, а так же возможность выгрузить результаты в XML. + +!!! warning "Важно!" + Попытка поиска по основному игровому квесту быстро приведет вас к отчаянию, так как разработчики не озаботились именованием важных квестовых блоков. Держите это в голове, при создании своего мода и старайтесь именовать все важные блоки, чтобы затем иметь возможность быстро найти их. + +### Сохранение + +Так как REDkit был выкован в горнилах ада, одна из пыток что он предоставляет - это постоянные вылеты и потери данных. Помня это, не пренебрегайте пунктом меню **"File --> Save"**. Сохраняйте ваши изменения как можно чаще, особенно перед переключением на другие окна редактора. + +!!! info "Примечание" + Если вы хотите сохранить изменения сразу во всех файлах входящих в открытую структуру, вы можете воспользоваться пунктом меню **"File --> Save all"**, однако пользуйтесь этим типом сохранения с осторожностью. Сохранение всех файлов структуры может занять время, а так же привести к падению редактора. + +*** +Автор: lxgdark + +*Документация поддерживается участниками сообщества [REDkit RU](https://discord.gg/kRTEy8KcNa)* +*** diff --git a/docs/unnoficial_docs/references/quest/examples.md b/docs/unnoficial_docs/references/quest/examples.md new file mode 100644 index 0000000..460af8f --- /dev/null +++ b/docs/unnoficial_docs/references/quest/examples.md @@ -0,0 +1,63 @@ +--- +tags: + - quest + - sample + - example + - основы + - w2quest + - w2phase + +status: new +--- + +# Примеры игровых сценариев внутри файла квеста + +## Взаимоисключающие сюжетные линии + +Если по вашему замыслу в вашем сюжете есть несколько линий повествования, которые взаимоисключают друг друга, вы можете столкнутся со сложностями составления структуры блоков. Вероятнее всего каждая из линий будет запущена в зависимости от срабатывания триггера или установки некоторого факта и, в структуре блоков у вас будет блок [ожидания](general.md/#_5), который пропустит [луч](general.md/#_4) после выполнения условий. + +Однако проблема возникает из-за того, что после срабатывания условия для одной сюжетной ветви, вам нужно позаботится о том, чтобы исключить срабатывание других. Одно из решений, введение дополнительного [факта](general.md/#_6) для контроля отработки других условий. Установив такой факт при срабатывании одной из веток, вы проверяете его во всех остальных и не допускаете их выполнения. + +Впрочем есть более изящное решение, которое одновременно и более верное. Дело тут в важной особенности работы [фаз](general.md/#_3). Суть в том, что когда луч достигает блока **Out** внутри фазы, вся фаза прекращает свою работу и считается завершенной. Если внутри файла фазы были ожидания или циклы, они прервутся и более никогда не выполнятся. Это значит. что мы можем разбить наши взаимоисключающие ветви сюжета на файлы фаз (что верно с точки зрения структуры) и внутри каждого организовать следующее ветвление: + +* Первая ветвь отвечает за проверку факта, отвечающая за эту часть сюжета, а затем реализует все действия в рамках этого сюжета. +* Вторая ветвь внутри нашей фазы, проверяет срабатывание фактов в других фазах с взаимоисключающими ветками и, если таковой факт появится, ведет луч к блоку **Out**. + +Таким образом стоит сработать хотя бы одному факту в наших линиях сюжета, как все остальные фазы завершатся и больше никогда не сработают. + +## Циклические структуры + +Циклические структуры довольно частый сценарий при создании квестов. Любая повторяющаяся логика или (диалог) должны реализовывать циклическую структуру, поэтому важно понимать как они работают. + +Рассмотрим пример такой структуры. Предположим, что у нас есть портал, который переносит игрока в другой игровой мир. Нам важно, чтобы когда игрок вернется из того мира и снова пройдет через портал, все отработало так же как и до этого, а значит мы имеем классический пример цикличной структуры. +![quest_cyclic_structure.webp](../../../assets/images/unnoficial_docs/references/quests/quest_cyclic_structure.webp) + +На скриншоте показана итоговая реализация нашего пример, которую мы разберем поэтапно. +!!! info "Примечание" + В данном примере логика работа портала выведена в отдельный фал фазы, что является правильным походом. Запустив луч в том месте фазы, что вам нужно, она остается работоспособной на протяжении всей оставшейся игры и выполняет логику, вне зависимости от состояния других частей квеста. + +Логика фазы с циклом: + +* Когда игрок входит в портал будет установлен соответствующий факт (это настраивается в свойствах портала при его размещении в мире) +* Первый блок в нашей фазе это блок ожидания срабатывания нужного факта. В нашем случае блок ждет, пока будет установлен факт портала. +* Следующий блок переносит игра в указанный мир +* Затем путь ведет к блоку паузы на несколько секунд. Это нужно, так как луч проходит по блокам очень быстро и в случае циклических логик есть опасность двойного срабатывания. **Всегда используйте паузы в циклических сценариях**. +* От блока пазу мы возвращаем луч к первоначальному блоку ожидающему факт от портала. Таким образом, если игрок снова пройдет через портал, цил повторится. + +По сути все вышеописанное уже закрывает нашу задачу (почти), но у нас есть некоторые доработки. + +* Пауза цикла, помимо возврата в начало цикла, направляет луч на блок проверки. В этом блоке мы проверяем посещал ли игрок от мир ранее. В это примере, если игрок посещает мир мода впервые, срабатывает катсцена. +* В случае, если игрок впервые посещает мир мода, устанавливается соответствующий факт, на который будет реакция в другом файле фазы, что вызовет воспроизведение катсцены. +* Если игрок уже был в этом мире, вызывается скрипт **"FadeInQuest"**, который выводит экран из затемнения (экран затемняется во внутреннем коде работы портала). Как вы можете заметить из затемнения экран выводится, только в случае повторных посещений. Дело в том, что при первом посещении эту задачу выполняет катсцена. +* В конце (сугубо для примера) выполняется скрипт вызова лошади. К этому скрипту ведут оба блока, что гарантирует его срабатывание при любом условии. + +По итогу мы имеем повторяющийся сценарий, где в один момент луч раздваивается и одна его часть возвращается в начало, а вторая выполняет сопутствующие действия. + +!!! info "Примечание" + Обратите внимание, что в примере нет блока **Out**, так как переход к этому блоку завершает фазу и прекращает любые ожидания внутри, что остановит работу нашего цикла. + +*** +Автор: lxgdark + +*Документация поддерживается участниками сообщества [REDkit RU](https://discord.gg/kRTEy8KcNa)* +*** diff --git a/docs/unnoficial_docs/references/quest/general.md b/docs/unnoficial_docs/references/quest/general.md new file mode 100644 index 0000000..b4861b0 --- /dev/null +++ b/docs/unnoficial_docs/references/quest/general.md @@ -0,0 +1,79 @@ +--- +tags: + - quest + - основы + - w2quest + - w2phase + +status: new +--- + +# Общие данные о квестах + +## Понятие квеста + +В отличии от привычного понятия квеста, **квест** в рамках REDkit это главный элемент обеспечивающий отслеживание состояния игры, тесно связанный с текущим положением игрока в сюжетном повествовании. + +В рамках работы в REDkit нужно правильно понимать понятие квеста. То, что рядовой игрок называет квестом в игре, является лишь малой частью понятия. Описание задания и указания игроку определяются в **журнале**, тогда как **квест** - это более обширное понятие включающее в себя программирование поведения игры для ее движения по линии сюжета. + +![quest_sample.webp](../../../assets/images/unnoficial_docs/references/quests/quest_sample.webp) + +## Работа с файлами квеста + +В REDkit есть два типа файлов, отвечающих за работу квеста: основной и вспомогательный. Основной файл имеет формат **w2quest**, а вспомогательный **w2phase**. +Фйл **w2quest** является точкой входа в сюжет основной игры или DLC. Например, если вы откроете файл по пути **quests\witcher3_quest.w2quest**, то попадете в структуру основной игры. В этом файле описана вся логика и поведение игры от первого запуска до финальных титров. + +Обычно в рамках отдельной части игры (основная игра или DLC) используется один файл формата **w2quest** с которого и начинается выполнение игровой части. Единственная причина по которой таких файлов может быть несколько - это отладочные квесты (см. [отладка квестов](debug.md)). +![generale_quest.webp](../../../assets/images/unnoficial_docs/references/quests/generale_quest.webp) + +Открыв файл квеста основной игры, вы можете заметить в нем всего один блок, что не похоже на сложную структуру отвечающую за повествование всей игры. + +Все дело во втором типе файла **w2phase**. В отличии от основного файла, таких файлов может быть бесконечное множество (и собственно практически все файлы в папке "quests" и ее подпапках это файлы типа "фаза"). Каждый файл **w2phase** это своего рода группа блоков и внутри такого файла может быть указатель на другой файл фазы (или несколько), что делает структуру квеста многоуровневой и упорядоченной. + +Таким образом когда вы дважды щелкните на оранжевый блок в основном файле квеста, вы попадете в файл фазы, который содержит общую структуру игры. В этой пространстве так же есть блоки фаз, в которые также можно провалится двойным щелчком. + +!!! info "Примечание" + При навигации по структуре квеста, чтобы вернутся на уровень выше, дважды щелкните на пустое пространство (серый фон). + +Еще одной особенностью навигации по файлам **w2phase** является то, что вы можете открыть файл фазы сразу из [Asset Browser](../../../references/editors/asset_browser.md), что позволит вам быстрее попасть на нужный уровень (но не позволит подняться на уровень выше). Проще говоря перемещаясь внутри блоков фазы, вы по сути открываете отдельные файлы **w2phase**. + +Впрочем фаза не обязательно должна иметь основу в виде фала. Создав блок фазы, вы можете перейти в нее и настраивать как обычно, при этом не задавай путь к файлу **w2phase**, однако наличие основы в виде файла упрощает работу со структурой и делает основной файл квеста меньше размером на носителе. + +!!! info "Примечание" + Подробнее о работе с редактором квестов описано на [соответствующей](editor.md) странице. + +## Принцип работы квеста (луч) + +При запуске файла квеста, игровой движок ищет внутри блок **Start** с которого начинает свое движение так называемый **луч**. Как вы уже могли заметить, каждый блок внутри квеста соединяется с другими блоками одним или несколькими линиями. Эти линии являются своего рода дорогами для прохождения игрового **луча**, а текущее его положение определяет где именно вы находитесь в повествовании. +![quest_ray.webp](../../../assets/images/unnoficial_docs/references/quests/quest_ray.webp) + +Луч запускается из блока **Start** и распространяется по всем исходящим линиям к следующим блокам (слева на права). Достигая блока происходит его выполнение или, например в случае с блоком **Пауза (Pause)**, ожидает выполнения условий, чтобы пойти дальше. + +Когда луч попадает в блок **фазы (w2phase)**, он переходит к блоку **In** внутри фазы и распространяется от него ко всем прикрепленным блокам. Таким образом **луч** распространяется по всей иерархии блоков на все возможные уровни углубления, пока не достигнет финальных блоков. + +!!! warning "Важно!" + Когда **луч** достигает блока **Out** внутри **фазы**, вся фаза прекращает свою работу и считается завершенной. Если внутри файла фазы были ожидания или циклы, они прервутся и более никогда не выполнятся. + Впрочем если ваша фаза подразумевает существование на протяжении всей игры, вы можете просто не соединять конечный блок фазы с блоком **Out**. + +## Принцип работы квеста (ожидание) + +Вторым важным принципом работы квеста можно считать блоки пауз и условий. Концептуально в каждый момент времени десятки или сотни блоков ожидают срабатывания какого то события (или выполнения условия). Таким образом вышеописанный луч практически всегда находится в одном из блоков ожидания, а после срабатывания блока, проходит по следующим блокам, пока снова не упрется в ожидание. + +Именно так работают файлы сохранения игры. Пока вы видите экран загрузки, игра загружает все предметы игрока, мира и персонажей, а так же устанавливает все сработавшие игровые факты (см. ниже). Потом **луч** выходит из блока **Start** всех подгруженных квестов и пробегает по всем блокам пока не упрется в блоки ожидания, условия которых еще не отработали (блоки пауз в данном случае пропускаются) + +## Факты + +Как уже упоминалось выше структура блоков переполнена различными условиями и ожиданиями. Такие блоки поддерживают множество условий для срабатывания, например, появление в инвентаре некоторого предмета (или суммы предметов), но чаще всего основополагающим условием будет установка **факта**. + +Факт - это переменная или, если хотите, ячейка в памяти в которую мы помещаем некоторое значение. Установить факт, можно множеством разных способ, как с помощью блоков в файле квеста, так и автоматически в свойствах разных игровых сущностей. Например в игре есть триггер-зоны, в настройках которых можно указать имя факта, который будет установлен при посещении этой зоны. Либо существует шаблон портала, где так же можно указать факт, который будет зада при проходе через портал. + +Факты являются важной частью в создании структуры квестов, так как они хранят информацию о состоянии той или иной части игры и позволяют отслеживать самые разные изменения (или регулярные действия). + +!!! info "Примечание" + Так как в REDkit нет встроенной базы данных фактов, рекомендуется завести отдельный файл (например в Excel), где вы будете сохранять имена и назначение фактов, которые вы придумали для использования мода. + +*** +Автор: lxgdark + +*Документация поддерживается участниками сообщества [REDkit RU](https://discord.gg/kRTEy8KcNa)* +*** diff --git a/mkdocs.yml b/mkdocs.yml index 655f2ff..9c91885 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -24,6 +24,7 @@ nav: - Шаг 2. Имя мода: unnoficial_docs/base/dlc/dlc_steps/step_2.md - Шаг 3. Структура папок: unnoficial_docs/base/dlc/dlc_steps/step_3.md - Шаг 4. Определение DLC: unnoficial_docs/base/dlc/dlc_steps/step_4.md + - Варианты DLC. Квестовый DLC-мод: unnoficial_docs/base/dlc/dlc_mods/dlc_quest.md Поведения: - Общие сведения: unnoficial_docs/base/behavior/behavior.md Мир: @@ -40,7 +41,7 @@ nav: - Полезные фичи: - Главная: unnoficial_docs/useful_features/index.md - Полезные горячие клавиши: unnoficial_docs/useful_features/shortcuts.md - - Cкопировать инфу из свойств объекта: unnoficial_docs/useful_features/copy_info_from_objects_prop.md + - Скопировать инфу из свойств объекта: unnoficial_docs/useful_features/copy_info_from_objects_prop.md - Настройка Script Studio: unnoficial_docs/useful_features/setup_script_studio.md - Баги и их решения: @@ -55,6 +56,13 @@ nav: - DLC Definition: - Описание DLC Definition: unnoficial_docs/references/dlc/dlc_definition.md - DLC Mounters: unnoficial_docs/references/dlc/dlc_mounters.md + - Квесты: + - Общие данные о квестах: unnoficial_docs/references/quest/general.md + - Редактор файлов квестов: unnoficial_docs/references/quest/editor.md + - Квестовые блоки: unnoficial_docs/references/quest/blocks.md + - Условия и функции: unnoficial_docs/references/quest/conditions_and_functions.md + - Отладка квестов: unnoficial_docs/references/quest/debug.md + - Примеры сценариев: unnoficial_docs/references/quest/examples.md - Мир: - Параметры мира: unnoficial_docs/references/world/world_params.md - Umbra: unnoficial_docs/references/world/umbra.md