diff --git a/web/minecraft/airship-dock.webp b/web/minecraft/airship-dock.webp new file mode 100644 index 0000000..75a2ebb Binary files /dev/null and b/web/minecraft/airship-dock.webp differ diff --git a/web/minecraft/create-foundry.webp b/web/minecraft/create-foundry.webp new file mode 100644 index 0000000..5b49c2f Binary files /dev/null and b/web/minecraft/create-foundry.webp differ diff --git a/web/minecraft/index.html b/web/minecraft/index.html index 90417e6..9e6c773 100644 --- a/web/minecraft/index.html +++ b/web/minecraft/index.html @@ -5,17 +5,26 @@ gman-world — Minecraft - - + + + +
+ +
+

ТВОЯ МАСТЕРСКАЯ В MINECRAFT

GMAN-WORLD

@@ -31,15 +40,17 @@
+

ЧТО БУДЕМ КРАФТИТЬ?

Верстак приключений

-

КРУТИМ

Механизмы Create

Начни с шестерёнки. А потом попробуй остановиться — мастерская сама себя не построит!

-

ЛЕТАЕМ

Аэронавтика

Засиделся у верстака? Пора наверх. Там облака и отличный вид на твою базу.

-

ВЫРАЩИВАЕМ

Виноделье

Пока механизмы работают, займись виноградником. И оставь место под бочки!

+
Медные котлы, шестерни и конвейеры в блочной мастерской.

КРУТИМ

Механизмы Create

Начни с шестерёнки. А потом попробуй остановиться — мастерская сама себя не построит!

+
Дирижабль у медной причальной башни над горами.

ЛЕТАЕМ

Аэронавтика

Засиделся у верстака? Пора наверх. Там облака и отличный вид на твою базу.

+
Механическая винодельня с медными чанами, бочками и виноградником.

ВЫРАЩИВАЕМ

Виноделье

Пока механизмы работают, займись виноградником. И оставь место под бочки!

+

НОВЫЙ ИГРОК

diff --git a/web/minecraft/mechanical-winery.webp b/web/minecraft/mechanical-winery.webp new file mode 100644 index 0000000..b928404 Binary files /dev/null and b/web/minecraft/mechanical-winery.webp differ diff --git a/web/minecraft/motion.js b/web/minecraft/motion.js new file mode 100644 index 0000000..f9f113a --- /dev/null +++ b/web/minecraft/motion.js @@ -0,0 +1,15 @@ +const motionToggle = document.getElementById('motion-toggle'); +const reducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)'); + +function setMotionPaused(isPaused) { + document.documentElement.classList.toggle('motion-running', !isPaused); + motionToggle.setAttribute('aria-pressed', String(isPaused)); + motionToggle.textContent = isPaused ? 'Запустить механизмы' : 'Остановить механизмы'; +} + +setMotionPaused(reducedMotion.matches); +motionToggle.hidden = false; +motionToggle.addEventListener('click', () => { + setMotionPaused(document.documentElement.classList.contains('motion-running')); +}); +reducedMotion.addEventListener('change', event => setMotionPaused(event.matches)); diff --git a/web/minecraft/steam-workshop.webp b/web/minecraft/steam-workshop.webp new file mode 100644 index 0000000..e8e50d8 Binary files /dev/null and b/web/minecraft/steam-workshop.webp differ diff --git a/web/minecraft/style.css b/web/minecraft/style.css index 71b4010..914fb6e 100644 --- a/web/minecraft/style.css +++ b/web/minecraft/style.css @@ -89,3 +89,93 @@ footer span { color: #c5c1ac; font-family: monospace; } .hero { min-height: 720px; padding: 56px; } .hero::before { background: linear-gradient(90deg, #151a14e8, #151a14a3 43%, #151a140d 75%); } } + +/* Copper fittings and moving machinery are decorative layers, clear of controls. */ +.machine-definitions { position: absolute; width: 0; height: 0; overflow: hidden; } +main { position: relative; } +body { background-color: #201d19; } +.nav-actions { display: flex; flex-wrap: wrap; align-items: center; gap: 12px; } +button { cursor: pointer; } +#motion-toggle { font-size: 8px; padding: 12px; } +.topbar, .join-panel, .theme, .downloads section { position: relative; border-color: #3e281a; box-shadow: inset 3px 3px #bc8c56, inset -3px -3px #573820, 5px 5px #0007; } +.topbar::after, .join-panel::after, .theme::after, .downloads section::after { content: ''; position: absolute; inset: 7px; pointer-events: none; background: radial-gradient(circle at 4px 4px, #ffe0a4 0 1px, #a66a3c 2px 3px, #302116 4px, transparent 5px) top left / 10px 10px no-repeat, radial-gradient(circle at 4px 4px, #ffe0a4 0 1px, #a66a3c 2px 3px, #302116 4px, transparent 5px) top right / 10px 10px no-repeat, radial-gradient(circle at 4px 4px, #e5bd79 0 1px, #8a512d 2px 3px, #302116 4px, transparent 5px) bottom left / 10px 10px no-repeat, radial-gradient(circle at 4px 4px, #e5bd79 0 1px, #8a512d 2px 3px, #302116 4px, transparent 5px) bottom right / 10px 10px no-repeat; } +.hero { background-image: url('/minecraft/steam-workshop.webp'); background-position: center; overflow: hidden; } +.hero-copy { position: relative; z-index: 2; } +.join-panel { background: linear-gradient(125deg, #544536f5, #282e28fa); border-width: 6px; } +.hero-machine { position: absolute; right: 3%; bottom: 24px; width: 350px; height: 300px; pointer-events: none; z-index: 1; background: linear-gradient(0deg, #141815cc, transparent); } +.rotor { animation: machine-turn 28s linear infinite; transform-origin: center; transform-box: fill-box; filter: drop-shadow(4px 5px 2px #0009); } +.reverse { animation-direction: reverse; } +.waterwheel { position: absolute; width: 230px; height: 230px; right: 12px; bottom: 20px; animation-duration: 38s; } +.hero-cog { position: absolute; width: 100px; height: 100px; left: 6px; bottom: 20px; } +.hero-cog-small { position: absolute; width: 70px; height: 70px; left: 68px; bottom: 92px; animation-duration: 19.6s; } +.machine-caption { position: absolute; right: 8px; bottom: 0; font: 8px/1.6 var(--pixel); color: #e9bd7a; text-shadow: 2px 2px #000; } +.pipe { position: relative; height: 24px; border: 3px solid #492c1b; background: linear-gradient(#634124, #d5a067 24%, #a96538 50%, #5f3c26 85%, #9e6439); box-shadow: 0 5px #0005, inset 0 1px #f8cf96; pointer-events: none; } +.pipe-bridge { margin: -20px 18px 32px; } +.pipe-joint, .pipe::before, .pipe::after { content: ''; position: absolute; top: -8px; height: 34px; width: 14px; border: 3px solid #492e1d; background: linear-gradient(90deg, #9a6038, #e5b57d 50%, #6d4026); box-shadow: 2px 2px #0004; } +.pipe::before { left: 12%; } +.pipe::after { right: 12%; } +.pipe-joint { left: 65%; } +.valve { position: absolute; left: 32%; top: -20px; width: 44px; height: 44px; border: 6px solid #ae633c; border-radius: 50%; background: radial-gradient(circle, #d7a16a 0 4px, transparent 5px), linear-gradient(90deg, transparent 43%, #ae633c 43% 57%, transparent 57%), linear-gradient(transparent 43%, #ae633c 43% 57%, transparent 57%); box-shadow: 2px 3px #281a12; } +.machine-pipe { position: absolute; left: 0; right: 0; top: 48px; } +.gauge { position: relative; width: 70px; height: 70px; border: 7px solid #a57040; border-radius: 50%; background: repeating-conic-gradient(from -120deg, #5a4630 0deg 3deg, transparent 3deg 30deg), #ddcea6; box-shadow: inset 0 0 0 5px #eedcb4, 0 0 0 3px #35261b, 4px 5px #0005; } +.gauge::after { content: ''; position: absolute; width: 10px; height: 10px; border-radius: 50%; background: #73432a; left: calc(50% - 5px); top: calc(50% - 5px); } +.needle { position: absolute; width: 24px; height: 3px; left: 50%; top: calc(50% - 1px); background: #8a3429; transform-origin: left center; animation: pressure 7s ease-in-out infinite alternate; } +.hero-machine > .gauge { position: absolute; top: 0; left: 95px; } +.steam { position: absolute; width: 80px; height: 130px; bottom: 35px; right: 16px; pointer-events: none; } +.steam i { position: absolute; width: 30px; height: 30px; left: 20px; bottom: 0; border-radius: 35%; background: #f0e7cd; opacity: 0; animation: steam-rise 5s ease-out infinite; } +.steam i:nth-child(2) { animation-delay: -1.7s; left: 10px; } +.steam i:nth-child(3) { animation-delay: -3.4s; left: 30px; } +.hero-machine > .steam { top: -100px; left: 0; } +.pipe-bridge > .steam { bottom: 10px; right: 22%; } +.world-grid { gap: 24px; } +.theme { padding: 18px; background-image: linear-gradient(135deg, #9c69451a, #0002); } +.scene { position: relative; margin: -2px -2px 22px; border: 3px solid #291e15; box-shadow: 0 0 0 2px #ad794b; overflow: hidden; } +.scene img { display: block; width: 100%; height: auto; aspect-ratio: 3 / 2; object-fit: cover; } +.card-rotor { position: absolute; width: 72px; height: 72px; bottom: 8px; right: 10px; background: #29261caa; border: 3px solid #a77a44; border-radius: 50%; } +.aviation .card-rotor { animation-duration: 4s; } +.theme-symbol { width: 52px; height: 52px; border-width: 3px; float: right; margin: 0 0 10px 10px; } +.theme-symbol svg { width: 36px; height: 36px; } +.theme .eyebrow { margin-top: 0; padding-top: 12px; } +.theme h3 { clear: both; } +.lower-pipe { margin-top: 46px; margin-bottom: 40px; } +.downloads section { background-color: #454b43; border-width: 6px; } +.side-machine { display: none; position: absolute; top: 240px; width: 75px; height: 570px; pointer-events: none; } +.side-machine-left { left: -64px; } +.side-machine-right { right: -64px; } +.side-cog { position: absolute; width: 85px; height: 85px; top: 80px; left: -12px; } +.side-cog-small { position: absolute; width: 58px; height: 58px; top: 146px; left: 26px; animation-duration: 19s; } +.side-machine-left > .gauge { position: absolute; top: 260px; left: 0; } +.chain-drive { position: absolute; top: 0; left: 17px; height: 430px; width: 35px; border: 7px solid #82552f; border-radius: 22px; background: repeating-linear-gradient(#b8a07b 0 6px, #292821 6px 14px); background-size: 100% 14px; box-shadow: inset 0 0 0 5px #211b15, 3px 3px #0007; animation: chain-run 1.5s linear infinite; } +.vertical-pipe { position: absolute; left: 20px; top: 30px; width: 24px; height: 500px; background: linear-gradient(90deg, #634124, #d5a067 24%, #a96538 50%, #5f3c26 85%, #9e6439); } +.vertical-pipe::before, .vertical-pipe::after { width: 36px; height: 14px; left: -9px; } +.vertical-pipe::before { top: 80px; } +.vertical-pipe::after { top: 410px; } +.side-machine-right > .valve { top: 100px; left: 10px; } +.side-machine-right > .gauge { top: 210px; left: 0; } +.side-machine-right > .steam { top: -90px; right: 0; } +@keyframes machine-turn { to { transform: rotate(360deg); } } +@keyframes pressure { from { transform: rotate(-130deg); } to { transform: rotate(-50deg); } } +@keyframes steam-rise { 0% { opacity: 0; transform: translate(0, 0) scale(.4); } 15% { opacity: .4; } 100% { opacity: 0; transform: translate(15px, -120px) scale(2.2); } } +@keyframes chain-run { to { background-position-y: -28px; } } +.rotor, .needle, .steam i, .chain-drive { animation-play-state: paused; } +html.motion-running .rotor, html.motion-running .needle, html.motion-running .steam i, html.motion-running .chain-drive { animation-play-state: running; } +@media (max-width: 1099px) { + .hero-machine { width: 180px; height: 170px; right: 12px; bottom: 8px; opacity: .85; } + .waterwheel { width: 130px; height: 130px; right: 0; bottom: 15px; } + .hero-cog { width: 54px; height: 54px; left: 0; bottom: 10px; } + .hero-cog-small { width: 38px; height: 38px; left: 31px; bottom: 48px; } + .hero-machine > .gauge, .hero-machine > .machine-pipe, .machine-caption { display: none; } + .hero-machine > .steam { top: 0; } + .hero { padding-bottom: 170px; } +} +@media (max-width: 699px) { + .steam i:nth-child(3), .pipe-bridge > .steam { display: none; } + .pipe-bridge { margin-left: 8px; margin-right: 8px; } + .scene { margin-bottom: 18px; } + #motion-toggle { font-size: 7px; } +} +@media (min-width: 1580px) { .side-machine { display: block; } } +@media (prefers-reduced-motion: reduce) { + html:not(.motion-running) .rotor, html:not(.motion-running) .needle, html:not(.motion-running) .steam i, html:not(.motion-running) .chain-drive { animation: none; } + .needle { transform: rotate(-90deg); } +}