User prompt
Can you add jumscares at every hundred on infinity ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Could we now ad some background music
User prompt
I can't hear anything
User prompt
Can you add sounds every time you click the button
User prompt
Can you fix the errors in the code ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
Please fix the bug: 'Uncaught TypeError: Cannot read properties of undefined (reading 'length')' in or related to this line: 'if (usernameInput.text.length > 0) {' Line Number: 355
User prompt
Please fix the bug: 'Script error.' in or related to this line: 'storage.leaderboard = leaderboard;' Line Number: 225 ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
Please fix the bug: 'Uncaught TypeError: Cannot read properties of undefined (reading 'length')' in or related to this line: 'if (currentText.length < 10) {' Line Number: 175
User prompt
Can you now make a leaderbaord tab that has a leader board and it will work that when you enter the game it will ask you for a username that user name will update on your infinity saving progress and highscore by also allowing the leader board to show who has done the most clicks on infinity can you make the file in csc ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
Can you make the times a bit longer
User prompt
Can you make the time on the timed tab tick down
User prompt
Can you make tabs for different thing we're the one you just made is infinity and make another one in a different tab called timed where you have a random time to click the button as many times as you can and try to beat your high score ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
Make the text on the button black
User prompt
Maybe include some text on the button but the text is a random text that tells you to click the button
User prompt
Good. Can we make the background black with the button white and the text white
Code edit (1 edits merged)
Please save this source code
User prompt
Click Counter
Initial prompt
Make a simple button with text under it saying how many times you have clicked the button
/****
* Plugins
****/
var storage = LK.import("@upit/storage.v1");
var tween = LK.import("@upit/tween.v1");
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x1a1a2e
});
/****
* Game Code
****/
var currentTab = storage.currentTab || 'infinity';
var clickCount = storage.clickCount || 0;
var developerMode = storage.developerMode || false;
var developerTabUnlocked = storage.developerTabUnlocked || false;
var inputCode = '';
var isInputting = false;
var currentLanguage = storage.currentLanguage || 'english';
// Language data
var languages = {
english: {
infinity: 'INFINITY',
cards: 'CARDS',
developer: 'DEVELOPER',
clickMe: 'CLICK ME!',
tapHere: 'TAP HERE!',
pressMe: 'PRESS ME!',
hitIt: 'HIT IT!',
clickNow: 'CLICK NOW!',
tapAway: 'TAP AWAY!',
pushIt: 'PUSH IT!',
goAhead: 'GO AHEAD!',
clickThis: 'CLICK THIS!',
tapTap: 'TAP TAP!',
clicks: 'Clicks: ',
coins: 'Coins: ',
buySlot: 'Buy Slot',
sellSlot: 'Sell Slot',
store: 'STORE',
back: 'BACK',
language: 'Language',
english: 'English',
turkish: 'Turkish'
},
turkish: {
infinity: 'SONSUZ',
cards: 'KARTLAR',
developer: 'GELİŞTİRİCİ',
clickMe: 'TIKLA!',
tapHere: 'BURAYA DOKUN!',
pressMe: 'BAS!',
hitIt: 'VUR!',
clickNow: 'ŞIMDI TIKLA!',
tapAway: 'DOKUN!',
pushIt: 'İT!',
goAhead: 'DEVAM ET!',
clickThis: 'BUNU TIKLA!',
tapTap: 'TIKLA TIKLA!',
clicks: 'Tıklama: ',
coins: 'Altın: ',
buySlot: 'Slot Al',
sellSlot: 'Slot Sat',
store: 'MAĞAZA',
back: 'GERİ',
language: 'Dil',
english: 'İngilizce',
turkish: 'Türkçe'
}
};
// Create weird logo in top right corner
var weirdLogo = game.addChild(LK.getAsset('weirdLogo', {
anchorX: 0.5,
anchorY: 0.5,
width: 120,
height: 120
}));
weirdLogo.x = 2048 - 150;
weirdLogo.y = 150;
weirdLogo.tint = 0x420069;
// Make the logo spin continuously
var logoSpinTimer = LK.setInterval(function () {
weirdLogo.rotation += 0.1;
// Random color changes
if (Math.random() < 0.1) {
weirdLogo.tint = Math.random() * 0xffffff;
}
}, 50);
// Developer mode UI container
var developerContainer = new Container();
game.addChild(developerContainer);
// Code input overlay
var codeInputContainer = new Container();
game.addChild(codeInputContainer);
// Store cards definition (needed before equippedCards initialization)
var storeCards = [{
name: 'Critical Hit',
description: '15% chance for critical hit (2x damage)',
price: 100
}, {
name: 'Auto Clicker',
description: 'One click per second automatically',
price: 200
}, {
name: 'Double Coins',
description: 'Earn 2x coins from clicks',
price: 300
}, {
name: 'Lucky Strike',
description: '10% chance for 5x click value',
price: 250
}];
// Cards and store variables
var cards = storage.cards || [];
// Convert stored owned cards back to objects
var storedOwnedCards = storage.ownedCards || [];
var ownedCards = [];
for (var i = 0; i < storedOwnedCards.length; i++) {
// Find the card object from storeCards array
for (var j = 0; j < storeCards.length; j++) {
if (storeCards[j].name === storedOwnedCards[i]) {
ownedCards.push(storeCards[j]);
break;
}
}
}
// Convert stored equipped cards back to objects
var storedEquippedCards = storage.equippedCards || [];
var equippedCards = [];
for (var i = 0; i < storedEquippedCards.length; i++) {
if (storedEquippedCards[i]) {
// Find the card object from storeCards array
for (var j = 0; j < storeCards.length; j++) {
if (storeCards[j].name === storedEquippedCards[i]) {
equippedCards[i] = storeCards[j];
break;
}
}
} else {
equippedCards[i] = null;
}
}
var cardSlots = storage.cardSlots || 1;
var coins = storage.coins || 0;
var currentTab = storage.currentTab || 'infinity';
// Create tab button shadows
var infinityTabShadow = game.addChild(LK.getAsset('button', {
anchorX: 0.5,
anchorY: 0.5,
width: 500,
height: 160
}));
infinityTabShadow.tint = 0x000000;
infinityTabShadow.alpha = 0.3;
infinityTabShadow.x = 2048 / 2 - 400 + 6;
infinityTabShadow.y = 200 + 6;
var cardsTabShadow = game.addChild(LK.getAsset('button', {
anchorX: 0.5,
anchorY: 0.5,
width: 500,
height: 160
}));
cardsTabShadow.tint = 0x000000;
cardsTabShadow.alpha = 0.3;
cardsTabShadow.x = 2048 / 2 + 400 + 6;
cardsTabShadow.y = 200 + 6;
// Developer tab shadow (initially hidden)
var developerTabShadow = game.addChild(LK.getAsset('button', {
anchorX: 0.5,
anchorY: 0.5,
width: 400,
height: 160
}));
developerTabShadow.tint = 0x000000;
developerTabShadow.alpha = 0.3;
developerTabShadow.x = 2048 / 2 + 6;
developerTabShadow.y = 350 + 6;
developerTabShadow.visible = false;
// Create tab buttons
var infinityTab = game.addChild(LK.getAsset('button', {
anchorX: 0.5,
anchorY: 0.5,
width: 500,
height: 160
}));
infinityTab.x = 2048 / 2 - 400;
infinityTab.y = 200;
var cardsTab = game.addChild(LK.getAsset('button', {
anchorX: 0.5,
anchorY: 0.5,
width: 500,
height: 160
}));
cardsTab.x = 2048 / 2 + 400;
cardsTab.y = 200;
// Developer tab button (initially hidden)
var developerTab = game.addChild(LK.getAsset('button', {
anchorX: 0.5,
anchorY: 0.5,
width: 400,
height: 160
}));
developerTab.x = 2048 / 2;
developerTab.y = 350;
developerTab.tint = 0x420069;
developerTab.visible = false;
// Tab text
var infinityTabText = new Text2('INFINITY', {
size: 60,
fill: 0xffffff
});
infinityTabText.anchor.set(0.5, 0.5);
infinityTabText.x = infinityTab.x;
infinityTabText.y = infinityTab.y;
game.addChild(infinityTabText);
var cardsTabText = new Text2('CARDS', {
size: 60,
fill: 0xffffff
});
cardsTabText.anchor.set(0.5, 0.5);
cardsTabText.x = cardsTab.x;
cardsTabText.y = cardsTab.y;
game.addChild(cardsTabText);
// Developer tab text (initially hidden)
var developerTabText = new Text2('DEVELOPER', {
size: 50,
fill: 0xffffff
});
developerTabText.anchor.set(0.5, 0.5);
developerTabText.x = developerTab.x;
developerTabText.y = developerTab.y;
developerTabText.visible = false;
game.addChild(developerTabText);
// Create button shadow
var buttonShadow = game.addChild(LK.getAsset('button', {
anchorX: 0.5,
anchorY: 0.5
}));
buttonShadow.tint = 0x000000;
buttonShadow.alpha = 0.3;
buttonShadow.x = 2048 / 2 + 8;
buttonShadow.y = 2732 / 2 - 100 + 8;
// Create the main button
var button = game.addChild(LK.getAsset('button', {
anchorX: 0.5,
anchorY: 0.5
}));
// Position button in center of screen
button.x = 2048 / 2;
button.y = 2732 / 2 - 100;
// Array of random button texts - will be updated by language system
var buttonTexts = ['CLICK ME!', 'TAP HERE!', 'PRESS ME!', 'HIT IT!', 'CLICK NOW!', 'TAP AWAY!', 'PUSH IT!', 'GO AHEAD!', 'CLICK THIS!', 'TAP TAP!'];
// Function to update button texts based on language
function updateButtonTexts() {
var lang = languages[currentLanguage];
buttonTexts = [lang.clickMe, lang.tapHere, lang.pressMe, lang.hitIt, lang.clickNow, lang.tapAway, lang.pushIt, lang.goAhead, lang.clickThis, lang.tapTap];
}
// Create button text with random initial text
var buttonText = new Text2(buttonTexts[Math.floor(Math.random() * buttonTexts.length)], {
size: 60,
fill: 0xffffff
});
buttonText.anchor.set(0.5, 0.5);
buttonText.x = button.x;
buttonText.y = button.y;
game.addChild(buttonText);
// Create counter text
var counterText = new Text2('Clicks: 0', {
size: 160,
fill: 0x50fa7b
});
counterText.anchor.set(0.5, 0.5);
counterText.x = 2048 / 2;
counterText.y = 2732 / 2 + 300;
game.addChild(counterText);
// Create coins display
var coinsText = new Text2('Coins: ' + coins, {
size: 100,
fill: 0xff79c6
});
coinsText.anchor.set(0.5, 0.5);
coinsText.x = 2048 / 2 - 300;
coinsText.y = 700;
game.addChild(coinsText);
// Create language menu button
var languageButton = game.addChild(LK.getAsset('button', {
anchorX: 0.5,
anchorY: 0.5,
width: 300,
height: 100
}));
languageButton.x = 2048 / 2 - 700;
languageButton.y = 700;
languageButton.tint = 0x42069;
var languageText = new Text2('#', {
size: 40,
fill: 0xffffff
});
languageText.anchor.set(0.5, 0.5);
languageText.x = languageButton.x;
languageText.y = languageButton.y;
game.addChild(languageText);
// Language menu container
var languageMenuContainer = new Container();
game.addChild(languageMenuContainer);
languageButton.down = function () {
showLanguageMenu();
};
// Function to show language selection menu
function showLanguageMenu() {
languageMenuContainer.removeChildren();
languageMenuContainer.visible = true;
// Background overlay
var languageOverlay = languageMenuContainer.addChild(LK.getAsset('button', {
anchorX: 0.5,
anchorY: 0.5,
width: 2048,
height: 2732
}));
languageOverlay.tint = 0x000000;
languageOverlay.alpha = 0.7;
languageOverlay.x = 2048 / 2;
languageOverlay.y = 2732 / 2;
// Language selection panel
var languagePanel = languageMenuContainer.addChild(LK.getAsset('button', {
anchorX: 0.5,
anchorY: 0.5,
width: 800,
height: 600
}));
languagePanel.tint = 0x2d3748;
languagePanel.x = 2048 / 2;
languagePanel.y = 2732 / 2;
// Title
var languageTitle = new Text2('Select Language', {
size: 80,
fill: 0xffffff
});
languageTitle.anchor.set(0.5, 0.5);
languageTitle.x = languagePanel.x;
languageTitle.y = languagePanel.y - 200;
languageMenuContainer.addChild(languageTitle);
// Close button
var closeLanguageButton = languageMenuContainer.addChild(LK.getAsset('button', {
anchorX: 0.5,
anchorY: 0.5,
width: 120,
height: 80
}));
closeLanguageButton.x = languagePanel.x + 340;
closeLanguageButton.y = languagePanel.y - 200;
closeLanguageButton.tint = 0xff5555;
var closeLanguageText = new Text2('X', {
size: 50,
fill: 0xffffff
});
closeLanguageText.anchor.set(0.5, 0.5);
closeLanguageText.x = closeLanguageButton.x;
closeLanguageText.y = closeLanguageButton.y;
languageMenuContainer.addChild(closeLanguageText);
closeLanguageButton.down = function () {
languageMenuContainer.visible = false;
};
// English button
var englishButton = languageMenuContainer.addChild(LK.getAsset('button', {
anchorX: 0.5,
anchorY: 0.5,
width: 600,
height: 120
}));
englishButton.x = languagePanel.x;
englishButton.y = languagePanel.y - 50;
englishButton.tint = currentLanguage === 'english' ? 0x50fa7b : 0x4a90e2;
var englishText = new Text2('English', {
size: 60,
fill: 0xffffff
});
englishText.anchor.set(0.5, 0.5);
englishText.x = englishButton.x;
englishText.y = englishButton.y;
languageMenuContainer.addChild(englishText);
englishButton.down = function () {
if (currentLanguage !== 'english') {
currentLanguage = 'english';
storage.currentLanguage = currentLanguage;
updateLanguageDisplay();
LK.effects.flashScreen(0x50fa7b, 300);
}
languageMenuContainer.visible = false;
};
// Turkish button
var turkishButton = languageMenuContainer.addChild(LK.getAsset('button', {
anchorX: 0.5,
anchorY: 0.5,
width: 600,
height: 120
}));
turkishButton.x = languagePanel.x;
turkishButton.y = languagePanel.y + 100;
turkishButton.tint = currentLanguage === 'turkish' ? 0x50fa7b : 0x4a90e2;
var turkishText = new Text2('Türkçe', {
size: 60,
fill: 0xffffff
});
turkishText.anchor.set(0.5, 0.5);
turkishText.x = turkishButton.x;
turkishText.y = turkishButton.y;
languageMenuContainer.addChild(turkishText);
turkishButton.down = function () {
if (currentLanguage !== 'turkish') {
currentLanguage = 'turkish';
storage.currentLanguage = currentLanguage;
updateLanguageDisplay();
LK.effects.flashScreen(0x50fa7b, 300);
}
languageMenuContainer.visible = false;
};
}
// Create buy slot button next to coin counter
var buySlotButtonMain = game.addChild(LK.getAsset('button', {
anchorX: 0.5,
anchorY: 0.5,
width: 400,
height: 120
}));
buySlotButtonMain.x = 2048 / 2 + 100;
buySlotButtonMain.y = 700;
buySlotButtonMain.tint = 0x50fa7b;
buySlotButtonMain.visible = false;
var buySlotTextMain = new Text2('Buy Slot (50)', {
size: 50,
fill: 0xffffff
});
buySlotTextMain.anchor.set(0.5, 0.5);
buySlotTextMain.x = buySlotButtonMain.x;
buySlotTextMain.y = buySlotButtonMain.y;
buySlotTextMain.visible = false;
game.addChild(buySlotTextMain);
// Create sell slot button next to buy slot button
var sellSlotButtonMain = game.addChild(LK.getAsset('button', {
anchorX: 0.5,
anchorY: 0.5,
width: 400,
height: 120
}));
sellSlotButtonMain.x = 2048 / 2 + 500;
sellSlotButtonMain.y = 700;
sellSlotButtonMain.tint = 0xff5555;
sellSlotButtonMain.visible = false;
var sellSlotTextMain = new Text2('Sell Slot (25)', {
size: 50,
fill: 0xffffff
});
sellSlotTextMain.anchor.set(0.5, 0.5);
sellSlotTextMain.x = sellSlotButtonMain.x;
sellSlotTextMain.y = sellSlotButtonMain.y;
sellSlotTextMain.visible = false;
game.addChild(sellSlotTextMain);
sellSlotButtonMain.down = function () {
if (cardSlots > 1) {
// Remove card from the last slot if it exists
if (equippedCards[cardSlots - 1]) {
equippedCards[cardSlots - 1] = null;
}
// Remove the slot
cardSlots--;
coins += 25;
storage.coins = coins;
storage.cardSlots = cardSlots;
// Update equipped cards storage
var equippedCardNames = [];
for (var i = 0; i < equippedCards.length; i++) {
equippedCardNames[i] = equippedCards[i] ? equippedCards[i].name : null;
}
storage.equippedCards = equippedCardNames;
coinsText.setText('Coins: ' + coins);
updateCardSlots();
updateBuySlotButton();
}
};
buySlotButtonMain.down = function () {
if (coins >= 50 && cardSlots < 9) {
coins -= 50;
cardSlots++;
storage.coins = coins;
storage.cardSlots = cardSlots;
coinsText.setText('Coins: ' + coins);
updateCardSlots();
updateBuySlotButton();
}
};
function updateBuySlotButton() {
if (currentTab === 'cards') {
// Show buy button only if less than 9 slots
if (cardSlots < 9) {
buySlotButtonMain.visible = true;
buySlotTextMain.visible = true;
} else {
buySlotButtonMain.visible = false;
buySlotTextMain.visible = false;
}
// Show sell button only if more than 1 slot
if (cardSlots > 1) {
sellSlotButtonMain.visible = true;
sellSlotTextMain.visible = true;
} else {
sellSlotButtonMain.visible = false;
sellSlotTextMain.visible = false;
}
} else {
buySlotButtonMain.visible = false;
buySlotTextMain.visible = false;
sellSlotButtonMain.visible = false;
sellSlotTextMain.visible = false;
}
}
// Cards menu container
var cardsMenuContainer = new Container();
game.addChild(cardsMenuContainer);
// Create store menu button shadow
var storeMenuButtonShadow = cardsMenuContainer.addChild(LK.getAsset('button', {
anchorX: 0.5,
anchorY: 0.5,
width: 800,
height: 200
}));
storeMenuButtonShadow.tint = 0x000000;
storeMenuButtonShadow.alpha = 0.3;
storeMenuButtonShadow.x = 2048 / 2 + 8;
storeMenuButtonShadow.y = 400 + 8;
// Create store menu button only
var storeMenuButton = cardsMenuContainer.addChild(LK.getAsset('button', {
anchorX: 0.5,
anchorY: 0.5,
width: 800,
height: 200
}));
storeMenuButton.x = 2048 / 2;
storeMenuButton.y = 400;
var storeMenuText = new Text2('STORE', {
size: 80,
fill: 0xffffff
});
storeMenuText.anchor.set(0.5, 0.5);
storeMenuText.x = storeMenuButton.x;
storeMenuText.y = storeMenuButton.y;
cardsMenuContainer.addChild(storeMenuText);
// Cards tab UI elements
var cardSlotsContainer = new Container();
game.addChild(cardSlotsContainer);
var cardSlotButtons = [];
var cardSlotTexts = [];
// Scrolling variables for cards tab
var cardsScrollY = 0;
var cardsScrolling = false;
var cardsStartY = 0;
var cardsLastY = 0;
var cardsHolding = false;
var cardsHoldTimer = null;
var cardsScrollContainer = new Container();
cardSlotsContainer.addChild(cardsScrollContainer);
// Store tab UI elements
var storeContainer = new Container();
game.addChild(storeContainer);
// Function to show developer mode
function showDeveloperMode() {
developerContainer.removeChildren();
developerContainer.visible = true;
// Background overlay
var devOverlay = developerContainer.addChild(LK.getAsset('button', {
anchorX: 0.5,
anchorY: 0.5,
width: 2048,
height: 2732
}));
devOverlay.tint = 0x000000;
devOverlay.alpha = 0.8;
devOverlay.x = 2048 / 2;
devOverlay.y = 2732 / 2;
// Developer panel
var devPanel = developerContainer.addChild(LK.getAsset('button', {
anchorX: 0.5,
anchorY: 0.5,
width: 1800,
height: 2200
}));
devPanel.tint = 0x1a1a2e;
devPanel.x = 2048 / 2;
devPanel.y = 2732 / 2;
// Title
var devTitle = new Text2('DEVELOPER MODE', {
size: 100,
fill: 0x42069
});
devTitle.anchor.set(0.5, 0.5);
devTitle.x = devPanel.x;
devTitle.y = devPanel.y - 900;
developerContainer.addChild(devTitle);
// Close button
var closeDevButton = developerContainer.addChild(LK.getAsset('button', {
anchorX: 0.5,
anchorY: 0.5,
width: 200,
height: 100
}));
closeDevButton.x = devPanel.x + 800;
closeDevButton.y = devPanel.y - 900;
closeDevButton.tint = 0xff5555;
var closeDevText = new Text2('X', {
size: 60,
fill: 0xffffff
});
closeDevText.anchor.set(0.5, 0.5);
closeDevText.x = closeDevButton.x;
closeDevText.y = closeDevButton.y;
developerContainer.addChild(closeDevText);
closeDevButton.down = function () {
developerContainer.visible = false;
};
// Add coins button
var addCoinsButton = developerContainer.addChild(LK.getAsset('button', {
anchorX: 0.5,
anchorY: 0.5,
width: 800,
height: 200
}));
addCoinsButton.x = devPanel.x;
addCoinsButton.y = devPanel.y - 600;
addCoinsButton.tint = 0x50fa7b;
var addCoinsText = new Text2('Add 1000 Coins', {
size: 80,
fill: 0xffffff
});
addCoinsText.anchor.set(0.5, 0.5);
addCoinsText.x = addCoinsButton.x;
addCoinsText.y = addCoinsButton.y;
developerContainer.addChild(addCoinsText);
addCoinsButton.down = function () {
coins += 1000;
storage.coins = coins;
coinsText.setText('Coins: ' + coins);
LK.effects.flashScreen(0x50fa7b, 300);
};
// Max clicks button
var maxClicksButton = developerContainer.addChild(LK.getAsset('button', {
anchorX: 0.5,
anchorY: 0.5,
width: 800,
height: 200
}));
maxClicksButton.x = devPanel.x;
maxClicksButton.y = devPanel.y - 300;
maxClicksButton.tint = 0x8b5cf6;
var maxClicksText = new Text2('Add 10000 Clicks', {
size: 80,
fill: 0xffffff
});
maxClicksText.anchor.set(0.5, 0.5);
maxClicksText.x = maxClicksButton.x;
maxClicksText.y = maxClicksButton.y;
developerContainer.addChild(maxClicksText);
maxClicksButton.down = function () {
clickCount += 10000;
storage.clickCount = clickCount;
counterText.setText('Clicks: ' + clickCount);
LK.effects.flashScreen(0x8b5cf6, 300);
};
// Unlock all cards button
var unlockCardsButton = developerContainer.addChild(LK.getAsset('button', {
anchorX: 0.5,
anchorY: 0.5,
width: 800,
height: 200
}));
unlockCardsButton.x = devPanel.x;
unlockCardsButton.y = devPanel.y;
unlockCardsButton.tint = 0xff79c6;
var unlockCardsText = new Text2('Unlock All Cards', {
size: 80,
fill: 0xffffff
});
unlockCardsText.anchor.set(0.5, 0.5);
unlockCardsText.x = unlockCardsButton.x;
unlockCardsText.y = unlockCardsButton.y;
developerContainer.addChild(unlockCardsText);
unlockCardsButton.down = function () {
for (var i = 0; i < storeCards.length; i++) {
var alreadyOwned = false;
for (var j = 0; j < ownedCards.length; j++) {
if (ownedCards[j].name === storeCards[i].name) {
alreadyOwned = true;
break;
}
}
if (!alreadyOwned) {
ownedCards.push(storeCards[i]);
}
}
// Convert ownedCards to storage-compatible format
var ownedCardNames = [];
for (var k = 0; k < ownedCards.length; k++) {
ownedCardNames.push(ownedCards[k].name);
}
storage.ownedCards = ownedCardNames;
LK.effects.flashScreen(0xff79c6, 300);
};
// Max card slots button
var maxSlotsButton = developerContainer.addChild(LK.getAsset('button', {
anchorX: 0.5,
anchorY: 0.5,
width: 800,
height: 200
}));
maxSlotsButton.x = devPanel.x;
maxSlotsButton.y = devPanel.y + 300;
maxSlotsButton.tint = 0xffb86c;
var maxSlotsText = new Text2('Max Out Card Slots (9)', {
size: 80,
fill: 0xffffff
});
maxSlotsText.anchor.set(0.5, 0.5);
maxSlotsText.x = maxSlotsButton.x;
maxSlotsText.y = maxSlotsButton.y;
developerContainer.addChild(maxSlotsText);
maxSlotsButton.down = function () {
cardSlots = 9;
storage.cardSlots = cardSlots;
updateCardSlots();
updateBuySlotButton();
LK.effects.flashScreen(0xffb86c, 300);
};
// Reset game button
var resetButton = developerContainer.addChild(LK.getAsset('button', {
anchorX: 0.5,
anchorY: 0.5,
width: 800,
height: 200
}));
resetButton.x = devPanel.x;
resetButton.y = devPanel.y + 600;
resetButton.tint = 0xff0000;
var resetText = new Text2('Reset Game', {
size: 80,
fill: 0xffffff
});
resetText.anchor.set(0.5, 0.5);
resetText.x = resetButton.x;
resetText.y = resetButton.y;
developerContainer.addChild(resetText);
resetButton.down = function () {
// Clear all storage data
storage.clickCount = 0;
storage.coins = 0;
storage.cards = [];
storage.ownedCards = [];
storage.equippedCards = [];
storage.cardSlots = 1;
storage.currentTab = 'infinity';
storage.developerMode = false;
storage.developerTabUnlocked = false;
// Flash red and show game over to restart
LK.effects.flashScreen(0xff0000, 1000);
LK.showGameOver();
};
// Lock developer mode button
var lockDevButton = developerContainer.addChild(LK.getAsset('button', {
anchorX: 0.5,
anchorY: 0.5,
width: 800,
height: 200
}));
lockDevButton.x = devPanel.x;
lockDevButton.y = devPanel.y + 900;
lockDevButton.tint = 0xff5555;
var lockDevText = new Text2('Lock Developer Mode', {
size: 80,
fill: 0xffffff
});
lockDevText.anchor.set(0.5, 0.5);
lockDevText.x = lockDevButton.x;
lockDevText.y = lockDevButton.y;
developerContainer.addChild(lockDevText);
lockDevButton.down = function () {
developerMode = false;
developerTabUnlocked = false;
storage.developerMode = developerMode;
storage.developerTabUnlocked = developerTabUnlocked;
currentTab = 'infinity';
storage.currentTab = currentTab;
updateTabDisplay();
developerContainer.visible = false;
LK.effects.flashScreen(0xff5555, 300);
};
}
// Function to show code input
function showCodeInput() {
codeInputContainer.removeChildren();
codeInputContainer.visible = true;
isInputting = true;
inputCode = '';
// Background overlay
var inputOverlay = codeInputContainer.addChild(LK.getAsset('button', {
anchorX: 0.5,
anchorY: 0.5,
width: 2048,
height: 2732
}));
inputOverlay.tint = 0x000000;
inputOverlay.alpha = 0.7;
inputOverlay.x = 2048 / 2;
inputOverlay.y = 2732 / 2;
// Input panel
var inputPanel = codeInputContainer.addChild(LK.getAsset('button', {
anchorX: 0.5,
anchorY: 0.5,
width: 1200,
height: 800
}));
inputPanel.tint = 0x2d3748;
inputPanel.x = 2048 / 2;
inputPanel.y = 2732 / 2;
// Title
var inputTitle = new Text2('Enter Developer Code', {
size: 80,
fill: 0xffffff
});
inputTitle.anchor.set(0.5, 0.5);
inputTitle.x = inputPanel.x;
inputTitle.y = inputPanel.y - 250;
codeInputContainer.addChild(inputTitle);
// Code display
var codeDisplay = new Text2('*****', {
size: 120,
fill: 0x42069
});
codeDisplay.anchor.set(0.5, 0.5);
codeDisplay.x = inputPanel.x;
codeDisplay.y = inputPanel.y - 50;
codeInputContainer.addChild(codeDisplay);
// Number buttons
var numberButtons = [];
for (var i = 0; i < 10; i++) {
var numButton = codeInputContainer.addChild(LK.getAsset('button', {
anchorX: 0.5,
anchorY: 0.5,
width: 120,
height: 120
}));
numButton.x = inputPanel.x - 250 + i % 5 * 125;
numButton.y = inputPanel.y + 150 + Math.floor(i / 5) * 140;
numButton.tint = 0x4a90e2;
var numText = new Text2(i.toString(), {
size: 60,
fill: 0xffffff
});
numText.anchor.set(0.5, 0.5);
numText.x = numButton.x;
numText.y = numButton.y;
codeInputContainer.addChild(numText);
numButton.digit = i;
numButton.down = function () {
if (inputCode.length < 5) {
inputCode += this.digit.toString();
var displayCode = '';
for (var j = 0; j < inputCode.length; j++) {
displayCode += inputCode[j];
}
for (var k = inputCode.length; k < 5; k++) {
displayCode += '*';
}
codeDisplay.setText(displayCode);
if (inputCode.length === 5) {
LK.setTimeout(function () {
if (inputCode === '96469') {
developerMode = true;
developerTabUnlocked = true;
storage.developerMode = developerMode;
storage.developerTabUnlocked = developerTabUnlocked;
currentTab = 'developer';
storage.currentTab = currentTab;
updateTabDisplay();
LK.effects.flashScreen(0x50fa7b, 500);
} else {
LK.effects.flashScreen(0xff5555, 500);
}
codeInputContainer.visible = false;
isInputting = false;
}, 500);
}
}
};
numberButtons.push(numButton);
}
// Close button
var closeInputButton = codeInputContainer.addChild(LK.getAsset('button', {
anchorX: 0.5,
anchorY: 0.5,
width: 200,
height: 100
}));
closeInputButton.x = inputPanel.x + 500;
closeInputButton.y = inputPanel.y - 250;
closeInputButton.tint = 0xff5555;
var closeInputText = new Text2('X', {
size: 60,
fill: 0xffffff
});
closeInputText.anchor.set(0.5, 0.5);
closeInputText.x = closeInputButton.x;
closeInputText.y = closeInputButton.y;
codeInputContainer.addChild(closeInputText);
closeInputButton.down = function () {
codeInputContainer.visible = false;
isInputting = false;
};
}
// Function to update tab visibility
function updateTabDisplay() {
// Show/hide developer tab based on unlock status
developerTab.visible = developerTabUnlocked;
developerTabShadow.visible = developerTabUnlocked;
developerTabText.visible = developerTabUnlocked;
if (currentTab === 'infinity') {
// Show infinity mode elements
button.visible = true;
buttonText.visible = true;
buttonShadow.visible = true;
counterText.visible = true;
counterText.setText('Clicks: ' + clickCount);
coinsText.visible = true;
// Hide other mode elements
cardSlotsContainer.visible = false;
storeContainer.visible = false;
cardsMenuContainer.visible = false;
developerContainer.visible = false;
// Hide buy slot button
updateBuySlotButton();
// Update tab colors
infinityTab.tint = 0x8b5cf6;
cardsTab.tint = 0x4a90e2;
if (developerTabUnlocked) developerTab.tint = 0x4a90e2;
} else if (currentTab === 'cards') {
// Show cards mode elements with card slots
button.visible = false;
buttonText.visible = false;
buttonShadow.visible = false;
counterText.visible = false;
coinsText.visible = true;
cardSlotsContainer.visible = true;
storeContainer.visible = false;
cardsMenuContainer.visible = true;
developerContainer.visible = false;
// Update card slots display
updateCardSlots();
// Update buy slot button visibility
updateBuySlotButton();
// Update tab colors
infinityTab.tint = 0x4a90e2;
cardsTab.tint = 0x8b5cf6;
if (developerTabUnlocked) developerTab.tint = 0x4a90e2;
} else if (currentTab === 'store') {
// Show store mode elements
button.visible = false;
buttonText.visible = false;
buttonShadow.visible = false;
counterText.visible = false;
coinsText.visible = true;
cardSlotsContainer.visible = false;
storeContainer.visible = true;
cardsMenuContainer.visible = false;
developerContainer.visible = false;
// Update store display
updateStoreDisplay();
// Update tab colors
infinityTab.tint = 0x4a90e2;
cardsTab.tint = 0x8b5cf6;
if (developerTabUnlocked) developerTab.tint = 0x4a90e2;
} else if (currentTab === 'developer') {
// Show developer mode elements
button.visible = false;
buttonText.visible = false;
buttonShadow.visible = false;
counterText.visible = false;
coinsText.visible = true;
cardSlotsContainer.visible = false;
storeContainer.visible = false;
cardsMenuContainer.visible = false;
developerContainer.visible = true;
showDeveloperMode();
// Update tab colors
infinityTab.tint = 0x4a90e2;
cardsTab.tint = 0x4a90e2;
if (developerTabUnlocked) developerTab.tint = 0x8b5cf6;
}
}
// Card selector container
var cardSelectorContainer = new Container();
game.addChild(cardSelectorContainer);
var selectedSlotIndex = -1;
// Function to open card selector
function openCardSelector(slotIndex) {
selectedSlotIndex = slotIndex;
// Clear existing selector UI
cardSelectorContainer.removeChildren();
cardSelectorContainer.visible = true;
// Create background overlay
var overlay = cardSelectorContainer.addChild(LK.getAsset('button', {
anchorX: 0.5,
anchorY: 0.5,
width: 2048,
height: 2732
}));
overlay.tint = 0x000000;
overlay.alpha = 0.7;
overlay.x = 2048 / 2;
overlay.y = 2732 / 2;
// Create selector panel
var selectorPanel = cardSelectorContainer.addChild(LK.getAsset('button', {
anchorX: 0.5,
anchorY: 0.5,
width: 1600,
height: 2000
}));
selectorPanel.tint = 0x2d3748;
selectorPanel.x = 2048 / 2;
selectorPanel.y = 2732 / 2;
// Title
var titleText = new Text2('Select Card for Slot ' + (slotIndex + 1), {
size: 80,
fill: 0xffffff
});
titleText.anchor.set(0.5, 0.5);
titleText.x = selectorPanel.x;
titleText.y = selectorPanel.y - 800;
cardSelectorContainer.addChild(titleText);
// Close button
var closeButton = cardSelectorContainer.addChild(LK.getAsset('button', {
anchorX: 0.5,
anchorY: 0.5,
width: 200,
height: 100
}));
closeButton.x = selectorPanel.x + 700;
closeButton.y = selectorPanel.y - 800;
closeButton.tint = 0xff5555;
var closeText = new Text2('X', {
size: 60,
fill: 0xffffff
});
closeText.anchor.set(0.5, 0.5);
closeText.x = closeButton.x;
closeText.y = closeButton.y;
cardSelectorContainer.addChild(closeText);
closeButton.down = function () {
cardSelectorContainer.visible = false;
selectedSlotIndex = -1;
};
// Empty slot option
var emptySlotButton = cardSelectorContainer.addChild(LK.getAsset('button', {
anchorX: 0.5,
anchorY: 0.5,
width: 1400,
height: 150
}));
emptySlotButton.x = selectorPanel.x;
emptySlotButton.y = selectorPanel.y - 600;
emptySlotButton.tint = 0x4a90e2;
var emptyText = new Text2('Remove Card (Empty Slot)', {
size: 60,
fill: 0xffffff
});
emptyText.anchor.set(0.5, 0.5);
emptyText.x = emptySlotButton.x;
emptyText.y = emptySlotButton.y;
cardSelectorContainer.addChild(emptyText);
emptySlotButton.down = function () {
equippedCards[selectedSlotIndex] = null;
// Store only card names for storage compatibility
var equippedCardNames = [];
for (var i = 0; i < equippedCards.length; i++) {
equippedCardNames[i] = equippedCards[i] ? equippedCards[i].name : null;
}
storage.equippedCards = equippedCardNames;
updateCardSlots();
cardSelectorContainer.visible = false;
selectedSlotIndex = -1;
};
// Show all owned cards
var displayIndex = 0;
for (var i = 0; i < ownedCards.length; i++) {
var card = ownedCards[i];
var cardButton = cardSelectorContainer.addChild(LK.getAsset('button', {
anchorX: 0.5,
anchorY: 0.5,
width: 1400,
height: 180
}));
cardButton.x = selectorPanel.x;
cardButton.y = selectorPanel.y - 400 + displayIndex * 200;
cardButton.tint = 0x8b5cf6;
var cardNameText = new Text2(card.name, {
size: 60,
fill: 0xffffff
});
cardNameText.anchor.set(0.5, 0.4);
cardNameText.x = cardButton.x;
cardNameText.y = cardButton.y - 30;
cardSelectorContainer.addChild(cardNameText);
var cardDescText = new Text2(card.description, {
size: 40,
fill: 0xbd93f9
});
cardDescText.anchor.set(0.5, 0.6);
cardDescText.x = cardButton.x;
cardDescText.y = cardButton.y + 30;
cardSelectorContainer.addChild(cardDescText);
cardButton.cardData = card;
cardButton.down = function () {
// Check if this card is already equipped in another slot
var alreadyEquipped = false;
for (var j = 0; j < equippedCards.length; j++) {
if (equippedCards[j] && equippedCards[j].name === this.cardData.name) {
alreadyEquipped = true;
break;
}
}
// Only allow equipping if not already equipped
if (!alreadyEquipped) {
equippedCards[selectedSlotIndex] = this.cardData;
// Store only card names for storage compatibility
var equippedCardNames = [];
for (var i = 0; i < equippedCards.length; i++) {
equippedCardNames[i] = equippedCards[i] ? equippedCards[i].name : null;
}
storage.equippedCards = equippedCardNames;
updateCardSlots();
cardSelectorContainer.visible = false;
selectedSlotIndex = -1;
} else {
// Flash red to indicate card is already equipped
LK.effects.flashScreen(0xff5555, 300);
}
};
displayIndex++;
}
// Handle case when no cards are available
if (ownedCards.length === 0) {
var noCardsText = new Text2('No cards owned. Visit the store to buy cards!', {
size: 60,
fill: 0xff79c6
});
noCardsText.anchor.set(0.5, 0.5);
noCardsText.x = selectorPanel.x;
noCardsText.y = selectorPanel.y - 200;
cardSelectorContainer.addChild(noCardsText);
}
}
// Function to update card slots display
function updateCardSlots() {
// Clear existing slot UI
cardsScrollContainer.removeChildren();
cardSlotButtons = [];
cardSlotTexts = [];
// Reset scroll position
cardsScrollY = 0;
cardsScrollContainer.y = 0;
// Create card slots
for (var i = 0; i < cardSlots; i++) {
var slotButton = cardsScrollContainer.addChild(LK.getAsset('button', {
anchorX: 0.5,
anchorY: 0.5,
width: 600,
height: 240
}));
slotButton.x = 2048 / 2 - 700 + i % 3 * 700;
slotButton.y = 1000 + Math.floor(i / 3) * 500;
var equippedCard = equippedCards[i];
var slotText = new Text2(equippedCard ? equippedCard.name : 'Empty Slot', {
size: 50,
fill: 0xffffff
});
slotText.anchor.set(0.5, 0.5);
slotText.x = slotButton.x;
slotText.y = slotButton.y;
cardsScrollContainer.addChild(slotText);
cardSlotButtons.push(slotButton);
cardSlotTexts.push(slotText);
// Add click handler to slot
slotButton.slotIndex = i;
slotButton.down = function () {
if (!cardsScrolling) {
openCardSelector(this.slotIndex);
}
};
}
}
// Function to update store display
function updateStoreDisplay() {
// Clear existing store UI
storeContainer.removeChildren();
// Add back button
var backButton = storeContainer.addChild(LK.getAsset('button', {
anchorX: 0.5,
anchorY: 0.5,
width: 300,
height: 120
}));
backButton.x = 150;
backButton.y = 350;
var backText = new Text2(languages[currentLanguage].back, {
size: 50,
fill: 0xffffff
});
backText.anchor.set(0.5, 0.5);
backText.x = backButton.x;
backText.y = backButton.y;
storeContainer.addChild(backText);
backButton.down = function () {
currentTab = 'cards';
storage.currentTab = currentTab;
updateTabDisplay();
};
for (var i = 0; i < storeCards.length; i++) {
var card = storeCards[i];
// Count how many of this card the player owns
var ownedCount = 0;
for (var j = 0; j < ownedCards.length; j++) {
if (ownedCards[j].name === card.name) {
ownedCount++;
}
}
var cardButton = storeContainer.addChild(LK.getAsset('button', {
anchorX: 0.5,
anchorY: 0.5,
width: 800,
height: 200
}));
cardButton.x = 2048 / 2;
cardButton.y = 800 + i * 240;
var cardText = new Text2(card.name + ' - ' + card.price + ' coins (Owned: ' + ownedCount + ')', {
size: 60,
fill: 0xffffff
});
cardText.anchor.set(0.5, 0.4);
cardText.x = cardButton.x;
cardText.y = cardButton.y - 30;
storeContainer.addChild(cardText);
var descText = new Text2(card.description, {
size: 40,
fill: 0xbd93f9
});
descText.anchor.set(0.5, 0.6);
descText.x = cardButton.x;
descText.y = cardButton.y + 30;
storeContainer.addChild(descText);
cardButton.cardData = card;
cardButton.down = function () {
if (coins >= this.cardData.price) {
coins -= this.cardData.price;
ownedCards.push(this.cardData);
try {
if (storage) {
storage.coins = coins;
// Convert ownedCards to storage-compatible format
var ownedCardNames = [];
for (var k = 0; k < ownedCards.length; k++) {
ownedCardNames.push(ownedCards[k].name);
}
storage.ownedCards = ownedCardNames;
}
} catch (e) {
console.log('Storage error:', e);
}
coinsText.setText('Coins: ' + coins);
// Update store display to show new count
updateStoreDisplay();
// Visual feedback
tween(this, {
tint: 0x00ff00
}, {
duration: 200
});
LK.setTimeout(function () {
tween(this, {
tint: 0xffffff
}, {
duration: 200
});
}.bind(this), 200);
}
};
}
}
// Tab click handlers
infinityTab.down = function () {
currentTab = 'infinity';
storage.currentTab = currentTab;
updateTabDisplay();
};
cardsTab.down = function () {
currentTab = 'cards';
storage.currentTab = currentTab;
updateTabDisplay();
};
// Developer tab click handler
developerTab.down = function () {
if (developerTabUnlocked) {
currentTab = 'developer';
storage.currentTab = currentTab;
updateTabDisplay();
}
};
// Cards menu click handlers
storeMenuButton.down = function () {
currentTab = 'store';
storage.currentTab = currentTab;
updateTabDisplay();
};
// Cards tab scrolling handlers
cardSlotsContainer.down = function (x, y, obj) {
if (currentTab === 'cards') {
cardsScrolling = false;
cardsHolding = false;
cardsStartY = y;
cardsLastY = y;
// Start hold timer - enable scrolling after 200ms of holding
cardsHoldTimer = LK.setTimeout(function () {
cardsHolding = true;
}, 200);
}
};
cardSlotsContainer.move = function (x, y, obj) {
if (currentTab === 'cards' && cardsHolding) {
var deltaY = y - cardsLastY;
if (Math.abs(deltaY) > 5) {
cardsScrolling = true;
cardsScrollY += deltaY;
// Limit scrolling bounds
var maxScroll = 0;
var minScroll = Math.min(0, 2732 - (1400 + Math.floor(cardSlots / 3) * 500 + 300));
cardsScrollY = Math.max(minScroll, Math.min(maxScroll, cardsScrollY));
cardsScrollContainer.y = cardsScrollY;
}
cardsLastY = y;
}
};
cardSlotsContainer.up = function (x, y, obj) {
if (currentTab === 'cards') {
// Clear hold timer if it exists
if (cardsHoldTimer) {
LK.clearTimeout(cardsHoldTimer);
cardsHoldTimer = null;
}
// Reset hold state
cardsHolding = false;
// Reset scrolling flag after a short delay
LK.setTimeout(function () {
cardsScrolling = false;
}, 100);
}
};
// Auto clicker functionality from cards
var autoClickerTimer = null;
function checkCardEffects() {
// Check for auto clicker card
var hasAutoClicker = false;
for (var i = 0; i < equippedCards.length; i++) {
if (equippedCards[i] && equippedCards[i].name === 'Auto Clicker') {
hasAutoClicker = true;
break;
}
}
if (hasAutoClicker && !autoClickerTimer && currentTab === 'infinity') {
autoClickerTimer = LK.setInterval(function () {
processClick(1);
}, 1000);
} else if (!hasAutoClicker && autoClickerTimer) {
LK.clearInterval(autoClickerTimer);
autoClickerTimer = null;
}
}
// Function to process clicks with card effects
function processClick(baseClicks) {
var finalClicks = baseClicks;
var coinsEarned = 0; // Start with 0 coins, earn based on chance
var isCritical = false;
var isLucky = false;
var coinDropChance = 0.3; // 30% chance to get coins on click
var bonusCoinsChance = 0.1; // 10% chance for bonus coins
// Check for coin drops
if (Math.random() < coinDropChance) {
coinsEarned = 1;
// Check for bonus coins
if (Math.random() < bonusCoinsChance) {
coinsEarned = 3; // Bonus coin drop
}
// Create visual coin drop effect
createCoinDrop(button.x, button.y, coinsEarned);
}
// Check equipped cards for effects
for (var i = 0; i < equippedCards.length; i++) {
var card = equippedCards[i];
if (!card) {
continue;
}
if (card.name === 'Critical Hit' && Math.random() < 0.15) {
finalClicks *= 2;
isCritical = true;
}
if (card.name === 'Double Coins' && coinsEarned > 0) {
coinsEarned *= 2;
}
if (card.name === 'Lucky Strike' && Math.random() < 0.10) {
finalClicks *= 5;
isLucky = true;
}
}
clickCount += finalClicks;
// Don't add coins here - let the animation handle it
storage.clickCount = clickCount;
counterText.setText('Clicks: ' + clickCount);
// Don't update coins text here - let the animation handle it
// Visual feedback for special effects
if (isCritical || isLucky) {
var effectText = isCritical ? 'CRITICAL!' : 'LUCKY STRIKE!';
LK.effects.flashScreen(isCritical ? 0xff5555 : 0x50fa7b, 300);
buttonText.setText(effectText);
}
// Check for jumpscare at every hundred
if (clickCount % 100 === 0) {
triggerJumpscare();
}
}
// Function to create visual coin drop effect
function createCoinDrop(startX, startY, coinValue) {
// Create coin visual - start from bottom of screen
var coinDrop = game.addChild(LK.getAsset('coin', {
anchorX: 0.5,
anchorY: 0.5,
width: 80,
height: 80
}));
coinDrop.x = startX + (Math.random() * 100 - 50); // Random spread around button
coinDrop.y = 2732; // Start from bottom of screen
coinDrop.tint = 0xff79c6; // Coral pink color
// Create coin text
var coinText = new Text2('+' + coinValue, {
size: 60,
fill: 0xff79c6
});
coinText.anchor.set(0.5, 0.5);
coinText.x = coinDrop.x;
coinText.y = coinDrop.y - 20;
game.addChild(coinText);
// Animate coin jumping up to coin counter with bounce effect
tween(coinDrop, {
x: coinsText.x,
y: coinsText.y
}, {
duration: 800,
easing: tween.bounceOut,
onFinish: function onFinish() {
// Update coin counter when coin reaches destination
coins += coinValue;
storage.coins = coins;
coinsText.setText('Coins: ' + coins);
// Flash the coin counter to show update
tween(coinsText, {
scaleX: 1.2,
scaleY: 1.2
}, {
duration: 100,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(coinsText, {
scaleX: 1.0,
scaleY: 1.0
}, {
duration: 100,
easing: tween.easeOut
});
}
});
}
});
tween(coinText, {
x: coinsText.x,
y: coinsText.y - 50
}, {
duration: 800,
easing: tween.bounceOut
});
// Remove coin after animation
LK.setTimeout(function () {
if (coinDrop.parent) {
coinDrop.destroy();
}
if (coinText.parent) {
coinText.destroy();
}
}, 1000);
}
// Function to trigger jumpscare
function triggerJumpscare() {
// Array of scary messages
var scaryMessages = ['BOO!', 'GOTCHA!', 'SURPRISE!', 'SCARED YET?', 'JUMP!', 'AAAHHH!', 'SPOOKY!', 'FEAR ME!'];
var randomMessage = scaryMessages[Math.floor(Math.random() * scaryMessages.length)];
// Random jumpscare type (0-3)
var jumpscareType = Math.floor(Math.random() * 4);
if (jumpscareType === 0) {
// Type 1: Pink flash with dramatic scale and shake
LK.effects.flashScreen(0xff5555, 500);
tween(button, {
scaleX: 3,
scaleY: 3
}, {
duration: 200,
easing: tween.bounceOut
});
tween(button, {
x: button.x + Math.random() * 40 - 20,
y: button.y + Math.random() * 40 - 20
}, {
duration: 50
});
} else if (jumpscareType === 1) {
// Type 2: Purple flash with spin and grow
LK.effects.flashScreen(0x8b5cf6, 700);
tween(button, {
scaleX: 2.5,
scaleY: 2.5,
rotation: Math.PI * 2
}, {
duration: 400,
easing: tween.elasticOut
});
} else if (jumpscareType === 2) {
// Type 3: Orange flash with rapid shake
LK.effects.flashScreen(0xffb86c, 600);
var shakeCount = 0;
var shakeInterval = LK.setInterval(function () {
button.x = 2048 / 2 + Math.random() * 60 - 30;
button.y = 2732 / 2 - 100 + Math.random() * 60 - 30;
shakeCount++;
if (shakeCount >= 10) {
LK.clearInterval(shakeInterval);
}
}, 30);
} else {
// Type 4: Green flash with wild scaling
LK.effects.flashScreen(0x50fa7b, 400);
tween(button, {
scaleX: 4,
scaleY: 0.5
}, {
duration: 150,
easing: tween.easeIn
});
LK.setTimeout(function () {
tween(button, {
scaleX: 0.5,
scaleY: 4
}, {
duration: 150,
easing: tween.easeOut
});
}, 150);
}
// Scale back down after a moment
LK.setTimeout(function () {
tween(button, {
scaleX: 1,
scaleY: 1,
rotation: 0,
x: 2048 / 2,
y: 2732 / 2 - 100
}, {
duration: 300,
easing: tween.easeOut
});
tween(buttonShadow, {
scaleX: 1,
scaleY: 1,
rotation: 0,
x: 2048 / 2 + 8,
y: 2732 / 2 - 100 + 8
}, {
duration: 300,
easing: tween.easeOut
});
}, 300);
// Change button text to random scary message
buttonText.setText(randomMessage + ' ' + clickCount + ' CLICKS!');
}
// Handle button clicks
button.down = function (x, y, obj) {
if (currentTab === 'infinity') {
processClick(1);
if (clickCount % 100 !== 0) {
// Change button text to random message
buttonText.setText(buttonTexts[Math.floor(Math.random() * buttonTexts.length)]);
}
// Play click sound
LK.getSound('click').play();
}
// Visual feedback - scale button down slightly and move shadow
button.scaleX = 0.95;
button.scaleY = 0.95;
buttonShadow.scaleX = 0.95;
buttonShadow.scaleY = 0.95;
buttonShadow.x = 2048 / 2 + 4;
buttonShadow.y = 2732 / 2 - 100 + 4;
};
button.up = function (x, y, obj) {
// Return button to normal size and shadow position
button.scaleX = 1.0;
button.scaleY = 1.0;
buttonShadow.scaleX = 1.0;
buttonShadow.scaleY = 1.0;
buttonShadow.x = 2048 / 2 + 8;
buttonShadow.y = 2732 / 2 - 100 + 8;
};
// Game update loop
game.update = function () {
checkCardEffects();
};
// Weird logo click handler
weirdLogo.down = function () {
if (developerMode && !developerTabUnlocked) {
showDeveloperMode();
} else if (!developerMode) {
showCodeInput();
}
};
// Function to update all language-dependent text elements
function updateLanguageDisplay() {
var lang = languages[currentLanguage];
// Update tab texts
infinityTabText.setText(lang.infinity);
cardsTabText.setText(lang.cards);
developerTabText.setText(lang.developer);
// Update button texts array
updateButtonTexts();
// Update button text if it's showing default text
if (buttonTexts.includes(buttonText.text)) {
buttonText.setText(buttonTexts[Math.floor(Math.random() * buttonTexts.length)]);
}
// Update counter and coins text
counterText.setText(lang.clicks + clickCount);
coinsText.setText(lang.coins + coins);
// Language button now shows hashtag - no need to update
// Update buy/sell slot button texts
buySlotTextMain.setText(lang.buySlot + ' (50)');
sellSlotTextMain.setText(lang.sellSlot + ' (25)');
// Update store button text
storeMenuText.setText(lang.store);
// Update back button text if store is visible
if (currentTab === 'store') {
updateStoreDisplay();
}
}
// Initialize containers as hidden
cardSelectorContainer.visible = false;
developerContainer.visible = false;
codeInputContainer.visible = false;
languageMenuContainer.visible = false;
// Initialize the display
updateLanguageDisplay();
updateTabDisplay();
// Start background music
LK.playMusic('background');
; /****
* Plugins
****/
var storage = LK.import("@upit/storage.v1");
var tween = LK.import("@upit/tween.v1");
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x1a1a2e
});
/****
* Game Code
****/
var currentTab = storage.currentTab || 'infinity';
var clickCount = storage.clickCount || 0;
var developerMode = storage.developerMode || false;
var developerTabUnlocked = storage.developerTabUnlocked || false;
var inputCode = '';
var isInputting = false;
var currentLanguage = storage.currentLanguage || 'english';
// Language data
var languages = {
english: {
infinity: 'INFINITY',
cards: 'CARDS',
developer: 'DEVELOPER',
clickMe: 'CLICK ME!',
tapHere: 'TAP HERE!',
pressMe: 'PRESS ME!',
hitIt: 'HIT IT!',
clickNow: 'CLICK NOW!',
tapAway: 'TAP AWAY!',
pushIt: 'PUSH IT!',
goAhead: 'GO AHEAD!',
clickThis: 'CLICK THIS!',
tapTap: 'TAP TAP!',
clicks: 'Clicks: ',
coins: 'Coins: ',
buySlot: 'Buy Slot',
sellSlot: 'Sell Slot',
store: 'STORE',
back: 'BACK',
language: 'Language',
english: 'English',
turkish: 'Turkish'
},
turkish: {
infinity: 'SONSUZ',
cards: 'KARTLAR',
developer: 'GELİŞTİRİCİ',
clickMe: 'TIKLA!',
tapHere: 'BURAYA DOKUN!',
pressMe: 'BAS!',
hitIt: 'VUR!',
clickNow: 'ŞIMDI TIKLA!',
tapAway: 'DOKUN!',
pushIt: 'İT!',
goAhead: 'DEVAM ET!',
clickThis: 'BUNU TIKLA!',
tapTap: 'TIKLA TIKLA!',
clicks: 'Tıklama: ',
coins: 'Altın: ',
buySlot: 'Slot Al',
sellSlot: 'Slot Sat',
store: 'MAĞAZA',
back: 'GERİ',
language: 'Dil',
english: 'İngilizce',
turkish: 'Türkçe'
}
};
// Create weird logo in top right corner
var weirdLogo = game.addChild(LK.getAsset('weirdLogo', {
anchorX: 0.5,
anchorY: 0.5,
width: 120,
height: 120
}));
weirdLogo.x = 2048 - 150;
weirdLogo.y = 150;
weirdLogo.tint = 0x420069;
// Make the logo spin continuously
var logoSpinTimer = LK.setInterval(function () {
weirdLogo.rotation += 0.1;
// Random color changes
if (Math.random() < 0.1) {
weirdLogo.tint = Math.random() * 0xffffff;
}
}, 50);
// Developer mode UI container
var developerContainer = new Container();
game.addChild(developerContainer);
// Code input overlay
var codeInputContainer = new Container();
game.addChild(codeInputContainer);
// Store cards definition (needed before equippedCards initialization)
var storeCards = [{
name: 'Critical Hit',
description: '15% chance for critical hit (2x damage)',
price: 100
}, {
name: 'Auto Clicker',
description: 'One click per second automatically',
price: 200
}, {
name: 'Double Coins',
description: 'Earn 2x coins from clicks',
price: 300
}, {
name: 'Lucky Strike',
description: '10% chance for 5x click value',
price: 250
}];
// Cards and store variables
var cards = storage.cards || [];
// Convert stored owned cards back to objects
var storedOwnedCards = storage.ownedCards || [];
var ownedCards = [];
for (var i = 0; i < storedOwnedCards.length; i++) {
// Find the card object from storeCards array
for (var j = 0; j < storeCards.length; j++) {
if (storeCards[j].name === storedOwnedCards[i]) {
ownedCards.push(storeCards[j]);
break;
}
}
}
// Convert stored equipped cards back to objects
var storedEquippedCards = storage.equippedCards || [];
var equippedCards = [];
for (var i = 0; i < storedEquippedCards.length; i++) {
if (storedEquippedCards[i]) {
// Find the card object from storeCards array
for (var j = 0; j < storeCards.length; j++) {
if (storeCards[j].name === storedEquippedCards[i]) {
equippedCards[i] = storeCards[j];
break;
}
}
} else {
equippedCards[i] = null;
}
}
var cardSlots = storage.cardSlots || 1;
var coins = storage.coins || 0;
var currentTab = storage.currentTab || 'infinity';
// Create tab button shadows
var infinityTabShadow = game.addChild(LK.getAsset('button', {
anchorX: 0.5,
anchorY: 0.5,
width: 500,
height: 160
}));
infinityTabShadow.tint = 0x000000;
infinityTabShadow.alpha = 0.3;
infinityTabShadow.x = 2048 / 2 - 400 + 6;
infinityTabShadow.y = 200 + 6;
var cardsTabShadow = game.addChild(LK.getAsset('button', {
anchorX: 0.5,
anchorY: 0.5,
width: 500,
height: 160
}));
cardsTabShadow.tint = 0x000000;
cardsTabShadow.alpha = 0.3;
cardsTabShadow.x = 2048 / 2 + 400 + 6;
cardsTabShadow.y = 200 + 6;
// Developer tab shadow (initially hidden)
var developerTabShadow = game.addChild(LK.getAsset('button', {
anchorX: 0.5,
anchorY: 0.5,
width: 400,
height: 160
}));
developerTabShadow.tint = 0x000000;
developerTabShadow.alpha = 0.3;
developerTabShadow.x = 2048 / 2 + 6;
developerTabShadow.y = 350 + 6;
developerTabShadow.visible = false;
// Create tab buttons
var infinityTab = game.addChild(LK.getAsset('button', {
anchorX: 0.5,
anchorY: 0.5,
width: 500,
height: 160
}));
infinityTab.x = 2048 / 2 - 400;
infinityTab.y = 200;
var cardsTab = game.addChild(LK.getAsset('button', {
anchorX: 0.5,
anchorY: 0.5,
width: 500,
height: 160
}));
cardsTab.x = 2048 / 2 + 400;
cardsTab.y = 200;
// Developer tab button (initially hidden)
var developerTab = game.addChild(LK.getAsset('button', {
anchorX: 0.5,
anchorY: 0.5,
width: 400,
height: 160
}));
developerTab.x = 2048 / 2;
developerTab.y = 350;
developerTab.tint = 0x420069;
developerTab.visible = false;
// Tab text
var infinityTabText = new Text2('INFINITY', {
size: 60,
fill: 0xffffff
});
infinityTabText.anchor.set(0.5, 0.5);
infinityTabText.x = infinityTab.x;
infinityTabText.y = infinityTab.y;
game.addChild(infinityTabText);
var cardsTabText = new Text2('CARDS', {
size: 60,
fill: 0xffffff
});
cardsTabText.anchor.set(0.5, 0.5);
cardsTabText.x = cardsTab.x;
cardsTabText.y = cardsTab.y;
game.addChild(cardsTabText);
// Developer tab text (initially hidden)
var developerTabText = new Text2('DEVELOPER', {
size: 50,
fill: 0xffffff
});
developerTabText.anchor.set(0.5, 0.5);
developerTabText.x = developerTab.x;
developerTabText.y = developerTab.y;
developerTabText.visible = false;
game.addChild(developerTabText);
// Create button shadow
var buttonShadow = game.addChild(LK.getAsset('button', {
anchorX: 0.5,
anchorY: 0.5
}));
buttonShadow.tint = 0x000000;
buttonShadow.alpha = 0.3;
buttonShadow.x = 2048 / 2 + 8;
buttonShadow.y = 2732 / 2 - 100 + 8;
// Create the main button
var button = game.addChild(LK.getAsset('button', {
anchorX: 0.5,
anchorY: 0.5
}));
// Position button in center of screen
button.x = 2048 / 2;
button.y = 2732 / 2 - 100;
// Array of random button texts - will be updated by language system
var buttonTexts = ['CLICK ME!', 'TAP HERE!', 'PRESS ME!', 'HIT IT!', 'CLICK NOW!', 'TAP AWAY!', 'PUSH IT!', 'GO AHEAD!', 'CLICK THIS!', 'TAP TAP!'];
// Function to update button texts based on language
function updateButtonTexts() {
var lang = languages[currentLanguage];
buttonTexts = [lang.clickMe, lang.tapHere, lang.pressMe, lang.hitIt, lang.clickNow, lang.tapAway, lang.pushIt, lang.goAhead, lang.clickThis, lang.tapTap];
}
// Create button text with random initial text
var buttonText = new Text2(buttonTexts[Math.floor(Math.random() * buttonTexts.length)], {
size: 60,
fill: 0xffffff
});
buttonText.anchor.set(0.5, 0.5);
buttonText.x = button.x;
buttonText.y = button.y;
game.addChild(buttonText);
// Create counter text
var counterText = new Text2('Clicks: 0', {
size: 160,
fill: 0x50fa7b
});
counterText.anchor.set(0.5, 0.5);
counterText.x = 2048 / 2;
counterText.y = 2732 / 2 + 300;
game.addChild(counterText);
// Create coins display
var coinsText = new Text2('Coins: ' + coins, {
size: 100,
fill: 0xff79c6
});
coinsText.anchor.set(0.5, 0.5);
coinsText.x = 2048 / 2 - 300;
coinsText.y = 700;
game.addChild(coinsText);
// Create language menu button
var languageButton = game.addChild(LK.getAsset('button', {
anchorX: 0.5,
anchorY: 0.5,
width: 300,
height: 100
}));
languageButton.x = 2048 / 2 - 700;
languageButton.y = 700;
languageButton.tint = 0x42069;
var languageText = new Text2('#', {
size: 40,
fill: 0xffffff
});
languageText.anchor.set(0.5, 0.5);
languageText.x = languageButton.x;
languageText.y = languageButton.y;
game.addChild(languageText);
// Language menu container
var languageMenuContainer = new Container();
game.addChild(languageMenuContainer);
languageButton.down = function () {
showLanguageMenu();
};
// Function to show language selection menu
function showLanguageMenu() {
languageMenuContainer.removeChildren();
languageMenuContainer.visible = true;
// Background overlay
var languageOverlay = languageMenuContainer.addChild(LK.getAsset('button', {
anchorX: 0.5,
anchorY: 0.5,
width: 2048,
height: 2732
}));
languageOverlay.tint = 0x000000;
languageOverlay.alpha = 0.7;
languageOverlay.x = 2048 / 2;
languageOverlay.y = 2732 / 2;
// Language selection panel
var languagePanel = languageMenuContainer.addChild(LK.getAsset('button', {
anchorX: 0.5,
anchorY: 0.5,
width: 800,
height: 600
}));
languagePanel.tint = 0x2d3748;
languagePanel.x = 2048 / 2;
languagePanel.y = 2732 / 2;
// Title
var languageTitle = new Text2('Select Language', {
size: 80,
fill: 0xffffff
});
languageTitle.anchor.set(0.5, 0.5);
languageTitle.x = languagePanel.x;
languageTitle.y = languagePanel.y - 200;
languageMenuContainer.addChild(languageTitle);
// Close button
var closeLanguageButton = languageMenuContainer.addChild(LK.getAsset('button', {
anchorX: 0.5,
anchorY: 0.5,
width: 120,
height: 80
}));
closeLanguageButton.x = languagePanel.x + 340;
closeLanguageButton.y = languagePanel.y - 200;
closeLanguageButton.tint = 0xff5555;
var closeLanguageText = new Text2('X', {
size: 50,
fill: 0xffffff
});
closeLanguageText.anchor.set(0.5, 0.5);
closeLanguageText.x = closeLanguageButton.x;
closeLanguageText.y = closeLanguageButton.y;
languageMenuContainer.addChild(closeLanguageText);
closeLanguageButton.down = function () {
languageMenuContainer.visible = false;
};
// English button
var englishButton = languageMenuContainer.addChild(LK.getAsset('button', {
anchorX: 0.5,
anchorY: 0.5,
width: 600,
height: 120
}));
englishButton.x = languagePanel.x;
englishButton.y = languagePanel.y - 50;
englishButton.tint = currentLanguage === 'english' ? 0x50fa7b : 0x4a90e2;
var englishText = new Text2('English', {
size: 60,
fill: 0xffffff
});
englishText.anchor.set(0.5, 0.5);
englishText.x = englishButton.x;
englishText.y = englishButton.y;
languageMenuContainer.addChild(englishText);
englishButton.down = function () {
if (currentLanguage !== 'english') {
currentLanguage = 'english';
storage.currentLanguage = currentLanguage;
updateLanguageDisplay();
LK.effects.flashScreen(0x50fa7b, 300);
}
languageMenuContainer.visible = false;
};
// Turkish button
var turkishButton = languageMenuContainer.addChild(LK.getAsset('button', {
anchorX: 0.5,
anchorY: 0.5,
width: 600,
height: 120
}));
turkishButton.x = languagePanel.x;
turkishButton.y = languagePanel.y + 100;
turkishButton.tint = currentLanguage === 'turkish' ? 0x50fa7b : 0x4a90e2;
var turkishText = new Text2('Türkçe', {
size: 60,
fill: 0xffffff
});
turkishText.anchor.set(0.5, 0.5);
turkishText.x = turkishButton.x;
turkishText.y = turkishButton.y;
languageMenuContainer.addChild(turkishText);
turkishButton.down = function () {
if (currentLanguage !== 'turkish') {
currentLanguage = 'turkish';
storage.currentLanguage = currentLanguage;
updateLanguageDisplay();
LK.effects.flashScreen(0x50fa7b, 300);
}
languageMenuContainer.visible = false;
};
}
// Create buy slot button next to coin counter
var buySlotButtonMain = game.addChild(LK.getAsset('button', {
anchorX: 0.5,
anchorY: 0.5,
width: 400,
height: 120
}));
buySlotButtonMain.x = 2048 / 2 + 100;
buySlotButtonMain.y = 700;
buySlotButtonMain.tint = 0x50fa7b;
buySlotButtonMain.visible = false;
var buySlotTextMain = new Text2('Buy Slot (50)', {
size: 50,
fill: 0xffffff
});
buySlotTextMain.anchor.set(0.5, 0.5);
buySlotTextMain.x = buySlotButtonMain.x;
buySlotTextMain.y = buySlotButtonMain.y;
buySlotTextMain.visible = false;
game.addChild(buySlotTextMain);
// Create sell slot button next to buy slot button
var sellSlotButtonMain = game.addChild(LK.getAsset('button', {
anchorX: 0.5,
anchorY: 0.5,
width: 400,
height: 120
}));
sellSlotButtonMain.x = 2048 / 2 + 500;
sellSlotButtonMain.y = 700;
sellSlotButtonMain.tint = 0xff5555;
sellSlotButtonMain.visible = false;
var sellSlotTextMain = new Text2('Sell Slot (25)', {
size: 50,
fill: 0xffffff
});
sellSlotTextMain.anchor.set(0.5, 0.5);
sellSlotTextMain.x = sellSlotButtonMain.x;
sellSlotTextMain.y = sellSlotButtonMain.y;
sellSlotTextMain.visible = false;
game.addChild(sellSlotTextMain);
sellSlotButtonMain.down = function () {
if (cardSlots > 1) {
// Remove card from the last slot if it exists
if (equippedCards[cardSlots - 1]) {
equippedCards[cardSlots - 1] = null;
}
// Remove the slot
cardSlots--;
coins += 25;
storage.coins = coins;
storage.cardSlots = cardSlots;
// Update equipped cards storage
var equippedCardNames = [];
for (var i = 0; i < equippedCards.length; i++) {
equippedCardNames[i] = equippedCards[i] ? equippedCards[i].name : null;
}
storage.equippedCards = equippedCardNames;
coinsText.setText('Coins: ' + coins);
updateCardSlots();
updateBuySlotButton();
}
};
buySlotButtonMain.down = function () {
if (coins >= 50 && cardSlots < 9) {
coins -= 50;
cardSlots++;
storage.coins = coins;
storage.cardSlots = cardSlots;
coinsText.setText('Coins: ' + coins);
updateCardSlots();
updateBuySlotButton();
}
};
function updateBuySlotButton() {
if (currentTab === 'cards') {
// Show buy button only if less than 9 slots
if (cardSlots < 9) {
buySlotButtonMain.visible = true;
buySlotTextMain.visible = true;
} else {
buySlotButtonMain.visible = false;
buySlotTextMain.visible = false;
}
// Show sell button only if more than 1 slot
if (cardSlots > 1) {
sellSlotButtonMain.visible = true;
sellSlotTextMain.visible = true;
} else {
sellSlotButtonMain.visible = false;
sellSlotTextMain.visible = false;
}
} else {
buySlotButtonMain.visible = false;
buySlotTextMain.visible = false;
sellSlotButtonMain.visible = false;
sellSlotTextMain.visible = false;
}
}
// Cards menu container
var cardsMenuContainer = new Container();
game.addChild(cardsMenuContainer);
// Create store menu button shadow
var storeMenuButtonShadow = cardsMenuContainer.addChild(LK.getAsset('button', {
anchorX: 0.5,
anchorY: 0.5,
width: 800,
height: 200
}));
storeMenuButtonShadow.tint = 0x000000;
storeMenuButtonShadow.alpha = 0.3;
storeMenuButtonShadow.x = 2048 / 2 + 8;
storeMenuButtonShadow.y = 400 + 8;
// Create store menu button only
var storeMenuButton = cardsMenuContainer.addChild(LK.getAsset('button', {
anchorX: 0.5,
anchorY: 0.5,
width: 800,
height: 200
}));
storeMenuButton.x = 2048 / 2;
storeMenuButton.y = 400;
var storeMenuText = new Text2('STORE', {
size: 80,
fill: 0xffffff
});
storeMenuText.anchor.set(0.5, 0.5);
storeMenuText.x = storeMenuButton.x;
storeMenuText.y = storeMenuButton.y;
cardsMenuContainer.addChild(storeMenuText);
// Cards tab UI elements
var cardSlotsContainer = new Container();
game.addChild(cardSlotsContainer);
var cardSlotButtons = [];
var cardSlotTexts = [];
// Scrolling variables for cards tab
var cardsScrollY = 0;
var cardsScrolling = false;
var cardsStartY = 0;
var cardsLastY = 0;
var cardsHolding = false;
var cardsHoldTimer = null;
var cardsScrollContainer = new Container();
cardSlotsContainer.addChild(cardsScrollContainer);
// Store tab UI elements
var storeContainer = new Container();
game.addChild(storeContainer);
// Function to show developer mode
function showDeveloperMode() {
developerContainer.removeChildren();
developerContainer.visible = true;
// Background overlay
var devOverlay = developerContainer.addChild(LK.getAsset('button', {
anchorX: 0.5,
anchorY: 0.5,
width: 2048,
height: 2732
}));
devOverlay.tint = 0x000000;
devOverlay.alpha = 0.8;
devOverlay.x = 2048 / 2;
devOverlay.y = 2732 / 2;
// Developer panel
var devPanel = developerContainer.addChild(LK.getAsset('button', {
anchorX: 0.5,
anchorY: 0.5,
width: 1800,
height: 2200
}));
devPanel.tint = 0x1a1a2e;
devPanel.x = 2048 / 2;
devPanel.y = 2732 / 2;
// Title
var devTitle = new Text2('DEVELOPER MODE', {
size: 100,
fill: 0x42069
});
devTitle.anchor.set(0.5, 0.5);
devTitle.x = devPanel.x;
devTitle.y = devPanel.y - 900;
developerContainer.addChild(devTitle);
// Close button
var closeDevButton = developerContainer.addChild(LK.getAsset('button', {
anchorX: 0.5,
anchorY: 0.5,
width: 200,
height: 100
}));
closeDevButton.x = devPanel.x + 800;
closeDevButton.y = devPanel.y - 900;
closeDevButton.tint = 0xff5555;
var closeDevText = new Text2('X', {
size: 60,
fill: 0xffffff
});
closeDevText.anchor.set(0.5, 0.5);
closeDevText.x = closeDevButton.x;
closeDevText.y = closeDevButton.y;
developerContainer.addChild(closeDevText);
closeDevButton.down = function () {
developerContainer.visible = false;
};
// Add coins button
var addCoinsButton = developerContainer.addChild(LK.getAsset('button', {
anchorX: 0.5,
anchorY: 0.5,
width: 800,
height: 200
}));
addCoinsButton.x = devPanel.x;
addCoinsButton.y = devPanel.y - 600;
addCoinsButton.tint = 0x50fa7b;
var addCoinsText = new Text2('Add 1000 Coins', {
size: 80,
fill: 0xffffff
});
addCoinsText.anchor.set(0.5, 0.5);
addCoinsText.x = addCoinsButton.x;
addCoinsText.y = addCoinsButton.y;
developerContainer.addChild(addCoinsText);
addCoinsButton.down = function () {
coins += 1000;
storage.coins = coins;
coinsText.setText('Coins: ' + coins);
LK.effects.flashScreen(0x50fa7b, 300);
};
// Max clicks button
var maxClicksButton = developerContainer.addChild(LK.getAsset('button', {
anchorX: 0.5,
anchorY: 0.5,
width: 800,
height: 200
}));
maxClicksButton.x = devPanel.x;
maxClicksButton.y = devPanel.y - 300;
maxClicksButton.tint = 0x8b5cf6;
var maxClicksText = new Text2('Add 10000 Clicks', {
size: 80,
fill: 0xffffff
});
maxClicksText.anchor.set(0.5, 0.5);
maxClicksText.x = maxClicksButton.x;
maxClicksText.y = maxClicksButton.y;
developerContainer.addChild(maxClicksText);
maxClicksButton.down = function () {
clickCount += 10000;
storage.clickCount = clickCount;
counterText.setText('Clicks: ' + clickCount);
LK.effects.flashScreen(0x8b5cf6, 300);
};
// Unlock all cards button
var unlockCardsButton = developerContainer.addChild(LK.getAsset('button', {
anchorX: 0.5,
anchorY: 0.5,
width: 800,
height: 200
}));
unlockCardsButton.x = devPanel.x;
unlockCardsButton.y = devPanel.y;
unlockCardsButton.tint = 0xff79c6;
var unlockCardsText = new Text2('Unlock All Cards', {
size: 80,
fill: 0xffffff
});
unlockCardsText.anchor.set(0.5, 0.5);
unlockCardsText.x = unlockCardsButton.x;
unlockCardsText.y = unlockCardsButton.y;
developerContainer.addChild(unlockCardsText);
unlockCardsButton.down = function () {
for (var i = 0; i < storeCards.length; i++) {
var alreadyOwned = false;
for (var j = 0; j < ownedCards.length; j++) {
if (ownedCards[j].name === storeCards[i].name) {
alreadyOwned = true;
break;
}
}
if (!alreadyOwned) {
ownedCards.push(storeCards[i]);
}
}
// Convert ownedCards to storage-compatible format
var ownedCardNames = [];
for (var k = 0; k < ownedCards.length; k++) {
ownedCardNames.push(ownedCards[k].name);
}
storage.ownedCards = ownedCardNames;
LK.effects.flashScreen(0xff79c6, 300);
};
// Max card slots button
var maxSlotsButton = developerContainer.addChild(LK.getAsset('button', {
anchorX: 0.5,
anchorY: 0.5,
width: 800,
height: 200
}));
maxSlotsButton.x = devPanel.x;
maxSlotsButton.y = devPanel.y + 300;
maxSlotsButton.tint = 0xffb86c;
var maxSlotsText = new Text2('Max Out Card Slots (9)', {
size: 80,
fill: 0xffffff
});
maxSlotsText.anchor.set(0.5, 0.5);
maxSlotsText.x = maxSlotsButton.x;
maxSlotsText.y = maxSlotsButton.y;
developerContainer.addChild(maxSlotsText);
maxSlotsButton.down = function () {
cardSlots = 9;
storage.cardSlots = cardSlots;
updateCardSlots();
updateBuySlotButton();
LK.effects.flashScreen(0xffb86c, 300);
};
// Reset game button
var resetButton = developerContainer.addChild(LK.getAsset('button', {
anchorX: 0.5,
anchorY: 0.5,
width: 800,
height: 200
}));
resetButton.x = devPanel.x;
resetButton.y = devPanel.y + 600;
resetButton.tint = 0xff0000;
var resetText = new Text2('Reset Game', {
size: 80,
fill: 0xffffff
});
resetText.anchor.set(0.5, 0.5);
resetText.x = resetButton.x;
resetText.y = resetButton.y;
developerContainer.addChild(resetText);
resetButton.down = function () {
// Clear all storage data
storage.clickCount = 0;
storage.coins = 0;
storage.cards = [];
storage.ownedCards = [];
storage.equippedCards = [];
storage.cardSlots = 1;
storage.currentTab = 'infinity';
storage.developerMode = false;
storage.developerTabUnlocked = false;
// Flash red and show game over to restart
LK.effects.flashScreen(0xff0000, 1000);
LK.showGameOver();
};
// Lock developer mode button
var lockDevButton = developerContainer.addChild(LK.getAsset('button', {
anchorX: 0.5,
anchorY: 0.5,
width: 800,
height: 200
}));
lockDevButton.x = devPanel.x;
lockDevButton.y = devPanel.y + 900;
lockDevButton.tint = 0xff5555;
var lockDevText = new Text2('Lock Developer Mode', {
size: 80,
fill: 0xffffff
});
lockDevText.anchor.set(0.5, 0.5);
lockDevText.x = lockDevButton.x;
lockDevText.y = lockDevButton.y;
developerContainer.addChild(lockDevText);
lockDevButton.down = function () {
developerMode = false;
developerTabUnlocked = false;
storage.developerMode = developerMode;
storage.developerTabUnlocked = developerTabUnlocked;
currentTab = 'infinity';
storage.currentTab = currentTab;
updateTabDisplay();
developerContainer.visible = false;
LK.effects.flashScreen(0xff5555, 300);
};
}
// Function to show code input
function showCodeInput() {
codeInputContainer.removeChildren();
codeInputContainer.visible = true;
isInputting = true;
inputCode = '';
// Background overlay
var inputOverlay = codeInputContainer.addChild(LK.getAsset('button', {
anchorX: 0.5,
anchorY: 0.5,
width: 2048,
height: 2732
}));
inputOverlay.tint = 0x000000;
inputOverlay.alpha = 0.7;
inputOverlay.x = 2048 / 2;
inputOverlay.y = 2732 / 2;
// Input panel
var inputPanel = codeInputContainer.addChild(LK.getAsset('button', {
anchorX: 0.5,
anchorY: 0.5,
width: 1200,
height: 800
}));
inputPanel.tint = 0x2d3748;
inputPanel.x = 2048 / 2;
inputPanel.y = 2732 / 2;
// Title
var inputTitle = new Text2('Enter Developer Code', {
size: 80,
fill: 0xffffff
});
inputTitle.anchor.set(0.5, 0.5);
inputTitle.x = inputPanel.x;
inputTitle.y = inputPanel.y - 250;
codeInputContainer.addChild(inputTitle);
// Code display
var codeDisplay = new Text2('*****', {
size: 120,
fill: 0x42069
});
codeDisplay.anchor.set(0.5, 0.5);
codeDisplay.x = inputPanel.x;
codeDisplay.y = inputPanel.y - 50;
codeInputContainer.addChild(codeDisplay);
// Number buttons
var numberButtons = [];
for (var i = 0; i < 10; i++) {
var numButton = codeInputContainer.addChild(LK.getAsset('button', {
anchorX: 0.5,
anchorY: 0.5,
width: 120,
height: 120
}));
numButton.x = inputPanel.x - 250 + i % 5 * 125;
numButton.y = inputPanel.y + 150 + Math.floor(i / 5) * 140;
numButton.tint = 0x4a90e2;
var numText = new Text2(i.toString(), {
size: 60,
fill: 0xffffff
});
numText.anchor.set(0.5, 0.5);
numText.x = numButton.x;
numText.y = numButton.y;
codeInputContainer.addChild(numText);
numButton.digit = i;
numButton.down = function () {
if (inputCode.length < 5) {
inputCode += this.digit.toString();
var displayCode = '';
for (var j = 0; j < inputCode.length; j++) {
displayCode += inputCode[j];
}
for (var k = inputCode.length; k < 5; k++) {
displayCode += '*';
}
codeDisplay.setText(displayCode);
if (inputCode.length === 5) {
LK.setTimeout(function () {
if (inputCode === '96469') {
developerMode = true;
developerTabUnlocked = true;
storage.developerMode = developerMode;
storage.developerTabUnlocked = developerTabUnlocked;
currentTab = 'developer';
storage.currentTab = currentTab;
updateTabDisplay();
LK.effects.flashScreen(0x50fa7b, 500);
} else {
LK.effects.flashScreen(0xff5555, 500);
}
codeInputContainer.visible = false;
isInputting = false;
}, 500);
}
}
};
numberButtons.push(numButton);
}
// Close button
var closeInputButton = codeInputContainer.addChild(LK.getAsset('button', {
anchorX: 0.5,
anchorY: 0.5,
width: 200,
height: 100
}));
closeInputButton.x = inputPanel.x + 500;
closeInputButton.y = inputPanel.y - 250;
closeInputButton.tint = 0xff5555;
var closeInputText = new Text2('X', {
size: 60,
fill: 0xffffff
});
closeInputText.anchor.set(0.5, 0.5);
closeInputText.x = closeInputButton.x;
closeInputText.y = closeInputButton.y;
codeInputContainer.addChild(closeInputText);
closeInputButton.down = function () {
codeInputContainer.visible = false;
isInputting = false;
};
}
// Function to update tab visibility
function updateTabDisplay() {
// Show/hide developer tab based on unlock status
developerTab.visible = developerTabUnlocked;
developerTabShadow.visible = developerTabUnlocked;
developerTabText.visible = developerTabUnlocked;
if (currentTab === 'infinity') {
// Show infinity mode elements
button.visible = true;
buttonText.visible = true;
buttonShadow.visible = true;
counterText.visible = true;
counterText.setText('Clicks: ' + clickCount);
coinsText.visible = true;
// Hide other mode elements
cardSlotsContainer.visible = false;
storeContainer.visible = false;
cardsMenuContainer.visible = false;
developerContainer.visible = false;
// Hide buy slot button
updateBuySlotButton();
// Update tab colors
infinityTab.tint = 0x8b5cf6;
cardsTab.tint = 0x4a90e2;
if (developerTabUnlocked) developerTab.tint = 0x4a90e2;
} else if (currentTab === 'cards') {
// Show cards mode elements with card slots
button.visible = false;
buttonText.visible = false;
buttonShadow.visible = false;
counterText.visible = false;
coinsText.visible = true;
cardSlotsContainer.visible = true;
storeContainer.visible = false;
cardsMenuContainer.visible = true;
developerContainer.visible = false;
// Update card slots display
updateCardSlots();
// Update buy slot button visibility
updateBuySlotButton();
// Update tab colors
infinityTab.tint = 0x4a90e2;
cardsTab.tint = 0x8b5cf6;
if (developerTabUnlocked) developerTab.tint = 0x4a90e2;
} else if (currentTab === 'store') {
// Show store mode elements
button.visible = false;
buttonText.visible = false;
buttonShadow.visible = false;
counterText.visible = false;
coinsText.visible = true;
cardSlotsContainer.visible = false;
storeContainer.visible = true;
cardsMenuContainer.visible = false;
developerContainer.visible = false;
// Update store display
updateStoreDisplay();
// Update tab colors
infinityTab.tint = 0x4a90e2;
cardsTab.tint = 0x8b5cf6;
if (developerTabUnlocked) developerTab.tint = 0x4a90e2;
} else if (currentTab === 'developer') {
// Show developer mode elements
button.visible = false;
buttonText.visible = false;
buttonShadow.visible = false;
counterText.visible = false;
coinsText.visible = true;
cardSlotsContainer.visible = false;
storeContainer.visible = false;
cardsMenuContainer.visible = false;
developerContainer.visible = true;
showDeveloperMode();
// Update tab colors
infinityTab.tint = 0x4a90e2;
cardsTab.tint = 0x4a90e2;
if (developerTabUnlocked) developerTab.tint = 0x8b5cf6;
}
}
// Card selector container
var cardSelectorContainer = new Container();
game.addChild(cardSelectorContainer);
var selectedSlotIndex = -1;
// Function to open card selector
function openCardSelector(slotIndex) {
selectedSlotIndex = slotIndex;
// Clear existing selector UI
cardSelectorContainer.removeChildren();
cardSelectorContainer.visible = true;
// Create background overlay
var overlay = cardSelectorContainer.addChild(LK.getAsset('button', {
anchorX: 0.5,
anchorY: 0.5,
width: 2048,
height: 2732
}));
overlay.tint = 0x000000;
overlay.alpha = 0.7;
overlay.x = 2048 / 2;
overlay.y = 2732 / 2;
// Create selector panel
var selectorPanel = cardSelectorContainer.addChild(LK.getAsset('button', {
anchorX: 0.5,
anchorY: 0.5,
width: 1600,
height: 2000
}));
selectorPanel.tint = 0x2d3748;
selectorPanel.x = 2048 / 2;
selectorPanel.y = 2732 / 2;
// Title
var titleText = new Text2('Select Card for Slot ' + (slotIndex + 1), {
size: 80,
fill: 0xffffff
});
titleText.anchor.set(0.5, 0.5);
titleText.x = selectorPanel.x;
titleText.y = selectorPanel.y - 800;
cardSelectorContainer.addChild(titleText);
// Close button
var closeButton = cardSelectorContainer.addChild(LK.getAsset('button', {
anchorX: 0.5,
anchorY: 0.5,
width: 200,
height: 100
}));
closeButton.x = selectorPanel.x + 700;
closeButton.y = selectorPanel.y - 800;
closeButton.tint = 0xff5555;
var closeText = new Text2('X', {
size: 60,
fill: 0xffffff
});
closeText.anchor.set(0.5, 0.5);
closeText.x = closeButton.x;
closeText.y = closeButton.y;
cardSelectorContainer.addChild(closeText);
closeButton.down = function () {
cardSelectorContainer.visible = false;
selectedSlotIndex = -1;
};
// Empty slot option
var emptySlotButton = cardSelectorContainer.addChild(LK.getAsset('button', {
anchorX: 0.5,
anchorY: 0.5,
width: 1400,
height: 150
}));
emptySlotButton.x = selectorPanel.x;
emptySlotButton.y = selectorPanel.y - 600;
emptySlotButton.tint = 0x4a90e2;
var emptyText = new Text2('Remove Card (Empty Slot)', {
size: 60,
fill: 0xffffff
});
emptyText.anchor.set(0.5, 0.5);
emptyText.x = emptySlotButton.x;
emptyText.y = emptySlotButton.y;
cardSelectorContainer.addChild(emptyText);
emptySlotButton.down = function () {
equippedCards[selectedSlotIndex] = null;
// Store only card names for storage compatibility
var equippedCardNames = [];
for (var i = 0; i < equippedCards.length; i++) {
equippedCardNames[i] = equippedCards[i] ? equippedCards[i].name : null;
}
storage.equippedCards = equippedCardNames;
updateCardSlots();
cardSelectorContainer.visible = false;
selectedSlotIndex = -1;
};
// Show all owned cards
var displayIndex = 0;
for (var i = 0; i < ownedCards.length; i++) {
var card = ownedCards[i];
var cardButton = cardSelectorContainer.addChild(LK.getAsset('button', {
anchorX: 0.5,
anchorY: 0.5,
width: 1400,
height: 180
}));
cardButton.x = selectorPanel.x;
cardButton.y = selectorPanel.y - 400 + displayIndex * 200;
cardButton.tint = 0x8b5cf6;
var cardNameText = new Text2(card.name, {
size: 60,
fill: 0xffffff
});
cardNameText.anchor.set(0.5, 0.4);
cardNameText.x = cardButton.x;
cardNameText.y = cardButton.y - 30;
cardSelectorContainer.addChild(cardNameText);
var cardDescText = new Text2(card.description, {
size: 40,
fill: 0xbd93f9
});
cardDescText.anchor.set(0.5, 0.6);
cardDescText.x = cardButton.x;
cardDescText.y = cardButton.y + 30;
cardSelectorContainer.addChild(cardDescText);
cardButton.cardData = card;
cardButton.down = function () {
// Check if this card is already equipped in another slot
var alreadyEquipped = false;
for (var j = 0; j < equippedCards.length; j++) {
if (equippedCards[j] && equippedCards[j].name === this.cardData.name) {
alreadyEquipped = true;
break;
}
}
// Only allow equipping if not already equipped
if (!alreadyEquipped) {
equippedCards[selectedSlotIndex] = this.cardData;
// Store only card names for storage compatibility
var equippedCardNames = [];
for (var i = 0; i < equippedCards.length; i++) {
equippedCardNames[i] = equippedCards[i] ? equippedCards[i].name : null;
}
storage.equippedCards = equippedCardNames;
updateCardSlots();
cardSelectorContainer.visible = false;
selectedSlotIndex = -1;
} else {
// Flash red to indicate card is already equipped
LK.effects.flashScreen(0xff5555, 300);
}
};
displayIndex++;
}
// Handle case when no cards are available
if (ownedCards.length === 0) {
var noCardsText = new Text2('No cards owned. Visit the store to buy cards!', {
size: 60,
fill: 0xff79c6
});
noCardsText.anchor.set(0.5, 0.5);
noCardsText.x = selectorPanel.x;
noCardsText.y = selectorPanel.y - 200;
cardSelectorContainer.addChild(noCardsText);
}
}
// Function to update card slots display
function updateCardSlots() {
// Clear existing slot UI
cardsScrollContainer.removeChildren();
cardSlotButtons = [];
cardSlotTexts = [];
// Reset scroll position
cardsScrollY = 0;
cardsScrollContainer.y = 0;
// Create card slots
for (var i = 0; i < cardSlots; i++) {
var slotButton = cardsScrollContainer.addChild(LK.getAsset('button', {
anchorX: 0.5,
anchorY: 0.5,
width: 600,
height: 240
}));
slotButton.x = 2048 / 2 - 700 + i % 3 * 700;
slotButton.y = 1000 + Math.floor(i / 3) * 500;
var equippedCard = equippedCards[i];
var slotText = new Text2(equippedCard ? equippedCard.name : 'Empty Slot', {
size: 50,
fill: 0xffffff
});
slotText.anchor.set(0.5, 0.5);
slotText.x = slotButton.x;
slotText.y = slotButton.y;
cardsScrollContainer.addChild(slotText);
cardSlotButtons.push(slotButton);
cardSlotTexts.push(slotText);
// Add click handler to slot
slotButton.slotIndex = i;
slotButton.down = function () {
if (!cardsScrolling) {
openCardSelector(this.slotIndex);
}
};
}
}
// Function to update store display
function updateStoreDisplay() {
// Clear existing store UI
storeContainer.removeChildren();
// Add back button
var backButton = storeContainer.addChild(LK.getAsset('button', {
anchorX: 0.5,
anchorY: 0.5,
width: 300,
height: 120
}));
backButton.x = 150;
backButton.y = 350;
var backText = new Text2(languages[currentLanguage].back, {
size: 50,
fill: 0xffffff
});
backText.anchor.set(0.5, 0.5);
backText.x = backButton.x;
backText.y = backButton.y;
storeContainer.addChild(backText);
backButton.down = function () {
currentTab = 'cards';
storage.currentTab = currentTab;
updateTabDisplay();
};
for (var i = 0; i < storeCards.length; i++) {
var card = storeCards[i];
// Count how many of this card the player owns
var ownedCount = 0;
for (var j = 0; j < ownedCards.length; j++) {
if (ownedCards[j].name === card.name) {
ownedCount++;
}
}
var cardButton = storeContainer.addChild(LK.getAsset('button', {
anchorX: 0.5,
anchorY: 0.5,
width: 800,
height: 200
}));
cardButton.x = 2048 / 2;
cardButton.y = 800 + i * 240;
var cardText = new Text2(card.name + ' - ' + card.price + ' coins (Owned: ' + ownedCount + ')', {
size: 60,
fill: 0xffffff
});
cardText.anchor.set(0.5, 0.4);
cardText.x = cardButton.x;
cardText.y = cardButton.y - 30;
storeContainer.addChild(cardText);
var descText = new Text2(card.description, {
size: 40,
fill: 0xbd93f9
});
descText.anchor.set(0.5, 0.6);
descText.x = cardButton.x;
descText.y = cardButton.y + 30;
storeContainer.addChild(descText);
cardButton.cardData = card;
cardButton.down = function () {
if (coins >= this.cardData.price) {
coins -= this.cardData.price;
ownedCards.push(this.cardData);
try {
if (storage) {
storage.coins = coins;
// Convert ownedCards to storage-compatible format
var ownedCardNames = [];
for (var k = 0; k < ownedCards.length; k++) {
ownedCardNames.push(ownedCards[k].name);
}
storage.ownedCards = ownedCardNames;
}
} catch (e) {
console.log('Storage error:', e);
}
coinsText.setText('Coins: ' + coins);
// Update store display to show new count
updateStoreDisplay();
// Visual feedback
tween(this, {
tint: 0x00ff00
}, {
duration: 200
});
LK.setTimeout(function () {
tween(this, {
tint: 0xffffff
}, {
duration: 200
});
}.bind(this), 200);
}
};
}
}
// Tab click handlers
infinityTab.down = function () {
currentTab = 'infinity';
storage.currentTab = currentTab;
updateTabDisplay();
};
cardsTab.down = function () {
currentTab = 'cards';
storage.currentTab = currentTab;
updateTabDisplay();
};
// Developer tab click handler
developerTab.down = function () {
if (developerTabUnlocked) {
currentTab = 'developer';
storage.currentTab = currentTab;
updateTabDisplay();
}
};
// Cards menu click handlers
storeMenuButton.down = function () {
currentTab = 'store';
storage.currentTab = currentTab;
updateTabDisplay();
};
// Cards tab scrolling handlers
cardSlotsContainer.down = function (x, y, obj) {
if (currentTab === 'cards') {
cardsScrolling = false;
cardsHolding = false;
cardsStartY = y;
cardsLastY = y;
// Start hold timer - enable scrolling after 200ms of holding
cardsHoldTimer = LK.setTimeout(function () {
cardsHolding = true;
}, 200);
}
};
cardSlotsContainer.move = function (x, y, obj) {
if (currentTab === 'cards' && cardsHolding) {
var deltaY = y - cardsLastY;
if (Math.abs(deltaY) > 5) {
cardsScrolling = true;
cardsScrollY += deltaY;
// Limit scrolling bounds
var maxScroll = 0;
var minScroll = Math.min(0, 2732 - (1400 + Math.floor(cardSlots / 3) * 500 + 300));
cardsScrollY = Math.max(minScroll, Math.min(maxScroll, cardsScrollY));
cardsScrollContainer.y = cardsScrollY;
}
cardsLastY = y;
}
};
cardSlotsContainer.up = function (x, y, obj) {
if (currentTab === 'cards') {
// Clear hold timer if it exists
if (cardsHoldTimer) {
LK.clearTimeout(cardsHoldTimer);
cardsHoldTimer = null;
}
// Reset hold state
cardsHolding = false;
// Reset scrolling flag after a short delay
LK.setTimeout(function () {
cardsScrolling = false;
}, 100);
}
};
// Auto clicker functionality from cards
var autoClickerTimer = null;
function checkCardEffects() {
// Check for auto clicker card
var hasAutoClicker = false;
for (var i = 0; i < equippedCards.length; i++) {
if (equippedCards[i] && equippedCards[i].name === 'Auto Clicker') {
hasAutoClicker = true;
break;
}
}
if (hasAutoClicker && !autoClickerTimer && currentTab === 'infinity') {
autoClickerTimer = LK.setInterval(function () {
processClick(1);
}, 1000);
} else if (!hasAutoClicker && autoClickerTimer) {
LK.clearInterval(autoClickerTimer);
autoClickerTimer = null;
}
}
// Function to process clicks with card effects
function processClick(baseClicks) {
var finalClicks = baseClicks;
var coinsEarned = 0; // Start with 0 coins, earn based on chance
var isCritical = false;
var isLucky = false;
var coinDropChance = 0.3; // 30% chance to get coins on click
var bonusCoinsChance = 0.1; // 10% chance for bonus coins
// Check for coin drops
if (Math.random() < coinDropChance) {
coinsEarned = 1;
// Check for bonus coins
if (Math.random() < bonusCoinsChance) {
coinsEarned = 3; // Bonus coin drop
}
// Create visual coin drop effect
createCoinDrop(button.x, button.y, coinsEarned);
}
// Check equipped cards for effects
for (var i = 0; i < equippedCards.length; i++) {
var card = equippedCards[i];
if (!card) {
continue;
}
if (card.name === 'Critical Hit' && Math.random() < 0.15) {
finalClicks *= 2;
isCritical = true;
}
if (card.name === 'Double Coins' && coinsEarned > 0) {
coinsEarned *= 2;
}
if (card.name === 'Lucky Strike' && Math.random() < 0.10) {
finalClicks *= 5;
isLucky = true;
}
}
clickCount += finalClicks;
// Don't add coins here - let the animation handle it
storage.clickCount = clickCount;
counterText.setText('Clicks: ' + clickCount);
// Don't update coins text here - let the animation handle it
// Visual feedback for special effects
if (isCritical || isLucky) {
var effectText = isCritical ? 'CRITICAL!' : 'LUCKY STRIKE!';
LK.effects.flashScreen(isCritical ? 0xff5555 : 0x50fa7b, 300);
buttonText.setText(effectText);
}
// Check for jumpscare at every hundred
if (clickCount % 100 === 0) {
triggerJumpscare();
}
}
// Function to create visual coin drop effect
function createCoinDrop(startX, startY, coinValue) {
// Create coin visual - start from bottom of screen
var coinDrop = game.addChild(LK.getAsset('coin', {
anchorX: 0.5,
anchorY: 0.5,
width: 80,
height: 80
}));
coinDrop.x = startX + (Math.random() * 100 - 50); // Random spread around button
coinDrop.y = 2732; // Start from bottom of screen
coinDrop.tint = 0xff79c6; // Coral pink color
// Create coin text
var coinText = new Text2('+' + coinValue, {
size: 60,
fill: 0xff79c6
});
coinText.anchor.set(0.5, 0.5);
coinText.x = coinDrop.x;
coinText.y = coinDrop.y - 20;
game.addChild(coinText);
// Animate coin jumping up to coin counter with bounce effect
tween(coinDrop, {
x: coinsText.x,
y: coinsText.y
}, {
duration: 800,
easing: tween.bounceOut,
onFinish: function onFinish() {
// Update coin counter when coin reaches destination
coins += coinValue;
storage.coins = coins;
coinsText.setText('Coins: ' + coins);
// Flash the coin counter to show update
tween(coinsText, {
scaleX: 1.2,
scaleY: 1.2
}, {
duration: 100,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(coinsText, {
scaleX: 1.0,
scaleY: 1.0
}, {
duration: 100,
easing: tween.easeOut
});
}
});
}
});
tween(coinText, {
x: coinsText.x,
y: coinsText.y - 50
}, {
duration: 800,
easing: tween.bounceOut
});
// Remove coin after animation
LK.setTimeout(function () {
if (coinDrop.parent) {
coinDrop.destroy();
}
if (coinText.parent) {
coinText.destroy();
}
}, 1000);
}
// Function to trigger jumpscare
function triggerJumpscare() {
// Array of scary messages
var scaryMessages = ['BOO!', 'GOTCHA!', 'SURPRISE!', 'SCARED YET?', 'JUMP!', 'AAAHHH!', 'SPOOKY!', 'FEAR ME!'];
var randomMessage = scaryMessages[Math.floor(Math.random() * scaryMessages.length)];
// Random jumpscare type (0-3)
var jumpscareType = Math.floor(Math.random() * 4);
if (jumpscareType === 0) {
// Type 1: Pink flash with dramatic scale and shake
LK.effects.flashScreen(0xff5555, 500);
tween(button, {
scaleX: 3,
scaleY: 3
}, {
duration: 200,
easing: tween.bounceOut
});
tween(button, {
x: button.x + Math.random() * 40 - 20,
y: button.y + Math.random() * 40 - 20
}, {
duration: 50
});
} else if (jumpscareType === 1) {
// Type 2: Purple flash with spin and grow
LK.effects.flashScreen(0x8b5cf6, 700);
tween(button, {
scaleX: 2.5,
scaleY: 2.5,
rotation: Math.PI * 2
}, {
duration: 400,
easing: tween.elasticOut
});
} else if (jumpscareType === 2) {
// Type 3: Orange flash with rapid shake
LK.effects.flashScreen(0xffb86c, 600);
var shakeCount = 0;
var shakeInterval = LK.setInterval(function () {
button.x = 2048 / 2 + Math.random() * 60 - 30;
button.y = 2732 / 2 - 100 + Math.random() * 60 - 30;
shakeCount++;
if (shakeCount >= 10) {
LK.clearInterval(shakeInterval);
}
}, 30);
} else {
// Type 4: Green flash with wild scaling
LK.effects.flashScreen(0x50fa7b, 400);
tween(button, {
scaleX: 4,
scaleY: 0.5
}, {
duration: 150,
easing: tween.easeIn
});
LK.setTimeout(function () {
tween(button, {
scaleX: 0.5,
scaleY: 4
}, {
duration: 150,
easing: tween.easeOut
});
}, 150);
}
// Scale back down after a moment
LK.setTimeout(function () {
tween(button, {
scaleX: 1,
scaleY: 1,
rotation: 0,
x: 2048 / 2,
y: 2732 / 2 - 100
}, {
duration: 300,
easing: tween.easeOut
});
tween(buttonShadow, {
scaleX: 1,
scaleY: 1,
rotation: 0,
x: 2048 / 2 + 8,
y: 2732 / 2 - 100 + 8
}, {
duration: 300,
easing: tween.easeOut
});
}, 300);
// Change button text to random scary message
buttonText.setText(randomMessage + ' ' + clickCount + ' CLICKS!');
}
// Handle button clicks
button.down = function (x, y, obj) {
if (currentTab === 'infinity') {
processClick(1);
if (clickCount % 100 !== 0) {
// Change button text to random message
buttonText.setText(buttonTexts[Math.floor(Math.random() * buttonTexts.length)]);
}
// Play click sound
LK.getSound('click').play();
}
// Visual feedback - scale button down slightly and move shadow
button.scaleX = 0.95;
button.scaleY = 0.95;
buttonShadow.scaleX = 0.95;
buttonShadow.scaleY = 0.95;
buttonShadow.x = 2048 / 2 + 4;
buttonShadow.y = 2732 / 2 - 100 + 4;
};
button.up = function (x, y, obj) {
// Return button to normal size and shadow position
button.scaleX = 1.0;
button.scaleY = 1.0;
buttonShadow.scaleX = 1.0;
buttonShadow.scaleY = 1.0;
buttonShadow.x = 2048 / 2 + 8;
buttonShadow.y = 2732 / 2 - 100 + 8;
};
// Game update loop
game.update = function () {
checkCardEffects();
};
// Weird logo click handler
weirdLogo.down = function () {
if (developerMode && !developerTabUnlocked) {
showDeveloperMode();
} else if (!developerMode) {
showCodeInput();
}
};
// Function to update all language-dependent text elements
function updateLanguageDisplay() {
var lang = languages[currentLanguage];
// Update tab texts
infinityTabText.setText(lang.infinity);
cardsTabText.setText(lang.cards);
developerTabText.setText(lang.developer);
// Update button texts array
updateButtonTexts();
// Update button text if it's showing default text
if (buttonTexts.includes(buttonText.text)) {
buttonText.setText(buttonTexts[Math.floor(Math.random() * buttonTexts.length)]);
}
// Update counter and coins text
counterText.setText(lang.clicks + clickCount);
coinsText.setText(lang.coins + coins);
// Language button now shows hashtag - no need to update
// Update buy/sell slot button texts
buySlotTextMain.setText(lang.buySlot + ' (50)');
sellSlotTextMain.setText(lang.sellSlot + ' (25)');
// Update store button text
storeMenuText.setText(lang.store);
// Update back button text if store is visible
if (currentTab === 'store') {
updateStoreDisplay();
}
}
// Initialize containers as hidden
cardSelectorContainer.visible = false;
developerContainer.visible = false;
codeInputContainer.visible = false;
languageMenuContainer.visible = false;
// Initialize the display
updateLanguageDisplay();
updateTabDisplay();
// Start background music
LK.playMusic('background');
;