/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1", { collection: {}, stats: { totalCards: 0, common: 0, uncommon: 0, rare: 0, unique: 0, epic: 0, legendary: 0, exotic: 0, event: 0 } }); /**** * Classes ****/ var Button = Container.expand(function (text, width, height, color) { var self = Container.call(this); var background = self.attachAsset('cardButton', { anchorX: 0.5, anchorY: 0.5, width: width || 300, height: height || 100 }); var label = new Text2(text, { size: 40, fill: 0xFFFFFF }); label.anchor.set(0.5, 0.5); self.addChild(label); // Initialize scale object explicitly to avoid 'in' operator TypeError self.scale = { x: 1, y: 1 }; self.down = function () { // Ensure scale exists before tweening to avoid TypeError if (!this.scale) { this.scale = { x: 1, y: 1 }; } // Use self.scale instead of this.scale to ensure the correct scope tween(self.scale, { x: 0.95, y: 0.95 }, { duration: 100 }); }; self.up = function () { // Ensure scale exists before tweening to avoid TypeError if (!self.scale) { self.scale = { x: 1, y: 1 }; } tween(self.scale, { x: 1, y: 1 }, { duration: 100 }); }; return self; }); var Card = Container.expand(function (rarity, id, name, type) { var self = Container.call(this); self.rarity = rarity; self.id = id; self.name = name; self.type = type; self.revealed = false; // Card back initially shown var cardBack = self.attachAsset('cardBack', { anchorX: 0.5, anchorY: 0.5 }); // The actual card (initially hidden) var cardFront; switch (rarity) { case 'common': cardFront = self.attachAsset('commonCard', { anchorX: 0.5, anchorY: 0.5, visible: false }); break; case 'uncommon': cardFront = self.attachAsset('uncommonCard', { anchorX: 0.5, anchorY: 0.5, visible: false }); break; case 'rare': cardFront = self.attachAsset('rareCard', { anchorX: 0.5, anchorY: 0.5, visible: false }); break; case 'unique': cardFront = self.attachAsset('uniqueCard', { anchorX: 0.5, anchorY: 0.5, visible: false }); break; case 'epic': cardFront = self.attachAsset('epicCard', { anchorX: 0.5, anchorY: 0.5, visible: false }); break; case 'legendary': cardFront = self.attachAsset('legendaryCard', { anchorX: 0.5, anchorY: 0.5, visible: false }); break; case 'exotic': cardFront = self.attachAsset('exoticCard', { anchorX: 0.5, anchorY: 0.5, visible: false }); break; case 'event': cardFront = self.attachAsset('epicCard', { anchorX: 0.5, anchorY: 0.5, visible: false, tint: 0x00FFFF // Cyan color for event cards }); break; } // Card icon var icon; if (rarity === 'event') { // Event card icons by name if (self.name === 'Walrus') { icon = self.attachAsset('cardIconWalrus', { anchorX: 0.5, anchorY: 0.5, y: -150, visible: false }); } else if (self.name === 'Bat') { icon = self.attachAsset('cardIconBat', { anchorX: 0.5, anchorY: 0.5, y: -150, visible: false }); } else if (self.name === 'Elephant') { icon = self.attachAsset('cardIconElephant', { anchorX: 0.5, anchorY: 0.5, y: -150, visible: false }); } else if (self.name === 'Moose') { icon = self.attachAsset('cardIconMoose', { anchorX: 0.5, anchorY: 0.5, y: -150, visible: false }); } else if (self.name === 'Wasp') { icon = self.attachAsset('cardIconWasp', { anchorX: 0.5, anchorY: 0.5, y: -150, visible: false }); } else if (self.name === 'Seal') { icon = self.attachAsset('cardIconSeal', { anchorX: 0.5, anchorY: 0.5, y: -150, visible: false }); } else { icon = self.attachAsset('cardIconEVERYTHING', { anchorX: 0.5, anchorY: 0.5, y: -150, visible: false }); } } else switch (type) { case 'ExtinctAnimal': // Check for specific Extinct Animals if (self.name === 'Dodo') { icon = self.attachAsset('cardIconDodo', { anchorX: 0.5, anchorY: 0.5, y: -150, visible: false }); } else if (self.name === 'Sabertooth Tiger') { icon = self.attachAsset('cardIconSabertoothTiger', { anchorX: 0.5, anchorY: 0.5, y: -150, visible: false }); } else if (self.name === 'Woolly Rhino') { icon = self.attachAsset('cardIconWoollyRhino', { anchorX: 0.5, anchorY: 0.5, y: -150, visible: false }); } else if (self.name === 'Megalodon') { icon = self.attachAsset('cardIconMegalodon', { anchorX: 0.5, anchorY: 0.5, y: -150, visible: false }); } else if (self.name === 'Woolly Mammoth') { icon = self.attachAsset('cardIconWoollyMammoth', { anchorX: 0.5, anchorY: 0.5, y: -150, visible: false }); } else { icon = self.attachAsset('cardIconMammal', { anchorX: 0.5, anchorY: 0.5, y: -150, visible: false }); } break; case 'Rodent': icon = self.attachAsset('cardIconRat', { anchorX: 0.5, anchorY: 0.5, y: -150, visible: false }); break; case 'Avian': // Check for specific Avians that have unique icons if (self.name === 'Owl') { icon = self.attachAsset('cardIconOwl', { anchorX: 0.5, anchorY: 0.5, y: -150, visible: false }); } else if (self.name === 'Ostrich') { icon = self.attachAsset('cardIconOstrich', { anchorX: 0.5, anchorY: 0.5, y: -150, visible: false }); } else if (self.name === 'Duck') { icon = self.attachAsset('cardIconDuck', { anchorX: 0.5, anchorY: 0.5, y: -150, visible: false }); } else if (self.name === 'Penguin') { icon = self.attachAsset('cardIconPenguin', { anchorX: 0.5, anchorY: 0.5, y: -150, visible: false }); } else if (self.name === 'Eagle') { icon = self.attachAsset('cardIconEagle', { anchorX: 0.5, anchorY: 0.5, y: -150, visible: false }); } else if (self.name === 'Crow') { icon = self.attachAsset('cardIconCrow', { anchorX: 0.5, anchorY: 0.5, y: -150, visible: false }); } else if (self.name === 'Vulture') { icon = self.attachAsset('cardIconVulture', { anchorX: 0.5, anchorY: 0.5, y: -150, visible: false }); } else if (self.name === 'Pelican') { icon = self.attachAsset('cardIconPelican', { anchorX: 0.5, anchorY: 0.5, y: -150, visible: false }); } else if (self.name === 'Hummingbird') { icon = self.attachAsset('cardIconHummingbird', { anchorX: 0.5, anchorY: 0.5, y: -150, visible: false }); } else if (self.name === 'Phoenix') { icon = self.attachAsset('cardIconPhoenix', { anchorX: 0.5, anchorY: 0.5, y: -150, visible: false }); } else { icon = self.attachAsset('cardIconPidgeon', { anchorX: 0.5, anchorY: 0.5, y: -150, visible: false }); } break; case 'Amphibian': // Check for specific Amphibians that have unique icons if (self.name === 'Frog') { icon = self.attachAsset('cardIconFrog', { anchorX: 0.5, anchorY: 0.5, y: -150, visible: false }); } else { icon = self.attachAsset('cardIconSalamander', { anchorX: 0.5, anchorY: 0.5, y: -150, visible: false }); } break; case 'Insect': // Check for specific Insects that have unique icons if (self.name === 'Beetle') { icon = self.attachAsset('cardIconBeetle', { anchorX: 0.5, anchorY: 0.5, y: -150, visible: false }); } else { icon = self.attachAsset('cardIconAnt', { anchorX: 0.5, anchorY: 0.5, y: -150, visible: false }); } break; case 'Aquatic': // Check for specific Aquatics that have unique icons if (self.name === 'Shark') { icon = self.attachAsset('cardIconShark', { anchorX: 0.5, anchorY: 0.5, y: -150, visible: false }); } else if (self.name === 'Whale') { icon = self.attachAsset('cardIconWhale', { anchorX: 0.5, anchorY: 0.5, y: -150, visible: false }); } else { icon = self.attachAsset('cardIconSalmon', { anchorX: 0.5, anchorY: 0.5, y: -150, visible: false }); } break; case 'Mammal': // Check for specific Mammals that have unique icons if (self.name === 'Pig') { icon = self.attachAsset('cardIconPig', { anchorX: 0.5, anchorY: 0.5, y: -150, visible: false }); } else if (self.name === 'Fox') { icon = self.attachAsset('cardIconFox', { anchorX: 0.5, anchorY: 0.5, y: -150, visible: false }); } else if (self.name === 'Wolf') { icon = self.attachAsset('cardIconWolf', { anchorX: 0.5, anchorY: 0.5, y: -150, visible: false }); } else if (self.name === 'Bear') { icon = self.attachAsset('cardIconBear', { anchorX: 0.5, anchorY: 0.5, y: -150, visible: false }); } else if (self.name === 'Hippo') { icon = self.attachAsset('cardIconHippo', { anchorX: 0.5, anchorY: 0.5, y: -150, visible: false }); } else if (self.name === 'Rhino') { icon = self.attachAsset('cardIconRhino', { anchorX: 0.5, anchorY: 0.5, y: -150, visible: false }); } else { icon = self.attachAsset('cardIconHare', { anchorX: 0.5, anchorY: 0.5, y: -150, visible: false }); } break; case 'Reptile': // Check for specific Reptiles that have unique icons if (self.name === 'Crocodile') { icon = self.attachAsset('cardIconCrocodile', { anchorX: 0.5, anchorY: 0.5, y: -150, visible: false }); } else if (self.name === 'Snake') { icon = self.attachAsset('cardIconSnake', { anchorX: 0.5, anchorY: 0.5, y: -150, visible: false }); } else if (self.name === 'Cobra') { icon = self.attachAsset('cardIconCobra', { anchorX: 0.5, anchorY: 0.5, y: -150, visible: false }); } else { icon = self.attachAsset('cardIconLizard', { anchorX: 0.5, anchorY: 0.5, y: -150, visible: false }); } break; case 'Feline': if (self.name === 'Cheetah') { icon = self.attachAsset('cardIconCheetah', { anchorX: 0.5, anchorY: 0.5, y: -150, visible: false }); } else { icon = self.attachAsset('cardIconLion', { anchorX: 0.5, anchorY: 0.5, y: -150, visible: false }); } break; case 'Primate': icon = self.attachAsset('cardIconGorilla', { anchorX: 0.5, anchorY: 0.5, y: -150, visible: false }); break; case 'EVERYTHING': icon = self.attachAsset('cardIconDuck', { anchorX: 0.5, anchorY: 0.5, y: -150, visible: false }); break; case 'Dinosaur': if (self.name === 'Velociraptor') { icon = self.attachAsset('cardIconVelociraptor', { anchorX: 0.5, anchorY: 0.5, y: -150, visible: false }); } else if (self.name === 'Parasaur') { icon = self.attachAsset('cardIconParasaur', { anchorX: 0.5, anchorY: 0.5, y: -150, visible: false }); } else if (self.name === 'Pterodactyl') { icon = self.attachAsset('cardIconPterodactyl', { anchorX: 0.5, anchorY: 0.5, y: -150, visible: false }); } else if (self.name === 'Stegosaurus') { icon = self.attachAsset('cardIconStegosaurus', { anchorX: 0.5, anchorY: 0.5, y: -150, visible: false }); } else if (self.name === 'Ankylosaurus') { icon = self.attachAsset('cardIconAnkylosaurus', { anchorX: 0.5, anchorY: 0.5, y: -150, visible: false }); } else if (self.name === 'Spinosaurus') { icon = self.attachAsset('cardIconSpinosaurus', { anchorX: 0.5, anchorY: 0.5, y: -150, visible: false }); } else if (self.name === 'Diplodocus') { icon = self.attachAsset('cardIconDiplodocus', { anchorX: 0.5, anchorY: 0.5, y: -150, visible: false }); } else if (self.name === 'Triceratops') { icon = self.attachAsset('cardIconTriceratops', { anchorX: 0.5, anchorY: 0.5, y: -150, visible: false }); } else if (self.name === 'T-REX') { icon = self.attachAsset('cardIconTRex', { anchorX: 0.5, anchorY: 0.5, y: -150, visible: false }); } break; default: // Default icon if type not found (optional) icon = self.attachAsset('cardIconEVERYTHING', { anchorX: 0.5, anchorY: 0.5, y: -150, visible: false }); break; } // Card text var nameText = new Text2(name, { size: 50, fill: 0xFFFFFF }); nameText.anchor.set(0.5, 0); nameText.y = 50; nameText.visible = false; self.addChild(nameText); var typeText = new Text2(type, { size: 40, fill: 0xFFFFFF }); typeText.anchor.set(0.5, 0); typeText.y = 120; typeText.visible = false; self.addChild(typeText); var rarityText = new Text2(rarity.toUpperCase(), { size: 35, fill: 0xFFFFFF }); rarityText.anchor.set(0.5, 1); rarityText.y = 300; rarityText.visible = false; self.addChild(rarityText); // Reveal the card self.reveal = function () { if (self.revealed) { return; } self.revealed = true; LK.getSound('cardFlip').play(); // Play special sounds for card rarities if (rarity === 'unique') { LK.getSound('uniqueDrop').play(); } else if (rarity === 'epic') { LK.getSound('epicDrop').play(); } else if (rarity === 'legendary') { LK.getSound('legendaryDrop').play(); } else if (rarity === 'exotic') { LK.getSound('exoticDrop').play(); } else if (rarity === 'rare') { LK.getSound('rareDrop').play(); } else if (rarity === 'event') { LK.getSound('eventCard').play(); } // Flip animation tween(cardBack.scale, { x: 0 }, { duration: 200, onFinish: function onFinish() { cardBack.visible = false; cardFront.visible = true; icon.visible = true; nameText.visible = true; typeText.visible = true; rarityText.visible = true; tween(cardFront.scale, { x: 1 }, { duration: 200, easing: tween.easeOut, onFinish: function onFinish() { // Add card to collection if (!storage.collection[self.id]) { // Initialize collection entry with primitive values separately storage.collection[self.id + "_rarity"] = self.rarity; storage.collection[self.id + "_name"] = self.name; storage.collection[self.id + "_type"] = self.type; storage.collection[self.id + "_count"] = 0; } storage.collection[self.id + "_count"] = (storage.collection[self.id + "_count"] || 0) + 1; storage.stats.totalCards++; if (!storage.stats[self.rarity]) { storage.stats[self.rarity] = 0; } storage.stats[self.rarity]++; } }); cardFront.scale.x = 0; } }); }; self.down = function () { self.reveal(); }; return self; }); var MiniGame = Container.expand(function (gameType) { var self = Container.call(this); self.gameType = gameType; self.score = 0; self.isActive = true; self.gameTimer = 30; // 30 seconds game duration (only for GemCollector) self.lastUpdateTime = Date.now(); self.wrongAnswers = 0; // Track wrong answers for Quiz // Background for the mini game var background = self.attachAsset('cardButton', { anchorX: 0.5, anchorY: 0.5, width: 1800, height: 2000, tint: 0x333333 }); // Game title var displayTitle = gameType === 'GemCollector' ? "GEM COLLECTOR" : gameType === 'Quiz' ? "CARD QUIZ" : gameType.toUpperCase() + " MINI GAME"; var titleText = new Text2(displayTitle, { size: 60, fill: 0xFFFFFF }); titleText.anchor.set(0.5, 0); titleText.y = -900; self.addChild(titleText); // Score display var scoreText = new Text2("SCORE: 0", { size: 50, fill: 0xFFFFFF }); scoreText.anchor.set(0.5, 0); scoreText.y = -800; self.addChild(scoreText); // Timer display (or wrong answer count for Quiz) var timerText = new Text2(gameType === 'Quiz' ? "WRONG: 0/3" : "TIME: 30s", { size: 50, fill: 0xFFFFFF }); timerText.anchor.set(0.5, 0); timerText.y = -720; self.addChild(timerText); // Game elements based on type var gameElements = []; if (gameType === 'GemCollector') { // Create gem targets (was mudSplat, now gems) for (var i = 0; i < 5; i++) { var target = self.attachAsset('mudSplat', { anchorX: 0.5, anchorY: 0.5, x: Math.random() * 1200 - 600, y: Math.random() * 1200 - 400, scaleX: 2, scaleY: 2 }); target.down = function () { if (!self.isActive) return; // Move to a new position this.x = Math.random() * 1200 - 600; this.y = Math.random() * 1200 - 400; // Increase score by 25 points for each gem collected self.score += 25; scoreText.setText("SCORE: " + self.score); // Visual feedback // Ensure scale exists before tweening to avoid TypeError if (!this.scale) { this.scale = { x: 2, y: 2 }; } tween(this.scale, { x: 1.5, y: 1.5 }, { duration: 100, onFinish: function onFinish() { // Ensure scale exists before tweening back if (!this.scale) { this.scale = { x: 2, y: 2 }; } tween(this.scale, { x: 2, y: 2 }, { duration: 100 }); } }); }; gameElements.push(target); } } else if (gameType === 'Quiz') { // Helper function to get card description var getCardDescription = function getCardDescription(card) { var descriptions = { // Common cards 'Rat': 'A small rodent often found in urban areas', 'Pidgeon': 'A common bird seen in cities worldwide', 'Frog': 'An amphibian that lives both in water and on land', 'Ant': 'A tiny insect that lives in colonies', 'Salmon': 'A fish that swims upstream to spawn', 'Hare': 'A fast-running mammal with long ears', 'Pig': 'A farm animal known for its intelligence', 'Snake': 'A legless reptile that slithers', // Uncommon cards 'Fox': 'A cunning mammal with a bushy tail', 'Owl': 'A nocturnal bird with excellent vision', 'Salamander': 'An amphibian that can regenerate limbs', 'Lizard': 'A small reptile that can lose its tail', 'Beetle': 'An insect with a hard shell', 'Cobra': 'A venomous snake with a hood', 'Eagle': 'A large bird of prey with keen eyesight', 'Penguin': 'A flightless bird that swims', // Rare cards 'Wolf': 'A pack-hunting canine predator', 'Ostrich': 'The largest living bird species', 'Shark': 'An apex predator of the ocean', 'Rhino': 'A large mammal with a horn on its nose', 'Cheetah': 'The fastest land animal', // Unique cards 'Bear': 'A large omnivorous mammal that hibernates', 'Lion': 'The king of the jungle', // Epic cards 'Gorilla': 'The largest living primate', 'Crocodile': 'An ancient reptilian predator', // Legendary cards 'Hippo': 'A massive semi-aquatic mammal', 'Whale': 'The largest animal on Earth', // Exotic card 'Duck': 'It can walk, swim, and fly', // Dinosaurs 'Velociraptor': 'A small but fierce dinosaur hunter', 'Parasaur': 'A herbivorous dinosaur with a crest', 'Pterodactyl': 'A flying prehistoric reptile', 'Stegosaurus': 'A dinosaur with plates on its back', 'Ankylosaurus': 'An armored dinosaur with a club tail', 'Spinosaurus': 'A dinosaur with a sail on its back', 'Diplodocus': 'A long-necked herbivorous dinosaur', 'Triceratops': 'A three-horned dinosaur', 'T-REX': 'The tyrant king of dinosaurs', // Extinct animals 'Dodo': 'A flightless bird that went extinct', 'Sabertooth Tiger': 'An extinct cat with long fangs', 'Woolly Rhino': 'An extinct hairy rhinoceros', 'Megalodon': 'A prehistoric giant shark', 'Woolly Mammoth': 'An extinct elephant with long hair', // Avian cards for quiz 'Vulture': 'A large scavenging bird that feeds on carrion', 'Hummingbird': 'The smallest bird that can hover and fly backwards', 'Crow': 'A highly intelligent black bird known for using tools', 'Pelican': 'A large water bird with a distinctive throat pouch', 'Phoenix': 'A mythical bird that rises from its own ashes', // Profession cards 'Archeologist': 'A person who studies ancient cultures by digging up artifacts', 'Builder': 'Someone who constructs things with their hands', 'Strategist': 'A person skilled in planning and tactics', 'Trader': 'Someone who buys and sells goods for profit', 'Windowsill': 'A horizontal surface at the bottom of a window' }; return descriptions[card.name] || 'A mysterious creature'; }; // Generate quiz questions from card database // Quiz game variables self.currentQuestionIndex = 0; self.questions = []; self.currentChoices = []; self.choiceButtons = []; self.correctAnswerIndex = -1; self.questionText = null; // Show next question in quiz self.showNextQuestion = function () { // Generate new question if needed if (self.currentQuestionIndex >= self.questions.length) { self.generateNewQuestion(); } var question = self.questions[self.currentQuestionIndex]; self.questionText.setText('Question ' + (self.currentQuestionIndex + 1) + '\n\n' + question.description); // Generate choices (1 correct + 3 random) self.currentChoices = []; self.currentChoices.push(question.card); // Add 3 random wrong answers var wrongChoices = CARD_DATABASE.filter(function (card) { return card.id !== question.card.id && card.rarity !== 'event'; }); for (var i = 0; i < 3; i++) { if (wrongChoices.length > 0) { var randomIndex = Math.floor(Math.random() * wrongChoices.length); self.currentChoices.push(wrongChoices[randomIndex]); wrongChoices.splice(randomIndex, 1); } } // Shuffle choices for (var i = self.currentChoices.length - 1; i > 0; i--) { var j = Math.floor(Math.random() * (i + 1)); var temp = self.currentChoices[i]; self.currentChoices[i] = self.currentChoices[j]; self.currentChoices[j] = temp; } // Find correct answer index for (var i = 0; i < self.currentChoices.length; i++) { if (self.currentChoices[i].id === question.card.id) { self.correctAnswerIndex = i; break; } } // Update button labels for (var i = 0; i < self.choiceButtons.length; i++) { if (i < self.currentChoices.length) { self.choiceButtons[i].visible = true; // Update button text var buttonText = self.choiceButtons[i].children[1]; if (buttonText) { buttonText.setText(self.currentChoices[i].name); } } else { self.choiceButtons[i].visible = false; } } }; var availableCards = CARD_DATABASE.filter(function (card) { return card.rarity !== 'event'; // Exclude event cards from quiz }); // Function to generate a new question self.generateNewQuestion = function () { var correctCard = availableCards[Math.floor(Math.random() * availableCards.length)]; var question = { card: correctCard, description: getCardDescription(correctCard) }; self.questions.push(question); }; // Generate first question self.generateNewQuestion(); // Question text display self.questionText = new Text2("", { size: 45, fill: 0xFFFFFF }); self.questionText.anchor.set(0.5, 0); self.questionText.y = -600; self.addChild(self.questionText); // Create answer choice buttons for (var i = 0; i < 4; i++) { var choiceButton = new Button("", 700, 120); choiceButton.x = 0; choiceButton.y = -300 + i * 150; choiceButton.choiceIndex = i; self.addChild(choiceButton); self.choiceButtons.push(choiceButton); choiceButton.down = function () { if (!self.isActive) return; tween(this.scale, { x: 0.95, y: 0.95 }, { duration: 100 }); }; choiceButton.up = function () { if (!self.isActive) return; var buttonIndex = this.choiceIndex; tween(this.scale, { x: 1, y: 1 }, { duration: 100, onFinish: function onFinish() { self.checkAnswer(buttonIndex); } }); }; } // Start first question self.showNextQuestion(); } // Check answer in quiz self.checkAnswer = function (choiceIndex) { if (!self.isActive) return; if (choiceIndex === self.correctAnswerIndex) { // Correct answer self.score += 75; scoreText.setText("SCORE: " + self.score); // Visual feedback - flash green LK.effects.flashObject(self.choiceButtons[choiceIndex], 0x00FF00, 500); } else { // Wrong answer - flash red LK.effects.flashObject(self.choiceButtons[choiceIndex], 0xFF0000, 500); self.wrongAnswers++; timerText.setText("WRONG: " + self.wrongAnswers + "/3"); // Check if game should end if (self.wrongAnswers >= 3) { LK.setTimeout(function () { self.endGame(); }, 1000); return; } } // Move to next question after delay LK.setTimeout(function () { self.currentQuestionIndex++; self.showNextQuestion(); }, 1000); }; // End game function self.endGame = function () { self.isActive = false; // Show the final score var finalScoreText = new Text2("FINAL SCORE: " + self.score, { size: 70, fill: 0xFFFFFF }); finalScoreText.anchor.set(0.5, 0.5); self.addChild(finalScoreText); // Determine rewards var eventPoints = self.score; // Add points to event stats if (!storage.stats.eventPoints) { storage.stats.eventPoints = 0; } storage.stats.eventPoints += eventPoints; // Check if player earned reward thresholds var cardsEarned = []; // Calculate how many 100-point rewards var regularRewards = Math.floor(eventPoints / 100); for (var i = 0; i < regularRewards; i++) { // Random rarity up to epic var rarities = ['common', 'uncommon', 'rare', 'unique', 'epic']; var rarity = rarities[Math.floor(Math.random() * rarities.length)]; // Filter cards by rarity var possibleCards = CARD_DATABASE.filter(function (card) { return card.rarity === rarity; }); // Select random card if (possibleCards.length > 0) { var card = possibleCards[Math.floor(Math.random() * possibleCards.length)]; var newCard = new Card(card.rarity, card.id, card.name, card.type); newCard.reveal(); cardsEarned.push(newCard); } } // Check for 1000-point event card reward var eventRewards = Math.floor(eventPoints / 1000); for (var i = 0; i < eventRewards; i++) { // Find event cards var eventCards = CARD_DATABASE.filter(function (card) { return card.rarity === 'event'; }); // Select random event card if (eventCards.length > 0) { var card = eventCards[Math.floor(Math.random() * eventCards.length)]; var newCard = new Card(card.rarity, card.id, card.name, card.type); newCard.reveal(); cardsEarned.push(newCard); } } // Show earned cards or let the player know they didn't earn any var rewardText = new Text2("REWARDS EARNED:", { size: 50, fill: 0xFFFFFF }); rewardText.anchor.set(0.5, 0); rewardText.y = 100; self.addChild(rewardText); if (cardsEarned.length > 0) { // Display earned cards for (var i = 0; i < cardsEarned.length; i++) { var card = cardsEarned[i]; card.scale.set(0.4); card.x = (i - (cardsEarned.length - 1) / 2) * 250; card.y = 300; self.addChild(card); } } else { var noRewardText = new Text2("No rewards earned.\nGet more points next time!", { size: 40, fill: 0xFFFFFF }); noRewardText.anchor.set(0.5, 0); noRewardText.y = 150; self.addChild(noRewardText); } // Add continue button var continueButton = new Button("CONTINUE", 400, 100); continueButton.y = 700; self.addChild(continueButton); continueButton.down = function () { tween(continueButton.scale, { x: 0.95, y: 0.95 }, { duration: 100 }); }; continueButton.up = function () { tween(continueButton.scale, { x: 1, y: 1 }, { duration: 100, onFinish: function onFinish() { // Return to event screen showEventScreen(); self.destroy(); } }); }; }; // Update function self.update = function () { if (!self.isActive) return; // Only update timer for non-Quiz games if (gameType !== 'Quiz') { // Update timer var currentTime = Date.now(); var deltaTime = (currentTime - self.lastUpdateTime) / 1000; self.lastUpdateTime = currentTime; self.gameTimer -= deltaTime; if (self.gameTimer <= 0) { self.gameTimer = 0; self.endGame(); } timerText.setText("TIME: " + Math.ceil(self.gameTimer) + "s"); } // Game specific updates if (gameType === 'GemCollector') { // Update gem targets for (var i = 0; i < gameElements.length; i++) { var target = gameElements[i]; target.rotation += 0.01; } } else if (gameType === 'Quiz') { // Quiz doesn't need per-frame updates } }; return self; }); var Pack = Container.expand(function (type) { var self = Container.call(this); self.type = type; self.opened = false; // Pack artwork based on type var packArt; switch (type) { case 'ancient': packArt = self.attachAsset('packAncient', { anchorX: 0.5, anchorY: 0.5 }); break; case 'common': packArt = self.attachAsset('packCommon', { anchorX: 0.5, anchorY: 0.5 }); break; case 'advanced': packArt = self.attachAsset('packAdvanced', { anchorX: 0.5, anchorY: 0.5 }); break; case 'rare': packArt = self.attachAsset('packRare', { anchorX: 0.5, anchorY: 0.5 }); break; case 'magic': packArt = self.attachAsset('packMagic', { anchorX: 0.5, anchorY: 0.5 }); break; case 'legendary': packArt = self.attachAsset('packLegendary', { anchorX: 0.5, anchorY: 0.5 }); break; case 'jurassic': packArt = self.attachAsset('packJurassic', { anchorX: 0.5, anchorY: 0.5 }); break; case 'random': packArt = self.attachAsset('packRandom', { anchorX: 0.5, anchorY: 0.5 }); break; case 'event': packArt = self.attachAsset('packEvent', { anchorX: 0.5, anchorY: 0.5 }); break; case 'avians': packArt = self.attachAsset('packAvians', { anchorX: 0.5, anchorY: 0.5 }); break; } // Pack type text var typeText = new Text2(type.toUpperCase() + " PACK", { size: 40, fill: 0xFFFFFF }); typeText.anchor.set(0.5, 0.5); self.addChild(typeText); self.down = function () { if (!currentlyOpeningPack && !self.opened) { self.openPack(); } }; self.openPack = function () { if (self.opened || currentlyOpeningPack) { return; } currentlyOpeningPack = true; LK.getSound('packOpen').play(); // Hide all packs for (var i = 0; i < packDisplays.length; i++) { if (packDisplays[i] !== self) { tween(packDisplays[i], { alpha: 0 }, { duration: 300 }); } } // Move to center and fade out tween(self, { y: 2732 / 2 - 200, scale: 1.5 }, { duration: 500, easing: tween.easeOut, onFinish: function onFinish() { tween(self, { alpha: 0 }, { duration: 300, onFinish: function onFinish() { self.visible = false; // Generate cards based on pack type var cards = generateCardsFromPack(self.type); // Display cards for (var i = 0; i < cards.length; i++) { var card = cards[i]; card.x = 2048 / 2 + (i - (cards.length - 1) / 2) * 550; card.y = 2732 / 2; card.scale.set(0.7); game.addChild(card); displayedCards.push(card); // Animate card entry card.y = 2732 + 400; tween(card, { y: 2732 / 2 }, { duration: 500, easing: tween.easeOut }); } // Show return button showReturnButton(); } }); } }); }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x1a1a2e }); /**** * Game Code ****/ // Game state variables // Event card icon assets var currentScreen = 'home'; // 'home', 'packs', 'collection' var currentlyOpeningPack = false; var packDisplays = []; var displayedCards = []; var screenElements = []; var isLoggedIn = storage.isLoggedIn || false; var username = storage.username || ''; // Game constants var CARD_DATABASE = [ // Event cards - Only obtainable through events { id: 'ev_1', rarity: 'event', name: 'Walrus', type: 'Mammal' }, { id: 'ev_2', rarity: 'event', name: 'Bat', type: 'Mammal' }, { id: 'ev_3', rarity: 'event', name: 'Elephant', type: 'Mammal' }, { id: 'ev_4', rarity: 'event', name: 'Moose', type: 'Mammal' }, { id: 'ev_5', rarity: 'event', name: 'Wasp', type: 'Insect' }, { id: 'ev_6', rarity: 'event', name: 'Seal', type: 'Mammal' }, // Extinct Animal cards - for Ancient Pack { id: 'e_1', rarity: 'unique', name: 'Dodo', type: 'ExtinctAnimal' }, { id: 'e_2', rarity: 'unique', name: 'Sabertooth Tiger', type: 'ExtinctAnimal' }, { id: 'e_3', rarity: 'epic', name: 'Woolly Rhino', type: 'ExtinctAnimal' }, { id: 'e_4', rarity: 'legendary', name: 'Megalodon', type: 'ExtinctAnimal' }, { id: 'e_5', rarity: 'exotic', name: 'Woolly Mammoth', type: 'ExtinctAnimal' }, // Common cards (id, name, type) { id: 'c1', rarity: 'common', name: 'Rat', type: 'Rodent' }, { id: 'c2', rarity: 'common', name: 'Pidgeon', type: 'Avian' }, { id: 'c3', rarity: 'common', name: 'Frog', type: 'Amphibian' }, { id: 'c4', rarity: 'common', name: 'Ant', type: 'Insect' }, { id: 'c5', rarity: 'common', name: 'Salmon', type: 'Aquatic' }, { id: 'c6', rarity: 'common', name: 'Hare', type: 'Mammal' }, { id: 'c8', rarity: 'common', name: 'Pig', type: 'Mammal' }, { id: 'c9', rarity: 'common', name: 'Snake', type: 'Reptile' }, // Uncommon cards { id: 'u1', rarity: 'uncommon', name: 'Fox', type: 'Mammal' }, { id: 'u2', rarity: 'uncommon', name: 'Owl', type: 'Avian' }, { id: 'u3', rarity: 'uncommon', name: 'Salamander', type: 'Amphibian' }, { id: 'u4', rarity: 'uncommon', name: 'Lizard', type: 'Reptile' }, { id: 'u5', rarity: 'uncommon', name: 'Beetle', type: 'Insect' }, { id: 'u6', rarity: 'uncommon', name: 'Cobra', type: 'Reptile' }, { id: 'u7', rarity: 'uncommon', name: 'Eagle', type: 'Avian' }, { id: 'u8', rarity: 'uncommon', name: 'Penguin', type: 'Avian' }, // Rare cards { id: 'r1', rarity: 'rare', name: 'Wolf', type: 'Mammal' }, { id: 'r2', rarity: 'rare', name: 'Ostrich', type: 'Avian' }, { id: 'r3', rarity: 'rare', name: 'Shark', type: 'Aquatic' }, { id: 'r4', rarity: 'rare', name: 'Rhino', type: 'Mammal' }, { id: 'r5', rarity: 'rare', name: 'Cheetah', type: 'Feline' }, // Unique cards { id: 'q1', rarity: 'unique', name: 'Bear', type: 'Mammal' }, { id: 'q2', rarity: 'unique', name: 'Lion', type: 'Feline' }, // Epic cards { id: 'e1', rarity: 'epic', name: 'Gorilla', type: 'Primate' }, { id: 'e2', rarity: 'epic', name: 'Crocodile', type: 'Reptile' }, // Legendary cards { id: 'l1', rarity: 'legendary', name: 'Hippo', type: 'Mammal' }, { id: 'l2', rarity: 'legendary', name: 'Whale', type: 'Aquatic' }, // Exotic card { id: 'x1', rarity: 'exotic', name: 'Duck', type: 'EVERYTHING' }, // Avians pack exclusive cards { id: 'av1', rarity: 'rare', name: 'Vulture', type: 'Avian' }, { id: 'av2', rarity: 'rare', name: 'Crow', type: 'Avian' }, { id: 'av3', rarity: 'unique', name: 'Pelican', type: 'Avian' }, { id: 'av4', rarity: 'unique', name: 'Hummingbird', type: 'Avian' }, { id: 'av5', rarity: 'exotic', name: 'Phoenix', type: 'Avian' }, // Jurassic pack cards { id: 'j1', rarity: 'unique', name: 'Velociraptor', type: 'Dinosaur' }, { id: 'j2', rarity: 'unique', name: 'Parasaur', type: 'Dinosaur' }, { id: 'j3', rarity: 'epic', name: 'Pterodactyl', type: 'Dinosaur' }, { id: 'j4', rarity: 'epic', name: 'Stegosaurus', type: 'Dinosaur' }, { id: 'j5', rarity: 'epic', name: 'Ankylosaurus', type: 'Dinosaur' }, { id: 'j6', rarity: 'legendary', name: 'Spinosaurus', type: 'Dinosaur' }, { id: 'j7', rarity: 'legendary', name: 'Diplodocus', type: 'Dinosaur' }, { id: 'j8', rarity: 'legendary', name: 'Triceratops', type: 'Dinosaur' }, { id: 'j9', rarity: 'exotic', name: 'T-REX', type: 'Dinosaur' }, // Profession cards { id: 'p1', rarity: 'rare', name: 'Archeologist', type: 'Primate' }, { id: 'p2', rarity: 'uncommon', name: 'Builder', type: 'Primate' }, { id: 'p3', rarity: 'unique', name: 'Strategist', type: 'Primate' }, { id: 'p4', rarity: 'uncommon', name: 'Trader', type: 'Primate' }, { id: 'p5', rarity: 'common', name: 'Windowsill', type: 'EVERYTHING' }]; // Play background music LK.playMusic('bgMusic'); // Initialize stats text var statsText = new Text2("Collection: 0 cards", { size: 50, fill: 0xFFFFFF }); statsText.anchor.set(0.5, 0); statsText.y = 100; LK.gui.top.addChild(statsText); updateStatsDisplay(); // Show login prompt popup function showLoginPrompt() { var promptBg = new Container(); promptBg.x = 2048 / 2; promptBg.y = 2732 / 2; var bg = promptBg.attachAsset('cardButton', { anchorX: 0.5, anchorY: 0.5, width: 800, height: 400, tint: 0x000000, alpha: 0.9 }); var promptText = new Text2("Please login to access this feature", { size: 50, fill: 0xFFFFFF }); promptText.anchor.set(0.5, 0.5); promptText.y = -50; promptBg.addChild(promptText); var okButton = new Button("OK", 200, 80); okButton.y = 100; promptBg.addChild(okButton); game.addChild(promptBg); screenElements.push(promptBg); okButton.down = function () { tween(okButton.scale, { x: 0.95, y: 0.95 }, { duration: 100 }); }; okButton.up = function () { tween(okButton.scale, { x: 1, y: 1 }, { duration: 100, onFinish: function onFinish() { promptBg.destroy(); var index = screenElements.indexOf(promptBg); if (index > -1) { screenElements.splice(index, 1); } } }); }; } // Setup the home screen if (isLoggedIn) { showHomeScreen(); } else { showLoginScreen(); } // Show login screen function showLoginScreen() { clearScreen(); currentScreen = 'login'; var title = new Text2("ANIMALMON", { size: 120, fill: 0xFFFFFF }); title.anchor.set(0.5, 0); title.x = 2048 / 2; title.y = 300; game.addChild(title); screenElements.push(title); var subtitle = new Text2("Pocket Menagerie", { size: 80, fill: 0xFFFFFF }); subtitle.anchor.set(0.5, 0); subtitle.x = 2048 / 2; subtitle.y = 450; game.addChild(subtitle); screenElements.push(subtitle); // Generate random 3-digit code for this login session (excluding 0 and 9) var generateCodeWithoutZeroOrNine = function generateCodeWithoutZeroOrNine() { var allowedDigits = [1, 2, 3, 4, 5, 6, 7, 8]; var code = ''; for (var i = 0; i < 3; i++) { code += allowedDigits[Math.floor(Math.random() * allowedDigits.length)]; } return parseInt(code); }; var randomCode = generateCodeWithoutZeroOrNine(); var currentInput = ""; var loginPrompt = new Text2("Enter your username and code: " + randomCode, { size: 50, fill: 0xFFFFFF }); loginPrompt.anchor.set(0.5, 0); loginPrompt.x = 2048 / 2; loginPrompt.y = 800; game.addChild(loginPrompt); screenElements.push(loginPrompt); // Username display var usernameDisplay = new Text2(username || "Tap to enter username", { size: 60, fill: username ? 0xFFFFFF : 0x999999 }); usernameDisplay.anchor.set(0.5, 0.5); usernameDisplay.x = 2048 / 2; usernameDisplay.y = 1000; game.addChild(usernameDisplay); screenElements.push(usernameDisplay); // Simple username input (cycling through preset names for simplicity) var presetNames = ['Player', 'Trainer', 'Collector', 'Master', 'Champion', 'Explorer', 'Hunter', 'Keeper']; var nameIndex = presetNames.indexOf(username); if (nameIndex === -1) nameIndex = 0; var changeNameButton = new Button("CHANGE NAME", 400, 100); changeNameButton.x = 2048 / 2; changeNameButton.y = 1100; game.addChild(changeNameButton); screenElements.push(changeNameButton); changeNameButton.down = function () { tween(changeNameButton.scale, { x: 0.95, y: 0.95 }, { duration: 100 }); }; changeNameButton.up = function () { tween(changeNameButton.scale, { x: 1, y: 1 }, { duration: 100, onFinish: function onFinish() { nameIndex = (nameIndex + 1) % presetNames.length; username = presetNames[nameIndex]; // Recreate the text display with new color instead of modifying style var oldY = usernameDisplay.y; var oldX = usernameDisplay.x; var index = screenElements.indexOf(usernameDisplay); usernameDisplay.destroy(); usernameDisplay = new Text2(username, { size: 60, fill: 0xFFFFFF }); usernameDisplay.anchor.set(0.5, 0.5); usernameDisplay.x = oldX; usernameDisplay.y = oldY; game.addChild(usernameDisplay); if (index > -1) { screenElements[index] = usernameDisplay; } } }); }; // Code input display var codeDisplay = new Text2("Code: " + currentInput + "_", { size: 60, fill: 0xFFFFFF }); codeDisplay.anchor.set(0.5, 0.5); codeDisplay.x = 2048 / 2; codeDisplay.y = 1250; game.addChild(codeDisplay); screenElements.push(codeDisplay); // Number pad for code input (excluding 0 and 9) var numPadStartX = 2048 / 2 - 200; var numPadStartY = 1400; var allowedNumbers = [1, 2, 3, 4, 5, 6, 7, 8]; for (var i = 0; i < allowedNumbers.length; i++) { var num = allowedNumbers[i]; var numButton = new Button(num.toString(), 120, 120); // Arrange in 3x3 grid (with bottom center empty where 0 would be) var row = Math.floor(i / 3); var col = i % 3; numButton.x = numPadStartX + col * 150; numButton.y = numPadStartY + row * 150; game.addChild(numButton); screenElements.push(numButton); numButton.num = num; numButton.down = function () { tween(this.scale, { x: 0.95, y: 0.95 }, { duration: 100 }); }; numButton.up = function () { var button = this; tween(this.scale, { x: 1, y: 1 }, { duration: 100, onFinish: function onFinish() { if (currentInput.length < 3) { currentInput += button.num.toString(); codeDisplay.setText("Code: " + currentInput + (currentInput.length < 3 ? "_" : "")); } } }); }; } // Clear button var clearButton = new Button("CLEAR", 180, 120); clearButton.x = numPadStartX + 250; clearButton.y = numPadStartY + 300; game.addChild(clearButton); screenElements.push(clearButton); clearButton.down = function () { tween(clearButton.scale, { x: 0.95, y: 0.95 }, { duration: 100 }); }; clearButton.up = function () { tween(clearButton.scale, { x: 1, y: 1 }, { duration: 100, onFinish: function onFinish() { currentInput = ""; codeDisplay.setText("Code: _"); } }); }; var loginButton = new Button("LOGIN", 400, 120); loginButton.x = 2048 / 2; loginButton.y = 1850; game.addChild(loginButton); screenElements.push(loginButton); loginButton.down = function () { tween(loginButton.scale, { x: 0.95, y: 0.95 }, { duration: 100 }); }; loginButton.up = function () { tween(loginButton.scale, { x: 1, y: 1 }, { duration: 100, onFinish: function onFinish() { if (username && username !== "Tap to enter username" && currentInput === randomCode.toString()) { isLoggedIn = true; storage.isLoggedIn = true; storage.username = username; showHomeScreen(); } else if (currentInput !== randomCode.toString()) { // Show error message var errorText = new Text2("Incorrect code! Try again.", { size: 40, fill: 0xFF0000 }); errorText.anchor.set(0.5, 0.5); errorText.x = 2048 / 2; errorText.y = 1950; game.addChild(errorText); screenElements.push(errorText); // Clear input after error currentInput = ""; codeDisplay.setText("Code: _"); // Remove error message after 2 seconds LK.setTimeout(function () { errorText.destroy(); var index = screenElements.indexOf(errorText); if (index > -1) { screenElements.splice(index, 1); } }, 2000); } } }); }; } // Show home screen with main menu function showHomeScreen() { clearScreen(); currentScreen = 'home'; var title = new Text2("ANIMALMON", { size: 120, fill: 0xFFFFFF }); title.anchor.set(0.5, 0); title.x = 2048 / 2; title.y = 300; game.addChild(title); screenElements.push(title); var subtitle = new Text2("Pocket Menagerie", { size: 80, fill: 0xFFFFFF }); subtitle.anchor.set(0.5, 0); subtitle.x = 2048 / 2; subtitle.y = 450; game.addChild(subtitle); screenElements.push(subtitle); var packButton = new Button("OPEN PACKS", 400, 120); packButton.x = 2048 / 2; packButton.y = 1200; game.addChild(packButton); screenElements.push(packButton); packButton.down = function () { tween(packButton.scale, { x: 0.95, y: 0.95 }, { duration: 100 }); }; packButton.up = function () { tween(packButton.scale, { x: 1, y: 1 }, { duration: 100, onFinish: function onFinish() { if (isLoggedIn) { showPacksScreen(); } else { showLoginPrompt(); } } }); }; var collectionButton = new Button("COLLECTION", 400, 120); collectionButton.x = 2048 / 2; collectionButton.y = 1400; game.addChild(collectionButton); screenElements.push(collectionButton); collectionButton.down = function () { tween(collectionButton.scale, { x: 0.95, y: 0.95 }, { duration: 100 }); }; collectionButton.up = function () { tween(collectionButton.scale, { x: 1, y: 1 }, { duration: 100, onFinish: function onFinish() { showCollectionScreen(); } }); }; // Add Event Button var eventButton = new Button("EVENTS", 400, 120); eventButton.x = 2048 / 2; eventButton.y = 1600; game.addChild(eventButton); screenElements.push(eventButton); eventButton.down = function () { tween(eventButton.scale, { x: 0.95, y: 0.95 }, { duration: 100 }); }; eventButton.up = function () { tween(eventButton.scale, { x: 1, y: 1 }, { duration: 100, onFinish: function onFinish() { if (isLoggedIn) { showEventScreen(); } else { showLoginPrompt(); } } }); }; updateStatsDisplay(); // Show username and logout button if logged in if (isLoggedIn) { var usernameText = new Text2("Welcome, " + username + "!", { size: 50, fill: 0xFFFFFF }); usernameText.anchor.set(0.5, 0); usernameText.x = 2048 / 2; usernameText.y = 600; game.addChild(usernameText); screenElements.push(usernameText); var logoutButton = new Button("LOGOUT", 200, 80); logoutButton.x = 2048 - 200; logoutButton.y = 300; game.addChild(logoutButton); screenElements.push(logoutButton); logoutButton.down = function () { tween(logoutButton.scale, { x: 0.95, y: 0.95 }, { duration: 100 }); }; logoutButton.up = function () { tween(logoutButton.scale, { x: 1, y: 1 }, { duration: 100, onFinish: function onFinish() { isLoggedIn = false; storage.isLoggedIn = false; showLoginScreen(); } }); }; } } // Show packs selection screen function showPacksScreen() { clearScreen(); currentScreen = 'packs'; var title = new Text2("SELECT A PACK", { size: 80, fill: 0xFFFFFF }); title.anchor.set(0.5, 0); title.x = 2048 / 2; title.y = 200; game.addChild(title); screenElements.push(title); // Common Pack var commonPack = new Pack('common'); commonPack.x = 2048 / 2 - 700; commonPack.y = 800; game.addChild(commonPack); packDisplays.push(commonPack); screenElements.push(commonPack); var commonText = new Text2("3 Cards\n1-2 Common\n1 Chance for Uncommon", { size: 30, fill: 0xFFFFFF }); commonText.anchor.set(0.5, 0); commonText.x = commonPack.x; commonText.y = commonPack.y + 250; game.addChild(commonText); screenElements.push(commonText); // Advanced Pack var advancedPack = new Pack('advanced'); advancedPack.x = 2048 / 2 - 350; advancedPack.y = 800; game.addChild(advancedPack); packDisplays.push(advancedPack); screenElements.push(advancedPack); var advancedText = new Text2("4 Cards\n2-3 Common\n1-2 Uncommon\nSmall Chance for Rare", { size: 30, fill: 0xFFFFFF }); advancedText.anchor.set(0.5, 0); advancedText.x = advancedPack.x; advancedText.y = advancedPack.y + 250; game.addChild(advancedText); screenElements.push(advancedText); // Rare Pack var rarePack = new Pack('rare'); rarePack.x = 2048 / 2; rarePack.y = 800; game.addChild(rarePack); packDisplays.push(rarePack); screenElements.push(rarePack); var rareText = new Text2("4 Cards\n1-2 Uncommon\n1-2 Rare\nChance for Unique", { size: 30, fill: 0xFFFFFF }); rareText.anchor.set(0.5, 0); rareText.x = rarePack.x; rareText.y = rarePack.y + 250; game.addChild(rareText); screenElements.push(rareText); // Magic Pack var magicPack = new Pack('magic'); magicPack.x = 2048 / 2 + 350; magicPack.y = 800; game.addChild(magicPack); packDisplays.push(magicPack); screenElements.push(magicPack); var magicText = new Text2("5 Cards\n1-2 Rare\n1-2 Unique\nChance for Epic", { size: 30, fill: 0xFFFFFF }); magicText.anchor.set(0.5, 0); magicText.x = magicPack.x; magicText.y = magicPack.y + 250; game.addChild(magicText); screenElements.push(magicText); // Legendary Pack var legendaryPack = new Pack('legendary'); legendaryPack.x = 2048 / 2 + 700; legendaryPack.y = 800; game.addChild(legendaryPack); packDisplays.push(legendaryPack); screenElements.push(legendaryPack); var legendaryText = new Text2("5 Cards\n1-2 Unique\n1-2 Epic\nChance for Legendary\nRare Chance for Exotic", { size: 30, fill: 0xFFFFFF }); legendaryText.anchor.set(0.5, 0); legendaryText.x = legendaryPack.x; legendaryText.y = legendaryPack.y + 250; game.addChild(legendaryText); screenElements.push(legendaryText); // Random Pack var randomPack = new Pack('random'); randomPack.x = 2048 / 2 - 350; randomPack.y = 1400; game.addChild(randomPack); packDisplays.push(randomPack); screenElements.push(randomPack); var randomText = new Text2("1 Card\nCompletely Random", { size: 30, fill: 0xFFFFFF }); randomText.anchor.set(0.5, 0); randomText.x = randomPack.x; randomText.y = randomPack.y + 250; game.addChild(randomText); screenElements.push(randomText); // Event Pack var eventPack = new Pack('event'); eventPack.x = 2048 / 2 + 700; eventPack.y = 1400; game.addChild(eventPack); packDisplays.push(eventPack); screenElements.push(eventPack); var eventText = new Text2("3 Cards\n14.67% Event Card\nMostly Uncommon/Rare", { size: 30, fill: 0xFFFFFF }); eventText.anchor.set(0.5, 0); eventText.x = eventPack.x; eventText.y = eventPack.y + 250; game.addChild(eventText); screenElements.push(eventText); // Avians Pack var aviansPack = new Pack('avians'); aviansPack.x = 2048 / 2; aviansPack.y = 2000; game.addChild(aviansPack); packDisplays.push(aviansPack); screenElements.push(aviansPack); var aviansText = new Text2("5 Cards\nOnly Avian cards\nExclusive Avians\n(Rare, Unique, Exotic)", { size: 30, fill: 0xFFFFFF }); aviansText.anchor.set(0.5, 0); aviansText.x = aviansPack.x; aviansText.y = aviansPack.y + 250; game.addChild(aviansText); screenElements.push(aviansText); // Back button var backButton = new Button("BACK", 200, 80); backButton.x = 200; backButton.y = 300; //{gd} // moved down from 200 to 300 game.addChild(backButton); screenElements.push(backButton); backButton.down = function () { tween(backButton.scale, { x: 0.95, y: 0.95 }, { duration: 100 }); }; backButton.up = function () { tween(backButton.scale, { x: 1, y: 1 }, { duration: 100, onFinish: function onFinish() { showHomeScreen(); } }); }; // Jurassic Pack var jurassicPack = new Pack('jurassic'); jurassicPack.x = 2048 / 2 - 700; jurassicPack.y = 1400; game.addChild(jurassicPack); packDisplays.push(jurassicPack); screenElements.push(jurassicPack); var jurassicText = new Text2("4 Cards\nMost are Reptiles\nChance for Dinosaurs\n(Unique, Epic, Legendary, Exotic)", { size: 30, fill: 0xFFFFFF }); jurassicText.anchor.set(0.5, 0); jurassicText.x = jurassicPack.x; jurassicText.y = jurassicPack.y + 250; game.addChild(jurassicText); screenElements.push(jurassicText); // Ancient Pack var ancientPack = new Pack('ancient'); ancientPack.x = 2048 / 2 + 350; ancientPack.y = 1400; game.addChild(ancientPack); packDisplays.push(ancientPack); screenElements.push(ancientPack); var ancientText = new Text2("4 Cards\nMost are Mammals\nGuaranteed Extinct Animal\n(Unique, Epic, Legendary, Exotic)", { size: 30, fill: 0xFFFFFF }); ancientText.anchor.set(0.5, 0); ancientText.x = ancientPack.x; ancientText.y = ancientPack.y + 250; game.addChild(ancientText); screenElements.push(ancientText); } // Show return button after opening pack function showReturnButton() { var returnButton = new Button("RETURN", 300, 100); returnButton.x = 2048 / 2; returnButton.y = 2732 - 200; game.addChild(returnButton); screenElements.push(returnButton); returnButton.down = function () { tween(returnButton.scale, { x: 0.95, y: 0.95 }, { duration: 100 }); }; returnButton.up = function () { tween(returnButton.scale, { x: 1, y: 1 }, { duration: 100, onFinish: function onFinish() { // Clear displayed cards for (var i = 0; i < displayedCards.length; i++) { displayedCards[i].destroy(); } displayedCards = []; // Return to packs screen currentlyOpeningPack = false; showPacksScreen(); updateStatsDisplay(); } }); }; } // Show collection screen function showCollectionScreen() { clearScreen(); currentScreen = 'collection'; var currentCardIndex = 0; var title = new Text2("YOUR COLLECTION", { size: 80, fill: 0xFFFFFF }); title.anchor.set(0.5, 0); title.x = 2048 / 2; title.y = 200; game.addChild(title); screenElements.push(title); // Get all collected cards var allKeys = Object.keys(storage.collection); var cardIds = []; for (var i = 0; i < allKeys.length; i++) { var key = allKeys[i]; if (key.endsWith("_rarity")) { cardIds.push(key.substring(0, key.length - 7)); } } // Sort cards by rarity var rarityOrder = { 'common': 1, 'uncommon': 2, 'rare': 3, 'unique': 4, 'epic': 5, 'legendary': 6, 'exotic': 7, 'event': 8 }; cardIds.sort(function (a, b) { var rarityA = storage.collection[a + "_rarity"]; var rarityB = storage.collection[b + "_rarity"]; return rarityOrder[rarityA] - rarityOrder[rarityB]; }); // Display current card if collection has cards var currentCard = null; var cardInfoText = null; var navigationText = null; function displayCard(index) { // Remove previous card if exists if (currentCard) { currentCard.destroy(); } if (cardInfoText) { cardInfoText.destroy(); } if (navigationText) { navigationText.destroy(); } if (cardIds.length === 0) { var noCardsText = new Text2("No cards in collection yet!", { size: 60, fill: 0xFFFFFF }); noCardsText.anchor.set(0.5, 0.5); noCardsText.x = 2048 / 2; noCardsText.y = 2732 / 2; game.addChild(noCardsText); screenElements.push(noCardsText); return; } // Ensure index is within bounds currentCardIndex = Math.max(0, Math.min(index, cardIds.length - 1)); var cardId = cardIds[currentCardIndex]; currentCard = new Card(storage.collection[cardId + "_rarity"], cardId, storage.collection[cardId + "_name"], storage.collection[cardId + "_type"]); currentCard.x = 2048 / 2; currentCard.y = 2732 / 2 - 200; currentCard.scale.set(0.8); currentCard.reveal(); game.addChild(currentCard); screenElements.push(currentCard); // Display card info cardInfoText = new Text2("Card " + (currentCardIndex + 1) + " of " + cardIds.length + "\n" + "Owned: x" + storage.collection[cardId + "_count"], { size: 50, fill: 0xFFFFFF }); cardInfoText.anchor.set(0.5, 0); cardInfoText.x = 2048 / 2; cardInfoText.y = 2732 / 2 + 300; game.addChild(cardInfoText); screenElements.push(cardInfoText); // Navigation hint navigationText = new Text2("Use buttons to browse collection", { size: 40, fill: 0xFFFFFF }); navigationText.anchor.set(0.5, 0); navigationText.x = 2048 / 2; navigationText.y = 2732 / 2 + 450; game.addChild(navigationText); screenElements.push(navigationText); } // Navigation buttons var prevButton = new Button("< PREVIOUS", 300, 100); prevButton.x = 2048 / 2 - 400; prevButton.y = 2732 / 2; game.addChild(prevButton); screenElements.push(prevButton); prevButton.down = function () { tween(prevButton.scale, { x: 0.95, y: 0.95 }, { duration: 100 }); }; prevButton.up = function () { tween(prevButton.scale, { x: 1, y: 1 }, { duration: 100, onFinish: function onFinish() { if (currentCardIndex > 0) { displayCard(currentCardIndex - 1); } } }); }; var nextButton = new Button("NEXT >", 300, 100); nextButton.x = 2048 / 2 + 400; nextButton.y = 2732 / 2; game.addChild(nextButton); screenElements.push(nextButton); nextButton.down = function () { tween(nextButton.scale, { x: 0.95, y: 0.95 }, { duration: 100 }); }; nextButton.up = function () { tween(nextButton.scale, { x: 1, y: 1 }, { duration: 100, onFinish: function onFinish() { if (currentCardIndex < cardIds.length - 1) { displayCard(currentCardIndex + 1); } } }); }; // Display first card displayCard(0); // Back button var backButton = new Button("BACK", 200, 80); backButton.x = 200; backButton.y = 300; //{in} // moved down from 200 to 300 game.addChild(backButton); screenElements.push(backButton); backButton.down = function () { tween(backButton.scale, { x: 0.95, y: 0.95 }, { duration: 100 }); }; backButton.up = function () { tween(backButton.scale, { x: 1, y: 1 }, { duration: 100, onFinish: function onFinish() { showHomeScreen(); } }); }; // Reset collection button var resetButton = new Button("RESET COLLECTION", 400, 80); resetButton.x = 2048 / 2; resetButton.y = 2732 - 200; game.addChild(resetButton); screenElements.push(resetButton); resetButton.down = function () { tween(resetButton.scale, { x: 0.95, y: 0.95 }, { duration: 100 }); }; resetButton.up = function () { tween(resetButton.scale, { x: 1, y: 1 }, { duration: 100, onFinish: function onFinish() { // Reset collection data storage.collection = {}; storage.stats = { totalCards: 0, common: 0, uncommon: 0, rare: 0, unique: 0, epic: 0, legendary: 0, exotic: 0, event: 0, eventPoints: 0 }; // Update display and return to home screen updateStatsDisplay(); showHomeScreen(); } }); }; } // Generate cards based on pack type function generateCardsFromPack(packType) { var cards = []; var rarityPool = []; switch (packType) { case 'common': // 3 cards: 1-2 Common, chance for Uncommon for (var i = 0; i < 3; i++) { if (i < 2) { rarityPool.push('common'); } else { rarityPool.push(Math.random() < 0.3 ? 'uncommon' : 'common'); } } break; case 'event': // 3 cards: 14.67333% chance for event card, rest mostly uncommon/rare for (var i = 0; i < 3; i++) { var roll = Math.random(); if (roll < 0.1467333) { rarityPool.push('event'); } else if (roll < 0.6233667) { // 0.6233667 = 0.1467333 + 0.4766334 (uncommon 47.66334%) rarityPool.push('uncommon'); } else { rarityPool.push('rare'); } } break; case 'advanced': // 4 cards: 2-3 Common, 1-2 Uncommon, small chance for Rare for (var i = 0; i < 4; i++) { if (i < 2) { rarityPool.push('common'); } else if (i == 2) { rarityPool.push(Math.random() < 0.7 ? 'uncommon' : 'common'); } else { var roll = Math.random(); if (roll < 0.1) { rarityPool.push('rare'); } else if (roll < 0.6) { rarityPool.push('uncommon'); } else { rarityPool.push('common'); } } } break; case 'rare': // 4 cards: 1-2 Uncommon, 1-2 Rare, chance for Unique for (var i = 0; i < 4; i++) { if (i < 1) { rarityPool.push('uncommon'); } else if (i < 3) { rarityPool.push(Math.random() < 0.6 ? 'rare' : 'uncommon'); } else { var roll = Math.random(); if (roll < 0.15) { rarityPool.push('unique'); } else if (roll < 0.6) { rarityPool.push('rare'); } else { rarityPool.push('uncommon'); } } } break; case 'magic': // 5 cards: 1-2 Rare, 1-2 Unique, chance for Epic for (var i = 0; i < 5; i++) { if (i < 1) { rarityPool.push('rare'); } else if (i < 3) { rarityPool.push(Math.random() < 0.6 ? 'unique' : 'rare'); } else if (i < 4) { rarityPool.push(Math.random() < 0.7 ? 'unique' : 'rare'); } else { var roll = Math.random(); if (roll < 0.2) { rarityPool.push('epic'); } else if (roll < 0.6) { rarityPool.push('unique'); } else { rarityPool.push('rare'); } } } break; case 'legendary': // 5 cards: 1-2 Unique, 1-2 Epic, chance for Legendary, rare chance for Exotic for (var i = 0; i < 5; i++) { if (i < 1) { rarityPool.push('unique'); } else if (i < 3) { rarityPool.push(Math.random() < 0.6 ? 'epic' : 'unique'); } else if (i < 4) { var roll = Math.random(); if (roll < 0.2) { rarityPool.push('legendary'); } else if (roll < 0.6) { rarityPool.push('epic'); } else { rarityPool.push('unique'); } } else { var roll = Math.random(); if (roll < 0.02) { rarityPool.push('exotic'); } else if (roll < 0.15) { rarityPool.push('legendary'); } else if (roll < 0.5) { rarityPool.push('epic'); } else { rarityPool.push('unique'); } } } case 'random': // 1 card: Completely random rarityPool.push(CARD_DATABASE[Math.floor(Math.random() * CARD_DATABASE.length)].rarity); break; case 'ancient': // 4 cards: Guarantees at least 1 Extinct Animal card, rest are mostly mammals var hasExtinct = false; for (var i = 0; i < 4; i++) { // For the last card, if we haven't added an extinct animal yet, guarantee one if (i === 3 && !hasExtinct) { // Choose an extinct animal rarity var extinctRoll = Math.random(); if (extinctRoll < 0.05) { rarityPool.push('exotic'); } else if (extinctRoll < 0.15) { rarityPool.push('legendary'); } else if (extinctRoll < 0.35) { rarityPool.push('epic'); } else { rarityPool.push('unique'); } hasExtinct = true; continue; } var roll = Math.random(); if (roll < 0.05) { rarityPool.push('exotic'); hasExtinct = true; // Mark that we've added an extinct animal } else if (roll < 0.1) { rarityPool.push('legendary'); hasExtinct = true; // Mark that we've added an extinct animal } else if (roll < 0.2) { rarityPool.push('epic'); hasExtinct = true; // Mark that we've added an extinct animal } else if (roll < 0.35) { rarityPool.push('unique'); hasExtinct = true; // Mark that we've added an extinct animal } else if (roll < 0.7) { rarityPool.push('rare'); // Primarily mammals } else { rarityPool.push('uncommon'); } } break; case 'jurassic': // 4 cards: Guarantees at least 1 Dinosaur card, rest are mostly Reptiles var hasDinosaur = false; for (var i = 0; i < 4; i++) { // For the last card, if we haven't added a dinosaur yet, guarantee one if (i === 3 && !hasDinosaur) { // Choose a dinosaur rarity var dinoRoll = Math.random(); if (dinoRoll < 0.01) { rarityPool.push('exotic'); } else if (dinoRoll < 0.1) { rarityPool.push('legendary'); } else if (dinoRoll < 0.3) { rarityPool.push('epic'); } else { rarityPool.push('unique'); } hasDinosaur = true; continue; } var roll = Math.random(); if (roll < 0.01) { rarityPool.push('exotic'); hasDinosaur = true; // Mark that we've added a dinosaur } else if (roll < 0.05) { rarityPool.push('legendary'); hasDinosaur = true; // Mark that we've added a dinosaur } else if (roll < 0.15) { rarityPool.push('epic'); hasDinosaur = true; // Mark that we've added a dinosaur } else if (roll < 0.3) { rarityPool.push('unique'); hasDinosaur = true; // Mark that we've added a dinosaur } else { rarityPool.push('rare'); // Primarily reptiles, could be other rare types } } break; case 'avians': // 4 cards: Only Avian cards with exclusive Avians for (var i = 0; i < 4; i++) { var roll = Math.random(); if (roll < 0.05) { rarityPool.push('exotic'); // Phoenix } else if (roll < 0.15) { rarityPool.push('unique'); // Pelican, Hummingbird } else if (roll < 0.35) { rarityPool.push('rare'); // Vulture, Crow, and other rare avians } else if (roll < 0.6) { rarityPool.push('uncommon'); // Owl, Eagle, Penguin } else { rarityPool.push('common'); // Pidgeon } } break; } // Create cards based on rarity pool for (var i = 0; i < rarityPool.length; i++) { var rarity = rarityPool[i]; var possibleCards = CARD_DATABASE.filter(function (card) { if (packType === 'jurassic' && (rarity === 'unique' || rarity === 'epic' || rarity === 'legendary' || rarity === 'exotic')) { return card.rarity === rarity && card.type === 'Dinosaur'; } else if (packType === 'ancient' && (rarity === 'unique' || rarity === 'epic' || rarity === 'legendary' || rarity === 'exotic')) { return card.rarity === rarity && card.type === 'ExtinctAnimal'; } else if (packType === 'avians') { // For Avians pack, only return Avian type cards (including Duck even though it's type EVERYTHING) return card.rarity === rarity && (card.type === 'Avian' || card.name === 'Duck' || card.name === 'Dodo'); } return card.rarity === rarity; }); if (possibleCards.length > 0) { var selectedCard = possibleCards[Math.floor(Math.random() * possibleCards.length)]; cards.push(new Card(selectedCard.rarity, selectedCard.id, selectedCard.name, selectedCard.type)); } } return cards; } // Clear current screen elements function clearScreen() { for (var i = 0; i < screenElements.length; i++) { screenElements[i].destroy(); } screenElements = []; packDisplays = []; } // Show all cards in collection screen function showAllCardsScreen() { clearScreen(); currentScreen = 'allCards'; var title = new Text2("ALL COLLECTED CARDS", { size: 80, fill: 0xFFFFFF }); title.anchor.set(0.5, 0); title.x = 2048 / 2; title.y = 200; game.addChild(title); screenElements.push(title); // Get all cards from collection var allKeys = Object.keys(storage.collection); var cardIds = []; // Filter keys to get unique card IDs for (var i = 0; i < allKeys.length; i++) { var key = allKeys[i]; if (key.endsWith("_rarity")) { cardIds.push(key.substring(0, key.length - 7)); } } // Sort cards by rarity var rarityOrder = { 'common': 1, 'uncommon': 2, 'rare': 3, 'unique': 4, 'epic': 5, 'legendary': 6, 'exotic': 7, 'event': 8 }; cardIds.sort(function (a, b) { var rarityA = storage.collection[a + "_rarity"]; var rarityB = storage.collection[b + "_rarity"]; return rarityOrder[rarityA] - rarityOrder[rarityB]; }); // Display cards in a grid var cardsPerRow = 5; var startY = 400; var cardScale = 0.35; var cardSpacingX = 400 * cardScale; var cardSpacingY = 850 * cardScale; for (var i = 0; i < cardIds.length; i++) { var cardId = cardIds[i]; var row = Math.floor(i / cardsPerRow); var col = i % cardsPerRow; var card = new Card(storage.collection[cardId + "_rarity"], cardId, storage.collection[cardId + "_name"], storage.collection[cardId + "_type"]); card.x = 2048 / 2 + (col - (cardsPerRow - 1) / 2) * cardSpacingX; card.y = startY + row * cardSpacingY; card.scale.set(cardScale); card.reveal(); // Already revealed // Add count indicator var countText = new Text2("x" + storage.collection[cardId + "_count"], { size: 40, fill: 0xFFFFFF }); countText.anchor.set(1, 1); countText.x = 220; countText.y = 300; card.addChild(countText); game.addChild(card); screenElements.push(card); } // Back button var backButton = new Button("BACK", 200, 80); backButton.x = 200; backButton.y = 300; //{mw} // moved down from 200 to 300 game.addChild(backButton); screenElements.push(backButton); backButton.down = function () { tween(backButton.scale, { x: 0.95, y: 0.95 }, { duration: 100 }); }; backButton.up = function () { tween(backButton.scale, { x: 1, y: 1 }, { duration: 100, onFinish: function onFinish() { showCollectionScreen(); } }); }; } // Show event screen with mini-games and current progress function showEventScreen() { clearScreen(); currentScreen = 'event'; var title = new Text2("EVENTS", { size: 80, fill: 0xFFFFFF }); title.anchor.set(0.5, 0); title.x = 2048 / 2; title.y = 200; game.addChild(title); screenElements.push(title); // Initialize event points if not exists if (!storage.stats.eventPoints) { storage.stats.eventPoints = 0; } // Event progress display var eventProgress = new Text2("EVENT POINTS: " + storage.stats.eventPoints, { size: 50, fill: 0xFFFFFF }); eventProgress.anchor.set(0.5, 0); eventProgress.x = 2048 / 2; eventProgress.y = 300; game.addChild(eventProgress); screenElements.push(eventProgress); // Reward tiers explanation var rewardText = new Text2("Every 100 points: Random card up to Epic rarity\nEvery 1000 points: Random Event card", { size: 40, fill: 0xFFFFFF }); rewardText.anchor.set(0.5, 0); rewardText.x = 2048 / 2; rewardText.y = 400; game.addChild(rewardText); screenElements.push(rewardText); // Mini-games buttons var game1Button = new Button("GEM COLLECTOR", 400, 120); game1Button.x = 2048 / 2; game1Button.y = 700; game.addChild(game1Button); screenElements.push(game1Button); game1Button.down = function () { tween(game1Button.scale, { x: 0.95, y: 0.95 }, { duration: 100 }); }; game1Button.up = function () { tween(game1Button.scale, { x: 1, y: 1 }, { duration: 100, onFinish: function onFinish() { startMiniGame('GemCollector'); } }); }; // Back button var game2Button = new Button("QUIZ", 400, 120); game2Button.x = 2048 / 2; game2Button.y = 900; game.addChild(game2Button); screenElements.push(game2Button); game2Button.down = function () { tween(game2Button.scale, { x: 0.95, y: 0.95 }, { duration: 100 }); }; game2Button.up = function () { tween(game2Button.scale, { x: 1, y: 1 }, { duration: 100, onFinish: function onFinish() { startMiniGame('Quiz'); } }); }; var backButton = new Button("BACK", 200, 80); backButton.x = 200; backButton.y = 300; //{nL} // moved down from 200 to 300 game.addChild(backButton); screenElements.push(backButton); backButton.down = function () { tween(backButton.scale, { x: 0.95, y: 0.95 }, { duration: 100 }); }; backButton.up = function () { tween(backButton.scale, { x: 1, y: 1 }, { duration: 100, onFinish: function onFinish() { showHomeScreen(); } }); }; } // Function to start a mini-game function startMiniGame(gameType) { clearScreen(); currentScreen = 'minigame'; var miniGame = new MiniGame(gameType); miniGame.x = 2048 / 2; miniGame.y = 2732 / 2; game.addChild(miniGame); screenElements.push(miniGame); } // Update stats display function updateStatsDisplay() { var totalCards = storage.stats.totalCards || 0; statsText.setText("Collection: " + totalCards + " cards"); } // Update function called by the game engine game.update = function () { // Game logic updates (if needed) }; // Event handling game.move = function (x, y, obj) { // Mouse/touch move handling }; game.down = function (x, y, obj) { // Mouse/touch down handling }; game.up = function (x, y, obj) { // Mouse/touch up handling };
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1", {
collection: {},
stats: {
totalCards: 0,
common: 0,
uncommon: 0,
rare: 0,
unique: 0,
epic: 0,
legendary: 0,
exotic: 0,
event: 0
}
});
/****
* Classes
****/
var Button = Container.expand(function (text, width, height, color) {
var self = Container.call(this);
var background = self.attachAsset('cardButton', {
anchorX: 0.5,
anchorY: 0.5,
width: width || 300,
height: height || 100
});
var label = new Text2(text, {
size: 40,
fill: 0xFFFFFF
});
label.anchor.set(0.5, 0.5);
self.addChild(label);
// Initialize scale object explicitly to avoid 'in' operator TypeError
self.scale = {
x: 1,
y: 1
};
self.down = function () {
// Ensure scale exists before tweening to avoid TypeError
if (!this.scale) {
this.scale = {
x: 1,
y: 1
};
}
// Use self.scale instead of this.scale to ensure the correct scope
tween(self.scale, {
x: 0.95,
y: 0.95
}, {
duration: 100
});
};
self.up = function () {
// Ensure scale exists before tweening to avoid TypeError
if (!self.scale) {
self.scale = {
x: 1,
y: 1
};
}
tween(self.scale, {
x: 1,
y: 1
}, {
duration: 100
});
};
return self;
});
var Card = Container.expand(function (rarity, id, name, type) {
var self = Container.call(this);
self.rarity = rarity;
self.id = id;
self.name = name;
self.type = type;
self.revealed = false;
// Card back initially shown
var cardBack = self.attachAsset('cardBack', {
anchorX: 0.5,
anchorY: 0.5
});
// The actual card (initially hidden)
var cardFront;
switch (rarity) {
case 'common':
cardFront = self.attachAsset('commonCard', {
anchorX: 0.5,
anchorY: 0.5,
visible: false
});
break;
case 'uncommon':
cardFront = self.attachAsset('uncommonCard', {
anchorX: 0.5,
anchorY: 0.5,
visible: false
});
break;
case 'rare':
cardFront = self.attachAsset('rareCard', {
anchorX: 0.5,
anchorY: 0.5,
visible: false
});
break;
case 'unique':
cardFront = self.attachAsset('uniqueCard', {
anchorX: 0.5,
anchorY: 0.5,
visible: false
});
break;
case 'epic':
cardFront = self.attachAsset('epicCard', {
anchorX: 0.5,
anchorY: 0.5,
visible: false
});
break;
case 'legendary':
cardFront = self.attachAsset('legendaryCard', {
anchorX: 0.5,
anchorY: 0.5,
visible: false
});
break;
case 'exotic':
cardFront = self.attachAsset('exoticCard', {
anchorX: 0.5,
anchorY: 0.5,
visible: false
});
break;
case 'event':
cardFront = self.attachAsset('epicCard', {
anchorX: 0.5,
anchorY: 0.5,
visible: false,
tint: 0x00FFFF // Cyan color for event cards
});
break;
}
// Card icon
var icon;
if (rarity === 'event') {
// Event card icons by name
if (self.name === 'Walrus') {
icon = self.attachAsset('cardIconWalrus', {
anchorX: 0.5,
anchorY: 0.5,
y: -150,
visible: false
});
} else if (self.name === 'Bat') {
icon = self.attachAsset('cardIconBat', {
anchorX: 0.5,
anchorY: 0.5,
y: -150,
visible: false
});
} else if (self.name === 'Elephant') {
icon = self.attachAsset('cardIconElephant', {
anchorX: 0.5,
anchorY: 0.5,
y: -150,
visible: false
});
} else if (self.name === 'Moose') {
icon = self.attachAsset('cardIconMoose', {
anchorX: 0.5,
anchorY: 0.5,
y: -150,
visible: false
});
} else if (self.name === 'Wasp') {
icon = self.attachAsset('cardIconWasp', {
anchorX: 0.5,
anchorY: 0.5,
y: -150,
visible: false
});
} else if (self.name === 'Seal') {
icon = self.attachAsset('cardIconSeal', {
anchorX: 0.5,
anchorY: 0.5,
y: -150,
visible: false
});
} else {
icon = self.attachAsset('cardIconEVERYTHING', {
anchorX: 0.5,
anchorY: 0.5,
y: -150,
visible: false
});
}
} else switch (type) {
case 'ExtinctAnimal':
// Check for specific Extinct Animals
if (self.name === 'Dodo') {
icon = self.attachAsset('cardIconDodo', {
anchorX: 0.5,
anchorY: 0.5,
y: -150,
visible: false
});
} else if (self.name === 'Sabertooth Tiger') {
icon = self.attachAsset('cardIconSabertoothTiger', {
anchorX: 0.5,
anchorY: 0.5,
y: -150,
visible: false
});
} else if (self.name === 'Woolly Rhino') {
icon = self.attachAsset('cardIconWoollyRhino', {
anchorX: 0.5,
anchorY: 0.5,
y: -150,
visible: false
});
} else if (self.name === 'Megalodon') {
icon = self.attachAsset('cardIconMegalodon', {
anchorX: 0.5,
anchorY: 0.5,
y: -150,
visible: false
});
} else if (self.name === 'Woolly Mammoth') {
icon = self.attachAsset('cardIconWoollyMammoth', {
anchorX: 0.5,
anchorY: 0.5,
y: -150,
visible: false
});
} else {
icon = self.attachAsset('cardIconMammal', {
anchorX: 0.5,
anchorY: 0.5,
y: -150,
visible: false
});
}
break;
case 'Rodent':
icon = self.attachAsset('cardIconRat', {
anchorX: 0.5,
anchorY: 0.5,
y: -150,
visible: false
});
break;
case 'Avian':
// Check for specific Avians that have unique icons
if (self.name === 'Owl') {
icon = self.attachAsset('cardIconOwl', {
anchorX: 0.5,
anchorY: 0.5,
y: -150,
visible: false
});
} else if (self.name === 'Ostrich') {
icon = self.attachAsset('cardIconOstrich', {
anchorX: 0.5,
anchorY: 0.5,
y: -150,
visible: false
});
} else if (self.name === 'Duck') {
icon = self.attachAsset('cardIconDuck', {
anchorX: 0.5,
anchorY: 0.5,
y: -150,
visible: false
});
} else if (self.name === 'Penguin') {
icon = self.attachAsset('cardIconPenguin', {
anchorX: 0.5,
anchorY: 0.5,
y: -150,
visible: false
});
} else if (self.name === 'Eagle') {
icon = self.attachAsset('cardIconEagle', {
anchorX: 0.5,
anchorY: 0.5,
y: -150,
visible: false
});
} else if (self.name === 'Crow') {
icon = self.attachAsset('cardIconCrow', {
anchorX: 0.5,
anchorY: 0.5,
y: -150,
visible: false
});
} else if (self.name === 'Vulture') {
icon = self.attachAsset('cardIconVulture', {
anchorX: 0.5,
anchorY: 0.5,
y: -150,
visible: false
});
} else if (self.name === 'Pelican') {
icon = self.attachAsset('cardIconPelican', {
anchorX: 0.5,
anchorY: 0.5,
y: -150,
visible: false
});
} else if (self.name === 'Hummingbird') {
icon = self.attachAsset('cardIconHummingbird', {
anchorX: 0.5,
anchorY: 0.5,
y: -150,
visible: false
});
} else if (self.name === 'Phoenix') {
icon = self.attachAsset('cardIconPhoenix', {
anchorX: 0.5,
anchorY: 0.5,
y: -150,
visible: false
});
} else {
icon = self.attachAsset('cardIconPidgeon', {
anchorX: 0.5,
anchorY: 0.5,
y: -150,
visible: false
});
}
break;
case 'Amphibian':
// Check for specific Amphibians that have unique icons
if (self.name === 'Frog') {
icon = self.attachAsset('cardIconFrog', {
anchorX: 0.5,
anchorY: 0.5,
y: -150,
visible: false
});
} else {
icon = self.attachAsset('cardIconSalamander', {
anchorX: 0.5,
anchorY: 0.5,
y: -150,
visible: false
});
}
break;
case 'Insect':
// Check for specific Insects that have unique icons
if (self.name === 'Beetle') {
icon = self.attachAsset('cardIconBeetle', {
anchorX: 0.5,
anchorY: 0.5,
y: -150,
visible: false
});
} else {
icon = self.attachAsset('cardIconAnt', {
anchorX: 0.5,
anchorY: 0.5,
y: -150,
visible: false
});
}
break;
case 'Aquatic':
// Check for specific Aquatics that have unique icons
if (self.name === 'Shark') {
icon = self.attachAsset('cardIconShark', {
anchorX: 0.5,
anchorY: 0.5,
y: -150,
visible: false
});
} else if (self.name === 'Whale') {
icon = self.attachAsset('cardIconWhale', {
anchorX: 0.5,
anchorY: 0.5,
y: -150,
visible: false
});
} else {
icon = self.attachAsset('cardIconSalmon', {
anchorX: 0.5,
anchorY: 0.5,
y: -150,
visible: false
});
}
break;
case 'Mammal':
// Check for specific Mammals that have unique icons
if (self.name === 'Pig') {
icon = self.attachAsset('cardIconPig', {
anchorX: 0.5,
anchorY: 0.5,
y: -150,
visible: false
});
} else if (self.name === 'Fox') {
icon = self.attachAsset('cardIconFox', {
anchorX: 0.5,
anchorY: 0.5,
y: -150,
visible: false
});
} else if (self.name === 'Wolf') {
icon = self.attachAsset('cardIconWolf', {
anchorX: 0.5,
anchorY: 0.5,
y: -150,
visible: false
});
} else if (self.name === 'Bear') {
icon = self.attachAsset('cardIconBear', {
anchorX: 0.5,
anchorY: 0.5,
y: -150,
visible: false
});
} else if (self.name === 'Hippo') {
icon = self.attachAsset('cardIconHippo', {
anchorX: 0.5,
anchorY: 0.5,
y: -150,
visible: false
});
} else if (self.name === 'Rhino') {
icon = self.attachAsset('cardIconRhino', {
anchorX: 0.5,
anchorY: 0.5,
y: -150,
visible: false
});
} else {
icon = self.attachAsset('cardIconHare', {
anchorX: 0.5,
anchorY: 0.5,
y: -150,
visible: false
});
}
break;
case 'Reptile':
// Check for specific Reptiles that have unique icons
if (self.name === 'Crocodile') {
icon = self.attachAsset('cardIconCrocodile', {
anchorX: 0.5,
anchorY: 0.5,
y: -150,
visible: false
});
} else if (self.name === 'Snake') {
icon = self.attachAsset('cardIconSnake', {
anchorX: 0.5,
anchorY: 0.5,
y: -150,
visible: false
});
} else if (self.name === 'Cobra') {
icon = self.attachAsset('cardIconCobra', {
anchorX: 0.5,
anchorY: 0.5,
y: -150,
visible: false
});
} else {
icon = self.attachAsset('cardIconLizard', {
anchorX: 0.5,
anchorY: 0.5,
y: -150,
visible: false
});
}
break;
case 'Feline':
if (self.name === 'Cheetah') {
icon = self.attachAsset('cardIconCheetah', {
anchorX: 0.5,
anchorY: 0.5,
y: -150,
visible: false
});
} else {
icon = self.attachAsset('cardIconLion', {
anchorX: 0.5,
anchorY: 0.5,
y: -150,
visible: false
});
}
break;
case 'Primate':
icon = self.attachAsset('cardIconGorilla', {
anchorX: 0.5,
anchorY: 0.5,
y: -150,
visible: false
});
break;
case 'EVERYTHING':
icon = self.attachAsset('cardIconDuck', {
anchorX: 0.5,
anchorY: 0.5,
y: -150,
visible: false
});
break;
case 'Dinosaur':
if (self.name === 'Velociraptor') {
icon = self.attachAsset('cardIconVelociraptor', {
anchorX: 0.5,
anchorY: 0.5,
y: -150,
visible: false
});
} else if (self.name === 'Parasaur') {
icon = self.attachAsset('cardIconParasaur', {
anchorX: 0.5,
anchorY: 0.5,
y: -150,
visible: false
});
} else if (self.name === 'Pterodactyl') {
icon = self.attachAsset('cardIconPterodactyl', {
anchorX: 0.5,
anchorY: 0.5,
y: -150,
visible: false
});
} else if (self.name === 'Stegosaurus') {
icon = self.attachAsset('cardIconStegosaurus', {
anchorX: 0.5,
anchorY: 0.5,
y: -150,
visible: false
});
} else if (self.name === 'Ankylosaurus') {
icon = self.attachAsset('cardIconAnkylosaurus', {
anchorX: 0.5,
anchorY: 0.5,
y: -150,
visible: false
});
} else if (self.name === 'Spinosaurus') {
icon = self.attachAsset('cardIconSpinosaurus', {
anchorX: 0.5,
anchorY: 0.5,
y: -150,
visible: false
});
} else if (self.name === 'Diplodocus') {
icon = self.attachAsset('cardIconDiplodocus', {
anchorX: 0.5,
anchorY: 0.5,
y: -150,
visible: false
});
} else if (self.name === 'Triceratops') {
icon = self.attachAsset('cardIconTriceratops', {
anchorX: 0.5,
anchorY: 0.5,
y: -150,
visible: false
});
} else if (self.name === 'T-REX') {
icon = self.attachAsset('cardIconTRex', {
anchorX: 0.5,
anchorY: 0.5,
y: -150,
visible: false
});
}
break;
default:
// Default icon if type not found (optional)
icon = self.attachAsset('cardIconEVERYTHING', {
anchorX: 0.5,
anchorY: 0.5,
y: -150,
visible: false
});
break;
}
// Card text
var nameText = new Text2(name, {
size: 50,
fill: 0xFFFFFF
});
nameText.anchor.set(0.5, 0);
nameText.y = 50;
nameText.visible = false;
self.addChild(nameText);
var typeText = new Text2(type, {
size: 40,
fill: 0xFFFFFF
});
typeText.anchor.set(0.5, 0);
typeText.y = 120;
typeText.visible = false;
self.addChild(typeText);
var rarityText = new Text2(rarity.toUpperCase(), {
size: 35,
fill: 0xFFFFFF
});
rarityText.anchor.set(0.5, 1);
rarityText.y = 300;
rarityText.visible = false;
self.addChild(rarityText);
// Reveal the card
self.reveal = function () {
if (self.revealed) {
return;
}
self.revealed = true;
LK.getSound('cardFlip').play();
// Play special sounds for card rarities
if (rarity === 'unique') {
LK.getSound('uniqueDrop').play();
} else if (rarity === 'epic') {
LK.getSound('epicDrop').play();
} else if (rarity === 'legendary') {
LK.getSound('legendaryDrop').play();
} else if (rarity === 'exotic') {
LK.getSound('exoticDrop').play();
} else if (rarity === 'rare') {
LK.getSound('rareDrop').play();
} else if (rarity === 'event') {
LK.getSound('eventCard').play();
}
// Flip animation
tween(cardBack.scale, {
x: 0
}, {
duration: 200,
onFinish: function onFinish() {
cardBack.visible = false;
cardFront.visible = true;
icon.visible = true;
nameText.visible = true;
typeText.visible = true;
rarityText.visible = true;
tween(cardFront.scale, {
x: 1
}, {
duration: 200,
easing: tween.easeOut,
onFinish: function onFinish() {
// Add card to collection
if (!storage.collection[self.id]) {
// Initialize collection entry with primitive values separately
storage.collection[self.id + "_rarity"] = self.rarity;
storage.collection[self.id + "_name"] = self.name;
storage.collection[self.id + "_type"] = self.type;
storage.collection[self.id + "_count"] = 0;
}
storage.collection[self.id + "_count"] = (storage.collection[self.id + "_count"] || 0) + 1;
storage.stats.totalCards++;
if (!storage.stats[self.rarity]) {
storage.stats[self.rarity] = 0;
}
storage.stats[self.rarity]++;
}
});
cardFront.scale.x = 0;
}
});
};
self.down = function () {
self.reveal();
};
return self;
});
var MiniGame = Container.expand(function (gameType) {
var self = Container.call(this);
self.gameType = gameType;
self.score = 0;
self.isActive = true;
self.gameTimer = 30; // 30 seconds game duration (only for GemCollector)
self.lastUpdateTime = Date.now();
self.wrongAnswers = 0; // Track wrong answers for Quiz
// Background for the mini game
var background = self.attachAsset('cardButton', {
anchorX: 0.5,
anchorY: 0.5,
width: 1800,
height: 2000,
tint: 0x333333
});
// Game title
var displayTitle = gameType === 'GemCollector' ? "GEM COLLECTOR" : gameType === 'Quiz' ? "CARD QUIZ" : gameType.toUpperCase() + " MINI GAME";
var titleText = new Text2(displayTitle, {
size: 60,
fill: 0xFFFFFF
});
titleText.anchor.set(0.5, 0);
titleText.y = -900;
self.addChild(titleText);
// Score display
var scoreText = new Text2("SCORE: 0", {
size: 50,
fill: 0xFFFFFF
});
scoreText.anchor.set(0.5, 0);
scoreText.y = -800;
self.addChild(scoreText);
// Timer display (or wrong answer count for Quiz)
var timerText = new Text2(gameType === 'Quiz' ? "WRONG: 0/3" : "TIME: 30s", {
size: 50,
fill: 0xFFFFFF
});
timerText.anchor.set(0.5, 0);
timerText.y = -720;
self.addChild(timerText);
// Game elements based on type
var gameElements = [];
if (gameType === 'GemCollector') {
// Create gem targets (was mudSplat, now gems)
for (var i = 0; i < 5; i++) {
var target = self.attachAsset('mudSplat', {
anchorX: 0.5,
anchorY: 0.5,
x: Math.random() * 1200 - 600,
y: Math.random() * 1200 - 400,
scaleX: 2,
scaleY: 2
});
target.down = function () {
if (!self.isActive) return;
// Move to a new position
this.x = Math.random() * 1200 - 600;
this.y = Math.random() * 1200 - 400;
// Increase score by 25 points for each gem collected
self.score += 25;
scoreText.setText("SCORE: " + self.score);
// Visual feedback
// Ensure scale exists before tweening to avoid TypeError
if (!this.scale) {
this.scale = {
x: 2,
y: 2
};
}
tween(this.scale, {
x: 1.5,
y: 1.5
}, {
duration: 100,
onFinish: function onFinish() {
// Ensure scale exists before tweening back
if (!this.scale) {
this.scale = {
x: 2,
y: 2
};
}
tween(this.scale, {
x: 2,
y: 2
}, {
duration: 100
});
}
});
};
gameElements.push(target);
}
} else if (gameType === 'Quiz') {
// Helper function to get card description
var getCardDescription = function getCardDescription(card) {
var descriptions = {
// Common cards
'Rat': 'A small rodent often found in urban areas',
'Pidgeon': 'A common bird seen in cities worldwide',
'Frog': 'An amphibian that lives both in water and on land',
'Ant': 'A tiny insect that lives in colonies',
'Salmon': 'A fish that swims upstream to spawn',
'Hare': 'A fast-running mammal with long ears',
'Pig': 'A farm animal known for its intelligence',
'Snake': 'A legless reptile that slithers',
// Uncommon cards
'Fox': 'A cunning mammal with a bushy tail',
'Owl': 'A nocturnal bird with excellent vision',
'Salamander': 'An amphibian that can regenerate limbs',
'Lizard': 'A small reptile that can lose its tail',
'Beetle': 'An insect with a hard shell',
'Cobra': 'A venomous snake with a hood',
'Eagle': 'A large bird of prey with keen eyesight',
'Penguin': 'A flightless bird that swims',
// Rare cards
'Wolf': 'A pack-hunting canine predator',
'Ostrich': 'The largest living bird species',
'Shark': 'An apex predator of the ocean',
'Rhino': 'A large mammal with a horn on its nose',
'Cheetah': 'The fastest land animal',
// Unique cards
'Bear': 'A large omnivorous mammal that hibernates',
'Lion': 'The king of the jungle',
// Epic cards
'Gorilla': 'The largest living primate',
'Crocodile': 'An ancient reptilian predator',
// Legendary cards
'Hippo': 'A massive semi-aquatic mammal',
'Whale': 'The largest animal on Earth',
// Exotic card
'Duck': 'It can walk, swim, and fly',
// Dinosaurs
'Velociraptor': 'A small but fierce dinosaur hunter',
'Parasaur': 'A herbivorous dinosaur with a crest',
'Pterodactyl': 'A flying prehistoric reptile',
'Stegosaurus': 'A dinosaur with plates on its back',
'Ankylosaurus': 'An armored dinosaur with a club tail',
'Spinosaurus': 'A dinosaur with a sail on its back',
'Diplodocus': 'A long-necked herbivorous dinosaur',
'Triceratops': 'A three-horned dinosaur',
'T-REX': 'The tyrant king of dinosaurs',
// Extinct animals
'Dodo': 'A flightless bird that went extinct',
'Sabertooth Tiger': 'An extinct cat with long fangs',
'Woolly Rhino': 'An extinct hairy rhinoceros',
'Megalodon': 'A prehistoric giant shark',
'Woolly Mammoth': 'An extinct elephant with long hair',
// Avian cards for quiz
'Vulture': 'A large scavenging bird that feeds on carrion',
'Hummingbird': 'The smallest bird that can hover and fly backwards',
'Crow': 'A highly intelligent black bird known for using tools',
'Pelican': 'A large water bird with a distinctive throat pouch',
'Phoenix': 'A mythical bird that rises from its own ashes',
// Profession cards
'Archeologist': 'A person who studies ancient cultures by digging up artifacts',
'Builder': 'Someone who constructs things with their hands',
'Strategist': 'A person skilled in planning and tactics',
'Trader': 'Someone who buys and sells goods for profit',
'Windowsill': 'A horizontal surface at the bottom of a window'
};
return descriptions[card.name] || 'A mysterious creature';
}; // Generate quiz questions from card database
// Quiz game variables
self.currentQuestionIndex = 0;
self.questions = [];
self.currentChoices = [];
self.choiceButtons = [];
self.correctAnswerIndex = -1;
self.questionText = null;
// Show next question in quiz
self.showNextQuestion = function () {
// Generate new question if needed
if (self.currentQuestionIndex >= self.questions.length) {
self.generateNewQuestion();
}
var question = self.questions[self.currentQuestionIndex];
self.questionText.setText('Question ' + (self.currentQuestionIndex + 1) + '\n\n' + question.description);
// Generate choices (1 correct + 3 random)
self.currentChoices = [];
self.currentChoices.push(question.card);
// Add 3 random wrong answers
var wrongChoices = CARD_DATABASE.filter(function (card) {
return card.id !== question.card.id && card.rarity !== 'event';
});
for (var i = 0; i < 3; i++) {
if (wrongChoices.length > 0) {
var randomIndex = Math.floor(Math.random() * wrongChoices.length);
self.currentChoices.push(wrongChoices[randomIndex]);
wrongChoices.splice(randomIndex, 1);
}
}
// Shuffle choices
for (var i = self.currentChoices.length - 1; i > 0; i--) {
var j = Math.floor(Math.random() * (i + 1));
var temp = self.currentChoices[i];
self.currentChoices[i] = self.currentChoices[j];
self.currentChoices[j] = temp;
}
// Find correct answer index
for (var i = 0; i < self.currentChoices.length; i++) {
if (self.currentChoices[i].id === question.card.id) {
self.correctAnswerIndex = i;
break;
}
}
// Update button labels
for (var i = 0; i < self.choiceButtons.length; i++) {
if (i < self.currentChoices.length) {
self.choiceButtons[i].visible = true;
// Update button text
var buttonText = self.choiceButtons[i].children[1];
if (buttonText) {
buttonText.setText(self.currentChoices[i].name);
}
} else {
self.choiceButtons[i].visible = false;
}
}
};
var availableCards = CARD_DATABASE.filter(function (card) {
return card.rarity !== 'event'; // Exclude event cards from quiz
});
// Function to generate a new question
self.generateNewQuestion = function () {
var correctCard = availableCards[Math.floor(Math.random() * availableCards.length)];
var question = {
card: correctCard,
description: getCardDescription(correctCard)
};
self.questions.push(question);
};
// Generate first question
self.generateNewQuestion();
// Question text display
self.questionText = new Text2("", {
size: 45,
fill: 0xFFFFFF
});
self.questionText.anchor.set(0.5, 0);
self.questionText.y = -600;
self.addChild(self.questionText);
// Create answer choice buttons
for (var i = 0; i < 4; i++) {
var choiceButton = new Button("", 700, 120);
choiceButton.x = 0;
choiceButton.y = -300 + i * 150;
choiceButton.choiceIndex = i;
self.addChild(choiceButton);
self.choiceButtons.push(choiceButton);
choiceButton.down = function () {
if (!self.isActive) return;
tween(this.scale, {
x: 0.95,
y: 0.95
}, {
duration: 100
});
};
choiceButton.up = function () {
if (!self.isActive) return;
var buttonIndex = this.choiceIndex;
tween(this.scale, {
x: 1,
y: 1
}, {
duration: 100,
onFinish: function onFinish() {
self.checkAnswer(buttonIndex);
}
});
};
}
// Start first question
self.showNextQuestion();
}
// Check answer in quiz
self.checkAnswer = function (choiceIndex) {
if (!self.isActive) return;
if (choiceIndex === self.correctAnswerIndex) {
// Correct answer
self.score += 75;
scoreText.setText("SCORE: " + self.score);
// Visual feedback - flash green
LK.effects.flashObject(self.choiceButtons[choiceIndex], 0x00FF00, 500);
} else {
// Wrong answer - flash red
LK.effects.flashObject(self.choiceButtons[choiceIndex], 0xFF0000, 500);
self.wrongAnswers++;
timerText.setText("WRONG: " + self.wrongAnswers + "/3");
// Check if game should end
if (self.wrongAnswers >= 3) {
LK.setTimeout(function () {
self.endGame();
}, 1000);
return;
}
}
// Move to next question after delay
LK.setTimeout(function () {
self.currentQuestionIndex++;
self.showNextQuestion();
}, 1000);
};
// End game function
self.endGame = function () {
self.isActive = false;
// Show the final score
var finalScoreText = new Text2("FINAL SCORE: " + self.score, {
size: 70,
fill: 0xFFFFFF
});
finalScoreText.anchor.set(0.5, 0.5);
self.addChild(finalScoreText);
// Determine rewards
var eventPoints = self.score;
// Add points to event stats
if (!storage.stats.eventPoints) {
storage.stats.eventPoints = 0;
}
storage.stats.eventPoints += eventPoints;
// Check if player earned reward thresholds
var cardsEarned = [];
// Calculate how many 100-point rewards
var regularRewards = Math.floor(eventPoints / 100);
for (var i = 0; i < regularRewards; i++) {
// Random rarity up to epic
var rarities = ['common', 'uncommon', 'rare', 'unique', 'epic'];
var rarity = rarities[Math.floor(Math.random() * rarities.length)];
// Filter cards by rarity
var possibleCards = CARD_DATABASE.filter(function (card) {
return card.rarity === rarity;
});
// Select random card
if (possibleCards.length > 0) {
var card = possibleCards[Math.floor(Math.random() * possibleCards.length)];
var newCard = new Card(card.rarity, card.id, card.name, card.type);
newCard.reveal();
cardsEarned.push(newCard);
}
}
// Check for 1000-point event card reward
var eventRewards = Math.floor(eventPoints / 1000);
for (var i = 0; i < eventRewards; i++) {
// Find event cards
var eventCards = CARD_DATABASE.filter(function (card) {
return card.rarity === 'event';
});
// Select random event card
if (eventCards.length > 0) {
var card = eventCards[Math.floor(Math.random() * eventCards.length)];
var newCard = new Card(card.rarity, card.id, card.name, card.type);
newCard.reveal();
cardsEarned.push(newCard);
}
}
// Show earned cards or let the player know they didn't earn any
var rewardText = new Text2("REWARDS EARNED:", {
size: 50,
fill: 0xFFFFFF
});
rewardText.anchor.set(0.5, 0);
rewardText.y = 100;
self.addChild(rewardText);
if (cardsEarned.length > 0) {
// Display earned cards
for (var i = 0; i < cardsEarned.length; i++) {
var card = cardsEarned[i];
card.scale.set(0.4);
card.x = (i - (cardsEarned.length - 1) / 2) * 250;
card.y = 300;
self.addChild(card);
}
} else {
var noRewardText = new Text2("No rewards earned.\nGet more points next time!", {
size: 40,
fill: 0xFFFFFF
});
noRewardText.anchor.set(0.5, 0);
noRewardText.y = 150;
self.addChild(noRewardText);
}
// Add continue button
var continueButton = new Button("CONTINUE", 400, 100);
continueButton.y = 700;
self.addChild(continueButton);
continueButton.down = function () {
tween(continueButton.scale, {
x: 0.95,
y: 0.95
}, {
duration: 100
});
};
continueButton.up = function () {
tween(continueButton.scale, {
x: 1,
y: 1
}, {
duration: 100,
onFinish: function onFinish() {
// Return to event screen
showEventScreen();
self.destroy();
}
});
};
};
// Update function
self.update = function () {
if (!self.isActive) return;
// Only update timer for non-Quiz games
if (gameType !== 'Quiz') {
// Update timer
var currentTime = Date.now();
var deltaTime = (currentTime - self.lastUpdateTime) / 1000;
self.lastUpdateTime = currentTime;
self.gameTimer -= deltaTime;
if (self.gameTimer <= 0) {
self.gameTimer = 0;
self.endGame();
}
timerText.setText("TIME: " + Math.ceil(self.gameTimer) + "s");
}
// Game specific updates
if (gameType === 'GemCollector') {
// Update gem targets
for (var i = 0; i < gameElements.length; i++) {
var target = gameElements[i];
target.rotation += 0.01;
}
} else if (gameType === 'Quiz') {
// Quiz doesn't need per-frame updates
}
};
return self;
});
var Pack = Container.expand(function (type) {
var self = Container.call(this);
self.type = type;
self.opened = false;
// Pack artwork based on type
var packArt;
switch (type) {
case 'ancient':
packArt = self.attachAsset('packAncient', {
anchorX: 0.5,
anchorY: 0.5
});
break;
case 'common':
packArt = self.attachAsset('packCommon', {
anchorX: 0.5,
anchorY: 0.5
});
break;
case 'advanced':
packArt = self.attachAsset('packAdvanced', {
anchorX: 0.5,
anchorY: 0.5
});
break;
case 'rare':
packArt = self.attachAsset('packRare', {
anchorX: 0.5,
anchorY: 0.5
});
break;
case 'magic':
packArt = self.attachAsset('packMagic', {
anchorX: 0.5,
anchorY: 0.5
});
break;
case 'legendary':
packArt = self.attachAsset('packLegendary', {
anchorX: 0.5,
anchorY: 0.5
});
break;
case 'jurassic':
packArt = self.attachAsset('packJurassic', {
anchorX: 0.5,
anchorY: 0.5
});
break;
case 'random':
packArt = self.attachAsset('packRandom', {
anchorX: 0.5,
anchorY: 0.5
});
break;
case 'event':
packArt = self.attachAsset('packEvent', {
anchorX: 0.5,
anchorY: 0.5
});
break;
case 'avians':
packArt = self.attachAsset('packAvians', {
anchorX: 0.5,
anchorY: 0.5
});
break;
}
// Pack type text
var typeText = new Text2(type.toUpperCase() + " PACK", {
size: 40,
fill: 0xFFFFFF
});
typeText.anchor.set(0.5, 0.5);
self.addChild(typeText);
self.down = function () {
if (!currentlyOpeningPack && !self.opened) {
self.openPack();
}
};
self.openPack = function () {
if (self.opened || currentlyOpeningPack) {
return;
}
currentlyOpeningPack = true;
LK.getSound('packOpen').play();
// Hide all packs
for (var i = 0; i < packDisplays.length; i++) {
if (packDisplays[i] !== self) {
tween(packDisplays[i], {
alpha: 0
}, {
duration: 300
});
}
}
// Move to center and fade out
tween(self, {
y: 2732 / 2 - 200,
scale: 1.5
}, {
duration: 500,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(self, {
alpha: 0
}, {
duration: 300,
onFinish: function onFinish() {
self.visible = false;
// Generate cards based on pack type
var cards = generateCardsFromPack(self.type);
// Display cards
for (var i = 0; i < cards.length; i++) {
var card = cards[i];
card.x = 2048 / 2 + (i - (cards.length - 1) / 2) * 550;
card.y = 2732 / 2;
card.scale.set(0.7);
game.addChild(card);
displayedCards.push(card);
// Animate card entry
card.y = 2732 + 400;
tween(card, {
y: 2732 / 2
}, {
duration: 500,
easing: tween.easeOut
});
}
// Show return button
showReturnButton();
}
});
}
});
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x1a1a2e
});
/****
* Game Code
****/
// Game state variables
// Event card icon assets
var currentScreen = 'home'; // 'home', 'packs', 'collection'
var currentlyOpeningPack = false;
var packDisplays = [];
var displayedCards = [];
var screenElements = [];
var isLoggedIn = storage.isLoggedIn || false;
var username = storage.username || '';
// Game constants
var CARD_DATABASE = [
// Event cards - Only obtainable through events
{
id: 'ev_1',
rarity: 'event',
name: 'Walrus',
type: 'Mammal'
}, {
id: 'ev_2',
rarity: 'event',
name: 'Bat',
type: 'Mammal'
}, {
id: 'ev_3',
rarity: 'event',
name: 'Elephant',
type: 'Mammal'
}, {
id: 'ev_4',
rarity: 'event',
name: 'Moose',
type: 'Mammal'
}, {
id: 'ev_5',
rarity: 'event',
name: 'Wasp',
type: 'Insect'
}, {
id: 'ev_6',
rarity: 'event',
name: 'Seal',
type: 'Mammal'
},
// Extinct Animal cards - for Ancient Pack
{
id: 'e_1',
rarity: 'unique',
name: 'Dodo',
type: 'ExtinctAnimal'
}, {
id: 'e_2',
rarity: 'unique',
name: 'Sabertooth Tiger',
type: 'ExtinctAnimal'
}, {
id: 'e_3',
rarity: 'epic',
name: 'Woolly Rhino',
type: 'ExtinctAnimal'
}, {
id: 'e_4',
rarity: 'legendary',
name: 'Megalodon',
type: 'ExtinctAnimal'
}, {
id: 'e_5',
rarity: 'exotic',
name: 'Woolly Mammoth',
type: 'ExtinctAnimal'
},
// Common cards (id, name, type)
{
id: 'c1',
rarity: 'common',
name: 'Rat',
type: 'Rodent'
}, {
id: 'c2',
rarity: 'common',
name: 'Pidgeon',
type: 'Avian'
}, {
id: 'c3',
rarity: 'common',
name: 'Frog',
type: 'Amphibian'
}, {
id: 'c4',
rarity: 'common',
name: 'Ant',
type: 'Insect'
}, {
id: 'c5',
rarity: 'common',
name: 'Salmon',
type: 'Aquatic'
}, {
id: 'c6',
rarity: 'common',
name: 'Hare',
type: 'Mammal'
}, {
id: 'c8',
rarity: 'common',
name: 'Pig',
type: 'Mammal'
}, {
id: 'c9',
rarity: 'common',
name: 'Snake',
type: 'Reptile'
},
// Uncommon cards
{
id: 'u1',
rarity: 'uncommon',
name: 'Fox',
type: 'Mammal'
}, {
id: 'u2',
rarity: 'uncommon',
name: 'Owl',
type: 'Avian'
}, {
id: 'u3',
rarity: 'uncommon',
name: 'Salamander',
type: 'Amphibian'
}, {
id: 'u4',
rarity: 'uncommon',
name: 'Lizard',
type: 'Reptile'
}, {
id: 'u5',
rarity: 'uncommon',
name: 'Beetle',
type: 'Insect'
}, {
id: 'u6',
rarity: 'uncommon',
name: 'Cobra',
type: 'Reptile'
}, {
id: 'u7',
rarity: 'uncommon',
name: 'Eagle',
type: 'Avian'
}, {
id: 'u8',
rarity: 'uncommon',
name: 'Penguin',
type: 'Avian'
},
// Rare cards
{
id: 'r1',
rarity: 'rare',
name: 'Wolf',
type: 'Mammal'
}, {
id: 'r2',
rarity: 'rare',
name: 'Ostrich',
type: 'Avian'
}, {
id: 'r3',
rarity: 'rare',
name: 'Shark',
type: 'Aquatic'
}, {
id: 'r4',
rarity: 'rare',
name: 'Rhino',
type: 'Mammal'
}, {
id: 'r5',
rarity: 'rare',
name: 'Cheetah',
type: 'Feline'
},
// Unique cards
{
id: 'q1',
rarity: 'unique',
name: 'Bear',
type: 'Mammal'
}, {
id: 'q2',
rarity: 'unique',
name: 'Lion',
type: 'Feline'
},
// Epic cards
{
id: 'e1',
rarity: 'epic',
name: 'Gorilla',
type: 'Primate'
}, {
id: 'e2',
rarity: 'epic',
name: 'Crocodile',
type: 'Reptile'
},
// Legendary cards
{
id: 'l1',
rarity: 'legendary',
name: 'Hippo',
type: 'Mammal'
}, {
id: 'l2',
rarity: 'legendary',
name: 'Whale',
type: 'Aquatic'
},
// Exotic card
{
id: 'x1',
rarity: 'exotic',
name: 'Duck',
type: 'EVERYTHING'
},
// Avians pack exclusive cards
{
id: 'av1',
rarity: 'rare',
name: 'Vulture',
type: 'Avian'
}, {
id: 'av2',
rarity: 'rare',
name: 'Crow',
type: 'Avian'
}, {
id: 'av3',
rarity: 'unique',
name: 'Pelican',
type: 'Avian'
}, {
id: 'av4',
rarity: 'unique',
name: 'Hummingbird',
type: 'Avian'
}, {
id: 'av5',
rarity: 'exotic',
name: 'Phoenix',
type: 'Avian'
},
// Jurassic pack cards
{
id: 'j1',
rarity: 'unique',
name: 'Velociraptor',
type: 'Dinosaur'
}, {
id: 'j2',
rarity: 'unique',
name: 'Parasaur',
type: 'Dinosaur'
}, {
id: 'j3',
rarity: 'epic',
name: 'Pterodactyl',
type: 'Dinosaur'
}, {
id: 'j4',
rarity: 'epic',
name: 'Stegosaurus',
type: 'Dinosaur'
}, {
id: 'j5',
rarity: 'epic',
name: 'Ankylosaurus',
type: 'Dinosaur'
}, {
id: 'j6',
rarity: 'legendary',
name: 'Spinosaurus',
type: 'Dinosaur'
}, {
id: 'j7',
rarity: 'legendary',
name: 'Diplodocus',
type: 'Dinosaur'
}, {
id: 'j8',
rarity: 'legendary',
name: 'Triceratops',
type: 'Dinosaur'
}, {
id: 'j9',
rarity: 'exotic',
name: 'T-REX',
type: 'Dinosaur'
},
// Profession cards
{
id: 'p1',
rarity: 'rare',
name: 'Archeologist',
type: 'Primate'
}, {
id: 'p2',
rarity: 'uncommon',
name: 'Builder',
type: 'Primate'
}, {
id: 'p3',
rarity: 'unique',
name: 'Strategist',
type: 'Primate'
}, {
id: 'p4',
rarity: 'uncommon',
name: 'Trader',
type: 'Primate'
}, {
id: 'p5',
rarity: 'common',
name: 'Windowsill',
type: 'EVERYTHING'
}];
// Play background music
LK.playMusic('bgMusic');
// Initialize stats text
var statsText = new Text2("Collection: 0 cards", {
size: 50,
fill: 0xFFFFFF
});
statsText.anchor.set(0.5, 0);
statsText.y = 100;
LK.gui.top.addChild(statsText);
updateStatsDisplay();
// Show login prompt popup
function showLoginPrompt() {
var promptBg = new Container();
promptBg.x = 2048 / 2;
promptBg.y = 2732 / 2;
var bg = promptBg.attachAsset('cardButton', {
anchorX: 0.5,
anchorY: 0.5,
width: 800,
height: 400,
tint: 0x000000,
alpha: 0.9
});
var promptText = new Text2("Please login to access this feature", {
size: 50,
fill: 0xFFFFFF
});
promptText.anchor.set(0.5, 0.5);
promptText.y = -50;
promptBg.addChild(promptText);
var okButton = new Button("OK", 200, 80);
okButton.y = 100;
promptBg.addChild(okButton);
game.addChild(promptBg);
screenElements.push(promptBg);
okButton.down = function () {
tween(okButton.scale, {
x: 0.95,
y: 0.95
}, {
duration: 100
});
};
okButton.up = function () {
tween(okButton.scale, {
x: 1,
y: 1
}, {
duration: 100,
onFinish: function onFinish() {
promptBg.destroy();
var index = screenElements.indexOf(promptBg);
if (index > -1) {
screenElements.splice(index, 1);
}
}
});
};
}
// Setup the home screen
if (isLoggedIn) {
showHomeScreen();
} else {
showLoginScreen();
}
// Show login screen
function showLoginScreen() {
clearScreen();
currentScreen = 'login';
var title = new Text2("ANIMALMON", {
size: 120,
fill: 0xFFFFFF
});
title.anchor.set(0.5, 0);
title.x = 2048 / 2;
title.y = 300;
game.addChild(title);
screenElements.push(title);
var subtitle = new Text2("Pocket Menagerie", {
size: 80,
fill: 0xFFFFFF
});
subtitle.anchor.set(0.5, 0);
subtitle.x = 2048 / 2;
subtitle.y = 450;
game.addChild(subtitle);
screenElements.push(subtitle);
// Generate random 3-digit code for this login session (excluding 0 and 9)
var generateCodeWithoutZeroOrNine = function generateCodeWithoutZeroOrNine() {
var allowedDigits = [1, 2, 3, 4, 5, 6, 7, 8];
var code = '';
for (var i = 0; i < 3; i++) {
code += allowedDigits[Math.floor(Math.random() * allowedDigits.length)];
}
return parseInt(code);
};
var randomCode = generateCodeWithoutZeroOrNine();
var currentInput = "";
var loginPrompt = new Text2("Enter your username and code: " + randomCode, {
size: 50,
fill: 0xFFFFFF
});
loginPrompt.anchor.set(0.5, 0);
loginPrompt.x = 2048 / 2;
loginPrompt.y = 800;
game.addChild(loginPrompt);
screenElements.push(loginPrompt);
// Username display
var usernameDisplay = new Text2(username || "Tap to enter username", {
size: 60,
fill: username ? 0xFFFFFF : 0x999999
});
usernameDisplay.anchor.set(0.5, 0.5);
usernameDisplay.x = 2048 / 2;
usernameDisplay.y = 1000;
game.addChild(usernameDisplay);
screenElements.push(usernameDisplay);
// Simple username input (cycling through preset names for simplicity)
var presetNames = ['Player', 'Trainer', 'Collector', 'Master', 'Champion', 'Explorer', 'Hunter', 'Keeper'];
var nameIndex = presetNames.indexOf(username);
if (nameIndex === -1) nameIndex = 0;
var changeNameButton = new Button("CHANGE NAME", 400, 100);
changeNameButton.x = 2048 / 2;
changeNameButton.y = 1100;
game.addChild(changeNameButton);
screenElements.push(changeNameButton);
changeNameButton.down = function () {
tween(changeNameButton.scale, {
x: 0.95,
y: 0.95
}, {
duration: 100
});
};
changeNameButton.up = function () {
tween(changeNameButton.scale, {
x: 1,
y: 1
}, {
duration: 100,
onFinish: function onFinish() {
nameIndex = (nameIndex + 1) % presetNames.length;
username = presetNames[nameIndex];
// Recreate the text display with new color instead of modifying style
var oldY = usernameDisplay.y;
var oldX = usernameDisplay.x;
var index = screenElements.indexOf(usernameDisplay);
usernameDisplay.destroy();
usernameDisplay = new Text2(username, {
size: 60,
fill: 0xFFFFFF
});
usernameDisplay.anchor.set(0.5, 0.5);
usernameDisplay.x = oldX;
usernameDisplay.y = oldY;
game.addChild(usernameDisplay);
if (index > -1) {
screenElements[index] = usernameDisplay;
}
}
});
};
// Code input display
var codeDisplay = new Text2("Code: " + currentInput + "_", {
size: 60,
fill: 0xFFFFFF
});
codeDisplay.anchor.set(0.5, 0.5);
codeDisplay.x = 2048 / 2;
codeDisplay.y = 1250;
game.addChild(codeDisplay);
screenElements.push(codeDisplay);
// Number pad for code input (excluding 0 and 9)
var numPadStartX = 2048 / 2 - 200;
var numPadStartY = 1400;
var allowedNumbers = [1, 2, 3, 4, 5, 6, 7, 8];
for (var i = 0; i < allowedNumbers.length; i++) {
var num = allowedNumbers[i];
var numButton = new Button(num.toString(), 120, 120);
// Arrange in 3x3 grid (with bottom center empty where 0 would be)
var row = Math.floor(i / 3);
var col = i % 3;
numButton.x = numPadStartX + col * 150;
numButton.y = numPadStartY + row * 150;
game.addChild(numButton);
screenElements.push(numButton);
numButton.num = num;
numButton.down = function () {
tween(this.scale, {
x: 0.95,
y: 0.95
}, {
duration: 100
});
};
numButton.up = function () {
var button = this;
tween(this.scale, {
x: 1,
y: 1
}, {
duration: 100,
onFinish: function onFinish() {
if (currentInput.length < 3) {
currentInput += button.num.toString();
codeDisplay.setText("Code: " + currentInput + (currentInput.length < 3 ? "_" : ""));
}
}
});
};
}
// Clear button
var clearButton = new Button("CLEAR", 180, 120);
clearButton.x = numPadStartX + 250;
clearButton.y = numPadStartY + 300;
game.addChild(clearButton);
screenElements.push(clearButton);
clearButton.down = function () {
tween(clearButton.scale, {
x: 0.95,
y: 0.95
}, {
duration: 100
});
};
clearButton.up = function () {
tween(clearButton.scale, {
x: 1,
y: 1
}, {
duration: 100,
onFinish: function onFinish() {
currentInput = "";
codeDisplay.setText("Code: _");
}
});
};
var loginButton = new Button("LOGIN", 400, 120);
loginButton.x = 2048 / 2;
loginButton.y = 1850;
game.addChild(loginButton);
screenElements.push(loginButton);
loginButton.down = function () {
tween(loginButton.scale, {
x: 0.95,
y: 0.95
}, {
duration: 100
});
};
loginButton.up = function () {
tween(loginButton.scale, {
x: 1,
y: 1
}, {
duration: 100,
onFinish: function onFinish() {
if (username && username !== "Tap to enter username" && currentInput === randomCode.toString()) {
isLoggedIn = true;
storage.isLoggedIn = true;
storage.username = username;
showHomeScreen();
} else if (currentInput !== randomCode.toString()) {
// Show error message
var errorText = new Text2("Incorrect code! Try again.", {
size: 40,
fill: 0xFF0000
});
errorText.anchor.set(0.5, 0.5);
errorText.x = 2048 / 2;
errorText.y = 1950;
game.addChild(errorText);
screenElements.push(errorText);
// Clear input after error
currentInput = "";
codeDisplay.setText("Code: _");
// Remove error message after 2 seconds
LK.setTimeout(function () {
errorText.destroy();
var index = screenElements.indexOf(errorText);
if (index > -1) {
screenElements.splice(index, 1);
}
}, 2000);
}
}
});
};
}
// Show home screen with main menu
function showHomeScreen() {
clearScreen();
currentScreen = 'home';
var title = new Text2("ANIMALMON", {
size: 120,
fill: 0xFFFFFF
});
title.anchor.set(0.5, 0);
title.x = 2048 / 2;
title.y = 300;
game.addChild(title);
screenElements.push(title);
var subtitle = new Text2("Pocket Menagerie", {
size: 80,
fill: 0xFFFFFF
});
subtitle.anchor.set(0.5, 0);
subtitle.x = 2048 / 2;
subtitle.y = 450;
game.addChild(subtitle);
screenElements.push(subtitle);
var packButton = new Button("OPEN PACKS", 400, 120);
packButton.x = 2048 / 2;
packButton.y = 1200;
game.addChild(packButton);
screenElements.push(packButton);
packButton.down = function () {
tween(packButton.scale, {
x: 0.95,
y: 0.95
}, {
duration: 100
});
};
packButton.up = function () {
tween(packButton.scale, {
x: 1,
y: 1
}, {
duration: 100,
onFinish: function onFinish() {
if (isLoggedIn) {
showPacksScreen();
} else {
showLoginPrompt();
}
}
});
};
var collectionButton = new Button("COLLECTION", 400, 120);
collectionButton.x = 2048 / 2;
collectionButton.y = 1400;
game.addChild(collectionButton);
screenElements.push(collectionButton);
collectionButton.down = function () {
tween(collectionButton.scale, {
x: 0.95,
y: 0.95
}, {
duration: 100
});
};
collectionButton.up = function () {
tween(collectionButton.scale, {
x: 1,
y: 1
}, {
duration: 100,
onFinish: function onFinish() {
showCollectionScreen();
}
});
};
// Add Event Button
var eventButton = new Button("EVENTS", 400, 120);
eventButton.x = 2048 / 2;
eventButton.y = 1600;
game.addChild(eventButton);
screenElements.push(eventButton);
eventButton.down = function () {
tween(eventButton.scale, {
x: 0.95,
y: 0.95
}, {
duration: 100
});
};
eventButton.up = function () {
tween(eventButton.scale, {
x: 1,
y: 1
}, {
duration: 100,
onFinish: function onFinish() {
if (isLoggedIn) {
showEventScreen();
} else {
showLoginPrompt();
}
}
});
};
updateStatsDisplay();
// Show username and logout button if logged in
if (isLoggedIn) {
var usernameText = new Text2("Welcome, " + username + "!", {
size: 50,
fill: 0xFFFFFF
});
usernameText.anchor.set(0.5, 0);
usernameText.x = 2048 / 2;
usernameText.y = 600;
game.addChild(usernameText);
screenElements.push(usernameText);
var logoutButton = new Button("LOGOUT", 200, 80);
logoutButton.x = 2048 - 200;
logoutButton.y = 300;
game.addChild(logoutButton);
screenElements.push(logoutButton);
logoutButton.down = function () {
tween(logoutButton.scale, {
x: 0.95,
y: 0.95
}, {
duration: 100
});
};
logoutButton.up = function () {
tween(logoutButton.scale, {
x: 1,
y: 1
}, {
duration: 100,
onFinish: function onFinish() {
isLoggedIn = false;
storage.isLoggedIn = false;
showLoginScreen();
}
});
};
}
}
// Show packs selection screen
function showPacksScreen() {
clearScreen();
currentScreen = 'packs';
var title = new Text2("SELECT A PACK", {
size: 80,
fill: 0xFFFFFF
});
title.anchor.set(0.5, 0);
title.x = 2048 / 2;
title.y = 200;
game.addChild(title);
screenElements.push(title);
// Common Pack
var commonPack = new Pack('common');
commonPack.x = 2048 / 2 - 700;
commonPack.y = 800;
game.addChild(commonPack);
packDisplays.push(commonPack);
screenElements.push(commonPack);
var commonText = new Text2("3 Cards\n1-2 Common\n1 Chance for Uncommon", {
size: 30,
fill: 0xFFFFFF
});
commonText.anchor.set(0.5, 0);
commonText.x = commonPack.x;
commonText.y = commonPack.y + 250;
game.addChild(commonText);
screenElements.push(commonText);
// Advanced Pack
var advancedPack = new Pack('advanced');
advancedPack.x = 2048 / 2 - 350;
advancedPack.y = 800;
game.addChild(advancedPack);
packDisplays.push(advancedPack);
screenElements.push(advancedPack);
var advancedText = new Text2("4 Cards\n2-3 Common\n1-2 Uncommon\nSmall Chance for Rare", {
size: 30,
fill: 0xFFFFFF
});
advancedText.anchor.set(0.5, 0);
advancedText.x = advancedPack.x;
advancedText.y = advancedPack.y + 250;
game.addChild(advancedText);
screenElements.push(advancedText);
// Rare Pack
var rarePack = new Pack('rare');
rarePack.x = 2048 / 2;
rarePack.y = 800;
game.addChild(rarePack);
packDisplays.push(rarePack);
screenElements.push(rarePack);
var rareText = new Text2("4 Cards\n1-2 Uncommon\n1-2 Rare\nChance for Unique", {
size: 30,
fill: 0xFFFFFF
});
rareText.anchor.set(0.5, 0);
rareText.x = rarePack.x;
rareText.y = rarePack.y + 250;
game.addChild(rareText);
screenElements.push(rareText);
// Magic Pack
var magicPack = new Pack('magic');
magicPack.x = 2048 / 2 + 350;
magicPack.y = 800;
game.addChild(magicPack);
packDisplays.push(magicPack);
screenElements.push(magicPack);
var magicText = new Text2("5 Cards\n1-2 Rare\n1-2 Unique\nChance for Epic", {
size: 30,
fill: 0xFFFFFF
});
magicText.anchor.set(0.5, 0);
magicText.x = magicPack.x;
magicText.y = magicPack.y + 250;
game.addChild(magicText);
screenElements.push(magicText);
// Legendary Pack
var legendaryPack = new Pack('legendary');
legendaryPack.x = 2048 / 2 + 700;
legendaryPack.y = 800;
game.addChild(legendaryPack);
packDisplays.push(legendaryPack);
screenElements.push(legendaryPack);
var legendaryText = new Text2("5 Cards\n1-2 Unique\n1-2 Epic\nChance for Legendary\nRare Chance for Exotic", {
size: 30,
fill: 0xFFFFFF
});
legendaryText.anchor.set(0.5, 0);
legendaryText.x = legendaryPack.x;
legendaryText.y = legendaryPack.y + 250;
game.addChild(legendaryText);
screenElements.push(legendaryText);
// Random Pack
var randomPack = new Pack('random');
randomPack.x = 2048 / 2 - 350;
randomPack.y = 1400;
game.addChild(randomPack);
packDisplays.push(randomPack);
screenElements.push(randomPack);
var randomText = new Text2("1 Card\nCompletely Random", {
size: 30,
fill: 0xFFFFFF
});
randomText.anchor.set(0.5, 0);
randomText.x = randomPack.x;
randomText.y = randomPack.y + 250;
game.addChild(randomText);
screenElements.push(randomText);
// Event Pack
var eventPack = new Pack('event');
eventPack.x = 2048 / 2 + 700;
eventPack.y = 1400;
game.addChild(eventPack);
packDisplays.push(eventPack);
screenElements.push(eventPack);
var eventText = new Text2("3 Cards\n14.67% Event Card\nMostly Uncommon/Rare", {
size: 30,
fill: 0xFFFFFF
});
eventText.anchor.set(0.5, 0);
eventText.x = eventPack.x;
eventText.y = eventPack.y + 250;
game.addChild(eventText);
screenElements.push(eventText);
// Avians Pack
var aviansPack = new Pack('avians');
aviansPack.x = 2048 / 2;
aviansPack.y = 2000;
game.addChild(aviansPack);
packDisplays.push(aviansPack);
screenElements.push(aviansPack);
var aviansText = new Text2("5 Cards\nOnly Avian cards\nExclusive Avians\n(Rare, Unique, Exotic)", {
size: 30,
fill: 0xFFFFFF
});
aviansText.anchor.set(0.5, 0);
aviansText.x = aviansPack.x;
aviansText.y = aviansPack.y + 250;
game.addChild(aviansText);
screenElements.push(aviansText);
// Back button
var backButton = new Button("BACK", 200, 80);
backButton.x = 200;
backButton.y = 300; //{gd} // moved down from 200 to 300
game.addChild(backButton);
screenElements.push(backButton);
backButton.down = function () {
tween(backButton.scale, {
x: 0.95,
y: 0.95
}, {
duration: 100
});
};
backButton.up = function () {
tween(backButton.scale, {
x: 1,
y: 1
}, {
duration: 100,
onFinish: function onFinish() {
showHomeScreen();
}
});
};
// Jurassic Pack
var jurassicPack = new Pack('jurassic');
jurassicPack.x = 2048 / 2 - 700;
jurassicPack.y = 1400;
game.addChild(jurassicPack);
packDisplays.push(jurassicPack);
screenElements.push(jurassicPack);
var jurassicText = new Text2("4 Cards\nMost are Reptiles\nChance for Dinosaurs\n(Unique, Epic, Legendary, Exotic)", {
size: 30,
fill: 0xFFFFFF
});
jurassicText.anchor.set(0.5, 0);
jurassicText.x = jurassicPack.x;
jurassicText.y = jurassicPack.y + 250;
game.addChild(jurassicText);
screenElements.push(jurassicText);
// Ancient Pack
var ancientPack = new Pack('ancient');
ancientPack.x = 2048 / 2 + 350;
ancientPack.y = 1400;
game.addChild(ancientPack);
packDisplays.push(ancientPack);
screenElements.push(ancientPack);
var ancientText = new Text2("4 Cards\nMost are Mammals\nGuaranteed Extinct Animal\n(Unique, Epic, Legendary, Exotic)", {
size: 30,
fill: 0xFFFFFF
});
ancientText.anchor.set(0.5, 0);
ancientText.x = ancientPack.x;
ancientText.y = ancientPack.y + 250;
game.addChild(ancientText);
screenElements.push(ancientText);
}
// Show return button after opening pack
function showReturnButton() {
var returnButton = new Button("RETURN", 300, 100);
returnButton.x = 2048 / 2;
returnButton.y = 2732 - 200;
game.addChild(returnButton);
screenElements.push(returnButton);
returnButton.down = function () {
tween(returnButton.scale, {
x: 0.95,
y: 0.95
}, {
duration: 100
});
};
returnButton.up = function () {
tween(returnButton.scale, {
x: 1,
y: 1
}, {
duration: 100,
onFinish: function onFinish() {
// Clear displayed cards
for (var i = 0; i < displayedCards.length; i++) {
displayedCards[i].destroy();
}
displayedCards = [];
// Return to packs screen
currentlyOpeningPack = false;
showPacksScreen();
updateStatsDisplay();
}
});
};
}
// Show collection screen
function showCollectionScreen() {
clearScreen();
currentScreen = 'collection';
var currentCardIndex = 0;
var title = new Text2("YOUR COLLECTION", {
size: 80,
fill: 0xFFFFFF
});
title.anchor.set(0.5, 0);
title.x = 2048 / 2;
title.y = 200;
game.addChild(title);
screenElements.push(title);
// Get all collected cards
var allKeys = Object.keys(storage.collection);
var cardIds = [];
for (var i = 0; i < allKeys.length; i++) {
var key = allKeys[i];
if (key.endsWith("_rarity")) {
cardIds.push(key.substring(0, key.length - 7));
}
}
// Sort cards by rarity
var rarityOrder = {
'common': 1,
'uncommon': 2,
'rare': 3,
'unique': 4,
'epic': 5,
'legendary': 6,
'exotic': 7,
'event': 8
};
cardIds.sort(function (a, b) {
var rarityA = storage.collection[a + "_rarity"];
var rarityB = storage.collection[b + "_rarity"];
return rarityOrder[rarityA] - rarityOrder[rarityB];
});
// Display current card if collection has cards
var currentCard = null;
var cardInfoText = null;
var navigationText = null;
function displayCard(index) {
// Remove previous card if exists
if (currentCard) {
currentCard.destroy();
}
if (cardInfoText) {
cardInfoText.destroy();
}
if (navigationText) {
navigationText.destroy();
}
if (cardIds.length === 0) {
var noCardsText = new Text2("No cards in collection yet!", {
size: 60,
fill: 0xFFFFFF
});
noCardsText.anchor.set(0.5, 0.5);
noCardsText.x = 2048 / 2;
noCardsText.y = 2732 / 2;
game.addChild(noCardsText);
screenElements.push(noCardsText);
return;
}
// Ensure index is within bounds
currentCardIndex = Math.max(0, Math.min(index, cardIds.length - 1));
var cardId = cardIds[currentCardIndex];
currentCard = new Card(storage.collection[cardId + "_rarity"], cardId, storage.collection[cardId + "_name"], storage.collection[cardId + "_type"]);
currentCard.x = 2048 / 2;
currentCard.y = 2732 / 2 - 200;
currentCard.scale.set(0.8);
currentCard.reveal();
game.addChild(currentCard);
screenElements.push(currentCard);
// Display card info
cardInfoText = new Text2("Card " + (currentCardIndex + 1) + " of " + cardIds.length + "\n" + "Owned: x" + storage.collection[cardId + "_count"], {
size: 50,
fill: 0xFFFFFF
});
cardInfoText.anchor.set(0.5, 0);
cardInfoText.x = 2048 / 2;
cardInfoText.y = 2732 / 2 + 300;
game.addChild(cardInfoText);
screenElements.push(cardInfoText);
// Navigation hint
navigationText = new Text2("Use buttons to browse collection", {
size: 40,
fill: 0xFFFFFF
});
navigationText.anchor.set(0.5, 0);
navigationText.x = 2048 / 2;
navigationText.y = 2732 / 2 + 450;
game.addChild(navigationText);
screenElements.push(navigationText);
}
// Navigation buttons
var prevButton = new Button("< PREVIOUS", 300, 100);
prevButton.x = 2048 / 2 - 400;
prevButton.y = 2732 / 2;
game.addChild(prevButton);
screenElements.push(prevButton);
prevButton.down = function () {
tween(prevButton.scale, {
x: 0.95,
y: 0.95
}, {
duration: 100
});
};
prevButton.up = function () {
tween(prevButton.scale, {
x: 1,
y: 1
}, {
duration: 100,
onFinish: function onFinish() {
if (currentCardIndex > 0) {
displayCard(currentCardIndex - 1);
}
}
});
};
var nextButton = new Button("NEXT >", 300, 100);
nextButton.x = 2048 / 2 + 400;
nextButton.y = 2732 / 2;
game.addChild(nextButton);
screenElements.push(nextButton);
nextButton.down = function () {
tween(nextButton.scale, {
x: 0.95,
y: 0.95
}, {
duration: 100
});
};
nextButton.up = function () {
tween(nextButton.scale, {
x: 1,
y: 1
}, {
duration: 100,
onFinish: function onFinish() {
if (currentCardIndex < cardIds.length - 1) {
displayCard(currentCardIndex + 1);
}
}
});
};
// Display first card
displayCard(0);
// Back button
var backButton = new Button("BACK", 200, 80);
backButton.x = 200;
backButton.y = 300; //{in} // moved down from 200 to 300
game.addChild(backButton);
screenElements.push(backButton);
backButton.down = function () {
tween(backButton.scale, {
x: 0.95,
y: 0.95
}, {
duration: 100
});
};
backButton.up = function () {
tween(backButton.scale, {
x: 1,
y: 1
}, {
duration: 100,
onFinish: function onFinish() {
showHomeScreen();
}
});
};
// Reset collection button
var resetButton = new Button("RESET COLLECTION", 400, 80);
resetButton.x = 2048 / 2;
resetButton.y = 2732 - 200;
game.addChild(resetButton);
screenElements.push(resetButton);
resetButton.down = function () {
tween(resetButton.scale, {
x: 0.95,
y: 0.95
}, {
duration: 100
});
};
resetButton.up = function () {
tween(resetButton.scale, {
x: 1,
y: 1
}, {
duration: 100,
onFinish: function onFinish() {
// Reset collection data
storage.collection = {};
storage.stats = {
totalCards: 0,
common: 0,
uncommon: 0,
rare: 0,
unique: 0,
epic: 0,
legendary: 0,
exotic: 0,
event: 0,
eventPoints: 0
};
// Update display and return to home screen
updateStatsDisplay();
showHomeScreen();
}
});
};
}
// Generate cards based on pack type
function generateCardsFromPack(packType) {
var cards = [];
var rarityPool = [];
switch (packType) {
case 'common':
// 3 cards: 1-2 Common, chance for Uncommon
for (var i = 0; i < 3; i++) {
if (i < 2) {
rarityPool.push('common');
} else {
rarityPool.push(Math.random() < 0.3 ? 'uncommon' : 'common');
}
}
break;
case 'event':
// 3 cards: 14.67333% chance for event card, rest mostly uncommon/rare
for (var i = 0; i < 3; i++) {
var roll = Math.random();
if (roll < 0.1467333) {
rarityPool.push('event');
} else if (roll < 0.6233667) {
// 0.6233667 = 0.1467333 + 0.4766334 (uncommon 47.66334%)
rarityPool.push('uncommon');
} else {
rarityPool.push('rare');
}
}
break;
case 'advanced':
// 4 cards: 2-3 Common, 1-2 Uncommon, small chance for Rare
for (var i = 0; i < 4; i++) {
if (i < 2) {
rarityPool.push('common');
} else if (i == 2) {
rarityPool.push(Math.random() < 0.7 ? 'uncommon' : 'common');
} else {
var roll = Math.random();
if (roll < 0.1) {
rarityPool.push('rare');
} else if (roll < 0.6) {
rarityPool.push('uncommon');
} else {
rarityPool.push('common');
}
}
}
break;
case 'rare':
// 4 cards: 1-2 Uncommon, 1-2 Rare, chance for Unique
for (var i = 0; i < 4; i++) {
if (i < 1) {
rarityPool.push('uncommon');
} else if (i < 3) {
rarityPool.push(Math.random() < 0.6 ? 'rare' : 'uncommon');
} else {
var roll = Math.random();
if (roll < 0.15) {
rarityPool.push('unique');
} else if (roll < 0.6) {
rarityPool.push('rare');
} else {
rarityPool.push('uncommon');
}
}
}
break;
case 'magic':
// 5 cards: 1-2 Rare, 1-2 Unique, chance for Epic
for (var i = 0; i < 5; i++) {
if (i < 1) {
rarityPool.push('rare');
} else if (i < 3) {
rarityPool.push(Math.random() < 0.6 ? 'unique' : 'rare');
} else if (i < 4) {
rarityPool.push(Math.random() < 0.7 ? 'unique' : 'rare');
} else {
var roll = Math.random();
if (roll < 0.2) {
rarityPool.push('epic');
} else if (roll < 0.6) {
rarityPool.push('unique');
} else {
rarityPool.push('rare');
}
}
}
break;
case 'legendary':
// 5 cards: 1-2 Unique, 1-2 Epic, chance for Legendary, rare chance for Exotic
for (var i = 0; i < 5; i++) {
if (i < 1) {
rarityPool.push('unique');
} else if (i < 3) {
rarityPool.push(Math.random() < 0.6 ? 'epic' : 'unique');
} else if (i < 4) {
var roll = Math.random();
if (roll < 0.2) {
rarityPool.push('legendary');
} else if (roll < 0.6) {
rarityPool.push('epic');
} else {
rarityPool.push('unique');
}
} else {
var roll = Math.random();
if (roll < 0.02) {
rarityPool.push('exotic');
} else if (roll < 0.15) {
rarityPool.push('legendary');
} else if (roll < 0.5) {
rarityPool.push('epic');
} else {
rarityPool.push('unique');
}
}
}
case 'random':
// 1 card: Completely random
rarityPool.push(CARD_DATABASE[Math.floor(Math.random() * CARD_DATABASE.length)].rarity);
break;
case 'ancient':
// 4 cards: Guarantees at least 1 Extinct Animal card, rest are mostly mammals
var hasExtinct = false;
for (var i = 0; i < 4; i++) {
// For the last card, if we haven't added an extinct animal yet, guarantee one
if (i === 3 && !hasExtinct) {
// Choose an extinct animal rarity
var extinctRoll = Math.random();
if (extinctRoll < 0.05) {
rarityPool.push('exotic');
} else if (extinctRoll < 0.15) {
rarityPool.push('legendary');
} else if (extinctRoll < 0.35) {
rarityPool.push('epic');
} else {
rarityPool.push('unique');
}
hasExtinct = true;
continue;
}
var roll = Math.random();
if (roll < 0.05) {
rarityPool.push('exotic');
hasExtinct = true; // Mark that we've added an extinct animal
} else if (roll < 0.1) {
rarityPool.push('legendary');
hasExtinct = true; // Mark that we've added an extinct animal
} else if (roll < 0.2) {
rarityPool.push('epic');
hasExtinct = true; // Mark that we've added an extinct animal
} else if (roll < 0.35) {
rarityPool.push('unique');
hasExtinct = true; // Mark that we've added an extinct animal
} else if (roll < 0.7) {
rarityPool.push('rare'); // Primarily mammals
} else {
rarityPool.push('uncommon');
}
}
break;
case 'jurassic':
// 4 cards: Guarantees at least 1 Dinosaur card, rest are mostly Reptiles
var hasDinosaur = false;
for (var i = 0; i < 4; i++) {
// For the last card, if we haven't added a dinosaur yet, guarantee one
if (i === 3 && !hasDinosaur) {
// Choose a dinosaur rarity
var dinoRoll = Math.random();
if (dinoRoll < 0.01) {
rarityPool.push('exotic');
} else if (dinoRoll < 0.1) {
rarityPool.push('legendary');
} else if (dinoRoll < 0.3) {
rarityPool.push('epic');
} else {
rarityPool.push('unique');
}
hasDinosaur = true;
continue;
}
var roll = Math.random();
if (roll < 0.01) {
rarityPool.push('exotic');
hasDinosaur = true; // Mark that we've added a dinosaur
} else if (roll < 0.05) {
rarityPool.push('legendary');
hasDinosaur = true; // Mark that we've added a dinosaur
} else if (roll < 0.15) {
rarityPool.push('epic');
hasDinosaur = true; // Mark that we've added a dinosaur
} else if (roll < 0.3) {
rarityPool.push('unique');
hasDinosaur = true; // Mark that we've added a dinosaur
} else {
rarityPool.push('rare'); // Primarily reptiles, could be other rare types
}
}
break;
case 'avians':
// 4 cards: Only Avian cards with exclusive Avians
for (var i = 0; i < 4; i++) {
var roll = Math.random();
if (roll < 0.05) {
rarityPool.push('exotic'); // Phoenix
} else if (roll < 0.15) {
rarityPool.push('unique'); // Pelican, Hummingbird
} else if (roll < 0.35) {
rarityPool.push('rare'); // Vulture, Crow, and other rare avians
} else if (roll < 0.6) {
rarityPool.push('uncommon'); // Owl, Eagle, Penguin
} else {
rarityPool.push('common'); // Pidgeon
}
}
break;
}
// Create cards based on rarity pool
for (var i = 0; i < rarityPool.length; i++) {
var rarity = rarityPool[i];
var possibleCards = CARD_DATABASE.filter(function (card) {
if (packType === 'jurassic' && (rarity === 'unique' || rarity === 'epic' || rarity === 'legendary' || rarity === 'exotic')) {
return card.rarity === rarity && card.type === 'Dinosaur';
} else if (packType === 'ancient' && (rarity === 'unique' || rarity === 'epic' || rarity === 'legendary' || rarity === 'exotic')) {
return card.rarity === rarity && card.type === 'ExtinctAnimal';
} else if (packType === 'avians') {
// For Avians pack, only return Avian type cards (including Duck even though it's type EVERYTHING)
return card.rarity === rarity && (card.type === 'Avian' || card.name === 'Duck' || card.name === 'Dodo');
}
return card.rarity === rarity;
});
if (possibleCards.length > 0) {
var selectedCard = possibleCards[Math.floor(Math.random() * possibleCards.length)];
cards.push(new Card(selectedCard.rarity, selectedCard.id, selectedCard.name, selectedCard.type));
}
}
return cards;
}
// Clear current screen elements
function clearScreen() {
for (var i = 0; i < screenElements.length; i++) {
screenElements[i].destroy();
}
screenElements = [];
packDisplays = [];
}
// Show all cards in collection screen
function showAllCardsScreen() {
clearScreen();
currentScreen = 'allCards';
var title = new Text2("ALL COLLECTED CARDS", {
size: 80,
fill: 0xFFFFFF
});
title.anchor.set(0.5, 0);
title.x = 2048 / 2;
title.y = 200;
game.addChild(title);
screenElements.push(title);
// Get all cards from collection
var allKeys = Object.keys(storage.collection);
var cardIds = [];
// Filter keys to get unique card IDs
for (var i = 0; i < allKeys.length; i++) {
var key = allKeys[i];
if (key.endsWith("_rarity")) {
cardIds.push(key.substring(0, key.length - 7));
}
}
// Sort cards by rarity
var rarityOrder = {
'common': 1,
'uncommon': 2,
'rare': 3,
'unique': 4,
'epic': 5,
'legendary': 6,
'exotic': 7,
'event': 8
};
cardIds.sort(function (a, b) {
var rarityA = storage.collection[a + "_rarity"];
var rarityB = storage.collection[b + "_rarity"];
return rarityOrder[rarityA] - rarityOrder[rarityB];
});
// Display cards in a grid
var cardsPerRow = 5;
var startY = 400;
var cardScale = 0.35;
var cardSpacingX = 400 * cardScale;
var cardSpacingY = 850 * cardScale;
for (var i = 0; i < cardIds.length; i++) {
var cardId = cardIds[i];
var row = Math.floor(i / cardsPerRow);
var col = i % cardsPerRow;
var card = new Card(storage.collection[cardId + "_rarity"], cardId, storage.collection[cardId + "_name"], storage.collection[cardId + "_type"]);
card.x = 2048 / 2 + (col - (cardsPerRow - 1) / 2) * cardSpacingX;
card.y = startY + row * cardSpacingY;
card.scale.set(cardScale);
card.reveal(); // Already revealed
// Add count indicator
var countText = new Text2("x" + storage.collection[cardId + "_count"], {
size: 40,
fill: 0xFFFFFF
});
countText.anchor.set(1, 1);
countText.x = 220;
countText.y = 300;
card.addChild(countText);
game.addChild(card);
screenElements.push(card);
}
// Back button
var backButton = new Button("BACK", 200, 80);
backButton.x = 200;
backButton.y = 300; //{mw} // moved down from 200 to 300
game.addChild(backButton);
screenElements.push(backButton);
backButton.down = function () {
tween(backButton.scale, {
x: 0.95,
y: 0.95
}, {
duration: 100
});
};
backButton.up = function () {
tween(backButton.scale, {
x: 1,
y: 1
}, {
duration: 100,
onFinish: function onFinish() {
showCollectionScreen();
}
});
};
}
// Show event screen with mini-games and current progress
function showEventScreen() {
clearScreen();
currentScreen = 'event';
var title = new Text2("EVENTS", {
size: 80,
fill: 0xFFFFFF
});
title.anchor.set(0.5, 0);
title.x = 2048 / 2;
title.y = 200;
game.addChild(title);
screenElements.push(title);
// Initialize event points if not exists
if (!storage.stats.eventPoints) {
storage.stats.eventPoints = 0;
}
// Event progress display
var eventProgress = new Text2("EVENT POINTS: " + storage.stats.eventPoints, {
size: 50,
fill: 0xFFFFFF
});
eventProgress.anchor.set(0.5, 0);
eventProgress.x = 2048 / 2;
eventProgress.y = 300;
game.addChild(eventProgress);
screenElements.push(eventProgress);
// Reward tiers explanation
var rewardText = new Text2("Every 100 points: Random card up to Epic rarity\nEvery 1000 points: Random Event card", {
size: 40,
fill: 0xFFFFFF
});
rewardText.anchor.set(0.5, 0);
rewardText.x = 2048 / 2;
rewardText.y = 400;
game.addChild(rewardText);
screenElements.push(rewardText);
// Mini-games buttons
var game1Button = new Button("GEM COLLECTOR", 400, 120);
game1Button.x = 2048 / 2;
game1Button.y = 700;
game.addChild(game1Button);
screenElements.push(game1Button);
game1Button.down = function () {
tween(game1Button.scale, {
x: 0.95,
y: 0.95
}, {
duration: 100
});
};
game1Button.up = function () {
tween(game1Button.scale, {
x: 1,
y: 1
}, {
duration: 100,
onFinish: function onFinish() {
startMiniGame('GemCollector');
}
});
};
// Back button
var game2Button = new Button("QUIZ", 400, 120);
game2Button.x = 2048 / 2;
game2Button.y = 900;
game.addChild(game2Button);
screenElements.push(game2Button);
game2Button.down = function () {
tween(game2Button.scale, {
x: 0.95,
y: 0.95
}, {
duration: 100
});
};
game2Button.up = function () {
tween(game2Button.scale, {
x: 1,
y: 1
}, {
duration: 100,
onFinish: function onFinish() {
startMiniGame('Quiz');
}
});
};
var backButton = new Button("BACK", 200, 80);
backButton.x = 200;
backButton.y = 300; //{nL} // moved down from 200 to 300
game.addChild(backButton);
screenElements.push(backButton);
backButton.down = function () {
tween(backButton.scale, {
x: 0.95,
y: 0.95
}, {
duration: 100
});
};
backButton.up = function () {
tween(backButton.scale, {
x: 1,
y: 1
}, {
duration: 100,
onFinish: function onFinish() {
showHomeScreen();
}
});
};
}
// Function to start a mini-game
function startMiniGame(gameType) {
clearScreen();
currentScreen = 'minigame';
var miniGame = new MiniGame(gameType);
miniGame.x = 2048 / 2;
miniGame.y = 2732 / 2;
game.addChild(miniGame);
screenElements.push(miniGame);
}
// Update stats display
function updateStatsDisplay() {
var totalCards = storage.stats.totalCards || 0;
statsText.setText("Collection: " + totalCards + " cards");
}
// Update function called by the game engine
game.update = function () {
// Game logic updates (if needed)
};
// Event handling
game.move = function (x, y, obj) {
// Mouse/touch move handling
};
game.down = function (x, y, obj) {
// Mouse/touch down handling
};
game.up = function (x, y, obj) {
// Mouse/touch up handling
};
Light gray card packet with a hare in the center. In-Game asset. 2d. High contrast. No shadows
Green card packet with a Salamander in the center. In-Game asset. 2d. High contrast. No shadows
Orange card packet with a Rhino in the center. In-Game asset. 2d. High contrast. No shadows
Purple card packet with a Crocodile in the center. In-Game asset. 2d. High contrast. No shadows
Dark red card packet with a Whale in the center. In-Game asset. 2d. High contrast. No shadows
Rabbit. In-Game asset. 2d. High contrast. No shadows
Orange salamander. In-Game asset. 2d. High contrast. No shadows
Ant. In-Game asset. 2d. High contrast. No shadows
Pidgeon. In-Game asset. 2d. High contrast. No shadows
Pig. In-Game asset. 2d. High contrast. No shadows
Frog. In-Game asset. 2d. High contrast. No shadows
Rat. In-Game asset. 2d. High contrast. No shadows
Squirrel. In-Game asset. 2d. High contrast. No shadows
Salmon. In-Game asset. 2d. High contrast. No shadows
Fox. In-Game asset. 2d. High contrast. No shadows
Owl. In-Game asset. 2d. High contrast. No shadows
Silverback gorilla. In-Game asset. 2d. High contrast. No shadows
Ostrich. In-Game asset. 2d. High contrast. No shadows
Wolf. In-Game asset. 2d. High contrast. No shadows
Bear. In-Game asset. 2d. High contrast. No shadows
Hammerhead shark. In-Game asset. 2d. High contrast. No shadows
Lion. In-Game asset. 2d. High contrast. No shadows
Aggressive hippo. In-Game asset. 2d. High contrast. No shadows
Sperm whale. In-Game asset. 2d. High contrast. No shadows
Crocodile. In-Game asset. 2d. High contrast. No shadows
Lizard. In-Game asset. 2d. High contrast. No shadows
Dung beetle. In-Game asset. 2d. High contrast. No shadows
Duck. In-Game asset. 2d. High contrast. No shadows
Ankylosaurus. In-Game asset. 2d. High contrast. No shadows
Diplodocus. In-Game asset. 2d. High contrast. No shadows
Parasaur. In-Game asset. 2d. High contrast. No shadows
Pterodactyl. In-Game asset. 2d. High contrast. No shadows
A Yellow card pack with a T-TEX in the center
Spinosaurus. In-Game asset. 2d. High contrast. No shadows
Stegosaurus. In-Game asset. 2d. High contrast. No shadows
T-REX. In-Game asset. 2d. High contrast. No shadows
Triceratops. In-Game asset. 2d. High contrast. No shadows
Raptor. In-Game asset. 2d. High contrast. No shadows
White card packet with a "?" Sign in the middle. In-Game asset. 2d. High contrast. No shadows
Cat. In-Game asset. 2d. High contrast. No shadows
Cheetah. In-Game asset. 2d. High contrast. No shadows
Penguin. In-Game asset. 2d. High contrast. No shadows
Cobra. In-Game asset. 2d. High contrast. No shadows
Snake. In-Game asset. 2d. High contrast. No shadows
Rhino. In-Game asset. 2d. High contrast. No shadows
Card packet made out of stone with a Tribal drawing of people Hunting a wolly Mammoth. In-Game asset. 2d. High contrast. No shadows
Mammoth. In-Game asset. 2d. High contrast. No shadows
Dodo. In-Game asset. 2d. High contrast. No shadows
Megalodon. In-Game asset. 2d. High contrast. No shadows
Sabertooth tiger. In-Game asset. 2d. High contrast. No shadows
Wooly Rhino. In-Game asset. 2d. High contrast. No shadows
Giant bat. In-Game asset. 2d. High contrast. No shadows
Moose. In-Game asset. 2d. High contrast. No shadows
Wasp. In-Game asset. 2d. High contrast. No shadows
Seal. In-Game asset. 2d. High contrast. No shadows
Eagle. In-Game asset. 2d. High contrast. No shadows
Make the outlines on my character a dark black
Elephant. In-Game asset. 2d. High contrast. No shadows
Gem. In-Game asset. 2d. High contrast. No shadows
Remove the background
Remove the background
RE.MO.VE. THE. BACKGROUND!
Remove the background
Remove the baccground
Remove the background
Remov the bagroud