User prompt
Add new names: Archeologist, Builder, Strategist, Trader, Windowsill
User prompt
Exclude numbers 0 and 9 when you make a code
User prompt
Buttons for Numbers 0 and 9 don't show; fix that
User prompt
Peepee master now has it's unique sound
User prompt
Add card icon for peepee master
User prompt
Add a peepee
User prompt
Add quizzes for Vulture, Hummingbird, Crow, Pelican and Phoenix
User prompt
To make logging in more effective, there is also a random combination of 3 digit numbers
User prompt
Please fix the bug: 'TypeError: Cannot set properties of undefined (setting 'fill')' in or related to this line: 'usernameDisplay.style.fill = 0xFFFFFF;' Line Number: 1809
User prompt
Add a new thingy: Login! Log in your account to the game to unlock events and opening packs ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
Make the "Back" button a little downwards
User prompt
Avians pack should now have 4 cards
User prompt
Avians pack should use Avians pack asset
User prompt
Add asset for Avians card pack
User prompt
Add card icon image for the crow
User prompt
Add assets for Vulture, Crow, Pelican, Hummingbird and Pheonix
User prompt
Add new pack: Avians pack! You can only get Avian cards (with the duck and the dodo) in this pack and some exclusive Avian cards exclusive to this pack (add new cards [they are all Avian and exclusive to Avian pack]: Rare: Vulture, Crow; Unique: Pelican, Hummingbird; Exotic: Phoenix)
User prompt
Add new pack: Avians pack! You can only get Avian cards (with the duck and the dodo) in this pack and some exclusive Avian cards exclusive to this pack (add new cards [they are all Avian and exclusive to Avian pack]: Rare: Vulture, Crow; Unique: Pelican, Hummingbird; Exotic: Phoenix)
User prompt
Reduce the chances for an event card in the event pack to 14.67333%
User prompt
Add asset for event pack
User prompt
Add an event pack that has 3 cards with a 24.55% chance of getting an event card; most cards are uncommons and rares
User prompt
Make it so that the quiz has infinite questions and there's no timer and when you get 3 questions wrong, the game ends
User prompt
Please fix the bug: 'TypeError: self.showNextQuestion is not a function' in or related to this line: 'self.showNextQuestion();' Line Number: 965
User prompt
Please fix the bug: 'TypeError: self.getCardDescription is not a function' in or related to this line: 'var question = {' Line Number: 859
User prompt
Add new minigame: Quiz! Guess the card by its description, you get 75 points for each upgrade
/**** * 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 };
===================================================================
--- original.js
+++ change.js
@@ -832,9 +832,15 @@
'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'
+ '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
@@ -1556,8 +1562,35 @@
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
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