/**** * 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