User prompt
başarım yeri en üste gelsin ve bütün başarımları içine alsın
User prompt
başarımlar şeyi yukarıya gelsin ve ön katmana gelsin
User prompt
yeni başarımlar ekle ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
haraket şeyleri dünyaya deymesin ve aşağıda olsun
User prompt
haraket şeyini ortaya getir
User prompt
uçma modunda blokların içinden geçme hatasını düzelt
User prompt
uçma modundaki hataları düzelt
User prompt
oyuna her zaman en tepeden başlasın
User prompt
oyuna elmas ve altın bloğu ekle
User prompt
dünyalar saçma saçma oluşmasın
User prompt
oyuna kum ekle ve kum yerçekiminden etkilensin
User prompt
oyuna uçma özelliği ekle
User prompt
karaktere yerçekimi ekle
User prompt
butonları ve yazıları büyüt
User prompt
kazandığmız başarımları görmek için bi menü yap ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
Please fix the bug: 'Error: Invalid value. Only literals or 1-level deep objects/arrays containing literals are allowed.' in or related to this line: 'storage.achievements = achievements;' Line Number: 524 ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
oyuna başarımlar ekle ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
blok kırma sadece seçilen bloğu kırsın
User prompt
blok kırmaya efekt ekle ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
blok menüsü bütün eşyaları içine alsın
User prompt
etrafındaki blokları kırsın
User prompt
blokları kırma ekle
User prompt
bloklar havada uçmasın
User prompt
dünyalar daha farklı ve güzel olsun
User prompt
her seferinde farklı bir dünya oluştur
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ var Block = Container.expand(function (blockType) { var self = Container.call(this); self.blockType = blockType; self.gridX = 0; self.gridY = 0; var blockGraphics = self.attachAsset(blockType, { anchorX: 0.5, anchorY: 0.5 }); // Add a subtle border effect blockGraphics.alpha = 0.9; self.setGridPosition = function (gridX, gridY) { self.gridX = gridX; self.gridY = gridY; self.x = gridX * GRID_SIZE + GRID_SIZE / 2 + GRID_OFFSET_X; self.y = gridY * GRID_SIZE + GRID_SIZE / 2 + GRID_OFFSET_Y; }; return self; }); var BlockSelectionMenu = Container.expand(function () { var self = Container.call(this); self.isVisible = false; // Background var bgGraphics = self.attachAsset('menuBg', { anchorX: 0.5, anchorY: 0.5, alpha: 0.9 }); // Title text var titleText = new Text2('Select Block Type', { size: 32, fill: 0xFFFFFF }); titleText.anchor.set(0.5, 0.5); titleText.x = 0; titleText.y = -200; self.addChild(titleText); // Close button var closeButton = self.attachAsset('closeButton', { anchorX: 0.5, anchorY: 0.5 }); closeButton.x = 280; closeButton.y = -200; // Block selection buttons self.menuButtons = []; var buttonsPerRow = 2; var buttonSpacing = 180; for (var i = 0; i < blockTypes.length; i++) { var button = new Container(); // Button background var buttonBg = button.attachAsset('menuButton', { anchorX: 0.5, anchorY: 0.5, alpha: 0.8 }); // Block preview var blockPreview = button.attachAsset(blockTypes[i], { anchorX: 0.5, anchorY: 0.5, scaleX: 0.9, scaleY: 0.9 }); // Block name text var nameText = new Text2(blockTypes[i], { size: 20, fill: 0xFFFFFF }); nameText.anchor.set(0.5, 0); nameText.x = 0; nameText.y = 45; button.addChild(nameText); // Position button var col = i % buttonsPerRow; var row = Math.floor(i / buttonsPerRow); button.x = (col - 0.5) * buttonSpacing; button.y = row * buttonSpacing - 50; // Store button data button.blockType = blockTypes[i]; button.bgGraphics = buttonBg; // Button interaction button.down = function (x, y, obj) { this.bgGraphics.alpha = 1.0; selectedBlockType = this.blockType; updateToolbarSelection(); self.hide(); }; button.up = function (x, y, obj) { this.bgGraphics.alpha = 0.8; }; self.menuButtons.push(button); self.addChild(button); } // Close button interaction closeButton.down = function (x, y, obj) { closeButton.alpha = 0.7; self.hide(); }; closeButton.up = function (x, y, obj) { closeButton.alpha = 1.0; }; self.show = function () { self.isVisible = true; self.alpha = 0; self.visible = true; tween(self, { alpha: 1 }, { duration: 200 }); }; self.hide = function () { self.isVisible = false; tween(self, { alpha: 0 }, { duration: 200, onFinish: function onFinish() { self.visible = false; } }); }; // Initially hidden self.visible = false; return self; }); var Character = Container.expand(function () { var self = Container.call(this); var characterGraphics = self.attachAsset('character', { anchorX: 0.5, anchorY: 0.5 }); self.gridX = 0; self.gridY = 0; self.targetX = 0; self.targetY = 0; self.isMoving = false; self.setGridPosition = function (gridX, gridY) { self.gridX = gridX; self.gridY = gridY; self.targetX = gridX * GRID_SIZE + GRID_SIZE / 2 + GRID_OFFSET_X; self.targetY = gridY * GRID_SIZE + GRID_SIZE / 2 + GRID_OFFSET_Y; if (!self.isMoving) { self.x = self.targetX; self.y = self.targetY; } }; self.moveToGrid = function (gridX, gridY) { if (self.isMoving) return false; if (!isValidGridPosition(gridX, gridY)) return false; // Check if there's a block at the target position if (grid[gridX][gridY] !== null) return false; self.isMoving = true; self.gridX = gridX; self.gridY = gridY; self.targetX = gridX * GRID_SIZE + GRID_SIZE / 2 + GRID_OFFSET_X; self.targetY = gridY * GRID_SIZE + GRID_SIZE / 2 + GRID_OFFSET_Y; tween(self, { x: self.targetX, y: self.targetY }, { duration: 200, onFinish: function onFinish() { self.isMoving = false; } }); return true; }; self.update = function () { // Character is always on top if (self.parent) { var parent = self.parent; parent.removeChild(self); parent.addChild(self); } }; return self; }); var ControlButton = Container.expand(function (direction) { var self = Container.call(this); self.direction = direction; var bgGraphics = self.attachAsset('controlBg', { anchorX: 0.5, anchorY: 0.5, alpha: 0.7 }); var arrowGraphics = self.attachAsset('arrow' + direction.charAt(0).toUpperCase() + direction.slice(1), { anchorX: 0.5, anchorY: 0.5, scaleX: 0.7, scaleY: 0.7 }); self.down = function (x, y, obj) { bgGraphics.alpha = 1.0; var newX = character.gridX; var newY = character.gridY; if (direction === 'up') newY--;else if (direction === 'down') newY++;else if (direction === 'left') newX--;else if (direction === 'right') newX++; character.moveToGrid(newX, newY); }; self.up = function (x, y, obj) { bgGraphics.alpha = 0.7; }; return self; }); var GridCell = Container.expand(function () { var self = Container.call(this); var cellGraphics = self.attachAsset('gridCell', { anchorX: 0.5, anchorY: 0.5, alpha: 0.1 }); self.gridX = 0; self.gridY = 0; self.isEmpty = true; self.setGridPosition = function (gridX, gridY) { self.gridX = gridX; self.gridY = gridY; self.x = gridX * GRID_SIZE + GRID_SIZE / 2 + GRID_OFFSET_X; self.y = gridY * GRID_SIZE + GRID_SIZE / 2 + GRID_OFFSET_Y; }; self.highlight = function () { cellGraphics.alpha = 0.3; }; self.unhighlight = function () { cellGraphics.alpha = 0.1; }; return self; }); var ToolbarButton = Container.expand(function (blockType) { var self = Container.call(this); self.blockType = blockType; self.isSelected = false; var bgGraphics = self.attachAsset('toolbarBg', { anchorX: 0.5, anchorY: 0.5, alpha: 0.8 }); var blockGraphics = self.attachAsset(blockType, { anchorX: 0.5, anchorY: 0.5, scaleX: 0.8, scaleY: 0.8 }); var selectedBorder = self.attachAsset('selectedBorder', { anchorX: 0.5, anchorY: 0.5, alpha: 0 }); self.setSelected = function (selected) { self.isSelected = selected; selectedBorder.alpha = selected ? 0.8 : 0; bgGraphics.alpha = selected ? 1.0 : 0.8; }; self.down = function (x, y, obj) { selectedBlockType = self.blockType; updateToolbarSelection(); }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x87CEEB }); /**** * Game Code ****/ var GRID_SIZE = 80; var GRID_WIDTH = 20; var GRID_HEIGHT = 20; var GRID_OFFSET_X = (2048 - GRID_WIDTH * GRID_SIZE) / 2; var GRID_OFFSET_Y = 200; var selectedBlockType = 'dirt'; var blockTypes = ['dirt', 'stone', 'wood', 'grass']; var inventory = { dirt: 50, stone: 30, wood: 25, grass: 20 }; var grid = []; var placedBlocks = []; var toolbarButtons = []; var controlButtons = []; var pressTimer = null; var isLongPress = false; var pressStartTime = 0; var character = null; var blockSelectionMenu = null; var menuButton = null; // Initialize grid for (var x = 0; x < GRID_WIDTH; x++) { grid[x] = []; for (var y = 0; y < GRID_HEIGHT; y++) { grid[x][y] = null; var gridCell = new GridCell(); gridCell.setGridPosition(x, y); game.addChild(gridCell); } } // Initialize character at random position character = new Character(); var randomX = Math.floor(Math.random() * GRID_WIDTH); var randomY = Math.floor(Math.random() * GRID_HEIGHT); character.setGridPosition(randomX, randomY); game.addChild(character); // Create block selection menu blockSelectionMenu = new BlockSelectionMenu(); blockSelectionMenu.x = 1024; blockSelectionMenu.y = 1366; LK.gui.addChild(blockSelectionMenu); // Create menu button menuButton = new Container(); var menuBg = menuButton.attachAsset('toolbarBg', { anchorX: 0.5, anchorY: 0.5, alpha: 0.8 }); var menuText = new Text2('MENU', { size: 24, fill: 0xFFFFFF }); menuText.anchor.set(0.5, 0.5); menuText.x = 0; menuText.y = 0; menuButton.addChild(menuText); menuButton.x = 2048 - 80; menuButton.y = 150; menuButton.down = function (x, y, obj) { menuBg.alpha = 1.0; if (!blockSelectionMenu.isVisible) { blockSelectionMenu.show(); } }; menuButton.up = function (x, y, obj) { menuBg.alpha = 0.8; }; game.addChild(menuButton); // Create toolbar var toolbarY = 2732 - 120; var toolbarStartX = (2048 - blockTypes.length * 120) / 2; for (var i = 0; i < blockTypes.length; i++) { var button = new ToolbarButton(blockTypes[i]); button.x = toolbarStartX + i * 120 + 60; button.y = toolbarY; toolbarButtons.push(button); LK.gui.addChild(button); } // Create inventory display var inventoryTexts = {}; for (var i = 0; i < blockTypes.length; i++) { var blockType = blockTypes[i]; var inventoryText = new Text2(inventory[blockType].toString(), { size: 24, fill: 0xFFFFFF }); inventoryText.anchor.set(0.5, 0); inventoryText.x = toolbarStartX + i * 120 + 60; inventoryText.y = toolbarY + 60; inventoryTexts[blockType] = inventoryText; LK.gui.addChild(inventoryText); } // Create control buttons var controlButtonSize = 100; var controlPadding = 20; var controlCenterX = 150; var controlCenterY = GRID_OFFSET_Y + GRID_HEIGHT * GRID_SIZE + 150; var directions = [{ dir: 'up', x: 0, y: -1 }, { dir: 'down', x: 0, y: 1 }, { dir: 'left', x: -1, y: 0 }, { dir: 'right', x: 1, y: 0 }]; for (var i = 0; i < directions.length; i++) { var dirInfo = directions[i]; var button = new ControlButton(dirInfo.dir); button.x = controlCenterX + dirInfo.x * (controlButtonSize + controlPadding); button.y = controlCenterY + dirInfo.y * (controlButtonSize + controlPadding); controlButtons.push(button); game.addChild(button); } function updateToolbarSelection() { for (var i = 0; i < toolbarButtons.length; i++) { toolbarButtons[i].setSelected(toolbarButtons[i].blockType === selectedBlockType); } } function updateInventoryDisplay() { for (var blockType in inventoryTexts) { inventoryTexts[blockType].setText(inventory[blockType].toString()); } } function getGridPosition(worldX, worldY) { var gridX = Math.floor((worldX - GRID_OFFSET_X) / GRID_SIZE); var gridY = Math.floor((worldY - GRID_OFFSET_Y) / GRID_SIZE); return { x: gridX, y: gridY }; } function isValidGridPosition(gridX, gridY) { return gridX >= 0 && gridX < GRID_WIDTH && gridY >= 0 && gridY < GRID_HEIGHT; } function placeBlock(gridX, gridY) { if (!isValidGridPosition(gridX, gridY)) return false; if (grid[gridX][gridY] !== null) return false; if (inventory[selectedBlockType] <= 0) return false; // Don't place block on character position if (character && gridX === character.gridX && gridY === character.gridY) return false; var block = new Block(selectedBlockType); block.setGridPosition(gridX, gridY); game.addChild(block); grid[gridX][gridY] = block; placedBlocks.push(block); inventory[selectedBlockType]--; updateInventoryDisplay(); LK.getSound('place').play(); return true; } function removeBlock(gridX, gridY) { if (!isValidGridPosition(gridX, gridY)) return false; if (grid[gridX][gridY] === null) return false; var block = grid[gridX][gridY]; var blockType = block.blockType; // Add breaking animation with flash effect LK.effects.flashObject(block, 0xFFFFFF, 200); // Remove from placedBlocks array for (var i = placedBlocks.length - 1; i >= 0; i--) { if (placedBlocks[i] === block) { placedBlocks.splice(i, 1); break; } } // Animate block destruction with scaling tween(block, { scaleX: 0, scaleY: 0, alpha: 0 }, { duration: 150, onFinish: function onFinish() { block.destroy(); } }); grid[gridX][gridY] = null; inventory[blockType]++; updateInventoryDisplay(); LK.getSound('break').play(); return true; } // Initialize toolbar selection updateToolbarSelection(); updateInventoryDisplay(); game.down = function (x, y, obj) { var gridPos = getGridPosition(x, y); // Place block immediately on click if (isValidGridPosition(gridPos.x, gridPos.y)) { placeBlock(gridPos.x, gridPos.y); } }; // Generate procedural world function generateWorld() { // Reset selected block type to dirt for generation selectedBlockType = 'dirt'; updateToolbarSelection(); // Generate terrain layers for (var x = 0; x < GRID_WIDTH; x++) { // Create height variation using simple noise var baseHeight = Math.floor(GRID_HEIGHT * 0.7) + Math.floor(Math.random() * 4) - 2; // Place grass on surface if (baseHeight >= 0 && baseHeight < GRID_HEIGHT) { selectedBlockType = 'grass'; placeBlock(x, baseHeight); } // Place dirt layers below grass selectedBlockType = 'dirt'; for (var y = baseHeight + 1; y < Math.min(baseHeight + 3, GRID_HEIGHT); y++) { if (Math.random() < 0.8) { // 80% chance for dirt placeBlock(x, y); } } // Place stone in deeper layers selectedBlockType = 'stone'; for (var y = baseHeight + 3; y < GRID_HEIGHT; y++) { if (Math.random() < 0.6) { // 60% chance for stone placeBlock(x, y); } } // Add random wood structures (trees) if (Math.random() < 0.15 && baseHeight > 2) { // 15% chance for trees selectedBlockType = 'wood'; var treeHeight = Math.floor(Math.random() * 3) + 2; for (var i = 0; i < treeHeight; i++) { var treeY = baseHeight - i - 1; if (treeY >= 0) { placeBlock(x, treeY); } } } // Add random surface features if (Math.random() < 0.1 && baseHeight > 0) { // 10% chance for surface stones selectedBlockType = 'stone'; placeBlock(x, baseHeight - 1); } } // Add scattered resources for (var i = 0; i < 20; i++) { var randX = Math.floor(Math.random() * GRID_WIDTH); var randY = Math.floor(Math.random() * GRID_HEIGHT); if (grid[randX][randY] === null) { var resourceType = blockTypes[Math.floor(Math.random() * blockTypes.length)]; selectedBlockType = resourceType; placeBlock(randX, randY); } } // Reset to dirt selection selectedBlockType = 'dirt'; updateToolbarSelection(); } // Generate the world after a short delay LK.setTimeout(function () { generateWorld(); }, 500); game.update = function () { // Replenish inventory slowly over time if (LK.ticks % 600 === 0) { // Every 10 seconds for (var blockType in inventory) { if (inventory[blockType] < 50) { inventory[blockType]++; } } updateInventoryDisplay(); } };
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Block = Container.expand(function (blockType) {
var self = Container.call(this);
self.blockType = blockType;
self.gridX = 0;
self.gridY = 0;
var blockGraphics = self.attachAsset(blockType, {
anchorX: 0.5,
anchorY: 0.5
});
// Add a subtle border effect
blockGraphics.alpha = 0.9;
self.setGridPosition = function (gridX, gridY) {
self.gridX = gridX;
self.gridY = gridY;
self.x = gridX * GRID_SIZE + GRID_SIZE / 2 + GRID_OFFSET_X;
self.y = gridY * GRID_SIZE + GRID_SIZE / 2 + GRID_OFFSET_Y;
};
return self;
});
var BlockSelectionMenu = Container.expand(function () {
var self = Container.call(this);
self.isVisible = false;
// Background
var bgGraphics = self.attachAsset('menuBg', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.9
});
// Title text
var titleText = new Text2('Select Block Type', {
size: 32,
fill: 0xFFFFFF
});
titleText.anchor.set(0.5, 0.5);
titleText.x = 0;
titleText.y = -200;
self.addChild(titleText);
// Close button
var closeButton = self.attachAsset('closeButton', {
anchorX: 0.5,
anchorY: 0.5
});
closeButton.x = 280;
closeButton.y = -200;
// Block selection buttons
self.menuButtons = [];
var buttonsPerRow = 2;
var buttonSpacing = 180;
for (var i = 0; i < blockTypes.length; i++) {
var button = new Container();
// Button background
var buttonBg = button.attachAsset('menuButton', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.8
});
// Block preview
var blockPreview = button.attachAsset(blockTypes[i], {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.9,
scaleY: 0.9
});
// Block name text
var nameText = new Text2(blockTypes[i], {
size: 20,
fill: 0xFFFFFF
});
nameText.anchor.set(0.5, 0);
nameText.x = 0;
nameText.y = 45;
button.addChild(nameText);
// Position button
var col = i % buttonsPerRow;
var row = Math.floor(i / buttonsPerRow);
button.x = (col - 0.5) * buttonSpacing;
button.y = row * buttonSpacing - 50;
// Store button data
button.blockType = blockTypes[i];
button.bgGraphics = buttonBg;
// Button interaction
button.down = function (x, y, obj) {
this.bgGraphics.alpha = 1.0;
selectedBlockType = this.blockType;
updateToolbarSelection();
self.hide();
};
button.up = function (x, y, obj) {
this.bgGraphics.alpha = 0.8;
};
self.menuButtons.push(button);
self.addChild(button);
}
// Close button interaction
closeButton.down = function (x, y, obj) {
closeButton.alpha = 0.7;
self.hide();
};
closeButton.up = function (x, y, obj) {
closeButton.alpha = 1.0;
};
self.show = function () {
self.isVisible = true;
self.alpha = 0;
self.visible = true;
tween(self, {
alpha: 1
}, {
duration: 200
});
};
self.hide = function () {
self.isVisible = false;
tween(self, {
alpha: 0
}, {
duration: 200,
onFinish: function onFinish() {
self.visible = false;
}
});
};
// Initially hidden
self.visible = false;
return self;
});
var Character = Container.expand(function () {
var self = Container.call(this);
var characterGraphics = self.attachAsset('character', {
anchorX: 0.5,
anchorY: 0.5
});
self.gridX = 0;
self.gridY = 0;
self.targetX = 0;
self.targetY = 0;
self.isMoving = false;
self.setGridPosition = function (gridX, gridY) {
self.gridX = gridX;
self.gridY = gridY;
self.targetX = gridX * GRID_SIZE + GRID_SIZE / 2 + GRID_OFFSET_X;
self.targetY = gridY * GRID_SIZE + GRID_SIZE / 2 + GRID_OFFSET_Y;
if (!self.isMoving) {
self.x = self.targetX;
self.y = self.targetY;
}
};
self.moveToGrid = function (gridX, gridY) {
if (self.isMoving) return false;
if (!isValidGridPosition(gridX, gridY)) return false;
// Check if there's a block at the target position
if (grid[gridX][gridY] !== null) return false;
self.isMoving = true;
self.gridX = gridX;
self.gridY = gridY;
self.targetX = gridX * GRID_SIZE + GRID_SIZE / 2 + GRID_OFFSET_X;
self.targetY = gridY * GRID_SIZE + GRID_SIZE / 2 + GRID_OFFSET_Y;
tween(self, {
x: self.targetX,
y: self.targetY
}, {
duration: 200,
onFinish: function onFinish() {
self.isMoving = false;
}
});
return true;
};
self.update = function () {
// Character is always on top
if (self.parent) {
var parent = self.parent;
parent.removeChild(self);
parent.addChild(self);
}
};
return self;
});
var ControlButton = Container.expand(function (direction) {
var self = Container.call(this);
self.direction = direction;
var bgGraphics = self.attachAsset('controlBg', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.7
});
var arrowGraphics = self.attachAsset('arrow' + direction.charAt(0).toUpperCase() + direction.slice(1), {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.7,
scaleY: 0.7
});
self.down = function (x, y, obj) {
bgGraphics.alpha = 1.0;
var newX = character.gridX;
var newY = character.gridY;
if (direction === 'up') newY--;else if (direction === 'down') newY++;else if (direction === 'left') newX--;else if (direction === 'right') newX++;
character.moveToGrid(newX, newY);
};
self.up = function (x, y, obj) {
bgGraphics.alpha = 0.7;
};
return self;
});
var GridCell = Container.expand(function () {
var self = Container.call(this);
var cellGraphics = self.attachAsset('gridCell', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.1
});
self.gridX = 0;
self.gridY = 0;
self.isEmpty = true;
self.setGridPosition = function (gridX, gridY) {
self.gridX = gridX;
self.gridY = gridY;
self.x = gridX * GRID_SIZE + GRID_SIZE / 2 + GRID_OFFSET_X;
self.y = gridY * GRID_SIZE + GRID_SIZE / 2 + GRID_OFFSET_Y;
};
self.highlight = function () {
cellGraphics.alpha = 0.3;
};
self.unhighlight = function () {
cellGraphics.alpha = 0.1;
};
return self;
});
var ToolbarButton = Container.expand(function (blockType) {
var self = Container.call(this);
self.blockType = blockType;
self.isSelected = false;
var bgGraphics = self.attachAsset('toolbarBg', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.8
});
var blockGraphics = self.attachAsset(blockType, {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.8,
scaleY: 0.8
});
var selectedBorder = self.attachAsset('selectedBorder', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0
});
self.setSelected = function (selected) {
self.isSelected = selected;
selectedBorder.alpha = selected ? 0.8 : 0;
bgGraphics.alpha = selected ? 1.0 : 0.8;
};
self.down = function (x, y, obj) {
selectedBlockType = self.blockType;
updateToolbarSelection();
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87CEEB
});
/****
* Game Code
****/
var GRID_SIZE = 80;
var GRID_WIDTH = 20;
var GRID_HEIGHT = 20;
var GRID_OFFSET_X = (2048 - GRID_WIDTH * GRID_SIZE) / 2;
var GRID_OFFSET_Y = 200;
var selectedBlockType = 'dirt';
var blockTypes = ['dirt', 'stone', 'wood', 'grass'];
var inventory = {
dirt: 50,
stone: 30,
wood: 25,
grass: 20
};
var grid = [];
var placedBlocks = [];
var toolbarButtons = [];
var controlButtons = [];
var pressTimer = null;
var isLongPress = false;
var pressStartTime = 0;
var character = null;
var blockSelectionMenu = null;
var menuButton = null;
// Initialize grid
for (var x = 0; x < GRID_WIDTH; x++) {
grid[x] = [];
for (var y = 0; y < GRID_HEIGHT; y++) {
grid[x][y] = null;
var gridCell = new GridCell();
gridCell.setGridPosition(x, y);
game.addChild(gridCell);
}
}
// Initialize character at random position
character = new Character();
var randomX = Math.floor(Math.random() * GRID_WIDTH);
var randomY = Math.floor(Math.random() * GRID_HEIGHT);
character.setGridPosition(randomX, randomY);
game.addChild(character);
// Create block selection menu
blockSelectionMenu = new BlockSelectionMenu();
blockSelectionMenu.x = 1024;
blockSelectionMenu.y = 1366;
LK.gui.addChild(blockSelectionMenu);
// Create menu button
menuButton = new Container();
var menuBg = menuButton.attachAsset('toolbarBg', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.8
});
var menuText = new Text2('MENU', {
size: 24,
fill: 0xFFFFFF
});
menuText.anchor.set(0.5, 0.5);
menuText.x = 0;
menuText.y = 0;
menuButton.addChild(menuText);
menuButton.x = 2048 - 80;
menuButton.y = 150;
menuButton.down = function (x, y, obj) {
menuBg.alpha = 1.0;
if (!blockSelectionMenu.isVisible) {
blockSelectionMenu.show();
}
};
menuButton.up = function (x, y, obj) {
menuBg.alpha = 0.8;
};
game.addChild(menuButton);
// Create toolbar
var toolbarY = 2732 - 120;
var toolbarStartX = (2048 - blockTypes.length * 120) / 2;
for (var i = 0; i < blockTypes.length; i++) {
var button = new ToolbarButton(blockTypes[i]);
button.x = toolbarStartX + i * 120 + 60;
button.y = toolbarY;
toolbarButtons.push(button);
LK.gui.addChild(button);
}
// Create inventory display
var inventoryTexts = {};
for (var i = 0; i < blockTypes.length; i++) {
var blockType = blockTypes[i];
var inventoryText = new Text2(inventory[blockType].toString(), {
size: 24,
fill: 0xFFFFFF
});
inventoryText.anchor.set(0.5, 0);
inventoryText.x = toolbarStartX + i * 120 + 60;
inventoryText.y = toolbarY + 60;
inventoryTexts[blockType] = inventoryText;
LK.gui.addChild(inventoryText);
}
// Create control buttons
var controlButtonSize = 100;
var controlPadding = 20;
var controlCenterX = 150;
var controlCenterY = GRID_OFFSET_Y + GRID_HEIGHT * GRID_SIZE + 150;
var directions = [{
dir: 'up',
x: 0,
y: -1
}, {
dir: 'down',
x: 0,
y: 1
}, {
dir: 'left',
x: -1,
y: 0
}, {
dir: 'right',
x: 1,
y: 0
}];
for (var i = 0; i < directions.length; i++) {
var dirInfo = directions[i];
var button = new ControlButton(dirInfo.dir);
button.x = controlCenterX + dirInfo.x * (controlButtonSize + controlPadding);
button.y = controlCenterY + dirInfo.y * (controlButtonSize + controlPadding);
controlButtons.push(button);
game.addChild(button);
}
function updateToolbarSelection() {
for (var i = 0; i < toolbarButtons.length; i++) {
toolbarButtons[i].setSelected(toolbarButtons[i].blockType === selectedBlockType);
}
}
function updateInventoryDisplay() {
for (var blockType in inventoryTexts) {
inventoryTexts[blockType].setText(inventory[blockType].toString());
}
}
function getGridPosition(worldX, worldY) {
var gridX = Math.floor((worldX - GRID_OFFSET_X) / GRID_SIZE);
var gridY = Math.floor((worldY - GRID_OFFSET_Y) / GRID_SIZE);
return {
x: gridX,
y: gridY
};
}
function isValidGridPosition(gridX, gridY) {
return gridX >= 0 && gridX < GRID_WIDTH && gridY >= 0 && gridY < GRID_HEIGHT;
}
function placeBlock(gridX, gridY) {
if (!isValidGridPosition(gridX, gridY)) return false;
if (grid[gridX][gridY] !== null) return false;
if (inventory[selectedBlockType] <= 0) return false;
// Don't place block on character position
if (character && gridX === character.gridX && gridY === character.gridY) return false;
var block = new Block(selectedBlockType);
block.setGridPosition(gridX, gridY);
game.addChild(block);
grid[gridX][gridY] = block;
placedBlocks.push(block);
inventory[selectedBlockType]--;
updateInventoryDisplay();
LK.getSound('place').play();
return true;
}
function removeBlock(gridX, gridY) {
if (!isValidGridPosition(gridX, gridY)) return false;
if (grid[gridX][gridY] === null) return false;
var block = grid[gridX][gridY];
var blockType = block.blockType;
// Add breaking animation with flash effect
LK.effects.flashObject(block, 0xFFFFFF, 200);
// Remove from placedBlocks array
for (var i = placedBlocks.length - 1; i >= 0; i--) {
if (placedBlocks[i] === block) {
placedBlocks.splice(i, 1);
break;
}
}
// Animate block destruction with scaling
tween(block, {
scaleX: 0,
scaleY: 0,
alpha: 0
}, {
duration: 150,
onFinish: function onFinish() {
block.destroy();
}
});
grid[gridX][gridY] = null;
inventory[blockType]++;
updateInventoryDisplay();
LK.getSound('break').play();
return true;
}
// Initialize toolbar selection
updateToolbarSelection();
updateInventoryDisplay();
game.down = function (x, y, obj) {
var gridPos = getGridPosition(x, y);
// Place block immediately on click
if (isValidGridPosition(gridPos.x, gridPos.y)) {
placeBlock(gridPos.x, gridPos.y);
}
};
// Generate procedural world
function generateWorld() {
// Reset selected block type to dirt for generation
selectedBlockType = 'dirt';
updateToolbarSelection();
// Generate terrain layers
for (var x = 0; x < GRID_WIDTH; x++) {
// Create height variation using simple noise
var baseHeight = Math.floor(GRID_HEIGHT * 0.7) + Math.floor(Math.random() * 4) - 2;
// Place grass on surface
if (baseHeight >= 0 && baseHeight < GRID_HEIGHT) {
selectedBlockType = 'grass';
placeBlock(x, baseHeight);
}
// Place dirt layers below grass
selectedBlockType = 'dirt';
for (var y = baseHeight + 1; y < Math.min(baseHeight + 3, GRID_HEIGHT); y++) {
if (Math.random() < 0.8) {
// 80% chance for dirt
placeBlock(x, y);
}
}
// Place stone in deeper layers
selectedBlockType = 'stone';
for (var y = baseHeight + 3; y < GRID_HEIGHT; y++) {
if (Math.random() < 0.6) {
// 60% chance for stone
placeBlock(x, y);
}
}
// Add random wood structures (trees)
if (Math.random() < 0.15 && baseHeight > 2) {
// 15% chance for trees
selectedBlockType = 'wood';
var treeHeight = Math.floor(Math.random() * 3) + 2;
for (var i = 0; i < treeHeight; i++) {
var treeY = baseHeight - i - 1;
if (treeY >= 0) {
placeBlock(x, treeY);
}
}
}
// Add random surface features
if (Math.random() < 0.1 && baseHeight > 0) {
// 10% chance for surface stones
selectedBlockType = 'stone';
placeBlock(x, baseHeight - 1);
}
}
// Add scattered resources
for (var i = 0; i < 20; i++) {
var randX = Math.floor(Math.random() * GRID_WIDTH);
var randY = Math.floor(Math.random() * GRID_HEIGHT);
if (grid[randX][randY] === null) {
var resourceType = blockTypes[Math.floor(Math.random() * blockTypes.length)];
selectedBlockType = resourceType;
placeBlock(randX, randY);
}
}
// Reset to dirt selection
selectedBlockType = 'dirt';
updateToolbarSelection();
}
// Generate the world after a short delay
LK.setTimeout(function () {
generateWorld();
}, 500);
game.update = function () {
// Replenish inventory slowly over time
if (LK.ticks % 600 === 0) {
// Every 10 seconds
for (var blockType in inventory) {
if (inventory[blockType] < 50) {
inventory[blockType]++;
}
}
updateInventoryDisplay();
}
};