Показать: 3|Ответить: 1

Остров Грез

[Скопировать ссылку]
Опубликовано позавчера 07:27 | Показать все этажи |Режим чтения

Остров Грез

Остров Грез


Делаем пятёрку испытаний на Острове Грёз, без лишней «религии», но с мозговыносящими иллюзиями и завязкой на CHAOS / LIGHT / DARK.
Это будет отдельная сюжетная линия-головоломка, в духе Элмориона.

0. Общая конструкция
Локация: Остров Грёз (пустой остров из клиента).
Квест: Q93001_IllusionOfDreams / «Иллюзии Острова Грёз».
Тип: сольник, без смерти, только откаты/телепорты.
Счётчики: используем только уже существующие: CHAOS, LIGHT, DARK (через AstraFaction / AstraCrystalLogger).
Игрок попадает на остров:
  • через квест (получает Свиток Сновидения);
  • или через NPC-исследователя иллюзий в Гиране/Эльф-деревне (как решишь потом).


Структура квеста Q93001
Этапы (cond):
  • Вход на остров → Испытание 1: Выбор
  • Испытание 2: Память
  • Испытание 3: Путь
  • Испытание 4: Двери
  • Испытание 5: Тени
  • Финал → выход + награда

NPC на острове — это Иллюзии (один и тот же тип, разные роли):
  • npc_IllusionVoice – Голос Иллюзии (старт/финал)
  • npc_IllusionMemory – Память
  • npc_IllusionPath – Путь
  • npc_IllusionGate – Двери
  • npc_IllusionShadow – Тень


1. Испытание Выбора — «Голос Иллюзии»
NPC: Голос Иллюзии, стоит на центральной площадке острова.
Суть:
Игроку задают вопрос с тремя вариантами ответа.
Например:
«Ты оказался на Острове Грёз.
Чего ты ищешь на самом деле?»
Варианты:
  • «Выхода.»
  • «Силы.»
  • «Истину.»

Только один вариант ведёт дальше (меняется логика в зависимости от фракций).
Влияние CHAOS / LIGHT / DARK:
  • Если LIGHT доминирует → правильный выбор логичный:
    «Истину» → проход дальше.
    Голос даёт мягкий намёк в тексте.
  • Если CHAOS доминирует → правильный вариант выбирается рандомно при входе (в квесте хранится correctOption = 1–3).
    Игроку придётся тыкать / запоминать.
  • Если DARK доминирует → текст намёка ложный:
    NPC подталкивает к неверному выбору.

Провал:
Неверный выбор → телепорт в начало острова, но без сброса квеста (можно пробовать снова).

2. Испытание Памяти — «Образ Памяти»
Место: другая площадка на острове (ставишь NPC у отдельно стоящей постройки).
Механика:
NPC показывает игроку 3–5 фраз подряд (с задержкой), например:
  • «Пламя.»
  • «Сны.»
  • «Тени.»
  • «Песок.»
  • «Ветер.»

Потом спрашивает:
«Какое слово было третьим?»
Игрок выбирает из 4 вариантов.
Сложность по фракциям:
  • LIGHT ↑ → последовательность из 3 слов, 2 варианта ответа.
  • BALANCE (если будет) → 4 слова, 3 варианта.
  • DARK ↑ → 5 слов, 4 варианта, один вариант – очень похож (например, «Тень» / «Тени»).
  • CHAOS ↑ → при провале последовательность меняется, нельзя «зазубрить».

Провал:
Телепорт обратно к Образу Памяти, можно повторить попытку.

3. Испытание Пути — «Иллюзия Пути»
Место: длинная дорожка/мосты острова (открытые пространства).
Механика:
На земле есть невидимые «правильные» и «ложные» участки пути.
Неправильный → телепорт в начало этой зоны.
Ты размечаешь:
  • ряд платформ/участков дорожки → цепочка координат
  • у каждого — своя zone / trigger

Вариация по фракциям:
  • LIGHT доминирует → вокруг правильного пути можно слегка «подсветить» окружение (декоративный объект, факел, кристалл).
  • DARK доминирует → появляются “ложные пути”: визуально кажется, что путь есть (например, кусок моста), но зона-триггер телепортит назад.
  • CHAOS доминирует → правильный путь выбирается динамически из 2–3 предзаданных паттернов (например, в зависимости от текущего времени сервера или рандома).

Провал:
Телепорт к началу испытания Пути, прогресс квеста не сбрасывается.

4. Испытание Дверей — «Страж Дверей»
Место: часть острова с тремя воротами/арками (ты выбираешь декорации).
Механика:
Перед игроком 3 «двери» (3 NPC-триггера/зоны).
Только одна ведёт дальше, две — в петлю.
Вариации:
  • LIGHT доминирует → визуальная подсказка:
    правильная дверь слегка отличается (свет, статуя, факел, кристалл).
  • DARK доминирует → правильная дверь наоборот выглядит менее “приметно”, а две другие — красиво и ярко.
  • CHAOS доминирует → правильная дверь выбирается случайно раз в N минут / при каждом входе игрока (куски логики в квесте).

Провал:
Неверная дверь → маленькая отдельная «комнатка-иллюзия» (микро-площадка), откуда NPC возвращает игрока назад к Стражу Дверей с язвительной фразой типа:
«Кажется, этот выход был не для тебя.»

5. Испытание Теней — «Тень Сновидения»
Место: круглая площадка с возможностью расставить 4–5 NPC.
Механика:
Перед игроком появляются 4 «двойника» — NPC, использующие модель игрока или похожего персонажа (или один и тот же шаблон).
Каждый «двойник» при разговоре говорит одну фразу.
Нужно выбрать настоящего, исходя из намёка от Тени.
Пример намёка:
«Истинный ты всегда немного не в такт миру.»
И один из двойников будет, к примеру, делать эмоцию / говорить с задержкой / стоять чуть в стороне.
Вариации по фракциям:
  • LIGHT ↑ → намёк честный, читаемый.
  • DARK ↑ → намёк двусмысленный, легко понять наоборот.
  • CHAOS ↑ → правильный двойник выбирается рандомно из 2–3, а текст намёка вообще абстрактный.

Провал:
Неверный выбор → Тень “поглощает” игрока → телепорт на край острова, откуда он возвращается к этому испытанию (чуть дольше пробежаться, как наказание, но без боли).

Финал — Выход с Острова
После успешного прохождения всех 5 испытаний:
Голос Иллюзии снова появляется в центре острова.
Диалог:
«Ты прошёл через иллюзии этого места, не потеряв себя.
Остров Грёз запомнит твой шаг.
Хочешь проснуться — или продолжить видеть сны?»
Кнопки:
  • «Пробудиться (выйти)» → телепорт в город / нужную локацию.
  • «Остаться ещё» → игрок остаётся, но квест считается завершённым; может просто побродить.


Награда
Тут важно не ломать экономику, так что варианты:
  • Титул: «Пробудившийся с Острова Грёз»
  • Свиток Телепорта: в какую-то сюжетную локацию Elmorion (например, Святилище Сопряжения).
  • 1–2 декоративных предмета:

    • свиток эмоции
    • визуальный эффект (аура на 1 день)

  • чуть-чуть адены / опыта, чтобы не было ощущения «нулевой награды».

И можно добавить одноразовый/редкий квестовый предмет, который потом пригодится в другой сюжетке:
например, item_EchoOfDreams — «Эхо Грёз».

Привязка к АСТРЕ — без нового счётчика
Технически достаточно:
  • при входе в каждое испытание квест делает:

    • faction = AstraFactionUtil.getDominantFaction();

  • в зависимости от faction и, возможно, процентного перевеса:

    • выбирает сложность
    • подбирает подсказки
    • ставит правильные/ложные варианты


То есть Остров Грёз = зеркало состояния мира: чем больше Хаоса / Тьмы / Света → тем по-разному он «ведёт себя» для игроков.

Что дальше могу сделать
В следующем шаге могу:
  • расписать конкретные диалоги для всех 5 испытаний (RU/EN — если нужно);
  • накидать структуру Q93001.java / Q93001.xml (cond, события, bypass);
  • предложить IDs NPC, предметов, свитков;
  • дать структуру HTML-файлов:

    • 93001-01.htm — старт
    • 93001-02-choice.htm — выбор
    • 93001-03-memory.htm — память
    • и т.д.



Квесты
📁 Структура
Файл:
dist/game/data/scripts/quests/Q93001_IllusionOfDreams/Q93001_IllusionOfDreams.java
Пакет:
package quests.Q93001_IllusionOfDreams;
NPC (примерные ID — подставишь свои):

  1. private static final int ILLUSION_VOICE  = 40001; // Голос Иллюзии (старт/финал)
  2. private static final int ILLUSION_MEMORY = 40002; // Испытание памяти
  3. private static final int ILLUSION_PATH   = 40003; // Испытание пути
  4. private static final int ILLUSION_GATE   = 40004; // Испытание дверей
  5. private static final int ILLUSION_SHADOW = 40005; // Испытание теней
Скопировать код
(Потом впишешь эти ID в npc.xml как кастомных «иллюзий».)

🧠 Квест Q93001_IllusionOfDreams.java (скелет под Java 8)
  1. package quests.Q93001_IllusionOfDreams;

  2. import org.l2jmobius.gameserver.model.actor.Npc;
  3. import org.l2jmobius.gameserver.model.actor.Player;
  4. import org.l2jmobius.gameserver.model.quest.Quest;
  5. import org.l2jmobius.gameserver.model.quest.QuestState;
  6. import org.l2jmobius.gameserver.model.quest.State;
  7. import org.l2jmobius.gameserver.network.serverpackets.ExShowScreenMessage;

  8. // Если уже используешь утилиты АСТРЫ – раскомментируешь.
  9. // import astra.AstraFaction;
  10. // import astra.AstraFactionUtil;

  11. /**
  12. * Q93001_IllusionOfDreams
  13. *
  14. * Остров Грёз — линейка из 5 испытаний-головоломок без смерти.
  15. * Игрок по шагам общается с иллюзорными NPC и выбирается с острова.
  16. *
  17. * Этапы (cond):
  18. * 0  – квест не взят
  19. * 1  – старт, пройти Испытание Выбора у Голоса Иллюзии
  20. * 2  – пройти Испытание Памяти
  21. * 3  – пройти Испытание Пути
  22. * 4  – пройти Испытание Дверей
  23. * 5  – пройти Испытание Теней
  24. * 6  – финал, получение награды и выход с острова
  25. */
  26. public class Q93001_IllusionOfDreams extends Quest
  27. {
  28.     // ID квеста
  29.     private static final int QUEST_ID = 93001;
  30.    
  31.     // NPC
  32.     private static final int ILLUSION_VOICE = 40001;  // Голос Иллюзии (старт/финал)
  33.     private static final int ILLUSION_MEMORY = 40002; // Испытание Памяти
  34.     private static final int ILLUSION_PATH = 40003;   // Испытание Пути
  35.     private static final int ILLUSION_GATE = 40004;   // Испытание Дверей
  36.     private static final int ILLUSION_SHADOW = 40005; // Испытание Теней
  37.    
  38.     // Пример предметов (свитки / эхо / награды) – подставишь свои ID
  39.     private static final int SCROLL_DREAM = 90001;       // Свиток Сновидения (телепорт на остров)
  40.     private static final int SCROLL_AWAKENING = 90002;   // Свиток Пробуждения (выход)
  41.     private static final int REWARD_ECHO_OF_DREAMS = 90003; // Эхо Грёз (квестовая награда)
  42.    
  43.     public Q93001_IllusionOfDreams()
  44.     {
  45.         super(QUEST_ID);
  46.         
  47.         // Стартовый NPC – Голос Иллюзии
  48.         addStartNpc(ILLUSION_VOICE);
  49.         addTalkId(ILLUSION_VOICE, ILLUSION_MEMORY, ILLUSION_PATH, ILLUSION_GATE, ILLUSION_SHADOW);
  50.         
  51.         // Здесь нет убийств и дропа – чисто разговоры и эвенты.
  52.     }
  53.    
  54.     @Override
  55.     public String onAdvEvent(String event, Npc npc, Player player)
  56.     {
  57.         String html = null;
  58.         final QuestState qs = getQuestState(player, false);
  59.         if (qs == null)
  60.         {
  61.             return html;
  62.         }
  63.         
  64.         // -------------------------
  65.         // СТАРТ КВЕСТА
  66.         // -------------------------
  67.         if (event.equals("start_quest"))
  68.         {
  69.             if (qs.isCreated())
  70.             {
  71.                 qs.startQuest();
  72.                 qs.setCond(1, true); // Переход к Испытанию 1
  73.                 // Можешь выдать телепорт на остров или сразу считать, что игрок уже там.
  74.                 // giveItems(player, SCROLL_DREAM, 1);
  75.                 showScreenMessage(player, "Остров Грёз окутывает тебя иллюзиями...", 5000);
  76.                 html = "illusion_voice_start_ok.htm";
  77.             }
  78.         }
  79.         // -------------------------
  80.         // ИСПЫТАНИЕ 1: ВЫБОР
  81.         // -------------------------
  82.         else if (event.startsWith("choice_") && (npc.getId() == ILLUSION_VOICE))
  83.         {
  84.             if (qs.getCond() == 1)
  85.             {
  86.                 // event может быть: choice_1, choice_2, choice_3
  87.                 final int choice;
  88.                 try
  89.                 {
  90.                     choice = Integer.parseInt(event.substring("choice_".length()));
  91.                 }
  92.                 catch (NumberFormatException e)
  93.                 {
  94.                     return null;
  95.                 }
  96.                
  97.                 // Здесь можно добавить логику в зависимости от доминирующей фракции.
  98.                 // Например:
  99.                 // final AstraFaction faction = AstraFactionUtil.getDominantFaction();
  100.                 // int correctChoice = getCorrectChoiceByFaction(faction);
  101.                
  102.                 // Пока делаем тупо: правильный ответ = 3 ("Истину")
  103.                 final int correctChoice = 3;
  104.                
  105.                 if (choice == correctChoice)
  106.                 {
  107.                     qs.setCond(2, true); // Переход к Испытанию Памяти
  108.                     showScreenMessage(player, "Твой выбор отзывается в глубине Острова Грёз...", 5000);
  109.                     html = "illusion_voice_choice_success.htm";
  110.                 }
  111.                 else
  112.                 {
  113.                     // Неверный выбор – можно сделать телепорт в начало острова или просто язвительную реплику
  114.                     showScreenMessage(player, "Иллюзия смеётся над твоим выбором...", 4000);
  115.                     html = "illusion_voice_choice_fail.htm";
  116.                 }
  117.             }
  118.         }
  119.         // -------------------------
  120.         // ИСПЫТАНИЕ 2: ПАМЯТЬ
  121.         // -------------------------
  122.         else if (event.startsWith("memory_answer_") && (npc.getId() == ILLUSION_MEMORY))
  123.         {
  124.             if (qs.getCond() == 2)
  125.             {
  126.                 // answer_1, answer_2, ...
  127.                 final int answer;
  128.                 try
  129.                 {
  130.                     answer = Integer.parseInt(event.substring("memory_answer_".length()));
  131.                 }
  132.                 catch (NumberFormatException e)
  133.                 {
  134.                     return null;
  135.                 }
  136.                
  137.                 // Здесь потом можешь сделать генерацию последовательности и проверку из vars.
  138.                 // Сейчас: правильный ответ = 2
  139.                 final int correctAnswer = 2;
  140.                
  141.                 if (answer == correctAnswer)
  142.                 {
  143.                     qs.setCond(3, true); // Переход к Испытанию Пути
  144.                     showScreenMessage(player, "Память не подвела тебя. Иллюзии уступают...", 5000);
  145.                     html = "illusion_memory_success.htm";
  146.                 }
  147.                 else
  148.                 {
  149.                     showScreenMessage(player, "Мысли путаются. Попробуй ещё раз...", 4000);
  150.                     html = "illusion_memory_fail.htm";
  151.                 }
  152.             }
  153.         }
  154.         // -------------------------
  155.         // ИСПЫТАНИЕ 3: ПУТЬ
  156.         // -------------------------
  157.         else if (event.equals("path_success") && (npc.getId() == ILLUSION_PATH))
  158.         {
  159.             if (qs.getCond() == 3)
  160.             {
  161.                 // Сюда ты будешь вызывать event, когда игрок дошёл по правильному пути (через триггер/зону)
  162.                 qs.setCond(4, true);
  163.                 showScreenMessage(player, "Ты находишь верный путь сквозь пустоту...", 5000);
  164.                 html = "illusion_path_success.htm";
  165.             }
  166.         }
  167.         else if (event.equals("path_fail") && (npc.getId() == ILLUSION_PATH))
  168.         {
  169.             if (qs.getCond() == 3)
  170.             {
  171.                 // Неверный шаг – отправь игрока обратно на старт испытания (через телепорт в зоне)
  172.                 showScreenMessage(player, "Пустота под ногами. Иллюзия сбросила тебя обратно...", 5000);
  173.                 html = "illusion_path_fail.htm";
  174.             }
  175.         }
  176.         // -------------------------
  177.         // ИСПЫТАНИЕ 4: ДВЕРИ
  178.         // -------------------------
  179.         else if (event.startsWith("gate_choice_") && (npc.getId() == ILLUSION_GATE))
  180.         {
  181.             if (qs.getCond() == 4)
  182.             {
  183.                 final int door;
  184.                 try
  185.                 {
  186.                     door = Integer.parseInt(event.substring("gate_choice_".length()));
  187.                 }
  188.                 catch (NumberFormatException e)
  189.                 {
  190.                     return null;
  191.                 }
  192.                
  193.                 // Пока: правильная дверь №1
  194.                 final int correctDoor = 1;
  195.                
  196.                 if (door == correctDoor)
  197.                 {
  198.                     qs.setCond(5, true); // Переход к Испытанию Теней
  199.                     showScreenMessage(player, "За этой дверью — не конец, но ты ближе к пробуждению...", 5000);
  200.                     html = "illusion_gate_success.htm";
  201.                 }
  202.                 else
  203.                 {
  204.                     showScreenMessage(player, "Не та дверь. Иллюзия водит тебя кругами...", 5000);
  205.                     html = "illusion_gate_fail.htm";
  206.                 }
  207.             }
  208.         }
  209.         // -------------------------
  210.         // ИСПЫТАНИЕ 5: ТЕНИ
  211.         // -------------------------
  212.         else if (event.startsWith("shadow_choice_") && (npc.getId() == ILLUSION_SHADOW))
  213.         {
  214.             if (qs.getCond() == 5)
  215.             {
  216.                 final int shadow;
  217.                 try
  218.                 {
  219.                     shadow = Integer.parseInt(event.substring("shadow_choice_".length()));
  220.                 }
  221.                 catch (NumberFormatException e)
  222.                 {
  223.                     return null;
  224.                 }
  225.                
  226.                 // Правильная "тень" – №2 (потом можно завязать на фракции/рандоме)
  227.                 final int correctShadow = 2;
  228.                
  229.                 if (shadow == correctShadow)
  230.                 {
  231.                     qs.setCond(6, true);
  232.                     showScreenMessage(player, "Ты различаешь себя среди теней. Иллюзии отступают...", 5000);
  233.                     html = "illusion_shadow_success.htm";
  234.                 }
  235.                 else
  236.                 {
  237.                     showScreenMessage(player, "Тень поглотила твой образ. Но это лишь сон...", 5000);
  238.                     html = "illusion_shadow_fail.htm";
  239.                 }
  240.             }
  241.         }
  242.         // -------------------------
  243.         // ФИНАЛ – ПОЛУЧЕНИЕ НАГРАДЫ И ВЫХОД
  244.         // -------------------------
  245.         else if (event.equals("finish_quest") && (npc.getId() == ILLUSION_VOICE))
  246.         {
  247.             if (qs.isCond(6))
  248.             {
  249.                 // Выдаём награду один раз
  250.                 if (!qs.isCompleted())
  251.                 {
  252.                     giveItems(player, REWARD_ECHO_OF_DREAMS, 1);
  253.                     giveItems(player, SCROLL_AWAKENING, 1); // Свиток выхода, если хочешь
  254.                     addExpAndSp(player, 5_000_000, 5_000); // Подгони под свой сервер
  255.                 }
  256.                 qs.exitQuest(false, true);
  257.                 showScreenMessage(player, "Ты пробуждаешься от снов Острова Грёз...", 5000);
  258.                 html = "illusion_voice_finish.htm";
  259.             }
  260.         }
  261.         
  262.         return html;
  263.     }
  264.    
  265.     @Override
  266.     public String onTalk(Npc npc, Player player)
  267.     {
  268.         String html = getNoQuestMsg(player);
  269.         final QuestState qs = getQuestState(player, true);
  270.         
  271.         switch (npc.getId())
  272.         {
  273.             case ILLUSION_VOICE:
  274.             {
  275.                 if (qs.isCreated())
  276.                 {
  277.                     html = "illusion_voice_start.htm"; // Приглашение начать испытания
  278.                 }
  279.                 else if (qs.isStarted())
  280.                 {
  281.                     if (qs.isCond(1))
  282.                     {
  283.                         html = "illusion_voice_cond1.htm"; // Напоминание про выбор
  284.                     }
  285.                     else if (qs.isCond(6))
  286.                     {
  287.                         html = "illusion_voice_ready_finish.htm"; // Готов завершить
  288.                     }
  289.                     else
  290.                     {
  291.                         html = "illusion_voice_inprogress.htm"; // Общий текст в процессе
  292.                     }
  293.                 }
  294.                 else if (qs.isCompleted())
  295.                 {
  296.                     html = "illusion_voice_completed.htm";
  297.                 }
  298.                 break;
  299.             }
  300.             case ILLUSION_MEMORY:
  301.             {
  302.                 if (qs.isStarted() && qs.isCond(2))
  303.                 {
  304.                     html = "illusion_memory_start.htm";
  305.                 }
  306.                 else
  307.                 {
  308.                     html = "illusion_generic_no.htm";
  309.                 }
  310.                 break;
  311.             }
  312.             case ILLUSION_PATH:
  313.             {
  314.                 if (qs.isStarted() && qs.isCond(3))
  315.                 {
  316.                     html = "illusion_path_start.htm";
  317.                 }
  318.                 else
  319.                 {
  320.                     html = "illusion_generic_no.htm";
  321.                 }
  322.                 break;
  323.             }
  324.             case ILLUSION_GATE:
  325.             {
  326.                 if (qs.isStarted() && qs.isCond(4))
  327.                 {
  328.                     html = "illusion_gate_start.htm";
  329.                 }
  330.                 else
  331.                 {
  332.                     html = "illusion_generic_no.htm";
  333.                 }
  334.                 break;
  335.             }
  336.             case ILLUSION_SHADOW:
  337.             {
  338.                 if (qs.isStarted() && qs.isCond(5))
  339.                 {
  340.                     html = "illusion_shadow_start.htm";
  341.                 }
  342.                 else
  343.                 {
  344.                     html = "illusion_generic_no.htm";
  345.                 }
  346.                 break;
  347.             }
  348.         }
  349.         return html;
  350.     }
  351.    
  352.     private void showScreenMessage(Player player, String text, int time)
  353.     {
  354.         // Небольшая утилита, чтобы не копипастить пакеты по квесту.
  355.         player.sendPacket(new ExShowScreenMessage(text, time));
  356.     }
  357.    
  358.     public static void main(String[] args)
  359.     {
  360.         new Q93001_IllusionOfDreams();
  361.     }
  362.    
  363.     // -------------------------
  364.     // Пример, как потом можно будет завязать выбор на фракции АСТРЫ
  365.     // -------------------------
  366.     /*
  367.     private int getCorrectChoiceByFaction(AstraFaction faction)
  368.     {
  369.         switch (faction)
  370.         {
  371.             case CHAOS:
  372.                 return 1;
  373.             case LIGHT:
  374.                 return 3;
  375.             case DARK:
  376.                 return 2;
  377.         }
  378.         return 3;
  379.     }
  380.     */
  381. }
Скопировать код
🧾 Что тебе ещё нужно будет сделать
  • HTML-файлы в папке
    dist/game/data/scripts/quests/Q93001_IllusionOfDreams/

Примеры имён, которые я использовала в коде:
  • illusion_voice_start.htm – старт диалога с кнопкой bypass -h Quest Q93001_IllusionOfDreams start_quest
  • illusion_voice_choice_success.htm / illusion_voice_choice_fail.htm
  • illusion_memory_start.htm, illusion_memory_success.htm, illusion_memory_fail.htm
  • illusion_path_start.htm, illusion_path_success.htm, illusion_path_fail.htm
  • illusion_gate_start.htm, illusion_gate_success.htm, illusion_gate_fail.htm
  • illusion_shadow_start.htm, illusion_shadow_success.htm, illusion_shadow_fail.htm
  • illusion_voice_finish.htm, illusion_voice_ready_finish.htm, illusion_voice_completed.htm
  • illusion_generic_no.htm – заглушка «ты ещё не дошёл до этой части иллюзий»

  • В HTML добавить кнопки под эвенты, например:


  1. <Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q93001_IllusionOfDreams choice_1">Ищу выход</Button>
  2. <Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q93001_IllusionOfDreams choice_2">Ищу силу</Button>
  3. <Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q93001_IllusionOfDreams choice_3">Ищу истину</Button>
Скопировать код
3. NPC вписать в npc.xml и спавн на Острове Грёз.
4. Когда захочешь – доработаем:
  • генерацию последовательностей для памяти,
  • завязку правильных ответов на CHAOS/LIGHT/DARK,
  • триггеры по зонам для пути и дверей.

Ниже — готовые HTML-файлы под те имена, которые уже используются в Java.

illusion_voice_start.htm
Первый разговор с Голосом Иллюзии, предложение начать квест.

  1. <html><body>
  2. Голос Иллюзии:<br>
  3. ...Слышишь? Это не шаги, это эхо твоих собственных мыслей.<br>
  4. Ты пришёл на Остров Грёз, где всё вокруг — лишь отражения того, что у тебя внутри.<br>
  5. <br>
  6. Хочешь пройти испытания иллюзий и найти выход из этого места?<br>
  7. <br>
  8. <!-- EN:
  9. Voice of Illusion:
  10. ...Do you hear it? These are not footsteps, but echoes of your own thoughts.
  11. You have come to the Isle of Dreams, where everything around you is just a reflection of what is inside you.
  12. Do you want to face the trials of illusions and find a way out of this place?
  13. -->
  14. <Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q93001_IllusionOfDreams start_quest">
  15. Начать испытания Острова Грёз
  16. </Button>
  17. <Button ALIGN=LEFT ICON="RETURN" action="bypass -h npc_%objectId%_Chat 0">
  18. Я ещё не готов
  19. </Button>
  20. </body></html>
Скопировать код
illusion_voice_start_ok.htm
Ответ после нажатия «start_quest»
  1. <html><body>
  2. Голос Иллюзии:<br>
  3. Тогда запомни простую вещь: здесь не убивают тело — здесь проверяют голову.<br>
  4. Каждая ошибка вернёт тебя назад, но не убьёт.<br>
  5. <br>
  6. Первое испытание простое: скажи, чего ты на самом деле ищешь.<br>
  7. <br>
  8. Иди вперёд и слушай, что ответишь сам себе.<br>
  9. <!-- EN: Then remember: nothing here kills your body — only tests your mind. -->
  10. </body></html>
Скопировать код
illusion_voice_cond1.htm
Игрок уже начал квест, но ещё не прошёл первое испытание.
  1. <html><body>
  2. Голос Иллюзии:<br>
  3. Ты всё ещё на пороге. Остров ждёт, когда ты сделаешь первый осознанный выбор.<br>
  4. Подойди ближе и ответь: чего ты ищешь в этих снах?<br>
  5. <br>
  6. <!-- EN: You are still at the threshold. The Island is waiting for your first conscious choice. -->
  7. </body></html>
Скопировать код
illusion_voice_inprogress.htm
Квест идёт, но ещё не финал, и игрок не на cond=1 и не на cond=6.
  1. <html><body>

  2. Голос Иллюзии:<br>

  3. Иллюзии уже играют с тобой. Не спеши просыпаться — сначала разберись, кто здесь главнее: они или ты.<br>

  4. <br>

  5. Продолжай свои испытания. Этот сон ещё не закончен.<br>

  6. <!-- EN: Illusions are already playing with you. Don't rush to wake up — finish the trials first. -->


  7. </body></html>
Скопировать код


illusion_voice_ready_finish.htm
Игрок прошёл все 5 испытаний (cond=6), но ещё не нажал «finish_quest».

  1. <html><body>
  2. Голос Иллюзии:<br>
  3. Ты прошёл все пять испытаний, и Остров Грёз больше не может удерживать тебя.<br>
  4. <br>
  5. Хочешь проснуться — или остаться здесь ещё немного и притвориться, что это реальность?<br>
  6. <br>
  7. <!-- EN: You have passed all five trials. Do you want to wake up or stay in this dream a little longer? -->
  8. <Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q93001_IllusionOfDreams finish_quest">
  9. Пробудиться и получить награду
  10. </Button>
  11. <Button ALIGN=LEFT ICON="RETURN" action="bypass -h npc_%objectId%_Chat 0">
  12. Останусь ещё немного
  13. </Button>
  14. </body></html>
Скопировать код
illusion_voice_finish.htm
Финальный текст после выдачи награды.
  1. <html><body>
  2. Голос Иллюзии:<br>
  3. Сон отпускает. Иллюзии больше не цепляются за твоё сознание.<br>
  4. То, что ты увидел здесь, — всего лишь отражение, но выводы ты сделаешь уже наяву.<br>
  5. <br>
  6. Если когда-нибудь вновь захочешь испытать себя — Остров Грёз запомнит тебя.<br>
  7. <!-- EN: The dream releases you. What you saw here was only a reflection, but conclusions you will make in the real world. -->
  8. </body></html>
Скопировать код
illusion_voice_choice_success.htm
Успешный выбор в первом испытании (choice_3).
  1. <html><body>
  2. Голос Иллюзии:<br>
  3. Выход? Сила? Ты серьёзно?<br>
  4. <br>
  5. На Острове Грёз такие ответы чаще всего ведут по кругу.<br>
  6. Попробуй ещё раз — но в этот раз подумай, а не просто нажми.<br>
  7. <!-- EN: Such answers usually lead in circles. Try again, but think this time. -->
  8. </body></html>
Скопировать код
illusion_voice_completed.htm
Если игрок повторно разговаривает после завершённого квеста.
  1. <html><body>
  2. Голос Иллюзии:<br>
  3. Мы уже видели твой сон.<br>
  4. Остров Грёз помнит тебя, даже если ты сам делаешь вид, что забыл.<br>
  5. <br>
  6. Возвращайся, если захочешь ещё раз пройти через свои иллюзии.<br>
  7. <!-- EN: The Island remembers you. Come back if you want to walk through your illusions again. -->
  8. </body></html>
Скопировать код
Блок 2. Образ Памяти (Испытание 2)
illusion_memory_start.htm
  1. <html><body>
  2. Образ Памяти:<br>
  3. Память — первая вещь, которую пожирают иллюзии.<br>
  4. Я покажу тебе несколько образов. Запомни их порядок.<br>
  5. <br>
  6. <font color="LEVEL">Пламя.</font><br>
  7. <font color="LEVEL">Сны.</font><br>
  8. <font color="LEVEL">Тени.</font><br>
  9. <font color="LEVEL">Пепел.</font><br>
  10. <br>
  11. Теперь скажи: <font color="LEVEL">какое слово было вторым?</font><br>
  12. <br>
  13. <!-- EN: Flame – Dreams – Shadows – Ash. Which word was second? -->
  14. <Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q93001_IllusionOfDreams memory_answer_1">
  15. «Пламя»
  16. </Button>
  17. <Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q93001_IllusionOfDreams memory_answer_2">
  18. «Сны»
  19. </Button>
  20. <Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q93001_IllusionOfDreams memory_answer_3">
  21. «Тени»
  22. </Button>
  23. <Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q93001_IllusionOfDreams memory_answer_4">
  24. «Пепел»
  25. </Button>
  26. </body></html>
Скопировать код
(В коде правильный ответ сейчас 2 — «Сны».)


illusion_memory_success.htm
  1. <html><body>
  2. Образ Памяти:<br>
  3. Вот так всё и начинается: сначала путаются слова, потом — решения.<br>
  4. <br>
  5. Не страшно. Это ещё сон, а не приговор.<br>
  6. Соберись и попробуй ещё раз.<br>
  7. <!-- EN: This is how it starts: first words get mixed, then choices. Try again. -->
  8. </body></html>
Скопировать код
Блок 3. Иллюзия Пути (Испытание 3)illusion_path_start.htm
  1. <html><body>
  2. Иллюзия Пути:<br>
  3. Перед тобой — дорога, которой на самом деле нет.<br>
  4. Каждый шаг либо приблизит тебя к выходу, либо вернёт в начало.<br>
  5. <br>
  6. Смотри под ноги и доверься интуиции, а не привычке бежать по прямой.<br>
  7. Когда дойдёшь до конца, вернись ко мне — и я признаю твою победу.<br>
  8. <!-- EN: Every step either leads you forward or drops you back. Reach the end and return to me. -->
  9. </body></html>
Скопировать код
illusion_path_success.htm
  1. <html><body>
  2. Иллюзия Пути:<br>
  3. Вот видишь — путь существовал только потому, что ты продолжал идти.<br>
  4. <br>
  5. Теперь тебя ждёт другое испытание — двери, за которыми не всегда то, что кажется.<br>
  6. Ищущий дорогу уже сделал половину работы.<br>
  7. <!-- EN: The path existed only because you kept walking. Now go to the gates. -->
  8. </body></html>
Скопировать код
illusion_path_fail.htm
  1. <html><body>
  2. Иллюзия Пути:<br>
  3. Пустота под ногами — лучший аргумент в пользу того, что ты поспешил.<br>
  4. <br>
  5. Остров не злой — он просто честно показывает, куда ведёт невнимательность.<br>
  6. Подумай и попробуй снова.<br>
  7. <!-- EN: The void under your feet is proof you rushed. Think and try again. -->
  8. </body></html>
Скопировать код
Блок 4. Страж Дверей (Испытание 4)illusion_gate_start.htm
  1. <html><body>
  2. Страж Дверей:<br>
  3. Три двери. Три выхода. Три варианта ошибиться.<br>
  4. <br>
  5. За одной дверью — следующий шаг сна.<br>
  6. За двумя другими — круг по этому же месту.<br>
  7. <br>
  8. Выбирай:<br>
  9. <!-- EN: Three doors. One leads forward, two send you in circles. -->
  10. <Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q93001_IllusionOfDreams gate_choice_1">
  11. Войти в левую дверь
  12. </Button>
  13. <Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q93001_IllusionOfDreams gate_choice_2">
  14. Войти в среднюю дверь
  15. </Button>
  16. <Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q93001_IllusionOfDreams gate_choice_3">
  17. Войти в правую дверь
  18. </Button>
  19. </body></html>
Скопировать код
(Сейчас в коде правильная — 1 / левая.)


illusion_gate_success.htm
  1. <html><body>
  2. Страж Дверей:<br>
  3. Редко кто с первого раза выбирает ту дверь, которая действительно ведёт дальше.<br>
  4. <br>
  5. Запомни: чаще всего правильный путь выглядит не самым привлекательным.<br>
  6. Иди, тебя ждут твои собственные тени.<br>
  7. <!-- EN: You chose the door that truly leads forward. Now, face your own shadows. -->
  8. </body></html>
Скопировать код
illusion_gate_fail.htm
  1. <html><body>
  2. Страж Дверей:<br>
  3. Ну что, поддался на красивую иллюзию?<br>
  4. <br>
  5. Ничего страшного. Здесь максимум — круг по Острову Грёз, а не конец света.<br>
  6. Возвращайся и попробуй ещё раз.<br>
  7. <!-- EN: You fell for a pretty illusion. Come back and try another door. -->
  8. </body></html>
Скопировать код
Блок 5. Тень Сновидения (Испытание 5)illusion_shadow_start.htm
  1. <html><body>
  2. Тень Сновидения:<br>
  3. Вот тут начинается самое интересное.<br>
  4. <br>
  5. Вокруг тебя — образы, похожие на тебя самого.<br>
  6. Они знают твои жесты, твои привычки, даже твои ошибки.<br>
  7. <br>
  8. Найди среди них того, кто действительно похож на <font color="LEVEL">тебя</font>, а не на то, каким ты притворяешься.<br>
  9. <!-- EN: Around you are reflections that look like you. Find the one that is truly you. -->
  10. <Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q93001_IllusionOfDreams shadow_choice_1">
  11. Осмотреть первую тень
  12. </Button>
  13. <Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q93001_IllusionOfDreams shadow_choice_2">
  14. Осмотреть вторую тень
  15. </Button>
  16. <Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q93001_IllusionOfDreams shadow_choice_3">
  17. Осмотреть третью тень
  18. </Button>
  19. <Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q93001_IllusionOfDreams shadow_choice_4">
  20. Осмотреть четвёртую тень
  21. </Button>
  22. </body></html>
Скопировать код
(В коде правильная — 2.)

illusion_shadow_success.htm
  1. <html><body>
  2. Тень Сновидения:<br>
  3. Ты узнал себя, даже когда вокруг были более удобные и красивые варианты.<br>
  4. <br>
  5. Иллюзии больше не могут удерживать тебя здесь.<br>
  6. Возвращайся к Голосу Иллюзии — он покажет выход из этого сна.<br>
  7. <!-- EN: You recognized yourself among the shadows. Return to the Voice of Illusion. -->
  8. </body></html>
Скопировать код
illusion_shadow_fail.htm
  1. <html><body>
  2. Тень Сновидения:<br>
  3. Вот так люди и теряются — выбирают того, кем проще быть, а не того, кто они есть.<br>
  4. <br>
  5. Хорошая новость: здесь за это не наказывают, здесь просто отправляют на второй круг.<br>
  6. Попробуй ещё раз.<br>
  7. <!-- EN: You chose the easier version of yourself. Try again. -->
  8. </body></html>
Скопировать код
Общая заглушкаillusion_generic_no.htm
  1. <html><body>
  2. Иллюзия:<br>
  3. Ты ещё не дошёл до этой части сна.<br>
  4. <br>
  5. Вернись к тем испытаниям, которые уже ждут тебя.<br>
  6. <!-- EN: You haven't reached this part of the dream yet. -->
  7. </body></html>
Скопировать код
GPT
https://chatgpt.com/g/g-p-689b22 ... b-baee-94567e60f62f





Хроники Элмориона пишутся каждым шагом путника.
 Автор темы| Опубликовано позавчера 08:43 | Показать все этажи

Остров грез

Остров грез

Хроники Элмориона пишутся каждым шагом путника.
Расширенный режим
B Color Image Link Quote Code Smilies |Загрузить

Правила начисления баллов

Быстрый ответ Наверх Вернуться к списку