Добавлена система квестов

This commit is contained in:
2025-09-24 09:00:34 +03:00
parent 5d19b6339e
commit c189eed962
10 changed files with 1099 additions and 410 deletions

View File

@@ -1,150 +1,30 @@
{
"name": "Галина",
"avatar": "/images/npc/bartender.jpg",
"name": "Искатель приключений",
"avatar": "/images/npc/adventurer.jpg",
"filename": "Adventurer.json",
"npc_id": 3,
"dialogue_key": "adventurer/advice",
"dialog": [
{
"id": 0,
"text": "Ну? Значит, ты к нам за работой припёрся? Ладно, давай документы...",
"text": "А, новое лицо! Ищешь работу? Я бы на твоем месте сначала поговорил со стражником у входа. Он всем новичкам дает наводки.",
"answers": [
{
"text": "Документов нет",
"next": 1
},
{
"text": "Я просто осматриваюсь...",
"next": 2
},
{
"text": "...",
"text": "Спасибо за совет",
"end": true
},
{
"text": "А что ты знаешь о работе?",
"next": 1
}
]
},
{
"id": 1,
"text": "Ах, у тебя их нет? Я бы удивилась другому развитию событий. Тогда придется заполнить их. Писать то хоть умеешь?",
"answers": [
{
"text": "Как-нибудь справлюсь",
"next": "form_data"
},
{
"text": "Может, есть работа без документов?",
"next": 3
}
]
},
{
"id": 2,
"text": "Осматриваешься? Ну-ну... Только не задерживайся слишком долго. В нашем городе без дела болтаться — себе дороже.",
"answers": [
{
"text": "А куда можно пойти?",
"next": 3
},
{
"text": "Ладно, тогда давай документы...",
"next": 1
}
]
},
{
"id": 3,
"text": "Слушай, есть один парень... сидит в кустах за углом. Зовут его Костя Ключник. Он как раз набирает людей для одной работы. Только не говори, что я тебя направила.",
"answers": [
{
"text": "Спасибо, попробую",
"next": 4
},
{
"text": "А что за работа?",
"next": 5
}
]
},
{
"id": 4,
"text": "Ну иди уже, не задерживайся. И смотри в оба — Костя любит шутки, но не над собой.",
"answers": [
{
"end": true
}
]
},
{
"id": 5,
"text": "Если бы я знала все детали, сама бы там работала. Иди сам узнаешь. Если, конечно, не струсишь.",
"answers": [
{
"text": "Ладно, иду",
"next": 4
},
{
"text": "Может, лучше заполню документы?",
"next": "form_data"
}
]
},
{
"id": "form_data",
"type": "form",
"title": "Заполнение анкеты",
"fields": [
{
"name": "skills",
"label": "Твои навыки и перки:",
"type": "text",
"placeholder": "Навыки через запятую",
"required": true
},
{
"name": "work_experience",
"label": "Предыдущие места работы:",
"type": "textarea",
"placeholder": "Где и кем работал",
"required": false
},
{
"name": "background",
"label": "Твое прошлое:",
"type": "textarea",
"placeholder": "Краткая информация о себе",
"required": false
}
],
"submit_text": "Отправить данные",
"next": 6
},
{
"id": 6,
"text": "Так... посмотрим что тут... (долго листает бумаги) Ну ты и говно, дружок. Ладно, есть для тебя один вариант.",
"answers": [
{
"text": "Какой?",
"next": 7
}
]
},
{
"id": 7,
"text": "Слушай сюда. Есть один парень... сидит в кустах за углом. Зовут его Костя Ключник. Он как раз набирает людей. Вот и вся вакансия.",
"answers": [
{
"text": "И это всё?",
"next": 8
},
{
"text": "Ладно, пойду",
"next": 4
}
]
},
{
"id": 8,
"text": "Да, это всё. Ты думал, у нас тут офис белых воротничков? Иди уже, не задерживайся.",
"text": "Я-то? Да много чего... Но сначала пройди базовый инструктаж. Без этого тебя никто серьезный не возьмет.",
"answers": [
{
"text": "Понял, спасибо",
"end": true
}
]

View File

@@ -1,167 +1,47 @@
{
"name": "Костя Ключник",
"avatar": "/images/npc/guard.jpg",
"name": "Пляжный персонаж",
"avatar": "/images/npc/beach_character.jpg",
"filename": "BeachCharacter.json",
"npc_id": 4,
"dialogue_key": "beachcharacter/meet",
"dialog": [
{
"id": 0,
"text": "(нервно озираясь по сторонам) Тссс... Ты кто такой? Мент? А? Нет? Ну ладно... (быстро чешет нос) Галина говорила? Ну эта... которая в баре...",
"text": "Эй, приятель! Ты выглядишь как человек, который ищет приключений. У меня есть одно дельце...",
"answers": [
{
"text": "Да, она направила",
"text": "Какое дело?",
"next": 1
},
{
"text": "Кто такая Галина?",
"next": 2
"text": "Извини, я спешу",
"end": true
}
]
},
{
"id": 1,
"text": "(хихикает) Ага, ну конечно направила... Она у нас вся такая... (внезапно серьёзнеет) Ладно, браток, работа есть. Но сначала... (ковыряет в носу) Ты че, стремаешься?",
"text": "Нужно кое-что доставить в старую часть города. Опасно, но платят хорошо. Заинтересован?",
"answers": [
{
"text": "Какая работа?",
"next": 3
"text": "Расскажи подробнее",
"next": 2
},
{
"text": "Ты че такой странный?",
"next": 4
"text": "Слишком рискованно",
"end": true
}
]
},
{
"id": 2,
"text": "(параноидально оглядывается) Ты че, прикалываешься? Галина! Ну... (делает жест рукой у рта) Которая... Ну в общем... (внезапно меняет тему) Ты хочешь заработать или нет?",
"answers": [
{
"text": "Хочу заработать",
"next": 3
},
{
"text": "Ты точно нормальный?",
"next": 4
}
]
},
{
"id": 3,
"text": "(потирает руки) Оооо, братан, работа огонь! Цифры взламывать будем! (внезапно замолкает, прислушивается) Ты слышал? Нет? Ну ладно... (быстро) Но сначала... (достаёт из кармана пакетик) Хочешь попробовать? Для смелости...",
"answers": [
{
"text": "Давай попробую",
"next": 5
},
{
"text": "Нет, я не употребляю",
"next": 6
}
]
},
{
"id": 4,
"text": "(нервно смеётся) Нормальный? Да я самый нормальный тут! (вдруг серьёзнеет) Вот только вчера... Нет, не буду рассказывать... (глаза бегают) Ты работу хочешь или нет?",
"answers": [
{
"text": "Хочу работу",
"next": 3
},
{
"text": "Ты пугаешь меня",
"next": 7
}
]
},
{
"id": 5,
"text": "(радостно) Ооо, наш человек! (суёт пакетик) На вот, только не всё сразу, а то... (делает широкий жест руками) Бах! И тебя нет! Ха-ха! Ладно, заходи завтра, когда... ну... разберёшься со своими делами. Я тебе всё расскажу.",
"answers": [
{
"text": "Ладно, приду завтра",
"next": 8,
"quest_start": "hack_job"
},
{
"text": "Может лучше прямо сейчас?",
"next": 9
}
]
},
{
"id": 6,
"text": "(разочарованно) Фу, скукота... (пожимает плечами) Ну ладно, работа всё равно есть. Заходи завтра, я тебе всё расскажу. Только... (понижает голос) Никому не говори, ладно?",
"answers": [
{
"text": "Хорошо, приду завтра",
"next": 8,
"quest_start": "hack_job"
},
{
"text": "А можно подробнее?",
"next": 10
}
]
},
{
"id": 7,
"text": "(внезапно злится) Пугаю? Да я тебя... (резко успокаивается) Ладно, братан, иди отсюда. Не для тебя эта работа. (начинает что-то бормотать себе под нос)",
"text": "Встреться с моим контактом у заброшенного дока. Скажешь, что от Кости. Деньги получишь по завершению.",
"answers": [
{
"text": "Договорились",
"end": true
}
]
},
{
"id": 8,
"text": "(кивает) Молодец. Запомни: подвал за углом, охраннику скажешь... (шёпотом) 'берёзовый сок'. Он тебя пропустит. И... (внезапно хватает за руку) Только никому, понял? Ни-ко-му!",
"answers": [
{
"end": true
}
]
},
{
"id": 9,
"text": "(панически) Сейчас? Нет, нет, нет! (осматривается) Слишком много... глаз. Завтра. Только завтра. (начинает быстро уходить)",
"answers": [
{
"end": true
}
]
},
{
"id": 10,
"text": "(нервно оглядывается) Подробнее? Ну... (понижает голос) Есть подвал. Там компы. Надо... ну... (делает движение пальцами как при печати) Взламывать. Охраннику скажешь 'берёзовый сок' - пропустит. Всё. Больше ничего не знаю. (начинает чесаться)",
"answers": [
{
"text": "Понятно, приду завтра",
"next": 8,
"quest_start": "hack_job"
},
{
"text": "Это незаконно!",
"next": 11
}
]
},
{
"id": 11,
"text": "(истерично смеётся) Законно? Ха! В этом городе? (внезапно серьёзнеет) Ладно, иди отсюда, мальчик. Ищи себе 'законную' работу. (поворачивается спиной)",
"answers": [
{
"end": true
}
]
},
{
"id": "hack_job",
"type": "quest",
"title": "Взлом в подвале",
"description": "Нужно проникнуть в подвал, сказав охраннику пароль 'берёзовый сок', и взломать данные",
"location": "/locations/basement.json",
"reward": "500 кредитов",
"next": 8
}
]
}

View File

@@ -2,29 +2,43 @@
"name": "Охранник",
"avatar": "/images/npc/guard.jpg",
"filename": "Oxranik.json",
"npc_id": 5,
"dialogue_key": "oxranik/report",
"dialog": [
{
"id": 0,
"text": "Стоять! Кто такой?",
"text": "Стоять! Что нужно?",
"answers": [
{
"text": "Березовый сок",
"next": 1,
"required_quest": "hack_job"
"text": "Я выполнил задания",
"next": 1
},
{
"text": "Я ошибся дверью",
"text": "Ничего, ошибся",
"end": true
}
]
},
{
"id": 1,
"text": "(кивает) Проходи. Но предупреждаю - если что-то пойдет не так, я тебя не знал.",
"text": "Так... Вижу, ты поработал. Неплохо для новичка. Держи награду и приходи за новыми заданиями завтра.",
"answers": [
{
"text": "Понял",
"quest_progress": "hack_job",
"text": "Спасибо",
"end": true
},
{
"text": "Что дальше?",
"next": 2
}
]
},
{
"id": 2,
"text": "Отдохни сегодня. Завтра будут новые поручения. Спроси у бармена - он знает.",
"answers": [
{
"text": "Понял, до завтра",
"end": true
}
]

View File

@@ -1,42 +1,26 @@
{
"name": "Серега Пират",
"name": "Бармен",
"avatar": "/images/npc/bartender.jpg",
"filename": "bartender.json",
"npc_id": 2,
"dialogue_key": "bartender/dialogue",
"dialog": [
{
"id": 0,
"text": "Ну что, дружок, застрял как муха в паутине? Или просто решил проверить, насколько крепки эти стены?",
"text": "Привет, новичок. Вижу, ты уже поговорил со стражником. Ну что, готов к настоящей работе?",
"answers": [
{
"text": "Я... кажется, ошибся дверью.",
"end": true
},
{
"text": "Мне сказали, тут можно «устроиться». От Галины.",
"next": 2
"text": "Расскажи, что есть",
"next": 1
}
]
},
{
"id": 2,
"text": "Ага, Галка-весточка. Слушай сюда: правила простые — садишься за комп, выполняешь два задания. Первое — по звукам угадаешь пароль. Второе — в финансовых документах найдёшь косяк. Справишься — получишь свои кровные. Не справишься... ну, сам понимаешь.",
"id": 1,
"text": "У меня есть пара контактов. Но сначала послушай того искателя приключений в углу - у него есть полезная информация для новичков.",
"answers": [
{
"text": "И где этот ваш комп?",
"next": 3
},
{
"text": "А сложно будет?",
"next": 3
}
]
},
{
"id": 3,
"text": "*кивает на потрёпанный системник в углу* Там всё включено. Разберёшься. Главное — уши навостри и глаза пошире открой. Как будешь готов — жми любую кнопку.",
"answers": [
{
"text": "*Подойти к компьютеру*",
"text": "Хорошо, поговорю с ним",
"end": true
}
]

View File

@@ -1,102 +1,26 @@
{
"name": "Саша Белый",
"name": "Стражник",
"avatar": "/images/npc/guard.jpg",
"filename": "guard.json",
"npc_id": 1,
"dialogue_key": "guard/intro",
"dialog": [
{
"id": 0,
"text": "А вот и новенький подъехал… Чё, глаза такие круглые? Добро пожаловать в Realternity Moscow City, братан. Тут не экскурсия, так что уши на макушке держи.",
"text": "Стой! Новенький? Добро пожаловать в наш город. Первое правило - хочешь выжить, ищи работу.",
"answers": [
{
"text": "Понял...",
"next": 1
},
{
"text": "Что это за место?",
"text": "Где можно найти работу?",
"next": 1
}
]
},
{
"id": 1,
"text": "Город у нас большой, светится неоном, как новогодняя ёлка, но под этой мишурой — помойка, крысы да волки. Вверх глянешь — небоскрёбы корпораций, вниз — подземка, где людей за карточку еды режут. Каждый тут сам за себя.",
"text": "Начни с таверны. Бармен всегда в курсе, кому нужны руки. Иди к нему.",
"answers": [
{
"text": "И что делать?",
"next": 2
},
{
"text": "Звучит жутко...",
"next": 2
}
]
},
{
"id": 2,
"text": "Первое правило — хочешь жить, ищи работу. Деньги — это воздух. Без них ты тут не человек, а мусор под ногами.",
"answers": [
{
"text": "А если работы нет?",
"next": 3
},
{
"text": "Где искать?",
"next": 4
}
]
},
{
"id": 3,
"text": "Нет работы? Ну, значит, ищешь... альтернативы. Тут таких путей — как тараканов в общаге. Главное — не ной, действуй.",
"answers": [
{
"text": "Какие альтернативы?",
"next": 5
},
{
"text": "Понятно...",
"next": 6
}
]
},
{
"id": 4,
"text": "Короче, если совсем не врубаешься, топай в Центр Трудоустройства «Нижний Эшелон». Там помогут... ну, если не кинут. Смотри в оба, братан.",
"answers": [
{
"text": "Спасибо за совет",
"next": 6
},
{
"text": "А где это?",
"next": 6
}
]
},
{
"id": 5,
"text": "Честный ты, нечестный — неважно. Главное — чтоб ты выбрал, по какой дорожке топать. По свету, по тени… или, может, будешь тем, кто идёт посередине и стреляет в обе стороны. Тут за всё платят — вопрос только, чем.",
"answers": [
{
"text": "Ясно...",
"next": 6
},
{
"text": "Страшновато",
"next": 6
}
]
},
{
"id": 6,
"text": "И запомни: здесь не детский сад. Никто за ручку водить не будет. Или ты адаптируешься… или сгниёшь на подворотне. Всё просто.",
"answers": [
{
"text": "Понял, спасибо",
"end": true
},
{
"text": "До встречи",
"text": "Спасибо, пойду в таверну",
"end": true
}
]