User prompt
Please fix the bug: 'TypeError: Cannot read properties of undefined (reading 'updateBar')' in or related to this line: 'oxygenBar.updateBar(oxygen);' Line Number: 669
User prompt
Please fix the bug: 'TypeError: Cannot read properties of undefined (reading 'updateBar')' in or related to this line: 'oxygenBar.updateBar(oxygen);' Line Number: 668
User prompt
Please fix the bug: 'TypeError: Cannot read properties of undefined (reading 'updateBar')' in or related to this line: 'oxygenBar.updateBar(oxygen);' Line Number: 669
User prompt
Please fix the bug: 'TypeError: Cannot read properties of undefined (reading 'updateBar')' in or related to this line: 'oxygenBar.updateBar(oxygen);' Line Number: 668
User prompt
Please fix the bug: 'TypeError: Cannot read properties of undefined (reading 'updateBar')' in or related to this line: 'oxygenBar.updateBar(oxygen);' Line Number: 669
User prompt
Please fix the bug: 'TypeError: Cannot read properties of undefined (reading 'updateBar')' in or related to this line: 'oxygenBar.updateBar(oxygen);' Line Number: 668
User prompt
Please fix the bug: 'TypeError: Cannot read properties of undefined (reading 'updateBar')' in or related to this line: 'oxygenBar.updateBar(oxygen);' Line Number: 669
User prompt
Please fix the bug: 'TypeError: Cannot read properties of undefined (reading 'updateBar')' in or related to this line: 'oxygenBar.updateBar(oxygen);' Line Number: 668
User prompt
Please fix the bug: 'TypeError: Cannot read properties of undefined (reading 'updateBar')' in or related to this line: 'oxygenBar.updateBar(oxygen);' Line Number: 669
User prompt
Please fix the bug: 'TypeError: Cannot read properties of undefined (reading 'updateBar')' in or related to this line: 'oxygenBar.updateBar(oxygen);' Line Number: 668
User prompt
Please fix the bug: 'TypeError: Cannot read properties of undefined (reading 'updateBar')' in or related to this line: 'oxygenBar.updateBar(oxygen);' Line Number: 669
User prompt
Please fix the bug: 'TypeError: Cannot read properties of undefined (reading 'updateBar')' in or related to this line: 'oxygenBar.updateBar(oxygen);' Line Number: 668
User prompt
Please fix the bug: 'TypeError: Cannot read properties of undefined (reading 'updateBar')' in or related to this line: 'oxygenBar.updateBar(oxygen);' Line Number: 669
User prompt
Please fix the bug: 'TypeError: Cannot read properties of undefined (reading 'updateBar')' in or related to this line: 'oxygenBar.updateBar(oxygen);' Line Number: 668
User prompt
Please fix the bug: 'TypeError: Cannot read properties of undefined (reading 'updateBar')' in or related to this line: 'oxygenBar.updateBar(oxygen);' Line Number: 669
User prompt
Please fix the bug: 'TypeError: Cannot read properties of undefined (reading 'updateBar')' in or related to this line: 'oxygenBar.updateBar(oxygen);' Line Number: 668
User prompt
Please fix the bug: 'TypeError: Cannot read properties of undefined (reading 'updateBar')' in or related to this line: 'oxygenBar.updateBar(oxygen);' Line Number: 669
User prompt
Please fix the bug: 'TypeError: Cannot read properties of undefined (reading 'updateBar')' in or related to this line: 'oxygenBar.updateBar(oxygen);' Line Number: 668
User prompt
Please fix the bug: 'TypeError: Cannot read properties of undefined (reading 'updateBar')' in or related to this line: 'oxygenBar.updateBar(oxygen);' Line Number: 667
User prompt
implement a main menu for this game
User prompt
add a main menu screen before starting the game with 2 buttons start and ext
User prompt
remove deadlygap asset and its logic
User prompt
add some wind effects on the game
User prompt
continously spawn the obstacle till the player reaches the 25000 meter
User prompt
create a healthbar for the climber and if he smash with obstacles reduce the health
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1", {
highScore: 0,
gearCollected: 0,
gearUpgrades: {
oxygenEfficiency: 0,
climbingSpeed: 0,
weatherResistance: 0
}
});
/****
* Classes
****/
var Campsite = Container.expand(function () {
var self = Container.call(this);
var campsiteGraphics = self.attachAsset('campsite', {
anchorX: 0.5,
anchorY: 0.5
});
self.width = campsiteGraphics.width;
self.height = campsiteGraphics.height;
self.active = true;
return self;
});
var Climber = Container.expand(function () {
var self = Container.call(this);
var climberGraphics = self.attachAsset('climber', {
anchorX: 2,
anchorY: 2
});
self.width = climberGraphics.width;
self.height = climberGraphics.height;
self.vx = 0;
self.vy = 0;
self.speed = 14 + storage.gearUpgrades.climbingSpeed * 2;
self.jumpPower = -25;
self.gravity = 0;
self.onGround = false;
self.climbing = false;
self.targetX = null;
self.targetY = null;
self.movingToTarget = false;
self.lastX = 0;
self.lastY = 0;
self.update = function () {
// Create smoke effect behind the player
if (LK.ticks % 10 === 0) {
// Emit smoke every 10 ticks
var smoke = LK.getAsset('smoke', {
anchorX: 1.5,
anchorY: 2.2,
x: self.x - self.width / 4,
y: self.y + self.height / 2
});
game.addChild(smoke);
tween(smoke, {
alpha: 0
}, {
duration: 1000,
onFinish: function onFinish() {
smoke.destroy();
}
});
}
self.lastX = self.x;
self.lastY = self.y;
if (self.movingToTarget && self.targetX !== null) {
var dx = self.targetX - self.x;
var dy = self.targetY - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > self.speed) {
var angle = Math.atan2(dy, dx);
self.vx = Math.cos(angle) * self.speed;
self.vy = Math.sin(angle) * self.speed;
} else {
self.x = self.targetX;
self.y = self.targetY;
self.vx = 0; // Stop horizontal movement
self.vy = 0; // Stop vertical movement
self.movingToTarget = false;
self.targetX = null;
self.targetY = null;
}
}
// Remove gravity effect to ensure constant upward movement
self.x += self.vx;
self.y += self.vy; // Allow vertical movement based on velocity
// Constrain to screen bounds
if (self.x < self.width / 2) {
self.x = self.width / 2;
self.vx = 0;
} else if (self.x > 2048 - self.width / 2) {
self.x = 2048 - self.width / 2;
self.vx = 0;
}
};
self.jump = function () {
if (self.onGround) {
self.vy = self.jumpPower;
self.onGround = false;
LK.getSound('jump').play();
// Add visual effect for jump
LK.effects.flashObject(self, 0x00ff00, 300);
}
};
self.moveToPosition = function (x, y) {
self.targetX = x;
self.targetY = y;
self.movingToTarget = true;
self.climbing = true;
};
return self;
});
var ClimbingPath = Container.expand(function (pathType) {
var self = Container.call(this);
// Different path types: 'normal', 'narrow', 'slippery'
self.pathType = pathType || 'normal';
var pathWidth = 300;
var pathColor = 0xDDDDDD;
if (self.pathType === 'narrow') {
pathWidth = 150;
pathColor = 0xBBBBBB;
} else if (self.pathType === 'slippery') {
pathWidth = 250;
pathColor = 0xADD8E6;
}
var pathGraphics = self.attachAsset('path', {
anchorX: 0.5,
anchorY: 0.5,
width: pathWidth,
height: 100,
tint: pathColor
});
self.width = pathGraphics.width;
self.height = pathGraphics.height;
return self;
});
var Collectable = Container.expand(function (collectableType) {
var self = Container.call(this);
self.collectableType = collectableType || 'oxygen';
var assetId, value;
if (self.collectableType === 'oxygen') {
assetId = 'oxygen';
value = 20 + Math.floor(Math.random() * 10);
} else if (self.collectableType === 'gear') {
assetId = 'gear';
value = 1;
}
var collectableGraphics = self.attachAsset(assetId, {
anchorX: 0.5,
anchorY: 0.5
});
self.width = collectableGraphics.width;
self.height = collectableGraphics.height;
self.value = value;
self.active = true;
self.update = function () {
// Simple hover animation
collectableGraphics.y = Math.sin(LK.ticks / 20) * 5;
};
return self;
});
var Hazard = Container.expand(function (hazardType) {
var self = Container.call(this);
self.hazardType = hazardType || 'rock';
var assetId, size, speed;
if (self.hazardType === 'rock') {
assetId = 'rock';
size = 100;
speed = 5 + Math.random() * 3;
} else if (self.hazardType === 'snowball') {
assetId = 'snowball';
size = 90;
speed = 7 + Math.random() * 4;
}
var hazardGraphics = self.attachAsset(assetId, {
anchorX: 0.5,
anchorY: 0.5
});
self.width = hazardGraphics.width;
self.height = hazardGraphics.height;
self.vy = speed;
self.active = true;
self.update = function () {
if (self.hazardType !== 'gap') {
self.y += self.vy;
}
// Remove when out of screen
if (self.y > 2732 + self.height) {
self.active = false;
}
};
return self;
});
var HealthBar = Container.expand(function () {
var self = Container.call(this);
var barBackground = self.attachAsset('oxygenBarBg', {
anchorX: 0,
anchorY: 0.5
});
var bar = self.attachAsset('oxygenBar', {
anchorX: 0,
anchorY: 0.5,
x: 5,
y: 0
});
var healthText = new Text2('HEALTH', {
size: 30,
fill: 0xFFFFFF
});
healthText.anchor.set(0.5, 0.5);
healthText.x = 200;
healthText.y = 0;
self.addChild(healthText);
self.maxWidth = bar.width;
self.updateBar = function (percentage) {
// Clamp percentage between 0 and 100
percentage = Math.max(0, Math.min(100, percentage));
bar.width = self.maxWidth * (percentage / 100);
// Change color based on health level
if (percentage > 60) {
bar.tint = 0x00FF00; // Green
} else if (percentage > 30) {
bar.tint = 0xFFAA00; // Orange
} else {
bar.tint = 0xFF0000; // Red
}
};
return self;
});
var MainMenu = Container.expand(function () {
var self = Container.call(this);
// Create a title text
var titleText = new Text2('Climber Game', {
size: 100,
fill: 0xFFFFFF
});
titleText.anchor.set(0.5, 0.5);
titleText.x = 2048 / 2;
titleText.y = 800;
self.addChild(titleText);
// Create a start button
var startButton = new Text2('Start Game', {
size: 80,
fill: 0x00FF00
});
startButton.anchor.set(0.5, 0.5);
startButton.x = 2048 / 2;
startButton.y = 1400;
self.addChild(startButton);
// Add interaction to start button
startButton.interactive = true;
startButton.buttonMode = true;
startButton.down = function () {
self.visible = false;
setupGame();
};
return self;
});
var Mountain = Container.expand(function () {
var self = Container.call(this);
var mountainGraphics = self.attachAsset('mountain', {
anchorX: 0.5,
anchorY: 0
});
self.width = mountainGraphics.width;
self.height = mountainGraphics.height;
return self;
});
var OxygenBar = Container.expand(function () {
var self = Container.call(this);
var barBackground = self.attachAsset('oxygenBarBg', {
anchorX: 0,
anchorY: 0.5
});
var bar = self.attachAsset('oxygenBar', {
anchorX: 0,
anchorY: 0.5,
x: 5,
y: 0
});
var oxygenText = new Text2('OXYGEN', {
size: 30,
fill: 0xFFFFFF
});
oxygenText.anchor.set(0.5, 0.5);
oxygenText.x = 200;
oxygenText.y = 0;
self.addChild(oxygenText);
self.maxWidth = bar.width;
self.updateBar = function (percentage) {
// Clamp percentage between 0 and 100
percentage = Math.max(0, Math.min(100, percentage));
bar.width = self.maxWidth * (percentage / 100);
// Change color based on oxygen level
if (percentage > 60) {
bar.tint = 0x00BFFF; // Blue
} else if (percentage > 30) {
bar.tint = 0xFFAA00; // Orange
} else {
bar.tint = 0xFF0000; // Red
}
};
return self;
});
var WindEffect = Container.expand(function () {
var self = Container.call(this);
var windGraphics = self.attachAsset('cloud', {
anchorX: 0.5,
anchorY: 0.5,
x: Math.random() * 2048,
y: Math.random() * 2732 / 2
});
self.vx = 1 + Math.random(); // Random horizontal speed
self.update = function () {
windGraphics.x += self.vx;
if (windGraphics.x > 2048 + windGraphics.width) {
windGraphics.x = -windGraphics.width; // Reset position to the left
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000000 // Always black
});
/****
* Game Code
****/
function createBackgroundForLevel(level) {
// Define different backgrounds for each level
var backgroundAssetId;
switch (level) {
case 1:
backgroundAssetId = 'backgroundLevel1';
break;
case 2:
backgroundAssetId = 'backgroundLevel2';
break;
case 3:
backgroundAssetId = 'backgroundLevel3';
break;
case 4:
backgroundAssetId = 'backgroundLevel4';
break;
case 5:
backgroundAssetId = 'backgroundLevel5';
break;
}
// Create and position the background
var background1 = LK.getAsset(backgroundAssetId, {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2,
y: 2732 / 2
});
var background2 = LK.getAsset(backgroundAssetId, {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2,
y: -2732 / 2
});
game.addChild(background1);
game.addChild(background2);
background1.zIndex = -1; // Ensure background is behind other elements
background2.zIndex = -1;
background1.update = function () {
background1.y += scrollSpeed;
if (background1.y > 2732 + 2732 / 2) {
background1.y = -2732 / 2;
}
};
background2.update = function () {
background2.y += scrollSpeed;
if (background2.y > 2732 + 2732 / 2) {
background2.y = -2732 / 2;
}
};
}
function adjustGameDynamics() {
// Increase scroll speed with altitude
scrollSpeed = 3 + Math.floor(altitude / 1000);
// Adjust hazard spawn rate based on altitude
if (altitude > 2000) {
pathGap = 200;
} else if (altitude > 4000) {
pathGap = 180;
}
// Modify oxygen usage rate based on altitude
if (altitude > 3000) {
oxygenUseRate = 0.15 - storage.gearUpgrades.oxygenEfficiency * 0.01;
} else if (altitude > 5000) {
oxygenUseRate = 0.2 - storage.gearUpgrades.oxygenEfficiency * 0.01;
}
}
// Game state
var gameActive = true;
var score = 0;
var altitude = 0;
var oxygen = 100;
var maxOxygen = 100;
var health = 100;
var oxygenUseRate = 0.1 - storage.gearUpgrades.oxygenEfficiency * 0.01;
var weatherEffect = 0;
var weatherResistance = storage.gearUpgrades.weatherResistance;
var level = 1;
var levelHeight = 5000;
// Screen scroll
var scrollSpeed = 3;
var camera = {
y: 0
};
// Game elements
var climber;
var paths = [];
var hazards = [];
var collectables = [];
var campsites = [];
var mountains = [];
var nextPathY = 2600; // Start position for first path
var pathGap = 220; // Gap between consecutive paths
// UI elements
var scoreText;
var altitudeText;
var levelText;
var oxygenBar;
// Setup game
function setupGame() {
// Create UI
setupUI();
// Create and spawn background for each level when played
createBackgroundForLevel(level);
// Add dynamic clouds to the background
function createClouds() {
var cloud = LK.getAsset('cloud', {
anchorX: 0.5,
anchorY: 0.5,
x: Math.random() * 2048,
y: Math.random() * 2732 / 2
});
game.addChild(cloud);
cloud.vx = 0.5 + Math.random(); // Random horizontal speed
cloud.update = function () {
cloud.x += cloud.vx;
if (cloud.x > 2048 + cloud.width) {
cloud.x = -cloud.width; // Reset position to the left
}
};
return cloud;
}
// Create multiple clouds
for (var i = 0; i < 5; i++) {
var cloud = createClouds();
game.addChild(cloud);
}
// Add wind effects
for (var i = 0; i < 3; i++) {
var wind = new WindEffect();
game.addChild(wind);
}
// Create mountains
createMountains();
// Continuously spawn mountains every 5 seconds
function spawnMountain() {
var newMountain = new Mountain();
newMountain.x = 2048 / 2;
newMountain.y = camera.y - 500; // Position above the current view
mountains.push(newMountain);
game.addChild(newMountain);
}
LK.setInterval(spawnMountain, 5000); // Schedule the mountain spawn every 5 seconds
spawnMountain(); // Start the mountain spawning process immediately
// Create initial paths
for (var i = 0; i < 15; i++) {
createPathAt(nextPathY);
nextPathY -= pathGap;
}
// Create climber
climber = new Climber();
climber.x = 2048 / 2;
climber.y = 2400;
game.addChild(climber);
// Start background music
LK.playMusic('bgMusic', {
fade: {
start: 0,
end: 0.3,
duration: 1000
}
});
}
function setupUI() {
// Score text
scoreText = new Text2('SCORE: 0', {
size: 50,
fill: 0xFFFFFF
});
scoreText.anchor.set(1, 0);
LK.gui.topRight.addChild(scoreText);
// Altitude text
altitudeText = new Text2('ALTITUDE: 0 M', {
size: 50,
fill: 0xFFFFFF
});
altitudeText.anchor.set(0.5, 0);
LK.gui.top.addChild(altitudeText);
// Level text
levelText = new Text2('LEVEL: 1', {
size: 50,
fill: 0xFFFFFF
});
levelText.anchor.set(0, 0);
LK.gui.topLeft.addChild(levelText);
levelText.x = 120; // Offset from the top left corner to avoid UI elements
// Oxygen bar
oxygenBar = new OxygenBar();
oxygenBar = new OxygenBar();
oxygenBar.updateBar(oxygen); // Initialize the oxygen bar with the current oxygen level
oxygenBar.x = 200;
oxygenBar.y = 100;
LK.gui.top.addChild(oxygenBar);
// Health bar
healthBar = new HealthBar();
healthBar.x = 200;
healthBar.y = 150;
LK.gui.top.addChild(healthBar);
}
function createMountains() {
// Create two mountains for parallax effect
var mountain1 = new Mountain();
mountain1.x = 2048 / 2;
mountain1.y = 2200;
mountains.push(mountain1);
game.addChild(mountain1);
var mountain2 = new Mountain();
mountain2.x = 2048 / 2;
mountain2.y = 700;
mountains.push(mountain2);
game.addChild(mountain2);
}
function createPathAt(yPosition) {
// Random path properties
var pathX = Math.random() * (2048 - 400) + 200;
var pathType = 'normal';
var pathTypeRoll = Math.random();
if (pathTypeRoll > 0.7) {
pathType = 'narrow';
} else if (pathTypeRoll > 0.5) {
pathType = 'slippery';
}
// Create the path
var path = new ClimbingPath(pathType);
path.x = pathX;
path.y = yPosition;
paths.push(path);
game.addChild(path);
// Chance to add collectable
if (Math.random() > 0.6) {
var collectableType = Math.random() > 0.7 ? 'gear' : 'oxygen';
var collectable = new Collectable(collectableType);
collectable.x = pathX + (Math.random() * 200 - 100);
collectable.y = yPosition - 80;
collectables.push(collectable);
game.addChild(collectable);
}
// Lower chance to add campsite
if (Math.random() > 0.9) {
var campsite = new Campsite();
campsite.x = pathX;
campsite.y = yPosition - 80;
campsites.push(campsite);
game.addChild(campsite);
}
// Chance to add hazard
if (Math.random() > 0.7) {
var hazardType;
var hazardRoll = Math.random();
if (hazardRoll > 0.5) {
hazardType = 'snowball';
} else if (hazardRoll > 0.3) {
hazardType = 'rock';
} else {
// Flying hazards are positioned above
var hazard = new Hazard(hazardType);
hazard.x = Math.random() * 2048;
hazard.y = yPosition - 500 - Math.random() * 500;
hazards.push(hazard);
game.addChild(hazard);
}
}
return path;
}
function updateGame() {
if (!gameActive) {
return;
}
// Update oxygen level
updateOxygen();
// Adjust game dynamics based on altitude
adjustGameDynamics();
// Update climber and check collisions
updateClimber();
// Update paths and scroll
updatePathsAndScroll();
// Update hazards
updateHazards();
// Update collectables
updateCollectables();
// Update campsites
updateCampsites();
// Update UI
updateUI();
// Update clouds
for (var i = 0; i < game.children.length; i++) {
var child = game.children[i];
if (child.update) {
child.update();
}
}
// Check for game over conditions
checkGameOver();
// Check for level complete
checkLevelComplete();
}
function updateOxygen() {
// Consume oxygen
oxygen -= oxygenUseRate * 0.5 * (1 + weatherEffect); // Reduce oxygen consumption rate
// Apply weather effects
if (altitude > level * 1000) {
weatherEffect = Math.min(1, (altitude - level * 1000) / 1000);
// Reduce weather effect based on weather resistance upgrade
weatherEffect *= 1 - weatherResistance * 0.1;
}
// Update oxygen bar
oxygenBar.updateBar(oxygen);
}
function updateClimber() {
// Update climber position
climber.update();
// Check if climber is on any path
climber.onGround = false;
for (var i = 0; i < paths.length; i++) {
var path = paths[i];
if (climber.intersects(path) && climber.lastY + climber.height / 2 <= path.y - path.height / 2 + 20 && climber.vy >= 0) {
climber.y = path.y - path.height / 2 - climber.height / 2 + 5;
climber.vy = 0;
climber.onGround = true;
climber.climbing = false;
// If on slippery path, add slide effect
if (path.pathType === 'slippery' && !climber.movingToTarget) {
climber.vx = Math.random() > 0.5 ? 1 : -1;
}
break;
}
}
}
function updatePathsAndScroll() {
// Scroll the screen when climber is higher
if (climber.y < 2732 / 3) {
var scrollAmount = 2732 / 3 - climber.y;
camera.y += scrollAmount;
climber.y += scrollAmount;
// Move all game elements
for (var i = 0; i < paths.length; i++) {
paths[i].y += scrollAmount;
}
for (var i = 0; i < hazards.length; i++) {
hazards[i].y += scrollAmount;
}
for (var i = 0; i < collectables.length; i++) {
collectables[i].y += scrollAmount;
}
for (var i = 0; i < campsites.length; i++) {
campsites[i].y += scrollAmount;
}
for (var i = 0; i < mountains.length; i++) {
mountains[i].y += scrollAmount * 0.5; // Parallax effect
}
// Increase altitude
altitude += scrollAmount;
// Create new paths as needed
while (nextPathY > camera.y - 2732 / 2) {
createPathAt(nextPathY);
nextPathY -= pathGap + Math.random() * 50;
}
} else {
// Always scroll the game elements upwards
var scrollAmount = scrollSpeed;
camera.y += scrollAmount;
for (var i = 0; i < paths.length; i++) {
paths[i].y += scrollAmount;
}
for (var i = 0; i < hazards.length; i++) {
hazards[i].y += scrollAmount;
}
for (var i = 0; i < collectables.length; i++) {
collectables[i].y += scrollAmount;
}
for (var i = 0; i < campsites.length; i++) {
campsites[i].y += scrollAmount;
}
for (var i = 0; i < mountains.length; i++) {
mountains[i].y += scrollAmount * 0.5; // Parallax effect
}
altitude += scrollAmount;
while (nextPathY > camera.y - 2732 / 2 && altitude < 25000) {
createPathAt(nextPathY);
nextPathY -= pathGap + Math.random() * 50;
}
}
// Remove paths that are off-screen
for (var i = paths.length - 1; i >= 0; i--) {
if (paths[i].y > camera.y + 2732 + 200) {
paths[i].destroy();
paths.splice(i, 1);
}
}
}
function updateHazards() {
for (var i = hazards.length - 1; i >= 0; i--) {
var hazard = hazards[i];
hazard.update();
// Check for collision with climber
if (hazard.active && climber.intersects(hazard)) {
handleHazardCollision(hazard);
}
// Remove inactive hazards
if (!hazard.active || hazard.y > camera.y + 2732 + 200) {
hazard.destroy();
hazards.splice(i, 1);
}
}
}
function handleHazardCollision(hazard) {
LK.getSound('danger').play();
if (hazard.hazardType === 'rock' || hazard.hazardType === 'snowball') {
// Falling rocks or snowballs damage health
health -= 20;
healthBar.updateBar(health);
// Visual feedback
LK.effects.flashObject(climber, 0xff0000, 500);
// Add visual effect for hazard
LK.effects.flashObject(hazard, 0xff0000, 500);
// Knockback effect
climber.vy = 5;
climber.vx = climber.x < hazard.x ? -8 : 8;
// Make hazard inactive
hazard.active = false;
}
}
function updateCollectables() {
for (var i = collectables.length - 1; i >= 0; i--) {
var collectable = collectables[i];
collectable.update();
// Check for collision with climber
if (collectable.active && climber.intersects(collectable)) {
handleCollectableCollision(collectable);
// Remove collected item
collectable.destroy();
collectables.splice(i, 1);
} else if (collectable.y > camera.y + 2732 + 200) {
// Remove off-screen collectables
collectable.destroy();
collectables.splice(i, 1);
}
}
}
function handleCollectableCollision(collectable) {
LK.getSound('collect').play();
if (collectable.collectableType === 'oxygen') {
// Refill oxygen
oxygen = Math.min(maxOxygen, oxygen + collectable.value);
// Visual feedback
LK.effects.flashObject(collectable, 0x00BFFF, 300);
} else if (collectable.collectableType === 'gear') {
storage.gearCollected += collectable.value;
// Apply gear upgrade effect
storage.gearUpgrades.climbingSpeed += 0.1; // Increase climbing speed
storage.gearUpgrades.oxygenEfficiency += 0.05; // Increase oxygen efficiency
storage.gearUpgrades.weatherResistance += 0.02; // Increase weather resistance
// Add to score
score += 10;
// Visual feedback
LK.effects.flashObject(collectable, 0xFFD700, 300);
// Add visual effect for climber
LK.effects.flashObject(climber, 0xFFD700, 300);
}
}
function updateCampsites() {
for (var i = campsites.length - 1; i >= 0; i--) {
var campsite = campsites[i];
// Check for collision with climber
if (campsite.active && climber.intersects(campsite)) {
handleCampsiteCollision(campsite);
}
// Remove off-screen campsites
if (campsite.y > camera.y + 2732 + 200) {
campsite.destroy();
campsites.splice(i, 1);
}
}
}
function handleCampsiteCollision(campsite) {
// Rest at campsite to replenish oxygen
if (climber.onGround && campsite.active) {
LK.getSound('rest').play();
// Replenish oxygen
oxygen = Math.min(maxOxygen, oxygen + 0.5);
// Visual feedback
if (LK.ticks % 20 === 0) {
LK.effects.flashObject(campsite, 0x4CBB17, 300);
// Add visual effect for resting
LK.effects.flashObject(climber, 0x4CBB17, 300);
}
// Increase score for time spent at campsite
if (LK.ticks % 60 === 0) {
score += 1;
}
// Save game state when resting at the end level campsite
if (campsite.y < 100) {
// Assuming y < 100 indicates it's the end level campsite
storage.highScore = Math.max(storage.highScore, Math.floor(score));
storage.gearCollected = storage.gearCollected;
storage.gearUpgrades = storage.gearUpgrades;
}
}
}
function updateUI() {
// Update score text
scoreText.setText('SCORE: ' + Math.floor(score));
// Update altitude text
altitudeText.setText('ALTITUDE: ' + Math.floor(altitude) + ' M');
// Update level text
levelText.setText('LEVEL: ' + level);
}
function checkGameOver() {
// Game over if oxygen or health depletes
if (oxygen <= 0 || health <= 0) {
gameActive = false;
oxygen = Math.max(0, oxygen);
health = Math.max(0, health);
LK.effects.flashScreen(0xff0000, 1000);
LK.setTimeout(function () {
LK.showGameOver();
}, 1000);
}
// Game over if fallen off screen
if (climber.y > camera.y + 2732 + climber.height) {
gameActive = false;
LK.effects.flashScreen(0xff0000, 1000);
LK.setTimeout(function () {
LK.showGameOver();
}, 1000);
}
}
function checkLevelComplete() {
// Advance to next level when reaching required height
if (altitude >= level * levelHeight) {
level++;
// Increase difficulty
pathGap += 20;
oxygenUseRate += 0.05;
// Bonus score
score += level * 100;
// Flash screen for feedback
LK.effects.flashScreen(0x00ff00, 500);
// Add visual effect for climber
LK.effects.flashObject(climber, 0x00ff00, 500);
// Reset altitude for next level
altitude = 0;
// Reset paths, hazards, and collectables for new level
paths = [];
hazards = [];
collectables = [];
campsites = [];
nextPathY = 2600; // Reset start position for first path
// Spawn a campsite at the end of the level
var endCampsite = new Campsite();
endCampsite.x = 2048 / 2;
endCampsite.y = nextPathY - 100; // Position slightly above the last path
campsites.push(endCampsite);
game.addChild(endCampsite);
// Create initial paths for new level
for (var i = 0; i < 15; i++) {
createPathAt(nextPathY);
nextPathY -= pathGap;
}
// If reached final level (5), show win screen
if (level > 5) {
LK.setTimeout(function () {
// Update high score
if (score > storage.highScore) {
storage.highScore = Math.floor(score);
}
LK.showYouWin();
}, 1000);
}
}
}
// Interaction handlers
game.down = function (x, y, obj) {
if (!gameActive) {
return;
}
// Convert click to game coordinates
var position = game.toLocal({
x: x,
y: y
});
// When clicking/tapping, move towards that point if within reasonable range
var dx = position.x - climber.x;
var dy = position.y - climber.y;
var distance = Math.sqrt(dx * dx + dy * dy);
// Move towards the target position
climber.moveToPosition(position.x, position.y);
climber.vx = dx > 0 ? climber.speed : -climber.speed; // Set horizontal speed based on touch position
climber.vy = -scrollSpeed; // Set vertical speed to move upwards
};
game.up = function (x, y, obj) {
// Not needed for this game
};
game.move = function (x, y, obj) {
// Not needed for this game
};
// Main game loop
game.update = function () {
updateGame();
// Update score based on altitude
if (gameActive && LK.ticks % 30 === 0) {
score += 0.1 * level;
}
};
// Initialize and display the main menu
var mainMenu = new MainMenu();
game.addChild(mainMenu);
// Set game score
LK.setScore(Math.floor(score)); ===================================================================
--- original.js
+++ change.js
@@ -521,8 +521,9 @@
LK.gui.topLeft.addChild(levelText);
levelText.x = 120; // Offset from the top left corner to avoid UI elements
// Oxygen bar
oxygenBar = new OxygenBar();
+ oxygenBar = new OxygenBar();
oxygenBar.updateBar(oxygen); // Initialize the oxygen bar with the current oxygen level
oxygenBar.x = 200;
oxygenBar.y = 100;
LK.gui.top.addChild(oxygenBar);
mountain ledge Single Game Texture. In-Game asset. High contrast. No shadows
mountain boulder. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
bunch clouds. Single Game Texture. In-Game asset. Blank background. High contrast.
diffrent kinds of mountains. Single Game Texture. In-Game asset. High contrast
sand mountain. Single Game Texture. In-Game asset. Blank background. High contrast
snowy mountains. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
asgard. Single Game Texture. In-Game asset. Blank background. High contrast
oxygen cylinder with O2 symbol Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
single cloud. Single Game Texture. In-Game asset. Blank background. High contrast
snow ball. Single Game Texture. In-Game asset. 2d. Blank background. High contrast
camptent Single Game Texture. In-Game asset. 2d. Blank background. High contrast.
single climbing gear. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
mixed infinite cloud background Single Game Texture. In-Game asset. 2d. Blank background. High contrast
Fly Through Endless JetPack Adventure,Soaring Through the Sky Single Game Texture. In-Game asset. 2d. . High contrast.