/****
* 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