User prompt
Add swiping right and left movement
User prompt
everything is small to see
User prompt
Change the touch contro into buttons
User prompt
Move the view port to the centre
User prompt
Add button to the screen
User prompt
Make the view bigger
Code edit (1 edits merged)
Please save this source code
User prompt
Mini Miner
Initial prompt
**Mini Miner** – Players dig through underground tunnels searching for rare gems while avoiding cave-ins, lava, and mysterious creatures lurking below.
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1", { highScore: 0 }); /**** * Classes ****/ var Miner = Container.expand(function () { var self = Container.call(this); self.sprite = self.attachAsset('miner', { anchorX: 0.5, anchorY: 0.5 }); self.gridX = 0; self.gridY = 0; self.moving = false; self.moveTo = function (x, y) { if (self.moving) { return false; } var oldX = self.gridX; var oldY = self.gridY; self.gridX = x; self.gridY = y; self.moving = true; tween(self, { x: x * TILE_SIZE, y: y * TILE_SIZE }, { duration: 100, easing: tween.easeOut, onFinish: function onFinish() { self.moving = false; } }); return true; }; return self; }); var Monster = Container.expand(function (startX, startY, patrolRange) { var self = Container.call(this); self.sprite = self.attachAsset('monster', { anchorX: 0.5, anchorY: 0.5 }); self.gridX = startX; self.gridY = startY; self.patrolRange = patrolRange || 3; self.startX = startX; self.moving = false; self.direction = 1; // 1 right, -1 left self.update = function () { if (self.moving) { return; } if (Math.abs(self.gridX - self.startX) >= self.patrolRange) { self.direction *= -1; } var nextX = self.gridX + self.direction; if (isValidMove(nextX, self.gridY)) { self.moveTo(nextX, self.gridY); } else { self.direction *= -1; } }; self.moveTo = function (x, y) { self.moving = true; self.gridX = x; self.gridY = y; tween(self, { x: x * TILE_SIZE, y: y * TILE_SIZE }, { duration: 300, easing: tween.linear, onFinish: function onFinish() { self.moving = false; } }); }; return self; }); var StatusBar = Container.expand(function (type, width, height) { var self = Container.call(this); self.maxValue = 100; self.currentValue = 100; var borderAsset = type + 'Border'; var fillerAsset = type; self.border = self.attachAsset(borderAsset, { anchorX: 0, anchorY: 0 }); self.filler = self.attachAsset(fillerAsset, { anchorX: 0, anchorY: 0, x: 2, y: 2 }); self.setValue = function (value) { self.currentValue = Math.max(0, Math.min(self.maxValue, value)); var percentage = self.currentValue / self.maxValue; self.filler.scale.x = percentage; }; return self; }); var Tile = Container.expand(function (type, x, y) { var self = Container.call(this); self.type = type; self.gridX = x; self.gridY = y; self.revealed = false; var assetId; switch (type) { case 'wall': assetId = 'wall'; break; case 'dirt': assetId = 'dirt'; break; case 'gemCommon': assetId = 'gemCommon'; break; case 'gemRare': assetId = 'gemRare'; break; case 'gemEpic': assetId = 'gemEpic'; break; case 'lava': assetId = 'lava'; break; default: assetId = 'dirt'; break; } self.sprite = self.attachAsset(assetId, { anchorX: 0.5, anchorY: 0.5 }); self.reveal = function () { if (self.revealed) { return; } self.revealed = true; if (self.type === 'dirt') { tween(self.sprite, { alpha: 0 }, { duration: 300, onFinish: function onFinish() { self.sprite.visible = false; } }); } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x000000 }); /**** * Game Code ****/ function increaseDifficulty() { // Example: Increase monster speed or spawn rate for (var i = 0; i < monsters.length; i++) { monsters[i].patrolRange += 1; // Increase patrol range } // Example: Increase oxygen decrease rate OXYGEN_DECREASE_RATE += 0.01; } // Removed durability asset initialization // Constants var GRID_WIDTH = 23; var GRID_HEIGHT = 100; var TILE_SIZE = 80; var VIEWPORT_HEIGHT = 20; // Number of rows visible at once var OXYGEN_DECREASE_RATE = 0.1; var DRILL_DECREASE_AMOUNT = 5; var MAX_DEPTH = 95; // Maximum depth to consider for win condition // Game variables var grid = []; var miner; var score = 0; var depth = 0; var monsters = []; var viewportOffset = 0; var oxygenBar; var durabilityBar; var scoreText; var depthText; var gameActive = true; // Initialize game elements game.setBackgroundColor(0x222222); // Add touch control for miner movement var startX, startY, endX, endY; game.down = function (x, y, obj) { startX = x; startY = y; }; game.up = function (x, y, obj) { endX = x; endY = y; handleSwipe(); }; function handleSwipe() { var dx = endX - startX; var dy = endY - startY; var absDx = Math.abs(dx); var absDy = Math.abs(dy); if (absDx > absDy) { // Horizontal swipe if (dx > 0) { handleMovement(1, 0); // Swipe right } else { handleMovement(-1, 0); // Swipe left } } else { // Vertical swipe if (dy > 0) { handleMovement(0, 1); // Swipe down } else { handleMovement(0, -1); // Swipe up } } } function initGame() { // Reset game variables grid = []; monsters = []; score = 0; depth = 0; viewportOffset = 0; gameActive = true; // Generate the grid generateGrid(); // Create miner miner = new Miner(); miner.x = Math.floor(GRID_WIDTH / 2) * TILE_SIZE; miner.y = 0; miner.gridX = Math.floor(GRID_WIDTH / 2); miner.gridY = 0; game.addChild(miner); // Spawn monsters spawnMonsters(); // Create UI createUI(); // Start background music LK.playMusic('bgMusic'); } function createUI() { // Health bar healthBar = new StatusBar('health'); healthBar.x = 20; healthBar.y = 20; LK.gui.topLeft.addChild(healthBar); // Removed durability bar from the UI // Score text scoreText = new Text2("Score: 0", { size: 80, fill: 0xFFFFFF }); scoreText.anchor.set(1, 0); LK.gui.topRight.addChild(scoreText); // Depth text depthText = new Text2("Depth: 0m", { size: 80, fill: 0xFFFFFF }); depthText.anchor.set(1, 0); LK.gui.top.addChild(depthText); // Restart button var restartButton = new Text2("Restart", { size: 40, fill: 0xFFFFFF }); restartButton.anchor.set(0.5, 0); restartButton.x = 2048 / 2; // Centered horizontally restartButton.y = 100; // Positioned below the depth text restartButton.interactive = true; restartButton.buttonMode = true; restartButton.on('pointerdown', function () { initGame(); // Restart the game when the button is pressed }); LK.gui.top.addChild(restartButton); // Movement buttons var buttonSize = 80; var buttonOffset = 20; // Left button var leftButton = new Text2("<", { size: 40, fill: 0xFFFFFF }); leftButton.anchor.set(0.5, 0.5); leftButton.x = 2048 / 2 - buttonSize * 2.5; // Adjusted position leftButton.y = 2732 - buttonOffset - buttonSize * 2.5; leftButton.interactive = true; leftButton.buttonMode = true; leftButton.on('pointerdown', function () { if (gameActive) { handleMovement(-1, 0); } }); LK.gui.bottomLeft.addChild(leftButton); // Right button var rightButton = new Text2(">", { size: 40, fill: 0xFFFFFF }); rightButton.anchor.set(0.5, 0.5); rightButton.x = 2048 - buttonOffset - buttonSize; // Positioned on the right side rightButton.y = 2732 - buttonOffset - buttonSize * 2.5; rightButton.interactive = true; rightButton.buttonMode = true; rightButton.on('pointerdown', function () { if (gameActive) { handleMovement(1, 0); } }); LK.gui.bottomRight.addChild(rightButton); // Control button on the right side var controlButton = new Text2("C", { size: 40, fill: 0xFFFFFF }); controlButton.anchor.set(0.5, 0.5); controlButton.x = 2048 - buttonOffset - buttonSize; // Positioned on the right side controlButton.y = 2732 - buttonOffset - buttonSize * 1.5; controlButton.interactive = true; controlButton.buttonMode = true; controlButton.on('pointerdown', function () { console.log("Control button pressed"); }); LK.gui.bottomRight.addChild(controlButton); // Up button var upButton = new Text2("^", { size: 40, fill: 0xFFFFFF }); upButton.anchor.set(0.5, 0.5); upButton.x = 2048 / 2; // Adjusted position upButton.y = 2732 - buttonOffset - buttonSize * 3.5; upButton.interactive = true; upButton.buttonMode = true; upButton.on('pointerdown', function () { if (gameActive) { handleMovement(0, -1); } }); LK.gui.bottomLeft.addChild(upButton); // Down button var downButton = new Text2("v", { size: 40, fill: 0xFFFFFF }); downButton.anchor.set(0.5, 0.5); downButton.x = 2048 / 2; // Adjusted position downButton.y = 2732 - buttonOffset - buttonSize * 1.5; downButton.interactive = true; downButton.buttonMode = true; downButton.on('pointerdown', function () { if (gameActive) { handleMovement(0, 1); } }); LK.gui.bottomLeft.addChild(downButton); } function generateGrid() { // Clear existing grid for (var i = 0; i < grid.length; i++) { for (var j = 0; j < grid[i].length; j++) { if (grid[i][j] && grid[i][j].parent) { grid[i][j].parent.removeChild(grid[i][j]); } } } // Generate new grid for (var y = 0; y < GRID_HEIGHT; y++) { grid[y] = []; for (var x = 0; x < GRID_WIDTH; x++) { var type = 'dirt'; // Edge walls if (x === 0 || x === GRID_WIDTH - 1) { type = 'wall'; } // Random walls else if (y > 0 && Math.random() < 0.1) { type = 'wall'; } // Gems (more valuable as you go deeper) else if (Math.random() < 0.05) { if (y > 60) { type = 'gemEpic'; } else if (y > 30) { type = 'gemRare'; } else { type = 'gemCommon'; } } // Lava (more common as you go deeper) else if (y > 10 && Math.random() < 0.02 + y / 1000) { type = 'lava'; if (y % 2 === 0) { type = 'lava'; // Ensure lava tiles are placed in sequence order } } var tile = new Tile(type, x, y); tile.x = x * TILE_SIZE; tile.y = y * TILE_SIZE; grid[y][x] = tile; game.addChild(tile); // Initial tiles should be visible if (y < 2) { tile.reveal(); } } } } function spawnMonsters() { // Add monsters at various depths for (var i = 0; i < 10; i++) { var depth = 10 + i * 8; var x = 1 + Math.floor(Math.random() * (GRID_WIDTH - 2)); var monster = new Monster(x, depth, 3 + Math.floor(i / 3)); monster.x = x * TILE_SIZE; monster.y = depth * TILE_SIZE; monsters.push(monster); game.addChild(monster); } } function updateViewport() { var targetOffset = Math.max(0, miner.gridY - Math.floor(VIEWPORT_HEIGHT / 2)); if (targetOffset !== viewportOffset) { viewportOffset = targetOffset; // Adjust all elements based on new viewport for (var y = 0; y < GRID_HEIGHT; y++) { for (var x = 0; x < GRID_WIDTH; x++) { if (grid[y] && grid[y][x]) { grid[y][x].y = (y - viewportOffset) * TILE_SIZE; } } } // Adjust monsters for (var i = 0; i < monsters.length; i++) { monsters[i].y = (monsters[i].gridY - viewportOffset) * TILE_SIZE; } // Adjust miner miner.y = (miner.gridY - viewportOffset) * TILE_SIZE; } } function isValidMove(x, y) { // Check bounds if (x < 0 || x >= GRID_WIDTH || y < 0 || y >= GRID_HEIGHT) { return false; } // Check if position is valid if (!grid[y] || !grid[y][x]) { return false; } // Can't move through walls if (grid[y][x].type === 'wall') { return false; } return true; } function handleTileInteraction(x, y) { if (!grid[y] || !grid[y][x] || !gameActive) { return; } var tile = grid[y][x]; // Reveal the tile tile.reveal(); // Collect gems if (tile.type.includes('gem')) { var gemValue = 0; var oxygenBoost = 0; if (tile.type === 'gemCommon') { gemValue = 10; oxygenBoost = 5; } else if (tile.type === 'gemRare') { gemValue = 25; oxygenBoost = 10; } else if (tile.type === 'gemEpic') { gemValue = 50; oxygenBoost = 20; } score += gemValue; scoreText.setText("Score: " + score); // Increase health level by 40% healthBar.setValue(healthBar.currentValue + healthBar.maxValue * 0.4); // Increase health by 40% of max value // Play gem collection sound LK.getSound('gemCollect').play(); // Change tile to dirt after collection tile.type = 'dirt'; tile.sprite.visible = false; // Set visibility to false to remove gem tile.revealed = true; // Ensure the tile is marked as revealed } // Check for lava if (tile.type === 'lava') { LK.getSound('danger').play(); // Play danger sound LK.effects.flashScreen(0xFF0000, 1000); // Flash screen red endGame(false); // End game } // Removed durability-related logic // Update depth if this is a new deepest point if (y > depth) { depth = y; depthText.setText("Depth: " + depth + "m"); // Level progression based on depth if (depth > 0 && depth % 10 === 0) { // Increase difficulty or change level settings increaseDifficulty(); } // Check win condition // Removed restriction for miner movement beyond maximum depth } } function checkMonsterCollision() { for (var i = 0; i < monsters.length; i++) { if (monsters[i].gridX === miner.gridX && monsters[i].gridY === miner.gridY) { LK.getSound('danger').play(); LK.effects.flashScreen(0xFF0000, 1000); endGame(false); break; } } } function endGame(win) { gameActive = false; // Update high score if needed if (score > storage.highScore) { storage.highScore = score; } if (win) { LK.showYouWin(); } else { LK.showGameOver(); } } function handleMovement(dx, dy) { if (!gameActive || miner.moving) { return; } var newX = miner.gridX + dx; var newY = miner.gridY + dy; if (isValidMove(newX, newY) && dy >= 0) { if (miner.moveTo(newX, newY)) { handleTileInteraction(newX, newY); miner.x = newX * TILE_SIZE; miner.y = newY * TILE_SIZE; } } } game.update = function () { if (!gameActive) { return; } // Update viewport position updateViewport(); // Update health level healthBar.setValue(healthBar.currentValue - OXYGEN_DECREASE_RATE); if (healthBar.currentValue <= 0) { endGame(false); } // Update monsters for (var i = 0; i < monsters.length; i++) { monsters[i].update(); } // Check for monster collisions checkMonsterCollision(); // Reveal nearby tiles for (var dy = -1; dy <= 1; dy++) { for (var dx = -1; dx <= 1; dx++) { var nx = miner.gridX + dx; var ny = miner.gridY + dy; if (nx >= 0 && nx < GRID_WIDTH && ny >= 0 && ny < GRID_HEIGHT && grid[ny] && grid[ny][nx]) { grid[ny][nx].reveal(); } } } }; // Initialize the game initGame();
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1", {
highScore: 0
});
/****
* Classes
****/
var Miner = Container.expand(function () {
var self = Container.call(this);
self.sprite = self.attachAsset('miner', {
anchorX: 0.5,
anchorY: 0.5
});
self.gridX = 0;
self.gridY = 0;
self.moving = false;
self.moveTo = function (x, y) {
if (self.moving) {
return false;
}
var oldX = self.gridX;
var oldY = self.gridY;
self.gridX = x;
self.gridY = y;
self.moving = true;
tween(self, {
x: x * TILE_SIZE,
y: y * TILE_SIZE
}, {
duration: 100,
easing: tween.easeOut,
onFinish: function onFinish() {
self.moving = false;
}
});
return true;
};
return self;
});
var Monster = Container.expand(function (startX, startY, patrolRange) {
var self = Container.call(this);
self.sprite = self.attachAsset('monster', {
anchorX: 0.5,
anchorY: 0.5
});
self.gridX = startX;
self.gridY = startY;
self.patrolRange = patrolRange || 3;
self.startX = startX;
self.moving = false;
self.direction = 1; // 1 right, -1 left
self.update = function () {
if (self.moving) {
return;
}
if (Math.abs(self.gridX - self.startX) >= self.patrolRange) {
self.direction *= -1;
}
var nextX = self.gridX + self.direction;
if (isValidMove(nextX, self.gridY)) {
self.moveTo(nextX, self.gridY);
} else {
self.direction *= -1;
}
};
self.moveTo = function (x, y) {
self.moving = true;
self.gridX = x;
self.gridY = y;
tween(self, {
x: x * TILE_SIZE,
y: y * TILE_SIZE
}, {
duration: 300,
easing: tween.linear,
onFinish: function onFinish() {
self.moving = false;
}
});
};
return self;
});
var StatusBar = Container.expand(function (type, width, height) {
var self = Container.call(this);
self.maxValue = 100;
self.currentValue = 100;
var borderAsset = type + 'Border';
var fillerAsset = type;
self.border = self.attachAsset(borderAsset, {
anchorX: 0,
anchorY: 0
});
self.filler = self.attachAsset(fillerAsset, {
anchorX: 0,
anchorY: 0,
x: 2,
y: 2
});
self.setValue = function (value) {
self.currentValue = Math.max(0, Math.min(self.maxValue, value));
var percentage = self.currentValue / self.maxValue;
self.filler.scale.x = percentage;
};
return self;
});
var Tile = Container.expand(function (type, x, y) {
var self = Container.call(this);
self.type = type;
self.gridX = x;
self.gridY = y;
self.revealed = false;
var assetId;
switch (type) {
case 'wall':
assetId = 'wall';
break;
case 'dirt':
assetId = 'dirt';
break;
case 'gemCommon':
assetId = 'gemCommon';
break;
case 'gemRare':
assetId = 'gemRare';
break;
case 'gemEpic':
assetId = 'gemEpic';
break;
case 'lava':
assetId = 'lava';
break;
default:
assetId = 'dirt';
break;
}
self.sprite = self.attachAsset(assetId, {
anchorX: 0.5,
anchorY: 0.5
});
self.reveal = function () {
if (self.revealed) {
return;
}
self.revealed = true;
if (self.type === 'dirt') {
tween(self.sprite, {
alpha: 0
}, {
duration: 300,
onFinish: function onFinish() {
self.sprite.visible = false;
}
});
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000000
});
/****
* Game Code
****/
function increaseDifficulty() {
// Example: Increase monster speed or spawn rate
for (var i = 0; i < monsters.length; i++) {
monsters[i].patrolRange += 1; // Increase patrol range
}
// Example: Increase oxygen decrease rate
OXYGEN_DECREASE_RATE += 0.01;
}
// Removed durability asset initialization
// Constants
var GRID_WIDTH = 23;
var GRID_HEIGHT = 100;
var TILE_SIZE = 80;
var VIEWPORT_HEIGHT = 20; // Number of rows visible at once
var OXYGEN_DECREASE_RATE = 0.1;
var DRILL_DECREASE_AMOUNT = 5;
var MAX_DEPTH = 95; // Maximum depth to consider for win condition
// Game variables
var grid = [];
var miner;
var score = 0;
var depth = 0;
var monsters = [];
var viewportOffset = 0;
var oxygenBar;
var durabilityBar;
var scoreText;
var depthText;
var gameActive = true;
// Initialize game elements
game.setBackgroundColor(0x222222);
// Add touch control for miner movement
var startX, startY, endX, endY;
game.down = function (x, y, obj) {
startX = x;
startY = y;
};
game.up = function (x, y, obj) {
endX = x;
endY = y;
handleSwipe();
};
function handleSwipe() {
var dx = endX - startX;
var dy = endY - startY;
var absDx = Math.abs(dx);
var absDy = Math.abs(dy);
if (absDx > absDy) {
// Horizontal swipe
if (dx > 0) {
handleMovement(1, 0); // Swipe right
} else {
handleMovement(-1, 0); // Swipe left
}
} else {
// Vertical swipe
if (dy > 0) {
handleMovement(0, 1); // Swipe down
} else {
handleMovement(0, -1); // Swipe up
}
}
}
function initGame() {
// Reset game variables
grid = [];
monsters = [];
score = 0;
depth = 0;
viewportOffset = 0;
gameActive = true;
// Generate the grid
generateGrid();
// Create miner
miner = new Miner();
miner.x = Math.floor(GRID_WIDTH / 2) * TILE_SIZE;
miner.y = 0;
miner.gridX = Math.floor(GRID_WIDTH / 2);
miner.gridY = 0;
game.addChild(miner);
// Spawn monsters
spawnMonsters();
// Create UI
createUI();
// Start background music
LK.playMusic('bgMusic');
}
function createUI() {
// Health bar
healthBar = new StatusBar('health');
healthBar.x = 20;
healthBar.y = 20;
LK.gui.topLeft.addChild(healthBar);
// Removed durability bar from the UI
// Score text
scoreText = new Text2("Score: 0", {
size: 80,
fill: 0xFFFFFF
});
scoreText.anchor.set(1, 0);
LK.gui.topRight.addChild(scoreText);
// Depth text
depthText = new Text2("Depth: 0m", {
size: 80,
fill: 0xFFFFFF
});
depthText.anchor.set(1, 0);
LK.gui.top.addChild(depthText);
// Restart button
var restartButton = new Text2("Restart", {
size: 40,
fill: 0xFFFFFF
});
restartButton.anchor.set(0.5, 0);
restartButton.x = 2048 / 2; // Centered horizontally
restartButton.y = 100; // Positioned below the depth text
restartButton.interactive = true;
restartButton.buttonMode = true;
restartButton.on('pointerdown', function () {
initGame(); // Restart the game when the button is pressed
});
LK.gui.top.addChild(restartButton);
// Movement buttons
var buttonSize = 80;
var buttonOffset = 20;
// Left button
var leftButton = new Text2("<", {
size: 40,
fill: 0xFFFFFF
});
leftButton.anchor.set(0.5, 0.5);
leftButton.x = 2048 / 2 - buttonSize * 2.5; // Adjusted position
leftButton.y = 2732 - buttonOffset - buttonSize * 2.5;
leftButton.interactive = true;
leftButton.buttonMode = true;
leftButton.on('pointerdown', function () {
if (gameActive) {
handleMovement(-1, 0);
}
});
LK.gui.bottomLeft.addChild(leftButton);
// Right button
var rightButton = new Text2(">", {
size: 40,
fill: 0xFFFFFF
});
rightButton.anchor.set(0.5, 0.5);
rightButton.x = 2048 - buttonOffset - buttonSize; // Positioned on the right side
rightButton.y = 2732 - buttonOffset - buttonSize * 2.5;
rightButton.interactive = true;
rightButton.buttonMode = true;
rightButton.on('pointerdown', function () {
if (gameActive) {
handleMovement(1, 0);
}
});
LK.gui.bottomRight.addChild(rightButton);
// Control button on the right side
var controlButton = new Text2("C", {
size: 40,
fill: 0xFFFFFF
});
controlButton.anchor.set(0.5, 0.5);
controlButton.x = 2048 - buttonOffset - buttonSize; // Positioned on the right side
controlButton.y = 2732 - buttonOffset - buttonSize * 1.5;
controlButton.interactive = true;
controlButton.buttonMode = true;
controlButton.on('pointerdown', function () {
console.log("Control button pressed");
});
LK.gui.bottomRight.addChild(controlButton);
// Up button
var upButton = new Text2("^", {
size: 40,
fill: 0xFFFFFF
});
upButton.anchor.set(0.5, 0.5);
upButton.x = 2048 / 2; // Adjusted position
upButton.y = 2732 - buttonOffset - buttonSize * 3.5;
upButton.interactive = true;
upButton.buttonMode = true;
upButton.on('pointerdown', function () {
if (gameActive) {
handleMovement(0, -1);
}
});
LK.gui.bottomLeft.addChild(upButton);
// Down button
var downButton = new Text2("v", {
size: 40,
fill: 0xFFFFFF
});
downButton.anchor.set(0.5, 0.5);
downButton.x = 2048 / 2; // Adjusted position
downButton.y = 2732 - buttonOffset - buttonSize * 1.5;
downButton.interactive = true;
downButton.buttonMode = true;
downButton.on('pointerdown', function () {
if (gameActive) {
handleMovement(0, 1);
}
});
LK.gui.bottomLeft.addChild(downButton);
}
function generateGrid() {
// Clear existing grid
for (var i = 0; i < grid.length; i++) {
for (var j = 0; j < grid[i].length; j++) {
if (grid[i][j] && grid[i][j].parent) {
grid[i][j].parent.removeChild(grid[i][j]);
}
}
}
// Generate new grid
for (var y = 0; y < GRID_HEIGHT; y++) {
grid[y] = [];
for (var x = 0; x < GRID_WIDTH; x++) {
var type = 'dirt';
// Edge walls
if (x === 0 || x === GRID_WIDTH - 1) {
type = 'wall';
}
// Random walls
else if (y > 0 && Math.random() < 0.1) {
type = 'wall';
}
// Gems (more valuable as you go deeper)
else if (Math.random() < 0.05) {
if (y > 60) {
type = 'gemEpic';
} else if (y > 30) {
type = 'gemRare';
} else {
type = 'gemCommon';
}
}
// Lava (more common as you go deeper)
else if (y > 10 && Math.random() < 0.02 + y / 1000) {
type = 'lava';
if (y % 2 === 0) {
type = 'lava'; // Ensure lava tiles are placed in sequence order
}
}
var tile = new Tile(type, x, y);
tile.x = x * TILE_SIZE;
tile.y = y * TILE_SIZE;
grid[y][x] = tile;
game.addChild(tile);
// Initial tiles should be visible
if (y < 2) {
tile.reveal();
}
}
}
}
function spawnMonsters() {
// Add monsters at various depths
for (var i = 0; i < 10; i++) {
var depth = 10 + i * 8;
var x = 1 + Math.floor(Math.random() * (GRID_WIDTH - 2));
var monster = new Monster(x, depth, 3 + Math.floor(i / 3));
monster.x = x * TILE_SIZE;
monster.y = depth * TILE_SIZE;
monsters.push(monster);
game.addChild(monster);
}
}
function updateViewport() {
var targetOffset = Math.max(0, miner.gridY - Math.floor(VIEWPORT_HEIGHT / 2));
if (targetOffset !== viewportOffset) {
viewportOffset = targetOffset;
// Adjust all elements based on new viewport
for (var y = 0; y < GRID_HEIGHT; y++) {
for (var x = 0; x < GRID_WIDTH; x++) {
if (grid[y] && grid[y][x]) {
grid[y][x].y = (y - viewportOffset) * TILE_SIZE;
}
}
}
// Adjust monsters
for (var i = 0; i < monsters.length; i++) {
monsters[i].y = (monsters[i].gridY - viewportOffset) * TILE_SIZE;
}
// Adjust miner
miner.y = (miner.gridY - viewportOffset) * TILE_SIZE;
}
}
function isValidMove(x, y) {
// Check bounds
if (x < 0 || x >= GRID_WIDTH || y < 0 || y >= GRID_HEIGHT) {
return false;
}
// Check if position is valid
if (!grid[y] || !grid[y][x]) {
return false;
}
// Can't move through walls
if (grid[y][x].type === 'wall') {
return false;
}
return true;
}
function handleTileInteraction(x, y) {
if (!grid[y] || !grid[y][x] || !gameActive) {
return;
}
var tile = grid[y][x];
// Reveal the tile
tile.reveal();
// Collect gems
if (tile.type.includes('gem')) {
var gemValue = 0;
var oxygenBoost = 0;
if (tile.type === 'gemCommon') {
gemValue = 10;
oxygenBoost = 5;
} else if (tile.type === 'gemRare') {
gemValue = 25;
oxygenBoost = 10;
} else if (tile.type === 'gemEpic') {
gemValue = 50;
oxygenBoost = 20;
}
score += gemValue;
scoreText.setText("Score: " + score);
// Increase health level by 40%
healthBar.setValue(healthBar.currentValue + healthBar.maxValue * 0.4); // Increase health by 40% of max value
// Play gem collection sound
LK.getSound('gemCollect').play();
// Change tile to dirt after collection
tile.type = 'dirt';
tile.sprite.visible = false; // Set visibility to false to remove gem
tile.revealed = true; // Ensure the tile is marked as revealed
}
// Check for lava
if (tile.type === 'lava') {
LK.getSound('danger').play(); // Play danger sound
LK.effects.flashScreen(0xFF0000, 1000); // Flash screen red
endGame(false); // End game
}
// Removed durability-related logic
// Update depth if this is a new deepest point
if (y > depth) {
depth = y;
depthText.setText("Depth: " + depth + "m");
// Level progression based on depth
if (depth > 0 && depth % 10 === 0) {
// Increase difficulty or change level settings
increaseDifficulty();
}
// Check win condition
// Removed restriction for miner movement beyond maximum depth
}
}
function checkMonsterCollision() {
for (var i = 0; i < monsters.length; i++) {
if (monsters[i].gridX === miner.gridX && monsters[i].gridY === miner.gridY) {
LK.getSound('danger').play();
LK.effects.flashScreen(0xFF0000, 1000);
endGame(false);
break;
}
}
}
function endGame(win) {
gameActive = false;
// Update high score if needed
if (score > storage.highScore) {
storage.highScore = score;
}
if (win) {
LK.showYouWin();
} else {
LK.showGameOver();
}
}
function handleMovement(dx, dy) {
if (!gameActive || miner.moving) {
return;
}
var newX = miner.gridX + dx;
var newY = miner.gridY + dy;
if (isValidMove(newX, newY) && dy >= 0) {
if (miner.moveTo(newX, newY)) {
handleTileInteraction(newX, newY);
miner.x = newX * TILE_SIZE;
miner.y = newY * TILE_SIZE;
}
}
}
game.update = function () {
if (!gameActive) {
return;
}
// Update viewport position
updateViewport();
// Update health level
healthBar.setValue(healthBar.currentValue - OXYGEN_DECREASE_RATE);
if (healthBar.currentValue <= 0) {
endGame(false);
}
// Update monsters
for (var i = 0; i < monsters.length; i++) {
monsters[i].update();
}
// Check for monster collisions
checkMonsterCollision();
// Reveal nearby tiles
for (var dy = -1; dy <= 1; dy++) {
for (var dx = -1; dx <= 1; dx++) {
var nx = miner.gridX + dx;
var ny = miner.gridY + dy;
if (nx >= 0 && nx < GRID_WIDTH && ny >= 0 && ny < GRID_HEIGHT && grid[ny] && grid[ny][nx]) {
grid[ny][nx].reveal();
}
}
}
};
// Initialize the game
initGame();
Miner. Single Game Texture. In-Game asset. 2d. Blank background. No shadows
Underground monster. Single Game Texture. In-Game asset. 2d. Blank background. No shadows
Gold coin. Single Game Texture. In-Game asset. 2d. Blank background. No shadows
Emarald. Single Game Texture. In-Game asset. 2d. Blank background. No shadows