feat: anti-bot inspekce a vězení + přepínač hraní/objednávání
CI / Generate TypeScript types (push) Successful in 15s
CI / Server unit tests (push) Successful in 24s
CI / Build server (push) Successful in 31s
CI / Build client (push) Successful in 1m0s
CI / Playwright E2E tests (push) Successful in 1m30s
CI / Build and push Docker image (push) Successful in 1m6s
CI / Notify (push) Successful in 5s
CI / Generate TypeScript types (push) Successful in 15s
CI / Server unit tests (push) Successful in 24s
CI / Build server (push) Successful in 31s
CI / Build client (push) Successful in 1m0s
CI / Playwright E2E tests (push) Successful in 1m30s
CI / Build and push Docker image (push) Successful in 1m6s
CI / Notify (push) Successful in 5s
- přepínač Hraní/Objednávání; v objednávání hra nic neruší, v hraní herní vrstva odstíní kliknutí - scéna žije trvale (přepnutí režimu neobejde pavučinu, omráčení, zabavenou síťku ani ban) - anti-bot: ovládání jen reálnou myší (isTrusted/webdriver), občasná motýlí inspekce (chyť korunovaného) - neúspěch inspekce = zabavená síťka 45 s (opticky skrytá); opakovaně = serverový ban s mříží a odpočtem - během banu server nekredituje úlovky (F5/přepnutí-proof) - větší síťka se teď viditelně zvětší hned po koupi - changelog route přeskočí vadný JSON (nespadne celý endpoint) + oprava changelogu Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
252d105408
commit
377a350211
@@ -7,6 +7,49 @@
|
||||
pointer-events: none;
|
||||
z-index: 2;
|
||||
overflow: hidden;
|
||||
|
||||
// V režimu hraní herní vrstva zachytává kliknutí, aby se nedalo omylem
|
||||
// překliknout do objednávek. V režimu objednávání propouští vše dál (none).
|
||||
&.playing {
|
||||
pointer-events: auto;
|
||||
}
|
||||
}
|
||||
|
||||
// Přepínač režimu hraní / objednávání
|
||||
.butterfly-mode-toggle {
|
||||
position: fixed;
|
||||
bottom: 16px;
|
||||
right: 16px;
|
||||
z-index: 7;
|
||||
pointer-events: auto;
|
||||
padding: 8px 14px;
|
||||
border: none;
|
||||
border-radius: 999px;
|
||||
background: rgba(33, 37, 41, 0.88);
|
||||
color: #fff;
|
||||
font-weight: 700;
|
||||
font-size: 0.9rem;
|
||||
cursor: pointer;
|
||||
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.25);
|
||||
backdrop-filter: blur(4px);
|
||||
transition: background 0.15s ease, transform 0.08s ease;
|
||||
|
||||
&:hover { background: rgba(33, 37, 41, 1); }
|
||||
&:active { transform: scale(0.96); }
|
||||
|
||||
&.playing {
|
||||
background: #2f9e44;
|
||||
&:hover { background: #2b8a3e; }
|
||||
}
|
||||
}
|
||||
|
||||
// Vrstva herních prvků (síťka, škůdci, pavučina) – skrývá se v režimu objednávání
|
||||
.butterfly-game-layer {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.butterfly-scene {
|
||||
@@ -73,6 +116,20 @@
|
||||
}
|
||||
}
|
||||
|
||||
// Korunovaný motýl (anti-bot inspekce) – nepřehlédnutelná duhová záře
|
||||
.butterfly-sprite.royal {
|
||||
animation: butterfly-flap 0.35s ease-in-out infinite, butterfly-royal-glow 0.9s ease-in-out infinite;
|
||||
}
|
||||
|
||||
@keyframes butterfly-royal-glow {
|
||||
0%, 100% {
|
||||
filter: drop-shadow(0 0 8px rgba(255, 215, 80, 1)) drop-shadow(0 0 16px rgba(120, 200, 255, 0.8));
|
||||
}
|
||||
50% {
|
||||
filter: drop-shadow(0 0 16px rgba(255, 120, 220, 1)) drop-shadow(0 0 28px rgba(120, 255, 160, 0.9));
|
||||
}
|
||||
}
|
||||
|
||||
// Černá můra – zlověstný tmavý nádech
|
||||
.butterfly-sprite.moth {
|
||||
filter: drop-shadow(0 0 4px rgba(120, 60, 160, 0.6)) drop-shadow(0 1px 1px rgba(0, 0, 0, 0.4));
|
||||
@@ -626,3 +683,67 @@
|
||||
filter: saturate(1.3) drop-shadow(0 0 8px rgba(255, 215, 80, 0.95)) drop-shadow(0 0 16px rgba(255, 190, 50, 0.7));
|
||||
}
|
||||
}
|
||||
|
||||
// --- Anti-bot inspekce a vězení ---------------------------------------------
|
||||
|
||||
.butterfly-inspection {
|
||||
position: fixed;
|
||||
top: 16px;
|
||||
left: 50%;
|
||||
transform: translateX(-50%);
|
||||
z-index: 8;
|
||||
pointer-events: none;
|
||||
max-width: 92vw;
|
||||
padding: 10px 16px;
|
||||
border-radius: 999px;
|
||||
background: rgba(28, 126, 214, 0.95);
|
||||
color: #fff;
|
||||
font-weight: 700;
|
||||
font-size: 0.95rem;
|
||||
box-shadow: 0 3px 12px rgba(0, 0, 0, 0.3);
|
||||
animation: butterfly-flash-in 0.25s ease-out;
|
||||
}
|
||||
|
||||
.butterfly-jail {
|
||||
position: fixed;
|
||||
inset: 0;
|
||||
z-index: 6;
|
||||
pointer-events: none;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
// Svislé mříže přes celou obrazovku
|
||||
.butterfly-jail-bars {
|
||||
position: absolute;
|
||||
inset: 0;
|
||||
background:
|
||||
repeating-linear-gradient(
|
||||
90deg,
|
||||
rgba(20, 22, 28, 0.92) 0px,
|
||||
rgba(20, 22, 28, 0.92) 14px,
|
||||
rgba(20, 22, 28, 0) 14px,
|
||||
rgba(20, 22, 28, 0) 70px
|
||||
);
|
||||
box-shadow: inset 0 0 120px rgba(0, 0, 0, 0.6);
|
||||
}
|
||||
|
||||
.butterfly-jail-note {
|
||||
position: relative;
|
||||
text-align: center;
|
||||
padding: 22px 26px;
|
||||
border-radius: 16px;
|
||||
background: rgba(255, 255, 255, 0.94);
|
||||
box-shadow: 0 6px 24px rgba(0, 0, 0, 0.4);
|
||||
max-width: 90vw;
|
||||
|
||||
.jail-emoji { font-size: 2.4rem; }
|
||||
.jail-title { font-weight: 800; font-size: 1.2rem; color: #c92a2a; margin-top: 4px; }
|
||||
.jail-sub { margin-top: 6px; font-size: 0.95rem; color: #333; font-variant-numeric: tabular-nums; }
|
||||
.jail-hint { margin-top: 8px; font-size: 0.8rem; color: #868e96; }
|
||||
}
|
||||
|
||||
@media (prefers-reduced-motion: reduce) {
|
||||
.butterfly-sprite.royal { animation: none; }
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user