User prompt
toplar düşerken hangi dangeroverlay kısmına girerse girdiği kısımda yazan puanı skor olarak say
User prompt
dangeroverlay kısmı 5 e bölünmüş durumda ve bu kısmın en ortasına 500 yanlarına 300 onların da yanlarına 100 yaz
User prompt
skor sayacı her bir patlayan top için skor saysın
User prompt
hala yok enden
User prompt
skor sayacı yok???
User prompt
evet yeni bir skor sayacı eklemeni istiyorum, görünür olsun
User prompt
sadece ekranın üstüne ve ortasına skor sayacı koy
User prompt
oyunun kodlarındakı tüm skor gostergesi kodlarını kaldır herseyı bastan yapıcaz
User prompt
skor gostergesını konum olarak ekranın en ortasına ayarla ve en önde gözkürü şekilde olsun
User prompt
score gostergesını assets kısmına ekle duzenlıcem
User prompt
yanlış konum, görünürlük ayarı, üstünü örten başka bir element veya alpha değeri bütün bu sorunalrı kontrol et ve skor gostergesını en onde byaz yazıcazk şekilde ayarla
User prompt
score gostergesı ekle ekrana en öne
User prompt
Please fix the bug: 'TypeError: Cannot read properties of undefined (reading 'applyBubble')' in or related to this line: 'scoreMultipliers[Math.floor(self.x / (2048 / 5))].applyBubble(self);' Line Number: 253
User prompt
Remove all 100 200 300 400 500 numbers
User prompt
remove the all 100 200 300 400 500 numbers
User prompt
remove the blue color 100 200 300 400 500 numbers ın the net area
User prompt
geri al
User prompt
mavi 100 200 300 400 500 sayılarını kaldır
User prompt
uxoverlay remove
User prompt
Please fix the bug: 'net is not defined' in or related to this line: 'label.y = net.y;' Line Number: 1131
User prompt
uxoverlay2 remove
User prompt
uxoverlay2 yi şimdilik kaldır
User prompt
arkaplanı oyuna ekle
User prompt
assets kısmına arkaplan ekle duzenlıcem
User prompt
ı still cant see the score label help me
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1"); /**** * Classes ****/ var Barrier = Container.expand(function () { var self = Container.call(this); var barrierGraphics = self.attachAsset('barrier', { anchorX: .5, anchorY: .5 }); }); var BonusUX = Container.expand(function () { var self = Container.call(this); // Insert label here var barHeight = 50; // Removed bonusLabel ('Streak Bonus' text) var bonusAmountLabel = self.addChild(new Text2('1x', { size: 340, // Increased size fill: 0xF4F5FF, font: "Impact" })); // var rightMargin = -10; // No longer used for bar positioning bonusAmountLabel.anchor.set(.5, .5); bonusAmountLabel.x = -110; // Moved to the left of the bar var bonusBarWidth = 400; // This is the total visual width of the bar including end caps when fully extended (doubled from 200) // The actual middle section's max length will be bonusBarWidth - barHeight // Bar visual extent: x from 10 to 410. Text visual extent: x from -210 to -10. Gap of 20px. // Start ellipse center: 10 (visual start) + barHeight/2 (25) = 35 var bonusBarStart = self.attachAsset('bonusend', { y: 30, x: 35 //{b} // New position for start of the bar }); // Middle rectangle starts after start ellipse: 10 (visual start) + barHeight (50) = 60 var bonusBarMiddle = self.attachAsset('bonusbarmiddle', { y: 30, x: 60, // New position for middle section width: 0 }); // End ellipse center: bonusBarMiddle.x + currentWidth + barHeight/2 // Initial (currentWidth = 0): 60 + 0 + 25 = 85 var bonuseBarEnd = self.attachAsset('bonusend', { y: 30, x: 85 //{e} // Initial position, will be updated }); self.x = game.width - 270; // This initial positioning is overridden in Game Code self.y = game.height - 145; // This initial positioning is overridden in Game Code // targetWidth is the length of the bonusBarMiddle section var bonusBarStepSize = (bonusBarWidth - barHeight) / 5; // (200 - 50) / 5 = 30. Max targetWidth = 150. var targetWidth = 0; var currentWidth = 0; var jumpToAtEnd = 0; self.bonusAmount = 1; self.streakCount = 0; var maxLevel = 40; self.setStreakCount = function (level) { self.streakCount = Math.min(level, maxLevel); var newBonus = Math.floor(self.streakCount / 5) + 1; if (newBonus != self.bonusAmount) { for (var a = 0; a < scoreMultipliers.length; a++) { scoreMultipliers[a].setMultiplier(newBonus); } } self.bonusAmount = newBonus; bonusAmountLabel.setText(self.bonusAmount + 'x'); var newbarpos = level >= maxLevel ? 5 : level % 5; var newTargetWidth = newbarpos * bonusBarStepSize; jumpToAtEnd = newTargetWidth; if (newbarpos == 0 && level > 0) { newTargetWidth = 5 * bonusBarStepSize; jumpToAtEnd = 0; } // Stop any existing animations tween.stop(bonusBarMiddle, { width: true }); tween.stop(bonuseBarEnd, { x: true }); // Create new tween animation for smooth transition tween(bonusBarMiddle, { width: newTargetWidth }, { duration: 500, easing: tween.easeOutElastic }); // Animate the end cap along with the bar tween(bonuseBarEnd, { x: 60 + newTargetWidth + 25 }, { duration: 500, easing: tween.easeOutElastic, onFinish: function onFinish() { currentWidth = targetWidth = newTargetWidth; } }); }; self.update = function () { var delta = targetWidth - currentWidth; if (delta < 1) { targetWidth = currentWidth = jumpToAtEnd; } else { // Animation now handled by tween } // End ellipse center: bonusBarMiddle.x (60) + currentWidth + barHeight/2 (25) bonuseBarEnd.x = 60 + currentWidth + 25; // Simplified to 85 + currentWidth bonusBarMiddle.width = currentWidth; // currentWidth is the length of the middle section }; // bonuseBarEnd.x = -bonusLabel.width; }); var Bubble = Container.expand(function (max_types, isFireBall, type) { var self = Container.call(this); self.isFireBall = isFireBall; var state = 0; self.isAttached = true; self.isFreeBubble = false; var speedX = 0; var speedY = 0; self.targetX = 0; self.targetY = 0; self.setPos = function (x, y) { self.x = self.targetX = x; self.y = self.targetY = y; }; if (type !== undefined) { this.type = type; } else { max_types = max_types || 3; if (max_types > 4) { self.type = Math.floor(Math.random() * (.8 + Math.random() * .2) * max_types); } else { self.type = Math.floor(Math.random() * max_types); } } if (isFireBall) { var bubbleGraphics = self.attachAsset('fireball', { anchorX: 0.5, anchorY: 0.5 }); bubbleGraphics.width = 150; bubbleGraphics.height = 150; } else { var bubbleGraphics = self.attachAsset('bubble' + self.type, { anchorX: 0.5, anchorY: 0.5 }); } /*if (!isFireBall && self.type > 1) { bubbleGraphics.tint = bubbleColors[self.type]; }*/ self.detach = function () { freeBubbleLayer.addChild(self); LK.getSound('detachCircle').play(); self.y += grid.y; self.isAttached = false; speedX = Math.random() * 40 - 20; speedY = -Math.random() * 30; self.down = undefined; }; var spawnMod = 0; self.update = function () { if (self.isFreeBubble) { if (isFireBall) { if (++spawnMod % 2 == 0 && self.parent) { // Spawn fire particles every 5 ticks var angle = Math.random() * Math.PI * 2; var fireParticle = self.parent.addChild(new FireParticle(angle)); fireParticle.x = self.x + Math.cos(angle) * self.width / 4; fireParticle.y = self.y + Math.sin(angle) * self.width / 4; } } return; } if (self.isAttached) { if (self.x != self.targetX) { self.x += (self.targetX - self.x) / 10; } if (self.y != self.targetY) { self.y += (self.targetY - self.y) / 10; } } else { self.x += speedX; self.y += speedY; speedY += 1.5; if (self.x < bubbleSize / 2 && speedX < 0 || self.x > game.width - bubbleSize / 2 && speedX > 0) { speedX = -speedX; LK.getSound('circleBounce').play(); } // Check for collision with barriers for (var i = 0; i < barriers.length; i++) { var barrier = barriers[i]; var dx = self.x - barrier.x; var dy = self.y - barrier.y; var distance = Math.sqrt(dx * dx + dy * dy); var minDist = bubbleSize / 2 + barrier.width / 2; if (distance < minDist) { // Calculate the angle of the collision var angle = Math.atan2(dy, dx); // Calculate the new speed based on the angle of collision, treating the barrier as a static billiard ball var newSpeed = Math.sqrt(speedX * speedX + speedY * speedY); speedX = Math.cos(angle) * newSpeed * .7; speedY = Math.sin(angle) * newSpeed * .7; // Move the bubble back to the point where it just touches the barrier var overlap = minDist - distance; self.x += overlap * Math.cos(angle); self.y += overlap * Math.sin(angle); LK.getSound('circleBounce').play(); } } // Remove unattached bubbles that fall below 2732 - 500 if (self.y > 2732 - 400) { // Increment drop counter for this bubble type if (typeof bubbleDropCounter[self.type] === "number") { bubbleDropCounter[self.type]++; } // Determine which danger overlay area the bubble entered var areaIndex = Math.floor(self.x / (2048 / 5)); var areaScore = 100; if (areaIndex === 2) { areaScore = 500; } else if (areaIndex === 1 || areaIndex === 3) { areaScore = 300; } increaseScore(areaScore); self.destroy(); LK.getSound('scoreCollected').play(); } } }; }); var BubbleRemoveParticle = Container.expand(function () { var self = Container.call(this); var particle = self.attachAsset('removebubbleeffect', { anchorX: 0.5, anchorY: 0.5 }); particle.blendMode = 1; self.scale.set(.33, .33); var cscale = .5; self.update = function () { cscale += .02; self.scale.set(cscale, cscale); self.alpha = 1 - (cscale - .5) * 1.5; if (self.alpha < 0) { self.destroy(); } }; }); var FireBallPowerupOverlay = Container.expand(function () { var self = Container.call(this); var bubbleGraphics = self.attachAsset('fireball', { anchorX: 0.5, anchorY: 0.5 }); self.y = game.height - 140; self.x = 200; var countBG = self.attachAsset('countbg', { anchorX: 0.5, anchorY: 0.5 }); countBG.x = 90; countBG.y = 50; self.fireballsLeft = 1; var label = self.addChild(new Text2(self.fireballsLeft, { size: 70, fill: 0xFFFFFF, font: "Impact", stroke: 0x000000, strokeThickness: 13 })); label.anchor.set(.5, .5); label.x = 90; label.y = 50; self.addFireball = function () { self.fireballsLeft++; label.setText(self.fireballsLeft); self.alpha = 1; // Make sure overlay is visible }; self.down = function () { if (self.fireballsLeft > 0 && !launcher.isFireBall()) { self.fireballsLeft--; label.setText(self.fireballsLeft); launcher.triggerFireBall(); if (self.fireballsLeft == 0) { self.alpha = .5; } } }; }); var FireParticle = Container.expand(function (angle) { var self = Container.call(this); var particleGraphics = self.attachAsset('fireparticle', { anchorX: 0.5, anchorY: 0.5 }); particleGraphics.blendMode = 1; var speedX = Math.cos(angle) * 1; var speedY = Math.sin(angle) * 1; var rotationSpeed = Math.random() * 0.1 - 0.05; self.update = function () { self.x += speedX * self.alpha; self.y += speedY * self.alpha; particleGraphics.rotation += rotationSpeed; self.alpha -= 0.01; if (self.alpha <= 0) { self.destroy(); } }; }); var Grid = Container.expand(function () { var self = Container.call(this); var rows = []; self.container = self.addChild(new Container()); var rowCount = 0; function insertRow() { var row = []; var rowWidth = rowCount % 2 == 0 ? 13 : 12; for (var a = 0; a < rowWidth; a++) { var bubble = new Bubble(getMaxTypes()); bubble.setPos((2048 - bubbleSize * rowWidth) / 2 + bubbleSize * a + bubbleSize / 2, -rowCount * (1.7320508076 * bubbleSize) / 2); self.container.addChild(bubble); row.push(bubble); /*bubble.down = function () { var bubbles = self.getConnectedBubbles(this); self.removeBubbles(bubbles); var disconnected = self.getDetachedBubbles(); self.removeBubbles(disconnected); };*/ } rows.push(row); rowCount++; } //Method that removes an array of bubbles from the rows array. self.removeBubbles = function (bubbles) { for (var i = 0; i < bubbles.length; i++) { var bubble = bubbles[i]; if (bubble) { var bubbleIndex = this.findBubbleIndex(bubble); if (bubbleIndex) { rows[bubbleIndex.row][bubbleIndex.col] = null; bubble.detach(); // Increase score for each removed bubble increaseScore(10); // Assuming 10 points per bubble removed } } } }; self.getConnectedBubbles = function (bubble, ignoreType) { var connectedBubbles = []; var queue = [bubble]; var visited = []; while (queue.length > 0) { var currentBubble = queue.shift(); if (visited.indexOf(currentBubble) === -1) { visited.push(currentBubble); connectedBubbles.push(currentBubble); var neighbors = self.getNeighbors(currentBubble); for (var i = 0; i < neighbors.length; i++) { var neighbor = neighbors[i]; if (neighbor && (neighbor.type === bubble.type || ignoreType)) { queue.push(neighbor); } } } } return connectedBubbles; }; //Get a list of bubbles that are not connected to the top row, or to a chain of bubbles connected to the top row. self.getDetachedBubbles = function () { var detachedBubbles = []; var connectedToTop = []; // Mark all bubbles connected to the bottom row var lastRowIndex = rows.length - 1; for (var i = 0; i < rows[lastRowIndex].length; i++) { if (rows[lastRowIndex][i] !== null) { var bottomConnected = self.getConnectedBubbles(rows[lastRowIndex][i], true); connectedToTop = connectedToTop.concat(bottomConnected); } } // Mark all bubbles as visited or not var visited = connectedToTop.filter(function (bubble) { return bubble != null; }); // Find all bubbles that are not visited and not connected to the top for (var row = 0; row < rows.length - 1; row++) { for (var col = 0; col < rows[row].length; col++) { var bubble = rows[row][col]; if (bubble !== null && visited.indexOf(bubble) == -1) { detachedBubbles.push(bubble); } } } return detachedBubbles; }; self.getNeighbors = function (bubble) { var neighbors = []; var bubbleIndex = this.findBubbleIndex(bubble); if (!bubbleIndex) { return []; } var directions = [[-1, 0], [1, 0], // left and right [0, -1], [0, 1], // above and below [-1, -1], [1, -1] // diagonals for even rows ]; if (bubbleIndex && rows[bubbleIndex.row] && rows[bubbleIndex.row].length == 12) { // Adjust diagonals for odd rows directions[4] = [-1, 1]; directions[5] = [1, 1]; } for (var i = 0; i < directions.length; i++) { var dir = directions[i]; if (bubbleIndex && rows[bubbleIndex.row]) { var newRow = bubbleIndex.row + dir[0]; } var newCol = bubbleIndex.col + dir[1]; if (newRow >= 0 && newRow < rows.length && newCol >= 0 && newCol < rows[newRow].length) { neighbors.push(rows[newRow][newCol]); } } return neighbors; }; self.findBubbleIndex = function (bubble) { for (var row = 0; row < rows.length; row++) { var col = rows[row].indexOf(bubble); if (col !== -1) { return { row: row, col: col }; } } return null; }; self.printRowsToConsole = function () { var gridString = ''; for (var i = rows.length - 1; i >= 0; i--) { var rowString = ': ' + (rows[i].length == 13 ? '' : ' '); for (var j = 0; j < rows[i].length; j++) { var bubble = rows[i][j]; rowString += bubble ? '[' + bubble.type + ']' : '[_]'; } gridString += rowString + '\n'; } console.log(gridString); }; // Method to calculate path of movement based on angle and starting point //TODO: MAKE THIS MUCH FASTER! self.bubbleIntersectsGrid = function (nextX, nextY) { outer: for (var row = 0; row < rows.length; row++) { for (var col = 0; col < rows[row].length; col++) { var bubble = rows[row][col]; if (bubble) { var dist = nextY - bubble.y - self.y; //Quick exit if we are nowhere near the row if (dist > 145 || dist < -145) { continue outer; } var dx = nextX - bubble.x - self.x; var dy = nextY - bubble.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance < (bubbleSize - 70) / 2 + bubbleSize / 2) { return bubble; } } } } return false; }; self.calculatePath = function (startPoint, angle) { var path = []; var currentPoint = { x: startPoint.x, y: startPoint.y }; var radians = angle; var stepSize = 4; var hitBubble = false; while (currentPoint.y > 0 && !hitBubble) { // Calculate next point var nextX = currentPoint.x + stepSize * Math.cos(radians); var nextY = currentPoint.y + stepSize * Math.sin(radians); // Check for wall collisions if (nextX < 150 / 2 || nextX > 2048 - 150 / 2) { radians = Math.PI - radians; // Reflect angle nextX = currentPoint.x + stepSize * Math.cos(radians); // Recalculate nextX after reflection } hitBubble = self.bubbleIntersectsGrid(nextX, nextY); // Add point to path and update currentPoint path.push({ x: nextX, y: nextY }); currentPoint.x = nextX; currentPoint.y = nextY; } if (hitBubble) { //Only increase avilable bubble type when we have actually pointed as such a bubble if (hitBubble.type + 1 > maxSelectableBubble) { maxSelectableBubble = hitBubble.type + 1; } ; } return path; }; var bubblesInFlight = []; self.fireBubble = function (bubble, angle) { self.addChild(bubble); bubble.x = launcher.x; bubble.y += launcher.y - self.y; bubblesInFlight.push({ bubble: bubble, angle: angle }); }; self.calculateWarningScoreList = function () { var warningScores = []; for (var i = 0; i < 13; i++) { warningScores.push(0); // Initialize all scores to 0 } // Calculate the distance from the bottom for each bubble and increment the warning score based on proximity for (var row = 0; row < rows.length; row++) { for (var col = 0; col < rows[row].length; col++) { var bubble = rows[row][col]; if (bubble) { var distanceFromBottom = 2732 - (bubble.y + self.y); if (distanceFromBottom < 2000) { // If a bubble is within 500px from the bottom var columnIndex = Math.floor(bubble.x / (2048 / 13)); warningScores[columnIndex] += (2000 - distanceFromBottom) / 2000; // Increment the warning score for the column } } } } return warningScores; }; self.update = function () { outer: for (var a = 0; a < bubblesInFlight.length; a++) { var current = bubblesInFlight[a]; var bubble = current.bubble; var nextX = bubble.x; var nextY = bubble.y + gridSpeed; var prevX = bubble.x; var prevY = bubble.y; for (var rep = 0; rep < 25; rep++) { prevX = nextX; prevY = nextY; nextX += Math.cos(current.angle) * 4; nextY += Math.sin(current.angle) * 4; if (nextX < 150 / 2 || nextX > 2048 - 150 / 2) { current.angle = Math.PI - current.angle; // Reflect angle nextX = Math.min(Math.max(nextX, 150 / 2), 2048 - 150 / 2); LK.getSound('circleBounce').play(); } var intersectedBubble = self.bubbleIntersectsGrid(nextX + self.x, nextY + self.y); if (intersectedBubble) { gameIsStarted = true; if (bubble.isFireBall) { self.removeBubbles([intersectedBubble]); var disconnected = self.getDetachedBubbles(); self.removeBubbles(disconnected); } else { var intersectedBubblePos = self.findBubbleIndex(intersectedBubble); var colOffset = rows[intersectedBubblePos.row].length == 13 ? 0 : 1; var offsetPositions = [{ x: intersectedBubble.targetX - bubbleSize / 2, y: intersectedBubble.targetY - 1.7320508076 * bubbleSize / 2, ro: intersectedBubblePos.row + 1, co: intersectedBubblePos.col - 1 + colOffset }, { x: intersectedBubble.targetX + bubbleSize / 2, y: intersectedBubble.targetY - 1.7320508076 * bubbleSize / 2, ro: intersectedBubblePos.row + 1, co: intersectedBubblePos.col + colOffset }, { x: intersectedBubble.targetX + bubbleSize, y: intersectedBubble.targetY, ro: intersectedBubblePos.row, co: intersectedBubblePos.col + 1 }, { x: intersectedBubble.targetX + bubbleSize / 2, y: intersectedBubble.targetY + 1.7320508076 * bubbleSize / 2, ro: intersectedBubblePos.row - 1, co: intersectedBubblePos.col + colOffset }, { x: intersectedBubble.targetX - bubbleSize / 2, y: intersectedBubble.targetY + 1.7320508076 * bubbleSize / 2, ro: intersectedBubblePos.row - 1, co: intersectedBubblePos.col - 1 + colOffset }, { x: intersectedBubble.targetX - bubbleSize, y: intersectedBubble.targetY, ro: intersectedBubblePos.row, co: intersectedBubblePos.col - 1 }]; var closestPosition = 0; var closestDistance = Math.sqrt(Math.pow(offsetPositions[0].x - bubble.x, 2) + Math.pow(offsetPositions[0].y - bubble.y, 2)); for (var i = 1; i < offsetPositions.length; i++) { var currentPosition = offsetPositions[i]; var currentDistance = Math.sqrt(Math.pow(currentPosition.x - bubble.x, 2) + Math.pow(currentPosition.y - bubble.y, 2)); if (currentDistance < closestDistance) { var row = rows[currentPosition.ro]; if (currentPosition.co < 0) { continue; } if (row) { if (row[currentPosition.co]) { continue; } if (currentPosition.co >= row.length) { continue; } } else { var newRowLength = rows[intersectedBubblePos.row].length == 13 ? 12 : 13; if (currentPosition.co >= newRowLength) { continue; } } closestDistance = currentDistance; closestPosition = i; } } // Attach bubble to the closest position var currentMatch = offsetPositions[closestPosition]; bubble.x = prevX; bubble.y = prevY; bubble.targetX = currentMatch.x; bubble.targetY = currentMatch.y; bubble.isFreeBubble = false; var row = rows[offsetPositions[closestPosition].ro]; if (!row) { if (rows[intersectedBubblePos.row].length == 13) { row = [null, null, null, null, null, null, null, null, null, null, null, null]; } else { row = [null, null, null, null, null, null, null, null, null, null, null, null, null]; } rows.unshift(row); } row[offsetPositions[closestPosition].co] = bubble; bubblesInFlight.splice(a--, 1); refreshHintLine(); var bubbles = self.getConnectedBubbles(bubble); if (bubbles.length > 2) { self.removeBubbles(bubbles); var disconnected = self.getDetachedBubbles(); self.removeBubbles(disconnected); bonusUX.setStreakCount(bonusUX.streakCount + 1); } else { bonusUX.setStreakCount(0); LK.getSound('attachCircle').play(); } //Add a grid movement effect when you don't do a match var neighbors = self.getNeighbors(bubble); var touched = []; var neighbors2 = []; for (var i = 0; i < neighbors.length; i++) { var neighbor = neighbors[i]; if (neighbor) { touched.push(neighbor); neighbors2 = neighbors2.concat(self.getNeighbors(neighbor)); var ox = neighbor.x - bubble.x; var oy = neighbor.y - bubble.y; var angle = Math.atan2(oy, ox); neighbor.x += Math.cos(angle) * 20; neighbor.y += Math.sin(angle) * 20; } } //One more layer for (var i = 0; i < neighbors2.length; i++) { var neighbor = neighbors2[i]; if (neighbor && touched.indexOf(neighbor) == -1) { touched.push(neighbor); var ox = neighbor.x - bubble.x; var oy = neighbor.y - bubble.y; var angle = Math.atan2(oy, ox); neighbor.x += Math.cos(angle) * 10; neighbor.y += Math.sin(angle) * 10; } } //self.printRowsToConsole(); continue outer; } } } bubble.x = nextX; bubble.y = nextY; if (bubble.y + self.y < -1000) { //Destory bubbles that somehow manages to escape at the top bubblesInFlight.splice(a--, 1); bubble.destroy(); } } if (gameIsStarted) { self.y += gridSpeed; } var zeroRow = rows[rows.length - 1]; if (zeroRow) { for (var a = 0; a < zeroRow.length; a++) { var bubble = zeroRow[a]; if (bubble) { if (bubble.y + self.y > 0) { insertRow(); } break; } } } else { insertRow(); } for (var row = rows.length - 1; row >= 0; row--) { if (rows[row].every(function (bubble) { return !bubble; })) { rows.splice(row, 1); } } var lastRow = rows[0]; /*if(LK.ticks % 10 == 0){ self.printRowsToConsole() }*/ if (lastRow) { for (var a = 0; a < zeroRow.length; a++) { var bubble = lastRow[a]; if (bubble) { if (bubble.y + self.y > 2200) { LK.effects.flashScreen(0xff0000, 3000); LK.getSound('gameOverJingle').play(); LK.showGameOver(); } if (gameIsStarted) { var targetSpeed = Math.pow(Math.pow((2200 - (bubble.y + self.y)) / 2200, 2), 2) * 4 + 0.5; if (bubble.y + self.y > 2000) { targetSpeed = .2; } gridSpeed += (targetSpeed - gridSpeed) / 20; if (LK.ticks % 10 == 0) { //console.log(gridSpeed) } } break; } } } }; for (var a = 0; a < 8; a++) { insertRow(); } }); var HintBubble = Container.expand(function () { var self = Container.call(this); var bubble = self.attachAsset('hintbubble', { anchorX: 0.5, anchorY: 0.5 }); self.setTint = function (tint) { bubble.tint = tint; }; self.getTint = function (tint) { return bubble.tint; }; }); var Launcher = Container.expand(function () { var self = Container.call(this); var bubble = self.addChild(new Bubble(getMaxTypes(), false)); bubble.isFreeBubble = true; var previewBubble; var lastTypes = [undefined, bubble.type]; function createPreviewBubble() { var nextType; do { nextType = Math.floor(Math.random() * maxSelectableBubble); } while (nextType == lastTypes[0] && nextType == lastTypes[1]); lastTypes.shift(); lastTypes.push(nextType); previewBubble = self.addChildAt(new Bubble(maxSelectableBubble, false, nextType), 0); previewBubble.scale.set(.7, .7); previewBubble.x = -90; previewBubble.y = 20; previewBubble.isFreeBubble = true; } createPreviewBubble(); self.fire = function () { bulletsFired++; LK.getSound('fireBubble').play(); // Play sound when the ball is fired grid.fireBubble(bubble, self.angle); bubble = previewBubble; previewBubble.x = previewBubble.y = 0; previewBubble.scale.set(1, 1); createPreviewBubble(); }; self.angle = -Math.PI / 2; self.getBubble = function () { return bubble; }; self.isFireBall = function () { return bubble.isFireBall; }; self.triggerFireBall = function () { bubble.destroy(); bubble = self.addChild(new Bubble(getMaxTypes(), true)); bubble.isFreeBubble = true; }; }); var ScoreIndicatorLabel = Container.expand(function (score, type) { var self = Container.call(this); var label = new Text2(score, { size: 100, fill: "#" + bubbleColors[type].toString(16).padStart(6, '0'), font: "Impact" }); label.anchor.set(0.5, 0); self.addChild(label); self.update = function () { self.y -= 7; self.alpha -= .05; if (self.alpha <= 0) { self.destroy(); increaseScore(score); } }; }); var ScoreMultipliers = Container.expand(function (baseValue) { var self = Container.call(this); // Create a score label text string for ScoreMultipliers var scoreMultiplierLabel = new Text2(baseValue, { size: 100, fill: 0x3954FF, font: "Impact" }); scoreMultiplierLabel.anchor.set(0.5, 0); self.addChild(scoreMultiplierLabel); var currentMultiplier = 1; self.applyBubble = function (bubble) { var scoreIndicator = game.addChild(new ScoreIndicatorLabel(baseValue * currentMultiplier, bubble.type)); scoreIndicator.x = self.x; scoreIndicator.y = self.y; var particle = particlesLayer.addChild(new BubbleRemoveParticle()); particle.x = bubble.x; particle.y = self.y + 150; }; self.setMultiplier = function (multiplier) { currentMultiplier = multiplier; scoreMultiplierLabel.setText(baseValue * currentMultiplier); }; }); var WarningLine = Container.expand(function () { var self = Container.call(this); var warning = self.attachAsset('warningstripe', { anchorX: .5, anchorY: .5 }); var warningOffset = Math.random() * 100; var speed = Math.random() * 1 + 1; self.update = function () { warningOffset += speed; warning.alpha = (Math.cos(warningOffset / 50) + 1) / 2 * 0.3 + .7; }; warning.blendMode = 1; warning.rotation = .79; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x0c0d25 }); /**** * Game Code ****/ // Add background asset to the game scene behind all other elements // Score label asset (white box, will be replaced with styled text in game) var background = game.attachAsset('background', { anchorX: 0, anchorY: 0, x: 0, y: 0, width: 2048, height: 2732 }); game.addChildAt(background, 0); // Ensure it's at the very back // --- Score Counter Centered at Top --- var scoreText = new Text2('0', { size: 120, fill: 0xffffff, font: "Impact", stroke: 0x000000, strokeThickness: 10 }); scoreText.anchor.set(0.5, 0); // Add to the top-center GUI container LK.gui.top.addChild(scoreText); // Defensive update for scoreText function updateScoreText() { if (typeof scoreText !== "undefined" && scoreText && typeof scoreText.setText === "function") { scoreText.setText(String(LK.getScore())); scoreText.visible = true; scoreText.alpha = 1; // Positioning within the LK.gui.top container (which is already centered horizontally at the top) scoreText.x = 0; scoreText.y = 40; // Adjust vertical position as needed scoreText.anchor.set(0.5, 0); } } updateScoreText(); var gridSpeed = .5; function increaseScore(amount) { var currentScore = LK.getScore(); var newScore = currentScore + amount; // Check if player has crossed a 100000 point threshold if (Math.floor(currentScore / 100000) < Math.floor(newScore / 100000)) { fireBallPowerupOverlay.addFireball(); } LK.setScore(newScore); // Update the game score using LK method updateScoreText(); // Update global high score leaderboard if needed updateHighScoreList(newScore); } // --- High Score Leaderboard Implementation --- var HIGH_SCORE_KEY = "global_high_scores"; var MAX_HIGH_SCORES = 10; var highScoreList = []; // Load high scores from storage at game start function loadHighScores() { var scores = storage[HIGH_SCORE_KEY]; if (Array.isArray(scores)) { highScoreList = scores; } else { highScoreList = []; } renderHighScoreList(); } loadHighScores(); // Save high scores to storage function saveHighScores() { storage[HIGH_SCORE_KEY] = highScoreList; } // Update high score list to only allow one score per player and only update if new score is higher function updateHighScoreList(newScore) { // We'll use a single slot for the player's score // If the list is empty, add the score if (highScoreList.length === 0) { highScoreList.push(newScore); saveHighScores(); renderHighScoreList(); return; } // Only update if the new score is higher than the stored one if (newScore > highScoreList[0]) { highScoreList[0] = newScore; saveHighScores(); renderHighScoreList(); } } // Render the high score list on the screen (right side, top) var highScoreText = new Text2('', { size: 60, fill: 0xFFD700, font: "Impact", stroke: 0x000000, strokeThickness: 8 }); highScoreText.anchor.set(1, 0); highScoreText.x = 2048 - 40; highScoreText.y = 40; LK.gui.top.addChild(highScoreText); function renderHighScoreList() { var text = "Your Best\n"; if (highScoreList.length > 0) { text += "1. " + highScoreList[0] + "\n"; } else { text += "1. 0\n"; } if (typeof highScoreText !== "undefined" && highScoreText && typeof highScoreText.setText === "function") { highScoreText.setText(text); // Reset position and visibility for normal gameplay highScoreText.visible = true; highScoreText.alpha = 1; highScoreText.x = 2048 - 40; highScoreText.y = 40; highScoreText.anchor.set(1, 0); } } renderHighScoreList(); if (typeof highScoreText !== "undefined" && highScoreText) { highScoreText.visible = true; highScoreText.alpha = 1; highScoreText.x = 2048 - 40; highScoreText.y = 40; highScoreText.anchor.set(1, 0); } //Game size 2048x2732 /* Todo: [X] Make sure we GC nodes that drop of screen [ ] Make preview line fade out at the end */ var bulletsFired = 0; //3*30+1 var bubbleSize = 150; var gameIsStarted = false; var bubbleColors = [0xff2853, 0xfff200, 0x5252ff, 0xcb2bff, 0x28f2f0, 0xffc411]; var bubbleCounterColors = [0xfff200, 0xFFFFFF, 0xff0000, 0x0000ff, 0x00ff00, 0xA52A2A]; // Colors for bubble counters, matching their labels var barriers = []; var maxSelectableBubble = 3; var warningLines = []; // Track how many drops from each bubble type var bubbleDropCounter = [0, 0, 0, 0, 0, 0]; for (var a = 0; a < 13; a++) { var wl = game.addChild(new WarningLine()); wl.x = 2048 / 13 * (a + .5); wl.y = 2200; wl.alpha = 0; warningLines.push(wl); wl.scale.set(16, 40); } // Remove the single overlay and add separate overlays between each goal post var dangerOverlays = []; var dangerOverlayY = 2280; var dangerOverlayHeight = 180; var dangerOverlayWidth = 2048 / 5; for (var i = 0; i < 5; i++) { var overlay = game.attachAsset('dangeroverlay', { width: dangerOverlayWidth, height: dangerOverlayHeight, anchorX: 0.5, anchorY: 0 }); overlay.x = 2048 / 5 * (i + 0.5); overlay.y = dangerOverlayY; overlay.alpha = 0.7; game.addChild(overlay); dangerOverlays.push(overlay); // Add score label to each overlay var labelValue; if (i === 2) { labelValue = "500"; } else if (i === 1 || i === 3) { labelValue = "300"; } else { labelValue = "100"; } var label = new Text2(labelValue, { size: 120, fill: 0xffffff, font: "Impact", stroke: 0x000000, strokeThickness: 10 }); label.anchor.set(0.5, 0.5); label.x = overlay.x; label.y = overlay.y + dangerOverlayHeight / 2 + 10; // Centered vertically in overlay game.addChild(label); } // Removed uxoverlay from the game scene for (var a = 0; a < 4; a++) { for (var b = 0; b < 3; b++) { var barrier = game.addChild(new Barrier()); barrier.y = 2732 - 450 + b * 70; barrier.x = 2048 / 5 * a + 2048 / 5; barriers.push(barrier); } var barrierBlock = game.attachAsset('barrierblock', {}); barrierBlock.x = 2048 / 5 * a + 2048 / 5; barrierBlock.y = 2732 - 450; barrierBlock.anchor.x = .5; } // Draw goal posts (vertical columns) for the score areas var goalPostWidth = 30; var goalPostHeight = 300; var goalPostColor = 0xffffff; // White color for goal posts var goalPostY = 2300 - 40; // slightly above the old score area var goalPosts = []; for (var a = 0; a < 6; a++) { // 5 columns = 6 posts (left and right of each area) var post = game.attachAsset('barrierblock', { width: goalPostWidth, height: goalPostHeight, color: 0xffffff, // Set to white for kale direği anchorX: 0.5, anchorY: 1 }); post.x = 2048 / 5 * a; post.y = goalPostY + goalPostHeight; game.addChild(post); goalPosts.push(post); } // Removed all 100 200 300 400 500 numbers from the net area by removing ScoreMultipliers objects var scoreMultipliers = []; // Removed uxoverlay2 (net background) from the game scene // Define a net object with y and height properties for positioning references var net = { y: goalPostY + goalPostHeight / 2, // Vertically center in the net area height: goalPostHeight }; // Removed 100, 200, 300, 400, 500 numbers in the net area as requested // Shrink the streak bonus text (bonusUX) // Initialize bonusUX but add it to game after launcher is initialized var bonusUX = new BonusUX(); bonusUX.scale.set(0.45, 0.45); // Shrink the bonusUX overlay // Initial position - will be adjusted after launcher is created bonusUX.y = game.height - 160; // Position the FireBallPowerupOverlay in the bottom-right corner var fireBallPowerupOverlay = game.addChild(new FireBallPowerupOverlay()); fireBallPowerupOverlay.x = game.width - 200; // Adjusted for visual content width and padding from right edge fireBallPowerupOverlay.y = game.height - 160; // Adjusted for visual content height and padding from bottom edge var particlesLayer = game.addChild(new Container()); // Display drop counter for each bubble type, side by side in the lower left var dropCounterLabels = []; var dropCounterIcons = []; var iconSize = 90; var iconMargin = 18; // Move the icons further up from the bottom and center them vertically a bit higher var startX = 90; var startY = 2732 - 200; // Move everything further up (was 2732 - 120) for (var i = 0; i < bubbleColors.length; i++) { var icon = game.attachAsset('bubble' + i, { anchorX: 0.5, anchorY: 0.5 }); // Place icons side by side in the lower left, with a small margin from the left and bottom icon.x = startX + i * (iconSize + iconMargin); icon.y = startY; icon.width = iconSize; icon.height = iconSize; game.addChild(icon); dropCounterIcons.push(icon); var label = new Text2('0', { size: 70, fill: i === 0 ? 0xfff200 : i === 1 ? 0xFFFFFF : i === 2 ? 0xff0000 : i === 3 ? 0x0000ff : i === 4 ? 0x00ff00 : i === 5 ? 0xA52A2A : "#" + bubbleColors[i].toString(16).padStart(6, '0'), font: "Impact", stroke: 0x000000, strokeThickness: 8 }); label.anchor.set(0.5, 0.5); // Center the icon directly above the number label.x = icon.x; label.y = icon.y + iconSize / 2 + 60; // Adjust vertical offset for centering game.addChild(label); dropCounterLabels.push(label); } // Update drop counter labels every frame var oldDropCounts = bubbleDropCounter.slice(); var updateDropCounters = function updateDropCounters() { for (var i = 0; i < dropCounterLabels.length; i++) { if (dropCounterLabels[i].text !== String(bubbleDropCounter[i])) { dropCounterLabels[i].setText(String(bubbleDropCounter[i])); } } }; var grid = game.addChild(new Grid()); grid.y = 1000; var freeBubbleLayer = game.addChild(new Container()); var hintBubblePlayer = game.addChild(new Container()); var launcher = game.addChild(new Launcher()); launcher.x = game.width / 2; launcher.y = game.height - 138; // Now that launcher exists, position and add bonusUX to the game bonusUX.x = launcher.x + 350; // Position to the right of the launcher game.addChild(bonusUX); // Add bonusUX to the main game stage var hintBubbleCache = []; var hintBubbles = []; var isValid = false; var path = []; var bubbleAlpha = 1; var hintTargetX = game.width / 2; var hintTargetY = 0; game.move = function (x, y, obj) { hintTargetX = x; hintTargetY = y; refreshHintLine(); // } }; game.down = game.move; function getMaxTypes() { if (bulletsFired > 30 * 3 * 3) { return 6; } else if (bulletsFired > 30 * 3) { return 5; } else if (bulletsFired > 30) { return 4; } return 3; } function refreshHintLine() { var ox = hintTargetX - launcher.x; var oy = hintTargetY - launcher.y; var angle = Math.atan2(oy, ox); launcher.angle = angle; isValid = angle < -.2 && angle > -Math.PI + .2; if (isValid) { path = grid.calculatePath(launcher, angle); //This allows updated faster than 60fps, making everyting feel better. } renderHintBubbels(); } var hintOffset = 0; var distanceBetweenHintbubbles = 100; function renderHintBubbels() { if (isValid) { hintOffset = hintOffset % distanceBetweenHintbubbles; var distanceSinceLastDot = -hintOffset + 100; var hintBubbleOffset = 0; var lastPoint = path[0]; var bubble = launcher.getBubble(); var tint; if (bubble.isFireBall) { tint = 0xff9c00; // Fireball color for hint bubbles } else { var bubbleType = bubble.type; // Use bubbleCounterColors for the tint if the type is within its defined range if (bubbleType >= 0 && bubbleType < bubbleCounterColors.length) { tint = bubbleCounterColors[bubbleType]; } else { // Fallback to original bubbleColors if type is out of bubbleCounterColors range, or a default tint = bubbleColors[bubbleType] !== undefined ? bubbleColors[bubbleType] : 0xFFFFFF; // Default to white } } var firstHintBubbleTint = tint; var updateTint = true; for (var a = 1; a < path.length; a++) { var p2 = path[a]; var ox = p2.x - lastPoint.x; var oy = p2.y - lastPoint.y; var dist = Math.sqrt(ox * ox + oy * oy); distanceSinceLastDot += dist; if (distanceSinceLastDot >= distanceBetweenHintbubbles) { var amountOver = distanceSinceLastDot - distanceBetweenHintbubbles; var angle = Math.atan2(oy, ox); var currentBubble = hintBubbles[hintBubbleOffset]; if (!currentBubble) { currentBubble = hintBubbles[hintBubbleOffset] = new HintBubble(); hintBubblePlayer.addChild(currentBubble); } currentBubble.alpha = bubbleAlpha; currentBubble.visible = true; var currentTint = currentBubble.getTint(); if (updateTint) { currentBubble.setTint(firstHintBubbleTint); // Set the hint bubble tint based on the launching bubble's color updateTint = false; } else { currentBubble.setTint(tint); } currentBubble.x = lastPoint.x - Math.cos(angle) * amountOver; currentBubble.y = lastPoint.y - Math.sin(angle) * amountOver; hintBubbleOffset++; distanceSinceLastDot = 0; lastPoint = currentBubble; } else { lastPoint = p2; } } for (var a = hintBubbleOffset; a < hintBubbles.length; a++) { hintBubbles[a].visible = false; } } else { for (var a = 0; a < hintBubbles.length; a++) { hintBubbles[a].alpha = bubbleAlpha; } } } game.update = function () { hintOffset += 5; if (isValid) { bubbleAlpha = Math.min(bubbleAlpha + .05, 1); } else { bubbleAlpha = Math.max(bubbleAlpha - .05, 0); } refreshHintLine(); updateScoreText(); // Defensively keep the score text centered at the top within the GUI container if (typeof scoreText !== "undefined" && scoreText) { scoreText.x = 0; // Already centered horizontally in LK.gui.top scoreText.y = 40; // Adjust vertical position as needed scoreText.anchor.set(0.5, 0); } var alphaList = grid.calculateWarningScoreList(); for (var a = 0; a < warningLines.length; a++) { var value = alphaList[a] / 3; warningLines[a].alpha += (Math.min(value, .6) - warningLines[a].alpha) / 100; warningLines[a].scale.y += (value * 60 - warningLines[a].scale.y) / 100; } updateDropCounters(); // Detect game over popup and show high score overlay if (typeof LK !== "undefined" && typeof LK.isGameOver === "function" && LK.isGameOver()) { if (typeof highScoreText !== "undefined" && highScoreText) { highScoreText.visible = true; highScoreText.alpha = 1; highScoreText.x = 2048 / 2; highScoreText.y = 800; highScoreText.anchor.set(0.5, 0); highScoreText.setText("Your Best\n" + (highScoreList.length > 0 ? "1. " + highScoreList[0] : "1. 0")); } } else { // Hide and reset high score overlay on game restart or when not over if (typeof highScoreText !== "undefined" && highScoreText) { highScoreText.visible = true; highScoreText.alpha = 1; highScoreText.x = 2048 - 40; highScoreText.y = 40; highScoreText.anchor.set(1, 0); renderHighScoreList(); } } }; game.up = function () { if (isValid) { launcher.fire(); } }; ; ; ; ; ; ; ; ; ; ;
===================================================================
--- original.js
+++ change.js
@@ -218,13 +218,18 @@
// Increment drop counter for this bubble type
if (typeof bubbleDropCounter[self.type] === "number") {
bubbleDropCounter[self.type]++;
}
- self.destroy();
- var scoreMultiplierIndex = Math.floor(self.x / (2048 / 5));
- if (scoreMultipliers[scoreMultiplierIndex] && typeof scoreMultipliers[scoreMultiplierIndex].applyBubble === "function") {
- scoreMultipliers[scoreMultiplierIndex].applyBubble(self);
+ // Determine which danger overlay area the bubble entered
+ var areaIndex = Math.floor(self.x / (2048 / 5));
+ var areaScore = 100;
+ if (areaIndex === 2) {
+ areaScore = 500;
+ } else if (areaIndex === 1 || areaIndex === 3) {
+ areaScore = 300;
}
+ increaseScore(areaScore);
+ self.destroy();
LK.getSound('scoreCollected').play();
}
}
};
Circular white gradient circle on black background. Gradient from white on the center to black on the outer edge all around.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
Soft straight Long red paint on black background. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
green notification bubble. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
messi is making thumbsup. In-Game asset. 2d. High contrast. No shadows
ronaldo s making thumbsup. In-Game asset. 2d. High contrast. No shadows
brasil tshirt neymar is making thumbsup. In-Game asset. 2d. High contrast. No shadows
Kylian Mbappé wıth france futboll tshirt makıng thumbsup. In-Game asset. 2d. High contrast. No shadows
Pep Guardiola ıs makıng thumbsup. In-Game asset. 2d. High contrast. No shadows
Alex Ferguson ıs makıng thumbsup. In-Game asset. 2d. High contrast. No shadows
whıte futboall ball. In-Game asset. 2d. High contrast. No shadows
Kaleyi beyaz çizgiyle çiz