/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1", { cookies: 0, cookiesPerTap: 1, cookiesPerSecond: 0, upgrades: [0, 0, 0] }); /**** * Classes ****/ // Cookie (main clickable) var Cookie = Container.expand(function () { var self = Container.call(this); // Shadow var shadow = self.attachAsset('cookieShadow', { anchorX: 0.5, anchorY: 0.5, y: 340, x: 0 }); // Cookie var cookie = self.attachAsset('cookie', { anchorX: 0.5, anchorY: 0.5, x: 0, y: 0 }); // Cookie pulse animation on tap self.pulse = function () { tween.stop(cookie, { scaleX: true, scaleY: true }); cookie.scaleX = 1; cookie.scaleY = 1; tween(cookie, { scaleX: 1.12, scaleY: 0.92 }, { duration: 80, easing: tween.easeOut, onFinish: function onFinish() { tween(cookie, { scaleX: 1, scaleY: 1 }, { duration: 120, easing: tween.easeIn }); } }); }; return self; }); // Upgrade Button var UpgradeButton = Container.expand(function () { var self = Container.call(this); // Button background var bg = self.attachAsset('upgradeBtn', { anchorX: 0.5, anchorY: 0.5, x: 0, y: 0 }); // Icon var icon = self.attachAsset('upgradeIcon', { anchorX: 0.5, anchorY: 0.5, x: -120, y: 0 }); // Title var title = new Text2('', { size: 54, fill: "#fff" }); title.anchor.set(0, 0.5); title.x = -60; title.y = 0; self.addChild(title); // Cost var costTxt = new Text2('', { size: 44, fill: 0xFFE7A0 }); costTxt.anchor.set(1, 0.5); costTxt.x = 180; costTxt.y = 0; self.addChild(costTxt); // Index of upgrade self.upgradeIndex = 0; // Set upgrade info self.setUpgrade = function (upgrade, index) { self.upgradeIndex = index; title.setText(upgrade.name); costTxt.setText(upgrade.cost + "šŖ"); }; // Update cost display self.setCost = function (cost) { costTxt.setText(cost + "šŖ"); }; // Flash when can't afford self.flashRed = function () { tween(bg, { tint: 0xff4444 }, { duration: 120, onFinish: function onFinish() { tween(bg, { tint: 0x6c4f2b }, { duration: 200 }); } }); }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x3e2c16 }); /**** * Game Code ****/ // Upgrade icon (for all upgrades, can be reused) // Upgrade button // Cookie shadow // Cookie (main clickable) // --- Game State --- var cookies = storage.cookies || 0; var cookiesPerTap = storage.cookiesPerTap || 1; var cookiesPerSecond = storage.cookiesPerSecond || 0; var upgrades = storage.upgrades || [0, 0, 0]; // --- Score State --- var score = typeof storage.score === "number" ? storage.score : 0; // start with 0 score var para = 0; // para (money) always equals score, updated in updateScoreText // --- Upgrade Definitions --- var upgradeDefs = [{ name: "Cursor", baseCost: 15, cost: 15, baseCps: 0.1, cps: 0.1, desc: "+0.1 cookies/sec" }, { name: "Grandma", baseCost: 100, cost: 100, baseCps: 1, cps: 1, desc: "+1 cookie/sec" }, { name: "Oven", baseCost: 10000, cost: 10000, baseCps: 10, cps: 10, desc: "+10 cookies/sec" }]; // --- UI Elements --- // Cookie count text var cookieTxt = new Text2('', { size: 120, fill: "#fff" }); cookieTxt.anchor.set(0.5, 0); cookieTxt.x = 2048 / 2; cookieTxt.y = 0; LK.gui.top.addChild(cookieTxt); // Score text (top left, avoid 100x100 area) var scoreTxt = new Text2('', { size: 80, fill: "#fff" }); scoreTxt.anchor.set(0, 0); scoreTxt.x = 110; // leave space for menu scoreTxt.y = 0; LK.gui.top.addChild(scoreTxt); // Cookies per second text var cpsTxt = new Text2('', { size: 54, fill: 0xFFE7A0 }); cpsTxt.anchor.set(0.5, 0); cpsTxt.x = 2048 / 2; cpsTxt.y = 260; LK.gui.top.addChild(cpsTxt); // --- Cookie (main clickable) --- var cookie = new Cookie(); game.addChild(cookie); cookie.x = 2048 / 2; cookie.y = 1100; // --- Upgrades --- var upgradeButtons = []; for (var i = 0; i < upgradeDefs.length; i++) { var btn = new UpgradeButton(); btn.setUpgrade(upgradeDefs[i], i); btn.x = 2048 / 2; btn.y = 1700 + i * 180; game.addChild(btn); upgradeButtons.push(btn); } // --- Helper Functions --- function updateCookieText() { cookieTxt.setText(Math.floor(cookies) + " šŖ"); } function updateCpsText() { cpsTxt.setText("per second: " + cookiesPerSecond.toFixed(1)); } function updateUpgradeButtons() { for (var i = 0; i < upgradeButtons.length; i++) { var def = upgradeDefs[i]; var owned = upgrades[i] || 0; var cost = getUpgradeCost(i); upgradeButtons[i].setCost(cost); } } function getUpgradeCost(index) { // Cost increases by 15% per purchase var def = upgradeDefs[index]; var owned = upgrades[index] || 0; return Math.floor(def.baseCost * Math.pow(1.15, owned)); } function getTotalCps() { var total = 0; for (var i = 0; i < upgrades.length; i++) { total += (upgrades[i] || 0) * upgradeDefs[i].cps; } return total; } function updateScoreText() { scoreTxt.setText("Score: " + Math.floor(score)); para = score; // para always equals score } function saveGame() { storage.cookies = cookies; storage.cookiesPerTap = cookiesPerTap; storage.cookiesPerSecond = cookiesPerSecond; storage.upgrades = upgrades; storage.score = score; } // --- Cookie Tap Handler --- cookie.down = function (x, y, obj) { cookies += cookiesPerTap; // Calculate Cursor bonus: 1 base + number of Cursors owned var cursorCount = upgrades[0] || 0; var earned = 1 + cursorCount; // Grandma bonus: Each Grandma gives 50% chance to earn 100 per tap var grandmaCount = upgrades[1] || 0; for (var i = 0; i < grandmaCount; i++) { if (Math.random() < 0.5) { earned += 100; } } score += earned; updateCookieText(); updateScoreText(); cookie.pulse(); saveGame(); }; // --- Upgrade Button Handlers --- for (var i = 0; i < upgradeButtons.length; i++) { (function (btn, idx) { btn.down = function (x, y, obj) { var cost = getUpgradeCost(idx); if (cookies >= cost && score >= cost) { cookies -= cost; score -= cost; if (score < 0) score = 0; upgrades[idx] = (upgrades[idx] || 0) + 1; cookiesPerSecond = getTotalCps(); updateCookieText(); updateScoreText(); updateCpsText(); updateUpgradeButtons(); saveGame(); // Button pulse tween(btn, { scaleX: 1.08, scaleY: 1.08 }, { duration: 80, onFinish: function onFinish() { tween(btn, { scaleX: 1, scaleY: 1 }, { duration: 120 }); } }); // Win condition: if Oven (idx==2) is purchased, show win if (idx === 2) { LK.showYouWin(); } } else { btn.flashRed(); } }; })(upgradeButtons[i], i); } // --- Game Update Loop --- game.update = function () { // Add cookies per second if (cookiesPerSecond > 0) { // 60 ticks per second cookies += cookiesPerSecond / 60; updateCookieText(); } // Save every 2 seconds if (LK.ticks % 120 === 0) { saveGame(); } }; // --- Initial UI Update --- cookiesPerSecond = getTotalCps(); updateCookieText(); updateScoreText(); updateCpsText(); updateUpgradeButtons(); saveGame();
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1", {
cookies: 0,
cookiesPerTap: 1,
cookiesPerSecond: 0,
upgrades: [0, 0, 0]
});
/****
* Classes
****/
// Cookie (main clickable)
var Cookie = Container.expand(function () {
var self = Container.call(this);
// Shadow
var shadow = self.attachAsset('cookieShadow', {
anchorX: 0.5,
anchorY: 0.5,
y: 340,
x: 0
});
// Cookie
var cookie = self.attachAsset('cookie', {
anchorX: 0.5,
anchorY: 0.5,
x: 0,
y: 0
});
// Cookie pulse animation on tap
self.pulse = function () {
tween.stop(cookie, {
scaleX: true,
scaleY: true
});
cookie.scaleX = 1;
cookie.scaleY = 1;
tween(cookie, {
scaleX: 1.12,
scaleY: 0.92
}, {
duration: 80,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(cookie, {
scaleX: 1,
scaleY: 1
}, {
duration: 120,
easing: tween.easeIn
});
}
});
};
return self;
});
// Upgrade Button
var UpgradeButton = Container.expand(function () {
var self = Container.call(this);
// Button background
var bg = self.attachAsset('upgradeBtn', {
anchorX: 0.5,
anchorY: 0.5,
x: 0,
y: 0
});
// Icon
var icon = self.attachAsset('upgradeIcon', {
anchorX: 0.5,
anchorY: 0.5,
x: -120,
y: 0
});
// Title
var title = new Text2('', {
size: 54,
fill: "#fff"
});
title.anchor.set(0, 0.5);
title.x = -60;
title.y = 0;
self.addChild(title);
// Cost
var costTxt = new Text2('', {
size: 44,
fill: 0xFFE7A0
});
costTxt.anchor.set(1, 0.5);
costTxt.x = 180;
costTxt.y = 0;
self.addChild(costTxt);
// Index of upgrade
self.upgradeIndex = 0;
// Set upgrade info
self.setUpgrade = function (upgrade, index) {
self.upgradeIndex = index;
title.setText(upgrade.name);
costTxt.setText(upgrade.cost + "šŖ");
};
// Update cost display
self.setCost = function (cost) {
costTxt.setText(cost + "šŖ");
};
// Flash when can't afford
self.flashRed = function () {
tween(bg, {
tint: 0xff4444
}, {
duration: 120,
onFinish: function onFinish() {
tween(bg, {
tint: 0x6c4f2b
}, {
duration: 200
});
}
});
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x3e2c16
});
/****
* Game Code
****/
// Upgrade icon (for all upgrades, can be reused)
// Upgrade button
// Cookie shadow
// Cookie (main clickable)
// --- Game State ---
var cookies = storage.cookies || 0;
var cookiesPerTap = storage.cookiesPerTap || 1;
var cookiesPerSecond = storage.cookiesPerSecond || 0;
var upgrades = storage.upgrades || [0, 0, 0];
// --- Score State ---
var score = typeof storage.score === "number" ? storage.score : 0; // start with 0 score
var para = 0; // para (money) always equals score, updated in updateScoreText
// --- Upgrade Definitions ---
var upgradeDefs = [{
name: "Cursor",
baseCost: 15,
cost: 15,
baseCps: 0.1,
cps: 0.1,
desc: "+0.1 cookies/sec"
}, {
name: "Grandma",
baseCost: 100,
cost: 100,
baseCps: 1,
cps: 1,
desc: "+1 cookie/sec"
}, {
name: "Oven",
baseCost: 10000,
cost: 10000,
baseCps: 10,
cps: 10,
desc: "+10 cookies/sec"
}];
// --- UI Elements ---
// Cookie count text
var cookieTxt = new Text2('', {
size: 120,
fill: "#fff"
});
cookieTxt.anchor.set(0.5, 0);
cookieTxt.x = 2048 / 2;
cookieTxt.y = 0;
LK.gui.top.addChild(cookieTxt);
// Score text (top left, avoid 100x100 area)
var scoreTxt = new Text2('', {
size: 80,
fill: "#fff"
});
scoreTxt.anchor.set(0, 0);
scoreTxt.x = 110; // leave space for menu
scoreTxt.y = 0;
LK.gui.top.addChild(scoreTxt);
// Cookies per second text
var cpsTxt = new Text2('', {
size: 54,
fill: 0xFFE7A0
});
cpsTxt.anchor.set(0.5, 0);
cpsTxt.x = 2048 / 2;
cpsTxt.y = 260;
LK.gui.top.addChild(cpsTxt);
// --- Cookie (main clickable) ---
var cookie = new Cookie();
game.addChild(cookie);
cookie.x = 2048 / 2;
cookie.y = 1100;
// --- Upgrades ---
var upgradeButtons = [];
for (var i = 0; i < upgradeDefs.length; i++) {
var btn = new UpgradeButton();
btn.setUpgrade(upgradeDefs[i], i);
btn.x = 2048 / 2;
btn.y = 1700 + i * 180;
game.addChild(btn);
upgradeButtons.push(btn);
}
// --- Helper Functions ---
function updateCookieText() {
cookieTxt.setText(Math.floor(cookies) + " šŖ");
}
function updateCpsText() {
cpsTxt.setText("per second: " + cookiesPerSecond.toFixed(1));
}
function updateUpgradeButtons() {
for (var i = 0; i < upgradeButtons.length; i++) {
var def = upgradeDefs[i];
var owned = upgrades[i] || 0;
var cost = getUpgradeCost(i);
upgradeButtons[i].setCost(cost);
}
}
function getUpgradeCost(index) {
// Cost increases by 15% per purchase
var def = upgradeDefs[index];
var owned = upgrades[index] || 0;
return Math.floor(def.baseCost * Math.pow(1.15, owned));
}
function getTotalCps() {
var total = 0;
for (var i = 0; i < upgrades.length; i++) {
total += (upgrades[i] || 0) * upgradeDefs[i].cps;
}
return total;
}
function updateScoreText() {
scoreTxt.setText("Score: " + Math.floor(score));
para = score; // para always equals score
}
function saveGame() {
storage.cookies = cookies;
storage.cookiesPerTap = cookiesPerTap;
storage.cookiesPerSecond = cookiesPerSecond;
storage.upgrades = upgrades;
storage.score = score;
}
// --- Cookie Tap Handler ---
cookie.down = function (x, y, obj) {
cookies += cookiesPerTap;
// Calculate Cursor bonus: 1 base + number of Cursors owned
var cursorCount = upgrades[0] || 0;
var earned = 1 + cursorCount;
// Grandma bonus: Each Grandma gives 50% chance to earn 100 per tap
var grandmaCount = upgrades[1] || 0;
for (var i = 0; i < grandmaCount; i++) {
if (Math.random() < 0.5) {
earned += 100;
}
}
score += earned;
updateCookieText();
updateScoreText();
cookie.pulse();
saveGame();
};
// --- Upgrade Button Handlers ---
for (var i = 0; i < upgradeButtons.length; i++) {
(function (btn, idx) {
btn.down = function (x, y, obj) {
var cost = getUpgradeCost(idx);
if (cookies >= cost && score >= cost) {
cookies -= cost;
score -= cost;
if (score < 0) score = 0;
upgrades[idx] = (upgrades[idx] || 0) + 1;
cookiesPerSecond = getTotalCps();
updateCookieText();
updateScoreText();
updateCpsText();
updateUpgradeButtons();
saveGame();
// Button pulse
tween(btn, {
scaleX: 1.08,
scaleY: 1.08
}, {
duration: 80,
onFinish: function onFinish() {
tween(btn, {
scaleX: 1,
scaleY: 1
}, {
duration: 120
});
}
});
// Win condition: if Oven (idx==2) is purchased, show win
if (idx === 2) {
LK.showYouWin();
}
} else {
btn.flashRed();
}
};
})(upgradeButtons[i], i);
}
// --- Game Update Loop ---
game.update = function () {
// Add cookies per second
if (cookiesPerSecond > 0) {
// 60 ticks per second
cookies += cookiesPerSecond / 60;
updateCookieText();
}
// Save every 2 seconds
if (LK.ticks % 120 === 0) {
saveGame();
}
};
// --- Initial UI Update ---
cookiesPerSecond = getTotalCps();
updateCookieText();
updateScoreText();
updateCpsText();
updateUpgradeButtons();
saveGame();