/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1"); /**** * Classes ****/ var Block = Container.expand(function (blockType) { var self = Container.call(this); var blockGraphics = self.attachAsset(blockType + 'Block', { anchorX: 0.5, anchorY: 0.5 }); self.blockType = blockType; self.gridX = -1; self.gridY = -1; self.isPlaced = false; self.isDragging = false; self.fallSpeed = 0; self.isStable = true; self.lastStable = true; self.setGridPosition = function (gridX, gridY) { self.gridX = gridX; self.gridY = gridY; self.x = GRID_START_X + gridX * GRID_SIZE + GRID_SIZE / 2; self.y = GRID_START_Y + gridY * GRID_SIZE + GRID_SIZE / 2; }; self.checkStability = function () { if (self.gridY >= GRID_HEIGHT - 1) { return true; // Ground level is stable } // Check if there's a block below for (var i = 0; i < placedBlocks.length; i++) { var otherBlock = placedBlocks[i]; if (otherBlock !== self && otherBlock.gridX === self.gridX && otherBlock.gridY === self.gridY + 1) { return true; } } return false; }; self.update = function () { if (!self.isPlaced || self.isDragging) return; self.lastStable = self.isStable; self.isStable = self.checkStability(); // If block becomes unstable, make it fall if (self.lastStable && !self.isStable) { self.fallSpeed = 2; } // Apply falling physics if (!self.isStable && self.fallSpeed > 0) { self.y += self.fallSpeed; self.fallSpeed += 0.5; // Gravity // Check if block has hit the ground or another block var targetY = GRID_START_Y + (GRID_HEIGHT - 1) * GRID_SIZE + GRID_SIZE / 2; if (self.y >= targetY) { self.y = targetY; self.gridY = GRID_HEIGHT - 1; self.fallSpeed = 0; self.isStable = true; LK.getSound('place').play(); updateScore(); } else { // Check collision with other blocks for (var i = 0; i < placedBlocks.length; i++) { var otherBlock = placedBlocks[i]; if (otherBlock !== self && Math.abs(otherBlock.x - self.x) < GRID_SIZE && Math.abs(otherBlock.y - self.y) < GRID_SIZE && self.y >= otherBlock.y - GRID_SIZE) { self.y = otherBlock.y - GRID_SIZE; self.gridY = otherBlock.gridY - 1; self.fallSpeed = 0; self.isStable = true; LK.getSound('place').play(); updateScore(); break; } } } } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x87CEEB }); /**** * Game Code ****/ // Game constants var GRID_SIZE = 120; var GRID_WIDTH = 16; var GRID_HEIGHT = 14; var GRID_START_X = 64; var GRID_START_Y = 300; var PALETTE_HEIGHT = 200; // Game variables var placedBlocks = []; var draggedBlock = null; var blockTypes = ['red', 'blue', 'green', 'yellow']; var paletteBlocks = []; // Create grid background var gridBg = game.attachAsset('gridBackground', { x: 0, y: 300, anchorX: 0, anchorY: 0 }); // Create palette background var paletteBg = game.attachAsset('paletteBackground', { x: 0, y: 2732 - PALETTE_HEIGHT, anchorX: 0, anchorY: 0 }); // Create palette blocks for (var i = 0; i < blockTypes.length; i++) { var paletteBlock = new Block(blockTypes[i]); paletteBlock.x = 200 + i * 300; paletteBlock.y = 2732 - PALETTE_HEIGHT / 2; paletteBlock.isPaletteBlock = true; paletteBlocks.push(paletteBlock); game.addChild(paletteBlock); } // Score display var scoreTxt = new Text2('Height: 0 | Blocks: 0', { size: 80, fill: 0xFFFFFF }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); // High score display var highScoreTxt = new Text2('Best: ' + (storage.highScore || 0), { size: 60, fill: 0xFFFF00 }); highScoreTxt.anchor.set(0.5, 0); highScoreTxt.y = 100; LK.gui.top.addChild(highScoreTxt); function updateScore() { var maxHeight = 0; var blockCount = placedBlocks.length; // Calculate maximum height for (var i = 0; i < placedBlocks.length; i++) { var block = placedBlocks[i]; if (block.isPlaced && block.isStable) { var height = GRID_HEIGHT - block.gridY; if (height > maxHeight) { maxHeight = height; } } } var currentScore = maxHeight * 10 + blockCount; LK.setScore(currentScore); scoreTxt.setText('Height: ' + maxHeight + ' | Blocks: ' + blockCount); // Update high score var highScore = storage.highScore || 0; if (currentScore > highScore) { storage.highScore = currentScore; highScoreTxt.setText('Best: ' + currentScore); } } function isValidPlacement(gridX, gridY) { if (gridX < 0 || gridX >= GRID_WIDTH || gridY < 0 || gridY >= GRID_HEIGHT) { return false; } // Check if position is occupied for (var i = 0; i < placedBlocks.length; i++) { var block = placedBlocks[i]; if (block.gridX === gridX && block.gridY === gridY) { return false; } } return true; } function getGridPosition(x, y) { var gridX = Math.floor((x - GRID_START_X) / GRID_SIZE); var gridY = Math.floor((y - GRID_START_Y) / GRID_SIZE); return { x: gridX, y: gridY }; } function checkForCollapses() { var collapsedAny = false; // Check all blocks for stability for (var i = placedBlocks.length - 1; i >= 0; i--) { var block = placedBlocks[i]; if (block.isPlaced && !block.checkStability() && block.isStable) { block.isStable = false; collapsedAny = true; } } if (collapsedAny) { LK.getSound('collapse').play(); } } game.down = function (x, y, obj) { // Check if clicking on palette block for (var i = 0; i < paletteBlocks.length; i++) { var paletteBlock = paletteBlocks[i]; if (Math.abs(x - paletteBlock.x) < GRID_SIZE / 2 && Math.abs(y - paletteBlock.y) < GRID_SIZE / 2) { // Create new block from palette draggedBlock = new Block(paletteBlock.blockType); draggedBlock.x = x; draggedBlock.y = y; draggedBlock.isDragging = true; game.addChild(draggedBlock); return; } } // Check if clicking on placed block for (var i = 0; i < placedBlocks.length; i++) { var block = placedBlocks[i]; if (Math.abs(x - block.x) < GRID_SIZE / 2 && Math.abs(y - block.y) < GRID_SIZE / 2) { draggedBlock = block; draggedBlock.isDragging = true; if (block.isPlaced) { // Remove from grid block.isPlaced = false; var index = placedBlocks.indexOf(block); placedBlocks.splice(index, 1); checkForCollapses(); } return; } } }; game.move = function (x, y, obj) { if (draggedBlock) { draggedBlock.x = x; draggedBlock.y = y; // Visual feedback for valid placement var gridPos = getGridPosition(x, y); if (y >= GRID_START_Y && y < GRID_START_Y + GRID_HEIGHT * GRID_SIZE) { if (isValidPlacement(gridPos.x, gridPos.y)) { draggedBlock.alpha = 1.0; } else { draggedBlock.alpha = 0.5; } } else { draggedBlock.alpha = 0.7; } } }; game.up = function (x, y, obj) { if (draggedBlock) { draggedBlock.isDragging = false; draggedBlock.alpha = 1.0; var gridPos = getGridPosition(x, y); // Check if dropping in valid grid position if (y >= GRID_START_Y && y < GRID_START_Y + GRID_HEIGHT * GRID_SIZE && isValidPlacement(gridPos.x, gridPos.y)) { draggedBlock.setGridPosition(gridPos.x, gridPos.y); draggedBlock.isPlaced = true; placedBlocks.push(draggedBlock); LK.getSound('place').play(); updateScore(); } else if (y < GRID_START_Y || y >= 2732 - PALETTE_HEIGHT) { // Dropped outside grid area - remove block if (!draggedBlock.isPaletteBlock) { draggedBlock.destroy(); } } else { // Invalid placement - snap back or remove if (draggedBlock.isPlaced) { // Was previously placed, return to grid draggedBlock.setGridPosition(draggedBlock.gridX, draggedBlock.gridY); placedBlocks.push(draggedBlock); } else { // New block dropped in invalid location draggedBlock.destroy(); } } draggedBlock = null; } }; game.update = function () { // Update all placed blocks for (var i = 0; i < placedBlocks.length; i++) { placedBlocks[i].update(); } // Clean up blocks that have fallen off screen for (var i = placedBlocks.length - 1; i >= 0; i--) { var block = placedBlocks[i]; if (block.y > 2732 + 200) { block.destroy(); placedBlocks.splice(i, 1); updateScore(); } } };
===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,295 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+var storage = LK.import("@upit/storage.v1");
+
+/****
+* Classes
+****/
+var Block = Container.expand(function (blockType) {
+ var self = Container.call(this);
+ var blockGraphics = self.attachAsset(blockType + 'Block', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.blockType = blockType;
+ self.gridX = -1;
+ self.gridY = -1;
+ self.isPlaced = false;
+ self.isDragging = false;
+ self.fallSpeed = 0;
+ self.isStable = true;
+ self.lastStable = true;
+ self.setGridPosition = function (gridX, gridY) {
+ self.gridX = gridX;
+ self.gridY = gridY;
+ self.x = GRID_START_X + gridX * GRID_SIZE + GRID_SIZE / 2;
+ self.y = GRID_START_Y + gridY * GRID_SIZE + GRID_SIZE / 2;
+ };
+ self.checkStability = function () {
+ if (self.gridY >= GRID_HEIGHT - 1) {
+ return true; // Ground level is stable
+ }
+ // Check if there's a block below
+ for (var i = 0; i < placedBlocks.length; i++) {
+ var otherBlock = placedBlocks[i];
+ if (otherBlock !== self && otherBlock.gridX === self.gridX && otherBlock.gridY === self.gridY + 1) {
+ return true;
+ }
+ }
+ return false;
+ };
+ self.update = function () {
+ if (!self.isPlaced || self.isDragging) return;
+ self.lastStable = self.isStable;
+ self.isStable = self.checkStability();
+ // If block becomes unstable, make it fall
+ if (self.lastStable && !self.isStable) {
+ self.fallSpeed = 2;
+ }
+ // Apply falling physics
+ if (!self.isStable && self.fallSpeed > 0) {
+ self.y += self.fallSpeed;
+ self.fallSpeed += 0.5; // Gravity
+ // Check if block has hit the ground or another block
+ var targetY = GRID_START_Y + (GRID_HEIGHT - 1) * GRID_SIZE + GRID_SIZE / 2;
+ if (self.y >= targetY) {
+ self.y = targetY;
+ self.gridY = GRID_HEIGHT - 1;
+ self.fallSpeed = 0;
+ self.isStable = true;
+ LK.getSound('place').play();
+ updateScore();
+ } else {
+ // Check collision with other blocks
+ for (var i = 0; i < placedBlocks.length; i++) {
+ var otherBlock = placedBlocks[i];
+ if (otherBlock !== self && Math.abs(otherBlock.x - self.x) < GRID_SIZE && Math.abs(otherBlock.y - self.y) < GRID_SIZE && self.y >= otherBlock.y - GRID_SIZE) {
+ self.y = otherBlock.y - GRID_SIZE;
+ self.gridY = otherBlock.gridY - 1;
+ self.fallSpeed = 0;
+ self.isStable = true;
+ LK.getSound('place').play();
+ updateScore();
+ break;
+ }
+ }
+ }
+ }
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x87CEEB
+});
+
+/****
+* Game Code
+****/
+// Game constants
+var GRID_SIZE = 120;
+var GRID_WIDTH = 16;
+var GRID_HEIGHT = 14;
+var GRID_START_X = 64;
+var GRID_START_Y = 300;
+var PALETTE_HEIGHT = 200;
+// Game variables
+var placedBlocks = [];
+var draggedBlock = null;
+var blockTypes = ['red', 'blue', 'green', 'yellow'];
+var paletteBlocks = [];
+// Create grid background
+var gridBg = game.attachAsset('gridBackground', {
+ x: 0,
+ y: 300,
+ anchorX: 0,
+ anchorY: 0
+});
+// Create palette background
+var paletteBg = game.attachAsset('paletteBackground', {
+ x: 0,
+ y: 2732 - PALETTE_HEIGHT,
+ anchorX: 0,
+ anchorY: 0
+});
+// Create palette blocks
+for (var i = 0; i < blockTypes.length; i++) {
+ var paletteBlock = new Block(blockTypes[i]);
+ paletteBlock.x = 200 + i * 300;
+ paletteBlock.y = 2732 - PALETTE_HEIGHT / 2;
+ paletteBlock.isPaletteBlock = true;
+ paletteBlocks.push(paletteBlock);
+ game.addChild(paletteBlock);
+}
+// Score display
+var scoreTxt = new Text2('Height: 0 | Blocks: 0', {
+ size: 80,
+ fill: 0xFFFFFF
+});
+scoreTxt.anchor.set(0.5, 0);
+LK.gui.top.addChild(scoreTxt);
+// High score display
+var highScoreTxt = new Text2('Best: ' + (storage.highScore || 0), {
+ size: 60,
+ fill: 0xFFFF00
+});
+highScoreTxt.anchor.set(0.5, 0);
+highScoreTxt.y = 100;
+LK.gui.top.addChild(highScoreTxt);
+function updateScore() {
+ var maxHeight = 0;
+ var blockCount = placedBlocks.length;
+ // Calculate maximum height
+ for (var i = 0; i < placedBlocks.length; i++) {
+ var block = placedBlocks[i];
+ if (block.isPlaced && block.isStable) {
+ var height = GRID_HEIGHT - block.gridY;
+ if (height > maxHeight) {
+ maxHeight = height;
+ }
+ }
+ }
+ var currentScore = maxHeight * 10 + blockCount;
+ LK.setScore(currentScore);
+ scoreTxt.setText('Height: ' + maxHeight + ' | Blocks: ' + blockCount);
+ // Update high score
+ var highScore = storage.highScore || 0;
+ if (currentScore > highScore) {
+ storage.highScore = currentScore;
+ highScoreTxt.setText('Best: ' + currentScore);
+ }
+}
+function isValidPlacement(gridX, gridY) {
+ if (gridX < 0 || gridX >= GRID_WIDTH || gridY < 0 || gridY >= GRID_HEIGHT) {
+ return false;
+ }
+ // Check if position is occupied
+ for (var i = 0; i < placedBlocks.length; i++) {
+ var block = placedBlocks[i];
+ if (block.gridX === gridX && block.gridY === gridY) {
+ return false;
+ }
+ }
+ return true;
+}
+function getGridPosition(x, y) {
+ var gridX = Math.floor((x - GRID_START_X) / GRID_SIZE);
+ var gridY = Math.floor((y - GRID_START_Y) / GRID_SIZE);
+ return {
+ x: gridX,
+ y: gridY
+ };
+}
+function checkForCollapses() {
+ var collapsedAny = false;
+ // Check all blocks for stability
+ for (var i = placedBlocks.length - 1; i >= 0; i--) {
+ var block = placedBlocks[i];
+ if (block.isPlaced && !block.checkStability() && block.isStable) {
+ block.isStable = false;
+ collapsedAny = true;
+ }
+ }
+ if (collapsedAny) {
+ LK.getSound('collapse').play();
+ }
+}
+game.down = function (x, y, obj) {
+ // Check if clicking on palette block
+ for (var i = 0; i < paletteBlocks.length; i++) {
+ var paletteBlock = paletteBlocks[i];
+ if (Math.abs(x - paletteBlock.x) < GRID_SIZE / 2 && Math.abs(y - paletteBlock.y) < GRID_SIZE / 2) {
+ // Create new block from palette
+ draggedBlock = new Block(paletteBlock.blockType);
+ draggedBlock.x = x;
+ draggedBlock.y = y;
+ draggedBlock.isDragging = true;
+ game.addChild(draggedBlock);
+ return;
+ }
+ }
+ // Check if clicking on placed block
+ for (var i = 0; i < placedBlocks.length; i++) {
+ var block = placedBlocks[i];
+ if (Math.abs(x - block.x) < GRID_SIZE / 2 && Math.abs(y - block.y) < GRID_SIZE / 2) {
+ draggedBlock = block;
+ draggedBlock.isDragging = true;
+ if (block.isPlaced) {
+ // Remove from grid
+ block.isPlaced = false;
+ var index = placedBlocks.indexOf(block);
+ placedBlocks.splice(index, 1);
+ checkForCollapses();
+ }
+ return;
+ }
+ }
+};
+game.move = function (x, y, obj) {
+ if (draggedBlock) {
+ draggedBlock.x = x;
+ draggedBlock.y = y;
+ // Visual feedback for valid placement
+ var gridPos = getGridPosition(x, y);
+ if (y >= GRID_START_Y && y < GRID_START_Y + GRID_HEIGHT * GRID_SIZE) {
+ if (isValidPlacement(gridPos.x, gridPos.y)) {
+ draggedBlock.alpha = 1.0;
+ } else {
+ draggedBlock.alpha = 0.5;
+ }
+ } else {
+ draggedBlock.alpha = 0.7;
+ }
+ }
+};
+game.up = function (x, y, obj) {
+ if (draggedBlock) {
+ draggedBlock.isDragging = false;
+ draggedBlock.alpha = 1.0;
+ var gridPos = getGridPosition(x, y);
+ // Check if dropping in valid grid position
+ if (y >= GRID_START_Y && y < GRID_START_Y + GRID_HEIGHT * GRID_SIZE && isValidPlacement(gridPos.x, gridPos.y)) {
+ draggedBlock.setGridPosition(gridPos.x, gridPos.y);
+ draggedBlock.isPlaced = true;
+ placedBlocks.push(draggedBlock);
+ LK.getSound('place').play();
+ updateScore();
+ } else if (y < GRID_START_Y || y >= 2732 - PALETTE_HEIGHT) {
+ // Dropped outside grid area - remove block
+ if (!draggedBlock.isPaletteBlock) {
+ draggedBlock.destroy();
+ }
+ } else {
+ // Invalid placement - snap back or remove
+ if (draggedBlock.isPlaced) {
+ // Was previously placed, return to grid
+ draggedBlock.setGridPosition(draggedBlock.gridX, draggedBlock.gridY);
+ placedBlocks.push(draggedBlock);
+ } else {
+ // New block dropped in invalid location
+ draggedBlock.destroy();
+ }
+ }
+ draggedBlock = null;
+ }
+};
+game.update = function () {
+ // Update all placed blocks
+ for (var i = 0; i < placedBlocks.length; i++) {
+ placedBlocks[i].update();
+ }
+ // Clean up blocks that have fallen off screen
+ for (var i = placedBlocks.length - 1; i >= 0; i--) {
+ var block = placedBlocks[i];
+ if (block.y > 2732 + 200) {
+ block.destroy();
+ placedBlocks.splice(i, 1);
+ updateScore();
+ }
+ }
+};
\ No newline at end of file