User prompt
You Win ekraninda menu yada next butonu olsun bunun sayesinde kullanici bir sonraki levele gecebilsin eger 2. levelde gecildiyse 3. levelin kilidi acilsin. ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
Challenge'in 2. levelinde bolum gecme sarti 2x kombo yapmak 45 saniye icerisinde yapamazsan kazanamazsin ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
Ana menudeki Challenge butonu griden normale cevrilsin
User prompt
blocklar birbirine biraz daha yakin gozuksunler
User prompt
Bloklarin arasindaki bosluk biraz azaltilsin birbirlerine yakin gozuksunler
User prompt
You Win yazisinin altinda 2 buton gozuksun Level 2 and Main Menu
User prompt
Challenge butonu aktiflestirilsin ve icerisindeki Level 1 butonundaki oyunun amaci 1000 puan toplamak olsun ve ardindan level 2 butonunun kilidi acilsin ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
Kombo baslangicta 0 olsun ve ekranda gozukmesin, kombo timer'i olmasin
User prompt
Herhangi bir butona basildignda daha onceki ekran temizlensin yazilar veya ekranlar ust uste binmesin
User prompt
Challenge butonuna basinca kullaniciyi levellerin yazdigi bir ekran karsilasin Level 1 den Level 10 a dogru giden butonlar olsun
User prompt
Oyunun ana menusune 2 buton ekleyelim birisi oyunun suanki halini calistiran buton ismi Arcade olsun diger butonun adi Challenge olsun onu suanlik islevsiz birakalim
User prompt
Ayni anda birden fazla sutun yada satirdaki taslar patlarsa combo toplam patlayan satir ve sutun sayisi kadar artar
User prompt
Sag uste pause butonu dugmesi eklensin durdurma menusu icin
User prompt
Sol ustten oyun durdurulmadikca oyun durdurma menusu acilmasin
User prompt
Pause menusune oyunu bitir ve ana menuye don menusu eklensin
User prompt
Ayni bloklari kullaniciya verme sikligini azalt, play butonuna bastiktan sonra play yazisi ekranda kaliyor oda duzeltilsin
User prompt
Kullanicinin high skoru tutulsun, ana menu tasarlansin simdilik sadece oyna butonu ve daha once yaptigi high score gozuksun ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
Combo kaldigi yerden x2 x3 seklinde devam etsin pespese 3-4 blok koyarak yapilirsa kombo devam etsin ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Taslar satiri veya sutunu doldurmadan once patlarken taslarin gorunumu degissin tek renk olsunlar her seferinde farkli bir asset kullanalim ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Combo yazisi ekranin ortasinda 1-2 saniyeligine gozuksun ve pesi sira bloklar patladikca kombo artsin ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
10x10 grid i 8x8 yapalım ancak zoom in yapalım
User prompt
Gri alanı büyüt
User prompt
Gri alanı biraz daha ekrana sığdır
User prompt
Gri alanı büyük ekrana sığdır
User prompt
Gri alanı ekrana sığdıralım ama kare sayısı aynı kalsın
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
var BlockPiece = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('blockPiece', {
anchorX: 0.5,
anchorY: 0.5
});
self.gridX = 0;
self.gridY = 0;
self.color = 0xff6b6b;
self.setColor = function (color) {
self.color = color;
graphics.tint = color;
};
self.setExplodingAsset = function (assetId) {
self.removeChild(graphics);
graphics = self.attachAsset(assetId, {
anchorX: 0.5,
anchorY: 0.5
});
};
return self;
});
var GamePiece = Container.expand(function () {
var self = Container.call(this);
self.blocks = [];
self.shape = [];
self.isDragging = false;
self.canPlace = false;
self.createShape = function (shapeData) {
self.shape = shapeData;
for (var i = 0; i < shapeData.length; i++) {
for (var j = 0; j < shapeData[i].length; j++) {
if (shapeData[i][j] === 1) {
var block = new BlockPiece();
block.x = j * 130;
block.y = i * 130;
block.setColor(pieceColors[Math.floor(Math.random() * pieceColors.length)]);
self.blocks.push(block);
self.addChild(block);
}
}
}
};
self.down = function (x, y, obj) {
if (!self.isDragging) {
self.isDragging = true;
draggedPiece = self;
self.originalX = self.x;
self.originalY = self.y;
self.alpha = 0.7;
}
};
return self;
});
var Particle = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('particle', {
anchorX: 0.5,
anchorY: 0.5
});
self.velocityX = 0;
self.velocityY = 0;
self.lifetime = 1000;
self.maxLifetime = 1000;
self.update = function () {
self.x += self.velocityX;
self.y += self.velocityY;
self.velocityY += 0.5; // gravity
self.lifetime -= 16.67; // 60fps
var alpha = self.lifetime / self.maxLifetime;
graphics.alpha = alpha;
if (self.lifetime <= 0) {
self.destroy();
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x0a0a0a
});
/****
* Game Code
****/
var GRID_SIZE = 8;
var CELL_SIZE = 130;
var GRID_OFFSET_X = 584;
var GRID_OFFSET_Y = 400;
var gameState = 'menu'; // 'menu', 'playing', or 'paused'
var highScore = storage.highScore || 0;
var unlockedLevels = storage.unlockedLevels || 1;
var currentChallengeLevel = 0;
var challengeGoal = 0;
var isChallengeMode = false;
var challengeTimer = 0;
var challengeTimeLimit = 0;
var challengeTimerText = null;
var level2ComboTarget = 2;
var level2MaxCombo = 0;
var playButton = null;
var playButtonText = null;
var arcadeButton = null;
var arcadeButtonText = null;
var challengeButton = null;
var challengeButtonText = null;
var levelSelectTitle = null;
var levelButtons = [];
var levelButtonTexts = [];
var backButton = null;
var backButtonText = null;
var menuTitle = null;
var highScoreText = null;
var pauseOverlay = null;
var pauseTitle = null;
var quitButton = null;
var quitButtonText = null;
var resumeButton = null;
var resumeButtonText = null;
var pauseButton = null;
var pauseButtonText = null;
var grid = [];
var gameGrid = [];
var pieceShapes = [[[1]],
// Single block
[[1, 1]],
// Line 2
[[1, 1, 1]],
// Line 3
[[1], [1]],
// Vertical 2
[[1], [1], [1]],
// Vertical 3
[[1, 1], [1, 1]],
// Square 2x2
[[1, 1, 1], [1, 0, 0]],
// L shape
[[1, 1, 1], [0, 0, 1]],
// Reverse L
[[1, 1, 0], [0, 1, 1]] // Z shape
];
var pieceColors = [0xff6b6b, 0x4ecdc4, 0x45b7d1, 0xf7dc6f, 0xbb8fce, 0x58d68d, 0xf39c12];
var currentPieces = [];
var draggedPiece = null;
var previewBlocks = [];
var particles = [];
var comboCounter = 0;
var lastClearTime = 0;
var comboMultiplier = 1;
var lastPlaceTime = 0;
var consecutivePlacements = 0;
var recentlyUsedShapes = []; // Track recently used shapes to avoid repetition
// Initialize grid
for (var i = 0; i < GRID_SIZE; i++) {
grid[i] = [];
gameGrid[i] = [];
for (var j = 0; j < GRID_SIZE; j++) {
var cell = LK.getAsset('gridCell', {
anchorX: 0.5,
anchorY: 0.5,
x: GRID_OFFSET_X + j * CELL_SIZE + CELL_SIZE / 2,
y: GRID_OFFSET_Y + i * CELL_SIZE + CELL_SIZE / 2
});
grid[i][j] = cell;
gameGrid[i][j] = null;
game.addChild(cell);
}
}
// Initialize UI
var scoreTxt = new Text2('0', {
size: 80,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
var comboTxt = new Text2('', {
size: 60,
fill: 0xFFFF00
});
comboTxt.anchor.set(1, 0);
LK.gui.topRight.addChild(comboTxt);
// Center screen combo text
var centerComboTxt = new Text2('', {
size: 120,
fill: 0xFFFF00
});
centerComboTxt.anchor.set(0.5, 0.5);
centerComboTxt.x = 1024;
centerComboTxt.y = 1366;
centerComboTxt.alpha = 0;
game.addChild(centerComboTxt);
// Piece panel
var piecePanel = LK.getAsset('piecePanel', {
anchorX: 0.5,
anchorY: 1,
x: 1024,
y: 2732
});
game.addChild(piecePanel);
function createPauseMenu() {
// Semi-transparent overlay
pauseOverlay = LK.getAsset('gridBackground', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 1366,
scaleX: 2,
scaleY: 2.5,
alpha: 0.8
});
game.addChild(pauseOverlay);
// Pause title
pauseTitle = new Text2('PAUSED', {
size: 100,
fill: 0xFFFFFF
});
pauseTitle.anchor.set(0.5, 0.5);
pauseTitle.x = 1024;
pauseTitle.y = 1200;
game.addChild(pauseTitle);
// Resume Button
resumeButton = LK.getAsset('piecePanel', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 1400,
scaleX: 0.4,
scaleY: 0.25
});
game.addChild(resumeButton);
resumeButtonText = new Text2('RESUME', {
size: 60,
fill: 0xFFFFFF
});
resumeButtonText.anchor.set(0.5, 0.5);
resumeButtonText.x = 1024;
resumeButtonText.y = 1400;
game.addChild(resumeButtonText);
// Quit Button
quitButton = LK.getAsset('piecePanel', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 1600,
scaleX: 0.4,
scaleY: 0.25
});
game.addChild(quitButton);
quitButtonText = new Text2('QUIT TO MENU', {
size: 50,
fill: 0xFFFFFF
});
quitButtonText.anchor.set(0.5, 0.5);
quitButtonText.x = 1024;
quitButtonText.y = 1600;
game.addChild(quitButtonText);
// Button handlers
resumeButton.down = function () {
resumeGame();
};
quitButton.down = function () {
quitToMenu();
};
}
function createMainMenu() {
// Title
menuTitle = new Text2('BLOCK PUZZLE', {
size: 120,
fill: 0xFFFFFF
});
menuTitle.anchor.set(0.5, 0.5);
menuTitle.x = 1024;
menuTitle.y = 800;
game.addChild(menuTitle);
// High Score
highScoreText = new Text2('High Score: ' + highScore, {
size: 60,
fill: 0xFFFF00
});
highScoreText.anchor.set(0.5, 0.5);
highScoreText.x = 1024;
highScoreText.y = 1000;
game.addChild(highScoreText);
// Arcade Button
arcadeButton = LK.getAsset('piecePanel', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 1300,
scaleX: 0.3,
scaleY: 0.3
});
game.addChild(arcadeButton);
arcadeButtonText = new Text2('ARCADE', {
size: 70,
fill: 0xFFFFFF
});
arcadeButtonText.anchor.set(0.5, 0.5);
arcadeButtonText.x = 1024;
arcadeButtonText.y = 1300;
game.addChild(arcadeButtonText);
arcadeButton.down = function () {
startGame();
};
// Challenge Button
challengeButton = LK.getAsset('piecePanel', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 1500,
scaleX: 0.3,
scaleY: 0.3
});
game.addChild(challengeButton);
challengeButtonText = new Text2('CHALLENGE', {
size: 60,
fill: 0xFFFFFF
});
challengeButtonText.anchor.set(0.5, 0.5);
challengeButtonText.x = 1024;
challengeButtonText.y = 1500;
game.addChild(challengeButtonText);
challengeButton.down = function () {
showLevelSelection();
};
}
function showLevelSelection() {
// Hide main menu elements
if (menuTitle) menuTitle.destroy();
if (highScoreText) highScoreText.destroy();
if (arcadeButton) arcadeButton.destroy();
if (arcadeButtonText) arcadeButtonText.destroy();
if (challengeButton) challengeButton.destroy();
if (challengeButtonText) challengeButtonText.destroy();
// Reset references to null
menuTitle = null;
highScoreText = null;
arcadeButton = null;
arcadeButtonText = null;
challengeButton = null;
challengeButtonText = null;
// Create level selection title
levelSelectTitle = new Text2('SELECT LEVEL', {
size: 100,
fill: 0xFFFFFF
});
levelSelectTitle.anchor.set(0.5, 0.5);
levelSelectTitle.x = 1024;
levelSelectTitle.y = 600;
game.addChild(levelSelectTitle);
// Create level buttons (2 rows of 5)
levelButtons = [];
levelButtonTexts = [];
for (var i = 1; i <= 10; i++) {
var row = Math.floor((i - 1) / 5);
var col = (i - 1) % 5;
var buttonX = 424 + col * 240;
var buttonY = 1000 + row * 200;
var isUnlocked = i <= unlockedLevels;
var levelButton = LK.getAsset('pauseButton', {
anchorX: 0.5,
anchorY: 0.5,
x: buttonX,
y: buttonY,
scaleX: 2,
scaleY: 2
});
levelButton.tint = isUnlocked ? 0xFFFFFF : 0x666666;
game.addChild(levelButton);
levelButtons.push(levelButton);
var levelText = new Text2(i.toString(), {
size: 60,
fill: isUnlocked ? 0xFFFFFF : 0x888888
});
levelText.anchor.set(0.5, 0.5);
levelText.x = buttonX;
levelText.y = buttonY;
game.addChild(levelText);
levelButtonTexts.push(levelText);
// Add click handler for each level
if (isUnlocked) {
levelButton.levelNumber = i;
levelButton.down = function () {
startChallengeLevel(this.levelNumber);
};
}
}
// Create back button
backButton = LK.getAsset('piecePanel', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 1600,
scaleX: 0.3,
scaleY: 0.3
});
game.addChild(backButton);
backButtonText = new Text2('BACK', {
size: 60,
fill: 0xFFFFFF
});
backButtonText.anchor.set(0.5, 0.5);
backButtonText.x = 1024;
backButtonText.y = 1600;
game.addChild(backButtonText);
backButton.down = function () {
returnToMainMenu();
};
}
function startChallengeLevel(levelNumber) {
// Clean up level selection elements
if (levelSelectTitle) levelSelectTitle.destroy();
if (backButton) backButton.destroy();
if (backButtonText) backButtonText.destroy();
for (var i = 0; i < levelButtons.length; i++) {
if (levelButtons[i]) levelButtons[i].destroy();
}
for (var i = 0; i < levelButtonTexts.length; i++) {
if (levelButtonTexts[i]) levelButtonTexts[i].destroy();
}
levelButtons = [];
levelButtonTexts = [];
// Set challenge mode variables
isChallengeMode = true;
currentChallengeLevel = levelNumber;
if (levelNumber === 1) {
challengeGoal = 1000; // Level 1 = 1000 points
challengeTimeLimit = 0; // No time limit for level 1
} else if (levelNumber === 2) {
challengeGoal = 0; // Level 2 is not about points
challengeTimeLimit = 45000; // 45 seconds in milliseconds
level2MaxCombo = 0; // Reset max combo for level 2
} else {
challengeGoal = levelNumber * 1000; // Other levels
challengeTimeLimit = 0;
}
challengeTimer = challengeTimeLimit; // Set initial timer
startGame();
}
function returnToMainMenu() {
// Hide level selection elements
if (levelSelectTitle) levelSelectTitle.destroy();
if (backButton) backButton.destroy();
if (backButtonText) backButtonText.destroy();
for (var i = 0; i < levelButtons.length; i++) {
if (levelButtons[i]) levelButtons[i].destroy();
}
for (var i = 0; i < levelButtonTexts.length; i++) {
if (levelButtonTexts[i]) levelButtonTexts[i].destroy();
}
levelButtons = [];
levelButtonTexts = [];
// Reset references to null
levelSelectTitle = null;
backButton = null;
backButtonText = null;
// Show main menu again
createMainMenu();
}
function startGame() {
gameState = 'playing';
// Reset challenge mode if starting from arcade button
if (!isChallengeMode) {
currentChallengeLevel = 0;
challengeGoal = 0;
}
// Hide menu elements
if (menuTitle) menuTitle.destroy();
if (highScoreText) highScoreText.destroy();
if (arcadeButton) arcadeButton.destroy();
if (arcadeButtonText) arcadeButtonText.destroy();
if (challengeButton) challengeButton.destroy();
if (challengeButtonText) challengeButtonText.destroy();
// Reset references to null
menuTitle = null;
highScoreText = null;
arcadeButton = null;
arcadeButtonText = null;
challengeButton = null;
challengeButtonText = null;
// Show game UI
scoreTxt.alpha = 1;
comboTxt.alpha = 1;
// Update score display for challenge mode
if (isChallengeMode) {
if (currentChallengeLevel === 2) {
scoreTxt.setText('Max Combo: 0 / ' + level2ComboTarget);
// Create timer text for Level 2
challengeTimerText = new Text2('Time: 45s', {
size: 60,
fill: 0xFF0000
});
challengeTimerText.anchor.set(0, 0);
LK.gui.topLeft.addChild(challengeTimerText);
challengeTimerText.x = 120; // Offset from top left corner
} else {
scoreTxt.setText('0 / ' + challengeGoal);
}
} else {
scoreTxt.setText('0');
}
// Show grid and piece panel
for (var i = 0; i < GRID_SIZE; i++) {
for (var j = 0; j < GRID_SIZE; j++) {
grid[i][j].alpha = 1;
}
}
piecePanel.alpha = 1;
// Reset game state
LK.setScore(0);
scoreTxt.setText('0');
comboCounter = 0;
comboTxt.setText('');
// Clear grid
for (var i = 0; i < GRID_SIZE; i++) {
for (var j = 0; j < GRID_SIZE; j++) {
if (gameGrid[i][j]) {
gameGrid[i][j].destroy();
gameGrid[i][j] = null;
}
}
}
createNewPieces();
// Create pause button
pauseButton = LK.getAsset('pauseButton', {
anchorX: 1,
anchorY: 0,
x: 1948,
y: 100
});
game.addChild(pauseButton);
pauseButtonText = new Text2('||', {
size: 40,
fill: 0xFFFFFF
});
pauseButtonText.anchor.set(0.5, 0.5);
pauseButtonText.x = 1948 - 40;
pauseButtonText.y = 140;
game.addChild(pauseButtonText);
pauseButton.down = function () {
if (gameState === 'playing') {
gameState = 'paused';
createPauseMenu();
}
};
}
function resumeGame() {
gameState = 'playing';
// Hide pause menu elements
if (pauseOverlay) pauseOverlay.destroy();
if (pauseTitle) pauseTitle.destroy();
if (resumeButton) resumeButton.destroy();
if (resumeButtonText) resumeButtonText.destroy();
if (quitButton) quitButton.destroy();
if (quitButtonText) quitButtonText.destroy();
}
function quitToMenu() {
gameState = 'menu';
// Hide pause menu elements
if (pauseOverlay) pauseOverlay.destroy();
if (pauseTitle) pauseTitle.destroy();
if (resumeButton) resumeButton.destroy();
if (resumeButtonText) resumeButtonText.destroy();
if (quitButton) quitButton.destroy();
if (quitButtonText) quitButtonText.destroy();
// Update high score if needed
var currentScore = LK.getScore();
if (currentScore > highScore) {
highScore = currentScore;
storage.highScore = highScore;
}
// Clear game elements
for (var i = 0; i < currentPieces.length; i++) {
currentPieces[i].destroy();
}
currentPieces = [];
// Clear grid
for (var i = 0; i < GRID_SIZE; i++) {
for (var j = 0; j < GRID_SIZE; j++) {
if (gameGrid[i][j]) {
gameGrid[i][j].destroy();
gameGrid[i][j] = null;
}
}
}
// Hide game UI
scoreTxt.alpha = 0;
comboTxt.alpha = 0;
centerComboTxt.alpha = 0;
// Hide grid and piece panel
for (var i = 0; i < GRID_SIZE; i++) {
for (var j = 0; j < GRID_SIZE; j++) {
grid[i][j].alpha = 0;
}
}
piecePanel.alpha = 0;
// Hide pause button
if (pauseButton) pauseButton.destroy();
if (pauseButtonText) pauseButtonText.destroy();
// Clean up timer text if it exists
if (challengeTimerText) {
challengeTimerText.destroy();
challengeTimerText = null;
}
// Reset challenge mode
isChallengeMode = false;
currentChallengeLevel = 0;
challengeGoal = 0;
challengeTimer = 0;
challengeTimeLimit = 0;
level2MaxCombo = 0;
createMainMenu();
}
function createNewPieces() {
// Clear existing pieces
for (var i = 0; i < currentPieces.length; i++) {
currentPieces[i].destroy();
}
currentPieces = [];
// Create 3 new pieces with reduced repetition
for (var i = 0; i < 3; i++) {
var piece = new GamePiece();
var shapeIndex;
var attempts = 0;
// Try to avoid recently used shapes
do {
shapeIndex = Math.floor(Math.random() * pieceShapes.length);
attempts++;
} while (recentlyUsedShapes.indexOf(shapeIndex) !== -1 && attempts < 10);
// Add to recently used shapes and keep only last 4
recentlyUsedShapes.push(shapeIndex);
if (recentlyUsedShapes.length > 4) {
recentlyUsedShapes.shift();
}
piece.createShape(pieceShapes[shapeIndex]);
piece.x = 350 + i * 500;
piece.y = 2550;
currentPieces.push(piece);
game.addChild(piece);
}
}
function getGridPosition(x, y) {
var gridX = Math.floor((x - GRID_OFFSET_X) / CELL_SIZE);
var gridY = Math.floor((y - GRID_OFFSET_Y) / CELL_SIZE);
return {
x: gridX,
y: gridY
};
}
function canPlacePiece(piece, gridX, gridY) {
for (var i = 0; i < piece.shape.length; i++) {
for (var j = 0; j < piece.shape[i].length; j++) {
if (piece.shape[i][j] === 1) {
var checkX = gridX + j;
var checkY = gridY + i;
if (checkX < 0 || checkX >= GRID_SIZE || checkY < 0 || checkY >= GRID_SIZE) {
return false;
}
if (gameGrid[checkY][checkX] !== null) {
return false;
}
}
}
}
return true;
}
function placePiece(piece, gridX, gridY) {
for (var i = 0; i < piece.shape.length; i++) {
for (var j = 0; j < piece.shape[i].length; j++) {
if (piece.shape[i][j] === 1) {
var placeX = gridX + j;
var placeY = gridY + i;
var block = new BlockPiece();
block.x = GRID_OFFSET_X + placeX * CELL_SIZE + CELL_SIZE / 2;
block.y = GRID_OFFSET_Y + placeY * CELL_SIZE + CELL_SIZE / 2;
block.setColor(piece.blocks[0].color);
block.gridX = placeX;
block.gridY = placeY;
gameGrid[placeY][placeX] = block;
game.addChild(block);
}
}
}
// Track consecutive placements for combo continuation
var currentTime = Date.now();
if (currentTime - lastPlaceTime < 3000) {
consecutivePlacements++;
} else {
consecutivePlacements = 1;
}
lastPlaceTime = currentTime;
LK.getSound('blockPlace').play();
}
function clearPreview() {
for (var i = 0; i < previewBlocks.length; i++) {
previewBlocks[i].destroy();
}
previewBlocks = [];
}
function showPreview(piece, gridX, gridY) {
clearPreview();
if (canPlacePiece(piece, gridX, gridY)) {
for (var i = 0; i < piece.shape.length; i++) {
for (var j = 0; j < piece.shape[i].length; j++) {
if (piece.shape[i][j] === 1) {
var previewX = gridX + j;
var previewY = gridY + i;
var preview = LK.getAsset('previewBlock', {
anchorX: 0.5,
anchorY: 0.5,
x: GRID_OFFSET_X + previewX * CELL_SIZE + CELL_SIZE / 2,
y: GRID_OFFSET_Y + previewY * CELL_SIZE + CELL_SIZE / 2,
alpha: 0.5
});
previewBlocks.push(preview);
game.addChild(preview);
}
}
}
}
}
function checkLines() {
var clearedBlocks = [];
var completedRows = 0;
var completedCols = 0;
// Check for complete rows
for (var i = 0; i < GRID_SIZE; i++) {
var rowComplete = true;
for (var j = 0; j < GRID_SIZE; j++) {
if (gameGrid[i][j] === null) {
rowComplete = false;
break;
}
}
if (rowComplete) {
completedRows++;
for (var j = 0; j < GRID_SIZE; j++) {
clearedBlocks.push({
x: j,
y: i
});
}
}
}
// Check for complete columns
for (var j = 0; j < GRID_SIZE; j++) {
var colComplete = true;
for (var i = 0; i < GRID_SIZE; i++) {
if (gameGrid[i][j] === null) {
colComplete = false;
break;
}
}
if (colComplete) {
completedCols++;
for (var i = 0; i < GRID_SIZE; i++) {
clearedBlocks.push({
x: j,
y: i
});
}
}
}
if (clearedBlocks.length > 0) {
clearBlocks(clearedBlocks, completedRows + completedCols);
return true;
}
return false;
}
function clearBlocks(blockPositions, lineCount) {
var currentTime = Date.now();
// Check if this clear is within 3 blocks of the last clear
var timeSinceLastClear = currentTime - lastClearTime;
if (timeSinceLastClear < 5000) {
// 5 seconds window for combo - continue from where we left off and add line count
comboCounter += lineCount || 1;
} else {
comboCounter = lineCount || 1;
}
lastClearTime = currentTime;
// Calculate multiplier based on combo
comboMultiplier = comboCounter;
var uniqueBlocks = [];
var seen = {};
for (var i = 0; i < blockPositions.length; i++) {
var pos = blockPositions[i];
var key = pos.x + "," + pos.y;
if (!seen[key] && gameGrid[pos.y][pos.x] !== null) {
seen[key] = true;
uniqueBlocks.push(pos);
}
}
// Change block appearance before exploding
var explodingAssets = ['explodingBlock1', 'explodingBlock2', 'explodingBlock3', 'explodingBlock4', 'explodingBlock5', 'explodingBlock6'];
var chosenAsset = explodingAssets[Math.floor(Math.random() * explodingAssets.length)];
for (var i = 0; i < uniqueBlocks.length; i++) {
var pos = uniqueBlocks[i];
var block = gameGrid[pos.y][pos.x];
if (block) {
block.setExplodingAsset(chosenAsset);
}
}
// Delay explosion effects slightly to show the new appearance
LK.setTimeout(function () {
for (var i = 0; i < uniqueBlocks.length; i++) {
var pos = uniqueBlocks[i];
var block = gameGrid[pos.y][pos.x];
if (block) {
createExplosion(block.x, block.y, block.color);
block.destroy();
gameGrid[pos.y][pos.x] = null;
}
}
}, 200);
// Screen effects
var flashColor = comboCounter > 3 ? 0xff0000 : 0xffffff;
var flashDuration = Math.min(comboCounter * 100 + 200, 800);
LK.effects.flashScreen(flashColor, flashDuration);
// Update score with combo multiplier
var basePoints = uniqueBlocks.length * 10;
var finalPoints = basePoints * comboMultiplier;
LK.setScore(LK.getScore() + Math.floor(finalPoints));
// Track max combo for Level 2
if (isChallengeMode && currentChallengeLevel === 2) {
if (comboCounter > level2MaxCombo) {
level2MaxCombo = comboCounter;
}
scoreTxt.setText('Max Combo: ' + level2MaxCombo + ' / ' + level2ComboTarget);
} else if (isChallengeMode) {
scoreTxt.setText(LK.getScore() + ' / ' + challengeGoal);
} else {
scoreTxt.setText(LK.getScore());
}
// Update combo display
if (comboCounter > 1) {
comboTxt.setText("COMBO x" + comboCounter);
// Show center screen combo animation
showCenterCombo(comboCounter);
// Animate combo text
tween(comboTxt, {
scaleX: 1.5,
scaleY: 1.5
}, {
duration: 200,
easing: tween.easeOut
});
tween(comboTxt, {
scaleX: 1,
scaleY: 1
}, {
duration: 300,
easing: tween.easeInOut
});
// Add color flash to combo text
tween(comboTxt, {
tint: 0xFFFF00
}, {
duration: 100,
onFinish: function onFinish() {
tween(comboTxt, {
tint: 0xFFFFFF
}, {
duration: 200
});
}
});
} else {
comboTxt.setText("");
// Show center screen combo for first clear too
showCenterCombo(comboCounter);
// Reset combo text color
comboTxt.tint = 0xFFFFFF;
}
// Play sound
if (comboCounter > 2) {
LK.getSound('comboClear').play();
} else {
LK.getSound('lineClear').play();
}
}
function showCenterCombo(combo) {
// Stop any existing combo animation
tween.stop(centerComboTxt);
// Set combo text
centerComboTxt.setText("COMBO x" + combo + "!");
centerComboTxt.scaleX = 0.5;
centerComboTxt.scaleY = 0.5;
centerComboTxt.alpha = 0;
// Animate in
tween(centerComboTxt, {
scaleX: 1.2,
scaleY: 1.2,
alpha: 1
}, {
duration: 300,
easing: tween.easeOut,
onFinish: function onFinish() {
// Hold for a moment then animate out
tween(centerComboTxt, {
scaleX: 0.8,
scaleY: 0.8,
alpha: 0
}, {
duration: 800,
easing: tween.easeIn
});
}
});
}
function createExplosion(x, y, color) {
var particleCount = Math.min(comboCounter * 2 + 5, 20);
for (var i = 0; i < particleCount; i++) {
var particle = new Particle();
particle.x = x;
particle.y = y;
particle.velocityX = (Math.random() - 0.5) * 10;
particle.velocityY = (Math.random() - 0.5) * 10 - 5;
particle.lifetime = 500 + Math.random() * 500;
particle.maxLifetime = particle.lifetime;
var particleGraphics = particle.children[0];
particleGraphics.tint = color;
particles.push(particle);
game.addChild(particle);
}
}
function checkGameOver() {
for (var i = 0; i < currentPieces.length; i++) {
var piece = currentPieces[i];
var canPlace = false;
for (var row = 0; row < GRID_SIZE; row++) {
for (var col = 0; col < GRID_SIZE; col++) {
if (canPlacePiece(piece, col, row)) {
canPlace = true;
break;
}
}
if (canPlace) break;
}
if (canPlace) return false;
}
return true;
}
game.move = function (x, y, obj) {
if (gameState === 'playing' && draggedPiece) {
draggedPiece.x = x;
draggedPiece.y = y;
var gridPos = getGridPosition(x, y);
showPreview(draggedPiece, gridPos.x, gridPos.y);
}
};
game.down = function (x, y, obj) {
// No longer trigger pause menu from empty space taps
};
game.up = function (x, y, obj) {
if (gameState === 'playing' && draggedPiece) {
var gridPos = getGridPosition(x, y);
if (canPlacePiece(draggedPiece, gridPos.x, gridPos.y)) {
placePiece(draggedPiece, gridPos.x, gridPos.y);
// Remove piece from current pieces
var index = currentPieces.indexOf(draggedPiece);
if (index > -1) {
currentPieces.splice(index, 1);
}
draggedPiece.destroy();
// Check for clears
checkLines();
// Create new pieces if all are used
if (currentPieces.length === 0) {
createNewPieces();
}
} else {
// Return piece to original position
tween(draggedPiece, {
x: draggedPiece.originalX,
y: draggedPiece.originalY,
alpha: 1
}, {
duration: 300
});
draggedPiece.isDragging = false;
}
clearPreview();
draggedPiece = null;
}
};
game.update = function () {
// Clean up particles
for (var i = particles.length - 1; i >= 0; i--) {
var particle = particles[i];
if (particle.lifetime <= 0) {
particles.splice(i, 1);
}
}
// Handle Level 2 timer countdown
if (gameState === 'playing' && isChallengeMode && currentChallengeLevel === 2 && challengeTimeLimit > 0) {
challengeTimer -= 16.67; // Subtract frame time (60fps)
var remainingSeconds = Math.ceil(challengeTimer / 1000);
if (challengeTimerText) {
challengeTimerText.setText('Time: ' + Math.max(0, remainingSeconds) + 's');
// Change color as time runs low
if (remainingSeconds <= 10) {
challengeTimerText.fill = 0xFF0000; // Red
} else if (remainingSeconds <= 20) {
challengeTimerText.fill = 0xFFFF00; // Yellow
}
}
// Check if time ran out
if (challengeTimer <= 0 && level2MaxCombo < level2ComboTarget) {
// Time's up and didn't achieve 2x combo - game over
if (challengeTimerText) {
challengeTimerText.destroy();
challengeTimerText = null;
}
// Update high score if needed
var currentScore = LK.getScore();
if (currentScore > highScore) {
highScore = currentScore;
storage.highScore = highScore;
}
// Clear game elements
for (var i = 0; i < currentPieces.length; i++) {
currentPieces[i].destroy();
}
currentPieces = [];
// Hide game UI
scoreTxt.alpha = 0;
comboTxt.alpha = 0;
centerComboTxt.alpha = 0;
// Hide grid and piece panel
for (var i = 0; i < GRID_SIZE; i++) {
for (var j = 0; j < GRID_SIZE; j++) {
grid[i][j].alpha = 0;
}
}
piecePanel.alpha = 0;
// Reset challenge mode
isChallengeMode = false;
currentChallengeLevel = 0;
challengeGoal = 0;
challengeTimer = 0;
challengeTimeLimit = 0;
level2MaxCombo = 0;
gameState = 'menu';
createMainMenu();
return;
}
}
// Check challenge completion
var challengeCompleted = false;
if (gameState === 'playing' && isChallengeMode) {
if (currentChallengeLevel === 1 && LK.getScore() >= challengeGoal) {
challengeCompleted = true;
} else if (currentChallengeLevel === 2 && level2MaxCombo >= level2ComboTarget) {
challengeCompleted = true;
} else if (currentChallengeLevel > 2 && LK.getScore() >= challengeGoal) {
challengeCompleted = true;
}
}
if (challengeCompleted) {
// Challenge completed!
if (challengeTimerText) {
challengeTimerText.destroy();
challengeTimerText = null;
}
if (currentChallengeLevel >= unlockedLevels && currentChallengeLevel < 10) {
unlockedLevels = currentChallengeLevel + 1;
storage.unlockedLevels = unlockedLevels;
}
// Update high score if needed
var currentScore = LK.getScore();
if (currentScore > highScore) {
highScore = currentScore;
storage.highScore = highScore;
}
// Clear game elements
for (var i = 0; i < currentPieces.length; i++) {
currentPieces[i].destroy();
}
currentPieces = [];
// Hide game UI
scoreTxt.alpha = 0;
comboTxt.alpha = 0;
centerComboTxt.alpha = 0;
// Hide grid and piece panel
for (var i = 0; i < GRID_SIZE; i++) {
for (var j = 0; j < GRID_SIZE; j++) {
grid[i][j].alpha = 0;
}
}
piecePanel.alpha = 0;
// Reset challenge mode
isChallengeMode = false;
currentChallengeLevel = 0;
challengeGoal = 0;
challengeTimer = 0;
challengeTimeLimit = 0;
level2MaxCombo = 0;
gameState = 'menu';
showCustomWinScreen();
return;
}
// Check game over
if (gameState === 'playing' && currentPieces.length > 0 && checkGameOver()) {
// Update high score if needed
var currentScore = LK.getScore();
if (currentScore > highScore) {
highScore = currentScore;
storage.highScore = highScore;
}
// Clear game elements
for (var i = 0; i < currentPieces.length; i++) {
currentPieces[i].destroy();
}
currentPieces = [];
// Hide game UI
scoreTxt.alpha = 0;
comboTxt.alpha = 0;
centerComboTxt.alpha = 0;
// Hide grid and piece panel
for (var i = 0; i < GRID_SIZE; i++) {
for (var j = 0; j < GRID_SIZE; j++) {
grid[i][j].alpha = 0;
}
}
piecePanel.alpha = 0;
gameState = 'menu';
createMainMenu();
}
};
// Initialize game
scoreTxt.alpha = 0;
comboTxt.alpha = 0;
// Hide grid initially
for (var i = 0; i < GRID_SIZE; i++) {
for (var j = 0; j < GRID_SIZE; j++) {
grid[i][j].alpha = 0;
}
}
piecePanel.alpha = 0;
createMainMenu();
LK.playMusic('bgmusic');
;
function showCustomWinScreen() {
// Store the completed level for button logic
var completedLevel = currentChallengeLevel;
var nextLevel = completedLevel + 1;
var hasNextLevel = nextLevel <= 10 && unlockedLevels >= nextLevel;
// Create win overlay
var winOverlay = LK.getAsset('gridBackground', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 1366,
scaleX: 2,
scaleY: 2.5,
alpha: 0.9
});
game.addChild(winOverlay);
// Win title
var winTitle = new Text2('YOU WIN!', {
size: 120,
fill: 0x00FF00
});
winTitle.anchor.set(0.5, 0.5);
winTitle.x = 1024;
winTitle.y = 1200;
game.addChild(winTitle);
// Next Level Button (show if there's a next level available)
var nextButton = null;
var nextButtonText = null;
if (hasNextLevel) {
nextButton = LK.getAsset('piecePanel', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 1400,
scaleX: 0.4,
scaleY: 0.25
});
game.addChild(nextButton);
nextButtonText = new Text2('LEVEL ' + nextLevel, {
size: 60,
fill: 0xFFFFFF
});
nextButtonText.anchor.set(0.5, 0.5);
nextButtonText.x = 1024;
nextButtonText.y = 1400;
game.addChild(nextButtonText);
nextButton.down = function () {
// Clean up win screen
winOverlay.destroy();
winTitle.destroy();
nextButton.destroy();
nextButtonText.destroy();
mainMenuButton.destroy();
mainMenuButtonText.destroy();
// Start next level
startChallengeLevel(nextLevel);
};
}
// Main Menu Button
var mainMenuButton = LK.getAsset('piecePanel', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: nextButton ? 1600 : 1400,
scaleX: 0.4,
scaleY: 0.25
});
game.addChild(mainMenuButton);
var mainMenuButtonText = new Text2('MAIN MENU', {
size: 60,
fill: 0xFFFFFF
});
mainMenuButtonText.anchor.set(0.5, 0.5);
mainMenuButtonText.x = 1024;
mainMenuButtonText.y = nextButton ? 1600 : 1400;
game.addChild(mainMenuButtonText);
mainMenuButton.down = function () {
// Clean up win screen
winOverlay.destroy();
winTitle.destroy();
if (nextButton) nextButton.destroy();
if (nextButtonText) nextButtonText.destroy();
mainMenuButton.destroy();
mainMenuButtonText.destroy();
// Return to main menu
createMainMenu();
};
} ===================================================================
--- original.js
+++ change.js
@@ -1152,8 +1152,12 @@
createMainMenu();
LK.playMusic('bgmusic');
;
function showCustomWinScreen() {
+ // Store the completed level for button logic
+ var completedLevel = currentChallengeLevel;
+ var nextLevel = completedLevel + 1;
+ var hasNextLevel = nextLevel <= 10 && unlockedLevels >= nextLevel;
// Create win overlay
var winOverlay = LK.getAsset('gridBackground', {
anchorX: 0.5,
anchorY: 0.5,
@@ -1172,47 +1176,47 @@
winTitle.anchor.set(0.5, 0.5);
winTitle.x = 1024;
winTitle.y = 1200;
game.addChild(winTitle);
- // Level 2 Button (only show if current level is 1 and level 2 is unlocked)
- var level2Button = null;
- var level2ButtonText = null;
- if (currentChallengeLevel === 1 && unlockedLevels >= 2) {
- level2Button = LK.getAsset('piecePanel', {
+ // Next Level Button (show if there's a next level available)
+ var nextButton = null;
+ var nextButtonText = null;
+ if (hasNextLevel) {
+ nextButton = LK.getAsset('piecePanel', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 1400,
scaleX: 0.4,
scaleY: 0.25
});
- game.addChild(level2Button);
- level2ButtonText = new Text2('LEVEL 2', {
+ game.addChild(nextButton);
+ nextButtonText = new Text2('LEVEL ' + nextLevel, {
size: 60,
fill: 0xFFFFFF
});
- level2ButtonText.anchor.set(0.5, 0.5);
- level2ButtonText.x = 1024;
- level2ButtonText.y = 1400;
- game.addChild(level2ButtonText);
- level2Button.down = function () {
+ nextButtonText.anchor.set(0.5, 0.5);
+ nextButtonText.x = 1024;
+ nextButtonText.y = 1400;
+ game.addChild(nextButtonText);
+ nextButton.down = function () {
// Clean up win screen
winOverlay.destroy();
winTitle.destroy();
- level2Button.destroy();
- level2ButtonText.destroy();
+ nextButton.destroy();
+ nextButtonText.destroy();
mainMenuButton.destroy();
mainMenuButtonText.destroy();
- // Start level 2
- startChallengeLevel(2);
+ // Start next level
+ startChallengeLevel(nextLevel);
};
}
// Main Menu Button
var mainMenuButton = LK.getAsset('piecePanel', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
- y: level2Button ? 1600 : 1400,
+ y: nextButton ? 1600 : 1400,
scaleX: 0.4,
scaleY: 0.25
});
game.addChild(mainMenuButton);
@@ -1221,16 +1225,16 @@
fill: 0xFFFFFF
});
mainMenuButtonText.anchor.set(0.5, 0.5);
mainMenuButtonText.x = 1024;
- mainMenuButtonText.y = level2Button ? 1600 : 1400;
+ mainMenuButtonText.y = nextButton ? 1600 : 1400;
game.addChild(mainMenuButtonText);
mainMenuButton.down = function () {
// Clean up win screen
winOverlay.destroy();
winTitle.destroy();
- if (level2Button) level2Button.destroy();
- if (level2ButtonText) level2ButtonText.destroy();
+ if (nextButton) nextButton.destroy();
+ if (nextButtonText) nextButtonText.destroy();
mainMenuButton.destroy();
mainMenuButtonText.destroy();
// Return to main menu
createMainMenu();