11 Commits

Author SHA1 Message Date
jahlib dfe4821b57 some fixes 2025-11-12 02:21:43 +03:00
jahlib 9c0e4c6e5d Add files via upload 2025-11-12 02:20:45 +03:00
jahlib c848173353 Add files via upload 2025-11-12 01:57:59 +03:00
jahlib 0f0c30caf5 Add files via upload 2025-11-12 01:45:36 +03:00
jahlib f49c89c23f Add files via upload 2025-11-12 01:39:37 +03:00
jahlib f97f57dc81 Add files via upload 2025-11-12 01:38:01 +03:00
jahlib ca18f30315 Add files via upload 2025-11-12 01:34:12 +03:00
jahlib 445498a927 Add files via upload 2025-11-12 01:30:45 +03:00
jahlib aed73aa0a3 Add files via upload 2025-11-12 01:25:50 +03:00
jahlib 390af31d4f Add files via upload 2025-11-12 01:18:50 +03:00
jahlib 8d43654e3c latest 2025-11-11 23:28:16 +03:00
13 changed files with 159 additions and 72 deletions
+68 -12
View File
@@ -18,19 +18,19 @@ class CardGame {
'🙃': 'chat',
'🙁': 'chat',
'😡': 'error',
'😈': 'chat',
'😈': 'rizz',
'😇': 'chat',
'😠': 'chat',
'😄': 'chat',
'😎': 'chat',
'😠': 'error',
'😄': 'haha',
'😎': 'sigma',
'🤔': 'pogodika',
'😤': 'chat',
'😐': 'chat',
'👍': 'chat',
'👎': 'chat',
'👍': 'thum',
'👎': 'thum',
'🤝': 'chat',
'🫰': 'chat',
'🪬': 'chat',
'🪬': 'mind',
'🤯': 'chat',
'🤡': 'chat',
'🤨': 'vine',
@@ -46,7 +46,7 @@ class CardGame {
'🦆': 'duck',
'🌹': 'wow',
'🗿': 'huh',
'👁️': 'chat',
'👁️': 'eye',
'💩': 'fart',
'🔩': 'pipe',
'🔪': 'okay',
@@ -54,7 +54,7 @@ class CardGame {
'🧀': 'meme',
'🎺': 'trumpet',
'🎁': 'chat',
'🔮': 'chat',
'🔮': 'magic',
'🎲': 'chat',
'🎯': 'chat',
'♥️': 'chat',
@@ -97,7 +97,14 @@ class CardGame {
meme: new Audio('/sounds/meme.aac'),
error: new Audio('/sounds/error.aac'),
vine: new Audio('/sounds/vine.aac'),
duck: new Audio('/sounds/duck.aac')
duck: new Audio('/sounds/duck.aac'),
thumb: new Audio('/sounds/thum.aac'),
eye: new Audio('/sounds/eye.aac'),
sigma: new Audio('/sounds/sigma.aac'),
magic: new Audio('/sounds/magic.aac'),
rizz: new Audio('/sounds/rizz.aac'),
mind: new Audio('/sounds/mind.aac'),
haha: new Audio('/sounds/haha.aac')
};
this.initElements();
@@ -1045,7 +1052,12 @@ class CardGame {
chatClass = `chat-other chat-color-${colorIndex}`;
}
// В лог пишем с ником
this.addLogEntry(data.message, chatClass);
// В пузыре показываем только текст без ника
const bubbleText = data.message_text || data.message;
this.showChatBubble(data.player_id, bubbleText);
}
break;
case 'game_ended':
@@ -2147,10 +2159,54 @@ class CardGame {
document.body.appendChild(bubble);
// Удаляем пузырёк после анимации
// Удаляем пузырёк после анимации (3 секунды для реакций)
setTimeout(() => {
bubble.remove();
}, 2000);
}, 4200);
}
showChatBubble(playerId, message) {
// Находим область игрока
let targetElement;
if (playerId === this.playerId) {
// Сообщение от нас - показываем над нашими картами
targetElement = this.handCards;
} else {
// Сообщение от противника - находим блок с ником и очками
const opponentArea = this.getOpponentAreaById(playerId);
if (opponentArea) {
targetElement = opponentArea.querySelector('.opponent-info');
}
}
if (!targetElement) return;
// Создаём пузырёк для сообщения
const bubble = document.createElement('div');
bubble.className = 'reaction-bubble chat-bubble';
bubble.textContent = message;
// Позиционируем пузырёк
const rect = targetElement.getBoundingClientRect();
bubble.style.left = `${rect.left + rect.width / 2}px`;
bubble.style.transform = 'translateX(-50%)';
if (playerId === this.playerId) {
// Наш пузырёк - НАД картами
bubble.style.top = `${rect.top - 70}px`;
bubble.classList.add('from-me');
} else {
// Пузырёк противника - ПОД блоком с ником
bubble.style.top = `${rect.bottom + 10}px`;
bubble.classList.add('from-opponent');
}
document.body.appendChild(bubble);
// Удаляем пузырёк после 5 секунд (дольше чем реакции)
setTimeout(() => {
bubble.remove();
}, 10000);
}
handleKeyPress(e) {
+3
View File
@@ -276,6 +276,7 @@
<button class="reaction-btn" data-reaction="🐺">🐺</button>
<button class="reaction-btn" data-reaction="🐊">🐊</button>
<button class="reaction-btn" data-reaction="🐠">🐠</button>
<button class="reaction-btn" data-reaction="🦆">🦆</button>
<button class="reaction-btn" data-reaction="🌹">🌹</button>
<button class="reaction-btn" data-reaction="🗿">🗿</button>
<button class="reaction-btn" data-reaction="👁️">👁️</button>
@@ -283,7 +284,9 @@
<button class="reaction-btn" data-reaction="🔩">🔩</button>
<button class="reaction-btn" data-reaction="🔪">🔪</button>
<button class="reaction-btn" data-reaction="⚔️">⚔️</button>
<button class="reaction-btn" data-reaction="🧀">🧀</button>
<button class="reaction-btn" data-reaction="🎺">🎺</button>
<button class="reaction-btn" data-reaction="🎁">🎁</button>
<button class="reaction-btn" data-reaction="🔮">🔮</button>
<button class="reaction-btn" data-reaction="🎲">🎲</button>
<button class="reaction-btn" data-reaction="🎯">🎯</button>
+37 -23
View File
@@ -7,16 +7,16 @@ body.night-mode[data-background="default"] {
--theme-primary-hover: #5b79b8;
--theme-primary-dark: #2a3d52;
--theme-secondary: #2d4159;
--theme-secondary-dark: #1e2d3f;
--theme-secondary-dark: #b1b6bb;
--theme-accent: #5273b8;
--theme-accent-dark: #3b5998;
--theme-bg-light: #2a3d52;
--theme-bg-medium: #1e2d3f;
--theme-bg-dark: #1a2332;
--theme-border: #3b5998;
--theme-success: #5273b8;
--theme-border: #35466b;
--theme-success: #435273;
--theme-success-bg: #2d4159;
--theme-toggle-off: #1e2d3f;
--theme-toggle-off: #2e3f53;
--theme-toggle-on: #5273b8;
--theme-modal-overlay: rgba(26, 35, 50, 0.95);
}
@@ -91,13 +91,13 @@ body.night-mode[data-background="orange"] {
--theme-accent: #5a1812;
--theme-accent-dark: #3d0f0c;
--theme-bg-light: #2e0b09;
--theme-bg-medium: #230907;
--theme-bg-medium: #412a29;
--theme-bg-dark: #1a0404;
--theme-border: #3d0f0c;
--theme-success: #5a1812;
--theme-success-bg: #2e0b09;
--theme-toggle-off: #230907;
--theme-toggle-on: #c74a3d;
--theme-toggle-off: #491814;
--theme-toggle-on: #87362e;
--theme-modal-overlay: rgba(26, 4, 4, 0.95);
}
@@ -967,6 +967,16 @@ body.night-mode .chat-messages {
background: var(--theme-bg-medium);
}
body.night-mode .reaction-bubble.chat-bubble {
font-size: 14px;
max-width: 250px;
color: #ffffff;
white-space: pre-wrap;
word-wrap: break-word;
text-align: center;
padding: 4px 6px;
}
/* Все параграфы и тексты */
body.night-mode p,
body.night-mode span,
@@ -1039,7 +1049,7 @@ body.night-mode .card-back-gray {
background:
repeating-linear-gradient(45deg, transparent, transparent 6px, rgba(0, 0, 0, 0.15) 6px, rgba(0, 0, 0, 0.2) 7px),
repeating-linear-gradient(-45deg, transparent, transparent 6px, rgba(0, 0, 0, 0.15) 6px, rgba(0, 0, 0, 0.2) 7px),
linear-gradient(314deg, #3a3939 20%, #7a7a7a 100%) !important;
linear-gradient(314deg, #433f3f 20%, #898787 100%) !important;
filter: saturate(1.1) brightness(0.93);
border-color: #2a2a2a !important;
}
@@ -1048,32 +1058,36 @@ body.night-mode .card-back-green {
background:
repeating-linear-gradient(45deg, transparent, transparent 6px, rgba(0, 0, 0, 0.15) 6px, rgba(0, 0, 0, 0.2) 7px),
repeating-linear-gradient(-45deg, transparent, transparent 6px, rgba(0, 0, 0, 0.15) 6px, rgba(0, 0, 0, 0.2) 7px),
linear-gradient(314deg, #13301f, #2d5a3f);
linear-gradient(251deg, #153522, #2e553d) !important;
filter: saturate(0.7) brightness(1.1);
border-color: #142119 !important;
}
body.night-mode .card-back-blue {
background:
repeating-linear-gradient(45deg, transparent, transparent 6px, rgba(0, 0, 0, 0.15) 6px, rgba(0, 0, 0, 0.2) 7px),
repeating-linear-gradient(-45deg, transparent, transparent 6px, rgba(0, 0, 0, 0.15) 6px, rgba(0, 0, 0, 0.2) 7px),
linear-gradient(314deg, #1e2d3f, #174880);
linear-gradient(288deg, #223143, #346295) !important;
filter: saturate(0.7) brightness(1.1);
border-color: #172231 !important;
}
body.night-mode .card-back-red {
background:
repeating-linear-gradient(45deg, transparent, transparent 6px, rgba(0, 0, 0, 0.15) 6px, rgba(0, 0, 0, 0.2) 7px),
repeating-linear-gradient(-45deg, transparent, transparent 6px, rgba(0, 0, 0, 0.15) 6px, rgba(0, 0, 0, 0.2) 7px),
linear-gradient(314deg, #3d1e1e, #6b1111);
linear-gradient(299deg, #311414, #732020) !important;
filter: saturate(0.7) brightness(1.1);
border-color: #200f0f !important;
}
body.night-mode .card-back-purple {
background:
repeating-linear-gradient(45deg, transparent, transparent 6px, rgba(0, 0, 0, 0.15) 6px, rgba(0, 0, 0, 0.2) 7px),
repeating-linear-gradient(-45deg, transparent, transparent 6px, rgba(0, 0, 0, 0.15) 6px, rgba(0, 0, 0, 0.2) 7px),
linear-gradient(314deg, #3d1c61, #47345a);
linear-gradient(314deg, #3e235d, #4d3863) !important;
filter: saturate(0.7) brightness(1.1);
border-color: #241436 !important;
}
/* Применение выбранного цвета рубашки для ночного режима */
@@ -1084,7 +1098,7 @@ body.night-mode[data-card-back="gray"] .flying-card {
background:
repeating-linear-gradient(45deg, transparent, transparent 6px, rgba(0, 0, 0, 0.15) 6px, rgba(0, 0, 0, 0.2) 7px),
repeating-linear-gradient(-45deg, transparent, transparent 6px, rgba(0, 0, 0, 0.15) 6px, rgba(0, 0, 0, 0.2) 7px),
linear-gradient(314deg, #3a3939 20%, #7a7a7a 100%) !important;
linear-gradient(314deg, #433f3f 20%, #898787 100%) !important;
filter: saturate(1.1) brightness(0.93);
border-color: #2a2a2a !important;
}
@@ -1096,9 +1110,9 @@ body.night-mode[data-card-back="green"] .flying-card {
background:
repeating-linear-gradient(45deg, transparent, transparent 6px, rgba(0, 0, 0, 0.15) 6px, rgba(0, 0, 0, 0.2) 7px),
repeating-linear-gradient(-45deg, transparent, transparent 6px, rgba(0, 0, 0, 0.15) 6px, rgba(0, 0, 0, 0.2) 7px),
linear-gradient(314deg, #13301f, #2d5a3f) !important;
linear-gradient(251deg, #153522, #2e553d) !important;
filter: saturate(0.7) brightness(1.1);
border-color: #13301f !important;
border-color: #142119 !important;
}
body.night-mode[data-card-back="blue"] .opponent-card,
@@ -1108,9 +1122,9 @@ body.night-mode[data-card-back="blue"] .flying-card {
background:
repeating-linear-gradient(45deg, transparent, transparent 6px, rgba(0, 0, 0, 0.15) 6px, rgba(0, 0, 0, 0.2) 7px),
repeating-linear-gradient(-45deg, transparent, transparent 6px, rgba(0, 0, 0, 0.15) 6px, rgba(0, 0, 0, 0.2) 7px),
linear-gradient(314deg, #1e2d3f, #174880) !important;
linear-gradient(288deg, #223143, #346295) !important;
filter: saturate(0.7) brightness(1.1);
border-color: #1e2d3f !important;
border-color: #172231 !important;
}
body.night-mode[data-card-back="red"] .opponent-card,
@@ -1120,7 +1134,7 @@ body.night-mode[data-card-back="red"] .flying-card {
background:
repeating-linear-gradient(45deg, transparent, transparent 6px, rgba(0, 0, 0, 0.15) 6px, rgba(0, 0, 0, 0.2) 7px),
repeating-linear-gradient(-45deg, transparent, transparent 6px, rgba(0, 0, 0, 0.15) 6px, rgba(0, 0, 0, 0.2) 7px),
linear-gradient(314deg, #3d1e1e, #6b1111) !important;
linear-gradient(299deg, #311414, #732020) !important;
filter: saturate(0.7) brightness(1.1);
border-color: #200f0f !important;
}
@@ -1132,7 +1146,7 @@ body.night-mode[data-card-back="purple"] .flying-card {
background:
repeating-linear-gradient(45deg, transparent, transparent 6px, rgba(0, 0, 0, 0.15) 6px, rgba(0, 0, 0, 0.2) 7px),
repeating-linear-gradient(-45deg, transparent, transparent 6px, rgba(0, 0, 0, 0.15) 6px, rgba(0, 0, 0, 0.2) 7px),
linear-gradient(314deg, #3d1c61, #47345a) !important;
linear-gradient(314deg, #3e235d, #4d3863) !important;
filter: saturate(0.7) brightness(1.1);
border-color: #241436 !important;
}
@@ -1198,16 +1212,16 @@ body.night-mode[data-background="green"] .game-circle {
}
body.night-mode[data-background="blue"] .game-table {
background: linear-gradient(199deg, #163423 10%, #0d080e 80%);
background: linear-gradient(166deg, #274b36 10%, #121d11 80%);
}
body.night-mode[data-background="blue"] .game-circle {
background: radial-gradient(circle, #1f4a2f 0%, #11281c 100%);
border-color: #2d6342;
background: radial-gradient(circle, #274b35 10%, #192920 90%);
border-color: #20472f;
}
body.night-mode[data-background="purple"] .game-table {
background: linear-gradient(67deg, #231b2a 20%, #12091e 100%);
background: linear-gradient(317deg, #211927 20%, #180f23 100%);
}
body.night-mode[data-background="purple"] .game-circle {
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.
+50 -37
View File
@@ -75,40 +75,40 @@ body[data-background="blue"] {
/* Фиолетовая тема */
body[data-background="purple"] {
--theme-primary: #ba9bd0;
--theme-primary-hover: #c69bde;
--theme-primary-dark: #503d6c;
--theme-secondary: #6d5580;
--theme-secondary-dark: #453560;
--theme-primary: #be82e9;
--theme-primary-hover: #ba74e1;
--theme-primary-dark: #633f97;
--theme-secondary: #64477b;
--theme-secondary-dark: #433063;
--theme-accent: #b899d0;
--theme-accent-dark: #9d7bb3;
--theme-bg-light: #f0ebf5;
--theme-bg-medium: #e0d5e8;
--theme-bg-dark: #a896b8;
--theme-border: #d5c5e0;
--theme-success: #9d7bb3;
--theme-success: #945fb7;
--theme-success-bg: #ede5f2;
--theme-toggle-off: #bfb0cf;
--theme-toggle-on: #ba9bd0;
--theme-toggle-off: #c09fe3;
--theme-toggle-on: #ad6bdd;
}
/* Оливковая тема */
body[data-background="orange"] {
--theme-primary: #c4ca8d;
--theme-primary-hover: #c8d07d;
--theme-primary-dark: #6a5d54;
--theme-secondary: #7a8254;
--theme-secondary-dark: #6a5d54;
--theme-accent: #bfcc8d;
--theme-accent-dark: #a3b075;
--theme-primary: #ddc64a;
--theme-primary-hover: #e3c91c;
--theme-primary-dark: #9d8e16;
--theme-secondary: #8f8927;
--theme-secondary-dark: #837423;
--theme-accent: #cdcd2e;
--theme-accent-dark: #b5af2e;
--theme-bg-light: #f2f0e8;
--theme-bg-medium: #e2ded0;
--theme-bg-dark: #a8a68f;
--theme-bg-dark: #d1b02e;
--theme-border: #d5d0bd;
--theme-success: #a3b075;
--theme-success-bg: #edeee5;
--theme-toggle-off: #c0bda8;
--theme-toggle-on: #c4ca8d;
--theme-toggle-on: #c3b540;
}
body {
@@ -2469,7 +2469,8 @@ body .suit-emoji-log.spades {
font-size: 32px;
z-index: 9999;
pointer-events: none;
animation: reactionFloat 2s ease-out forwards;
transition: all 0.3s ease;
animation: reactionFloat 4.2s ease forwards;
box-shadow: 0 4px 15px rgba(0, 0, 0, 0.4);
}
@@ -2498,21 +2499,28 @@ body .suit-emoji-log.spades {
border-color: transparent transparent rgba(30, 30, 30, 0.95) transparent;
}
/* Chat bubble - текстовые сообщения */
.reaction-bubble.chat-bubble {
font-size: 14px;
max-width: 250px;
white-space: pre-wrap;
word-wrap: break-word;
text-align: center;
padding: 4px 6px;
}
@keyframes reactionFloat {
0% {
opacity: 0;
transform: translateX(-50%) translateY(0) scale(0.5);
}
20% {
opacity: 1;
transform: translateX(-50%) translateY(-10px) scale(1.1);
}
40% {
transform: translateX(-50%) translateY(-5px) scale(1);
opacity: 1;
transform: translateX(-50%) translateY(-30px) scale(1.2);
}
100% {
opacity: 0;
transform: translateX(-50%) translateY(-30px) scale(0.8);
transform: translateX(-50%) translateY(-40px) scale(0.8);
}
}
@@ -2563,40 +2571,45 @@ body .suit-emoji-log.spades {
background:
repeating-linear-gradient(45deg, transparent, transparent 6px, rgba(0, 0, 0, 0.1) 6px, rgba(0, 0, 0, 0.15) 7px),
repeating-linear-gradient(-45deg, transparent, transparent 6px, rgba(0, 0, 0, 0.1) 6px, rgba(0, 0, 0, 0.15) 7px),
linear-gradient(314deg, #686868, #9ca3af);
linear-gradient(314deg, #686868, #9ca3af) !important;
filter: saturate(0.8) brightness(0.95);
border-color: #383838 !important;
}
.card-back-green {
background:
repeating-linear-gradient(45deg, transparent, transparent 6px, rgba(0, 0, 0, 0.1) 6px, rgba(0, 0, 0, 0.15) 7px),
repeating-linear-gradient(-45deg, transparent, transparent 6px, rgba(0, 0, 0, 0.1) 6px, rgba(0, 0, 0, 0.15) 7px),
linear-gradient(314deg, #2a5a3f, #4a8a65);
linear-gradient(314deg, #2a5a3f, #4a8a65) !important;
filter: saturate(0.7) brightness(1.1);
border-color: #153a1a !important;
}
.card-back-blue {
background:
repeating-linear-gradient(45deg, transparent, transparent 6px, rgba(0, 0, 0, 0.1) 6px, rgba(0, 0, 0, 0.15) 7px),
repeating-linear-gradient(-45deg, transparent, transparent 6px, rgba(0, 0, 0, 0.1) 6px, rgba(0, 0, 0, 0.15) 7px),
linear-gradient(314deg, #3a5a7f, #4a7ab0);
linear-gradient(314deg, #3a5a7f, #4a7ab0) !important;
filter: saturate(0.7) brightness(1.1);
border-color: #153a5a !important;
}
.card-back-red {
background:
repeating-linear-gradient(45deg, transparent, transparent 6px, rgba(0, 0, 0, 0.1) 6px, rgba(0, 0, 0, 0.15) 7px),
repeating-linear-gradient(-45deg, transparent, transparent 6px, rgba(0, 0, 0, 0.1) 6px, rgba(0, 0, 0, 0.15) 7px),
linear-gradient(314deg, #6a3a3a, #9a4a4a);
linear-gradient(314deg, #6a3a3a, #9a4a4a) !important;
filter: saturate(0.7) brightness(1.1);
border-color: #412020 !important;
}
.card-back-purple {
background:
repeating-linear-gradient(45deg, transparent, transparent 6px, rgba(0, 0, 0, 0.1) 6px, rgba(0, 0, 0, 0.15) 7px),
repeating-linear-gradient(-45deg, transparent, transparent 6px, rgba(0, 0, 0, 0.1) 6px, rgba(0, 0, 0, 0.15) 7px),
linear-gradient(314deg, #6a4a8a, #8a6aaa);
linear-gradient(314deg, #513171, #785d93) !important;
filter: saturate(0.7) brightness(1.1);
border-color: #291f33 !important;
}
/* Применение выбранного цвета рубашки - светлые для дневного режима */
@@ -2655,9 +2668,9 @@ body[data-card-back="purple"] .flying-card {
background:
repeating-linear-gradient(45deg, transparent, transparent 6px, rgba(0, 0, 0, 0.1) 6px, rgba(0, 0, 0, 0.15) 7px),
repeating-linear-gradient(-45deg, transparent, transparent 6px, rgba(0, 0, 0, 0.1) 6px, rgba(0, 0, 0, 0.15) 7px),
linear-gradient(314deg, #6a4a8a, #8a6aaa) !important;
linear-gradient(314deg, #513171, #785d93) !important;
filter: saturate(0.7) brightness(1.1);
border-color: #38234b !important;
border-color: #291f33 !important;
}
/* Background selector */
@@ -2710,7 +2723,7 @@ body[data-card-back="purple"] .flying-card {
}
.bg-orange {
background: linear-gradient(206deg, #8f9861 10%, #847068 90%);
background: linear-gradient(161deg, #aba750 10%, #4d481c 90%);
}
/* Применение выбранного фона для дневного режима */
@@ -2748,17 +2761,17 @@ body[data-background="purple"] .game-table {
}
body[data-background="purple"] .game-circle {
background: radial-gradient(circle, #9d7bb3 0%, #6d5580 100%);
border-color: #b899d0;
background: radial-gradient(circle, #835a9d 0%, #604b71 100%);
border-color: #9169af;
}
body[data-background="orange"] .game-table {
background: linear-gradient(206deg, #8f9861 10%, #847068 90%);
background: linear-gradient(161deg, #aba750 10%, #4d481c 90%);
}
body[data-background="orange"] .game-circle {
background: radial-gradient(circle, #a3b075 0%, #7a8254 100%);
border-color: #bfcc8d;
background: radial-gradient(circle, #9d8639 0%, #79793a 100%);
border-color: #b5b56e;
}
/* Рамка карт под каждый фон для дневного режима */
+1
View File
@@ -1592,6 +1592,7 @@ class GameServer:
await self.send_to_player(pid, {
'type': 'chat_message',
'message': chat_message,
'message_text': message_text,
'player_id': player_id,
'player_nickname': player.nickname
})