Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <title>Archive Alchemy</title>
- <style>
- * {
- margin: 0;
- padding: 0;
- box-sizing: border-box;
- }
- body {
- font-family: 'Courier New', monospace;
- background: linear-gradient(135deg, #0a0e27 0%, #1a0b2e 50%, #2d1b69 100%);
- color: #e0e0ff;
- min-height: 100vh;
- overflow-x: hidden;
- position: relative;
- }
- /* Animated Background */
- body::before {
- content: '';
- position: fixed;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- background:
- radial-gradient(circle at 20% 50%, rgba(138, 43, 226, 0.1) 0%, transparent 50%),
- radial-gradient(circle at 80% 50%, rgba(75, 0, 130, 0.1) 0%, transparent 50%),
- radial-gradient(circle at 50% 50%, rgba(147, 112, 219, 0.05) 0%, transparent 70%);
- animation: breathe 10s ease-in-out infinite;
- pointer-events: none;
- }
- @keyframes breathe {
- 0%, 100% { opacity: 0.5; }
- 50% { opacity: 1; }
- }
- .header {
- text-align: center;
- padding: 2rem;
- position: relative;
- z-index: 10;
- }
- h1 {
- font-size: 3rem;
- background: linear-gradient(45deg, #ff00ff, #00ffff, #ffff00, #ff00ff);
- background-size: 300% 300%;
- -webkit-background-clip: text;
- background-clip: text;
- color: transparent;
- animation: gradient 5s ease infinite;
- text-shadow: 0 0 30px rgba(138, 43, 226, 0.5);
- margin-bottom: 0.5rem;
- }
- @keyframes gradient {
- 0%, 100% { background-position: 0% 50%; }
- 50% { background-position: 100% 50%; }
- }
- .subtitle {
- color: #9d7cff;
- font-size: 1.2rem;
- opacity: 0.9;
- }
- /* Points Display */
- .points-display {
- position: absolute;
- top: 2rem;
- right: 2rem;
- background: linear-gradient(135deg, #ffd700, #ff6347);
- padding: 1rem 2rem;
- border-radius: 50px;
- font-size: 1.5rem;
- font-weight: bold;
- color: #000;
- box-shadow: 0 0 30px rgba(255, 215, 0, 0.5);
- animation: pulse 2s ease-in-out infinite;
- }
- @keyframes pulse {
- 0%, 100% { transform: scale(1); }
- 50% { transform: scale(1.05); }
- }
- .main-container {
- display: grid;
- grid-template-columns: 1fr 2fr 1fr;
- gap: 2rem;
- padding: 2rem;
- max-width: 1400px;
- margin: 0 auto;
- position: relative;
- z-index: 5;
- }
- /* Document Library */
- .document-library {
- background: rgba(30, 20, 60, 0.8);
- border: 2px solid rgba(138, 43, 226, 0.5);
- border-radius: 15px;
- padding: 1.5rem;
- backdrop-filter: blur(10px);
- box-shadow: 0 0 30px rgba(138, 43, 226, 0.3);
- }
- .section-title {
- color: #ff00ff;
- font-size: 1.3rem;
- margin-bottom: 1rem;
- text-align: center;
- text-shadow: 0 0 10px currentColor;
- }
- .document-item {
- background: rgba(75, 0, 130, 0.3);
- border: 1px solid rgba(138, 43, 226, 0.4);
- border-radius: 10px;
- padding: 1rem;
- margin: 0.5rem 0;
- cursor: grab;
- transition: all 0.3s;
- position: relative;
- overflow: hidden;
- }
- .document-item.used {
- opacity: 0.3;
- cursor: not-allowed;
- background: rgba(50, 50, 50, 0.3);
- }
- .document-item::before {
- content: '';
- position: absolute;
- top: -2px;
- left: -2px;
- right: -2px;
- bottom: -2px;
- background: linear-gradient(45deg, #ff00ff, #00ffff, #ffff00);
- border-radius: 10px;
- opacity: 0;
- z-index: -1;
- transition: opacity 0.3s;
- }
- .document-item:not(.used):hover::before {
- opacity: 0.5;
- animation: rotate 2s linear infinite;
- }
- @keyframes rotate {
- 0% { transform: rotate(0deg); }
- 100% { transform: rotate(360deg); }
- }
- .document-item:not(.used):hover {
- transform: translateY(-2px) scale(1.05);
- box-shadow: 0 5px 20px rgba(138, 43, 226, 0.5);
- }
- .document-item.dragging {
- opacity: 0.5;
- cursor: grabbing;
- }
- .doc-type {
- font-size: 0.8rem;
- color: #00ffff;
- margin-bottom: 0.3rem;
- }
- .doc-name {
- font-size: 1rem;
- color: #ffffff;
- margin-bottom: 0.5rem;
- }
- .doc-keywords {
- font-size: 0.7rem;
- color: #9d7cff;
- font-style: italic;
- }
- .doc-power {
- color: #ffd700;
- font-size: 0.8rem;
- margin-top: 0.3rem;
- text-align: right;
- }
- .document-stats {
- background: rgba(75, 0, 130, 0.3);
- border-radius: 10px;
- padding: 0.8rem;
- margin: 1rem 0;
- text-align: center;
- }
- .stat-row {
- display: flex;
- justify-content: space-around;
- margin: 0.3rem 0;
- }
- .stat-badge {
- background: rgba(138, 43, 226, 0.3);
- border: 1px solid rgba(138, 43, 226, 0.5);
- border-radius: 15px;
- padding: 0.3rem 0.8rem;
- font-size: 0.8rem;
- }
- .rarity-common { color: #9d7cff; }
- .rarity-uncommon { color: #00ffff; }
- .rarity-rare { color: #ff00ff; }
- .rarity-legendary { color: #ffd700; }
- /* Cauldron Area */
- .cauldron-section {
- display: flex;
- flex-direction: column;
- align-items: center;
- }
- .cauldron-container {
- width: 300px;
- height: 300px;
- position: relative;
- margin: 2rem auto;
- }
- .cauldron {
- width: 250px;
- height: 200px;
- background: radial-gradient(ellipse at center, #2d1b69 0%, #1a0b2e 70%);
- border: 3px solid #8a2be2;
- border-radius: 0 0 100px 100px;
- position: absolute;
- bottom: 20px;
- left: 50%;
- transform: translateX(-50%);
- box-shadow:
- 0 0 50px rgba(138, 43, 226, 0.5),
- inset 0 0 30px rgba(75, 0, 130, 0.5);
- overflow: hidden;
- }
- .cauldron::before {
- content: '';
- position: absolute;
- top: 0;
- left: 0;
- right: 0;
- height: 50%;
- background: linear-gradient(to bottom, transparent, rgba(0, 255, 255, 0.1));
- animation: bubble 3s ease-in-out infinite;
- }
- @keyframes bubble {
- 0%, 100% { transform: translateY(0); }
- 50% { transform: translateY(10px); }
- }
- .cauldron.active {
- animation: brew 1s ease-in-out infinite;
- }
- @keyframes brew {
- 0%, 100% { transform: translateX(-50%) rotate(0deg); }
- 25% { transform: translateX(-50%) rotate(-2deg); }
- 75% { transform: translateX(-50%) rotate(2deg); }
- }
- .slot {
- width: 80px;
- height: 80px;
- background: rgba(30, 20, 60, 0.8);
- border: 2px dashed rgba(138, 43, 226, 0.5);
- border-radius: 10px;
- position: absolute;
- display: flex;
- align-items: center;
- justify-content: center;
- transition: all 0.3s;
- z-index: 10;
- }
- .slot.dragover {
- background: rgba(138, 43, 226, 0.3);
- border-color: #ff00ff;
- box-shadow: 0 0 20px rgba(255, 0, 255, 0.5);
- }
- .slot.filled {
- border-style: solid;
- background: rgba(75, 0, 130, 0.5);
- }
- .slot1 { top: 50px; left: 20px; }
- .slot2 { top: 50px; right: 20px; }
- .transmute-btn {
- background: linear-gradient(45deg, #8a2be2, #4b0082);
- color: white;
- border: 2px solid #ff00ff;
- border-radius: 50px;
- padding: 1rem 2rem;
- font-size: 1.2rem;
- cursor: pointer;
- transition: all 0.3s;
- margin-top: 2rem;
- position: relative;
- overflow: hidden;
- text-transform: uppercase;
- letter-spacing: 2px;
- }
- .transmute-btn::before {
- content: '';
- position: absolute;
- top: 50%;
- left: 50%;
- width: 0;
- height: 0;
- background: radial-gradient(circle, rgba(255, 255, 255, 0.3), transparent);
- transition: width 0.6s, height 0.6s;
- transform: translate(-50%, -50%);
- }
- .transmute-btn:hover:not(:disabled)::before {
- width: 300px;
- height: 300px;
- }
- .transmute-btn:hover:not(:disabled) {
- transform: scale(1.1);
- box-shadow: 0 0 30px rgba(255, 0, 255, 0.8);
- }
- .transmute-btn:disabled {
- opacity: 0.5;
- cursor: not-allowed;
- }
- .transmute-btn.processing {
- animation: processingPulse 0.5s ease-in-out infinite;
- pointer-events: none;
- }
- @keyframes processingPulse {
- 0%, 100% { opacity: 0.5; }
- 50% { opacity: 1; }
- }
- /* Results Panel */
- .results-panel {
- background: rgba(30, 20, 60, 0.8);
- border: 2px solid rgba(138, 43, 226, 0.5);
- border-radius: 15px;
- padding: 1.5rem;
- backdrop-filter: blur(10px);
- box-shadow: 0 0 30px rgba(138, 43, 226, 0.3);
- }
- .artifact-item {
- background: linear-gradient(135deg, rgba(255, 0, 255, 0.1), rgba(0, 255, 255, 0.1));
- border: 1px solid rgba(255, 215, 0, 0.5);
- border-radius: 10px;
- padding: 1rem;
- margin: 0.5rem 0;
- position: relative;
- animation: glow 2s ease-in-out infinite;
- }
- .artifact-item.corrupted {
- background: linear-gradient(135deg, rgba(255, 0, 0, 0.2), rgba(100, 0, 0, 0.2));
- border-color: rgba(255, 0, 0, 0.5);
- }
- .artifact-item.legendary {
- background: linear-gradient(135deg, rgba(255, 215, 0, 0.3), rgba(255, 140, 0, 0.3));
- border-color: rgba(255, 215, 0, 0.8);
- animation: legendaryGlow 1s ease-in-out infinite;
- }
- @keyframes legendaryGlow {
- 0%, 100% { box-shadow: 0 0 20px rgba(255, 215, 0, 0.6); }
- 50% { box-shadow: 0 0 40px rgba(255, 215, 0, 1); }
- }
- @keyframes glow {
- 0%, 100% { box-shadow: 0 0 10px rgba(255, 215, 0, 0.3); }
- 50% { box-shadow: 0 0 20px rgba(255, 215, 0, 0.6); }
- }
- .artifact-name {
- color: #ffd700;
- font-size: 1.1rem;
- margin-bottom: 0.3rem;
- text-shadow: 0 0 5px currentColor;
- }
- .artifact-desc {
- color: #e0e0ff;
- font-size: 0.9rem;
- margin-bottom: 0.5rem;
- }
- .artifact-power {
- position: absolute;
- top: 10px;
- right: 10px;
- font-size: 1.2rem;
- font-weight: bold;
- }
- .artifact-actions {
- display: flex;
- gap: 0.5rem;
- margin-top: 0.5rem;
- }
- .action-btn {
- flex: 1;
- padding: 0.3rem 0.5rem;
- border: 1px solid;
- border-radius: 5px;
- cursor: pointer;
- font-size: 0.8rem;
- transition: all 0.3s;
- text-align: center;
- }
- .inspect-btn {
- background: rgba(0, 255, 255, 0.2);
- border-color: #00ffff;
- color: #00ffff;
- }
- .inspect-btn:hover {
- background: rgba(0, 255, 255, 0.4);
- box-shadow: 0 0 10px rgba(0, 255, 255, 0.5);
- }
- .consume-btn {
- background: rgba(0, 255, 0, 0.2);
- border-color: #00ff00;
- color: #00ff00;
- }
- .consume-btn:hover {
- background: rgba(0, 255, 0, 0.4);
- box-shadow: 0 0 10px rgba(0, 255, 0, 0.5);
- }
- .consume-btn:disabled {
- opacity: 0.3;
- cursor: not-allowed;
- }
- .destroy-btn {
- background: rgba(255, 0, 0, 0.2);
- border-color: #ff6666;
- color: #ff6666;
- }
- .destroy-btn:hover {
- background: rgba(255, 0, 0, 0.4);
- box-shadow: 0 0 10px rgba(255, 0, 0, 0.5);
- }
- /* Particles */
- .particle {
- position: absolute;
- width: 4px;
- height: 4px;
- background: radial-gradient(circle, rgba(255, 255, 255, 0.9), transparent);
- pointer-events: none;
- animation: float 3s ease-in-out infinite;
- }
- @keyframes float {
- 0% { transform: translateY(0) translateX(0); opacity: 0; }
- 10% { opacity: 1; }
- 90% { opacity: 1; }
- 100% { transform: translateY(-100px) translateX(var(--random-x, 0px)); opacity: 0; }
- }
- .find-btn {
- background: linear-gradient(135deg, #00ffff, #4b0082);
- border: 2px solid #00ffff;
- border-radius: 25px;
- color: white;
- padding: 0.7rem 1.5rem;
- font-size: 1rem;
- cursor: pointer;
- margin: 1rem auto;
- display: block;
- transition: all 0.3s;
- text-shadow: 0 0 5px rgba(0, 255, 255, 0.5);
- animation: findPulse 2s ease-in-out infinite;
- }
- @keyframes findPulse {
- 0%, 100% { box-shadow: 0 0 10px rgba(0, 255, 255, 0.3); }
- 50% { box-shadow: 0 0 20px rgba(0, 255, 255, 0.6); }
- }
- .find-btn:hover {
- transform: scale(1.1);
- background: linear-gradient(135deg, #4b0082, #00ffff);
- box-shadow: 0 0 30px rgba(0, 255, 255, 0.8);
- }
- .find-btn:active {
- transform: scale(0.95);
- }
- .find-btn.drawing {
- animation: drawAnimation 1s ease-in-out;
- pointer-events: none;
- }
- @keyframes drawAnimation {
- 0% { transform: rotate(0deg) scale(1); }
- 25% { transform: rotate(-5deg) scale(1.1); }
- 50% { transform: rotate(5deg) scale(1.1); }
- 75% { transform: rotate(-5deg) scale(1.1); }
- 100% { transform: rotate(0deg) scale(1); }
- }
- .document-item.drawing-in {
- animation: slideIn 0.5s ease-out;
- }
- @keyframes slideIn {
- from {
- opacity: 0;
- transform: translateX(-100px) rotate(-10deg);
- }
- to {
- opacity: 1;
- transform: translateX(0) rotate(0deg);
- }
- }
- /* Recipe Book */
- .recipe-hint {
- background: rgba(255, 215, 0, 0.1);
- border: 1px solid rgba(255, 215, 0, 0.3);
- border-radius: 10px;
- padding: 1rem;
- margin-top: 1rem;
- text-align: center;
- font-style: italic;
- color: #ffd700;
- }
- /* Notification */
- .notification {
- position: fixed;
- top: 50%;
- left: 50%;
- transform: translate(-50%, -50%) scale(0);
- background: linear-gradient(135deg, #2d1b69, #4b0082);
- border: 3px solid #ffd700;
- border-radius: 20px;
- padding: 2rem;
- text-align: center;
- z-index: 100;
- animation: popIn 0.5s forwards;
- box-shadow: 0 0 50px rgba(255, 215, 0, 0.5);
- }
- @keyframes popIn {
- to { transform: translate(-50%, -50%) scale(1); }
- }
- .notification h2 {
- color: #ffd700;
- margin-bottom: 1rem;
- text-shadow: 0 0 10px currentColor;
- }
- .close-notification {
- background: #8a2be2;
- color: white;
- border: none;
- border-radius: 20px;
- padding: 0.5rem 1.5rem;
- cursor: pointer;
- margin-top: 1rem;
- }
- /* Stats */
- .stats {
- background: rgba(75, 0, 130, 0.3);
- border-radius: 10px;
- padding: 1rem;
- margin-top: 1rem;
- text-align: center;
- }
- .stat-item {
- display: flex;
- justify-content: space-between;
- margin: 0.5rem 0;
- }
- .stat-label {
- color: #9d7cff;
- }
- .stat-value {
- color: #00ffff;
- font-weight: bold;
- }
- .inventory-count {
- text-align: center;
- color: #ff00ff;
- margin-top: 0.5rem;
- font-size: 0.9rem;
- }
- .point-change {
- position: fixed;
- font-size: 2rem;
- font-weight: bold;
- pointer-events: none;
- z-index: 200;
- animation: floatUp 2s ease-out forwards;
- }
- @keyframes floatUp {
- 0% {
- opacity: 1;
- transform: translateY(0);
- }
- 100% {
- opacity: 0;
- transform: translateY(-100px);
- }
- }
- .point-change.positive {
- color: #00ff00;
- text-shadow: 0 0 10px currentColor;
- }
- .point-change.negative {
- color: #ff0000;
- text-shadow: 0 0 10px currentColor;
- }
- /* Search Animation */
- @keyframes searchPulse {
- 0% {
- width: 0px;
- height: 0px;
- opacity: 1;
- }
- 100% {
- width: 300px;
- height: 300px;
- opacity: 0;
- }
- }
- </style>
- </head>
- <body>
- <div class="points-display" id="pointsDisplay">
- ⭐ 0 Points
- </div>
- <div class="header">
- <h1>Archive Alchemy</h1>
- <div class="subtitle">Transform Digital Documents into Mystical Artifacts</div>
- </div>
- <div class="main-container">
- <div class="document-library">
- <h2 class="section-title">📚 Document Library</h2>
- <button class="find-btn" id="findBtn">
- 🔍 Find Documents
- </button>
- <div id="documentList"></div>
- <div id="documentStats"></div>
- <div class="recipe-hint" id="recipeHint">
- 💡 Hint: Click "Find Documents" to draw from the archive!
- </div>
- </div>
- <div class="cauldron-section">
- <h2 class="section-title">⚗️ Alchemical Cauldron</h2>
- <div class="cauldron-container">
- <div class="slot slot1" data-slot="1">
- <span style="color: #9d7cff;">Slot 1</span>
- </div>
- <div class="slot slot2" data-slot="2">
- <span style="color: #9d7cff;">Slot 2</span>
- </div>
- <div class="cauldron" id="cauldron"></div>
- </div>
- <button class="transmute-btn" id="transmuteBtn" disabled>
- Transmute
- </button>
- <div class="stats">
- <div class="stat-item">
- <span class="stat-label">Transmutations:</span>
- <span class="stat-value" id="transmutationCount">0</span>
- </div>
- <div class="stat-item">
- <span class="stat-label">Success Rate:</span>
- <span class="stat-value" id="successRate">0%</span>
- </div>
- <div class="stat-item">
- <span class="stat-label">Level:</span>
- <span class="stat-value" id="alchemyLevel">1</span>
- </div>
- <div class="stat-item">
- <span class="stat-label">Risk Level:</span>
- <span class="stat-value" id="riskLevel">Low</span>
- </div>
- </div>
- </div>
- <div class="results-panel">
- <h2 class="section-title">✨ Artifacts Created</h2>
- <div class="inventory-count" id="inventoryCount">0/10 Artifacts</div>
- <div id="artifactsList"></div>
- </div>
- </div>
- <script>
- // Document Templates
- const documentTemplates = [
- { name: "Ancient Codex", type: "PDF", keywords: ["wisdom", "mystery", "ancient"], power: 3 },
- { name: "Data Crystal", type: "JSON", keywords: ["data", "structure", "logic"], power: 2 },
- { name: "Mystic Scroll", type: "TXT", keywords: ["magic", "spells", "ancient"], power: 3 },
- { name: "Algorithm Tome", type: "JS", keywords: ["logic", "code", "patterns"], power: 4 },
- { name: "Dream Journal", type: "MD", keywords: ["dreams", "consciousness", "mystery"], power: 2 },
- { name: "Quantum Notes", type: "XML", keywords: ["quantum", "science", "data"], power: 3 },
- { name: "Poetry Archive", type: "DOC", keywords: ["emotion", "words", "beauty"], power: 2 },
- { name: "Binary Grimoire", type: "BIN", keywords: ["binary", "code", "mystery"], power: 4 },
- { name: "Star Chart", type: "SVG", keywords: ["cosmos", "patterns", "navigation"], power: 3 },
- { name: "Memory Bank", type: "SQL", keywords: ["memory", "data", "structure"], power: 3 },
- { name: "Chaos Manifest", type: "RAW", keywords: ["chaos", "entropy", "unknown"], power: 5 },
- { name: "Time Crystal", type: "LOG", keywords: ["time", "sequence", "history"], power: 3 },
- { name: "Neural Map", type: "AI", keywords: ["mind", "neural", "patterns"], power: 4 },
- { name: "Void Fragment", type: "NULL", keywords: ["void", "empty", "unknown"], power: 1 },
- { name: "Ethereal Notes", type: "AURA", keywords: ["spirit", "ethereal", "energy"], power: 3 },
- { name: "Cipher Key", type: "KEY", keywords: ["cipher", "security", "hidden"], power: 4 },
- { name: "Reality Script", type: "SIM", keywords: ["reality", "simulation", "code"], power: 5 },
- { name: "Emotion Core", type: "FEEL", keywords: ["emotion", "heart", "soul"], power: 2 },
- { name: "Fractal Blueprint", type: "FRAC", keywords: ["fractal", "infinite", "patterns"], power: 4 },
- { name: "Shadow Archive", type: "DARK", keywords: ["shadow", "hidden", "secret"], power: 3 }
- ];
- // Active documents
- let documents = [];
- let draggedDoc = null;
- // Alchemy Recipes
- const recipes = {
- "ancient,mystery": { name: "Tome of Lost Knowledge", desc: "Reveals hidden truths", power: 5, hidden: false },
- "data,structure": { name: "Crystal Matrix", desc: "Perfect data alignment", power: 4, hidden: false },
- "magic,ancient": { name: "Primordial Spell", desc: "Ancient magical power", power: 6, hidden: true },
- "logic,code": { name: "Divine Algorithm", desc: "Solves impossible problems", power: 5, hidden: false },
- "dreams,mystery": { name: "Oneiric Portal", desc: "Gateway to dream realms", power: 4, hidden: true },
- "quantum,data": { name: "Quantum Codex", desc: "Manipulates probability", power: 5, hidden: false },
- "emotion,beauty": { name: "Heart's Resonance", desc: "Empathic connection", power: 3, hidden: false },
- "binary,code": { name: "Digital Philosopher's Stone", desc: "Transforms all data", power: 7, hidden: true },
- "cosmos,patterns": { name: "Celestial Navigator", desc: "Maps impossible paths", power: 5, hidden: false },
- "memory,data": { name: "Eternal Archive", desc: "Never forgets", power: 4, hidden: false },
- "chaos,unknown": { name: "Pandora's Cache", desc: "Dangerous but powerful", power: 8, hidden: true, risk: true },
- "void,empty": { name: "Null Singularity", desc: "Consumes everything", power: 1, corrupted: true },
- "reality,simulation": { name: "Reality Compiler", desc: "Rewrites existence", power: 9, hidden: true }
- };
- // Game State
- let gameState = {
- slots: { 1: null, 2: null },
- artifacts: [],
- transmutations: 0,
- successes: 0,
- level: 1,
- points: 0,
- isTransmuting: false,
- inspectedArtifacts: new Set(),
- consumedWithoutInspection: 0,
- totalDocumentsUsed: 0,
- documentsFound: false
- };
- // Enhanced Find Documents feature
- function findDocuments() {
- const btn = document.getElementById('findBtn');
- btn.classList.add('drawing');
- // Disable button during drawing animation
- btn.disabled = true;
- // Clear existing documents if needed
- if (!gameState.documentsFound || documents.filter(d => !d.used).length === 0) {
- generateDocumentLibrary();
- gameState.documentsFound = true;
- }
- // Animate drawing documents with enhanced effects
- const container = document.getElementById('documentList');
- container.innerHTML = '';
- // Create search animation effect
- createSearchAnimation();
- // Show documents with staggered animation
- documents.forEach((doc, index) => {
- setTimeout(() => {
- const elem = document.createElement('div');
- elem.className = doc.used ? 'document-item used drawing-in' : 'document-item drawing-in';
- elem.draggable = !doc.used;
- elem.dataset.docId = doc.id;
- elem.innerHTML = `
- <div class="doc-type">[${doc.type}]</div>
- <div class="doc-name">${doc.name}</div>
- <div class="doc-keywords">${doc.keywords.join(', ')}</div>
- <div class="doc-power">${'⭐'.repeat(Math.min(doc.power, 3))}</div>
- `;
- container.appendChild(elem);
- // Enhanced particle effect for each document
- createEnhancedDocumentParticle(elem, doc.power);
- // Add hover info for document power
- elem.title = `Power Level: ${doc.power}/5`;
- }, index * 150);
- });
- // Update document stats
- updateDocumentStats();
- // Re-enable button and setup interactions
- setTimeout(() => {
- btn.classList.remove('drawing');
- btn.disabled = false;
- setupDragAndDrop();
- updateHints();
- // Show found notification
- showDocumentFoundNotification(documents.length);
- }, documents.length * 150 + 500);
- }
- // Enhanced particle effects for document discovery
- function createEnhancedDocumentParticle(element, power) {
- const rect = element.getBoundingClientRect();
- const particleCount = 3 + power;
- for (let i = 0; i < particleCount; i++) {
- setTimeout(() => {
- const particle = document.createElement('div');
- particle.className = 'particle';
- let color;
- if (power >= 4) color = 'rgba(255, 215, 0, 0.9)';
- else if (power >= 3) color = 'rgba(0, 255, 255, 0.9)';
- else color = 'rgba(138, 43, 226, 0.9)';
- particle.style.background = `radial-gradient(circle, ${color}, transparent)`;
- particle.style.width = (3 + power) + 'px';
- particle.style.height = (3 + power) + 'px';
- particle.style.left = rect.left + Math.random() * rect.width + 'px';
- particle.style.top = rect.top + rect.height / 2 + 'px';
- particle.style.setProperty('--random-x', (Math.random() * 100 - 50) + 'px');
- document.body.appendChild(particle);
- setTimeout(() => particle.remove(), 1000);
- }, i * 100);
- }
- }
- // Create search animation around the find button
- function createSearchAnimation() {
- const btn = document.getElementById('findBtn');
- const rect = btn.getBoundingClientRect();
- for (let i = 0; i < 3; i++) {
- setTimeout(() => {
- const circle = document.createElement('div');
- circle.style.position = 'fixed';
- circle.style.left = rect.left + rect.width / 2 + 'px';
- circle.style.top = rect.top + rect.height / 2 + 'px';
- circle.style.width = '0px';
- circle.style.height = '0px';
- circle.style.border = '2px solid rgba(0, 255, 255, 0.5)';
- circle.style.borderRadius = '50%';
- circle.style.transform = 'translate(-50%, -50%)';
- circle.style.animation = `searchPulse 1.5s ease-out ${i * 0.2}s forwards`;
- circle.style.zIndex = '99';
- document.body.appendChild(circle);
- setTimeout(() => circle.remove(), 1500);
- }, i * 200);
- }
- }
- // Show notification when documents are found
- function showDocumentFoundNotification(count) {
- const rareDocs = documents.filter(doc => doc.power >= 4).length;
- const notification = document.createElement('div');
- notification.className = 'notification';
- notification.style.zIndex = '1000';
- let message = `Found ${count} documents!`;
- if (rareDocs > 0) {
- message += ` Including ${rareDocs} rare document${rareDocs > 1 ? 's' : ''}!`;
- }
- notification.innerHTML = `
- <h2>📚 Documents Found!</h2>
- <div style="color: #00ffff; font-size: 1.2rem; margin: 1rem 0;">${message}</div>
- <div style="color: #9d7cff; font-size: 0.9rem;">
- Drag documents to the cauldron slots to begin transmutation
- </div>
- <button class="close-notification" onclick="this.parentElement.remove()">Start Alchemy</button>
- `;
- document.body.appendChild(notification);
- setTimeout(() => {
- if (notification.parentElement) {
- notification.remove();
- }
- }, 3000);
- }
- // Update document statistics display
- function updateDocumentStats() {
- let statsContainer = document.getElementById('documentStats');
- if (!statsContainer) {
- statsContainer = document.createElement('div');
- statsContainer.id = 'documentStats';
- statsContainer.className = 'document-stats';
- document.getElementById('documentList').parentNode.insertBefore(statsContainer, document.getElementById('recipeHint'));
- }
- const totalDocs = documents.length;
- const availableDocs = documents.filter(d => !d.used).length;
- const averagePower = documents.reduce((sum, doc) => sum + doc.power, 0) / totalDocs;
- const rareCount = documents.filter(doc => doc.power >= 4).length;
- statsContainer.innerHTML = `
- <div class="stat-row">
- <span class="stat-badge">Available: ${availableDocs}/${totalDocs}</span>
- <span class="stat-badge">Avg Power: ${averagePower.toFixed(1)}</span>
- </div>
- <div class="stat-row">
- <span class="stat-badge rarity-rare">Rare: ${rareCount}</span>
- <span class="stat-badge">Ready: ${availableDocs >= 2 ? '✅' : '❌'}</span>
- </div>
- `;
- }
- // Enhanced document generation with rarity system
- function generateDocumentLibrary() {
- documents = [];
- const totalDocs = 12;
- for (let i = 0; i < totalDocs; i++) {
- let powerLevel;
- const roll = Math.random();
- if (roll < 0.6) {
- powerLevel = 1 + Math.floor(Math.random() * 2);
- } else if (roll < 0.85) {
- powerLevel = 2 + Math.floor(Math.random() * 2);
- } else if (roll < 0.95) {
- powerLevel = 3 + Math.floor(Math.random() * 2);
- } else {
- powerLevel = 4 + Math.floor(Math.random() * 2);
- }
- const suitableTemplates = documentTemplates.filter(t =>
- Math.abs(t.power - powerLevel) <= 1
- );
- const template = suitableTemplates.length > 0
- ? suitableTemplates[Math.floor(Math.random() * suitableTemplates.length)]
- : documentTemplates[Math.floor(Math.random() * documentTemplates.length)];
- documents.push({
- id: Date.now() + i + Math.random(),
- ...template,
- power: powerLevel,
- used: false,
- rarity: getRarityFromPower(powerLevel)
- });
- }
- documents.sort((a, b) => b.power - a.power);
- }
- // Helper function to determine rarity from power
- function getRarityFromPower(power) {
- if (power >= 4) return 'legendary';
- if (power >= 3) return 'rare';
- if (power >= 2) return 'uncommon';
- return 'common';
- }
- // Enhanced document rendering with rarity colors
- function renderDocuments() {
- const container = document.getElementById('documentList');
- container.innerHTML = '';
- documents.forEach(doc => {
- const elem = document.createElement('div');
- elem.className = doc.used ? 'document-item used' : 'document-item';
- elem.draggable = !doc.used;
- elem.dataset.docId = doc.id;
- elem.classList.add(`rarity-${doc.rarity}`);
- elem.innerHTML = `
- <div class="doc-type">[${doc.type}]</div>
- <div class="doc-name">${doc.name}</div>
- <div class="doc-keywords">${doc.keywords.join(', ')}</div>
- <div class="doc-power">${'⭐'.repeat(Math.min(doc.power, 5))} ${doc.rarity.toUpperCase()}</div>
- `;
- if (doc.power >= 4) {
- elem.style.boxShadow = '0 0 15px rgba(255, 215, 0, 0.5)';
- }
- container.appendChild(elem);
- });
- setupDragAndDrop();
- updateDocumentStats();
- }
- // Initialize the game
- function init() {
- document.getElementById('findBtn').addEventListener('click', findDocuments);
- generateDocumentLibrary();
- gameState.documentsFound = false;
- document.getElementById('recipeHint').innerHTML = `
- 💡 <strong>Click "Find Documents" to draw from the archive!</strong><br>
- <small>Discover rare documents with higher power levels for better artifacts!</small>
- `;
- setupTransmuteButton();
- createFloatingParticles();
- updateStats();
- updateArtifacts();
- updateHints();
- }
- // Setup drag and drop functionality
- function setupDragAndDrop() {
- document.querySelectorAll('.document-item:not(.used)').forEach(item => {
- item.addEventListener('dragstart', (e) => {
- draggedDoc = documents.find(d => d.id == e.target.dataset.docId);
- e.target.classList.add('dragging');
- });
- item.addEventListener('dragend', (e) => {
- e.target.classList.remove('dragging');
- });
- });
- document.querySelectorAll('.slot').forEach(slot => {
- slot.addEventListener('dragover', (e) => {
- e.preventDefault();
- slot.classList.add('dragover');
- });
- slot.addEventListener('dragleave', (e) => {
- slot.classList.remove('dragover');
- });
- slot.addEventListener('drop', (e) => {
- e.preventDefault();
- slot.classList.remove('dragover');
- if (!draggedDoc || draggedDoc.used) return;
- const slotNum = slot.dataset.slot;
- if (gameState.slots[slotNum]) {
- const oldDoc = documents.find(d => d.id === gameState.slots[slotNum].id);
- if (oldDoc) oldDoc.used = false;
- }
- gameState.slots[slotNum] = draggedDoc;
- draggedDoc.used = true;
- slot.classList.add('filled');
- slot.innerHTML = `
- <div style="text-align: center; font-size: 0.8rem;">
- <div style="color: ${getRarityColor(draggedDoc.rarity)};">${draggedDoc.type}</div>
- <div style="color: #fff; font-size: 0.7rem;">${draggedDoc.name.substring(0, 8)}...</div>
- <div style="color: #ffd700; font-size: 0.6rem;">${'⭐'.repeat(draggedDoc.power)}</div>
- </div>
- `;
- renderDocuments();
- checkTransmuteReady();
- createSlotParticles(slot, draggedDoc);
- });
- });
- }
- // Helper function for rarity colors
- function getRarityColor(rarity) {
- switch(rarity) {
- case 'legendary': return '#ffd700';
- case 'rare': return '#ff00ff';
- case 'uncommon': return '#00ffff';
- default: return '#9d7cff';
- }
- }
- // Enhanced slot particles with rarity colors
- function createSlotParticles(slot, doc) {
- let color;
- switch(doc.rarity) {
- case 'legendary': color = 'rgba(255, 215, 0, 0.9)'; break;
- case 'rare': color = 'rgba(255, 0, 255, 0.9)'; break;
- case 'uncommon': color = 'rgba(0, 255, 255, 0.9)'; break;
- default: color = 'rgba(138, 43, 226, 0.9)';
- }
- for (let i = 0; i < 15; i++) {
- const particle = document.createElement('div');
- particle.className = 'particle';
- const rect = slot.getBoundingClientRect();
- particle.style.left = rect.left + rect.width / 2 + 'px';
- particle.style.top = rect.top + rect.height / 2 + 'px';
- particle.style.background = `radial-gradient(circle, ${color}, transparent)`;
- particle.style.width = '6px';
- particle.style.height = '6px';
- document.body.appendChild(particle);
- setTimeout(() => particle.remove(), 1000);
- }
- }
- // Check if ready to transmute
- function checkTransmuteReady() {
- const btn = document.getElementById('transmuteBtn');
- if (gameState.slots[1] && gameState.slots[2] && !gameState.isTransmuting) {
- btn.disabled = false;
- btn.classList.remove('processing');
- } else {
- btn.disabled = true;
- }
- }
- // Setup transmute button
- function setupTransmuteButton() {
- document.getElementById('transmuteBtn').addEventListener('click', performTransmutation);
- }
- // Perform transmutation
- function performTransmutation() {
- if (gameState.isTransmuting) return;
- if (gameState.artifacts.length >= 10) {
- showNotification({
- name: "Inventory Full!",
- desc: "Destroy or consume artifacts to make space",
- power: 0
- }, false, true);
- return;
- }
- const doc1 = gameState.slots[1];
- const doc2 = gameState.slots[2];
- if (!doc1 || !doc2) return;
- gameState.isTransmuting = true;
- const btn = document.getElementById('transmuteBtn');
- btn.classList.add('processing');
- btn.disabled = true;
- const cauldron = document.getElementById('cauldron');
- cauldron.classList.add('active');
- createTransmuteParticles();
- setTimeout(() => {
- const keywords1 = doc1.keywords;
- const keywords2 = doc2.keywords;
- let artifact = null;
- let success = false;
- const commonKeywords = keywords1.filter(k => keywords2.includes(k));
- if (commonKeywords.length > 0) {
- const recipeKey = commonKeywords.sort().join(',');
- if (recipes[recipeKey]) {
- artifact = {
- ...recipes[recipeKey],
- id: Date.now(),
- inspected: false,
- trueNature: null
- };
- success = true;
- } else {
- const basePower = Math.ceil((doc1.power + doc2.power) / 2) + commonKeywords.length;
- artifact = {
- id: Date.now(),
- name: `${doc1.name.split(' ')[0]} ${doc2.name.split(' ')[1]} Fusion`,
- desc: `Combined essence of ${doc1.type} and ${doc2.type}`,
- power: basePower,
- hidden: Math.random() > 0.7,
- inspected: false,
- trueNature: null
- };
- success = basePower > 2;
- }
- } else if (Math.random() > 0.8) {
- success = true;
- artifact = {
- id: Date.now(),
- name: "Chaotic Artifact",
- desc: "Unpredictable properties",
- power: Math.floor(Math.random() * 4) + 1,
- hidden: true,
- inspected: false,
- trueNature: null,
- chaotic: true
- };
- } else {
- artifact = {
- id: Date.now(),
- name: "Corrupted Data",
- desc: "Incompatible combination",
- power: 0,
- corrupted: true,
- inspected: false,
- trueNature: null
- };
- }
- if (artifact.hidden) {
- const roll = Math.random();
- if (roll < 0.3) {
- artifact.trueNature = 'corrupted';
- } else if (roll > 0.8) {
- artifact.trueNature = 'legendary';
- } else {
- artifact.trueNature = 'enhanced';
- }
- }
- gameState.transmutations++;
- gameState.totalDocumentsUsed += 2;
- if (success) {
- gameState.successes++;
- gameState.artifacts.push(artifact);
- let pointsGained = artifact.power * 10;
- if (artifact.corrupted) pointsGained = -20;
- else if (artifact.power <= 2) pointsGained = -10;
- updatePoints(pointsGained);
- if (gameState.successes % 5 === 0) {
- gameState.level++;
- updatePoints(50);
- }
- } else {
- gameState.artifacts.push(artifact);
- updatePoints(-10);
- }
- showNotification(artifact, success, false);
- updateStats();
- updateArtifacts();
- clearSlots();
- cauldron.classList.remove('active');
- refreshUsedDocuments();
- gameState.isTransmuting = false;
- checkTransmuteReady();
- updateHints();
- }, 2000);
- }
- // Refresh used documents
- function refreshUsedDocuments() {
- for (let i = 0; i < documents.length; i++) {
- if (documents[i].used) {
- const template = documentTemplates[Math.floor(Math.random() * documentTemplates.length)];
- documents[i] = {
- id: Date.now() + Math.random(),
- ...template,
- used: false,
- rarity: getRarityFromPower(template.power)
- };
- }
- }
- documents.sort((a, b) => b.power - a.power);
- renderDocuments();
- }
- // Clear slots
- function clearSlots() {
- gameState.slots = { 1: null, 2: null };
- document.querySelectorAll('.slot').forEach(slot => {
- slot.classList.remove('filled');
- slot.innerHTML = `<span style="color: #9d7cff;">Slot ${slot.dataset.slot}</span>`;
- });
- checkTransmuteReady();
- }
- // Update points
- function updatePoints(change) {
- if (change === 0) return;
- const oldPoints = gameState.points;
- gameState.points = Math.max(0, gameState.points + change);
- const display = document.getElementById('pointsDisplay');
- display.textContent = `⭐ ${gameState.points} Points`;
- const floater = document.createElement('div');
- floater.className = change > 0 ? 'point-change positive' : 'point-change negative';
- floater.textContent = `${change > 0 ? '+' : ''}${change}`;
- floater.style.left = display.getBoundingClientRect().left + 'px';
- floater.style.top = display.getBoundingClientRect().bottom + 'px';
- document.body.appendChild(floater);
- setTimeout(() => floater.remove(), 2000);
- }
- // Update stats
- function updateStats() {
- document.getElementById('transmutationCount').textContent = gameState.transmutations;
- const rate = gameState.transmutations > 0
- ? Math.round((gameState.successes / gameState.transmutations) * 100)
- : 0;
- document.getElementById('successRate').textContent = rate + '%';
- document.getElementById('alchemyLevel').textContent = gameState.level;
- updateRiskLevel();
- }
- // Update risk level
- function updateRiskLevel() {
- const ratio = gameState.consumedWithoutInspection / Math.max(gameState.transmutations, 1);
- let risk = "Low";
- if (ratio > 0.5) risk = "Critical";
- else if (ratio > 0.3) risk = "High";
- else if (ratio > 0.1) risk = "Medium";
- document.getElementById('riskLevel').textContent = risk;
- document.getElementById('riskLevel').style.color =
- risk === "Critical" ? "#ff0000" :
- risk === "High" ? "#ff6600" :
- risk === "Medium" ? "#ffaa00" : "#00ff00";
- }
- // Update artifacts list
- function updateArtifacts() {
- const container = document.getElementById('artifactsList');
- const countDisplay = document.getElementById('inventoryCount');
- countDisplay.textContent = `${gameState.artifacts.length}/10 Artifacts`;
- countDisplay.style.color = gameState.artifacts.length >= 10 ? '#ff0000' : '#ff00ff';
- container.innerHTML = '';
- if (gameState.artifacts.length === 0) {
- container.innerHTML = '<div style="text-align: center; color: #9d7cff;">No artifacts created yet...</div>';
- return;
- }
- gameState.artifacts.slice().reverse().forEach(artifact => {
- const elem = document.createElement('div');
- elem.className = 'artifact-item';
- if (artifact.inspected) {
- if (artifact.corrupted) elem.classList.add('corrupted');
- else if (artifact.power >= 7) elem.classList.add('legendary');
- }
- const stars = '⭐'.repeat(Math.min(Math.max(Math.floor(artifact.power / 2), 0), 5));
- const powerColor = artifact.corrupted ? '#ff0000' :
- artifact.power >= 7 ? '#ffd700' :
- artifact.power <= 2 ? '#ff6666' : '#00ffff';
- elem.innerHTML = `
- <div class="artifact-name">${artifact.name}</div>
- <div class="artifact-desc">${artifact.desc}</div>
- <div class="artifact-power" style="color: ${powerColor};">${stars || '💀'}</div>
- <div class="artifact-actions">
- <button class="action-btn inspect-btn" onclick="inspectArtifact(${artifact.id})" ${artifact.inspected ? 'disabled' : ''}>
- ${artifact.inspected ? 'Inspected' : 'Inspect'}
- </button>
- <button class="action-btn consume-btn" onclick="consumeArtifact(${artifact.id})">
- Consume
- </button>
- <button class="action-btn destroy-btn" onclick="destroyArtifact(${artifact.id})">
- Destroy
- </button>
- </div>
- `;
- container.appendChild(elem);
- });
- }
- // Artifact actions
- function inspectArtifact(artifactId) {
- const artifact = gameState.artifacts.find(a => a.id === artifactId);
- if (!artifact) return;
- if (artifact.inspected) {
- showNotification({
- name: "Already Inspected",
- desc: "This artifact's properties are known",
- power: 0
- }, false, true);
- return;
- }
- artifact.inspected = true;
- gameState.inspectedArtifacts.add(artifactId);
- let pointChange = 0;
- let message = "";
- if (artifact.hidden && artifact.trueNature) {
- if (artifact.trueNature === 'corrupted') {
- artifact.corrupted = true;
- artifact.power = 0;
- pointChange = -30;
- message = "Revealed as corrupted! Artifact destroyed!";
- gameState.artifacts = gameState.artifacts.filter(a => a.id !== artifactId);
- } else if (artifact.trueNature === 'legendary') {
- artifact.power = Math.min(artifact.power * 2, 10);
- pointChange = artifact.power * 20;
- message = "Legendary artifact discovered!";
- } else {
- artifact.power += 2;
- pointChange = 30;
- message = "Hidden power revealed!";
- }
- } else if (artifact.corrupted) {
- pointChange = -20;
- message = "Corruption confirmed!";
- gameState.artifacts = gameState.artifacts.filter(a => a.id !== artifactId);
- } else {
- pointChange = Math.floor(artifact.power * 5);
- message = "Properties analyzed!";
- }
- updatePoints(pointChange);
- showNotification({
- name: message,
- desc: `${pointChange > 0 ? '+' : ''}${pointChange} points`,
- power: artifact.power
- }, pointChange > 0, true);
- updateArtifacts();
- }
- function consumeArtifact(artifactId) {
- const artifact = gameState.artifacts.find(a => a.id === artifactId);
- if (!artifact) return;
- let pointChange = 0;
- let message = "";
- if (!artifact.inspected) {
- gameState.consumedWithoutInspection++;
- if (artifact.corrupted || artifact.power <= 2) {
- pointChange = -50;
- message = "Consumed corrupted essence!";
- } else if (artifact.hidden && Math.random() > 0.5) {
- pointChange = -30;
- message = "Unknown artifact backfired!";
- } else {
- pointChange = artifact.power * 15;
- message = "Risky consumption paid off!";
- }
- } else {
- if (artifact.corrupted) {
- pointChange = -10;
- message = "Why would you consume this?";
- } else {
- pointChange = artifact.power * 20;
- message = "Artifact power absorbed!";
- }
- }
- gameState.artifacts = gameState.artifacts.filter(a => a.id !== artifactId);
- updatePoints(pointChange);
- showNotification({
- name: message,
- desc: `${pointChange > 0 ? '+' : ''}${pointChange} points`,
- power: 0
- }, pointChange > 0, true);
- updateArtifacts();
- updateRiskLevel();
- }
- function destroyArtifact(artifactId) {
- const artifact = gameState.artifacts.find(a => a.id === artifactId);
- if (!artifact) return;
- gameState.artifacts = gameState.artifacts.filter(a => a.id !== artifactId);
- showNotification({
- name: "Artifact Destroyed",
- desc: "Safely disposed of",
- power: 0
- }, false, true);
- updateArtifacts();
- }
- // Show notification
- function showNotification(artifact, success, isQuick) {
- const notification = document.createElement('div');
- notification.className = 'notification';
- notification.innerHTML = `
- <h2>${success ? '✨ Success!' : '❌ Alert'}</h2>
- <div style="color: ${success ? '#ffd700' : '#ff6666'}; font-size: 1.3rem; margin-bottom: 0.5rem;">
- ${artifact.name}
- </div>
- <div style="color: #e0e0ff;">
- ${artifact.desc}
- </div>
- ${artifact.power > 0 ? `<div style="color: #ff00ff; font-size: 1.1rem; margin-top: 0.5rem;">
- Power: ${'⚡'.repeat(Math.min(artifact.power, 5))}
- </div>` : ''}
- <button class="close-notification" onclick="this.parentElement.remove()">Continue</button>
- `;
- document.body.appendChild(notification);
- if (isQuick) {
- setTimeout(() => notification.remove(), 2000);
- }
- }
- // Create floating particles
- function createFloatingParticles() {
- setInterval(() => {
- if (Math.random() > 0.7) {
- const particle = document.createElement('div');
- particle.className = 'particle';
- particle.style.left = Math.random() * window.innerWidth + 'px';
- particle.style.bottom = '0px';
- particle.style.animationDelay = Math.random() * 2 + 's';
- document.body.appendChild(particle);
- setTimeout(() => particle.remove(), 3000);
- }
- }, 500);
- }
- // Create transmute particles
- function createTransmuteParticles() {
- const cauldron = document.getElementById('cauldron');
- const rect = cauldron.getBoundingClientRect();
- for (let i = 0; i < 20; i++) {
- const particle = document.createElement('div');
- particle.className = 'particle';
- particle.style.left = rect.left + rect.width / 2 + (Math.random() - 0.5) * 100 + 'px';
- particle.style.top = rect.top + 'px';
- particle.style.background = 'radial-gradient(circle, rgba(255, 215, 0, 0.9), transparent)';
- particle.style.width = '6px';
- particle.style.height = '6px';
- document.body.appendChild(particle);
- setTimeout(() => particle.remove(), 2000);
- }
- }
- // Update hints
- function updateHints() {
- const hints = [
- "💡 Inspect artifacts to reveal hidden properties!",
- "⚠️ Consuming without inspection is risky!",
- "🌟 Legendary artifacts hide among the corrupted!",
- "🎯 Match keywords for powerful combinations!",
- "📊 2-star artifacts and below lose points!",
- "🔄 Documents refresh after each transmutation!",
- "💰 Inspection bonuses increase with power!",
- "🎲 Chaos combinations have unpredictable results!",
- "📦 Maximum 10 artifacts - manage wisely!",
- "⚡ Level up every 5 successful transmutations!"
- ];
- const hint = hints[Math.floor(Math.random() * hints.length)];
- document.getElementById('recipeHint').textContent = hint;
- }
- // Start the game
- window.addEventListener('DOMContentLoaded', function() {
- init();
- });
- </script>
- </body>
- </html>
Add Comment
Please, Sign In to add comment