Code edit (3 edits merged)
Please save this source code
User prompt
change the game mechanism instead of explorer moving add jumping mechanism
Code edit (1 edits merged)
Please save this source code
User prompt
change the game mechanism instead of explorer moving add jumping mechanism
User prompt
still its moving not jumping
User prompt
my game concept is when i click the left mouse button the explorer should be jump every time which direction i click the mouse
User prompt
when i click on left mouse button instead of moving explorer add jump action
User prompt
spawn those game elements random distance in the game
User prompt
fix the bug those game element pickups that can't able to touch by the explorer
Code edit (1 edits merged)
Please save this source code
User prompt
when i click the right mouse button then the explorer should be jump
User prompt
is it possible can i add fly option for the explorer
User prompt
when i click my mouse in a direction then the explorer has to move automatically that way when i again the click the mouse direction
User prompt
change the floor color should be in the Wooden Textures color
User prompt
change the floor color should be in the Light Brown / Wooden Textures color
User prompt
change the floor color should be in the Gray / Concrete color
User prompt
change the floor color should be in the yellow color
User prompt
change the floor color should be in the baby yellow color
User prompt
change the floor color should be in the light red color
User prompt
change the floor color should be in the baby red color
User prompt
change the floor color should be in the purple color
User prompt
change the floor color shouid be in the gold color
User prompt
change the floor color shouid be in the white color
User prompt
i want to change the floor color
User prompt
create a background effect
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1", { level: 1, collectedKeys: 0, lives: 3 }); /**** * Classes ****/ var Boom = Container.expand(function () { var self = Container.call(this); var boomGraphics = self.attachAsset('boom', { anchorX: 0.5, anchorY: 0.5 }); self.explode = function () { tween(boomGraphics, { scaleX: 2, scaleY: 2, alpha: 0 }, { duration: 500, onFinish: function onFinish() { self.destroy(); } }); }; return self; }); var Diamond = Container.expand(function () { var self = Container.call(this); var diamondGraphics = self.attachAsset('diamond', { anchorX: 0.5, anchorY: 0.5 }); self.isCollected = false; self.collect = function () { if (!self.isCollected) { self.isCollected = true; tween(diamondGraphics, { scaleX: 1.3, scaleY: 1.3 }, { duration: 300, onFinish: function onFinish() { self.destroy(); } }); LK.setScore(LK.getScore() + 30); // Diamonds give 30 points LK.getSound('collect').play(); } }; self.update = function () { if (!self.isCollected) { // Shine animation var glowIntensity = (Math.sin(LK.ticks / 30) + 1) / 2; diamondGraphics.alpha = 0.7 + glowIntensity * 0.3; } }; return self; }); var Explorer = Container.expand(function () { var self = Container.call(this); self.moveFreely = function (direction) { if (!self.isMoving) { var currentGridPos = getGridPosition(self.x, self.y); var targetGridPos = { x: currentGridPos.x, y: currentGridPos.y }; switch (direction) { case 'up': targetGridPos.y -= 1; break; case 'down': targetGridPos.y += 1; break; case 'left': targetGridPos.x -= 1; break; case 'right': targetGridPos.x += 1; break; } if (isWalkable(targetGridPos.x, targetGridPos.y)) { var cellCenterX = targetGridPos.x * tileSize + tileSize / 2; var cellCenterY = targetGridPos.y * tileSize + tileSize / 2; self.moveToward(cellCenterX, cellCenterY); } } }; var explorerGraphics = self.attachAsset('explorer', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 10; self.isMoving = false; self.direction = null; self.targetX = 0; self.targetY = 0; self.hasKey = false; self.moveToward = function (x, y) { self.isMoving = true; self.targetX = x; self.targetY = y; // Calculate direction var dx = self.targetX - self.x; var dy = self.targetY - self.y; // Determine primary direction based on larger delta if (Math.abs(dx) > Math.abs(dy)) { self.direction = dx > 0 ? 'right' : 'left'; } else { self.direction = dy > 0 ? 'down' : 'up'; } }; self.stopMoving = function () { self.isMoving = false; self.direction = null; }; self.update = function () { if (self.isMoving) { var dx = self.targetX - self.x; var dy = self.targetY - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance < self.speed) { self.x = self.targetX; self.y = self.targetY; self.stopMoving(); } else { var ratio = self.speed / distance; self.x += dx * ratio; self.y += dy * ratio; } } }; self.collectKey = function () { self.hasKey = true; tween(explorerGraphics, { tint: 0xFFD700 }, { duration: 300, onFinish: function onFinish() { tween(explorerGraphics, { tint: 0xFFFFFF }, { duration: 300 }); } }); }; self.useKey = function () { self.hasKey = false; storage.collectedKeys++; }; self.takeDamage = function () { LK.effects.flashObject(self, 0xFF0000, 500); storage.lives--; LK.getSound('damage').play(); if (storage.lives <= 0) { LK.showGameOver(); } }; return self; }); var Key = Container.expand(function () { var self = Container.call(this); var keyGraphics = self.attachAsset('key', { anchorX: 0.5, anchorY: 0.5 }); self.isCollected = false; self.collect = function () { if (!self.isCollected) { self.isCollected = true; tween(keyGraphics, { scaleX: 1.3, scaleY: 1.3 }, { duration: 300, onFinish: function onFinish() { self.destroy(); } }); LK.setScore(LK.getScore() + 10); // Keys give 10 points LK.getSound('collect').play(); } }; self.update = function () { if (!self.isCollected) { var glowIntensity = (Math.sin(LK.ticks / 30) + 1) / 2; keyGraphics.alpha = 0.7 + glowIntensity * 0.3; } }; return self; }); var Treasure = Container.expand(function () { var self = Container.call(this); var treasureGraphics = self.attachAsset('treasure', { anchorX: 0.5, anchorY: 0.5 }); self.isCollected = false; self.collect = function () { if (!self.isCollected) { self.isCollected = true; tween(treasureGraphics, { scaleX: 1.3, scaleY: 1.3 }, { duration: 300, onFinish: function onFinish() { self.destroy(); } }); LK.setScore(LK.getScore() + 50); LK.getSound('collectTreasure').play(); LK.getSound('boom').play(); // Check if all treasures are collected var allCollected = true; for (var i = 0; i < treasures.length; i++) { if (!treasures[i].isCollected) { allCollected = false; break; } } // Removed game end condition when all treasures are collected } }; self.update = function () { if (!self.isCollected) { // Shine animation var glowIntensity = (Math.sin(LK.ticks / 30) + 1) / 2; treasureGraphics.alpha = 0.7 + glowIntensity * 0.3; } }; return self; }); var Wall = Container.expand(function () { var self = Container.call(this); var wallGraphics = self.attachAsset('wall', { anchorX: 0.5, anchorY: 0.5 }); return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x607D8B // Cave-like dark blue-gray }); /**** * Game Code ****/ function spawnAdditionalKeysAndTreasures() { var backgroundColors = [0x607D8B, 0xFF5722, 0x4CAF50, 0x2196F3, 0xFFC107]; // Array of colors for background effect var currentBackgroundIndex = 0; // Index to track current background color var backgroundChangeInterval = 5000; // Time interval for background color change in milliseconds // Function to change background color function changeBackgroundColor() { currentBackgroundIndex = (currentBackgroundIndex + 1) % backgroundColors.length; game.setBackgroundColor(backgroundColors[currentBackgroundIndex]); } // Set interval to change background color LK.setInterval(changeBackgroundColor, backgroundChangeInterval); var possiblePositions = [{ x: 3, y: 3 }, { x: 7, y: 7 }, { x: 12, y: 12 }, { x: 15, y: 15 } // Add more positions as needed ]; // Randomly select positions for new keys and treasures possiblePositions.forEach(function (pos) { if (Math.random() > 0.5) { // Spawn a key var key = new Key(); key.x = pos.x * tileSize + tileSize / 2; key.y = pos.y * tileSize + tileSize / 2; key.y = explorer.y; // Ensure key is on the same floor level as the explorer game.addChild(key); keys.push(key); } else { // Spawn a treasure var treasure = new Treasure(); treasure.x = pos.x * tileSize + tileSize / 2; treasure.y = pos.y * tileSize + tileSize / 2; treasure.y = explorer.y; // Ensure treasure is on the same floor level as the explorer game.addChild(treasure); treasures.push(treasure); } }); } function shouldRemoveWall(x, y) { // Define conditions to remove walls, e.g., based on position // Example: Remove walls at specific coordinates var removablePositions = [{ x: 5, y: 5 }, { x: 10, y: 10 } // Add more positions as needed ]; return removablePositions.some(function (pos) { return pos.x === x && pos.y === y; }); } // New diamond asset // Game variables var keys = []; var lastCelebratedScore = 0; var tileSize = 100; var gridWidth = 20; var gridHeight = 27; var explorer; var walls = []; var diamonds = []; var doors = []; var treasures = []; var spikes = []; var diamonds = []; var fallingRocks = []; var levelGrid = []; var gameStarted = false; // UI Elements var scoreTxt = new Text2('0', { size: 80, fill: 0xFFFFFF }); var levelTxt = new Text2('Level: ' + storage.level, { size: 60, fill: 0xFFFFFF }); var keysTxt = new Text2('Keys: ' + storage.collectedKeys, { size: 60, fill: 0xFFD700 }); var livesTxt = new Text2('Lives: ' + storage.lives, { size: 60, fill: 0xFF5252 }); // Initialize game function initializeGame() { // Clear previous game elements resetGameElements(); // Generate level based on current level generateLevel(storage.level); // Initialize explorer createExplorer(); // Setup UI setupUI(); // Start game gameStarted = true; // Play background music with fade-in effect LK.playMusic('caveMusic', { fade: { start: 0, end: 0.5, duration: 1000 } }); } function resetGameElements() { // Remove all existing game elements for (var i = 0; i < walls.length; i++) { walls[i].destroy(); } walls = []; for (var i = 0; i < diamonds.length; i++) { diamonds[i].destroy(); } diamonds = []; for (var i = 0; i < treasures.length; i++) { treasures[i].destroy(); } treasures = []; for (var i = 0; i < fallingRocks.length; i++) { fallingRocks[i].destroy(); } fallingRocks = []; levelGrid = []; if (explorer) { explorer.destroy(); explorer = null; } } function createExplorer() { explorer = new Explorer(); game.addChild(explorer); // Position explorer at start position for (var y = 0; y < gridHeight; y++) { for (var x = 0; x < gridWidth; x++) { if (levelGrid[y][x] === 'S') { explorer.x = x * tileSize + tileSize / 2; explorer.y = y * tileSize + tileSize / 2; break; } } } } function setupUI() { // Setup collection title var collectionTitleTxt = new Text2('Collection:', { size: 60, fill: 0xFFD700, // Gold color fontWeight: 'bold' // Add bold font }); collectionTitleTxt.anchor.set(1, 0); LK.gui.topRight.addChild(collectionTitleTxt); scoreTxt.setText(LK.getScore()); scoreTxt.anchor.set(1, 0); scoreTxt.y = 60; // Adjust position to be below the title LK.gui.topRight.addChild(scoreTxt); // Setup level text levelTxt.setText('Level: ' + storage.level); levelTxt.anchor.set(0.5, 0); levelTxt.y = 80; LK.gui.top.addChild(levelTxt); // Setup keys text keysTxt.setText('Keys: ' + storage.collectedKeys); keysTxt.anchor.set(0, 0); keysTxt.y = 80; LK.gui.topRight.addChild(keysTxt); // Setup lives text livesTxt.setText('Lives: ' + storage.lives); livesTxt.anchor.set(0, 0); LK.gui.topRight.addChild(livesTxt); } function generateLevel(level) { // Define different level layouts var layouts = []; // Level 1: Simple tutorial level layouts[1] = ["WWWWWWWWWWWWWWWWWWWW", "W W W", "W WWWWWW W WWWWWWW W", "W W K W W", "W W WWWWWWWWWWWW W W", "W W W W W", "W W W WWWWWWWWWW W W", "W W W W W W W", "W W W W WWWWWW W W W", "W W W W W W W W W", "W W W W W WW W W W W", "W W W W W W W W", "W WWWWW WWWWWWWW W W", "W W W", "W WWWWWWWWWWWWWWWW W", "W W", "W WWWWWWWW WWWWWWW W", "W W W W W", "W W WWWW WWWWWWW W W", "W W W W W W", "W W W WWWWWWWWW W W W", "W W W W W W W", "W W WWWWWWWWW W W W W", " DW W W W W", "W WWWWWWWWWW TST ", "W W W", "WWWWWWWWWWWWWWWWWWWWW"]; var currentLayout = layouts[1]; // Parse level layout for (var y = 0; y < currentLayout.length; y++) { levelGrid[y] = []; for (var x = 0; x < currentLayout[y].length; x++) { var cellType = currentLayout[y][x]; levelGrid[y][x] = cellType; var xPos = x * tileSize + tileSize / 2; var Pos = xPos; // Define Pos variable var yPos = y * tileSize + tileSize / 2; switch (cellType) { case 'W': // Wall if (!shouldRemoveWall(x, y)) { var wall = new Wall(); wall.x = Pos; wall.y = yPos; game.addChild(wall); walls.push(wall); } else { // Log or handle the removal of the wall for debugging or game design purposes console.log("Wall at (".concat(x, ", ").concat(y, ") removed to clear the path.")); } break; case 'K': // Diamond var diamond = new Diamond(); diamond.x = xPos; diamond.y = yPos; game.addChild(diamond); diamonds.push(diamond); break; case 'T': // Treasure var treasure = new Treasure(); treasure.x = xPos; treasure.y = yPos; game.addChild(treasure); treasures.push(treasure); break; case 'D': // Diamond var diamond = new Diamond(); diamond.x = xPos; diamond.y = yPos; game.addChild(diamond); diamonds.push(diamond); break; } } } } function getGridPosition(x, y) { var gridX = Math.floor(x / tileSize); var gridY = Math.floor(y / tileSize); if (gridX >= 0 && gridX < gridWidth && gridY >= 0 && gridY < gridHeight) { return { x: gridX, y: gridY }; } return null; } function isWalkable(gridX, gridY) { if (gridX < 0 || gridX >= gridWidth || gridY < 0 || gridY >= gridHeight) { return false; } var cellType = levelGrid[gridY][gridX]; // Check if cell is walkable if (cellType === 'W') { return false; } return true; } function getDoorAt(gridX, gridY) { for (var i = 0; i < doors.length; i++) { var doorPos = getGridPosition(doors[i].x, doors[i].y); if (doorPos && doorPos.x === gridX && doorPos.y === gridY) { return doors[i]; } } return null; } function getRiverAt(gridX, gridY) { for (var i = 0; i < rivers.length; i++) { var riverPos = getGridPosition(rivers[i].x, rivers[i].y); if (riverPos && riverPos.x === gridX && riverPos.y === gridY) { return rivers[i]; } } return null; } // Update UI function updateUI() { scoreTxt.setText(LK.getScore()); levelTxt.setText('Level: ' + storage.level); keysTxt.setText('Keys: ' + storage.collectedKeys); livesTxt.setText('Lives: ' + storage.lives); } // Check for collisions function checkCollisions() { if (!explorer) { return; } var explorerPos = getGridPosition(explorer.x, explorer.y); if (!explorerPos) { return; } var cellType = levelGrid[explorerPos.y][explorerPos.x]; // Check diamond collision if (cellType === 'K') { for (var i = 0; i < diamonds.length; i++) { var diamondPos = getGridPosition(diamonds[i].x, diamonds[i].y); if (diamondPos && diamondPos.x === explorerPos.x && diamondPos.y === explorerPos.y) { explorer.collectKey(); diamonds[i].destroy(); diamonds.splice(i, 1); levelGrid[explorerPos.y][explorerPos.x] = ' '; LK.getSound('collect').play(); LK.getSound('boom').play(); LK.getSound('boom').play(); // Check if explorer has collected a key, diamond, and a treasure if (explorer.hasKey && diamonds.some(function (d) { return d.isCollected; }) && treasures.some(function (t) { return t.isCollected; })) { spawnAdditionalKeysAndTreasures(); // Trigger boom effect var boom = new Boom(); boom.x = explorer.x; boom.y = explorer.y; game.addChild(boom); boom.explode(); } break; } } } // Check treasure collision if (cellType === 'T') { for (var i = 0; i < treasures.length; i++) { var treasurePos = getGridPosition(treasures[i].x, treasures[i].y); if (treasurePos && treasurePos.x === explorerPos.x && treasurePos.y === explorerPos.y && !treasures[i].isCollected) { treasures[i].collect(); break; } } } // Check diamond collision for (var i = 0; i < diamonds.length; i++) { var diamondPos = getGridPosition(diamonds[i].x, diamonds[i].y); if (diamondPos && diamondPos.x === explorerPos.x && diamondPos.y === explorerPos.y && !diamonds[i].isCollected) { diamonds[i].collect(); break; } } } function moveExplorer(targetX, targetY) { if (!explorer || explorer.isMoving) { return; } var currentGridPos = getGridPosition(explorer.x, explorer.y); var targetGridPos = getGridPosition(targetX, targetY); if (!currentGridPos || !targetGridPos) { return; } // Use pathfinding to find a path to the target var path = findPath(currentGridPos, targetGridPos); if (path && path.length > 0) { var nextStep = path[0]; var cellCenterX = nextStep.x * tileSize + tileSize / 2; var cellCenterY = nextStep.y * tileSize + tileSize / 2; explorer.moveToward(cellCenterX, cellCenterY); } // Check if the explorer is at the diamond's position if (levelGrid[currentGridPos.y][currentGridPos.x] === 'K') { explorer.collectKey(); for (var i = 0; i < diamonds.length; i++) { var diamondPos = getGridPosition(diamonds[i].x, diamonds[i].y); if (diamondPos && diamondPos.x === currentGridPos.x && diamondPos.y === currentGridPos.y) { diamonds[i].destroy(); diamonds.splice(i, 1); levelGrid[currentGridPos.y][currentGridPos.x] = ' '; LK.getSound('collect').play(); break; } } } } function findPath(start, end) { // Implement a simple pathfinding algorithm, e.g., A* or BFS // This is a placeholder for the pathfinding logic // Return an array of grid positions from start to end return []; } // Handle touch/mouse events function handleGameInput(x, y, obj) { if (!gameStarted) { return; } var direction = null; var currentGridPos = getGridPosition(explorer.x, explorer.y); var targetGridPos = getGridPosition(x, y); if (targetGridPos) { if (targetGridPos.x < currentGridPos.x) { direction = 'left'; } else if (targetGridPos.x > currentGridPos.x) { direction = 'right'; } else if (targetGridPos.y < currentGridPos.y) { direction = 'up'; } else if (targetGridPos.y > currentGridPos.y) { direction = 'down'; } if (direction) { explorer.moveFreely(direction); } } } // Start game when page loads initializeGame(); // Handle touch/mouse events game.down = handleGameInput; // Game update loop game.update = function () { if (!gameStarted) { return; } // Update UI updateUI(); // Check collisions checkCollisions(); // Check for score milestones and trigger celebration var currentScore = LK.getScore(); if (currentScore % 100 === 0 && currentScore !== 0 && currentScore !== lastCelebratedScore) { lastCelebratedScore = currentScore; // Play boom sound LK.getSound('boom').play(); // Display congratulations message var message = new Text2("Congratulations! You crossed ".concat(currentScore, "!"), { size: 100, fill: 0xFFD700, fontWeight: 'bold' }); message.anchor.set(0.5, 0.5); message.x = 2048 / 2; message.y = 2732 / 2; game.addChild(message); // Remove message after 4 seconds LK.setTimeout(function () { message.destroy(); }, 4000); // Trigger color paper blast effect in big size var color = 0xFFD700; // Gold color var paper = new Container(); var paperGraphics = paper.attachAsset('boom', { anchorX: 0.5, anchorY: 0.5 }); paperGraphics.tint = color; paper.x = 2048 / 2; paper.y = 2732 / 2; game.addChild(paper); tween(paperGraphics, { scaleX: 20, // Increase size for a much bigger effect scaleY: 20, // Increase size for a much bigger effect // Increase size for a bigger effect // Increase size for a bigger effect alpha: 0 }, { duration: 4000, onFinish: function onFinish() { paper.destroy(); } }); } };
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1", {
level: 1,
collectedKeys: 0,
lives: 3
});
/****
* Classes
****/
var Boom = Container.expand(function () {
var self = Container.call(this);
var boomGraphics = self.attachAsset('boom', {
anchorX: 0.5,
anchorY: 0.5
});
self.explode = function () {
tween(boomGraphics, {
scaleX: 2,
scaleY: 2,
alpha: 0
}, {
duration: 500,
onFinish: function onFinish() {
self.destroy();
}
});
};
return self;
});
var Diamond = Container.expand(function () {
var self = Container.call(this);
var diamondGraphics = self.attachAsset('diamond', {
anchorX: 0.5,
anchorY: 0.5
});
self.isCollected = false;
self.collect = function () {
if (!self.isCollected) {
self.isCollected = true;
tween(diamondGraphics, {
scaleX: 1.3,
scaleY: 1.3
}, {
duration: 300,
onFinish: function onFinish() {
self.destroy();
}
});
LK.setScore(LK.getScore() + 30); // Diamonds give 30 points
LK.getSound('collect').play();
}
};
self.update = function () {
if (!self.isCollected) {
// Shine animation
var glowIntensity = (Math.sin(LK.ticks / 30) + 1) / 2;
diamondGraphics.alpha = 0.7 + glowIntensity * 0.3;
}
};
return self;
});
var Explorer = Container.expand(function () {
var self = Container.call(this);
self.moveFreely = function (direction) {
if (!self.isMoving) {
var currentGridPos = getGridPosition(self.x, self.y);
var targetGridPos = {
x: currentGridPos.x,
y: currentGridPos.y
};
switch (direction) {
case 'up':
targetGridPos.y -= 1;
break;
case 'down':
targetGridPos.y += 1;
break;
case 'left':
targetGridPos.x -= 1;
break;
case 'right':
targetGridPos.x += 1;
break;
}
if (isWalkable(targetGridPos.x, targetGridPos.y)) {
var cellCenterX = targetGridPos.x * tileSize + tileSize / 2;
var cellCenterY = targetGridPos.y * tileSize + tileSize / 2;
self.moveToward(cellCenterX, cellCenterY);
}
}
};
var explorerGraphics = self.attachAsset('explorer', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 10;
self.isMoving = false;
self.direction = null;
self.targetX = 0;
self.targetY = 0;
self.hasKey = false;
self.moveToward = function (x, y) {
self.isMoving = true;
self.targetX = x;
self.targetY = y;
// Calculate direction
var dx = self.targetX - self.x;
var dy = self.targetY - self.y;
// Determine primary direction based on larger delta
if (Math.abs(dx) > Math.abs(dy)) {
self.direction = dx > 0 ? 'right' : 'left';
} else {
self.direction = dy > 0 ? 'down' : 'up';
}
};
self.stopMoving = function () {
self.isMoving = false;
self.direction = null;
};
self.update = function () {
if (self.isMoving) {
var dx = self.targetX - self.x;
var dy = self.targetY - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance < self.speed) {
self.x = self.targetX;
self.y = self.targetY;
self.stopMoving();
} else {
var ratio = self.speed / distance;
self.x += dx * ratio;
self.y += dy * ratio;
}
}
};
self.collectKey = function () {
self.hasKey = true;
tween(explorerGraphics, {
tint: 0xFFD700
}, {
duration: 300,
onFinish: function onFinish() {
tween(explorerGraphics, {
tint: 0xFFFFFF
}, {
duration: 300
});
}
});
};
self.useKey = function () {
self.hasKey = false;
storage.collectedKeys++;
};
self.takeDamage = function () {
LK.effects.flashObject(self, 0xFF0000, 500);
storage.lives--;
LK.getSound('damage').play();
if (storage.lives <= 0) {
LK.showGameOver();
}
};
return self;
});
var Key = Container.expand(function () {
var self = Container.call(this);
var keyGraphics = self.attachAsset('key', {
anchorX: 0.5,
anchorY: 0.5
});
self.isCollected = false;
self.collect = function () {
if (!self.isCollected) {
self.isCollected = true;
tween(keyGraphics, {
scaleX: 1.3,
scaleY: 1.3
}, {
duration: 300,
onFinish: function onFinish() {
self.destroy();
}
});
LK.setScore(LK.getScore() + 10); // Keys give 10 points
LK.getSound('collect').play();
}
};
self.update = function () {
if (!self.isCollected) {
var glowIntensity = (Math.sin(LK.ticks / 30) + 1) / 2;
keyGraphics.alpha = 0.7 + glowIntensity * 0.3;
}
};
return self;
});
var Treasure = Container.expand(function () {
var self = Container.call(this);
var treasureGraphics = self.attachAsset('treasure', {
anchorX: 0.5,
anchorY: 0.5
});
self.isCollected = false;
self.collect = function () {
if (!self.isCollected) {
self.isCollected = true;
tween(treasureGraphics, {
scaleX: 1.3,
scaleY: 1.3
}, {
duration: 300,
onFinish: function onFinish() {
self.destroy();
}
});
LK.setScore(LK.getScore() + 50);
LK.getSound('collectTreasure').play();
LK.getSound('boom').play();
// Check if all treasures are collected
var allCollected = true;
for (var i = 0; i < treasures.length; i++) {
if (!treasures[i].isCollected) {
allCollected = false;
break;
}
}
// Removed game end condition when all treasures are collected
}
};
self.update = function () {
if (!self.isCollected) {
// Shine animation
var glowIntensity = (Math.sin(LK.ticks / 30) + 1) / 2;
treasureGraphics.alpha = 0.7 + glowIntensity * 0.3;
}
};
return self;
});
var Wall = Container.expand(function () {
var self = Container.call(this);
var wallGraphics = self.attachAsset('wall', {
anchorX: 0.5,
anchorY: 0.5
});
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x607D8B // Cave-like dark blue-gray
});
/****
* Game Code
****/
function spawnAdditionalKeysAndTreasures() {
var backgroundColors = [0x607D8B, 0xFF5722, 0x4CAF50, 0x2196F3, 0xFFC107]; // Array of colors for background effect
var currentBackgroundIndex = 0; // Index to track current background color
var backgroundChangeInterval = 5000; // Time interval for background color change in milliseconds
// Function to change background color
function changeBackgroundColor() {
currentBackgroundIndex = (currentBackgroundIndex + 1) % backgroundColors.length;
game.setBackgroundColor(backgroundColors[currentBackgroundIndex]);
}
// Set interval to change background color
LK.setInterval(changeBackgroundColor, backgroundChangeInterval);
var possiblePositions = [{
x: 3,
y: 3
}, {
x: 7,
y: 7
}, {
x: 12,
y: 12
}, {
x: 15,
y: 15
}
// Add more positions as needed
];
// Randomly select positions for new keys and treasures
possiblePositions.forEach(function (pos) {
if (Math.random() > 0.5) {
// Spawn a key
var key = new Key();
key.x = pos.x * tileSize + tileSize / 2;
key.y = pos.y * tileSize + tileSize / 2;
key.y = explorer.y; // Ensure key is on the same floor level as the explorer
game.addChild(key);
keys.push(key);
} else {
// Spawn a treasure
var treasure = new Treasure();
treasure.x = pos.x * tileSize + tileSize / 2;
treasure.y = pos.y * tileSize + tileSize / 2;
treasure.y = explorer.y; // Ensure treasure is on the same floor level as the explorer
game.addChild(treasure);
treasures.push(treasure);
}
});
}
function shouldRemoveWall(x, y) {
// Define conditions to remove walls, e.g., based on position
// Example: Remove walls at specific coordinates
var removablePositions = [{
x: 5,
y: 5
}, {
x: 10,
y: 10
}
// Add more positions as needed
];
return removablePositions.some(function (pos) {
return pos.x === x && pos.y === y;
});
}
// New diamond asset
// Game variables
var keys = [];
var lastCelebratedScore = 0;
var tileSize = 100;
var gridWidth = 20;
var gridHeight = 27;
var explorer;
var walls = [];
var diamonds = [];
var doors = [];
var treasures = [];
var spikes = [];
var diamonds = [];
var fallingRocks = [];
var levelGrid = [];
var gameStarted = false;
// UI Elements
var scoreTxt = new Text2('0', {
size: 80,
fill: 0xFFFFFF
});
var levelTxt = new Text2('Level: ' + storage.level, {
size: 60,
fill: 0xFFFFFF
});
var keysTxt = new Text2('Keys: ' + storage.collectedKeys, {
size: 60,
fill: 0xFFD700
});
var livesTxt = new Text2('Lives: ' + storage.lives, {
size: 60,
fill: 0xFF5252
});
// Initialize game
function initializeGame() {
// Clear previous game elements
resetGameElements();
// Generate level based on current level
generateLevel(storage.level);
// Initialize explorer
createExplorer();
// Setup UI
setupUI();
// Start game
gameStarted = true;
// Play background music with fade-in effect
LK.playMusic('caveMusic', {
fade: {
start: 0,
end: 0.5,
duration: 1000
}
});
}
function resetGameElements() {
// Remove all existing game elements
for (var i = 0; i < walls.length; i++) {
walls[i].destroy();
}
walls = [];
for (var i = 0; i < diamonds.length; i++) {
diamonds[i].destroy();
}
diamonds = [];
for (var i = 0; i < treasures.length; i++) {
treasures[i].destroy();
}
treasures = [];
for (var i = 0; i < fallingRocks.length; i++) {
fallingRocks[i].destroy();
}
fallingRocks = [];
levelGrid = [];
if (explorer) {
explorer.destroy();
explorer = null;
}
}
function createExplorer() {
explorer = new Explorer();
game.addChild(explorer);
// Position explorer at start position
for (var y = 0; y < gridHeight; y++) {
for (var x = 0; x < gridWidth; x++) {
if (levelGrid[y][x] === 'S') {
explorer.x = x * tileSize + tileSize / 2;
explorer.y = y * tileSize + tileSize / 2;
break;
}
}
}
}
function setupUI() {
// Setup collection title
var collectionTitleTxt = new Text2('Collection:', {
size: 60,
fill: 0xFFD700,
// Gold color
fontWeight: 'bold' // Add bold font
});
collectionTitleTxt.anchor.set(1, 0);
LK.gui.topRight.addChild(collectionTitleTxt);
scoreTxt.setText(LK.getScore());
scoreTxt.anchor.set(1, 0);
scoreTxt.y = 60; // Adjust position to be below the title
LK.gui.topRight.addChild(scoreTxt);
// Setup level text
levelTxt.setText('Level: ' + storage.level);
levelTxt.anchor.set(0.5, 0);
levelTxt.y = 80;
LK.gui.top.addChild(levelTxt);
// Setup keys text
keysTxt.setText('Keys: ' + storage.collectedKeys);
keysTxt.anchor.set(0, 0);
keysTxt.y = 80;
LK.gui.topRight.addChild(keysTxt);
// Setup lives text
livesTxt.setText('Lives: ' + storage.lives);
livesTxt.anchor.set(0, 0);
LK.gui.topRight.addChild(livesTxt);
}
function generateLevel(level) {
// Define different level layouts
var layouts = [];
// Level 1: Simple tutorial level
layouts[1] = ["WWWWWWWWWWWWWWWWWWWW", "W W W", "W WWWWWW W WWWWWWW W", "W W K W W", "W W WWWWWWWWWWWW W W", "W W W W W", "W W W WWWWWWWWWW W W", "W W W W W W W", "W W W W WWWWWW W W W", "W W W W W W W W W", "W W W W W WW W W W W", "W W W W W W W W", "W WWWWW WWWWWWWW W W", "W W W", "W WWWWWWWWWWWWWWWW W", "W W", "W WWWWWWWW WWWWWWW W", "W W W W W", "W W WWWW WWWWWWW W W", "W W W W W W", "W W W WWWWWWWWW W W W", "W W W W W W W", "W W WWWWWWWWW W W W W", " DW W W W W", "W WWWWWWWWWW TST ", "W W W", "WWWWWWWWWWWWWWWWWWWWW"];
var currentLayout = layouts[1];
// Parse level layout
for (var y = 0; y < currentLayout.length; y++) {
levelGrid[y] = [];
for (var x = 0; x < currentLayout[y].length; x++) {
var cellType = currentLayout[y][x];
levelGrid[y][x] = cellType;
var xPos = x * tileSize + tileSize / 2;
var Pos = xPos; // Define Pos variable
var yPos = y * tileSize + tileSize / 2;
switch (cellType) {
case 'W':
// Wall
if (!shouldRemoveWall(x, y)) {
var wall = new Wall();
wall.x = Pos;
wall.y = yPos;
game.addChild(wall);
walls.push(wall);
} else {
// Log or handle the removal of the wall for debugging or game design purposes
console.log("Wall at (".concat(x, ", ").concat(y, ") removed to clear the path."));
}
break;
case 'K':
// Diamond
var diamond = new Diamond();
diamond.x = xPos;
diamond.y = yPos;
game.addChild(diamond);
diamonds.push(diamond);
break;
case 'T':
// Treasure
var treasure = new Treasure();
treasure.x = xPos;
treasure.y = yPos;
game.addChild(treasure);
treasures.push(treasure);
break;
case 'D':
// Diamond
var diamond = new Diamond();
diamond.x = xPos;
diamond.y = yPos;
game.addChild(diamond);
diamonds.push(diamond);
break;
}
}
}
}
function getGridPosition(x, y) {
var gridX = Math.floor(x / tileSize);
var gridY = Math.floor(y / tileSize);
if (gridX >= 0 && gridX < gridWidth && gridY >= 0 && gridY < gridHeight) {
return {
x: gridX,
y: gridY
};
}
return null;
}
function isWalkable(gridX, gridY) {
if (gridX < 0 || gridX >= gridWidth || gridY < 0 || gridY >= gridHeight) {
return false;
}
var cellType = levelGrid[gridY][gridX];
// Check if cell is walkable
if (cellType === 'W') {
return false;
}
return true;
}
function getDoorAt(gridX, gridY) {
for (var i = 0; i < doors.length; i++) {
var doorPos = getGridPosition(doors[i].x, doors[i].y);
if (doorPos && doorPos.x === gridX && doorPos.y === gridY) {
return doors[i];
}
}
return null;
}
function getRiverAt(gridX, gridY) {
for (var i = 0; i < rivers.length; i++) {
var riverPos = getGridPosition(rivers[i].x, rivers[i].y);
if (riverPos && riverPos.x === gridX && riverPos.y === gridY) {
return rivers[i];
}
}
return null;
}
// Update UI
function updateUI() {
scoreTxt.setText(LK.getScore());
levelTxt.setText('Level: ' + storage.level);
keysTxt.setText('Keys: ' + storage.collectedKeys);
livesTxt.setText('Lives: ' + storage.lives);
}
// Check for collisions
function checkCollisions() {
if (!explorer) {
return;
}
var explorerPos = getGridPosition(explorer.x, explorer.y);
if (!explorerPos) {
return;
}
var cellType = levelGrid[explorerPos.y][explorerPos.x];
// Check diamond collision
if (cellType === 'K') {
for (var i = 0; i < diamonds.length; i++) {
var diamondPos = getGridPosition(diamonds[i].x, diamonds[i].y);
if (diamondPos && diamondPos.x === explorerPos.x && diamondPos.y === explorerPos.y) {
explorer.collectKey();
diamonds[i].destroy();
diamonds.splice(i, 1);
levelGrid[explorerPos.y][explorerPos.x] = ' ';
LK.getSound('collect').play();
LK.getSound('boom').play();
LK.getSound('boom').play();
// Check if explorer has collected a key, diamond, and a treasure
if (explorer.hasKey && diamonds.some(function (d) {
return d.isCollected;
}) && treasures.some(function (t) {
return t.isCollected;
})) {
spawnAdditionalKeysAndTreasures();
// Trigger boom effect
var boom = new Boom();
boom.x = explorer.x;
boom.y = explorer.y;
game.addChild(boom);
boom.explode();
}
break;
}
}
}
// Check treasure collision
if (cellType === 'T') {
for (var i = 0; i < treasures.length; i++) {
var treasurePos = getGridPosition(treasures[i].x, treasures[i].y);
if (treasurePos && treasurePos.x === explorerPos.x && treasurePos.y === explorerPos.y && !treasures[i].isCollected) {
treasures[i].collect();
break;
}
}
}
// Check diamond collision
for (var i = 0; i < diamonds.length; i++) {
var diamondPos = getGridPosition(diamonds[i].x, diamonds[i].y);
if (diamondPos && diamondPos.x === explorerPos.x && diamondPos.y === explorerPos.y && !diamonds[i].isCollected) {
diamonds[i].collect();
break;
}
}
}
function moveExplorer(targetX, targetY) {
if (!explorer || explorer.isMoving) {
return;
}
var currentGridPos = getGridPosition(explorer.x, explorer.y);
var targetGridPos = getGridPosition(targetX, targetY);
if (!currentGridPos || !targetGridPos) {
return;
}
// Use pathfinding to find a path to the target
var path = findPath(currentGridPos, targetGridPos);
if (path && path.length > 0) {
var nextStep = path[0];
var cellCenterX = nextStep.x * tileSize + tileSize / 2;
var cellCenterY = nextStep.y * tileSize + tileSize / 2;
explorer.moveToward(cellCenterX, cellCenterY);
}
// Check if the explorer is at the diamond's position
if (levelGrid[currentGridPos.y][currentGridPos.x] === 'K') {
explorer.collectKey();
for (var i = 0; i < diamonds.length; i++) {
var diamondPos = getGridPosition(diamonds[i].x, diamonds[i].y);
if (diamondPos && diamondPos.x === currentGridPos.x && diamondPos.y === currentGridPos.y) {
diamonds[i].destroy();
diamonds.splice(i, 1);
levelGrid[currentGridPos.y][currentGridPos.x] = ' ';
LK.getSound('collect').play();
break;
}
}
}
}
function findPath(start, end) {
// Implement a simple pathfinding algorithm, e.g., A* or BFS
// This is a placeholder for the pathfinding logic
// Return an array of grid positions from start to end
return [];
}
// Handle touch/mouse events
function handleGameInput(x, y, obj) {
if (!gameStarted) {
return;
}
var direction = null;
var currentGridPos = getGridPosition(explorer.x, explorer.y);
var targetGridPos = getGridPosition(x, y);
if (targetGridPos) {
if (targetGridPos.x < currentGridPos.x) {
direction = 'left';
} else if (targetGridPos.x > currentGridPos.x) {
direction = 'right';
} else if (targetGridPos.y < currentGridPos.y) {
direction = 'up';
} else if (targetGridPos.y > currentGridPos.y) {
direction = 'down';
}
if (direction) {
explorer.moveFreely(direction);
}
}
}
// Start game when page loads
initializeGame();
// Handle touch/mouse events
game.down = handleGameInput;
// Game update loop
game.update = function () {
if (!gameStarted) {
return;
}
// Update UI
updateUI();
// Check collisions
checkCollisions();
// Check for score milestones and trigger celebration
var currentScore = LK.getScore();
if (currentScore % 100 === 0 && currentScore !== 0 && currentScore !== lastCelebratedScore) {
lastCelebratedScore = currentScore;
// Play boom sound
LK.getSound('boom').play();
// Display congratulations message
var message = new Text2("Congratulations! You crossed ".concat(currentScore, "!"), {
size: 100,
fill: 0xFFD700,
fontWeight: 'bold'
});
message.anchor.set(0.5, 0.5);
message.x = 2048 / 2;
message.y = 2732 / 2;
game.addChild(message);
// Remove message after 4 seconds
LK.setTimeout(function () {
message.destroy();
}, 4000);
// Trigger color paper blast effect in big size
var color = 0xFFD700; // Gold color
var paper = new Container();
var paperGraphics = paper.attachAsset('boom', {
anchorX: 0.5,
anchorY: 0.5
});
paperGraphics.tint = color;
paper.x = 2048 / 2;
paper.y = 2732 / 2;
game.addChild(paper);
tween(paperGraphics, {
scaleX: 20,
// Increase size for a much bigger effect
scaleY: 20,
// Increase size for a much bigger effect
// Increase size for a bigger effect
// Increase size for a bigger effect
alpha: 0
}, {
duration: 4000,
onFinish: function onFinish() {
paper.destroy();
}
});
}
};
small rock. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
a magic crackers boom effect. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
create a glod color key. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows