User prompt
Please fix the bug: 'Error: Invalid value. Only literals or 1-level deep objects/arrays containing literals are allowed.' in or related to this line: 'storage.leaderboard = leaderboardReallyFinal;' Line Number: 593
User prompt
tamam bu hatayı düzelte bilri misin ? birde kullanıcı verirken, direk oyun başladı, storage sil ve tekrar bana bir kullanıcı ata, ama oyun kullanıcı atandıtan sonra, Ready butonu ile başlat
User prompt
Please fix the bug: 'Error: Invalid value. Only literals or 1-level deep objects/arrays containing literals are allowed.' in or related to this line: 'storage.leaderboard = leaderboardReallySafe;' Line Number: 505
User prompt
Please fix the bug: 'Error: Invalid value. Only literals or 1-level deep objects/arrays containing literals are allowed.' in or related to this line: 'storage.leaderboard = leaderboardSafe;' Line Number: 495
User prompt
Please fix the bug: 'Error: Invalid value. Only literals or 1-level deep objects/arrays containing literals are allowed.' in or related to this line: 'storage.leaderboard = leaderboardPlain;' Line Number: 486
User prompt
Please fix the bug: 'Error: Invalid value. Only literals or 1-level deep objects/arrays containing literals are allowed.' in or related to this line: 'storage.leaderboard = leaderboardPlain;' Line Number: 472
User prompt
Please fix the bug: 'Error: Invalid value. Only literals or 1-level deep objects/arrays containing literals are allowed.' in or related to this line: 'storage.leaderboard = leaderboardToStore;' Line Number: 463
User prompt
Please fix the bug: 'Error: Invalid value. Only literals or 1-level deep objects/arrays containing literals are allowed.' in or related to this line: 'storage.leaderboard = leaderboard;' Line Number: 454
User prompt
o zaman oyun başında, random olarak oyuncuya bir nickname kendimiz atayalım, kullanıcı adı şöyle olsun: BeatBoxer01 mesela ama numarayı random program atasın, hatta sayaç gibi bir şey dönsün, ve oyun desin ki. YOUR NİCKNAME İS BeatBoxer55 mesela. sonra skor tablosu oluştura bilirz.
User prompt
ekranda klavyeyi kaldır
User prompt
nick name klavyeden yazamıyorum, ve giriş yapamıyroum
User prompt
nickname girmesi ile, direk olarak arkada oyun başlıyor, oyun ilk başkta durması lazım brathbar hemen başlıyor
User prompt
oyuncu oyuna ilk kez girdiğinde bir nickname girsin, sonra yaptığı skor, skor tablosunda gözüksün, skor tablosu sıralaması önemli, bunu yapalım. bir amaç olması lazım oyunda ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
skor 30 da biraz daha zorlaştır, skor 50 de biraz daha zorlarşıtr, skor 70 de biraz daha zorlaştır, 100 de biraz daha zorlaştır, kademe kademe zorlaşsın oyun
User prompt
score 50 puan geldiğinde, oyunu biraz daha zorlaştır
User prompt
50px yukarıya
User prompt
20 px
User prompt
15 px daha yukarıya
User prompt
biraz daha yukarı almak gerek
User prompt
şimdi yeni bir skor tablosu ekle, sağ üst kısma, breathbarın üstüne
User prompt
sayaç ve skor tablosunu tümü kaldır
User prompt
düzenle
User prompt
breathbar dolu başlamasın, boş başlasın, hafif kırmızdan başlasın, tıkladıca dolsun
User prompt
53 skora ulaşınca bitiyor oyun, bunu sınırsız yap
User prompt
not workin, please add a text klick to the buton
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1"); /**** * Classes ****/ // Beat Particle var BeatParticle = Container.expand(function () { var self = Container.call(this); var p = self.attachAsset('beatParticle', { anchorX: 0.5, anchorY: 0.5 }); self.vx = 0; self.vy = 0; self.alpha = 1; self.scale = 1; self.update = function () { self.x += self.vx; self.y += self.vy; self.scale += 0.02; self.alpha -= 0.018; p.scaleX = p.scaleY = self.scale; if (self.alpha <= 0) { self.destroyed = true; } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x0a0a1a }); /**** * Game Code ****/ // Music // Sound // Soundwave // Slogan Neon Bar // Beat Particle // Music Note // Breath Meter // Red Tap Button // Character: Big, cartoon beatboxer with headphones, hoodie, sneakers // --- Neon Slogan at Top --- function _typeof2(o) { "@babel/helpers - typeof"; return _typeof2 = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof2(o); } function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } var sloganText = new Text2('BEATBOX TAP STAR', { size: 140, fill: 0x00FFFF, font: "Impact, 'Arial Black', Tahoma" }); sloganText.anchor.set(0.5, 0.5); sloganText.x = 2048 / 2; sloganText.y = 130; game.addChild(sloganText); // --- Breath Meter (right side, vertical, above character, always on top) --- // Place breath meter in GUI overlay, right side, above character // Calculate vertical center for breath bar in GUI overlay var breathBarGuiHeight = 660; // matches asset height var guiCenterY = (LK.gui.height ? LK.gui.height : 2732) / 2; // fallback if LK.gui.height is undefined var breathBarY = 0; // will be set after LK.gui is ready // Place breath bar 10px from right edge, vertically centered in GUI overlay breathBarY = 0; // LK.gui.right anchor is middle-right, so y=0 is center // --- Score Text (top right, above breath bar) --- var scoreText = new Text2('0', { size: 110, fill: 0xffffff, font: "Impact, 'Arial Black', Tahoma" }); scoreText.anchor.set(1, 0); // right-top scoreText.x = -10; // 10px from right edge scoreText.y = -breathBarGuiHeight / 2 - 170; // above breath bar, 170px margin (moved 50px higher) LK.gui.right.addChild(scoreText); var breathBarBg = LK.getAsset('breathBarBg', { anchorX: 1, // right edge anchorY: 0.5, // center vertically x: -10, // 10px from right edge y: breathBarY }); var breathBarFill = LK.getAsset('breathBarFill', { anchorX: 1, anchorY: 0.5, x: -10, y: breathBarY }); var breathBarDanger = LK.getAsset('breathBarDanger', { anchorX: 1, anchorY: 0.5, x: -10, y: breathBarY }); breathBarDanger.visible = false; LK.gui.right.addChild(breathBarBg); LK.gui.right.addChild(breathBarFill); LK.gui.right.addChild(breathBarDanger); // --- Beatboxer Character (center stage) --- // Character switching logic // Character style 0: Blue square placeholder var characterPlaceholder0 = LK.getAsset('characterPlaceholder', { anchorX: 0.5, anchorY: 1, x: 2048 / 2, y: 2350 }); // Character style 1: Pink ellipse placeholder var characterPlaceholder1 = LK.getAsset('beatboxerHead', { anchorX: 0.5, anchorY: 1, x: 2048 / 2, y: 2350, color: 0xff66cc }); characterPlaceholder1.visible = false; // Character style 2: Green box placeholder var characterPlaceholder2 = LK.getAsset('beatParticle', { anchorX: 0.5, anchorY: 1, x: 2048 / 2, y: 2350, color: 0x00ffcc }); characterPlaceholder2.visible = false; // Character style 3: Blue square placeholder (new) var characterPlaceholder3 = LK.getAsset('characterPlaceholderSquare', { anchorX: 0.5, anchorY: 1, x: 2048 / 2, y: 2350 }); characterPlaceholder3.visible = false; game.addChild(characterPlaceholder0); game.addChild(characterPlaceholder1); game.addChild(characterPlaceholder2); game.addChild(characterPlaceholder3); // Track which character is currently shown (0, 1, 2, 3) var characterStyle = 0; var characterList = [characterPlaceholder0, characterPlaceholder1, characterPlaceholder2, characterPlaceholder3]; // --- Beatboxer character instance removed as per instructions --- // --- Tap Button (bottom center) --- var tapButton = LK.getAsset('tapButton', { anchorX: 0.5, anchorY: 0.5, x: 2048 / 2, y: 2350 //{1U} // moved up by 150px }); game.addChild(tapButton); // --- Animated Background Particles --- var beatParticles = []; // --- Game State --- var breath = 1; // 0-1 var breathDrainPerTick = 0.008; // Drains in ~5s if not tapping (much harder) var breathGainPerTap = 0.13; var breathDangerThreshold = 0.18; var score = 0; var isGameOver = false; var canTap = true; var lastTapTick = 0; // --- Nickname and Leaderboard --- var nickname = storage.nickname || null; var leaderboard = storage.leaderboard || []; var leaderboardText = null; // --- Nickname Animation --- var nicknameAnimText = null; var nicknameAnimTimer = null; var nicknameAnimTicks = 0; var nicknameAnimBase = "BeatBoxer"; var nicknameAnimCurrent = ""; var nicknameAnimDone = false; // Assign a random nickname and animate it function assignRandomNicknameAndShow() { // If already set, skip if (nickname) return; nicknameAnimTicks = 0; nicknameAnimDone = false; // Create animated nickname text if (nicknameAnimText) { nicknameAnimText.destroy(); nicknameAnimText = null; } nicknameAnimText = new Text2("YOUR NICKNAME IS ...", { size: 110, fill: 0x00ffcc, font: "Impact, 'Arial Black', Tahoma", align: 'center' }); nicknameAnimText.anchor.set(0.5, 0.5); nicknameAnimText.x = 2048 / 2; nicknameAnimText.y = 700; game.addChild(nicknameAnimText); // Animate the number rolling for 1.2 seconds, then pick a random number nicknameAnimTimer = LK.setInterval(function () { nicknameAnimTicks++; // Animate number from 01 to 99 var num = Math.floor(Math.random() * 99) + 1; var numStr = (num < 10 ? "0" : "") + num; nicknameAnimCurrent = nicknameAnimBase + numStr; nicknameAnimText.setText("YOUR NICKNAME IS\n" + nicknameAnimCurrent); // After 1.2 seconds (about 18 frames), finalize nickname if (nicknameAnimTicks > 18) { LK.clearInterval(nicknameAnimTimer); nicknameAnimTimer = null; // Final random number var finalNum = Math.floor(Math.random() * 99) + 1; var finalNumStr = (finalNum < 10 ? "0" : "") + finalNum; nickname = nicknameAnimBase + finalNumStr; storage.nickname = nickname; nicknameAnimText.setText("YOUR NICKNAME IS\n" + nickname); nicknameAnimDone = true; // Remove after 1.2s LK.setTimeout(function () { if (nicknameAnimText) { nicknameAnimText.destroy(); nicknameAnimText = null; } gamePausedForNickname = false; }, 1200); } }, 65); // Pause game logic until nickname is set gamePausedForNickname = true; } // On first load, always clear storage and assign new nickname, then show Ready button function resetAndAssignNickname() { // Clear storage for nickname and leaderboard storage.nickname = null; storage.leaderboard = []; nickname = null; leaderboard = []; // Remove any previous nickname text if (nicknameAnimText) { nicknameAnimText.destroy(); nicknameAnimText = null; } // Assign new nickname with animation assignRandomNicknameAndShow(); // After nickname animation is done, show Ready button function showReadyButtonWhenDone() { if (nicknameAnimDone) { // Show Ready button if (window.readyBtn) { window.readyBtn.destroy(); window.readyBtn = null; } var readyBtn = new Text2("READY", { size: 140, fill: 0x00ffcc, font: "Impact, 'Arial Black', Tahoma", align: 'center' }); readyBtn.anchor.set(0.5, 0.5); readyBtn.x = 2048 / 2; readyBtn.y = 1100; game.addChild(readyBtn); window.readyBtn = readyBtn; readyBtn.interactive = true; readyBtn.buttonMode = true; readyBtn.down = function (x, y, obj) { // Remove button, unpause game if (window.readyBtn) { window.readyBtn.destroy(); window.readyBtn = null; } gamePausedForNickname = false; }; } else { LK.setTimeout(showReadyButtonWhenDone, 100); } } showReadyButtonWhenDone(); // Pause game logic until nickname is set and Ready pressed gamePausedForNickname = true; } resetAndAssignNickname(); function showLeaderboard() { if (leaderboardText) { leaderboardText.destroy(); leaderboardText = null; } var sorted = leaderboard.slice().sort(function (a, b) { return b.score - a.score; }).slice(0, 10); var lines = ['🏆 TOP SCORES 🏆']; for (var i = 0; i < sorted.length; i++) { lines.push(i + 1 + '. ' + sorted[i].nickname + ' - ' + sorted[i].score); } leaderboardText = new Text2(lines.join('\n'), { size: 80, fill: 0xffff00, font: "Impact, 'Arial Black', Tahoma", align: 'center' }); leaderboardText.anchor.set(0.5, 0.5); leaderboardText.x = 2048 / 2; leaderboardText.y = 2732 / 2; game.addChild(leaderboardText); // Remove leaderboard after 3 seconds LK.setTimeout(function () { if (leaderboardText) { leaderboardText.destroy(); leaderboardText = null; } }, 3000); } // On first load, ask for nickname if not set var gamePausedForNickname = false; // --- Helper: Update Breath Meter Visuals --- function updateBreathBar() { var maxHeight = 660; var fillHeight = Math.max(0, Math.min(1, breath)) * maxHeight; // Animate color: green to yellow to red as breath drops (full = green, empty = red) var fullColor = 0x44ff44; // green var midColor = 0xffe066; // yellow var dangerColor = 0xff4444; // red var color; if (breath > 0.5) { // Interpolate green to yellow var t = (breath - 0.5) * 2; // t: 1 (breath=1) => green, t: 0 (breath=0.5) => yellow var r = (fullColor >> 16) * t + (midColor >> 16) * (1 - t) & 0xff; var g = (fullColor >> 8 & 0xff) * t + (midColor >> 8 & 0xff) * (1 - t) & 0xff; var b = (fullColor & 0xff) * t + (midColor & 0xff) * (1 - t) & 0xff; color = r << 16 | g << 8 | b; } else { // Interpolate yellow to red var t = breath * 2; // t: 1 (breath=0.5) => yellow, t: 0 (breath=0) => red var r = (midColor >> 16) * t + (dangerColor >> 16) * (1 - t) & 0xff; var g = (midColor >> 8 & 0xff) * t + (dangerColor >> 8 & 0xff) * (1 - t) & 0xff; var b = (midColor & 0xff) * t + (dangerColor & 0xff) * (1 - t) & 0xff; color = r << 16 | g << 8 | b; } breathBarFill.tint = color; breathBarDanger.tint = dangerColor; breathBarFill.height = fillHeight; breathBarFill.y = 0; breathBarFill.x = -10; breathBarFill.visible = breath > breathDangerThreshold; breathBarDanger.height = fillHeight; breathBarDanger.y = 0; breathBarDanger.x = -10; breathBarDanger.visible = breath <= breathDangerThreshold; // Flash warning when in danger if (breath <= breathDangerThreshold && !updateBreathBar._flashing) { updateBreathBar._flashing = true; tween(breathBarDanger, { alpha: 0.2 }, { duration: 120, yoyo: true, repeat: 4, onFinish: function onFinish() { breathBarDanger.alpha = 1; updateBreathBar._flashing = false; } }); } } // --- Helper: Animate Tap Button Glow --- function animateTapButtonGlow() { // Button press animation: scale down then up tween(tapButton, { scaleX: 0.92, scaleY: 0.92 }, { duration: 80, easing: tween.cubicOut, onFinish: function onFinish() { tween(tapButton, { scaleX: 1, scaleY: 1 }, { duration: 120, easing: tween.cubicIn }); } }); } // --- Helper: Add Beat Particle --- function spawnBeatParticle() { var p = new BeatParticle(); p.x = 2048 / 2; p.y = 1200 - 220; p.vx = (Math.random() - 0.5) * 1.5; p.vy = -1.5 - Math.random() * 1.5; p.alpha = 0.8 + Math.random() * 0.2; beatParticles.push(p); game.addChild(p); } // --- Tap Button Handler --- function handleTap(x, y, obj) { if (isGameOver || !canTap) { return; } // Only register tap if inside button var dx = x - tapButton.x; var dy = y - tapButton.y; var r = tapButton.width / 2; if (dx * dx + dy * dy > r * r) { return; } // Tap registered! canTap = false; lastTapTick = LK.ticks; // Animate animateTapButtonGlow(); spawnBeatParticle(); LK.getSound('beatbox').play(); // Update score and UI score++; scoreText.setText(score); // Switch character: loop through 3 styles // Hide all, show next characterList[characterStyle].visible = false; characterStyle = (characterStyle + 1) % characterList.length; characterList[characterStyle].visible = true; // Animate if Beatboxer // (No Beatboxer instance present, so no animation triggered here) // Breath breath = Math.min(1, breath + breathGainPerTap); updateBreathBar(); // Win condition removed for endless play } // --- Tap Button Down/Up/Move --- game.down = function (x, y, obj) { handleTap(x, y, obj); }; game.move = function (x, y, obj) { // No drag needed, but allow repeated tap if (!canTap && LK.ticks - lastTapTick > 7) { canTap = true; } }; game.up = function (x, y, obj) { // Allow next tap canTap = true; }; // --- Main Game Update --- game.update = function () { if (isGameOver || gamePausedForNickname) { return; } // Progressive difficulty increases at score 30, 50, 70, 100 if (score >= 100 && game._difficultyLevel !== 4) { breathDrainPerTick = 0.028; // Hardest game._difficultyLevel = 4; } else if (score >= 70 && game._difficultyLevel !== 3) { breathDrainPerTick = 0.022; // Even harder game._difficultyLevel = 3; } else if (score >= 50 && game._difficultyLevel !== 2) { breathDrainPerTick = 0.014; // Harder game._difficultyLevel = 2; } else if (score >= 30 && game._difficultyLevel !== 1) { breathDrainPerTick = 0.010; // Slightly harder game._difficultyLevel = 1; } // Drain breath breath -= breathDrainPerTick; if (breath < 0) { breath = 0; } updateBreathBar(); // Lose if breath runs out if (breath <= 0 && !isGameOver) { isGameOver = true; LK.effects.flashScreen(0xff0000, 900); // Save score to leaderboard if nickname is set if (nickname) { leaderboard.push({ nickname: nickname, score: score }); leaderboard.sort(function (a, b) { return b.score - a.score; }); leaderboard = leaderboard.slice(0, 20); // keep top 20 // Only store array of plain objects (no references, no methods) var leaderboardToStore = []; for (var i = 0; i < leaderboard.length; i++) { var entry = leaderboard[i]; leaderboardToStore.push({ nickname: entry.nickname, score: entry.score }); } // Only store array of plain objects (no references, no methods, no nested objects/arrays, only 1-level deep literals) var leaderboardPlain = []; for (var i = 0; i < leaderboardToStore.length; i++) { var entry = leaderboardToStore[i]; // Only allow string or number, and no nested objects/arrays var safeNickname = ""; if (typeof entry.nickname === "string") { safeNickname = entry.nickname; } else if (entry.nickname !== undefined && entry.nickname !== null) { safeNickname = String(entry.nickname); } var safeScore = 0; if (typeof entry.score === "number") { safeScore = entry.score; } else if (entry.score !== undefined && entry.score !== null && !isNaN(parseInt(entry.score))) { safeScore = parseInt(entry.score); } leaderboardPlain.push({ nickname: safeNickname, score: safeScore }); } // Defensive: ensure leaderboardPlain is a plain array of plain objects with only string/number values var leaderboardSafe = []; for (var i = 0; i < leaderboardPlain.length; i++) { var entry = leaderboardPlain[i]; // Only allow 1-level deep object with string/number values leaderboardSafe.push({ nickname: typeof entry.nickname === "string" ? entry.nickname : entry.nickname !== undefined && entry.nickname !== null ? String(entry.nickname) : "", score: typeof entry.score === "number" ? entry.score : entry.score !== undefined && entry.score !== null && !isNaN(parseInt(entry.score)) ? parseInt(entry.score) : 0 }); } // Defensive: ensure leaderboardSafe is a plain array of plain objects with only string/number values (no nested objects/arrays) var leaderboardReallySafe = []; for (var i = 0; i < leaderboardSafe.length; i++) { var entry = leaderboardSafe[i]; var safeObj = {}; // Only allow string or number, and no nested objects/arrays safeObj.nickname = typeof entry.nickname === "string" ? entry.nickname : entry.nickname !== undefined && entry.nickname !== null ? String(entry.nickname) : ""; safeObj.score = typeof entry.score === "number" ? entry.score : entry.score !== undefined && entry.score !== null && !isNaN(parseInt(entry.score)) ? parseInt(entry.score) : 0; leaderboardReallySafe.push(safeObj); } // Defensive: ensure leaderboardReallySafe is a plain array of plain objects with only string/number values (no nested objects/arrays, no null/undefined, no functions) var leaderboardFinal = []; for (var i = 0; i < leaderboardReallySafe.length; i++) { var entry = leaderboardReallySafe[i]; if (entry && _typeof(entry) === "object" && !Array.isArray(entry) && Object.keys(entry).length === 2 && "nickname" in entry && "score" in entry && (typeof entry.nickname === "string" || typeof entry.nickname === "number") && (typeof entry.score === "number" || typeof entry.score === "string")) { leaderboardFinal.push({ nickname: typeof entry.nickname === "string" ? entry.nickname : String(entry.nickname), score: typeof entry.score === "number" ? entry.score : parseInt(entry.score, 10) || 0 }); } } // Defensive: ensure leaderboardFinal is a plain array of plain objects with only string/number values (no nested objects/arrays, no null/undefined, no functions) var leaderboardReallyFinal = []; for (var i = 0; i < leaderboardFinal.length; i++) { var entry = leaderboardFinal[i]; if (entry && _typeof2(entry) === "object" && !Array.isArray(entry) && Object.keys(entry).length === 2 && "nickname" in entry && "score" in entry && (typeof entry.nickname === "string" || typeof entry.nickname === "number") && (typeof entry.score === "number" || typeof entry.score === "string")) { leaderboardReallyFinal.push({ nickname: typeof entry.nickname === "string" ? entry.nickname : String(entry.nickname), score: typeof entry.score === "number" ? entry.score : parseInt(entry.score, 10) || 0 }); } } storage.leaderboard = leaderboardReallyFinal; } showLeaderboard(); LK.showGameOver(); // Reset score for next game score = 0; scoreText.setText(score); return; } // Animate sloganText neon pulse sloganText.alpha = 0.85 + 0.15 * Math.sin(LK.ticks * 0.08); sloganText.scaleX = sloganText.scaleY = 1 + 0.03 * Math.sin(LK.ticks * 0.07); // Animate background: spawn beat particles if (LK.ticks % 30 === 0) { spawnBeatParticle(); } // Update and cleanup beat particles for (var i = beatParticles.length - 1; i >= 0; i--) { var p = beatParticles[i]; p.update(); if (p.destroyed) { p.destroy(); beatParticles.splice(i, 1); } } }; // --- Play Music --- LK.playMusic('neonbeat', { fade: { start: 0, end: 1, duration: 1200 } });
===================================================================
--- original.js
+++ change.js
@@ -50,8 +50,16 @@
// Breath Meter
// Red Tap Button
// Character: Big, cartoon beatboxer with headphones, hoodie, sneakers
// --- Neon Slogan at Top ---
+function _typeof2(o) {
+ "@babel/helpers - typeof";
+ return _typeof2 = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) {
+ return typeof o;
+ } : function (o) {
+ return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o;
+ }, _typeof2(o);
+}
function _typeof(o) {
"@babel/helpers - typeof";
return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) {
return typeof o;
@@ -236,12 +244,60 @@
}, 65);
// Pause game logic until nickname is set
gamePausedForNickname = true;
}
-// On first load, assign nickname if not set
-if (!nickname) {
+// On first load, always clear storage and assign new nickname, then show Ready button
+function resetAndAssignNickname() {
+ // Clear storage for nickname and leaderboard
+ storage.nickname = null;
+ storage.leaderboard = [];
+ nickname = null;
+ leaderboard = [];
+ // Remove any previous nickname text
+ if (nicknameAnimText) {
+ nicknameAnimText.destroy();
+ nicknameAnimText = null;
+ }
+ // Assign new nickname with animation
assignRandomNicknameAndShow();
+ // After nickname animation is done, show Ready button
+ function showReadyButtonWhenDone() {
+ if (nicknameAnimDone) {
+ // Show Ready button
+ if (window.readyBtn) {
+ window.readyBtn.destroy();
+ window.readyBtn = null;
+ }
+ var readyBtn = new Text2("READY", {
+ size: 140,
+ fill: 0x00ffcc,
+ font: "Impact, 'Arial Black', Tahoma",
+ align: 'center'
+ });
+ readyBtn.anchor.set(0.5, 0.5);
+ readyBtn.x = 2048 / 2;
+ readyBtn.y = 1100;
+ game.addChild(readyBtn);
+ window.readyBtn = readyBtn;
+ readyBtn.interactive = true;
+ readyBtn.buttonMode = true;
+ readyBtn.down = function (x, y, obj) {
+ // Remove button, unpause game
+ if (window.readyBtn) {
+ window.readyBtn.destroy();
+ window.readyBtn = null;
+ }
+ gamePausedForNickname = false;
+ };
+ } else {
+ LK.setTimeout(showReadyButtonWhenDone, 100);
+ }
+ }
+ showReadyButtonWhenDone();
+ // Pause game logic until nickname is set and Ready pressed
+ gamePausedForNickname = true;
}
+resetAndAssignNickname();
function showLeaderboard() {
if (leaderboardText) {
leaderboardText.destroy();
leaderboardText = null;
@@ -504,9 +560,20 @@
score: typeof entry.score === "number" ? entry.score : parseInt(entry.score, 10) || 0
});
}
}
- storage.leaderboard = leaderboardFinal;
+ // Defensive: ensure leaderboardFinal is a plain array of plain objects with only string/number values (no nested objects/arrays, no null/undefined, no functions)
+ var leaderboardReallyFinal = [];
+ for (var i = 0; i < leaderboardFinal.length; i++) {
+ var entry = leaderboardFinal[i];
+ if (entry && _typeof2(entry) === "object" && !Array.isArray(entry) && Object.keys(entry).length === 2 && "nickname" in entry && "score" in entry && (typeof entry.nickname === "string" || typeof entry.nickname === "number") && (typeof entry.score === "number" || typeof entry.score === "string")) {
+ leaderboardReallyFinal.push({
+ nickname: typeof entry.nickname === "string" ? entry.nickname : String(entry.nickname),
+ score: typeof entry.score === "number" ? entry.score : parseInt(entry.score, 10) || 0
+ });
+ }
+ }
+ storage.leaderboard = leaderboardReallyFinal;
}
showLeaderboard();
LK.showGameOver();
// Reset score for next game