<!
DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-
scale=1.0, user-scalable=no">
<title>Possessive Adjective Adventure - Kelas 7 SMP</title>
<!-- Tailwind CSS -->
<script src="[Link]
<!-- FontAwesome for Icons -->
<link rel="stylesheet" href="[Link]
awesome/6.4.0/css/[Link]">
<!-- Google Fonts -->
<style>
@import url('[Link]
family=Comic+Neue:wght@400;700&family=Bangers&family=Chewy&family=Fredoka:wght@400;
700&display=swap');
/* --- GLOBAL STYLES --- */
body {
font-family: 'Comic Neue', 'Comic Sans MS', cursive, sans-serif;
overflow-x: hidden;
margin: 0;
padding: 0;
background-color: #be185d;
color: #333;
user-select: none;
-webkit-tap-highlight-color: transparent;
/* Custom Cursor removed as requested */
}
/* --- MAGIC SPARKLES --- */
.sparkle {
position: fixed;
width: 10px;
height: 10px;
background-color: gold;
border-radius: 50%;
pointer-events: none;
z-index: 9999;
animation: sparkle-anim 0.8s linear forwards;
box-shadow: 0 0 5px orange;
}
@keyframes sparkle-anim {
0% { transform: scale(1); opacity: 1; }
100% { transform: scale(0) translate(10px, 20px); opacity: 0; }
}
/* --- SCENE TRANSITIONS --- */
.scene-container {
animation: slideUpFade 0.6s cubic-bezier(0.16, 1, 0.3, 1);
}
@keyframes slideUpFade {
from { opacity: 0; transform: translateY(20px); }
to { opacity: 1; transform: translateY(0); }
}
/* Canvas Background Layer */
#bg-canvas {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 0;
pointer-events: none;
}
/* Main Container */
#app-container {
position: relative;
z-index: 10;
min-height: 100vh;
width: 100%;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 1rem;
box-sizing: border-box;
}
/* --- NEUMORPHISM UI --- */
.neumorph-panel {
background: rgba(255, 255, 255, 0.95);
border-radius: 20px;
border: 4px solid #60a5fa;
box-shadow: 10px 10px 20px rgba(0,0,0,0.2),
-5px -5px 15px rgba(255,255,255,0.3);
backdrop-filter: blur(5px);
transition: all 0.3s ease;
width: 100%;
}
.neumorph-btn {
background: linear-gradient(145deg, #3b82f6, #2563eb);
color: white;
border: none;
border-radius: 15px;
font-weight: bold;
box-shadow: 5px 5px 10px rgba(0,0,0,0.2),
-2px -2px 5px rgba(255,255,255,0.3);
transition: all 0.2s ease;
cursor: pointer;
text-transform: uppercase;
letter-spacing: 1px;
position: relative;
overflow: hidden;
}
.neumorph-btn:hover {
transform: translateY(-3px) scale(1.02);
box-shadow: 7px 7px 14px rgba(0,0,0,0.25);
filter: brightness(1.1);
}
.neumorph-btn:active {
transform: translateY(2px);
box-shadow: inset 4px 4px 8px rgba(0,0,0,0.2);
}
.[Link] { background: linear-gradient(145deg, #f59e0b,
#d97706); }
.[Link] { background: linear-gradient(145deg, #ef4444,
#dc2626); }
.[Link] { background: linear-gradient(145deg, #10b981,
#059669); }
/* Mood Selection Styles */
.mood-btn { transition: all 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275); }
.[Link] {
transform: scale(1.2);
background: #fef3c7;
box-shadow: inset 4px 4px 8px rgba(0,0,0,0.1);
border: 4px solid #f59e0b;
}
/* --- ANIMATIONS --- */
@keyframes float {
0%, 100% { transform: translateY(0); }
50% { transform: translateY(-15px); }
}
.animate-float { animation: float 3s ease-in-out infinite; }
@keyframes popIn {
0% { transform: scale(0); opacity: 0; }
80% { transform: scale(1.1); opacity: 1; }
100% { transform: scale(1); opacity: 1; }
}
.animate-pop { animation: popIn 0.5s cubic-bezier(0.175, 0.885, 0.32,
1.275) forwards; }
@keyframes shake {
0%, 100% { transform: translateX(0); }
25% { transform: translateX(-5px); }
75% { transform: translateX(5px); }
}
.shake { animation: shake 0.3s ease-in-out; }
.hidden-scene { display: none !important; }
@keyframes wave-text {
0%, 100% { transform: rotate(-3deg) translateY(0); }
50% { transform: rotate(3deg) translateY(-5px); }
}
.animate-wave-text { animation: wave-text 3s ease-in-out infinite; }
@keyframes cloud-float {
0% { transform: translateX(-150px); opacity: 0; }
10% { opacity: 0.8; }
90% { opacity: 0.8; }
100% { transform: translateX(100vw); opacity: 0; }
}
.cloud-anim {
position: absolute;
color: rgba(255, 255, 255, 0.8);
animation: cloud-float linear infinite;
z-index: 1;
}
@keyframes bird-fly {
0% { transform: translateX(-50px) translateY(50px) scale(0.5); opacity:
0; }
10% { opacity: 1; }
50% { transform: translateX(50vw) translateY(0px) scale(0.7); }
100% { transform: translateX(100vw) translateY(50px) scale(0.5);
opacity: 0; }
}
.bird-anim {
position: absolute;
color: #fef08a;
animation: bird-fly linear infinite;
z-index: 2;
}
@keyframes btn-cloud-move {
0% { transform: translateX(-50px); opacity: 0; }
20% { opacity: 0.6; }
80% { opacity: 0.6; }
100% { transform: translateX(250px); opacity: 0; }
}
.btn-cloud-anim {
position: absolute;
color: rgba(255, 255, 255, 0.7);
animation: btn-cloud-move linear infinite;
pointer-events: none;
}
@keyframes march-right {
0% { transform: translateX(-50px); }
100% { transform: translateX(450px); }
}
.ant-walker { animation: march-right linear infinite; }
@keyframes balloonFloat {
0% { bottom: -150px; transform: translateX(0) rotate(0deg); }
25% { transform: translateX(10px) rotate(2deg); }
50% { transform: translateX(-10px) rotate(-2deg); }
75% { transform: translateX(10px) rotate(1deg); }
100% { bottom: 120%; transform: translateX(0) rotate(0deg); }
}
.balloon-item {
position: absolute;
width: 90px;
height: 110px;
border-radius: 50% 50% 50% 50% / 40% 40% 60% 60%;
display: flex;
justify-content: center;
align-items: center;
color: white;
font-weight: bold;
font-size: 1.1rem;
cursor: pointer;
box-shadow: inset -10px -10px 20px rgba(0,0,0,0.1), 5px 10px 15px
rgba(0,0,0,0.2);
z-index: 20;
transition: transform 0.1s;
animation: balloonFloat linear forwards;
text-align: center;
line-height: 1.1;
padding: 5px;
text-shadow: 1px 1px 2px rgba(0,0,0,0.3);
}
.balloon-item::after { content: ''; position: absolute; bottom: -30px;
left: 50%; width: 2px; height: 30px; background: rgba(255,255,255,0.7); transform:
translateX(-50%); }
.balloon-item::before { content: ''; position: absolute; bottom: -4px;
left: 50%; width: 10px; height: 6px; background: inherit; transform: translateX(-
50%); border-radius: 2px; }
.balloon-item:active { transform: scale(0.95); }
.balloon-pop { animation: popAnim 0.2s forwards !important; }
@keyframes popAnim { 0% { transform: scale(1); opacity: 1; } 50%
{ transform: scale(1.4); opacity: 0.8; } 100% { transform: scale(0); opacity:
0; } }
@keyframes pulse-ring { 0% { transform: scale(0.8); box-shadow: 0 0 0 0
rgba(59, 130, 246, 0.7); } 70% { transform: scale(1); box-shadow: 0 0 0 10px
rgba(59, 130, 246, 0); } 100% { transform: scale(0.8); box-shadow: 0 0 0 0 rgba(59,
130, 246, 0); } }
.animate-pulse-ring { animation: pulse-ring 2s infinite; }
@keyframes emoji-float-up { 0% { transform: translateY(0) scale(0.5);
opacity: 1; } 100% { transform: translateY(-150px) scale(1.5) rotate(20deg);
opacity: 0; } }
.celebration-emoji { position: fixed; pointer-events: none; z-index: 100;
animation: emoji-float-up 1.5s ease-out forwards; }
/* Memory Game */
.memory-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap:
10px; perspective: 1000px; width: 100%; max-width: 600px; margin: 0 auto; }
@media (min-width: 768px) { .memory-grid { grid-template-columns: repeat(4,
1fr); gap: 15px; } }
.memory-card { background-color: transparent; aspect-ratio: 3/4; cursor:
pointer; position: relative; transform-style: preserve-3d; transition: transform
0.5s; }
.[Link] { transform: rotateY(180deg); }
.memory-card .front-face, .memory-card .back-face { width: 100%; height:
100%; position: absolute; backface-visibility: hidden; border-radius: 12px;
display: flex; flex-direction: column; justify-content: center; align-items:
center; box-shadow: 0 4px 6px rgba(0,0,0,0.1); font-weight: bold; font-size:
1.2rem; user-select: none; }
.memory-card .front-face { background: linear-gradient(135deg, #fff,
#f0f9ff); transform: rotateY(180deg); border: 4px solid #3b82f6; color: #1e40af; }
.memory-card .back-face { background: linear-gradient(135deg, #f472b6,
#db2777); background-image: radial-gradient(circle, rgba(255,255,255,0.2) 2px,
transparent 2px); background-size: 10px 10px; border: 4px solid #fff; color: white;
font-size: 2rem; }
.[Link] .front-face { background: #dcfce7; border-color:
#22c55e; color: #15803d; animation: pulse-ring 1s infinite; }
/* Game 1 */
.drop-zone { transition: all 0.3s ease; }
.[Link] { background-color: #dbeafe; border-color: #3b82f6;
transform: scale(1.02); }
.draggable-item { cursor: pointer; transition: all 0.2s; }
.[Link] { background: #fcd34d; transform: scale(1.1)
rotate(5deg); box-shadow: 0 10px 15px rgba(0,0,0,0.2); border: 2px solid #b45309;
z-index: 50; }
/* Progress Bar */
.progress-bar-container { width: 100%; height: 20px; background: #e5e7eb;
border-radius: 999px; overflow: hidden; border: 3px solid white; box-shadow: inset
0 2px 4px rgba(0,0,0,0.1); }
.progress-bar-fill { height: 100%; background: linear-gradient(90deg,
#34d399, #10b981); width: 0%; transition: width 0.5s ease; }
.text-3d { text-shadow: 4px 4px 0 #1e3a8a, 6px 6px 5px rgba(0,0,0,0.3); }
.font-alasassy-style { font-family: 'Bangers', cursive; letter-spacing:
3px; text-transform: uppercase; text-shadow: 3px 3px 0px #b45309, 6px 6px 0px
#78350f, 8px 8px 10px rgba(0,0,0,0.4); }
::-webkit-scrollbar { width: 8px; }
::-webkit-scrollbar-track { background: #f1f1f1; border-radius: 4px; }
::-webkit-scrollbar-thumb { background: #fcd34d; border-radius: 4px; }
</style>
</head>
<body>
<!-- 1. BACKGROUND CANVAS (Visual Utama) -->
<canvas id="bg-canvas"></canvas>
<!-- 2. UI CONTAINER -->
<div id="app-container" class="w-full max-w-7xl mx-auto">
<!-- Top Navigation -->
<div id="nav-bar" class="fixed top-4 right-4 z-50 flex gap-2 md:gap-3
hidden-scene">
<button onclick="toggleMusic()" class="neumorph-btn px-3 py-2 md:px-4
text-xs md:text-sm bg-purple-500 rounded-full hover:bg-purple-600 transition-
colors">
<i id="music-icon" class="fas fa-volume-mute"></i> Musik
</button>
<button onclick="goBack()" class="neumorph-btn danger px-3 py-2 md:px-4
text-xs md:text-sm rounded-full">
<i class="fas fa-arrow-left"></i> Menu
</button>
</div>
<!-- Custom Confirm Modal -->
<div id="modal-confirm" class="fixed inset-0 z-[60] hidden flex items-
center justify-center bg-black/50 backdrop-blur-sm p-4">
<div class="bg-white p-6 md:p-8 rounded-2xl shadow-2xl text-center max-
w-sm w-full mx-auto transform scale-100 animate-pop border-4 border-yellow-400">
<div class="text-6xl mb-4">🤔</div>
<h2 class="text-2xl font-bold text-gray-800 mb-4">Keluar dari game?
</h2>
<p class="text-gray-600 mb-6">Progress permainanmu akan hilang.</p>
<div class="flex gap-4 justify-center">
<button onclick="closeConfirmModal()" class="neumorph-btn px-6
py-2 bg-gray-400">Batal</button>
<button onclick="confirmExitGame()" class="neumorph-btn danger
px-6 py-2">Ya, Keluar</button>
</div>
</div>
</div>
<!-- SCENE 1: WELCOME SCREEN (PARALLAX EFFECT) -->
<div id="scene-welcome" class="scene-container flex flex-col items-center
justify-center min-h-screen text-center w-full relative overflow-hidden bg-
gradient-to-b from-sky-300 to-blue-200">
<!-- SKY DECORATIONS -->
<div id="welcome-sky" class="absolute inset-0 w-full h-full pointer-
events-none select-none z-0 transition-transform duration-100 ease-out">
<!-- Shining Sun (Interactive) -->
<div onclick="toggleSunGlasses()" class="absolute top-5 right-5
md:top-10 md:right-10 animate-spin pointer-events-auto cursor-pointer hover:scale-
110 transition" style="animation-duration: 60s;">
<i id="sun-icon" class="fas fa-sun text-yellow-300 text-8xl
md:text-9xl lg:text-[10rem] filter drop-shadow-[0_0_30px_rgba(253,224,71,0.8)]
opacity-100 relative">
<!-- Sunglasses (Hidden by default) -->
<div id="sun-glasses" class="hidden absolute top-1/2 left-
1/2 transform -translate-x-1/2 -translate-y-1/2 text-black text-6xl"></div>
</i>
</div>
<!-- Moving Clouds -->
<i class="fas fa-cloud cloud-anim text-8xl lg:text-9xl text-white
opacity-90" style="top: 10%; left: -150px; animation-duration: 35s;"></i>
<i class="fas fa-cloud cloud-anim text-9xl lg:text-[10rem] text-
white opacity-80" style="top: 25%; left: -300px; animation-duration: 45s;
animation-delay: 5s;"></i>
<i class="fas fa-cloud cloud-anim text-7xl lg:text-8xl text-white
opacity-85" style="top: 5%; left: -200px; animation-duration: 40s; animation-delay:
15s;"></i>
<!-- Birds -->
<i class="fas fa-dove bird-anim text-2xl lg:text-4xl text-white
drop-shadow-md" style="top: 20%; animation-duration: 18s;"></i>
<i class="fas fa-dove bird-anim text-xl lg:text-3xl text-white
drop-shadow-md" style="top: 35%; animation-duration: 22s; animation-delay:
3s;"></i>
</div>
<!-- SCHOOL BACKGROUND (PARALLAX) -->
<div id="welcome-school" class="absolute bottom-0 left-0 w-full flex
justify-center items-end z-0 pointer-events-none opacity-90 transition-transform
duration-100 ease-out">
<svg viewBox="0 0 400 280" class="w-full max-w-6xl lg:max-w-full h-
auto drop-shadow-2xl" preserveAspectRatio="xMidYMax meet">
<!-- TREES BEHIND -->
<g id="trees-behind">
<rect x="5" y="80" width="15" height="100"
fill="#78350f"/><circle cx="12" cy="70" r="25" fill="#15803d"/><circle cx="25"
cy="80" r="20" fill="#166534"/><circle cx="0" cy="80" r="20" fill="#166534"/>
<rect x="80" y="70" width="12" height="80"
fill="#78350f"/><circle cx="86" cy="60" r="22" fill="#16a34a"/><circle cx="70"
cy="70" r="18" fill="#15803d"/><circle cx="100" cy="70" r="18" fill="#15803d"/>
<rect x="310" y="70" width="12" height="80"
fill="#78350f"/><circle cx="316" cy="60" r="22" fill="#16a34a"/><circle cx="300"
cy="70" r="18" fill="#15803d"/><circle cx="330" cy="70" r="18" fill="#15803d"/>
<rect x="380" y="80" width="15" height="100"
fill="#78350f"/><circle cx="387" cy="70" r="25" fill="#15803d"/><circle cx="370"
cy="80" r="20" fill="#166534"/><circle cx="395" cy="80" r="20" fill="#166534"/>
</g>
<!-- BUILDING -->
<rect x="20" y="100" width="100" height="150" fill="#fef3c7"
stroke="#d97706" stroke-width="2"/>
<path d="M10,100 L120,100 L65,60 Z" fill="#ef4444"
stroke="#b91c1c" stroke-width="2"/>
<rect x="280" y="100" width="100" height="150" fill="#fef3c7"
stroke="#d97706" stroke-width="2"/>
<path d="M280,100 L390,100 L335,60 Z" fill="#ef4444"
stroke="#b91c1c" stroke-width="2"/>
<rect x="100" y="80" width="200" height="170" fill="#fffbeb"
stroke="#d97706" stroke-width="2"/>
<path d="M90,80 L310,80 L200,20 Z" fill="#ef4444"
stroke="#b91c1c" stroke-width="2"/>
<circle cx="200" cy="55" r="18" fill="white" stroke="#d97706"
stroke-width="2"/>
<line x1="200" y1="55" x2="200" y2="45" stroke="black" stroke-
width="2"/>
<line x1="200" y1="55" x2="210" y2="55" stroke="black" stroke-
width="2"/>
<rect x="160" y="150" width="80" height="100" fill="#fde68a"
stroke="none"/>
<rect x="165" y="150" width="10" height="100" fill="white"
stroke="#d1d5db"/>
<rect x="225" y="150" width="10" height="100" fill="white"
stroke="#d1d5db"/>
<path d="M180,250 L180,190 A20,20 0 0,1 220,190 L220,250 Z"
fill="#78350f" stroke="#451a03" stroke-width="2"/>
<line x1="200" y1="190" x2="200" y2="250" stroke="#451a03"
stroke-width="1"/>
<rect x="140" y="250" width="120" height="10" fill="#d1d5db"
stroke="#9ca3af"/>
<rect x="130" y="260" width="140" height="10" fill="#9ca3af"
stroke="#6b7280"/>
<rect x="35" y="120" width="25" height="30" fill="#93c5fd"
stroke="#3b82f6" stroke-width="1"/><rect x="75" y="120" width="25" height="30"
fill="#93c5fd" stroke="#3b82f6" stroke-width="1"/><rect x="35" y="170" width="25"
height="30" fill="#93c5fd" stroke="#3b82f6" stroke-width="1"/><rect x="75" y="170"
width="25" height="30" fill="#93c5fd" stroke="#3b82f6" stroke-width="1"/>
<rect x="295" y="120" width="25" height="30" fill="#93c5fd"
stroke="#3b82f6" stroke-width="1"/><rect x="335" y="120" width="25" height="30"
fill="#93c5fd" stroke="#3b82f6" stroke-width="1"/><rect x="295" y="170" width="25"
height="30" fill="#93c5fd" stroke="#3b82f6" stroke-width="1"/><rect x="335" y="170"
width="25" height="30" fill="#93c5fd" stroke="#3b82f6" stroke-width="1"/>
<rect x="120" y="100" width="20" height="30" fill="#60a5fa"
stroke="#2563eb" stroke-width="1"/><rect x="260" y="100" width="20" height="30"
fill="#60a5fa" stroke="#2563eb" stroke-width="1"/>
<line x1="200" y1="20" x2="200" y2="-10" stroke="#4b5563"
stroke-width="2"/><path d="M200,-10 Q230,-5 200,10" fill="#ef4444" stroke="#b91c1c"
stroke-width="1"/>
<!-- FENCE -->
<g id="fence">
<g transform="translate(0, 235)"><rect x="0" y="10"
width="130" height="5" fill="#f3f4f6" stroke="#9ca3af"/><rect x="0" y="28"
width="130" height="5" fill="#f3f4f6" stroke="#9ca3af"/><g fill="#ffffff"
stroke="#9ca3af" stroke-width="1"><path d="M5,0 L5,45 M5,0 L10,-5 L15,0 L15,45
L5,45" /><path d="M25,0 L25,45 M25,0 L30,-5 L35,0 L35,45 L25,45" /><path d="M45,0
L45,45 M45,0 L50,-5 L55,0 L55,45 L45,45" /><path d="M65,0 L65,45 M65,0 L70,-5 L75,0
L75,45 L65,45" /><path d="M85,0 L85,45 M85,0 L90,-5 L95,0 L95,45 L85,45" /><path
d="M105,0 L105,45 M105,0 L110,-5 L115,0 L115,45 L105,45" /></g></g>
<g transform="translate(270, 235)"><rect x="0" y="10"
width="130" height="5" fill="#f3f4f6" stroke="#9ca3af"/><rect x="0" y="28"
width="130" height="5" fill="#f3f4f6" stroke="#9ca3af"/><g fill="#ffffff"
stroke="#9ca3af" stroke-width="1"><path d="M15,0 L15,45 M15,0 L20,-5 L25,0 L25,45
L15,45" /><path d="M35,0 L35,45 M35,0 L40,-5 L45,0 L45,45 L35,45" /><path d="M55,0
L55,45 M55,0 L60,-5 L65,0 L65,45 L55,45" /><path d="M75,0 L75,45 M75,0 L80,-5 L85,0
L85,45 L75,45" /><path d="M95,0 L95,45 M95,0 L100,-5 L105,0 L105,45 L95,45" /><path
d="M115,0 L115,45 M115,0 L120,-5 L125,0 L125,45 L115,45" /></g></g>
</g>
<!-- GRASS FOREGROUND -->
<g id="front-grass">
<path d="M0,280 L400,280 L400,250 Q380,240 360,250 Q340,260
320,250 Q300,240 280,250 Q260,260 240,250 Q220,240 200,250 Q180,260 160,250
Q140,240 120,250 Q100,260 80,250 Q60,240 40,250 Q20,260 0,250 Z" fill="#15803d"/>
<path d="M0,280 L400,280 L400,265 Q390,255 380,265 Q370,255
360,265 Q350,255 340,265 Q300,260 270,265 L130,265 Q100,260 60,265 Q50,255 40,265
Q30,255 20,265 Q10,255 0,265 Z" fill="#16a34a"/>
<path d="M0,280 L400,280 L400,270 Q395,260 390,270 Q385,260
380,270 Q360,260 340,270 Q320,260 300,270 Q250,265 200,270 Q150,265 100,270 Q80,260
60,270 Q40,260 20,270 Q10,260 0,270 Z" fill="#4ade80" />
<g class="ant-walker" style="animation-duration: 25s;"><g
transform="translate(0, 275) scale(0.8)"><circle cx="0" cy="0" r="2.5"
fill="#3f2c22"/><circle cx="5" cy="0" r="2" fill="#3f2c22"/><circle cx="10" cy="0"
r="2.5" fill="#3f2c22"/><line x1="0" y1="0" x2="0" y2="5" stroke="#3f2c22" stroke-
width="0.8"/><line x1="5" y1="0" x2="5" y2="5" stroke="#3f2c22" stroke-
width="0.8"/><line x1="10" y1="0" x2="10" y2="5" stroke="#3f2c22" stroke-
width="0.8"/></g><g transform="translate(30, 275) scale(0.8)"><circle cx="0" cy="0"
r="2.5" fill="#3f2c22"/><circle cx="5" cy="0" r="2" fill="#3f2c22"/><circle cx="10"
cy="0" r="2.5" fill="#3f2c22"/><line x1="0" y1="0" x2="0" y2="5" stroke="#3f2c22"
stroke-width="0.8"/><line x1="5" y1="0" x2="5" y2="5" stroke="#3f2c22" stroke-
width="0.8"/><line x1="10" y1="0" x2="10" y2="5" stroke="#3f2c22" stroke-
width="0.8"/></g><g transform="translate(60, 275) scale(0.8)"><circle cx="0" cy="0"
r="2.5" fill="#3f2c22"/><circle cx="5" cy="0" r="2" fill="#3f2c22"/><circle cx="10"
cy="0" r="2.5" fill="#3f2c22"/><line x1="0" y1="0" x2="0" y2="5" stroke="#3f2c22"
stroke-width="0.8"/><line x1="5" y1="0" x2="5" y2="5" stroke="#3f2c22" stroke-
width="0.8"/><line x1="10" y1="0" x2="10" y2="5" stroke="#3f2c22" stroke-
width="0.8"/></g></g>
<g transform="translate(30, 240)"><path d="M10,40 L10,15
Q10,0 20,0 Q30,0 30,15 L30,40 Z" fill="#86efac" stroke="#166534" stroke-
width="1.5"/><path d="M10,25 Q0,25 0,17 Q0,10 8,13 L10,17" fill="#86efac"
stroke="#166534" stroke-width="1.5"/><circle cx="16" cy="15" r="1.5"
fill="#1e293b"/><circle cx="24" cy="15" r="1.5" fill="#1e293b"/><path d="M18,19
Q20,21 22,19" fill="none" stroke="#1e293b" stroke-width="1" stroke-
linecap="round"/><circle cx="20" cy="0" r="4" fill="#f43f5e"/><circle cx="20"
cy="0" r="1.5" fill="yellow"/></g>
<g transform="translate(350, 235)"><path d="M15,45 L15,15
Q15,0 25,0 Q35,0 35,15 L35,45 Z" fill="#4ade80" stroke="#15803d" stroke-
width="1.5"/><path d="M35,27 Q45,27 45,17 Q45,12 38,14 L35,20" fill="#4ade80"
stroke="#15803d" stroke-width="1.5"/><circle cx="21" cy="15" r="1.5"
fill="#1e293b"/><circle cx="29" cy="15" r="1.5" fill="#1e293b"/><path d="M23,19
Q25,22 27,19" fill="none" stroke="#1e293b" stroke-width="1" stroke-
linecap="round"/><circle cx="20" cy="-2" r="4" fill="#fbbf24"/><circle cx="20"
cy="-2" r="1.5" fill="white"/></g>
<g transform="translate(80, 260)"><path d="M5,15 Q5,20 0,20
L10,20 Q5,20 5,15 L5,10" fill="#fcd34d" /><path d="M-2,10 Q5,-5 12,10 Z"
fill="#ef4444" /><circle cx="2" cy="5" r="1" fill="white" opacity="0.8"/><circle
cx="8" cy="8" r="1" fill="white" opacity="0.8"/></g>
<g transform="translate(320, 260)"><path d="M5,15 Q5,20
0,20 L10,20 Q5,20 5,15 L5,10" fill="#fcd34d" /><path d="M-2,10 Q5,-5 12,10 Z"
fill="#a855f7" /><circle cx="3" cy="4" r="1.5" fill="white" opacity="0.8"/></g>
<path d="M10,270 L10,260 M20,270 L20,263 M30,270 L30,258"
stroke="#166534" stroke-width="1.5" fill="none"/><path d="M370,270 L370,260
M380,270 L380,263 M390,270 L390,258" stroke="#166534" stroke-width="1.5"
fill="none"/><path d="M150,270 L150,262 M160,270 L160,265" stroke="#166534" stroke-
width="1.5" fill="none"/>
<circle cx="40" cy="275" r="2.5" fill="#f472b6" /><circle
cx="60" cy="265" r="2.5" fill="#60a5fa" /><circle cx="340" cy="275" r="2.5"
fill="#facc15" /><circle cx="360" cy="265" r="2.5" fill="#f472b6" /><circle
cx="200" cy="275" r="2" fill="white" /><circle cx="250" cy="272" r="2" fill="white"
/>
</g>
</svg>
</div>
<!-- Content Z-Index 10 (Foreground) -->
<div class="relative z-10 mb-2 animate-pop mt-10 lg:mt-4">
<h2 class="text-4xl md:text-5xl lg:text-6xl text-yellow-300 font-
alasassy-style mb-4 animate-wave-text inline-block filter drop-shadow-lg stroke-
black">Welcome to English Class</h2>
<!-- Enhanced Title -->
<div class="animate-float mt-2 lg:mt-6">
<h1 class="text-6xl md:text-9xl lg:text-[10rem] leading-none
select-none pointer-events-none" style="font-family: 'Chewy', cursive;">
<div class="transform -rotate-3 hover:scale-105 transition
duration-300 z-10 relative">
<span class="block text-red-500 tracking-wider"
style="text-shadow: 5px 5px 0 #7f1d1d, -2px -2px 0 #fff; -webkit-text-stroke: 3px
black;">POSSESSIVE</span>
</div>
<div class="transform rotate-2 hover:scale-105 transition
duration-300 z-20 relative mt-[-10px] md:mt-[-20px] lg:mt-[-30px]">
<span class="block text-yellow-400 tracking-wider"
style="text-shadow: 5px 5px 0 #b45309, -2px -2px 0 #fff; -webkit-text-stroke: 3px
black;">ADJECTIVE</span>
</div>
<div class="transform -rotate-2 hover:scale-105 transition
duration-300 z-10 relative mt-[-5px] md:mt-[-15px] lg:mt-[-20px]">
<span class="block text-green-500 tracking-wider"
style="text-shadow: 5px 5px 0 #14532d, -2px -2px 0 #fff; -webkit-text-stroke: 3px
black;">ADVENTURE</span>
</div>
</h1>
</div>
</div>
<!-- FOREGROUND CENTER (Character Only) -->
<div class="flex items-end justify-center mb-40 md:mb-32 lg:mb-16
relative z-20 w-full mt-auto pointer-events-none">
<!-- Character: Ibu Guru Hijab Cantik (3D Cartoon Style) -->
<div class="w-48 h-48 md:w-72 md:h-72 lg:w-96 lg:h-96 animate-float
filter drop-shadow-2xl">
<svg viewBox="0 0 200 200" xmlns="[Link]
<defs>
<radialGradient id="skinGrad" cx="40%" cy="40%" r="50%"
fx="30%" fy="30%"><stop offset="0%" stop-color="#fff1f2" /><stop offset="100%"
stop-color="#fca5a5" /></radialGradient>
<linearGradient id="hijabGrad" x1="0%" y1="0%"
x2="100%" y2="100%"><stop offset="0%" stop-color="#fbcfe8" /><stop offset="60%"
stop-color="#f472b6" /><stop offset="100%" stop-color="#db2777" /></linearGradient>
<linearGradient id="clothGrad" x1="0%" y1="0%" x2="0%"
y2="100%"><stop offset="0%" stop-color="#2dd4bf" /><stop offset="100%" stop-
color="#0f766e" /></linearGradient>
<linearGradient id="bookGrad" x1="0%" y1="0%" x2="100%"
y2="100%"><stop offset="0%" stop-color="#3b82f6" /><stop offset="100%" stop-
color="#1e3a8a" /></linearGradient>
</defs>
<path d="M50,160 Q100,170 150,160 L160,220 L40,220 Z"
fill="url(#clothGrad)"/>
<path d="M40,70 Q100,-20 160,70 Q185,130 160,170 Q100,210
40,170 Q15,130 40,70" fill="url(#hijabGrad)" filter="drop-shadow(0px 4px 4px
rgba(0,0,0,0.2))"/>
<ellipse cx="100" cy="95" rx="45" ry="50"
fill="url(#skinGrad)"/>
<path d="M60,70 Q100,45 140,70 Q138,125 140,135 Q100,155
60,135 Q62,125 60,70" fill="none" stroke="#db2777" stroke-width="1.5"
opacity="0.4"/>
<ellipse cx="70" cy="112" rx="8" ry="5" fill="#fda4af"
opacity="0.5" filter="blur(1px)"/><ellipse cx="130" cy="112" rx="8" ry="5"
fill="#fda4af" opacity="0.5" filter="blur(1px)"/>
<path d="M65,82 Q75,76 87,82" fill="none" stroke="#78350f"
stroke-width="2.5" stroke-linecap="round"/><path d="M113,82 Q125,76 135,82"
fill="none" stroke="#78350f" stroke-width="2.5" stroke-linecap="round"/>
<g transform="translate(75, 96)"><ellipse cx="0" cy="0"
rx="10" ry="11" fill="white"/><circle cx="0" cy="0" r="7" fill="#854d0e"/><circle
cx="0" cy="0" r="4" fill="#1e293b"/><circle cx="3" cy="-3" r="2.5"
fill="white"/><circle cx="-3" cy="3" r="1.5" fill="white" opacity="0.8"/><path
d="M-10,-2 Q-5,-12 10,-2" fill="none" stroke="#1e293b" stroke-width="2.5" stroke-
linecap="round"/><path d="M10,-2 L13,-5" stroke="#1e293b" stroke-width="2" stroke-
linecap="round"/></g>
<g transform="translate(125, 96)"><ellipse cx="0" cy="0"
rx="10" ry="11" fill="white"/><circle cx="0" cy="0" r="7" fill="#854d0e"/><circle
cx="0" cy="0" r="4" fill="#1e293b"/><circle cx="3" cy="-3" r="2.5"
fill="white"/><circle cx="-3" cy="3" r="1.5" fill="white" opacity="0.8"/><path
d="M-10,-2 Q-5,-12 10,-2" fill="none" stroke="#1e293b" stroke-width="2.5" stroke-
linecap="round"/><path d="M10,-2 L13,-5" stroke="#1e293b" stroke-width="2" stroke-
linecap="round"/></g>
<g stroke="#be123c" stroke-width="2" fill="none"
opacity="0.9"><ellipse cx="75" cy="96" rx="16" ry="13"
fill="rgba(255,255,255,0.1)"/><ellipse cx="125" cy="96" rx="16" ry="13"
fill="rgba(255,255,255,0.1)"/><path d="M91,96 Q100,92 109,96"
stroke-width="2"/><path d="M59,96 L50,92"/><path d="M141,96 L150,92"/></g>
<path d="M98,108 Q100,110 102,108" fill="none"
stroke="#d97706" stroke-width="2" opacity="0.5"/>
<path d="M88,128 Q100,138 112,128" fill="none"
stroke="#be123c" stroke-width="2.5" stroke-linecap="round"/>
<path d="M90,129 Q100,135 110,129" fill="#fda4af"
opacity="0.6"/>
<g transform="rotate(-5, 100, 180)"><rect x="70" y="150"
width="60" height="75" rx="3" fill="url(#bookGrad)" stroke="#1e3a8a" stroke-
width="1"/><rect x="75" y="150" width="50" height="70" rx="2" fill="white"/><text
x="82" y="180" font-family="sans-serif" font-weight="bold" font-size="14"
fill="#1e3a8a">ENG</text><text x="82" y="195" font-family="sans-serif" font-
weight="bold" font-size="14" fill="#1e3a8a">LISH</text><path d="M70,150 L75,150
L75,225 L70,225 Z" fill="#1d4ed8"/></g>
<ellipse cx="70" cy="190" rx="10" ry="12"
fill="url(#skinGrad)" transform="rotate(20, 70, 190)"/><ellipse cx="130" cy="180"
rx="10" ry="12" fill="url(#skinGrad)" transform="rotate(-20, 130, 180)"/>
</svg>
</div>
</div>
<!-- Start Button -->
<button onclick="navigate('menu'); startMusicOnInteraction();
speakText('Welcome to Possessive Adjective Adventure');" class="absolute bottom-16
left-4 md:left-8 lg:bottom-24 lg:left-20 z-30 neumorph-btn px-16 py-5 lg:px-20
lg:py-6 text-3xl lg:text-4xl animate-pop hover:scale-110 transition shadow-xl
border-4 border-green-500 !bg-gradient-to-br !from-green-700 !to-green-900 text-
white relative overflow-visible group !rounded-full">
<div class="absolute -top-8 -right-8 lg:-top-12 lg:-right-12 text-
6xl lg:text-8xl animate-bounce group-hover:rotate-12 transition duration-300 filter
drop-shadow-md">🚀</div>
Let's Start!
</button>
<p class="text-white mt-4 opacity-80 text-sm absolute bottom-4 left-1/2
transform -translate-x-1/2 z-20 font-bold bg-pink-600/30 px-3 py-1 rounded-full
lg:text-lg">Created for Grade 7 SMP</p>
</div>
<!-- SCENE 2: MAIN MENU (POLISHED) -->
<div id="scene-menu" class="hidden-scene scene-container w-full max-w-6xl
mx-auto text-center">
<div class="neumorph-panel p-8 relative overflow-hidden bg-gradient-to-
br from-pink-100 via-rose-100 to-pink-200 border-4 border-pink-300 shadow-2xl h-
full flex flex-col justify-center">
<!-- Decorations -->
<div class="absolute inset-0 w-full h-full pointer-events-none
select-none z-0">
<!-- Big Flowers -->
<div class="absolute -top-10 -left-10 opacity-80 animate-spin-
slow" style="animation-duration: 30s;">
<svg width="180" height="180" viewBox="0 0 100 100"><path
d="M50,50 Q20,0 50,0 Q80,0 50,50" fill="#f472b6" stroke="#db2777" stroke-
width="1"/><path d="M50,50 Q80,0 100,50 Q80,100 50,50" fill="#fb7185"
stroke="#e11d48" stroke-width="1"/><path d="M50,50 Q80,100 50,100 Q20,100 50,50"
fill="#f472b6" stroke="#db2777" stroke-width="1"/><path d="M50,50 Q20,100 0,50
Q20,0 50,50" fill="#fb7185" stroke="#e11d48" stroke-width="1"/><circle cx="50"
cy="50" r="12" fill="#fde047" stroke="#eab308" stroke-width="2"/></svg>
</div>
<div class="absolute -bottom-10 -right-10 opacity-80 animate-
spin-slow" style="animation-duration: 25s; animation-direction: reverse;">
<svg width="200" height="200" viewBox="0 0 100 100"><circle
cx="50" cy="50" r="45" fill="#fbcfe8" opacity="0.5"/><path d="M50,20 L60,40 L80,40
L65,55 L70,75 L50,65 L30,75 L35,55 L20,40 L40,40 Z" fill="#ec4899" /><circle
cx="50" cy="50" r="10" fill="#fff" /></svg>
</div>
<!-- Garden Row -->
<div class="absolute bottom-0 left-0 w-full flex justify-around
items-end opacity-90 pb-2">
<div class="text-6xl transform translate-y-2 hover:animate-
bounce transition">🌷</div><div class="text-5xl transform translate-y-0 animate-
bounce" style="animation-duration: 3s;">🌻</div><div class="text-7xl transform
translate-y-4 hover:rotate-12 transition">🌺</div><div class="text-4xl transform -
translate-y-4 animate-pulse">🦋</div><div class="text-6xl transform translate-y-2
hover:animate-bounce transition">🌹</div><div class="text-5xl transform translate-y-
0 animate-bounce" style="animation-duration: 4s;">🌻</div><div class="text-7xl
transform translate-y-4 hover:-rotate-12 transition">🌸</div>
</div>
</div>
<h2 class="text-5xl font-bold text-pink-600 mb-10 border-b-8
border-white inline-block pb-4 pt-2 relative z-10 drop-shadow-md tracking-wider bg-
yellow-300 px-10 rounded-full transform -rotate-2 shadow-xl hover:scale-105
transition" style="font-family: 'Fredoka', sans-serif;">Main Menu</h2>
<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-6
relative z-10 w-full">
<!-- Buttons with Shapes & Stickers -->
<button onclick="navigate('objective')" class="neumorph-btn p-6
flex flex-col items-center gap-3 !bg-gradient-to-br !from-green-400/80 !to-green-
600/80 hover:!from-green-500/90 hover:!to-green-700/90 group border-4 border-green-
200/50 relative overflow-hidden shadow-lg transform transition hover:scale-105
backdrop-blur-md !rounded-tl-[50px] !rounded-br-[50px] !rounded-tr-lg !rounded-bl-
lg">
<div class="absolute top-2 left-2 text-3xl animate-bounce
pointer-events-none" style="animation-duration: 2s;">🐛</div>
<div class="absolute bottom-8 right-2 text-2xl animate-
wiggle pointer-events-none transform rotate-12">🐞</div>
<div class="bg-white/30 p-4 rounded-full group-hover:bg-
white/40 transition backdrop-blur-sm"><i class="fas fa-bullseye text-5xl text-white
drop-shadow-md"></i></div>
<span class="text-xl text-white font-bold drop-shadow-sm
relative z-10">Tujuan</span>
<div class="absolute -bottom-1 left-0 w-full text-center
text-lg opacity-80 pointer-events-none">🌱🌿🌱🌿🌱</div>
</button>
<button onclick="navigate('material')" class="neumorph-btn p-6
flex flex-col items-center gap-3 !bg-gradient-to-br !from-sky-300/80 !to-sky-500/80
hover:!from-sky-400/90 hover:!to-sky-600/90 group border-4 border-sky-200/50
relative overflow-hidden shadow-lg transform transition hover:scale-105 backdrop-
blur-md !rounded-[50px]">
<div class="absolute top-4 right-4 text-3xl animate-float
pointer-events-none transform rotate-12">✈️</div>
<div class="absolute bottom-4 left-4 text-3xl animate-pulse
pointer-events-none" style="animation-duration: 1.5s;">🚁</div>
<i class="fas fa-cloud btn-cloud-anim text-2xl top-2 left-
2" style="animation-duration: 8s;"></i>
<i class="fas fa-cloud btn-cloud-anim text-3xl bottom-4
left-0" style="animation-duration: 12s; animation-delay: 2s;"></i>
<div class="bg-white/30 p-4 rounded-full group-hover:bg-
white/40 transition backdrop-blur-sm relative z-10"><i class="fas fa-book-open
text-5xl text-white drop-shadow-md"></i></div>
<span class="text-xl text-white font-bold drop-shadow-sm
relative z-10">Materi</span>
</button>
<button onclick="navigate('games-menu')" class="neumorph-btn p-
6 flex flex-col items-center gap-3 !bg-gradient-to-br !from-yellow-300/80 !to-
yellow-500/80 hover:!from-yellow-400/90 hover:!to-yellow-600/90 group border-4
border-yellow-200/50 relative overflow-hidden shadow-lg transform transition
hover:scale-105 backdrop-blur-md !rounded-tr-[50px] !rounded-bl-[50px] !rounded-tl-
lg !rounded-br-lg">
<div class="absolute top-2 left-2 text-3xl animate-wiggle
pointer-events-none transform -rotate-12">👻</div>
<div class="absolute bottom-8 right-2 text-3xl animate-
bounce pointer-events-none" style="animation-duration: 1.2s;">👾</div>
<div class="absolute -bottom-4 left-1/2 transform -
translate-x-1/2 w-40 h-20 opacity-70 pointer-events-none">
<svg viewBox="0 0 100 50" class="w-full h-full"><path
d="M5,50 A45,45 0 0,1 95,50" fill="none" stroke="#ef4444" stroke-width="5" /><path
d="M10,50 A40,40 0 0,1 90,50" fill="none" stroke="#f97316" stroke-width="5" /><path
d="M15,50 A35,35 0 0,1 85,50" fill="none" stroke="#eab308" stroke-width="5" /><path
d="M20,50 A30,30 0 0,1 80,50" fill="none" stroke="#22c55e" stroke-width="5" /><path
d="M25,50 A25,25 0 0,1 75,50" fill="none" stroke="#3b82f6" stroke-width="5" /><path
d="M30,50 A20,20 0 0,1 70,50" fill="none" stroke="#a855f7" stroke-width="5"
/></svg>
</div>
<div class="bg-white/30 p-4 rounded-full group-hover:bg-
white/40 transition backdrop-blur-sm relative z-10"><i class="fas fa-gamepad text-
5xl text-white drop-shadow-md"></i></div>
<span class="text-xl text-white font-bold drop-shadow-sm
relative z-10">Games</span>
</button>
<button onclick="navigate('closing')" class="neumorph-btn p-6
flex flex-col items-center gap-3 !bg-gradient-to-br !from-pink-500/80 !to-pink-
700/80 hover:!from-pink-600/90 hover:!to-pink-800/90 group border-4 border-pink-
300/50 relative overflow-hidden shadow-lg transform transition hover:scale-105
backdrop-blur-md !rounded-t-[50px] !rounded-b-xl">
<div class="absolute top-2 right-2 text-3xl animate-pulse
pointer-events-none transform rotate-12">🐝</div>
<div class="absolute bottom-8 left-2 text-3xl animate-
float pointer-events-none transform -scale-x-100">🦋</div>
<div class="absolute top-2 left-2 text-2xl opacity-80
animate-spin pointer-events-none" style="animation-duration: 8s;">🌸</div><div
class="absolute bottom-2 right-2 text-2xl opacity-80 animate-pulse pointer-events-
none">🌺</div>
<div class="bg-white/30 p-4 rounded-full group-hover:bg-
white/40 transition backdrop-blur-sm relative z-10"><i class="fas fa-list-alt text-
5xl text-white drop-shadow-md"></i></div>
<span class="text-xl text-white font-bold drop-shadow-sm
relative z-10">Ringkasan</span>
</button>
</div>
</div>
</div>
<!-- OTHER SCENES (Restored and Polished) -->
<!-- OBJECTIVE -->
<div id="scene-objective" class="hidden-scene scene-container w-full max-w-
4xl mx-auto">
<div class="neumorph-panel p-10 text-center relative overflow-hidden
bg-gradient-to-br from-green-50 to-green-100">
<div class="absolute top-0 left-0 w-full h-full pointer-events-none
select-none">
<div class="absolute bottom-0 left-0 w-full text-4xl opacity-60
flex justify-between overflow-hidden whitespace-nowrap transform translate-y-
2"><span>🌱🌿🌱🌿🌱🌿🌱🌿🌱🌿🌱🌿🌱🌿🌱🌿🌱🌿🌱</span></div>
<div class="absolute -top-5 -right-5 text-8xl opacity-20
animate-spin">🍀</div>
</div>
<div class="absolute top-2 left-2 text-4xl animate-wiggle pointer-
events-none z-20 transform -rotate-12 filter drop-shadow-md">🎓</div>
<div class="absolute top-2 right-2 text-4xl animate-bounce pointer-
events-none z-20 filter drop-shadow-md">📚</div>
<div class="absolute bottom-2 left-2 text-4xl animate-float
pointer-events-none z-20 transform rotate-12">🐨</div>
<div class="absolute bottom-2 right-2 text-4xl animate-pulse
pointer-events-none z-20 filter drop-shadow-sm text-yellow-400">💡</div>
<div class="absolute inset-0 w-full h-full pointer-events-none z-10
overflow-hidden rounded-2xl"><i class="fas fa-dove bird-anim text-2xl text-white/90
drop-shadow-sm" style="top: 15%;"></i></div>
<h2 class="text-3xl font-bold text-green-800 mb-6 uppercase
tracking-wider relative z-10">Tujuan Pembelajaran</h2>
<div class="bg-white/80 p-6 rounded-xl border-2 border-green-300
shadow-sm mb-6 relative z-10 backdrop-blur-sm">
<p class="text-2xl text-gray-700 leading-relaxed font-
bold">"Siswa mampu mengenali dan menggunakan <br><span class="text-green-700 bg-
yellow-100 px-3 py-1 rounded inline-block mt-2 transform -rotate-1 border border-
yellow-300">Possessive Adjective</span><br>(Kata Sifat Kepemilikan) dengan
benar."</p>
</div>
<h3 class="text-green-600 font-bold mb-4 relative z-10">Kata Kunci
(Klik untuk dengar 🔊):</h3>
<div class="grid grid-cols-2 md:grid-cols-4 gap-4 text-lg font-bold
text-green-900 relative z-10">
<button onclick="speakText('My')" class="bg-green-100 p-3
rounded shadow-sm hover:scale-105 transition border border-green-200 flex items-
center justify-center gap-2"><i class="fas fa-volume-up text-green-600"></i> My
(Ku)</button>
<button onclick="speakText('Your')" class="bg-green-100 p-3
rounded shadow-sm hover:scale-105 transition border border-green-200 flex items-
center justify-center gap-2"><i class="fas fa-volume-up text-green-600"></i> Your
(Mu)</button>
<button onclick="speakText('His')" class="bg-green-100 p-3
rounded shadow-sm hover:scale-105 transition border border-green-200 flex items-
center justify-center gap-2"><i class="fas fa-volume-up text-green-600"></i> His
(Dia Lk)</button>
<button onclick="speakText('Her')" class="bg-green-100 p-3
rounded shadow-sm hover:scale-105 transition border border-green-200 flex items-
center justify-center gap-2"><i class="fas fa-volume-up text-green-600"></i> Her
(Dia Pr)</button>
<button onclick="speakText('Its')" class="bg-green-100 p-3
rounded shadow-sm hover:scale-105 transition border border-green-200 flex items-
center justify-center gap-2"><i class="fas fa-volume-up text-green-600"></i> Its
(Hewan)</button>
<button onclick="speakText('Our')" class="bg-green-100 p-3
rounded shadow-sm hover:scale-105 transition border border-green-200 flex items-
center justify-center gap-2"><i class="fas fa-volume-up text-green-600"></i> Our
(Kami)</button>
<button onclick="speakText('Their')" class="bg-green-100 p-3
rounded shadow-sm hover:scale-105 transition border border-green-200 flex items-
center justify-center gap-2"><i class="fas fa-volume-up text-green-600"></i> Their
(Mereka)</button>
</div>
<button onclick="navigate('material')" class="mt-8 neumorph-btn px-
8 py-3 bg-green-600 hover:bg-green-700 relative z-10 border-2 border-green-
400">Next <i class="fas fa-arrow-right ml-2"></i></button>
</div>
</div>
<!-- MATERIAL -->
<div id="scene-material" class="hidden-scene scene-container w-full max-w-
6xl mx-auto">
<div class="neumorph-panel p-6 min-h-[85vh] flex flex-col relative
overflow-hidden bg-gradient-to-br from-pink-200 to-rose-300">
<div class="absolute -bottom-20 -right-20 pointer-events-none z-0
opacity-60 animate-spin-slow" style="animation-duration: 60s;">
<svg width="500" height="500" viewBox="0 0 200 200"><g
fill="#fce7f3" stroke="#f472b6" stroke-width="1"><path d="M100,100 Q100,0 150,20
Q200,50 180,100 Z" /><path d="M100,100 Q200,100 180,150 Q150,200 100,180 Z" /><path
d="M100,100 Q100,200 50,180 Q0,150 20,100 Z" /><path d="M100,100 Q0,100 20,50 Q50,0
100,20 Z" /><path d="M100,100 Q150,50 180,20" stroke="none" fill="#fbcfe8"
opacity="0.5"/></g><g fill="#f9a8d4"><circle cx="100" cy="50" r="15" /><circle
cx="150" cy="100" r="15" /><circle cx="100" cy="150" r="15" /><circle cx="50"
cy="100" r="15" /></g><circle cx="100" cy="100" r="25" fill="#fde047"
stroke="#fbbf24" stroke-width="3" /></svg>
</div>
<!-- Stickers Repositioned -->
<div class="absolute inset-0 w-full h-full pointer-events-none z-20
overflow-hidden">
<div class="absolute top-2 left-2 text-5xl animate-bounce
filter drop-shadow-md">🦉</div>
<div class="absolute bottom-2 left-2 text-5xl animate-wiggle
transform -rotate-12 filter drop-shadow-md">✏️</div>
<div class="absolute top-1/2 right-4 text-5xl animate-float
filter drop-shadow-md">🧸</div>
<div class="absolute top-4 right-4 text-4xl text-yellow-300
animate-spin filter drop-shadow-lg">🌟</div>
<div class="absolute top-20 left-10 text-4xl animate-float
opacity-90 filter drop-shadow-md">🎈</div>
<div class="absolute bottom-40 right-8 text-4xl animate-pulse
filter drop-shadow-md">🍎</div>
<div class="absolute top-2 right-20 text-6xl opacity-90
animate-pulse filter drop-shadow-md">🌈</div>
<div class="absolute top-16 left-1/4 text-5xl animate-spin">🌞
</div>
<div class="absolute top-1/4 right-10 text-4xl animate-bounce
filter drop-shadow-md">📖</div>
<div class="absolute bottom-40 left-4 text-4xl animate-float
transform rotate-45 filter drop-shadow-md">🚀</div>
<div class="absolute bottom-20 right-2 text-4xl animate-spin-
slow opacity-80 filter drop-shadow-md">🌍</div>
</div>
<h2 class="text-3xl font-bold text-center text-rose-700 mb-6
border-b-4 border-rose-400 pb-2 drop-shadow-md relative z-10">Materi
Pembelajaran</h2>
<div class="flex flex-col md:flex-row gap-6 flex-grow relative z-
10">
<div class="w-full md:w-1/4 flex flex-col gap-2 bg-white/40 p-4
rounded-xl border-4 border-pink-200/60 backdrop-blur-md shadow-lg">
<h3 class="font-bold text-center text-pink-700 border-b-2
border-pink-300 pb-2 mb-2 text-shadow-sm">Subject ➔ Possessive</h3>
<div id="pronoun-list" class="space-y-2 overflow-y-auto
max-h-60 md:max-h-full pr-1"></div>
</div>
<div class="w-full md:w-3/4 flex flex-col">
<div id="slide-display" class="flex-grow bg-white/50
rounded-xl border-4 border-white/60 p-6 relative overflow-hidden flex flex-col
items-center text-center shadow-xl transition-all duration-500 backdrop-blur-md">
<div class="z-10 w-full flex flex-col items-center h-
full justify-center">
<div id="mat-icon" class="text-9xl mb-4 animate-
float filter drop-shadow-md"></div>
<h3 id="mat-title" class="text-6xl font-extrabold
text-blue-700 mb-2 font-comic text-3d"></h3>
<p id="mat-desc" class="text-2xl text-gray-800
font-bold mb-6 bg-white/60 px-4 py-2 rounded-lg backdrop-blur-sm shadow-sm"></p>
<div class="bg-yellow-50/60 border-2 border-yellow-
300/60 rounded-lg p-4 h-56 overflow-y-auto text-left w-full shadow-sm relative
backdrop-blur-sm">
<h4 class="font-bold text-yellow-900 mb-3 text-
center border-b border-yellow-200/60 pb-1 sticky top-0 bg-yellow-50/80 z-10 text-sm
md:text-base rounded"><i class="fas fa-headphones-alt text-blue-600 mr-2 animate-
bounce"></i> Klik kalimat untuk mendengarkan!</h4>
<ul id="mat-examples" class="list-none space-y-
2 text-lg text-gray-900 font-bold px-2 pb-2"></ul>
</div>
</div>
</div>
<div class="flex justify-between items-center mt-4 bg-
white/30 p-2 rounded-xl backdrop-blur-sm border border-white/40">
<button onclick="prevSlide()" class="neumorph-btn px-6
py-3 bg-gray-400 hover:bg-gray-500 border-2 border-white"><i class="fas fa-chevron-
left"></i> Prev</button>
<span id="slide-indicator" class="font-bold text-2xl
text-rose-800 font-mono bg-white/60 px-4 py-1 rounded shadow-inner border-2 border-
pink-200">1/7</span>
<button onclick="nextSlide()" class="neumorph-btn px-6
py-3 bg-pink-500 border-2 border-white">Next <i class="fas
fa-chevron-right"></i></button>
</div>
</div>
</div>
</div>
</div>
<!-- GAMES MENU -->
<div id="scene-games-menu" class="hidden-scene scene-container w-full max-
w-4xl mx-auto text-center">
<div class="neumorph-panel p-10 relative overflow-hidden bg-gradient-
to-br from-yellow-100 via-yellow-50 to-orange-100">
<div class="absolute inset-0 w-full h-full pointer-events-none z-
0">
<div class="absolute -top-20 left-1/2 transform -translate-x-
1/2 w-[120%] h-[300px] opacity-30">
<svg viewBox="0 0 200 100" class="w-full h-full"
preserveAspectRatio="none"><path d="M0,100 A100,100 0 0,1 200,100" fill="none"
stroke="#ef4444" stroke-width="8" /><path d="M10,100 A90,90 0 0,1 190,100"
fill="none" stroke="#f97316" stroke-width="8" /><path d="M20,100 A80,80 0 0,1
180,100" fill="none" stroke="#eab308" stroke-width="8" /><path d="M30,100 A70,70 0
0,1 170,100" fill="none" stroke="#22c55e" stroke-width="8" /><path d="M40,100
A60,60 0 0,1 160,100" fill="none" stroke="#3b82f6" stroke-width="8" /><path
d="M50,100 A50,50 0 0,1 150,100" fill="none" stroke="#a855f7" stroke-width="8"
/></svg>
</div>
<div class="absolute top-10 left-10 text-5xl opacity-60
animate-bounce">☁️</div>
<div class="absolute top-20 right-20 text-6xl opacity-50
animate-float">☁️</div>
<div class="absolute bottom-10 left-1/4 text-4xl text-yellow-
500 opacity-60 animate-pulse">✨</div>
</div>
<h2 class="text-4xl font-bold text-orange-600 mb-2 relative z-10
drop-shadow-sm border-b-4 border-orange-200 inline-block pb-2">Game Zone</h2>
<div class="flex flex-col md:flex-row gap-6 justify-center relative
z-10">
<button onclick="startGame(1)" class="neumorph-btn p-8 text-xl
flex-1 hover:scale-105 transition flex flex-col items-center justify-center gap-4
border-4 border-yellow-200 shadow-xl !bg-gradient-to-br !from-yellow-300 !to-
yellow-500 hover:!from-yellow-400 hover:!to-yellow-600 relative overflow-hidden
group !rounded-tl-[40px] !rounded-br-[40px]">
<div class="absolute -bottom-2 left-0 w-full flex justify-
center gap-1 text-2xl opacity-90 pointer-events-none select-none"><span
class="transform translate-y-1">🌱</span><span class="text-xl mt-2 transform -
translate-y-1">🌸</span><span class="transform translate-y-1">🌿</span></div>
<div class="absolute top-3 left-3 text-xl opacity-60
animate-spin pointer-events-none">🌻</div>
<div class="text-6xl filter drop-shadow-md relative z-10">🧩
</div><span class="font-bold text-white text-shadow relative z-10">Pasangkan
Kata</span><span class="text-sm opacity-90 font-normal bg-black/10 px-2 py-1
rounded relative z-10">Drag & Drop / Click</span>
</button>
<button onclick="startGame(2)" class="neumorph-btn p-8 text-xl
flex-1 hover:scale-105 transition flex flex-col items-center justify-center gap-4
border-4 border-green-200 shadow-xl !bg-gradient-to-br !from-green-400 !to-green-
600 hover:!from-green-500 hover:!to-green-700 relative overflow-hidden group !
rounded-[40px]">
<div class="absolute -bottom-2 left-0 w-full flex justify-
center gap-1 text-2xl opacity-90 pointer-events-none select-none"><span
class="transform translate-y-1">🌱</span><span class="text-xl mt-2 transform -
translate-y-1">🌿</span></div>
<div class="absolute top-4 left-4 text-xl opacity-60
animate-bounce pointer-events-none">🐞</div>
<div class="text-6xl filter drop-shadow-md relative z-10">🎈
</div><span class="font-bold text-white text-shadow relative z-10">Tangkap
Balon</span><span class="text-sm opacity-90 font-normal bg-black/10 px-2 py-1
rounded relative z-10">Pilihan Ganda</span>
</button>
<button onclick="startGame(3)" class="neumorph-btn p-8 text-xl
flex-1 hover:scale-105 transition flex flex-col items-center justify-center gap-4
border-4 border-pink-300 shadow-xl !bg-gradient-to-br !from-pink-500 !to-pink-700
hover:!from-pink-600 hover:!to-pink-800 relative overflow-hidden group !rounded-tr-
[40px] !rounded-bl-[40px]">
<div class="absolute -bottom-2 left-0 w-full flex justify-
center gap-1 text-2xl opacity-90 pointer-events-none select-none"><span
class="transform translate-y-1 hover:animate-bounce">🌷</span><span class="text-xl
mt-2 transform -translate-y-1">🍃</span></div>
<div class="text-6xl filter drop-shadow-md relative z-
10">🃏</div><span class="font-bold text-white text-shadow relative z-10">Memory
Match</span><span class="text-sm opacity-90 font-normal bg-black/10 px-2 py-1
rounded relative z-10">Ingatan Kuat</span>
</button>
</div>
</div>
</div>
<!-- GAME 1 -->
<div id="scene-game1" class="hidden-scene scene-container w-full max-w-6xl
mx-auto">
<div class="flex justify-between items-center mb-4 bg-white/90 p-3
rounded-xl shadow-lg border-2 border-purple-200 relative z-20">
<h2 class="text-2xl font-bold text-purple-700"><i class="fas fa-
puzzle-piece mr-2"></i> Pasangkan Kata!</h2>
<div class="text-xl font-bold bg-purple-100 px-4 py-1 rounded-lg
text-purple-800">Score: <span id="score-g1" class="text-2xl">0</span></div>
</div>
<div class="neumorph-panel p-6 bg-pink-50 flex flex-col md:flex-row
gap-6 min-h-[60vh] relative overflow-hidden">
<div class="absolute inset-0 w-full h-full pointer-events-none z-
0">
<div class="absolute top-4 left-4 text-6xl opacity-30 animate-
bounce">📚</div><div class="absolute bottom-10 right-10 text-6xl opacity-30 animate-
wiggle transform -rotate-12">✏️</div><div class="absolute top-1/2 left-2 text-5xl
opacity-20 animate-float">🎒</div><div class="absolute top-6 right-20 text-5xl
opacity-20 animate-spin-slow">📏</div><div class="absolute bottom-4 left-1/3 text-5xl
opacity-20 animate-pulse">✂️</div>
</div>
<div class="w-full md:w-3/4 relative z-10">
<h3 class="text-center text-gray-500 mb-2 text-sm italic font-
bold bg-white/50 inline-block px-4 py-1 rounded-full backdrop-blur-sm">Klik jawaban
di kanan, lalu klik kotak kosong di kiri.</h3>
<div id="g1-drop-area" class="grid grid-cols-1 sm:grid-cols-2
gap-4 h-full content-start"></div>
</div>
<div class="w-full md:w-1/4 bg-white/90 backdrop-blur-sm rounded-xl
p-4 border-4 border-dashed border-blue-400 flex flex-col shadow-inner relative z-
10">
<h3 class="text-center font-bold mb-4 text-blue-600 uppercase
border-b pb-2">Pilihan Jawaban</h3>
<div id="g1-drag-area" class="flex flex-wrap justify-center
gap-3 content-start"></div>
<div id="g1-message" class="mt-auto text-center font-bold text-
lg min-h-[2rem]"></div>
</div>
</div>
<button id="btn-finish-g1" onclick="finishGame(1)" class="hidden
neumorph-btn w-full mt-4 py-3 bg-green-500 text-xl shadow-lg animate-bounce
relative z-20">Next <i class="fas fa-check-circle"></i></button>
</div>
<!-- GAME 2 -->
<div id="scene-game2" class="hidden-scene scene-container w-full max-w-5xl
mx-auto">
<div class="neumorph-panel p-0 relative overflow-hidden bg-gradient-to-
b from-sky-300 to-sky-100 min-h-[80vh] flex flex-col border-4 border-sky-400">
<div class="absolute inset-0 w-full h-full pointer-events-none
select-none z-0">
<i class="fas fa-cloud cloud-anim text-8xl text-white/60"
style="top: 10%; left: -100px; animation-duration: 40s;"></i>
<i class="fas fa-cloud cloud-anim text-9xl text-white/50"
style="bottom: 20%; left: -200px; animation-duration: 55s; animation-delay:
5s;"></i>
</div>
<div class="relative z-30 p-4 flex justify-between items-center bg-
white/40 backdrop-blur-md border-b border-white/50 shadow-sm">
<span class="font-bold text-blue-800 text-xl flex items-center
gap-2"><i class="fas fa-parachute-box text-blue-600"></i> Tangkap Balon!</span>
<div class="flex gap-4"><span class="font-bold text-blue-800
bg-white/60 px-3 py-1 rounded-lg">Soal: <span id="g2-q-num">1</span>/10</span><span
class="font-bold text-green-700 bg-green-100/90 px-3 py-1 rounded-lg border border-
green-200">Score: <span id="score-g2">0</span></span></div>
</div>
<div class="progress-bar-container h-2 rounded-none bg-blue-200
border-none"><div id="g2-progress" class="progress-bar-fill
!bg-blue-500"></div></div>
<div id="g2-sky-zone" class="relative flex-grow w-full overflow-
hidden z-10 h-full min-h-[400px]"></div>
<!-- Question Box with Flower Sticker -->
<div class="absolute bottom-0 left-0 w-full p-6 bg-white/90
backdrop-blur-lg border-t-4 border-blue-400 z-30 text-center shadow-[0_-
5px_20px_rgba(0,0,0,0.1)]">
<!-- Added Flower Sticker -->
<div class="absolute -top-8 right-8 text-6xl animate-bounce
drop-shadow-md pointer-events-none" style="animation-duration: 3s;">🌻</div>
<div class="absolute -top-5 left-8 text-4xl animate-pulse drop-
shadow-md pointer-events-none">🌷</div>
<p class="text-gray-500 text-sm font-bold uppercase mb-1
tracking-wider">Pertanyaan:</p>
<p id="g2-question" class="text-2xl md:text-3xl font-bold text-
blue-900 leading-snug font-comic"></p>
</div>
<div id="g2-feedback" class="absolute inset-0 z-40 hidden flex-col
items-center justify-center bg-black/40 backdrop-blur-sm">
<div class="bg-white p-8 rounded-3xl shadow-2xl text-center
max-w-sm animate-pop border-4 border-blue-300 relative">
<div id="g2-face" class="text-8xl mb-4
animate-bounce"></div>
<h2 id="g2-msg" class="text-3xl font-bold mb-4"></h2>
<button onclick="nextG2Question()" class="neumorph-btn px-
10 py-3 text-xl shadow-xl bg-blue-500 hover:bg-blue-600 text-white border-2 border-
white">Next <i class="fas fa-arrow-right"></i></button>
</div>
</div>
</div>
</div>
<!-- GAME 3 -->
<div id="scene-game3" class="hidden-scene scene-container w-full max-w-5xl
mx-auto">
<div class="neumorph-panel p-8 flex flex-col items-center gap-4 min-h-
[80vh] bg-gradient-to-br from-pink-100 to-purple-100 border-4 border-pink-300">
<div class="w-full flex justify-between items-center bg-white/60
p-4 rounded-xl backdrop-blur-md shadow-sm mb-4">
<h2 class="text-2xl font-bold text-pink-700 flex items-center
gap-2"><span class="text-3xl">🃏</span> Jodohkan Kartu!</h2>
<div class="flex gap-4">
<div class="text-lg font-bold text-purple-700 bg-purple-
100 px-3 py-1 rounded-lg border border-purple-200">Matches: <span id="g3-
matches">0</span>/6</div>
<div class="text-lg font-bold text-green-700 bg-green-100
px-3 py-1 rounded-lg border border-green-200">Score: <span
id="score-g3">0</span></div>
</div>
</div>
<div class="w-full flex justify-center items-start flex-grow"><div
id="g3-board" class="memory-grid"></div></div>
<div id="g3-info" class="text-gray-500 font-bold text-lg animate-
pulse mt-4">Klik kartu untuk mencari pasangannya!</div>
<button onclick="navigate('games-menu')" class="neumorph-btn bg-
gray-400 text-white py-2 px-6 mt-2">Keluar</button>
<div id="g3-win-overlay" class="absolute inset-0 z-50 hidden flex-
col items-center justify-center bg-black/60 backdrop-blur-sm rounded-2xl">
<div class="bg-white p-8 rounded-3xl shadow-2xl text-center
max-w-sm animate-pop border-4 border-pink-400">
<div class="text-8xl mb-4 animate-bounce">🎉</div>
<h2 class="text-4xl font-bold text-pink-600 mb-2">Hebat!
</h2>
<p class="text-gray-600 mb-6 font-bold">Semua kartu cocok!
</p>
<button onclick="navigate('evaluation');
calculateFinal();" class="neumorph-btn secondary px-10 py-3 text-xl shadow-xl
border-2 border-white">Lanjut</button>
</div>
</div>
</div>
</div>
<!-- EVALUATION -->
<div id="scene-evaluation" class="hidden-scene scene-container w-full max-
w-3xl mx-auto text-center">
<div class="neumorph-panel p-10 bg-gradient-to-b from-blue-50 to-white
relative overflow-hidden">
<i class="fas fa-certificate text-yellow-100 text-9xl absolute -
top-10 -right-10 transform rotate-12"></i>
<h2 class="text-4xl font-bold text-blue-800 mb-6 relative z-
10">Rapor Petualangan</h2>
<div class="w-48 h-48 mx-auto bg-gradient-to-br from-yellow-300 to-
yellow-500 rounded-full flex flex-col items-center justify-center border-8 border-
white shadow-2xl mb-6 relative z-10">
<span class="text-sm font-bold text-yellow-900 uppercase">Total
Score</span>
<span id="final-score" class="text-7xl font-extrabold text-
white text-3d">0</span>
</div>
<h3 id="motivation-text" class="text-2xl font-bold text-pink-600
mb-8 animate-pulse bg-white/80 inline-block px-4 py-1 rounded"></h3>
<div class="grid grid-cols-3 gap-4 mb-8 text-sm md:text-base
relative z-10">
<div class="bg-pink-100 p-4 rounded-xl border border-pink-
200"><div class="font-bold text-pink-800 mb-1">Game 1</div><div class="text-xs
text-pink-600 mb-2">Drag & Drop</div><div id="res-g1" class="text-2xl font-black
text-pink-700">0</div></div>
<div class="bg-blue-100 p-4 rounded-xl border border-blue-
200"><div class="font-bold text-blue-800 mb-1">Game 2</div><div class="text-xs
text-blue-600 mb-2">Quiz</div><div id="res-g2" class="text-2xl font-black text-
blue-700">0</div></div>
<div class="bg-green-100 p-4 rounded-xl border border-green-
200"><div class="font-bold text-green-800 mb-1">Game 3</div><div class="text-xs
text-green-600 mb-2">Memory</div><div id="res-g3" class="text-2xl font-black text-
green-700">0</div></div>
</div>
<div class="flex flex-col md:flex-row justify-center gap-4 relative
z-10">
<button onclick="[Link]()" class="neumorph-btn px-8
py-3 bg-gray-500 text-gray-100"><i class="fas fa-redo"></i> Ulangi</button>
<button onclick="navigate('closing')" class="neumorph-btn
secondary px-8 py-3 text-lg shadow-lg">Ringkasan Akhir <i class="fas fa-arrow-
right"></i></button>
</div>
</div>
</div>
<!-- CLOSING -->
<div id="scene-closing" class="hidden-scene scene-container w-full max-w-
4xl mx-auto text-center">
<div class="neumorph-panel p-10 relative overflow-hidden bg-gradient-
to-br from-purple-100 to-fuchsia-100">
<div class="absolute inset-0 w-full h-full pointer-events-none
select-none z-0"><div class="absolute -top-5 -left-5 text-7xl opacity-20 animate-
spin" style="animation-duration: 25s;">🌸</div><div class="absolute top-20 right-5
text-5xl opacity-30 animate-float" style="animation-duration: 5s;">🌺</div><div
class="absolute bottom-10 left-10 text-4xl opacity-30 animate-bounce"
style="animation-duration: 3s;">🌷</div></div>
<h2 class="text-4xl font-bold text-purple-800 mb-6 border-b-4
border-purple-300 inline-block pb-2 relative z-10">Ringkasan Materi</h2>
<div class="bg-white/80 p-6 rounded-xl border-2 border-purple-200
text-left grid grid-cols-1 md:grid-cols-2 gap-4 text-xl mb-8 shadow-inner relative
z-10 backdrop-blur-sm">
<div class="flex items-center gap-2 border-b border-purple-100
pb-2"><span class="bg-purple-500 text-white w-8 h-8 rounded-full flex items-center
justify-center text-sm font-bold shadow-sm">1</span> I ➔ <b class="text-purple-
600">My</b></div>
<div class="flex items-center gap-2 border-b border-purple-100
pb-2"><span class="bg-purple-500 text-white w-8 h-8 rounded-full flex items-center
justify-center text-sm font-bold shadow-sm">2</span> You ➔ <b class="text-purple-
600">Your</b></div>
<div class="flex items-center gap-2 border-b border-purple-100
pb-2"><span class="bg-purple-500 text-white w-8 h-8 rounded-full flex items-center
justify-center text-sm font-bold shadow-sm">3</span> He ➔ <b class="text-purple-
600">His</b></div>
<div class="flex items-center gap-2 border-b border-purple-100
pb-2"><span class="bg-purple-500 text-white w-8 h-8 rounded-full flex items-center
justify-center text-sm font-bold shadow-sm">4</span> She ➔ <b class="text-purple-
600">Her</b></div>
<div class="flex items-center gap-2 border-b border-purple-100
pb-2"><span class="bg-purple-500 text-white w-8 h-8 rounded-full flex items-center
justify-center text-sm font-bold shadow-sm">5</span> It ➔ <b class="text-purple-
600">Its</b></div>
<div class="flex items-center gap-2 border-b border-purple-100
pb-2"><span class="bg-purple-500 text-white w-8 h-8 rounded-full flex items-center
justify-center text-sm font-bold shadow-sm">6</span> We ➔ <b class="text-purple-
600">Our</b></div>
<div class="flex items-center gap-2 border-b border-purple-100
pb-2"><span class="bg-purple-500 text-white w-8 h-8 rounded-full flex items-center
justify-center text-sm font-bold shadow-sm">7</span> They ➔ <b class="text-purple-
600">Their</b></div>
</div>
<h3 class="text-2xl font-bold text-purple-700 mb-8 relative z-
10">Satu langkah lagi sebelum selesai...</h3>
<button onclick="navigate('feedback')" class="neumorph-btn
secondary px-12 py-3 text-xl hover:scale-105 shadow-xl relative z-10 !bg-gradient-
to-br !from-purple-500 !to-fuchsia-600 hover:!from-purple-600 hover:!to-fuchsia-700
border-2 border-purple-200">Berikan Feedback <i class="fas fa-comment-dots ml-
2"></i></button>
</div>
</div>
<!-- FEEDBACK -->
<div id="scene-feedback" class="hidden-scene scene-container w-full max-w-
3xl mx-auto text-center">
<div class="neumorph-panel p-10 relative overflow-hidden bg-gradient-
to-br from-pink-100 via-rose-50 to-pink-200">
<div class="absolute inset-0 w-full h-full pointer-events-none
select-none z-0">
<div class="absolute bottom-0 left-0 w-full text-3xl opacity-60
flex justify-between overflow-hidden whitespace-nowrap transform translate-y-
2"><span>🌱🌿🌷🌱🌿🌻🌱🌿🌷🌱🌿🌻🌱🌿🌷🌱🌿</span></div>
<div class="absolute top-10 left-10 text-5xl opacity-30
animate-spin">🌸</div><div class="absolute top-20 right-10 text-4xl opacity-40
animate-float">🌺</div>
</div>
<div class="relative z-10">
<h2 class="text-3xl font-bold text-rose-700 mb-2 drop-shadow-
sm">Refleksi Belajar</h2>
<p class="text-xl text-rose-800 mb-8 font-semibold">Bagaimana
perasaanmu setelah belajar hari ini?</p>
<div class="flex justify-center gap-4 md:gap-8 mb-8 flex-wrap">
<button onclick="selectMood(this, 'happy')" class="mood-btn
neumorph-btn p-4 rounded-3xl flex flex-col items-center gap-2 border-4 border-pink-
400 !bg-gradient-to-br !from-pink-500 !to-pink-700 hover:!from-pink-600 hover:!to-
pink-800 shadow-lg transform transition hover:scale-110 group">
<div class="w-16 h-16 filter drop-shadow-md group-
hover:animate-bounce"><svg viewBox="0 0 100 100"><defs><radialGradient
id="gradHappy" cx="40%" cy="40%" r="55%" fx="25%" fy="25%"><stop offset="0%" stop-
color="#fef08a" /><stop offset="100%" stop-color="#eab308"
/></radialGradient></defs><circle cx="50" cy="50" r="45" fill="url(#gradHappy)"
stroke="#ca8a04" stroke-width="2"/><path d="M25,35 L30,20 L35,35 L50,40 L35,45
L30,60 L25,45 L10,40 Z" fill="#1d4ed8" transform="scale(0.8)
translate(15,10)"/><path d="M65,35 L70,20 L75,35 L90,40 L75,45 L70,60 L65,45 L50,40
Z" fill="#1d4ed8" transform="scale(0.8) translate(35,10)"/><path d="M25,65 Q50,90
75,65" fill="#be123c" stroke="#9f1239" stroke-width="2"/><path d="M30,65 Q50,75
70,65" fill="white" opacity="0.6"/><circle cx="20" cy="55" r="5" fill="#f43f5e"
opacity="0.4"/><circle cx="80" cy="55" r="5" fill="#f43f5e"
opacity="0.4"/></svg></div>
<span class="text-base text-white font-bold tracking-
wide">Senang</span>
</button>
<button onclick="selectMood(this, 'neutral')" class="mood-
btn neumorph-btn p-4 rounded-3xl flex flex-col items-center gap-2 border-4 border-
pink-400 !bg-gradient-to-br !from-pink-500 !to-pink-700 hover:!from-pink-600
hover:!to-pink-800 shadow-lg transform transition hover:scale-110 group">
<div class="w-16 h-16 filter drop-shadow-md group-
hover:rotate-12 transition"><svg viewBox="0 0 100 100"><defs><radialGradient
id="gradNeutral" cx="40%" cy="40%" r="55%" fx="25%" fy="25%"><stop offset="0%"
stop-color="#fde047" /><stop offset="100%" stop-color="#d97706"
/></radialGradient></defs><circle cx="50" cy="50" r="45" fill="url(#gradNeutral)"
stroke="#b45309" stroke-width="2"/><circle cx="35" cy="40" r="6"
fill="#374151"/><circle cx="65" cy="40" r="6" fill="#374151"/><line x1="35" y1="70"
x2="65" y2="70" stroke="#374151" stroke-width="4" stroke-linecap="round"/><line
x1="30" y1="30" x2="40" y2="30" stroke="#374151" stroke-width="2"/><line x1="60"
y1="30" x2="70" y2="30" stroke="#374151" stroke-width="2"/></svg></div>
<span class="text-base text-white font-bold tracking-
wide">Biasa</span>
</button>
<button onclick="selectMood(this, 'confused')" class="mood-
btn neumorph-btn p-4 rounded-3xl flex flex-col items-center gap-2 border-4 border-
pink-400 !bg-gradient-to-br !from-pink-500 !to-pink-700 hover:!from-pink-600
hover:!to-pink-800 shadow-lg transform transition hover:scale-110 group">
<div class="w-16 h-16 filter drop-shadow-md group-
hover:animate-wiggle"><svg viewBox="0 0 100 100"><defs><radialGradient
id="gradConfused" cx="40%" cy="40%" r="55%" fx="25%" fy="25%"><stop offset="0%"
stop-color="#fef9c3" /><stop offset="100%" stop-color="#ca8a04"
/></radialGradient></defs><circle cx="50" cy="50" r="45" fill="url(#gradConfused)"
stroke="#a16207" stroke-width="2"/><circle cx="35" cy="40" r="7"
fill="#374151"/><circle cx="65" cy="38" r="5" fill="#374151"/><path d="M28,28
Q35,20 42,28" fill="none" stroke="#374151" stroke-width="2"/><line x1="60" y1="28"
x2="70" y2="30" stroke="#374151" stroke-width="2"/><path d="M35,70 Q45,60 50,70
T65,70" fill="none" stroke="#374151" stroke-width="3" stroke-linecap="round"/><path
d="M75,25 Q70,20 75,15 Q80,20 75,25" fill="#60a5fa" opacity="0.8"/></svg></div>
<span class="text-base text-white font-bold tracking-
wide">Bingung</span>
</button>
</div>
<div class="mb-8">
<label class="block text-left text-lg font-bold text-rose-
800 mb-2 ml-2">Pesan atau Kesan (Opsional):</label>
<textarea id="feedback-text" class="w-full p-4 rounded-xl
border-2 border-rose-300 focus:border-rose-500 outline-none text-gray-700 shadow-
inner bg-white/60 resize-none font-sans" rows="3" placeholder="Tuliskan
pengalamanmu di sini..."></textarea>
</div>
<button onclick="submitFeedback()" class="neumorph-btn success
px-10 py-3 text-xl w-full md:w-auto shadow-lg border-2 border-green-400 !bg-
gradient-to-br !from-green-500 !to-green-700 hover:!from-green-600 hover:!to-green-
800">Kirim & Selesai <i class="fas fa-paper-plane"></i></button>
</div>
</div>
</div>
<!-- FINAL -->
<div id="scene-final" class="hidden-scene scene-container w-full max-w-4xl
mx-auto text-center">
<div class="neumorph-panel p-10 md:p-16 flex flex-col items-center
justify-center min-h-[70vh] relative overflow-visible bg-white/80">
<div class="absolute inset-0 pointer-events-none overflow-hidden
rounded-2xl">
<div class="absolute top-10 left-10 text-4xl animate-bounce"
style="animation-duration: 2s;">🎉</div>
<div class="absolute top-20 right-20 text-5xl animate-spin"
style="animation-duration: 5s;">✨</div>
<div class="absolute bottom-10 left-20 text-4xl animate-
pulse">🎊</div>
</div>
<div class="text-9xl mb-6 animate-bounce filter drop-shadow-xl">🎉
</div>
<h2 class="text-5xl font-bold text-blue-800 mb-6 drop-shadow-
sm">Thank You!</h2>
<p class="text-2xl text-gray-600 mb-12 font-bold">Kamu telah
menyelesaikan petualangan ini dengan hebat.<br>Sampai jumpa lagi!</p>
<button onclick="[Link]()" class="neumorph-btn px-14 py-4
text-xl !bg-gradient-to-br !from-pink-600 !to-pink-800 hover:!from-pink-700 hover:!
to-pink-900 border-4 border-pink-400 relative overflow-visible group shadow-2xl
transition transform hover:scale-110 mb-4">
<div class="absolute -top-5 -left-5 text-5xl animate-spin
pointer-events-none" style="animation-duration: 12s;">🌸</div><div class="absolute -
bottom-4 -right-5 text-5xl animate-bounce pointer-events-none" style="animation-
duration: 3s;">🌺</div><div class="absolute top-1/2 -right-8 transform -translate-y-
1/2 text-4xl animate-pulse pointer-events-none">🌷</div><div class="absolute -
bottom-6 left-1/2 transform -translate-x-1/2 text-3xl animate-wiggle pointer-
events-none">🌻</div>
<span class="text-white drop-shadow-md leading-none tracking-
wider" style="font-family: 'Bangers', cursive; font-size: 3rem;">Main Lagi</span>
</button>
</div>
</div>
</div>
<!-- JAVASCRIPT LOGIC -->
<script>
// GLOBAL
var audioCtx = null;
var noiseBuffer = null;
var bgmInterval = null;
function initAudio() {
if (!audioCtx) {
const AudioContext = [Link] ||
[Link];
audioCtx = new AudioContext();
const bufferSize = [Link] * 2;
noiseBuffer = [Link](1, bufferSize,
[Link]);
const data = [Link](0);
for (let i = 0; i < bufferSize; i++) { data[i] = [Link]() * 2
- 1; }
}
if ([Link] === 'suspended') [Link]();
}
function startMusicOnInteraction() { initAudio(); }
const state = {
scene: 'welcome',
musicOn: false,
scores: { g1: 0, g2: 0, g3: 0 },
slides: { current: 0 },
g2Index: 0,
g3Pos: 1,
g3QuestionIdx: 0,
g1Selection: null,
feedback: { mood: '', text: '' }
};
// PARALLAX & SPARKLES
[Link]('mousemove', (e) => {
// Sparkles
if ([Link]() < 0.1) {
const sparkle = [Link]('div');
[Link] = 'sparkle';
[Link] = [Link] + 'px';
[Link] = [Link] + 'px';
[Link](sparkle);
setTimeout(() => [Link](), 800);
}
// Parallax on Welcome Screen
if ([Link] === 'welcome') {
const moveX = ([Link] - [Link]/2) * 0.02;
const moveY = ([Link] - [Link]/2) * 0.02;
const sky = [Link]('welcome-sky');
const school = [Link]('welcome-school');
if (sky) [Link] = `translate(${moveX}px, ${moveY}px)`;
if (school) [Link] = `translate(${-moveX * 0.5}px,
${-moveY * 0.5}px)`;
}
});
// EASTER EGG
function toggleSunGlasses() {
const glasses = [Link]('sun-glasses');
if (glasses) {
[Link]('hidden');
playClick();
}
}
const feedbackMessages = {
correct: ["Excellent! 🌟", "Great Job! 👍", "Spot On! 🎯", "You're
Amazing! 🚀", "Fantastic! 🔥", "Wow, Cool! 🤩", "Perfect Score! 💯", "Perfect! ✨"],
wrong: ["Try Again! 💪", "Almost There! 🤏", "Don't Give Up! ✨", "Oops,
Not Quite 🙈", "Keep Going! 🌈", "Think Again 🤔", "Not Quite, Try Again! 🚀"]
};
function getRandomFeedback(isCorrect) {
const list = isCorrect ? [Link] :
[Link];
return list[[Link]([Link]() * [Link])];
}
function playApplause() {
if (![Link] && !audioCtx) return;
playCorrect();
const now = [Link];
for (let i = 0; i < 15; i++) {
const source = [Link]();
[Link] = noiseBuffer;
const gain = [Link]();
const filter = [Link]();
[Link] = 'bandpass';
[Link] = 800 + [Link]() * 400;
const start = now + [Link]() * 0.4;
const duration = 0.1 + [Link]() * 0.05;
[Link](0, start);
[Link](0.15, start + 0.01);
[Link](0.001, start + duration);
[Link](filter); [Link](gain);
[Link]([Link]);
[Link](start); [Link](start + duration + 0.1);
}
}
function triggerCelebration() {
const emojis = ['👏', '🎉', '🌟', '🤩', '💯', '✨'];
const container = [Link];
for (let i = 0; i < 15; i++) {
const el = [Link]('div');
[Link] = emojis[[Link]([Link]() * [Link])];
[Link] = 'celebration-emoji text-4xl md:text-6xl';
[Link] = [Link]() * 80 + 10 + 'vw';
[Link] = [Link]() * 60 + 20 + 'vh';
[Link] = [Link]() * 0.5 + 's';
[Link](el);
setTimeout(() => [Link](), 1500);
}
}
function speakText(input, defaultLang = 'en-US') {
if (![Link]) return;
[Link]();
const queue = [Link](input) ? input : [{ text: input, lang:
defaultLang }];
[Link](item => {
const utterance = new SpeechSynthesisUtterance([Link]);
[Link] = [Link] || defaultLang;
[Link] = 0.9; [Link] = 1.1; [Link] = 1;
const voices = [Link]();
if ([Link] > 0) {
const targetLang = [Link];
const specificVoice = [Link](v => [Link] === targetLang)
|| [Link](v => [Link](targetLang));
if (specificVoice) [Link] = specificVoice;
}
[Link](utterance);
});
}
function playTone(freq, type, duration, vol = 0.1) {
if (!audioCtx) return;
const osc = [Link]();
const gainNode = [Link]();
[Link] = type;
[Link](freq, [Link]);
[Link](0, [Link]);
[Link](vol, [Link] +
0.05);
[Link](0.001, [Link]
+ duration);
[Link](gainNode);
[Link]([Link]);
[Link]();
[Link]([Link] + duration);
}
function startBGM() {
if (bgmInterval) clearInterval(bgmInterval);
playMelodySequence();
bgmInterval = setInterval(playMelodySequence, 1900);
}
function stopBGM() {
if (bgmInterval) { clearInterval(bgmInterval); bgmInterval = null; }
}
function playMelodySequence() {
if (![Link]) return;
const volume = 0.07;
const type = 'square';
// Funky Loop
playTone(523.25, type, 0.1, volume);
setTimeout(() => playTone(659.25, type, 0.1, volume), 150);
setTimeout(() => playTone(783.99, type, 0.1, volume), 300);
setTimeout(() => playTone(880.00, type, 0.2, volume), 450);
setTimeout(() => playTone(698.46, type, 0.1, volume), 700);
setTimeout(() => playTone(587.33, type, 0.1, volume), 850);
setTimeout(() => playTone(493.88, type, 0.1, volume), 1000);
setTimeout(() => playTone(392.00, type, 0.1, volume), 1150);
setTimeout(() => playTone(523.25, type, 0.1, volume), 1400);
setTimeout(() => playTone(783.99, type, 0.1, volume), 1550);
setTimeout(() => playTone(1046.50, type, 0.3, volume), 1700);
}
function playCorrect() { if([Link] || audioCtx) { playTone(600,
'sine', 0.1, 0.2); setTimeout(() => playTone(800, 'sine', 0.3, 0.2), 100); } }
function playWrong() { if([Link] || audioCtx) { playTone(200,
'sawtooth', 0.2, 0.15); setTimeout(() => playTone(150, 'sawtooth', 0.3, 0.15),
150); } }
function playClick() { if([Link] || audioCtx) { playTone(400,
'triangle', 0.1, 0.1); } }
function toggleMusic() {
initAudio();
[Link] = ![Link];
const btn = [Link]('music-icon');
if ([Link]) { [Link] = "fas fa-volume-up"; startBGM(); }
else { [Link] = "fas fa-volume-mute"; stopBGM(); }
}
const materials = [
{ sub: 'I', poss: 'My', icon: ' ', bg: 'bg-pink-100/50', desc:
'Digunakan ketika "SAYA" memiliki sesuatu.', examples: ["I have a book. It is
<b>my</b> book.", "This is <b>my</b> new bag.", "<b>My</b> name is Budi.", "I love
<b>my</b> cat."] },
{ sub: 'You', poss: 'Your', icon: '🫵', bg: 'bg-green-100/50', desc:
'Digunakan ketika "KAMU" memiliki sesuatu.', examples: ["You have a pen. It is
<b>your</b> pen.", "Is this <b>your</b> bike?", "Open <b>your</b> book.", "Wash
<b>your</b> hands."] },
{ sub: 'He', poss: 'His', icon: '👦', bg: 'bg-blue-100/50', desc: 'Milik
DIA (Laki-laki).', examples: ["He has a car. It is <b>his</b> car.", "<b>His</b>
hair is short.", "He likes <b>his</b> job.", "Budi plays <b>his</b> guitar."] },
{ sub: 'She', poss: 'Her', icon: '👧', bg: 'bg-purple-100/50', desc:
'Milik DIA (Perempuan).', examples: ["She has a doll. It is <b>her</b> doll.",
"<b>Her</b> dress is red.", "Sinta cooks <b>her</b> food.", "She loves <b>her</b>
mom."] },
{ sub: 'It', poss: 'Its', icon: '🐱', bg: 'bg-orange-100/50', desc:
'Milik HEWAN atau BENDA.', examples: ["The cat eats <b>its</b> food.", "The tree
loses <b>its</b> leaves.", "The dog wags <b>its</b> tail.", "The car has <b>its</b>
wheels."] },
{ sub: 'We', poss: 'Our', icon: '', bg: 'bg-teal-100/50', desc: 'Milik
KITA/KAMI.', examples: ["We have a house. It is <b>our</b> house.", "This is
<b>our</b> class.", "We love <b>our</b> country.", "<b>Our</b> teacher is
nice."] },
{ sub: 'They', poss: 'Their', icon: '👥', bg: 'bg-red-100/50', desc:
'Milik MEREKA.', examples: ["They have books. Those are <b>their</b> books.",
"<b>Their</b> house is big.", "They play with <b>their</b> friends.", "Look at
<b>their</b> shoes."] }
];
const g1Data = [
{ id: 1, q: "I have a pen. It is ___ pen.", a: "My" }, { id: 2, q: "You
look tired. Wash ___ face.", a: "Your" },
{ id: 3, q: "He is smart. ___ grades are good.", a: "His" }, { id: 4,
q: "She is a singer. ___ voice is nice.", a: "Her" },
{ id: 5, q: "The cat is hungry. This is ___ food.", a: "Its" }, { id:
6, q: "We live here. This is ___ house.", a: "Our" },
{ id: 7, q: "They are students. ___ school is big.", a: "Their" },
{ id: 8, q: "Budi (Boy) lost ___ bag.", a: "His" }
];
const g2Data = [
{ q: "I have a brother. ___ name is Andi.", opts: ["My", "His", "Her"],
a: 1 }, { q: "We are students. This is ___ class.", opts: ["Their", "Our", "We"],
a: 1 },
{ q: "She washes ___ hands.", opts: ["Her", "She", "His"], a: 0 }, { q:
"You must do ___ homework.", opts: ["You", "My", "Your"], a: 2 },
{ q: "The dog hurts ___ leg.", opts: ["It", "Its", "His"], a: 1 }, { q:
"They visit ___ grandmother.", opts: ["Their", "There", "They"], a: 0 },
{ q: "I love ___ country, Indonesia.", opts: ["My", "Me", "I"], a: 0 },
{ q: "Doni and Dini are twins. ___ birthday is in May.", opts: ["His", "Her",
"Their"], a: 2 },
{ q: "Look at the tree! ___ leaves are green.", opts: ["It", "Its",
"My"], a: 1 }, { q: "Mr. Budi drives ___ car to work.", opts: ["Her", "Him",
"His"], a: 2 }
];
const memoryData = [
{ id: 1, text: "I", pair: "My" }, { id: 1, text: "My", pair: "I" },
{ id: 2, text: "You", pair: "Your" }, { id: 2, text: "Your", pair: "You" },
{ id: 3, text: "He", pair: "His" }, { id: 3, text: "His", pair: "He" },
{ id: 4, text: "She", pair: "Her" }, { id: 4, text: "Her", pair: "She" },
{ id: 5, text: "We", pair: "Our" }, { id: 5, text: "Our", pair: "We" },
{ id: 6, text: "They", pair: "Their" }, { id: 6, text: "Their", pair: "They" }
];
function navigate(sceneId) {
playClick();
[Link]('.scene-container').forEach(el =>
[Link]('hidden-scene'));
[Link](`scene-${sceneId}`).[Link]('hidden-
scene');
const nav = [Link]('nav-bar');
if (sceneId === 'welcome') [Link]('hidden-scene'); else
[Link]('hidden-scene');
[Link] = sceneId;
[Link](0, 0);
if (sceneId === 'material') renderSlide(0);
if (sceneId === 'games-menu') { /* reset games? */ }
}
function goBack() {
playClick();
if ([Link] === 'welcome') return;
if (['game1', 'game2', 'game3'].includes([Link])) {
[Link]('modal-
confirm').[Link]('hidden');
[Link]('modal-confirm').[Link]('flex');
} else {
if ([Link] === 'menu') navigate('welcome'); else
navigate('menu');
}
}
function closeConfirmModal() {
playClick();
[Link]('modal-confirm').[Link]('hidden');
[Link]('modal-confirm').[Link]('flex');
}
function confirmExitGame() { playClick(); closeConfirmModal();
navigate('games-menu'); }
function renderSlide(index) {
if (index < 0 || index >= [Link]) return;
[Link] = index;
const m = materials[index];
const listContainer = [Link]('pronoun-list');
[Link] = [Link]((item, idx) => `<div
onclick="renderSlide(${idx})" class="p-2 rounded cursor-pointer transition ${idx
=== index ? 'bg-pink-500 text-white font-bold shadow-md' : 'bg-white/50 hover:bg-
white text-gray-700'}">${[Link]} ➔ ${[Link]}</div>`).join('');
[Link]('mat-icon').textContent = [Link];
[Link]('mat-title').innerHTML = `${[Link]} <span
class="text-gray-400 text-4xl">➔</span> ${[Link]}`;
[Link]('mat-desc').textContent = [Link];
[Link]('mat-examples').innerHTML = [Link](ex
=> {
const cleanText = [Link](/<[^>]*>/g, '').replace(/'/g, "\\'");
return `<li onclick="speakText('${cleanText}')" class="group
border-b border-yellow-200/60 pb-2 mb-1 flex items-start gap-3 cursor-pointer
hover:bg-white/40 p-2 rounded-lg transition-all duration-200 transform hover:scale-
[1.02] shadow-sm hover:shadow-md"><button class="bg-blue-100 text-blue-600 w-8 h-8
rounded-full flex items-center justify-center flex-shrink-0 group-hover:bg-blue-500
group-hover:text-white transition-colors shadow-sm"><i class="fas
fa-volume-up"></i></button><span class="text-gray-900 group-hover:text-blue-800
font-bold leading-tight self-center">${ex}</span></li>`;
}).join('');
[Link]('slide-indicator').textContent = `${index +
1}/${[Link]}`;
const display = [Link]('slide-display');
[Link] = `flex-grow rounded-xl border-4 p-6 relative
overflow-hidden flex flex-col items-center text-center shadow-xl transition-all
duration-500 backdrop-blur-md ${[Link]} border-white/60`;
}
function nextSlide() { renderSlide([Link] + 1 <
[Link] ? [Link] + 1 : 0); playClick(); }
function prevSlide() { renderSlide([Link] - 1 >= 0 ?
[Link] - 1 : [Link] - 1); playClick(); }
function startGame(id) { playClick(); if (id === 1) initGame1(); if (id ===
2) initGame2(); if (id === 3) initGame3(); navigate(`game${id}`); }
function initGame1() {
[Link].g1 = 0;
updateScoreDisplay('g1');
[Link]('btn-finish-g1').[Link]('hidden');
const questions = [...g1Data].sort(() => 0.5 - [Link]()).slice(0,
6);
const answers = [Link](q => ({ val: q.a, id: [Link] })).sort(() =>
0.5 - [Link]());
const dropArea = [Link]('g1-drop-area');
// Updated to include Flower Sticker in each Drop Zone
[Link] = [Link](q => `
<div class="drop-zone bg-white/90 backdrop-blur-sm p-4 rounded-lg
border-2 border-gray-300 shadow-sm flex flex-col justify-center items-center
cursor-pointer hover:border-blue-400 relative overflow-hidden" data-id="${[Link]}"
onclick="handleDropZoneClick(this)">
<div class="absolute top-1 right-1 text-xl opacity-60">🌸</div>
<p class="text-lg font-bold text-center pointer-events-none
text-gray-800 relative z-10">${[Link]('___', '<span class="inline-block w-12
border-b-2 border-black">?</span>')}</p>
<div class="filled-answer hidden mt-2 text-blue-600 font-bold
text-xl bg-blue-100 px-3 py-1 rounded relative z-10"></div>
</div>
`).join('');
const dragArea = [Link]('g1-drag-area');
[Link] = [Link](a => `<button class="draggable-item
neumorph-btn px-4 py-2 text-lg m-1 !bg-gradient-to-br !from-sky-400 !to-sky-500
hover:!from-sky-500 hover:!to-sky-600 border-2 border-sky-200 text-white shadow-md"
data-val="${[Link]}" data-id="${[Link]}"
onclick="handleAnswerClick(this)">${[Link]}</button>`).join('');
}
function handleAnswerClick(el) {
playClick();
[Link]('.draggable-item').forEach(b =>
[Link]('selected'));
[Link]('selected');
state.g1Selection = { val: [Link], id: [Link], el: el };
[Link]('g1-message').textContent = `Pilih kotak untuk
"${[Link]}"`;
[Link]('g1-message').className = "mt-auto text-center
font-bold text-blue-600 animate-pulse";
}
function handleDropZoneClick(zone) {
if (!state.g1Selection) { [Link]('shake'); setTimeout(() =>
[Link]('shake'), 300); return; }
const qId = [Link];
const aId = [Link];
if (qId === aId) {
playApplause(); triggerCelebration();
[Link]('border-gray-300');
[Link]('border-green-500', 'bg-green-50');
[Link]('p').innerHTML =
[Link]('p').[Link]('?', [Link]);
[Link](); state.g1Selection = null;
const msg = getRandomFeedback(true);
[Link]('g1-message').textContent = msg;
[Link]('g1-message').className = "mt-auto text-
center font-bold text-green-600 animate-bounce";
speakText(msg);
[Link] = null; [Link]('cursor-pointer');
[Link].g1 += 10; updateScoreDisplay('g1');
if ([Link]('g1-drag-area').[Link] === 0)
{
setTimeout(() => { triggerCelebration();
[Link]('btn-finish-g1').[Link]('hidden'); }, 1000);
}
} else {
playWrong(); [Link]('shake', 'border-red-400');
setTimeout(() => [Link]('shake', 'border-red-400'), 500);
const msg = getRandomFeedback(false);
[Link]('g1-message').textContent = msg;
[Link]('g1-message').className = "mt-auto text-
center font-bold text-red-600";
speakText(msg);
}
}
function initGame2() {
[Link].g2 = 0; state.g2Index = 0; updateScoreDisplay('g2');
renderG2Question();
}
function renderG2Question() {
const q = g2Data[state.g2Index];
[Link]('g2-q-num').textContent = state.g2Index + 1;
[Link]('g2-question').textContent = q.q;
[Link]('g2-progress').[Link] = `$
{((state.g2Index) / [Link]) * 100}%`;
const skyZone = [Link]('g2-sky-zone');
[Link] = '';
const colors = ['from-red-400 to-red-600', 'from-blue-400 to-blue-600',
'from-green-400 to-green-600', 'from-yellow-400 to-orange-500', 'from-purple-400
to-purple-600'];
const positions = [20, 50, 80];
for (let i = [Link] - 1; i > 0; i--) { const j =
[Link]([Link]() * (i + 1)); [positions[i], positions[j]] = [positions[j],
positions[i]]; }
[Link]((opt, idx) => {
const balloon = [Link]('div');
const colorClass = colors[idx % [Link]];
[Link] = `balloon-item bg-gradient-to-br ${colorClass}`;
[Link] = `<span>${opt}</span>`;
[Link] = `${positions[idx]}%`;
[Link] = 'translateX(-50%)';
const duration = 8 + [Link]() * 4;
[Link] = `${duration}s`;
[Link] = `${[Link]() * 1}s`;
[Link] = () => checkG2Answer(idx, balloon);
[Link](balloon);
});
[Link]('g2-feedback').[Link]('hidden');
[Link]('g2-feedback').[Link]('flex');
}
function checkG2Answer(idx, balloonEl) {
const q = g2Data[state.g2Index];
const isCorrect = idx === q.a;
[Link]('balloon-pop');
playClick();
setTimeout(() => {
const fb = [Link]('g2-feedback');
const face = [Link]('g2-face');
const msg = [Link]('g2-msg');
[Link]('hidden'); [Link]('flex');
if (isCorrect) {
playApplause(); triggerCelebration();
[Link].g2 += 10; [Link] = "🎈";
const msgText = getRandomFeedback(true);
[Link] = msgText; speakText(msgText);
[Link] = "text-3xl font-bold mb-4 text-green-500 drop-
shadow-md";
} else {
playWrong(); [Link] = "💨";
const msgText = getRandomFeedback(false);
speakText(msgText);
[Link] = `${msgText}<br><span class="text-lg text-gray-
600 font-normal mt-2 block bg-gray-100 px-3 py-1 rounded-lg">Jawaban: <b>$
{[Link][q.a]}</b></span>`;
[Link] = "text-3xl font-bold mb-4 text-red-500 drop-
shadow-md";
}
updateScoreDisplay('g2');
}, 300);
}
function nextG2Question() {
state.g2Index++;
if (state.g2Index < [Link]) { renderG2Question(); }
else { [Link]('g2-progress').[Link] = "100%";
setTimeout(() => navigate('evaluation'), 500); calculateFinal(); }
}
function initGame3() {
[Link].g3 = 0; matchCount = 0; updateScoreDisplay('g3');
[Link]('g3-matches').textContent = 0;
[Link]('g3-win-overlay').[Link]('hidden');
[Link]('g3-win-overlay').[Link]('flex');
const board = [Link]('g3-board'); [Link] =
'';
const cards = [...memoryData].sort(() => 0.5 - [Link]());
[Link](item => {
const card = [Link]('div');
[Link]('memory-card'); [Link] = [Link];
// Added Flower Sticker to Memory Cards
[Link] = `
<div class="front-face relative">
<div class="absolute top-1 right-1 text-sm
opacity-50">🌹</div>
<div class="text-3xl mb-1 text-pink-500">❓</div>
${[Link]}
</div>
<div class="back-face relative">
<div class="absolute top-1 left-1 text-xs
opacity-50">🌸</div>
<i class="fas fa-star text-yellow-300 drop-shadow-md"></i>
</div>
`;
[Link]('click', flipCard); [Link](card);
});
}
let hasFlippedCard = false; let lockBoard = false; let firstCard,
secondCard; let matchCount = 0;
function flipCard() {
if (lockBoard) return; if (this === firstCard) return;
[Link]('flip'); playClick();
if (!hasFlippedCard) { hasFlippedCard = true; firstCard = this; return;
}
secondCard = this; checkForMatch();
}
function checkForMatch() {
let isMatch = [Link] === [Link];
if (isMatch) { disableCards(); } else { unflipCards(); }
}
function disableCards() {
[Link]('click', flipCard);
[Link]('click', flipCard);
[Link]('matched');
[Link]('matched');
playCorrect(); const msg = getRandomFeedback(true); speakText(msg);
[Link].g3 += 10; matchCount++; updateScoreDisplay('g3');
[Link]('g3-matches').textContent = matchCount;
resetBoard();
if (matchCount === 6) { setTimeout(() => { playApplause();
triggerCelebration(); [Link]('g3-win-
overlay').[Link]('hidden'); [Link]('g3-win-
overlay').[Link]('flex'); }, 500); }
}
function unflipCards() {
lockBoard = true; playWrong();
setTimeout(() => { [Link]('flip');
[Link]('flip'); resetBoard(); }, 1000);
}
function resetBoard() { [hasFlippedCard, lockBoard] = [false, false];
[firstCard, secondCard] = [null, null]; }
function finishGame(id) { navigate('games-menu'); }
function updateScoreDisplay(game) { [Link](`score-$
{game}`).textContent = [Link][game]; }
function calculateFinal() {
[Link]('res-g1').textContent = [Link].g1;
[Link]('res-g2').textContent = [Link].g2;
[Link]('res-g3').textContent = [Link].g3;
const total = [Link].g1 + [Link].g2 + [Link].g3;
[Link]('final-score').textContent = total;
const mt = [Link]('motivation-text');
if (total > 200) [Link] = "Luar Biasa! Kamu Juara! 🏆"; else if
(total > 100) [Link] = "Bagus Sekali! Terus Belajar! 👍"; else
[Link] = "Jangan Menyerah! Coba Lagi! 💪";
}
function selectMood(btn, mood) {
playClick(); [Link] = mood;
[Link]('.mood-btn').forEach(b =>
[Link]('selected')); [Link]('selected');
}
function submitFeedback() {
playClick(); [Link] = [Link]('feedback-
text').value;
navigate('final'); playApplause(); setTimeout(() => speakText("Thank
You!"), 500);
}
// --- VISUALS ---
const canvas = [Link]('bg-canvas'); const ctx =
[Link]('2d'); let particles = [];
function resizeCanvas() { [Link] = [Link]; [Link] =
[Link]; }
[Link]('resize', resizeCanvas); resizeCanvas();
class Particle {
constructor() { this.x = [Link]() * [Link]; this.y =
[Link]() * [Link]; [Link] = [Link]() * 20 + 5; [Link] =
[Link]() * 2 - 1; [Link] = [Link]() * 2 - 1; [Link] = `rgba(255,
255, 255, ${[Link]() * 0.3})`; [Link] = [Link]() > 0.5 ? 'circle' :
'square'; }
update() { this.x += [Link]; this.y += [Link]; if (this.x >
[Link]) this.x = 0; if (this.x < 0) this.x = [Link]; if (this.y >
[Link]) this.y = 0; if (this.y < 0) this.y = [Link]; }
draw() { [Link] = [Link]; [Link](); if ([Link]
=== 'circle') { [Link](this.x, this.y, [Link], 0, [Link] * 2); } else
{ [Link](this.x, this.y, [Link], [Link]); } [Link](); }
}
function initParticles() { for (let i = 0; i < 50; i++) [Link](new
Particle()); }
function animateBg() { [Link](0, 0, [Link], [Link]);
[Link](p => { [Link](); [Link](); });
requestAnimationFrame(animateBg); }
initParticles(); animateBg();
</script>
</body>
</html>