User prompt
Please fix the bug: 'TypeError: easing is not a function. (In 'easing(t)', 'easing' is "easeOutBack")' in or related to this line: 'tween(panel, {' Line Number: 1439 ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Make the upgrade button take you to a new screen with a frame saying upgrades
User prompt
Make the upgrade tab appear in the middle
User prompt
Delete the hire staff upgrade
User prompt
Delete the studio equipment upgrade
User prompt
Please fix the bug: 'ReferenceError: Can't find variable: memeUpgradeButton' in or related to this line: 'memeUpgradeButton.enable();' Line Number: 1890
User prompt
Delete the meme quality upgrade
User prompt
Delete the 3 upgrade buttons, not the upgrade button thats under the create videos button
User prompt
Delete the upgrade buttons
User prompt
Make a new button under the create videos buttons named upgrades
User prompt
Make it so the buttons arent darker than the others
User prompt
Make the buttons not locked anymore
User prompt
Make the sliding puzle locked if you dont have over 250 subscribers
User prompt
Make it so instead kf the sliding puzzle being numbers, make it the meme3 asset
User prompt
Make a puzzle game otion in the create video game selection
User prompt
Make it so when you have 100 subscribers or more, the matching game is no longer locked and it is its normal color
User prompt
Make the 100 followers needed text bigger
User prompt
Make it so in the create video game selection, you can only play the matching game if you have over 100 followers, if you have under 100 followers it is locked and it says 100 followers needed
User prompt
Make a button on the bottom left hand corner say reset progress, and if you click it, it resets all your progress, including your upgrdaes bought, your monye, and your followers ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
Make the connect 4 ai smarter
User prompt
Niw create a matching game choice in the create video selection screen
User prompt
Ok now the connect 4 game doesnt work, pls fix
User prompt
The create video button doesnt work
User prompt
Make it so when you press the create video button, it takes you to a new screen that asks you what game you want to play and record, the first game choice i will add is a game of connect 4. When you press the connect 4 button, it takes you tk play connect 4 against a bot. Whenever the game ends doesnt matter who won, the video gets uploaded and you get more followers and money than a regular meme.
User prompt
Little little bit higher
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1", { money: 100, followers: 0, memeLevel: 1, studioLevel: 1, staffLevel: 0, marketingLevel: 0, autoEarningRate: 0, lastPlayed: "undefined" }); /**** * Classes ****/ var Button = Container.expand(function (text, width, height, color) { var self = Container.call(this); var buttonShape = self.attachAsset('button', { width: width || 600, height: height || 200, color: color || 0x4CAF50, anchorX: 0.5, anchorY: 0.5 }); var buttonText = new Text2(text, { size: 60, fill: 0xFFFFFF }); buttonText.anchor.set(0.5, 0.5); self.addChild(buttonText); self.setText = function (newText) { buttonText.setText(newText); }; self.setColor = function (newColor) { buttonShape.tint = newColor; }; self.down = function (x, y, obj) { tween(buttonShape, { scaleX: 0.95, scaleY: 0.95 }, { duration: 100 }); LK.getSound('click').play(); }; self.up = function (x, y, obj) { tween(buttonShape, { scaleX: 1, scaleY: 1 }, { duration: 100 }); }; return self; }); var MemeStudio = Container.expand(function () { var self = Container.call(this); var studioBackground = self.attachAsset('studioBackground', { anchorX: 0.5, anchorY: 0.5, height: 1800 }); var memeCanvas = self.attachAsset('memeCanvas', { anchorX: 0.5, anchorY: 0.5, width: 400, height: 400, y: -250 }); var memeText = new Text2("Your Meme Here", { size: 54, fill: 0x000000 }); memeText.anchor.set(0.5, 0.5); memeText.y = -250; self.addChild(memeText); // Current displayed meme asset var currentMemeAsset = null; // Function to display a random meme function displayRandomMeme() { // Remove previous meme if exists if (currentMemeAsset) { self.removeChild(currentMemeAsset); } // Generate random number between 1-4 to select a meme var memeNumber = Math.floor(Math.random() * 4) + 1; var memeId = 'Meme' + memeNumber; // Create the new meme asset currentMemeAsset = LK.getAsset(memeId, { anchorX: 0.5, anchorY: 0.5, y: -250, width: 400, height: 400 }); // Add the meme to display self.addChild(currentMemeAsset); } var earningsText = new Text2("Earnings: $0", { size: 48, fill: 0x333333 }); earningsText.anchor.set(0.5, 0.5); earningsText.y = 20; self.addChild(earningsText); var createButton = new Button("Create Meme!", 420, 130, 0x4CAF50); createButton.y = 150; self.addChild(createButton); var createVideoButton = new Button("Create Video", 420, 130, 0x4CAF50); createVideoButton.y = 270; self.addChild(createVideoButton); var followerGainText = new Text2("+0 followers", { size: 42, fill: 0xFF5733 }); followerGainText.anchor.set(0.5, 0.5); followerGainText.y = 250; followerGainText.alpha = 0; self.addChild(followerGainText); // Update the meme canvas based on current studio level self.updateMemeQuality = function (level) { var quality = ["Potato Quality", "Standard Meme", "HD Meme", "Ultra HD Meme", "Viral-Ready Meme"]; var colors = [0xCCCCCC, 0xFFFFFF, 0xFFFFDD, 0xDDFFFF, 0xFFDDFF]; if (level > quality.length) { level = quality.length; } memeText.setText(quality[level - 1]); memeCanvas.tint = colors[level - 1]; // Scale the meme canvas slightly with each level var scale = 1 + (level - 1) * 0.1; memeCanvas.scale.set(scale, scale); }; // Show the earnings animation self.showEarnings = function (amount, followers) { earningsText.setText("Earnings: $" + amount); tween(earningsText, { scaleX: 1.3, scaleY: 1.3 }, { duration: 300, onFinish: function onFinish() { tween(earningsText, { scaleX: 1, scaleY: 1 }, { duration: 300 }); } }); if (followers > 0) { followerGainText.setText("+" + followers + " followers"); followerGainText.alpha = 1; tween(followerGainText, { y: 230, alpha: 0 }, { duration: 1500 }); } }; self.setCreateButtonCallback = function (callback) { createButton.up = function (x, y, obj) { tween(createButton, { scaleX: 1, scaleY: 1 }, { duration: 100 }); // Display a random meme when creating a new meme displayRandomMeme(); if (callback) { callback(); } }; }; return self; }); var TabSystem = Container.expand(function (tabs) { var self = Container.call(this); var tabButtons = []; var tabContents = []; var activeTab = 0; // Create tab buttons for (var i = 0; i < tabs.length; i++) { var tab = tabs[i]; var index = i; var tabButton = new Button(tab.name, 240, 80, 0x607D8B); tabButton.x = i * 320 - (tabs.length - 1) * 160; tabButton.y = -1300 / 2 + 30; tabButton.up = function (x, y, obj) { tween(tabButton, { scaleX: 1, scaleY: 1 }, { duration: 100 }); setActiveTab(index); }; self.addChild(tabButton); tabButtons.push(tabButton); // Create and add content container var content = tab.content; content.visible = i === 0; // Only first tab visible initially self.addChild(content); tabContents.push(content); } function setActiveTab(index) { if (index === activeTab) { return; } // Update button colors tabButtons[activeTab].setColor(0x607D8B); tabButtons[index].setColor(0x2196F3); // Hide old content, show new tabContents[activeTab].visible = false; tabContents[index].visible = true; activeTab = index; } // Initialize first tab as active setActiveTab(0); return self; }); var UpgradeButton = Container.expand(function (title, description, price, level, onUpgrade) { var self = Container.call(this); var buttonShape = self.attachAsset('upgradeButton', { anchorX: 0.5, anchorY: 0.5, width: 420, height: 140 }); var titleText = new Text2(title, { size: 42, fill: 0xFFFFFF }); titleText.anchor.set(0.5, 0); titleText.y = -buttonShape.height / 2 + 15; self.addChild(titleText); var descText = new Text2(description, { size: 30, fill: 0xFFFFFF }); descText.anchor.set(0.5, 0); descText.y = -buttonShape.height / 2 + 50; self.addChild(descText); var levelText = new Text2("Level: " + level, { size: 34, fill: 0xFFD700 }); levelText.anchor.set(0, 1); levelText.x = -buttonShape.width / 2 + 15; levelText.y = buttonShape.height / 2 - 10; self.addChild(levelText); var priceText = new Text2("$" + price, { size: 36, fill: 0xFFD700 }); priceText.anchor.set(1, 1); priceText.x = buttonShape.width / 2 - 15; priceText.y = buttonShape.height / 2 - 10; self.addChild(priceText); self.updateLevel = function (newLevel) { levelText.setText("Level: " + newLevel); }; self.updatePrice = function (newPrice) { priceText.setText("$" + newPrice); }; self.disable = function () { buttonShape.tint = 0x888888; self.interactive = false; }; self.enable = function () { buttonShape.tint = 0x2196F3; self.interactive = true; }; self.down = function (x, y, obj) { tween(buttonShape, { scaleX: 0.95, scaleY: 0.95 }, { duration: 100 }); LK.getSound('click').play(); }; self.up = function (x, y, obj) { tween(buttonShape, { scaleX: 1, scaleY: 1 }, { duration: 100 }); if (onUpgrade) { onUpgrade(); } }; return self; }); var UpgradePanel = Container.expand(function () { var self = Container.call(this); var background = self.attachAsset('studioBackground', { anchorX: 0.5, anchorY: 0.5, width: 1600, height: 1000, color: 0xdddddd }); var titleText = new Text2("Upgrade Your Channel", { size: 64, fill: 0x333333 }); titleText.anchor.set(0.5, 0); titleText.y = -background.height / 2 + 50; self.addChild(titleText); var closeButton = new Button("Close", 240, 80, 0xff5555); closeButton.x = background.width / 2 - 130; closeButton.y = -background.height / 2 + 50; self.addChild(closeButton); self.setCloseCallback = function (callback) { closeButton.up = function (x, y, obj) { tween(closeButton, { scaleX: 1, scaleY: 1 }, { duration: 100 }); if (callback) { callback(); } }; }; self.addUpgradeButton = function (title, description, price, level, maxLevel, x, y, onUpgrade) { var button = new UpgradeButton(title, description, price, level, function () { if (onUpgrade) { onUpgrade(button); } }); button.x = x; button.y = y; if (maxLevel !== undefined && level >= maxLevel) { button.updatePrice("MAXED"); button.disable(); } self.addChild(button); return button; }; return self; }); var UpgradeScreen = Container.expand(function () { var self = Container.call(this); // Semi-transparent background var overlay = LK.getAsset('studioBackground', { anchorX: 0.5, anchorY: 0.5, width: 2048, height: 2732, color: 0x000000 }); overlay.alpha = 0.7; self.addChild(overlay); var panel = new UpgradePanel(); panel.y = 0; self.addChild(panel); var qualityButton, membershipButton, staffButton, equipmentButton; self.initialize = function (game, prices, levels) { // Quality upgrade button qualityButton = panel.addUpgradeButton("Video Quality", "Better videos = more subscribers", prices.quality, levels.quality, undefined, -600, 100, function (button) { if (game.money >= prices.quality) { game.money -= prices.quality; levels.quality++; prices.quality = Math.floor(prices.quality * 1.5); button.updateLevel(levels.quality); button.updatePrice(prices.quality); LK.getSound('levelUp').play(); game.memeLevel = levels.quality; game.updateStorage(); } }); // Membership upgrade button membershipButton = panel.addUpgradeButton("Membership", "One-time: +50% money per video", prices.membership, levels.membership, 1, -600, 250, function (button) { if (game.money >= prices.membership && levels.membership === 0) { game.money -= prices.membership; levels.membership = 1; button.updateLevel(levels.membership); button.updatePrice("MAXED"); button.disable(); LK.getSound('levelUp').play(); game.updateStorage(); } }); // Staff upgrade button - centered in the screen (x: 0) staffButton = panel.addUpgradeButton("Hire Staff", "More staff = faster auto-uploads", prices.staff, levels.staff, undefined, 600, 100, function (button) { if (game.money >= prices.staff) { game.money -= prices.staff; levels.staff++; prices.staff = Math.floor(prices.staff * 1.5); button.updateLevel(levels.staff); button.updatePrice(prices.staff); LK.getSound('levelUp').play(); game.staffLevel = levels.staff; game.updateAutoEarningRate(); game.updateStorage(); } }); // Equipment upgrade button - centered in the screen (x: 0) equipmentButton = panel.addUpgradeButton("Equipment", "Better gear = quality & income boost", prices.equipment, levels.equipment, undefined, 600, 250, function (button) { if (game.money >= prices.equipment) { game.money -= prices.equipment; levels.equipment++; prices.equipment = Math.floor(prices.equipment * 1.5); button.updateLevel(levels.equipment); button.updatePrice(prices.equipment); LK.getSound('levelUp').play(); game.studioLevel = levels.equipment; game.updateStorage(); } }); panel.setCloseCallback(function () { self.visible = false; }); }; self.show = function () { self.visible = true; tween(panel, { scaleX: 1, scaleY: 1, alpha: 1 }, { duration: 300 }); }; self.updateButtons = function (game, prices) { // Enable/disable buttons based on available money if (qualityButton) { if (game.money >= prices.quality) { qualityButton.enable(); } else { qualityButton.disable(); } } if (staffButton) { if (game.money >= prices.staff) { staffButton.enable(); } else { staffButton.disable(); } } if (equipmentButton) { if (game.money >= prices.equipment) { equipmentButton.enable(); } else { equipmentButton.disable(); } } if (membershipButton && game.levels.membership === 0) { if (game.money >= prices.membership) { membershipButton.enable(); } else { membershipButton.disable(); } } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x87CEEB }); /**** * Game Code ****/ // Game variables var money = storage.money || 100; var followers = storage.followers || 0; var memeLevel = storage.memeLevel || 1; var studioLevel = storage.studioLevel || 1; var staffLevel = storage.staffLevel || 0; var marketingLevel = storage.marketingLevel || 0; var autoEarningRate = storage.autoEarningRate || 0; var lastPlayed = storage.lastPlayed || Date.now(); var membershipLevel = storage.membershipLevel || 0; var equipmentLevel = storage.equipmentLevel || 1; // Upgrade prices var upgradePrices = { quality: calculateUpgradeCost(1, memeLevel), membership: 500, staff: calculateUpgradeCost(3, staffLevel), equipment: calculateUpgradeCost(2, studioLevel) }; // Upgrade levels var upgradeLevels = { quality: memeLevel, membership: membershipLevel, staff: staffLevel, equipment: studioLevel }; // Constants var MEME_BASE_INCOME = 10; var MEME_BASE_FOLLOWERS = 5; var UPGRADE_BASE_COST = 100; var AUTO_EARNINGS_INTERVAL = 20000; // ms (20 seconds) var OFFLINE_EARNINGS_MAX_HOURS = 24; // Calculate offline earnings function calculateOfflineEarnings() { var now = Date.now(); var timeDiff = now - lastPlayed; var secondsDiff = timeDiff / 1000; var periods = secondsDiff / 20; // How many 20-second periods elapsed // Cap at max hours (converted to 20-second periods) var maxPeriods = OFFLINE_EARNINGS_MAX_HOURS * 60 * 60 / 20; if (periods > maxPeriods) { periods = maxPeriods; } // Only calculate if we have auto earnings if (autoEarningRate > 0 && periods > 0) { var hourlyRate = autoEarningRate; var periodRate = hourlyRate / 180; // Convert from hourly to per 20-second period var earnings = Math.floor(periodRate * periods); money += earnings; // Show welcome back message here if needed console.log("Welcome back! You earned $" + earnings + " while away."); } lastPlayed = now; storage.lastPlayed = now; } // Calculate costs for upgrades function calculateUpgradeCost(baseLevel, currentLevel) { return Math.floor(UPGRADE_BASE_COST * baseLevel * Math.pow(1.5, currentLevel)); } // Update storage function updateStorage() { storage.money = money; storage.followers = followers; storage.memeLevel = memeLevel; storage.studioLevel = studioLevel; storage.staffLevel = staffLevel; storage.marketingLevel = marketingLevel; storage.autoEarningRate = autoEarningRate; storage.membershipLevel = membershipLevel; } // Calculate meme creation result function createMeme() { // Base earnings affected by meme quality and studio level var earnings = MEME_BASE_INCOME * memeLevel * (1 + studioLevel * 0.5); // Followers gained affected by marketing level var newFollowers = Math.floor(MEME_BASE_FOLLOWERS * (1 + marketingLevel * 0.5)); // Boost from followers (virality factor) var followerBoost = 1 + followers / 1000; earnings = Math.floor(earnings * followerBoost); // Apply membership bonus if active if (membershipLevel > 0) { earnings = Math.floor(earnings * 1.5); } // Apply randomness for variability (80% to 120% of calculated value) var randomFactor = 0.8 + Math.random() * 0.4; earnings = Math.floor(earnings * randomFactor); // Small chance for meme to go viral if (Math.random() < 0.05) { earnings *= 5; newFollowers *= 3; console.log("Your meme went viral!"); } // Update game state money += earnings; followers += newFollowers; // Update storage updateStorage(); // Return results return { earnings: earnings, followers: newFollowers }; } // Update auto earnings rate based on staff function updateAutoEarningRate() { autoEarningRate = staffLevel * 250 * memeLevel * studioLevel; // MASSIVELY increased earning rate storage.autoEarningRate = autoEarningRate; } // Create video button under the create meme button var createVideoButton = new Button("Create Video", 400, 130, 0x4CAF50); createVideoButton.x = 2048 / 2; createVideoButton.y = 2732 / 2 + 350; createVideoButton.up = function (x, y, obj) { tween(createVideoButton, { scaleX: 1, scaleY: 1 }, { duration: 100 }); LK.getSound('click').play(); // Add video creation functionality here if needed }; game.addChild(createVideoButton); // Create UI elements // Main studio var memeStudio = new MemeStudio(); memeStudio.x = 2048 / 2; memeStudio.y = 2732 / 2; game.addChild(memeStudio); // Initialize with current meme quality memeStudio.updateMemeQuality(memeLevel); // Stats display var statsContainer = new Container(); statsContainer.x = 2048 / 2; statsContainer.y = 180; game.addChild(statsContainer); var moneyIcon = LK.getAsset('moneyIcon', { anchorX: 0.5, anchorY: 0.5, x: -600 }); statsContainer.addChild(moneyIcon); var moneyText = new Text2("$" + money, { size: 54, fill: 0x000000 }); moneyText.anchor.set(0, 0.5); moneyText.x = -570; statsContainer.addChild(moneyText); var followerIcon = LK.getAsset('followerIcon', { anchorX: 0.5, anchorY: 0.5, x: 400 }); statsContainer.addChild(followerIcon); var followerText = new Text2(followers + " followers", { size: 54, fill: 0x000000 }); followerText.anchor.set(0, 0.5); followerText.x = 430; statsContainer.addChild(followerText); var autoEarningText = new Text2("", { size: 36, fill: 0x333333 }); autoEarningText.anchor.set(0.5, 0.5); autoEarningText.y = 80; statsContainer.addChild(autoEarningText); // Create upgrade tab contents var studioContent = new Container(); // Meme Quality Upgrade var memeUpgradeButton = new UpgradeButton("Meme Quality", "Better memes = more $$$", calculateUpgradeCost(1, memeLevel), memeLevel, function () { var cost = calculateUpgradeCost(1, memeLevel); if (money >= cost) { money -= cost; memeLevel++; memeUpgradeButton.updateLevel(memeLevel); memeUpgradeButton.updatePrice(calculateUpgradeCost(1, memeLevel)); memeStudio.updateMemeQuality(memeLevel); updateAutoEarningRate(); updateStorage(); LK.getSound('levelUp').play(); } }); memeUpgradeButton.x = -700; memeUpgradeButton.y = 0; studioContent.addChild(memeUpgradeButton); // Studio Upgrade var studioUpgradeButton = new UpgradeButton("Studio Equipment", "Better equipment = better production", calculateUpgradeCost(2, studioLevel), studioLevel, function () { var cost = calculateUpgradeCost(2, studioLevel); if (money >= cost) { money -= cost; studioLevel++; studioUpgradeButton.updateLevel(studioLevel); studioUpgradeButton.updatePrice(calculateUpgradeCost(2, studioLevel)); updateStorage(); LK.getSound('levelUp').play(); } }); studioUpgradeButton.x = 0; studioUpgradeButton.y = 0; studioContent.addChild(studioUpgradeButton); // Staff Upgrade var staffUpgradeButton = new UpgradeButton("Hire Staff", "More staff = MASSIVE auto-income", calculateUpgradeCost(3, staffLevel), staffLevel, function () { var cost = calculateUpgradeCost(3, staffLevel); if (money >= cost) { money -= cost; staffLevel++; staffUpgradeButton.updateLevel(staffLevel); staffUpgradeButton.updatePrice(calculateUpgradeCost(3, staffLevel)); updateAutoEarningRate(); updateStorage(); LK.getSound('levelUp').play(); } }); staffUpgradeButton.x = 700; staffUpgradeButton.y = 0; studioContent.addChild(staffUpgradeButton); // Create upgrade screen (initially hidden) var upgradeScreen = new UpgradeScreen(); upgradeScreen.visible = false; game.addChild(upgradeScreen); // Initialize upgrade screen upgradeScreen.initialize(game, upgradePrices, upgradeLevels); // Studio content is displayed directly without tabs studioContent.x = 2048 / 2; studioContent.y = 2732 / 2 + 400; game.addChild(studioContent); // Set callback for create meme button memeStudio.setCreateButtonCallback(function () { var result = createMeme(); memeStudio.showEarnings(result.earnings, result.followers); LK.getSound('coin').play(); }); // Start background music LK.playMusic('bgMusic', { fade: { start: 0, end: 0.4, duration: 1000 } }); // Calculate any offline earnings when game starts calculateOfflineEarnings(); // Set up auto earning timer var lastAutoEarningTime = Date.now(); // Update UI with current values function updateUI() { moneyText.setText("$" + Math.floor(money)); followerText.setText(Math.floor(followers) + " followers"); if (autoEarningRate > 0) { autoEarningText.setText("Auto earning: $" + Math.floor(autoEarningRate / 180) + " / 20 seconds"); } else { autoEarningText.setText(""); } } // Add game reference to global scope so it can be accessed from upgradeScreen game.money = money; game.memeLevel = memeLevel; game.studioLevel = studioLevel; game.staffLevel = staffLevel; game.levels = upgradeLevels; game.updateStorage = updateStorage; game.updateAutoEarningRate = updateAutoEarningRate; // Main game update loop game.update = function () { // Handle auto earnings var now = Date.now(); var elapsed = now - lastAutoEarningTime; if (elapsed >= AUTO_EARNINGS_INTERVAL && autoEarningRate > 0) { // Calculate earnings for this period (20 seconds is 1/180th of an hour) var earnings = Math.floor(autoEarningRate / 180); if (earnings > 0) { money += earnings; lastAutoEarningTime = now; updateStorage(); } } // Update UI elements updateUI(); // Sync game reference values game.money = money; // Update upgrade screen buttons if visible if (upgradeScreen.visible) { upgradeScreen.updateButtons(game, upgradePrices); } // Enable/disable upgrade buttons based on available money if (money >= calculateUpgradeCost(1, memeLevel)) { memeUpgradeButton.enable(); } else { memeUpgradeButton.disable(); } if (money >= calculateUpgradeCost(2, studioLevel)) { studioUpgradeButton.enable(); } else { studioUpgradeButton.disable(); } if (money >= calculateUpgradeCost(3, staffLevel)) { staffUpgradeButton.enable(); } else { staffUpgradeButton.disable(); } };
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1", {
money: 100,
followers: 0,
memeLevel: 1,
studioLevel: 1,
staffLevel: 0,
marketingLevel: 0,
autoEarningRate: 0,
lastPlayed: "undefined"
});
/****
* Classes
****/
var Button = Container.expand(function (text, width, height, color) {
var self = Container.call(this);
var buttonShape = self.attachAsset('button', {
width: width || 600,
height: height || 200,
color: color || 0x4CAF50,
anchorX: 0.5,
anchorY: 0.5
});
var buttonText = new Text2(text, {
size: 60,
fill: 0xFFFFFF
});
buttonText.anchor.set(0.5, 0.5);
self.addChild(buttonText);
self.setText = function (newText) {
buttonText.setText(newText);
};
self.setColor = function (newColor) {
buttonShape.tint = newColor;
};
self.down = function (x, y, obj) {
tween(buttonShape, {
scaleX: 0.95,
scaleY: 0.95
}, {
duration: 100
});
LK.getSound('click').play();
};
self.up = function (x, y, obj) {
tween(buttonShape, {
scaleX: 1,
scaleY: 1
}, {
duration: 100
});
};
return self;
});
var MemeStudio = Container.expand(function () {
var self = Container.call(this);
var studioBackground = self.attachAsset('studioBackground', {
anchorX: 0.5,
anchorY: 0.5,
height: 1800
});
var memeCanvas = self.attachAsset('memeCanvas', {
anchorX: 0.5,
anchorY: 0.5,
width: 400,
height: 400,
y: -250
});
var memeText = new Text2("Your Meme Here", {
size: 54,
fill: 0x000000
});
memeText.anchor.set(0.5, 0.5);
memeText.y = -250;
self.addChild(memeText);
// Current displayed meme asset
var currentMemeAsset = null;
// Function to display a random meme
function displayRandomMeme() {
// Remove previous meme if exists
if (currentMemeAsset) {
self.removeChild(currentMemeAsset);
}
// Generate random number between 1-4 to select a meme
var memeNumber = Math.floor(Math.random() * 4) + 1;
var memeId = 'Meme' + memeNumber;
// Create the new meme asset
currentMemeAsset = LK.getAsset(memeId, {
anchorX: 0.5,
anchorY: 0.5,
y: -250,
width: 400,
height: 400
});
// Add the meme to display
self.addChild(currentMemeAsset);
}
var earningsText = new Text2("Earnings: $0", {
size: 48,
fill: 0x333333
});
earningsText.anchor.set(0.5, 0.5);
earningsText.y = 20;
self.addChild(earningsText);
var createButton = new Button("Create Meme!", 420, 130, 0x4CAF50);
createButton.y = 150;
self.addChild(createButton);
var createVideoButton = new Button("Create Video", 420, 130, 0x4CAF50);
createVideoButton.y = 270;
self.addChild(createVideoButton);
var followerGainText = new Text2("+0 followers", {
size: 42,
fill: 0xFF5733
});
followerGainText.anchor.set(0.5, 0.5);
followerGainText.y = 250;
followerGainText.alpha = 0;
self.addChild(followerGainText);
// Update the meme canvas based on current studio level
self.updateMemeQuality = function (level) {
var quality = ["Potato Quality", "Standard Meme", "HD Meme", "Ultra HD Meme", "Viral-Ready Meme"];
var colors = [0xCCCCCC, 0xFFFFFF, 0xFFFFDD, 0xDDFFFF, 0xFFDDFF];
if (level > quality.length) {
level = quality.length;
}
memeText.setText(quality[level - 1]);
memeCanvas.tint = colors[level - 1];
// Scale the meme canvas slightly with each level
var scale = 1 + (level - 1) * 0.1;
memeCanvas.scale.set(scale, scale);
};
// Show the earnings animation
self.showEarnings = function (amount, followers) {
earningsText.setText("Earnings: $" + amount);
tween(earningsText, {
scaleX: 1.3,
scaleY: 1.3
}, {
duration: 300,
onFinish: function onFinish() {
tween(earningsText, {
scaleX: 1,
scaleY: 1
}, {
duration: 300
});
}
});
if (followers > 0) {
followerGainText.setText("+" + followers + " followers");
followerGainText.alpha = 1;
tween(followerGainText, {
y: 230,
alpha: 0
}, {
duration: 1500
});
}
};
self.setCreateButtonCallback = function (callback) {
createButton.up = function (x, y, obj) {
tween(createButton, {
scaleX: 1,
scaleY: 1
}, {
duration: 100
});
// Display a random meme when creating a new meme
displayRandomMeme();
if (callback) {
callback();
}
};
};
return self;
});
var TabSystem = Container.expand(function (tabs) {
var self = Container.call(this);
var tabButtons = [];
var tabContents = [];
var activeTab = 0;
// Create tab buttons
for (var i = 0; i < tabs.length; i++) {
var tab = tabs[i];
var index = i;
var tabButton = new Button(tab.name, 240, 80, 0x607D8B);
tabButton.x = i * 320 - (tabs.length - 1) * 160;
tabButton.y = -1300 / 2 + 30;
tabButton.up = function (x, y, obj) {
tween(tabButton, {
scaleX: 1,
scaleY: 1
}, {
duration: 100
});
setActiveTab(index);
};
self.addChild(tabButton);
tabButtons.push(tabButton);
// Create and add content container
var content = tab.content;
content.visible = i === 0; // Only first tab visible initially
self.addChild(content);
tabContents.push(content);
}
function setActiveTab(index) {
if (index === activeTab) {
return;
}
// Update button colors
tabButtons[activeTab].setColor(0x607D8B);
tabButtons[index].setColor(0x2196F3);
// Hide old content, show new
tabContents[activeTab].visible = false;
tabContents[index].visible = true;
activeTab = index;
}
// Initialize first tab as active
setActiveTab(0);
return self;
});
var UpgradeButton = Container.expand(function (title, description, price, level, onUpgrade) {
var self = Container.call(this);
var buttonShape = self.attachAsset('upgradeButton', {
anchorX: 0.5,
anchorY: 0.5,
width: 420,
height: 140
});
var titleText = new Text2(title, {
size: 42,
fill: 0xFFFFFF
});
titleText.anchor.set(0.5, 0);
titleText.y = -buttonShape.height / 2 + 15;
self.addChild(titleText);
var descText = new Text2(description, {
size: 30,
fill: 0xFFFFFF
});
descText.anchor.set(0.5, 0);
descText.y = -buttonShape.height / 2 + 50;
self.addChild(descText);
var levelText = new Text2("Level: " + level, {
size: 34,
fill: 0xFFD700
});
levelText.anchor.set(0, 1);
levelText.x = -buttonShape.width / 2 + 15;
levelText.y = buttonShape.height / 2 - 10;
self.addChild(levelText);
var priceText = new Text2("$" + price, {
size: 36,
fill: 0xFFD700
});
priceText.anchor.set(1, 1);
priceText.x = buttonShape.width / 2 - 15;
priceText.y = buttonShape.height / 2 - 10;
self.addChild(priceText);
self.updateLevel = function (newLevel) {
levelText.setText("Level: " + newLevel);
};
self.updatePrice = function (newPrice) {
priceText.setText("$" + newPrice);
};
self.disable = function () {
buttonShape.tint = 0x888888;
self.interactive = false;
};
self.enable = function () {
buttonShape.tint = 0x2196F3;
self.interactive = true;
};
self.down = function (x, y, obj) {
tween(buttonShape, {
scaleX: 0.95,
scaleY: 0.95
}, {
duration: 100
});
LK.getSound('click').play();
};
self.up = function (x, y, obj) {
tween(buttonShape, {
scaleX: 1,
scaleY: 1
}, {
duration: 100
});
if (onUpgrade) {
onUpgrade();
}
};
return self;
});
var UpgradePanel = Container.expand(function () {
var self = Container.call(this);
var background = self.attachAsset('studioBackground', {
anchorX: 0.5,
anchorY: 0.5,
width: 1600,
height: 1000,
color: 0xdddddd
});
var titleText = new Text2("Upgrade Your Channel", {
size: 64,
fill: 0x333333
});
titleText.anchor.set(0.5, 0);
titleText.y = -background.height / 2 + 50;
self.addChild(titleText);
var closeButton = new Button("Close", 240, 80, 0xff5555);
closeButton.x = background.width / 2 - 130;
closeButton.y = -background.height / 2 + 50;
self.addChild(closeButton);
self.setCloseCallback = function (callback) {
closeButton.up = function (x, y, obj) {
tween(closeButton, {
scaleX: 1,
scaleY: 1
}, {
duration: 100
});
if (callback) {
callback();
}
};
};
self.addUpgradeButton = function (title, description, price, level, maxLevel, x, y, onUpgrade) {
var button = new UpgradeButton(title, description, price, level, function () {
if (onUpgrade) {
onUpgrade(button);
}
});
button.x = x;
button.y = y;
if (maxLevel !== undefined && level >= maxLevel) {
button.updatePrice("MAXED");
button.disable();
}
self.addChild(button);
return button;
};
return self;
});
var UpgradeScreen = Container.expand(function () {
var self = Container.call(this);
// Semi-transparent background
var overlay = LK.getAsset('studioBackground', {
anchorX: 0.5,
anchorY: 0.5,
width: 2048,
height: 2732,
color: 0x000000
});
overlay.alpha = 0.7;
self.addChild(overlay);
var panel = new UpgradePanel();
panel.y = 0;
self.addChild(panel);
var qualityButton, membershipButton, staffButton, equipmentButton;
self.initialize = function (game, prices, levels) {
// Quality upgrade button
qualityButton = panel.addUpgradeButton("Video Quality", "Better videos = more subscribers", prices.quality, levels.quality, undefined, -600, 100, function (button) {
if (game.money >= prices.quality) {
game.money -= prices.quality;
levels.quality++;
prices.quality = Math.floor(prices.quality * 1.5);
button.updateLevel(levels.quality);
button.updatePrice(prices.quality);
LK.getSound('levelUp').play();
game.memeLevel = levels.quality;
game.updateStorage();
}
});
// Membership upgrade button
membershipButton = panel.addUpgradeButton("Membership", "One-time: +50% money per video", prices.membership, levels.membership, 1, -600, 250, function (button) {
if (game.money >= prices.membership && levels.membership === 0) {
game.money -= prices.membership;
levels.membership = 1;
button.updateLevel(levels.membership);
button.updatePrice("MAXED");
button.disable();
LK.getSound('levelUp').play();
game.updateStorage();
}
});
// Staff upgrade button - centered in the screen (x: 0)
staffButton = panel.addUpgradeButton("Hire Staff", "More staff = faster auto-uploads", prices.staff, levels.staff, undefined, 600, 100, function (button) {
if (game.money >= prices.staff) {
game.money -= prices.staff;
levels.staff++;
prices.staff = Math.floor(prices.staff * 1.5);
button.updateLevel(levels.staff);
button.updatePrice(prices.staff);
LK.getSound('levelUp').play();
game.staffLevel = levels.staff;
game.updateAutoEarningRate();
game.updateStorage();
}
});
// Equipment upgrade button - centered in the screen (x: 0)
equipmentButton = panel.addUpgradeButton("Equipment", "Better gear = quality & income boost", prices.equipment, levels.equipment, undefined, 600, 250, function (button) {
if (game.money >= prices.equipment) {
game.money -= prices.equipment;
levels.equipment++;
prices.equipment = Math.floor(prices.equipment * 1.5);
button.updateLevel(levels.equipment);
button.updatePrice(prices.equipment);
LK.getSound('levelUp').play();
game.studioLevel = levels.equipment;
game.updateStorage();
}
});
panel.setCloseCallback(function () {
self.visible = false;
});
};
self.show = function () {
self.visible = true;
tween(panel, {
scaleX: 1,
scaleY: 1,
alpha: 1
}, {
duration: 300
});
};
self.updateButtons = function (game, prices) {
// Enable/disable buttons based on available money
if (qualityButton) {
if (game.money >= prices.quality) {
qualityButton.enable();
} else {
qualityButton.disable();
}
}
if (staffButton) {
if (game.money >= prices.staff) {
staffButton.enable();
} else {
staffButton.disable();
}
}
if (equipmentButton) {
if (game.money >= prices.equipment) {
equipmentButton.enable();
} else {
equipmentButton.disable();
}
}
if (membershipButton && game.levels.membership === 0) {
if (game.money >= prices.membership) {
membershipButton.enable();
} else {
membershipButton.disable();
}
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87CEEB
});
/****
* Game Code
****/
// Game variables
var money = storage.money || 100;
var followers = storage.followers || 0;
var memeLevel = storage.memeLevel || 1;
var studioLevel = storage.studioLevel || 1;
var staffLevel = storage.staffLevel || 0;
var marketingLevel = storage.marketingLevel || 0;
var autoEarningRate = storage.autoEarningRate || 0;
var lastPlayed = storage.lastPlayed || Date.now();
var membershipLevel = storage.membershipLevel || 0;
var equipmentLevel = storage.equipmentLevel || 1;
// Upgrade prices
var upgradePrices = {
quality: calculateUpgradeCost(1, memeLevel),
membership: 500,
staff: calculateUpgradeCost(3, staffLevel),
equipment: calculateUpgradeCost(2, studioLevel)
};
// Upgrade levels
var upgradeLevels = {
quality: memeLevel,
membership: membershipLevel,
staff: staffLevel,
equipment: studioLevel
};
// Constants
var MEME_BASE_INCOME = 10;
var MEME_BASE_FOLLOWERS = 5;
var UPGRADE_BASE_COST = 100;
var AUTO_EARNINGS_INTERVAL = 20000; // ms (20 seconds)
var OFFLINE_EARNINGS_MAX_HOURS = 24;
// Calculate offline earnings
function calculateOfflineEarnings() {
var now = Date.now();
var timeDiff = now - lastPlayed;
var secondsDiff = timeDiff / 1000;
var periods = secondsDiff / 20; // How many 20-second periods elapsed
// Cap at max hours (converted to 20-second periods)
var maxPeriods = OFFLINE_EARNINGS_MAX_HOURS * 60 * 60 / 20;
if (periods > maxPeriods) {
periods = maxPeriods;
}
// Only calculate if we have auto earnings
if (autoEarningRate > 0 && periods > 0) {
var hourlyRate = autoEarningRate;
var periodRate = hourlyRate / 180; // Convert from hourly to per 20-second period
var earnings = Math.floor(periodRate * periods);
money += earnings;
// Show welcome back message here if needed
console.log("Welcome back! You earned $" + earnings + " while away.");
}
lastPlayed = now;
storage.lastPlayed = now;
}
// Calculate costs for upgrades
function calculateUpgradeCost(baseLevel, currentLevel) {
return Math.floor(UPGRADE_BASE_COST * baseLevel * Math.pow(1.5, currentLevel));
}
// Update storage
function updateStorage() {
storage.money = money;
storage.followers = followers;
storage.memeLevel = memeLevel;
storage.studioLevel = studioLevel;
storage.staffLevel = staffLevel;
storage.marketingLevel = marketingLevel;
storage.autoEarningRate = autoEarningRate;
storage.membershipLevel = membershipLevel;
}
// Calculate meme creation result
function createMeme() {
// Base earnings affected by meme quality and studio level
var earnings = MEME_BASE_INCOME * memeLevel * (1 + studioLevel * 0.5);
// Followers gained affected by marketing level
var newFollowers = Math.floor(MEME_BASE_FOLLOWERS * (1 + marketingLevel * 0.5));
// Boost from followers (virality factor)
var followerBoost = 1 + followers / 1000;
earnings = Math.floor(earnings * followerBoost);
// Apply membership bonus if active
if (membershipLevel > 0) {
earnings = Math.floor(earnings * 1.5);
}
// Apply randomness for variability (80% to 120% of calculated value)
var randomFactor = 0.8 + Math.random() * 0.4;
earnings = Math.floor(earnings * randomFactor);
// Small chance for meme to go viral
if (Math.random() < 0.05) {
earnings *= 5;
newFollowers *= 3;
console.log("Your meme went viral!");
}
// Update game state
money += earnings;
followers += newFollowers;
// Update storage
updateStorage();
// Return results
return {
earnings: earnings,
followers: newFollowers
};
}
// Update auto earnings rate based on staff
function updateAutoEarningRate() {
autoEarningRate = staffLevel * 250 * memeLevel * studioLevel; // MASSIVELY increased earning rate
storage.autoEarningRate = autoEarningRate;
}
// Create video button under the create meme button
var createVideoButton = new Button("Create Video", 400, 130, 0x4CAF50);
createVideoButton.x = 2048 / 2;
createVideoButton.y = 2732 / 2 + 350;
createVideoButton.up = function (x, y, obj) {
tween(createVideoButton, {
scaleX: 1,
scaleY: 1
}, {
duration: 100
});
LK.getSound('click').play();
// Add video creation functionality here if needed
};
game.addChild(createVideoButton);
// Create UI elements
// Main studio
var memeStudio = new MemeStudio();
memeStudio.x = 2048 / 2;
memeStudio.y = 2732 / 2;
game.addChild(memeStudio);
// Initialize with current meme quality
memeStudio.updateMemeQuality(memeLevel);
// Stats display
var statsContainer = new Container();
statsContainer.x = 2048 / 2;
statsContainer.y = 180;
game.addChild(statsContainer);
var moneyIcon = LK.getAsset('moneyIcon', {
anchorX: 0.5,
anchorY: 0.5,
x: -600
});
statsContainer.addChild(moneyIcon);
var moneyText = new Text2("$" + money, {
size: 54,
fill: 0x000000
});
moneyText.anchor.set(0, 0.5);
moneyText.x = -570;
statsContainer.addChild(moneyText);
var followerIcon = LK.getAsset('followerIcon', {
anchorX: 0.5,
anchorY: 0.5,
x: 400
});
statsContainer.addChild(followerIcon);
var followerText = new Text2(followers + " followers", {
size: 54,
fill: 0x000000
});
followerText.anchor.set(0, 0.5);
followerText.x = 430;
statsContainer.addChild(followerText);
var autoEarningText = new Text2("", {
size: 36,
fill: 0x333333
});
autoEarningText.anchor.set(0.5, 0.5);
autoEarningText.y = 80;
statsContainer.addChild(autoEarningText);
// Create upgrade tab contents
var studioContent = new Container();
// Meme Quality Upgrade
var memeUpgradeButton = new UpgradeButton("Meme Quality", "Better memes = more $$$", calculateUpgradeCost(1, memeLevel), memeLevel, function () {
var cost = calculateUpgradeCost(1, memeLevel);
if (money >= cost) {
money -= cost;
memeLevel++;
memeUpgradeButton.updateLevel(memeLevel);
memeUpgradeButton.updatePrice(calculateUpgradeCost(1, memeLevel));
memeStudio.updateMemeQuality(memeLevel);
updateAutoEarningRate();
updateStorage();
LK.getSound('levelUp').play();
}
});
memeUpgradeButton.x = -700;
memeUpgradeButton.y = 0;
studioContent.addChild(memeUpgradeButton);
// Studio Upgrade
var studioUpgradeButton = new UpgradeButton("Studio Equipment", "Better equipment = better production", calculateUpgradeCost(2, studioLevel), studioLevel, function () {
var cost = calculateUpgradeCost(2, studioLevel);
if (money >= cost) {
money -= cost;
studioLevel++;
studioUpgradeButton.updateLevel(studioLevel);
studioUpgradeButton.updatePrice(calculateUpgradeCost(2, studioLevel));
updateStorage();
LK.getSound('levelUp').play();
}
});
studioUpgradeButton.x = 0;
studioUpgradeButton.y = 0;
studioContent.addChild(studioUpgradeButton);
// Staff Upgrade
var staffUpgradeButton = new UpgradeButton("Hire Staff", "More staff = MASSIVE auto-income", calculateUpgradeCost(3, staffLevel), staffLevel, function () {
var cost = calculateUpgradeCost(3, staffLevel);
if (money >= cost) {
money -= cost;
staffLevel++;
staffUpgradeButton.updateLevel(staffLevel);
staffUpgradeButton.updatePrice(calculateUpgradeCost(3, staffLevel));
updateAutoEarningRate();
updateStorage();
LK.getSound('levelUp').play();
}
});
staffUpgradeButton.x = 700;
staffUpgradeButton.y = 0;
studioContent.addChild(staffUpgradeButton);
// Create upgrade screen (initially hidden)
var upgradeScreen = new UpgradeScreen();
upgradeScreen.visible = false;
game.addChild(upgradeScreen);
// Initialize upgrade screen
upgradeScreen.initialize(game, upgradePrices, upgradeLevels);
// Studio content is displayed directly without tabs
studioContent.x = 2048 / 2;
studioContent.y = 2732 / 2 + 400;
game.addChild(studioContent);
// Set callback for create meme button
memeStudio.setCreateButtonCallback(function () {
var result = createMeme();
memeStudio.showEarnings(result.earnings, result.followers);
LK.getSound('coin').play();
});
// Start background music
LK.playMusic('bgMusic', {
fade: {
start: 0,
end: 0.4,
duration: 1000
}
});
// Calculate any offline earnings when game starts
calculateOfflineEarnings();
// Set up auto earning timer
var lastAutoEarningTime = Date.now();
// Update UI with current values
function updateUI() {
moneyText.setText("$" + Math.floor(money));
followerText.setText(Math.floor(followers) + " followers");
if (autoEarningRate > 0) {
autoEarningText.setText("Auto earning: $" + Math.floor(autoEarningRate / 180) + " / 20 seconds");
} else {
autoEarningText.setText("");
}
}
// Add game reference to global scope so it can be accessed from upgradeScreen
game.money = money;
game.memeLevel = memeLevel;
game.studioLevel = studioLevel;
game.staffLevel = staffLevel;
game.levels = upgradeLevels;
game.updateStorage = updateStorage;
game.updateAutoEarningRate = updateAutoEarningRate;
// Main game update loop
game.update = function () {
// Handle auto earnings
var now = Date.now();
var elapsed = now - lastAutoEarningTime;
if (elapsed >= AUTO_EARNINGS_INTERVAL && autoEarningRate > 0) {
// Calculate earnings for this period (20 seconds is 1/180th of an hour)
var earnings = Math.floor(autoEarningRate / 180);
if (earnings > 0) {
money += earnings;
lastAutoEarningTime = now;
updateStorage();
}
}
// Update UI elements
updateUI();
// Sync game reference values
game.money = money;
// Update upgrade screen buttons if visible
if (upgradeScreen.visible) {
upgradeScreen.updateButtons(game, upgradePrices);
}
// Enable/disable upgrade buttons based on available money
if (money >= calculateUpgradeCost(1, memeLevel)) {
memeUpgradeButton.enable();
} else {
memeUpgradeButton.disable();
}
if (money >= calculateUpgradeCost(2, studioLevel)) {
studioUpgradeButton.enable();
} else {
studioUpgradeButton.disable();
}
if (money >= calculateUpgradeCost(3, staffLevel)) {
staffUpgradeButton.enable();
} else {
staffUpgradeButton.disable();
}
};
Modern App Store icon, high definition, square with rounded corners, for a game titled "Meme Empire Tycoon" and with the description "Build your meme empire from scratch in this addictive tycoon game! Create viral content, hire talented staff, upgrade your studio, and strategically expand your meme business across multiple platforms to become the internet's most influential meme creator.". No text on icon!
Green button. In-Game asset. 2d. High contrast. No shadows
Youtube silver play button. In-Game asset. 2d. High contrast. No shadows
Wheel of fortune. In-Game asset. 2d. High contrast. No shadows
Wheel of fortune without the stand. In-Game asset. 2d. High contrast. No shadows
Coin potion. In-Game asset. 2d. High contrast. No shadows
Diamond. In-Game asset. 2d. High contrast. No shadows
Archery target. In-Game asset. 2d. High contrast. No shadows
Arrow. In-Game asset. 2d. High contrast. No shadows
Fish. In-Game asset. 2d. High contrast. No shadows
Purple fish. In-Game asset. 2d. High contrast. No shadows
Golden fish. In-Game asset. 2d. High contrast. No shadows
Red cup. In-Game asset. 2d. High contrast. No shadows
Mute music logo. In-Game asset. 2d. High contrast. No shadows