/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1", {
coins: 0,
pickLevel: 1
});
/****
* Classes
****/
var Digger = Container.expand(function () {
var self = Container.call(this);
var diggerGraphics = self.attachAsset('digger', {
anchorX: 0.5,
anchorY: 0.5
});
self.digging = false;
self.digStrength = 1;
self.startDig = function (targetX, targetY) {
self.digging = true;
self.x = targetX;
self.y = targetY;
// Make digger appear to dig with animation
tween(diggerGraphics, {
rotation: Math.PI * 2
}, {
duration: 500,
easing: tween.easeInOut,
onFinish: function onFinish() {
diggerGraphics.rotation = 0;
self.digging = false;
}
});
};
self.upgrade = function (level) {
self.digStrength = level;
// Visual indication of upgraded digger
diggerGraphics.scaleX = 1 + level * 0.1;
diggerGraphics.scaleY = 1 + level * 0.1;
};
return self;
});
var Dirt = Container.expand(function (type, gemType) {
var self = Container.call(this);
var assetType = type === 'hard' ? 'hardDirt' : 'normalDirt';
var dirtGraphics = self.attachAsset(assetType, {
anchorX: 0.5,
anchorY: 0.5
});
self.health = type === 'hard' ? 3 : 1;
self.originalHealth = self.health;
self.hasGem = gemType > 0;
self.gemType = gemType;
// Reveal gem if this dirt has one
if (self.hasGem) {
var gemAsset = 'gem' + gemType;
var gemGraphics = self.attachAsset(gemAsset, {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0 // Hidden initially
});
self.gem = gemGraphics;
}
self.dig = function (strength) {
self.health -= strength;
if (self.health <= 0) {
// Dirt is completely dug
dirtGraphics.alpha = 0;
// Reveal gem if exists
if (self.hasGem && self.gem) {
self.gem.alpha = 1;
return true;
}
} else {
// Visual feedback that dirt is being dug
dirtGraphics.alpha = self.health / self.originalHealth;
}
return false;
};
self.collectGem = function () {
if (self.hasGem && self.gem && self.gem.alpha > 0) {
self.gem.alpha = 0;
return self.gemType;
}
return 0;
};
return self;
});
var GrassTile = Container.expand(function () {
var self = Container.call(this);
var grassGraphics = self.attachAsset('Grass', {
anchorX: 0.5,
anchorY: 0.5
});
// Grass tiles can't be dug
self.dig = function () {
return false;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000000
});
/****
* Game Code
****/
// Game constants
var GRID_WIDTH = 6;
var GRID_HEIGHT = 8;
var CELL_SIZE = 120;
var GRID_PADDING_X = (2048 - GRID_WIDTH * CELL_SIZE) / 2;
var GRID_PADDING_Y = 500;
// Game variables
var digger;
var grid = [];
var score = 0;
var level = 1;
var coinsCollected = 0;
var pickLevel = storage.pickLevel || 1;
var coins = storage.coins || 0;
// UI elements
var scoreTxt;
var levelTxt;
var coinsTxt;
var upgradeBtn;
// Initialize game
function initGame() {
game.setBackgroundColor(0x333333);
// Create header UI
createUI();
// Create digger
digger = new Digger();
digger.x = 2048 / 2;
digger.y = 300;
digger.upgrade(pickLevel);
game.addChild(digger);
// Create initial grid
createGrid();
// Play background music
LK.playMusic('bgmusic');
}
function createUI() {
// Score text
scoreTxt = new Text2('Score: 0', {
size: 60,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0, 0);
scoreTxt.x = 150;
scoreTxt.y = 50;
LK.gui.addChild(scoreTxt);
// Level text
levelTxt = new Text2('Level: 1', {
size: 60,
fill: 0xFFFFFF
});
levelTxt.anchor.set(0.5, 0);
levelTxt.x = 2048 / 2;
levelTxt.y = 50;
LK.gui.addChild(levelTxt);
// Coins text
coinsTxt = new Text2('Coins: ' + coins, {
size: 60,
fill: 0xFFFF00
});
coinsTxt.anchor.set(1, 0);
coinsTxt.x = 2048 - 150;
coinsTxt.y = 50;
LK.gui.addChild(coinsTxt);
// Upgrade button
var buttonText = 'Upgrade Pick: ' + pickLevel * 50 + ' coins';
upgradeBtn = new Text2(buttonText, {
size: 50,
fill: 0x00FF00
});
upgradeBtn.anchor.set(0.5, 0);
upgradeBtn.x = 2048 / 2;
upgradeBtn.y = 150;
upgradeBtn.interactive = true;
upgradeBtn.down = function () {
upgradePick();
};
LK.gui.addChild(upgradeBtn);
}
function createGrid() {
// Clear existing grid if any
for (var i = 0; i < grid.length; i++) {
for (var j = 0; j < grid[i].length; j++) {
if (grid[i][j]) {
grid[i][j].destroy();
}
}
}
// Create new grid
grid = [];
for (var row = 0; row < GRID_HEIGHT; row++) {
grid[row] = [];
for (var col = 0; col < GRID_WIDTH; col++) {
// For the top row (level one), use grass instead of dirt
if (row === 0) {
// Add grass tile
var grassTile = new Container();
var grassGraphics = grassTile.attachAsset('Grass', {
anchorX: 0.5,
anchorY: 0.5
});
grassTile.x = GRID_PADDING_X + col * CELL_SIZE + CELL_SIZE / 2;
grassTile.y = GRID_PADDING_Y + row * CELL_SIZE + CELL_SIZE / 2;
game.addChild(grassTile);
// Still create the dirt object but make it have no gems
var dirt = new Dirt('normal', 0);
dirt.x = GRID_PADDING_X + col * CELL_SIZE + CELL_SIZE / 2;
dirt.y = GRID_PADDING_Y + row * CELL_SIZE + CELL_SIZE / 2;
dirt.health = 0; // Already dug out
dirt.dig = function () {
return false;
}; // Can't dig grass
grid[row][col] = dirt;
continue;
}
// Regular dirt tiles for all other rows
// Determine dirt type - more hard dirt in higher levels
var isHard = Math.random() < 0.1 * level;
var dirtType = isHard ? 'hard' : 'normal';
// Determine if this cell has a gem - more valuable gems in deeper rows
var gemChance = 0.2 + row / GRID_HEIGHT * 0.3;
var hasGem = Math.random() < gemChance;
var gemType = 0;
if (hasGem) {
// Gems range from 1-3, with better gems having a higher chance in deeper levels
var gemRoll = Math.random();
if (gemRoll < 0.6 - level * 0.05) {
gemType = 1; // Common gem
} else if (gemRoll < 0.9 - level * 0.03) {
gemType = 2; // Uncommon gem
} else {
gemType = 3; // Rare gem
}
}
var dirt = new Dirt(dirtType, gemType);
dirt.x = GRID_PADDING_X + col * CELL_SIZE + CELL_SIZE / 2;
dirt.y = GRID_PADDING_Y + row * CELL_SIZE + CELL_SIZE / 2;
grid[row][col] = dirt;
game.addChild(dirt);
}
}
}
function attemptDig(x, y) {
if (digger.digging) {
return;
}
// Find the grid cell that was clicked
for (var row = 0; row < grid.length; row++) {
for (var col = 0; col < grid[row].length; col++) {
var cell = grid[row][col];
// Check if click is within this cell
if (Math.abs(x - cell.x) < CELL_SIZE / 2 && Math.abs(y - cell.y) < CELL_SIZE / 2) {
// Move digger to this cell
digger.startDig(cell.x, cell.y);
// Play dig sound
LK.getSound('dig').play();
// Attempt to dig the dirt
var gemRevealed = cell.dig(digger.digStrength);
if (gemRevealed) {
// Check if all gems have been collected to advance level
checkLevelComplete();
}
return;
}
}
}
}
function collectGem(x, y) {
// Find the grid cell that was clicked
for (var row = 0; row < grid.length; row++) {
for (var col = 0; col < grid[row].length; col++) {
var cell = grid[row][col];
// Check if click is within this cell
if (Math.abs(x - cell.x) < CELL_SIZE / 2 && Math.abs(y - cell.y) < CELL_SIZE / 2) {
// Try to collect gem
var gemType = cell.collectGem();
if (gemType > 0) {
// Play collect sound
LK.getSound('collect').play();
// Award points based on gem type
var points = gemType * gemType * 10;
score += points;
// Award coins
coinsCollected += gemType;
coins += gemType;
// Update score display
updateUI();
// Check if all gems have been collected
checkLevelComplete();
return true;
}
}
}
}
return false;
}
function checkLevelComplete() {
// Count remaining gems
var gemsLeft = 0;
for (var row = 0; row < grid.length; row++) {
for (var col = 0; col < grid[row].length; col++) {
var cell = grid[row][col];
if (cell.hasGem && cell.gem && cell.gem.alpha > 0) {
gemsLeft++;
}
}
}
// If no gems left, advance to next level
if (gemsLeft === 0) {
level++;
levelTxt.setText('Level: ' + level);
// Save progress
saveGame();
// Create new grid for next level
createGrid();
}
}
function upgradePick() {
var upgradeCost = pickLevel * 50;
if (coins >= upgradeCost) {
coins -= upgradeCost;
pickLevel++;
digger.upgrade(pickLevel);
// Update UI
upgradeBtn.setText('Upgrade Pick: ' + pickLevel * 50 + ' coins');
coinsTxt.setText('Coins: ' + coins);
// Save upgrade
saveGame();
}
}
function updateUI() {
scoreTxt.setText('Score: ' + score);
coinsTxt.setText('Coins: ' + coins);
}
function saveGame() {
storage.coins = coins;
storage.pickLevel = pickLevel;
}
// Game event handlers
game.down = function (x, y, obj) {
// If player clicks on a gem, collect it
if (!collectGem(x, y)) {
// Otherwise try to dig
attemptDig(x, y);
}
};
// Initialize the game
initGame(); /****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1", {
coins: 0,
pickLevel: 1
});
/****
* Classes
****/
var Digger = Container.expand(function () {
var self = Container.call(this);
var diggerGraphics = self.attachAsset('digger', {
anchorX: 0.5,
anchorY: 0.5
});
self.digging = false;
self.digStrength = 1;
self.startDig = function (targetX, targetY) {
self.digging = true;
self.x = targetX;
self.y = targetY;
// Make digger appear to dig with animation
tween(diggerGraphics, {
rotation: Math.PI * 2
}, {
duration: 500,
easing: tween.easeInOut,
onFinish: function onFinish() {
diggerGraphics.rotation = 0;
self.digging = false;
}
});
};
self.upgrade = function (level) {
self.digStrength = level;
// Visual indication of upgraded digger
diggerGraphics.scaleX = 1 + level * 0.1;
diggerGraphics.scaleY = 1 + level * 0.1;
};
return self;
});
var Dirt = Container.expand(function (type, gemType) {
var self = Container.call(this);
var assetType = type === 'hard' ? 'hardDirt' : 'normalDirt';
var dirtGraphics = self.attachAsset(assetType, {
anchorX: 0.5,
anchorY: 0.5
});
self.health = type === 'hard' ? 3 : 1;
self.originalHealth = self.health;
self.hasGem = gemType > 0;
self.gemType = gemType;
// Reveal gem if this dirt has one
if (self.hasGem) {
var gemAsset = 'gem' + gemType;
var gemGraphics = self.attachAsset(gemAsset, {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0 // Hidden initially
});
self.gem = gemGraphics;
}
self.dig = function (strength) {
self.health -= strength;
if (self.health <= 0) {
// Dirt is completely dug
dirtGraphics.alpha = 0;
// Reveal gem if exists
if (self.hasGem && self.gem) {
self.gem.alpha = 1;
return true;
}
} else {
// Visual feedback that dirt is being dug
dirtGraphics.alpha = self.health / self.originalHealth;
}
return false;
};
self.collectGem = function () {
if (self.hasGem && self.gem && self.gem.alpha > 0) {
self.gem.alpha = 0;
return self.gemType;
}
return 0;
};
return self;
});
var GrassTile = Container.expand(function () {
var self = Container.call(this);
var grassGraphics = self.attachAsset('Grass', {
anchorX: 0.5,
anchorY: 0.5
});
// Grass tiles can't be dug
self.dig = function () {
return false;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000000
});
/****
* Game Code
****/
// Game constants
var GRID_WIDTH = 6;
var GRID_HEIGHT = 8;
var CELL_SIZE = 120;
var GRID_PADDING_X = (2048 - GRID_WIDTH * CELL_SIZE) / 2;
var GRID_PADDING_Y = 500;
// Game variables
var digger;
var grid = [];
var score = 0;
var level = 1;
var coinsCollected = 0;
var pickLevel = storage.pickLevel || 1;
var coins = storage.coins || 0;
// UI elements
var scoreTxt;
var levelTxt;
var coinsTxt;
var upgradeBtn;
// Initialize game
function initGame() {
game.setBackgroundColor(0x333333);
// Create header UI
createUI();
// Create digger
digger = new Digger();
digger.x = 2048 / 2;
digger.y = 300;
digger.upgrade(pickLevel);
game.addChild(digger);
// Create initial grid
createGrid();
// Play background music
LK.playMusic('bgmusic');
}
function createUI() {
// Score text
scoreTxt = new Text2('Score: 0', {
size: 60,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0, 0);
scoreTxt.x = 150;
scoreTxt.y = 50;
LK.gui.addChild(scoreTxt);
// Level text
levelTxt = new Text2('Level: 1', {
size: 60,
fill: 0xFFFFFF
});
levelTxt.anchor.set(0.5, 0);
levelTxt.x = 2048 / 2;
levelTxt.y = 50;
LK.gui.addChild(levelTxt);
// Coins text
coinsTxt = new Text2('Coins: ' + coins, {
size: 60,
fill: 0xFFFF00
});
coinsTxt.anchor.set(1, 0);
coinsTxt.x = 2048 - 150;
coinsTxt.y = 50;
LK.gui.addChild(coinsTxt);
// Upgrade button
var buttonText = 'Upgrade Pick: ' + pickLevel * 50 + ' coins';
upgradeBtn = new Text2(buttonText, {
size: 50,
fill: 0x00FF00
});
upgradeBtn.anchor.set(0.5, 0);
upgradeBtn.x = 2048 / 2;
upgradeBtn.y = 150;
upgradeBtn.interactive = true;
upgradeBtn.down = function () {
upgradePick();
};
LK.gui.addChild(upgradeBtn);
}
function createGrid() {
// Clear existing grid if any
for (var i = 0; i < grid.length; i++) {
for (var j = 0; j < grid[i].length; j++) {
if (grid[i][j]) {
grid[i][j].destroy();
}
}
}
// Create new grid
grid = [];
for (var row = 0; row < GRID_HEIGHT; row++) {
grid[row] = [];
for (var col = 0; col < GRID_WIDTH; col++) {
// For the top row (level one), use grass instead of dirt
if (row === 0) {
// Add grass tile
var grassTile = new Container();
var grassGraphics = grassTile.attachAsset('Grass', {
anchorX: 0.5,
anchorY: 0.5
});
grassTile.x = GRID_PADDING_X + col * CELL_SIZE + CELL_SIZE / 2;
grassTile.y = GRID_PADDING_Y + row * CELL_SIZE + CELL_SIZE / 2;
game.addChild(grassTile);
// Still create the dirt object but make it have no gems
var dirt = new Dirt('normal', 0);
dirt.x = GRID_PADDING_X + col * CELL_SIZE + CELL_SIZE / 2;
dirt.y = GRID_PADDING_Y + row * CELL_SIZE + CELL_SIZE / 2;
dirt.health = 0; // Already dug out
dirt.dig = function () {
return false;
}; // Can't dig grass
grid[row][col] = dirt;
continue;
}
// Regular dirt tiles for all other rows
// Determine dirt type - more hard dirt in higher levels
var isHard = Math.random() < 0.1 * level;
var dirtType = isHard ? 'hard' : 'normal';
// Determine if this cell has a gem - more valuable gems in deeper rows
var gemChance = 0.2 + row / GRID_HEIGHT * 0.3;
var hasGem = Math.random() < gemChance;
var gemType = 0;
if (hasGem) {
// Gems range from 1-3, with better gems having a higher chance in deeper levels
var gemRoll = Math.random();
if (gemRoll < 0.6 - level * 0.05) {
gemType = 1; // Common gem
} else if (gemRoll < 0.9 - level * 0.03) {
gemType = 2; // Uncommon gem
} else {
gemType = 3; // Rare gem
}
}
var dirt = new Dirt(dirtType, gemType);
dirt.x = GRID_PADDING_X + col * CELL_SIZE + CELL_SIZE / 2;
dirt.y = GRID_PADDING_Y + row * CELL_SIZE + CELL_SIZE / 2;
grid[row][col] = dirt;
game.addChild(dirt);
}
}
}
function attemptDig(x, y) {
if (digger.digging) {
return;
}
// Find the grid cell that was clicked
for (var row = 0; row < grid.length; row++) {
for (var col = 0; col < grid[row].length; col++) {
var cell = grid[row][col];
// Check if click is within this cell
if (Math.abs(x - cell.x) < CELL_SIZE / 2 && Math.abs(y - cell.y) < CELL_SIZE / 2) {
// Move digger to this cell
digger.startDig(cell.x, cell.y);
// Play dig sound
LK.getSound('dig').play();
// Attempt to dig the dirt
var gemRevealed = cell.dig(digger.digStrength);
if (gemRevealed) {
// Check if all gems have been collected to advance level
checkLevelComplete();
}
return;
}
}
}
}
function collectGem(x, y) {
// Find the grid cell that was clicked
for (var row = 0; row < grid.length; row++) {
for (var col = 0; col < grid[row].length; col++) {
var cell = grid[row][col];
// Check if click is within this cell
if (Math.abs(x - cell.x) < CELL_SIZE / 2 && Math.abs(y - cell.y) < CELL_SIZE / 2) {
// Try to collect gem
var gemType = cell.collectGem();
if (gemType > 0) {
// Play collect sound
LK.getSound('collect').play();
// Award points based on gem type
var points = gemType * gemType * 10;
score += points;
// Award coins
coinsCollected += gemType;
coins += gemType;
// Update score display
updateUI();
// Check if all gems have been collected
checkLevelComplete();
return true;
}
}
}
}
return false;
}
function checkLevelComplete() {
// Count remaining gems
var gemsLeft = 0;
for (var row = 0; row < grid.length; row++) {
for (var col = 0; col < grid[row].length; col++) {
var cell = grid[row][col];
if (cell.hasGem && cell.gem && cell.gem.alpha > 0) {
gemsLeft++;
}
}
}
// If no gems left, advance to next level
if (gemsLeft === 0) {
level++;
levelTxt.setText('Level: ' + level);
// Save progress
saveGame();
// Create new grid for next level
createGrid();
}
}
function upgradePick() {
var upgradeCost = pickLevel * 50;
if (coins >= upgradeCost) {
coins -= upgradeCost;
pickLevel++;
digger.upgrade(pickLevel);
// Update UI
upgradeBtn.setText('Upgrade Pick: ' + pickLevel * 50 + ' coins');
coinsTxt.setText('Coins: ' + coins);
// Save upgrade
saveGame();
}
}
function updateUI() {
scoreTxt.setText('Score: ' + score);
coinsTxt.setText('Coins: ' + coins);
}
function saveGame() {
storage.coins = coins;
storage.pickLevel = pickLevel;
}
// Game event handlers
game.down = function (x, y, obj) {
// If player clicks on a gem, collect it
if (!collectGem(x, y)) {
// Otherwise try to dig
attemptDig(x, y);
}
};
// Initialize the game
initGame();