/****
* 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();