Первый коммит после распаковки архива

This commit is contained in:
2025-08-14 20:14:42 +03:00
commit 5d4e9ba201
354 changed files with 40492 additions and 0 deletions

Binary file not shown.

Binary file not shown.

BIN
public/audio/firs.ogg Normal file

Binary file not shown.

View File

@@ -0,0 +1,153 @@
{
"name": "Галина",
"avatar": "/images/npc/bartender.jpg",
"filename": "Adventurer.json",
"dialog": [
{
"id": 0,
"text": "Ну? Значит, ты к нам за работой припёрся? Ладно, давай документы...",
"answers": [
{
"text": "Документов нет",
"next": 1
},
{
"text": "Я просто осматриваюсь...",
"next": 2
},
{
"text": "...",
"end": true
}
]
},
{
"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": "Да, это всё. Ты думал, у нас тут офис белых воротничков? Иди уже, не задерживайся.",
"answers": [
{
"end": true
}
]
}
]
}

View File

@@ -0,0 +1,167 @@
{
"name": "Костя Ключник",
"avatar": "/images/npc/guard.jpg",
"filename": "BeachCharacter.json",
"dialog": [
{
"id": 0,
"text": "(нервно озираясь по сторонам) Тссс... Ты кто такой? Мент? А? Нет? Ну ладно... (быстро чешет нос) Галина говорила? Ну эта... которая в баре...",
"answers": [
{
"text": "Да, она направила",
"next": 1
},
{
"text": "Кто такая Галина?",
"next": 2
}
]
},
{
"id": 1,
"text": "(хихикает) Ага, ну конечно направила... Она у нас вся такая... (внезапно серьёзнеет) Ладно, браток, работа есть. Но сначала... (ковыряет в носу) Ты че, стремаешься?",
"answers": [
{
"text": "Какая работа?",
"next": 3
},
{
"text": "Ты че такой странный?",
"next": 4
}
]
},
{
"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": "(внезапно злится) Пугаю? Да я тебя... (резко успокаивается) Ладно, братан, иди отсюда. Не для тебя эта работа. (начинает что-то бормотать себе под нос)",
"answers": [
{
"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

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

View File

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

105
public/dialogs/guard.json Normal file
View File

@@ -0,0 +1,105 @@
{
"name": "Саша Белый",
"avatar": "/images/npc/guard.jpg",
"filename": "guard.json",
"dialog": [
{
"id": 0,
"text": "А вот и новенький подъехал… Чё, глаза такие круглые? Добро пожаловать в Realternity Moscow City, братан. Тут не экскурсия, так что уши на макушке держи.",
"answers": [
{
"text": "Понял...",
"next": 1
},
{
"text": "Что это за место?",
"next": 1
}
]
},
{
"id": 1,
"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": "До встречи",
"end": true
}
]
}
]
}

81
public/docker-compose.yml Normal file
View File

@@ -0,0 +1,81 @@
version: "3.8"
services:
cockroachdb:
image: cockroachdb/cockroach:latest-v23.1
command: start-single-node --insecure --store=attrs=ssd,path=/var/lib/cockroach/
restart: "no"
volumes:
- data:/var/lib/cockroach
expose:
- "8080"
- "26257"
ports:
- "26257:26257"
- "8080:8080"
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8080/health?ready=1"]
interval: 3s
timeout: 3s
retries: 5
nakama:
image: registry.heroiclabs.com/heroiclabs/nakama:3.22.0
entrypoint:
- "/bin/sh"
- "-ecx"
- >
/nakama/nakama migrate up --database.address root@cockroachdb:26257 &&
exec /nakama/nakama --name nakama1 --database.address root@cockroachdb:26257 --logger.level DEBUG --session.token_expiry_sec 7200 --metrics.prometheus_port 9100
restart: "no"
links:
- "cockroachdb:db"
depends_on:
cockroachdb:
condition: service_healthy
prometheus:
condition: service_started
environment:
- socket.server_key=mySuperSecretKey123
volumes:
- ./:/nakama/data
expose:
- "7349"
- "7350"
- "7351"
- "9100"
ports:
- "7349:7349"
- "7350:7350"
- "7351:7351"
healthcheck:
test: ["CMD", "/nakama/nakama", "healthcheck"]
interval: 10s
timeout: 5s
retries: 5
prometheus:
image: prom/prometheus
entrypoint: /bin/sh -c
command: |
'sh -s <<EOF
cat > ./prometheus.yml <<EON
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
- job_name: prometheus
static_configs:
- targets: ['localhost:9090']
- job_name: nakama
metrics_path: /
static_configs:
- targets: ['nakama:9100']
EON
prometheus --config.file=./prometheus.yml
EOF'
ports:
- "9090:9090"
environment:
- socket.server_key=SecretKey123321fs
volumes:
data:

BIN
public/images/222.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 101 KiB

BIN
public/images/npc/guard.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 255 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 101 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 255 KiB

17
public/index.html Normal file
View File

@@ -0,0 +1,17 @@
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="utf-8" />
<title>Multiplayer Three.js Game on React</title>
<meta name="viewport"
content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" />
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Expires" content="0" />
<script type="module" src="https://unpkg.com/@google/model-viewer/dist/model-viewer.min.js"></script>
</head>
<body style="margin:0; overflow:hidden;">
<noscript>Для работы приложения требуется включить JavaScript.</noscript>
<div id="root"></div>
</body>
</html>

1
public/jquery.min.js vendored Normal file

File diff suppressed because one or more lines are too long

Binary file not shown.

BIN
public/models/Punk.glb Normal file

Binary file not shown.

Binary file not shown.

BIN
public/models/Xbot.glb Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,155 @@
{
"accessors": [
{
"bufferView": 0,
"componentType": 5126,
"count": 406,
"type": "VEC2"
},
{
"bufferView": 1,
"componentType": 5126,
"count": 406,
"type": "VEC3"
},
{
"bufferView": 2,
"componentType": 5126,
"count": 406,
"type": "VEC4"
},
{
"bufferView": 3,
"componentType": 5126,
"count": 406,
"type": "VEC3",
"max": [
0.02128091,
0.06284806,
0.0138090011
],
"min": [
-0.02128091,
-4.773855E-05,
-0.013809
]
},
{
"bufferView": 4,
"componentType": 5123,
"count": 2046,
"type": "SCALAR"
}
],
"asset": {
"generator": "glTF Tools for Unity",
"version": "2.0"
},
"bufferViews": [
{
"buffer": 0,
"byteLength": 3248
},
{
"buffer": 0,
"byteOffset": 3248,
"byteLength": 4872
},
{
"buffer": 0,
"byteOffset": 8120,
"byteLength": 6496
},
{
"buffer": 0,
"byteOffset": 14616,
"byteLength": 4872
},
{
"buffer": 0,
"byteOffset": 19488,
"byteLength": 4092
}
],
"buffers": [
{
"uri": "Avocado.bin",
"byteLength": 23580
}
],
"images": [
{
"uri": "Avocado_baseColor.png"
},
{
"uri": "Avocado_roughnessMetallic.png"
},
{
"uri": "Avocado_normal.png"
}
],
"meshes": [
{
"primitives": [
{
"attributes": {
"TEXCOORD_0": 0,
"NORMAL": 1,
"TANGENT": 2,
"POSITION": 3
},
"indices": 4,
"material": 0
}
],
"name": "Avocado"
}
],
"materials": [
{
"pbrMetallicRoughness": {
"baseColorTexture": {
"index": 0
},
"metallicRoughnessTexture": {
"index": 1
}
},
"normalTexture": {
"index": 2
},
"name": "2256_Avocado_d"
}
],
"nodes": [
{
"mesh": 0,
"rotation": [
0.0,
1.0,
0.0,
0.0
],
"name": "Avocado"
}
],
"scene": 0,
"scenes": [
{
"nodes": [
0
]
}
],
"textures": [
{
"source": 0
},
{
"source": 1
},
{
"source": 2
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 MiB

BIN
public/models/character.glb Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More