/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
var Cookie = Container.expand(function () {
var self = Container.call(this);
var cookieBase = self.attachAsset('cookieBase', {
anchorX: 0.5,
anchorY: 0.5
});
// Add chocolate chips
var chip1 = self.attachAsset('cookieChip', {
anchorX: 0.5,
anchorY: 0.5,
x: -40,
y: -30
});
var chip2 = self.attachAsset('cookieChip', {
anchorX: 0.5,
anchorY: 0.5,
x: 50,
y: 20
});
var chip3 = self.attachAsset('cookieChip', {
anchorX: 0.5,
anchorY: 0.5,
x: -20,
y: 40
});
var chip4 = self.attachAsset('cookieChip', {
anchorX: 0.5,
anchorY: 0.5,
x: 30,
y: -50
});
self.bounce = function () {
tween(self, {
scaleX: 1.1,
scaleY: 1.1
}, {
duration: 100,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(self, {
scaleX: 1.0,
scaleY: 1.0
}, {
duration: 100,
easing: tween.easeIn
});
}
});
};
self.down = function (x, y, obj) {
self.bounce();
createParticles(self.x, self.y);
earnCookies(cookiesPerClick);
totalClicks++;
LK.getSound('click').play();
};
return self;
});
var Particle = Container.expand(function () {
var self = Container.call(this);
var particle = self.attachAsset('particle', {
anchorX: 0.5,
anchorY: 0.5
});
self.velocity = {
x: (Math.random() - 0.5) * 10,
y: Math.random() * -8 - 2
};
self.life = 60;
self.maxLife = 60;
self.update = function () {
self.x += self.velocity.x;
self.y += self.velocity.y;
self.velocity.y += 0.3;
self.life--;
self.alpha = self.life / self.maxLife;
if (self.life <= 0) {
self.destroy();
for (var i = particles.length - 1; i >= 0; i--) {
if (particles[i] === self) {
particles.splice(i, 1);
break;
}
}
}
};
return self;
});
var UpgradeButton = Container.expand(function (upgradeData) {
var self = Container.call(this);
self.upgradeData = upgradeData;
self.canAfford = false;
var button = self.attachAsset('upgradeButton', {
anchorX: 0.5,
anchorY: 0.5
});
var nameText = new Text2(upgradeData.name, {
size: 32,
fill: 0xFFFFFF
});
nameText.anchor.set(0, 0.5);
nameText.x = -180;
nameText.y = -15;
self.addChild(nameText);
var costText = new Text2('Cost: ' + formatNumber(upgradeData.cost), {
size: 24,
fill: 0xFFFF00
});
costText.anchor.set(0, 0.5);
costText.x = -180;
costText.y = 15;
self.addChild(costText);
var ownedText = new Text2('Owned: ' + upgradeData.owned, {
size: 24,
fill: 0x00FF00
});
ownedText.anchor.set(1, 0.5);
ownedText.x = 180;
ownedText.y = 0;
self.addChild(ownedText);
self.updateDisplay = function () {
self.canAfford = totalCookies >= upgradeData.cost;
if (self.canAfford) {
button.tint = 0x228B22;
} else {
button.tint = 0x4A4A4A;
}
costText.setText('Cost: ' + formatNumber(upgradeData.cost));
ownedText.setText('Owned: ' + upgradeData.owned);
};
self.down = function (x, y, obj) {
if (self.canAfford) {
totalCookies -= upgradeData.cost;
upgradeData.owned++;
upgradeData.cost = Math.floor(upgradeData.cost * upgradeData.multiplier);
if (upgradeData.type === 'click') {
cookiesPerClick += upgradeData.effect;
} else if (upgradeData.type === 'auto') {
cookiesPerSecond += upgradeData.effect;
}
self.updateDisplay();
updateAllDisplays();
saveGame();
LK.getSound('buysound').play();
tween(self, {
scaleX: 1.1,
scaleY: 1.1
}, {
duration: 100,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(self, {
scaleX: 1.0,
scaleY: 1.0
}, {
duration: 100,
easing: tween.easeIn
});
}
});
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x8B4513
});
/****
* Game Code
****/
// Game variables
var totalCookies = storage.totalCookies || 0;
var cookiesPerClick = storage.cookiesPerClick || 1;
var cookiesPerSecond = storage.cookiesPerSecond || 0;
var totalClicks = storage.totalClicks || 0;
var totalCookiesEarned = storage.totalCookiesEarned || 0;
var achievement100Clicks = storage.achievement100Clicks || false;
var gameStartTime = storage.gameStartTime || Date.now();
var particles = [];
var upgradeButtons = [];
var lastAutoUpdate = Date.now();
// UI elements
var cookieDisplay;
var statsDisplay;
var cpsDisplay;
// Upgrade definitions
var upgrades = [{
name: "Better Clicking",
cost: storage.betterClickingCost || 15,
owned: storage.betterClickingOwned || 0,
effect: 1,
type: 'click',
multiplier: 1.5
}, {
name: "Cookie Oven",
cost: storage.cookieOvenCost || 100,
owned: storage.cookieOvenOwned || 0,
effect: 1,
type: 'auto',
multiplier: 1.8
}, {
name: "Super Cursor",
cost: storage.superCursorCost || 500,
owned: storage.superCursorOwned || 0,
effect: 5,
type: 'click',
multiplier: 2.0
}, {
name: "Cookie Factory",
cost: storage.cookieFactoryCost || 2000,
owned: storage.cookieFactoryOwned || 0,
effect: 10,
type: 'auto',
multiplier: 2.2
}, {
name: "Master Baker",
cost: storage.masterBakerCost || 10000,
owned: storage.masterBakerOwned || 0,
effect: 50,
type: 'auto',
multiplier: 2.5
}];
// Create main cookie
var mainCookie = game.addChild(new Cookie());
mainCookie.x = 1024;
mainCookie.y = 600;
// Create shop panel
var shopPanel = game.addChild(LK.getAsset('shopPanel', {
anchorX: 0,
anchorY: 0,
x: 50,
y: 100
}));
var shopTitle = new Text2('SHOP', {
size: 48,
fill: 0xFFFFFF
});
shopTitle.anchor.set(0.5, 0);
shopTitle.x = 225;
shopTitle.y = 20;
shopPanel.addChild(shopTitle);
// Create upgrade buttons
for (var i = 0; i < upgrades.length; i++) {
var upgradeButton = new UpgradeButton(upgrades[i]);
upgradeButton.x = 225;
upgradeButton.y = 120 + i * 100;
upgradeButtons.push(upgradeButton);
shopPanel.addChild(upgradeButton);
}
// Create stats panel
var statsPanel = game.addChild(LK.getAsset('statsPanel', {
anchorX: 0,
anchorY: 0,
x: 1550,
y: 100
}));
var statsTitle = new Text2('STATS', {
size: 48,
fill: 0xFFFFFF
});
statsTitle.anchor.set(0.5, 0);
statsTitle.x = 225;
statsTitle.y = 20;
statsPanel.addChild(statsTitle);
// Cookie display
cookieDisplay = new Text2('Cookies: ' + formatNumber(totalCookies), {
size: 48,
fill: 0xFFFF00
});
cookieDisplay.anchor.set(0.5, 0);
cookieDisplay.x = 1024;
cookieDisplay.y = 100;
game.addChild(cookieDisplay);
// CPS display
cpsDisplay = new Text2('Per Second: ' + formatNumber(cookiesPerSecond), {
size: 32,
fill: 0x00FF00
});
cpsDisplay.anchor.set(0.5, 0);
cpsDisplay.x = 1024;
cpsDisplay.y = 160;
game.addChild(cpsDisplay);
// Stats text
var clicksText = new Text2('Total Clicks: ' + formatNumber(totalClicks), {
size: 32,
fill: 0xFFFFFF
});
clicksText.anchor.set(0, 0);
clicksText.x = 20;
clicksText.y = 80;
statsPanel.addChild(clicksText);
var earnedText = new Text2('Total Earned: ' + formatNumber(totalCookiesEarned), {
size: 32,
fill: 0xFFFFFF
});
earnedText.anchor.set(0, 0);
earnedText.x = 20;
earnedText.y = 130;
statsPanel.addChild(earnedText);
var perClickText = new Text2('Per Click: ' + formatNumber(cookiesPerClick), {
size: 32,
fill: 0xFFFFFF
});
perClickText.anchor.set(0, 0);
perClickText.x = 20;
perClickText.y = 180;
statsPanel.addChild(perClickText);
var runtimeText = new Text2('Runtime: 0h 0m', {
size: 32,
fill: 0xFFFFFF
});
runtimeText.anchor.set(0, 0);
runtimeText.x = 20;
runtimeText.y = 230;
statsPanel.addChild(runtimeText);
// Helper functions
function formatNumber(num) {
if (num >= 1000000) {
return (num / 1000000).toFixed(1) + 'M';
} else if (num >= 1000) {
return (num / 1000).toFixed(1) + 'K';
}
return Math.floor(num).toString();
}
function formatTime(milliseconds) {
var totalSeconds = Math.floor(milliseconds / 1000);
var years = Math.floor(totalSeconds / (365 * 24 * 3600));
var months = Math.floor(totalSeconds % (365 * 24 * 3600) / (30 * 24 * 3600));
var weeks = Math.floor(totalSeconds % (30 * 24 * 3600) / (7 * 24 * 3600));
var days = Math.floor(totalSeconds % (7 * 24 * 3600) / (24 * 3600));
var hours = Math.floor(totalSeconds % (24 * 3600) / 3600);
var minutes = Math.floor(totalSeconds % 3600 / 60);
var seconds = totalSeconds % 60;
var timeString = '';
if (years > 0) timeString += years + 'y ';
if (months > 0) timeString += months + 'mo ';
if (weeks > 0) timeString += weeks + 'w ';
if (days > 0) timeString += days + 'd ';
if (hours > 0) timeString += hours + 'h ';
if (minutes > 0) timeString += minutes + 'm ';
timeString += seconds + 's';
return timeString;
}
function earnCookies(amount) {
totalCookies += amount;
totalCookiesEarned += amount;
updateAllDisplays();
checkAchievements();
}
function checkAchievements() {
// Check for 100 clicks achievement
if (!achievement100Clicks && totalClicks >= 100) {
achievement100Clicks = true;
showAchievement("We are just getting started");
saveGame();
}
}
function showAchievement(title) {
// Create achievement popup
var achievementBg = game.addChild(LK.getAsset('shopPanel', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 1366,
scaleX: 0.8,
scaleY: 0.6
}));
achievementBg.tint = 0x228B22;
var achievementTitle = new Text2('ACHIEVEMENT UNLOCKED!', {
size: 36,
fill: 0xFFFFFF
});
achievementTitle.anchor.set(0.5, 0.5);
achievementTitle.x = 0;
achievementTitle.y = -60;
achievementBg.addChild(achievementTitle);
var achievementText = new Text2(title, {
size: 32,
fill: 0xFFFF00
});
achievementText.anchor.set(0.5, 0.5);
achievementText.x = 0;
achievementText.y = 0;
achievementBg.addChild(achievementText);
// Auto-remove after 3 seconds
LK.setTimeout(function () {
achievementBg.destroy();
}, 3000);
// Slide in animation
achievementBg.y = 1366 + 200;
tween(achievementBg, {
y: 1366
}, {
duration: 500,
easing: tween.easeOut
});
}
function createParticles(x, y) {
for (var i = 0; i < 5; i++) {
var particle = new Particle();
particle.x = x + (Math.random() - 0.5) * 100;
particle.y = y + (Math.random() - 0.5) * 100;
particles.push(particle);
game.addChild(particle);
}
}
function updateAllDisplays() {
cookieDisplay.setText('Cookies: ' + formatNumber(totalCookies));
cpsDisplay.setText('Per Second: ' + formatNumber(cookiesPerSecond));
clicksText.setText('Total Clicks: ' + formatNumber(totalClicks));
earnedText.setText('Total Earned: ' + formatNumber(totalCookiesEarned));
perClickText.setText('Per Click: ' + formatNumber(cookiesPerClick));
var currentRuntime = Date.now() - gameStartTime;
runtimeText.setText('Runtime: ' + formatTime(currentRuntime));
for (var i = 0; i < upgradeButtons.length; i++) {
upgradeButtons[i].updateDisplay();
}
}
function saveGame() {
storage.totalCookies = totalCookies;
storage.cookiesPerClick = cookiesPerClick;
storage.cookiesPerSecond = cookiesPerSecond;
storage.totalClicks = totalClicks;
storage.totalCookiesEarned = totalCookiesEarned;
storage.achievement100Clicks = achievement100Clicks;
storage.gameStartTime = gameStartTime;
// Save upgrade data
storage.betterClickingCost = upgrades[0].cost;
storage.betterClickingOwned = upgrades[0].owned;
storage.cookieOvenCost = upgrades[1].cost;
storage.cookieOvenOwned = upgrades[1].owned;
storage.superCursorCost = upgrades[2].cost;
storage.superCursorOwned = upgrades[2].owned;
storage.cookieFactoryCost = upgrades[3].cost;
storage.cookieFactoryOwned = upgrades[3].owned;
storage.masterBakerCost = upgrades[4].cost;
storage.masterBakerOwned = upgrades[4].owned;
}
// Initialize displays
updateAllDisplays();
// Play ambient music
LK.playMusic('ambient');
// Main game loop
game.update = function () {
// Handle automatic cookie production
var now = Date.now();
var deltaTime = (now - lastAutoUpdate) / 1000;
if (cookiesPerSecond > 0 && deltaTime >= 1) {
var cookiesToAdd = Math.floor(cookiesPerSecond * deltaTime);
if (cookiesToAdd > 0) {
earnCookies(cookiesToAdd);
lastAutoUpdate = now;
}
}
// Save game periodically
if (LK.ticks % 300 === 0) {
saveGame();
}
}; /****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
var Cookie = Container.expand(function () {
var self = Container.call(this);
var cookieBase = self.attachAsset('cookieBase', {
anchorX: 0.5,
anchorY: 0.5
});
// Add chocolate chips
var chip1 = self.attachAsset('cookieChip', {
anchorX: 0.5,
anchorY: 0.5,
x: -40,
y: -30
});
var chip2 = self.attachAsset('cookieChip', {
anchorX: 0.5,
anchorY: 0.5,
x: 50,
y: 20
});
var chip3 = self.attachAsset('cookieChip', {
anchorX: 0.5,
anchorY: 0.5,
x: -20,
y: 40
});
var chip4 = self.attachAsset('cookieChip', {
anchorX: 0.5,
anchorY: 0.5,
x: 30,
y: -50
});
self.bounce = function () {
tween(self, {
scaleX: 1.1,
scaleY: 1.1
}, {
duration: 100,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(self, {
scaleX: 1.0,
scaleY: 1.0
}, {
duration: 100,
easing: tween.easeIn
});
}
});
};
self.down = function (x, y, obj) {
self.bounce();
createParticles(self.x, self.y);
earnCookies(cookiesPerClick);
totalClicks++;
LK.getSound('click').play();
};
return self;
});
var Particle = Container.expand(function () {
var self = Container.call(this);
var particle = self.attachAsset('particle', {
anchorX: 0.5,
anchorY: 0.5
});
self.velocity = {
x: (Math.random() - 0.5) * 10,
y: Math.random() * -8 - 2
};
self.life = 60;
self.maxLife = 60;
self.update = function () {
self.x += self.velocity.x;
self.y += self.velocity.y;
self.velocity.y += 0.3;
self.life--;
self.alpha = self.life / self.maxLife;
if (self.life <= 0) {
self.destroy();
for (var i = particles.length - 1; i >= 0; i--) {
if (particles[i] === self) {
particles.splice(i, 1);
break;
}
}
}
};
return self;
});
var UpgradeButton = Container.expand(function (upgradeData) {
var self = Container.call(this);
self.upgradeData = upgradeData;
self.canAfford = false;
var button = self.attachAsset('upgradeButton', {
anchorX: 0.5,
anchorY: 0.5
});
var nameText = new Text2(upgradeData.name, {
size: 32,
fill: 0xFFFFFF
});
nameText.anchor.set(0, 0.5);
nameText.x = -180;
nameText.y = -15;
self.addChild(nameText);
var costText = new Text2('Cost: ' + formatNumber(upgradeData.cost), {
size: 24,
fill: 0xFFFF00
});
costText.anchor.set(0, 0.5);
costText.x = -180;
costText.y = 15;
self.addChild(costText);
var ownedText = new Text2('Owned: ' + upgradeData.owned, {
size: 24,
fill: 0x00FF00
});
ownedText.anchor.set(1, 0.5);
ownedText.x = 180;
ownedText.y = 0;
self.addChild(ownedText);
self.updateDisplay = function () {
self.canAfford = totalCookies >= upgradeData.cost;
if (self.canAfford) {
button.tint = 0x228B22;
} else {
button.tint = 0x4A4A4A;
}
costText.setText('Cost: ' + formatNumber(upgradeData.cost));
ownedText.setText('Owned: ' + upgradeData.owned);
};
self.down = function (x, y, obj) {
if (self.canAfford) {
totalCookies -= upgradeData.cost;
upgradeData.owned++;
upgradeData.cost = Math.floor(upgradeData.cost * upgradeData.multiplier);
if (upgradeData.type === 'click') {
cookiesPerClick += upgradeData.effect;
} else if (upgradeData.type === 'auto') {
cookiesPerSecond += upgradeData.effect;
}
self.updateDisplay();
updateAllDisplays();
saveGame();
LK.getSound('buysound').play();
tween(self, {
scaleX: 1.1,
scaleY: 1.1
}, {
duration: 100,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(self, {
scaleX: 1.0,
scaleY: 1.0
}, {
duration: 100,
easing: tween.easeIn
});
}
});
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x8B4513
});
/****
* Game Code
****/
// Game variables
var totalCookies = storage.totalCookies || 0;
var cookiesPerClick = storage.cookiesPerClick || 1;
var cookiesPerSecond = storage.cookiesPerSecond || 0;
var totalClicks = storage.totalClicks || 0;
var totalCookiesEarned = storage.totalCookiesEarned || 0;
var achievement100Clicks = storage.achievement100Clicks || false;
var gameStartTime = storage.gameStartTime || Date.now();
var particles = [];
var upgradeButtons = [];
var lastAutoUpdate = Date.now();
// UI elements
var cookieDisplay;
var statsDisplay;
var cpsDisplay;
// Upgrade definitions
var upgrades = [{
name: "Better Clicking",
cost: storage.betterClickingCost || 15,
owned: storage.betterClickingOwned || 0,
effect: 1,
type: 'click',
multiplier: 1.5
}, {
name: "Cookie Oven",
cost: storage.cookieOvenCost || 100,
owned: storage.cookieOvenOwned || 0,
effect: 1,
type: 'auto',
multiplier: 1.8
}, {
name: "Super Cursor",
cost: storage.superCursorCost || 500,
owned: storage.superCursorOwned || 0,
effect: 5,
type: 'click',
multiplier: 2.0
}, {
name: "Cookie Factory",
cost: storage.cookieFactoryCost || 2000,
owned: storage.cookieFactoryOwned || 0,
effect: 10,
type: 'auto',
multiplier: 2.2
}, {
name: "Master Baker",
cost: storage.masterBakerCost || 10000,
owned: storage.masterBakerOwned || 0,
effect: 50,
type: 'auto',
multiplier: 2.5
}];
// Create main cookie
var mainCookie = game.addChild(new Cookie());
mainCookie.x = 1024;
mainCookie.y = 600;
// Create shop panel
var shopPanel = game.addChild(LK.getAsset('shopPanel', {
anchorX: 0,
anchorY: 0,
x: 50,
y: 100
}));
var shopTitle = new Text2('SHOP', {
size: 48,
fill: 0xFFFFFF
});
shopTitle.anchor.set(0.5, 0);
shopTitle.x = 225;
shopTitle.y = 20;
shopPanel.addChild(shopTitle);
// Create upgrade buttons
for (var i = 0; i < upgrades.length; i++) {
var upgradeButton = new UpgradeButton(upgrades[i]);
upgradeButton.x = 225;
upgradeButton.y = 120 + i * 100;
upgradeButtons.push(upgradeButton);
shopPanel.addChild(upgradeButton);
}
// Create stats panel
var statsPanel = game.addChild(LK.getAsset('statsPanel', {
anchorX: 0,
anchorY: 0,
x: 1550,
y: 100
}));
var statsTitle = new Text2('STATS', {
size: 48,
fill: 0xFFFFFF
});
statsTitle.anchor.set(0.5, 0);
statsTitle.x = 225;
statsTitle.y = 20;
statsPanel.addChild(statsTitle);
// Cookie display
cookieDisplay = new Text2('Cookies: ' + formatNumber(totalCookies), {
size: 48,
fill: 0xFFFF00
});
cookieDisplay.anchor.set(0.5, 0);
cookieDisplay.x = 1024;
cookieDisplay.y = 100;
game.addChild(cookieDisplay);
// CPS display
cpsDisplay = new Text2('Per Second: ' + formatNumber(cookiesPerSecond), {
size: 32,
fill: 0x00FF00
});
cpsDisplay.anchor.set(0.5, 0);
cpsDisplay.x = 1024;
cpsDisplay.y = 160;
game.addChild(cpsDisplay);
// Stats text
var clicksText = new Text2('Total Clicks: ' + formatNumber(totalClicks), {
size: 32,
fill: 0xFFFFFF
});
clicksText.anchor.set(0, 0);
clicksText.x = 20;
clicksText.y = 80;
statsPanel.addChild(clicksText);
var earnedText = new Text2('Total Earned: ' + formatNumber(totalCookiesEarned), {
size: 32,
fill: 0xFFFFFF
});
earnedText.anchor.set(0, 0);
earnedText.x = 20;
earnedText.y = 130;
statsPanel.addChild(earnedText);
var perClickText = new Text2('Per Click: ' + formatNumber(cookiesPerClick), {
size: 32,
fill: 0xFFFFFF
});
perClickText.anchor.set(0, 0);
perClickText.x = 20;
perClickText.y = 180;
statsPanel.addChild(perClickText);
var runtimeText = new Text2('Runtime: 0h 0m', {
size: 32,
fill: 0xFFFFFF
});
runtimeText.anchor.set(0, 0);
runtimeText.x = 20;
runtimeText.y = 230;
statsPanel.addChild(runtimeText);
// Helper functions
function formatNumber(num) {
if (num >= 1000000) {
return (num / 1000000).toFixed(1) + 'M';
} else if (num >= 1000) {
return (num / 1000).toFixed(1) + 'K';
}
return Math.floor(num).toString();
}
function formatTime(milliseconds) {
var totalSeconds = Math.floor(milliseconds / 1000);
var years = Math.floor(totalSeconds / (365 * 24 * 3600));
var months = Math.floor(totalSeconds % (365 * 24 * 3600) / (30 * 24 * 3600));
var weeks = Math.floor(totalSeconds % (30 * 24 * 3600) / (7 * 24 * 3600));
var days = Math.floor(totalSeconds % (7 * 24 * 3600) / (24 * 3600));
var hours = Math.floor(totalSeconds % (24 * 3600) / 3600);
var minutes = Math.floor(totalSeconds % 3600 / 60);
var seconds = totalSeconds % 60;
var timeString = '';
if (years > 0) timeString += years + 'y ';
if (months > 0) timeString += months + 'mo ';
if (weeks > 0) timeString += weeks + 'w ';
if (days > 0) timeString += days + 'd ';
if (hours > 0) timeString += hours + 'h ';
if (minutes > 0) timeString += minutes + 'm ';
timeString += seconds + 's';
return timeString;
}
function earnCookies(amount) {
totalCookies += amount;
totalCookiesEarned += amount;
updateAllDisplays();
checkAchievements();
}
function checkAchievements() {
// Check for 100 clicks achievement
if (!achievement100Clicks && totalClicks >= 100) {
achievement100Clicks = true;
showAchievement("We are just getting started");
saveGame();
}
}
function showAchievement(title) {
// Create achievement popup
var achievementBg = game.addChild(LK.getAsset('shopPanel', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 1366,
scaleX: 0.8,
scaleY: 0.6
}));
achievementBg.tint = 0x228B22;
var achievementTitle = new Text2('ACHIEVEMENT UNLOCKED!', {
size: 36,
fill: 0xFFFFFF
});
achievementTitle.anchor.set(0.5, 0.5);
achievementTitle.x = 0;
achievementTitle.y = -60;
achievementBg.addChild(achievementTitle);
var achievementText = new Text2(title, {
size: 32,
fill: 0xFFFF00
});
achievementText.anchor.set(0.5, 0.5);
achievementText.x = 0;
achievementText.y = 0;
achievementBg.addChild(achievementText);
// Auto-remove after 3 seconds
LK.setTimeout(function () {
achievementBg.destroy();
}, 3000);
// Slide in animation
achievementBg.y = 1366 + 200;
tween(achievementBg, {
y: 1366
}, {
duration: 500,
easing: tween.easeOut
});
}
function createParticles(x, y) {
for (var i = 0; i < 5; i++) {
var particle = new Particle();
particle.x = x + (Math.random() - 0.5) * 100;
particle.y = y + (Math.random() - 0.5) * 100;
particles.push(particle);
game.addChild(particle);
}
}
function updateAllDisplays() {
cookieDisplay.setText('Cookies: ' + formatNumber(totalCookies));
cpsDisplay.setText('Per Second: ' + formatNumber(cookiesPerSecond));
clicksText.setText('Total Clicks: ' + formatNumber(totalClicks));
earnedText.setText('Total Earned: ' + formatNumber(totalCookiesEarned));
perClickText.setText('Per Click: ' + formatNumber(cookiesPerClick));
var currentRuntime = Date.now() - gameStartTime;
runtimeText.setText('Runtime: ' + formatTime(currentRuntime));
for (var i = 0; i < upgradeButtons.length; i++) {
upgradeButtons[i].updateDisplay();
}
}
function saveGame() {
storage.totalCookies = totalCookies;
storage.cookiesPerClick = cookiesPerClick;
storage.cookiesPerSecond = cookiesPerSecond;
storage.totalClicks = totalClicks;
storage.totalCookiesEarned = totalCookiesEarned;
storage.achievement100Clicks = achievement100Clicks;
storage.gameStartTime = gameStartTime;
// Save upgrade data
storage.betterClickingCost = upgrades[0].cost;
storage.betterClickingOwned = upgrades[0].owned;
storage.cookieOvenCost = upgrades[1].cost;
storage.cookieOvenOwned = upgrades[1].owned;
storage.superCursorCost = upgrades[2].cost;
storage.superCursorOwned = upgrades[2].owned;
storage.cookieFactoryCost = upgrades[3].cost;
storage.cookieFactoryOwned = upgrades[3].owned;
storage.masterBakerCost = upgrades[4].cost;
storage.masterBakerOwned = upgrades[4].owned;
}
// Initialize displays
updateAllDisplays();
// Play ambient music
LK.playMusic('ambient');
// Main game loop
game.update = function () {
// Handle automatic cookie production
var now = Date.now();
var deltaTime = (now - lastAutoUpdate) / 1000;
if (cookiesPerSecond > 0 && deltaTime >= 1) {
var cookiesToAdd = Math.floor(cookiesPerSecond * deltaTime);
if (cookiesToAdd > 0) {
earnCookies(cookiesToAdd);
lastAutoUpdate = now;
}
}
// Save game periodically
if (LK.ticks % 300 === 0) {
saveGame();
}
};