User prompt
Ace to the rarest green snowflakes
User prompt
Better that it has a 1 in 100 chance of appearing
User prompt
So green snowflakes have a 2% chance of appearing
User prompt
So there is a power up that is a green snowflake that when touched transforms the sun rays into green sun rays that stay still and after 5 seconds they return to normal ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
So the cannon power-ups no longer appear randomly only when reaching a certain amount of points.
User prompt
So when you reach 1000 points you shoot snowflakes faster and when you reach 3000 points you shoot even faster
User prompt
So when you reach 500 points another tank power up will fall and when you reach 2000 points it will give you another one
User prompt
So the extra cannon stays indefinitely
User prompt
So when you reach 200 points, a power up in the shape of a cannon falls and when you take it, you create a second cannon that handles itself.
User prompt
So the autocannon booster appears with a 4% chance.
User prompt
Now when I enter the game I already have the upgrades purchased
User prompt
Now there is another problem when you log back in you already have the abilities purchased Fix it ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
There is a problem when you buy something in the store, the other thing is also bought, solve it
User prompt
So in the store there is a button of a green snowflake that costs 100 points and when you buy it I make that every 3 snowflake shots a green snowflake is created that is remote controlled
User prompt
And so when you open the store section all the sun rays stay still and when you leave they move again.
User prompt
So when you buy the double shot item you don't shoot two snowflakes but you increase The speed of appearance
User prompt
Please fix the bug: 'Uncaught TypeError: Cannot read properties of undefined (reading 'toGlobal')' in or related to this line: 'var shopPos = game.toLocal(obj.parent.toGlobal(obj.position));' Line Number: 621
User prompt
So when you press the Shop button a square with the symbol of two snowflakes appears, and when you touch it in exchange for 50 points you shoot two snowflakes instead of one And when you press the store button again it disappears
User prompt
Please fix the bug: 'Uncaught TypeError: Cannot read properties of undefined (reading 'toGlobal')' in or related to this line: 'var shopButtonPos = LK.gui.topRight.toLocal(obj.parent.toGlobal(obj.position));' Line Number: 580
User prompt
So there is a button with which you can buy things in exchange for points like shooting two snowflakes instead of one. ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
So there is a power up that looks like a cannon and when taken it creates a second cannon but it moves only towards where the sun rays are and prioritizes the red sun rays. ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
So the player has three lives that are represented by ice cubes and when he loses them all he loses the game and there is a power up in the shape of an ice cube that regenerates an ice cube And it only appears if you are missing one
User prompt
So that the red sun rays are slower
User prompt
So there is a frozen tundra in the background
User prompt
So when you destroy a red sunbeam the chance of another one appearing drops to 5% for 10 seconds before returning to the original chance. ↪💡 Consider importing and using the following plugins: @upit/tween.v1
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ var AutoCannon = Container.expand(function () { var self = Container.call(this); var cannonGraphics = self.attachAsset('cannon', { anchorX: 0.5, anchorY: 1.0, scaleX: 0.8, scaleY: 0.8 }); cannonGraphics.tint = 0xffd700; // Golden tint self.moveSpeed = 8; self.targetX = self.x; self.isMoving = false; self.lastShotTime = 0; self.shootInterval = 1500; // Shoot every 1.5 seconds self.update = function () { // Find nearest target (prioritize red sunrays) var nearestTarget = null; var nearestDistance = Infinity; // Check red sunrays first (priority) for (var i = 0; i < redSunrays.length; i++) { var redSunray = redSunrays[i]; var distance = Math.abs(redSunray.x - self.x); if (distance < nearestDistance) { nearestDistance = distance; nearestTarget = redSunray; } } // If no red sunrays, check regular sunrays if (!nearestTarget) { for (var j = 0; j < sunrays.length; j++) { var sunray = sunrays[j]; var distance = Math.abs(sunray.x - self.x); if (distance < nearestDistance) { nearestDistance = distance; nearestTarget = sunray; } } } // Move toward target if (nearestTarget) { self.targetX = nearestTarget.x; self.isMoving = true; } // Handle movement if (self.isMoving) { var diff = self.targetX - self.x; if (Math.abs(diff) > 4) { self.x += diff > 0 ? self.moveSpeed : -self.moveSpeed; } else { self.x = self.targetX; self.isMoving = false; } } // Keep cannon within screen bounds if (self.x < 150) self.x = 150; if (self.x > 1898) self.x = 1898; // Auto-shoot var currentTime = LK.ticks * 16.67; if (currentTime - self.lastShotTime >= self.shootInterval && nearestTarget) { var newSnowflake = new Snowflake(); newSnowflake.x = self.x; newSnowflake.y = self.y - 120; newSnowflake.lastY = newSnowflake.y; snowflakes.push(newSnowflake); game.addChild(newSnowflake); self.lastShotTime = currentTime; LK.getSound('shoot').play(); } }; return self; }); var Cannon = Container.expand(function () { var self = Container.call(this); var cannonGraphics = self.attachAsset('cannon', { anchorX: 0.5, anchorY: 1.0 }); // Shield effect var shieldGraphics = self.attachAsset('snowflake', { anchorX: 0.5, anchorY: 0.5, scaleX: 6, scaleY: 6, alpha: 0, y: -80 }); shieldGraphics.tint = 0x00ffff; self.moveSpeed = 12; self.isMoving = false; self.targetX = self.x; self.hasShield = false; self.shieldTime = 0; self.rapidFireActive = false; self.rapidFireTime = 0; self.multishotActive = false; self.multishotTime = 0; self.shieldBobTimer = 0; self.update = function () { if (self.isMoving) { var diff = self.targetX - self.x; if (Math.abs(diff) > 2) { self.x += diff > 0 ? self.moveSpeed : -self.moveSpeed; } else { self.x = self.targetX; self.isMoving = false; } } // Keep cannon within screen bounds if (self.x < 150) self.x = 150; if (self.x > 1898) self.x = 1898; // Update shield if (self.hasShield) { self.shieldTime--; self.shieldBobTimer += 0.1; shieldGraphics.alpha = 0.6 + Math.sin(self.shieldBobTimer) * 0.2; shieldGraphics.rotation += 0.05; if (self.shieldTime <= 0) { self.hasShield = false; shieldGraphics.alpha = 0; } } // Update rapid fire if (self.rapidFireActive) { self.rapidFireTime--; cannonGraphics.tint = 0xff6600; if (self.rapidFireTime <= 0) { self.rapidFireActive = false; cannonGraphics.tint = 0xffffff; } } // Update multishot if (self.multishotActive) { self.multishotTime--; if (self.multishotTime <= 0) { self.multishotActive = false; } } }; self.moveTo = function (targetX) { self.targetX = targetX; self.isMoving = true; }; self.activateShield = function () { self.hasShield = true; self.shieldTime = 600; // 10 seconds at 60fps }; self.activateRapidFire = function () { self.rapidFireActive = true; self.rapidFireTime = 600; // 10 seconds at 60fps }; self.activateMultishot = function () { self.multishotActive = true; self.multishotTime = 300; // 5 seconds at 60fps }; return self; }); var CannonPowerUp = Container.expand(function () { var self = Container.call(this); var cannonGraphics = self.attachAsset('cannon', { anchorX: 0.5, anchorY: 0.5, scaleX: 0.6, scaleY: 0.6 }); cannonGraphics.tint = 0xffd700; // Golden tint self.speed = 2; self.bobTimer = 0; self.update = function () { self.y += self.speed; self.bobTimer += 0.1; cannonGraphics.y = Math.sin(self.bobTimer) * 10; cannonGraphics.rotation += 0.05; }; return self; }); var IceCubePowerUp = Container.expand(function () { var self = Container.call(this); var iceCubeGraphics = self.attachAsset('iceblocksad', { anchorX: 0.5, anchorY: 0.5, scaleX: 0.8, scaleY: 0.8 }); iceCubeGraphics.tint = 0x87CEEB; // Light blue tint self.speed = 2; self.bobTimer = 0; self.update = function () { self.y += self.speed; self.bobTimer += 0.1; iceCubeGraphics.y = Math.sin(self.bobTimer) * 15; iceCubeGraphics.rotation += 0.03; }; return self; }); var ParticleEffect = Container.expand(function () { var self = Container.call(this); var particles = []; self.createExplosion = function (x, y, color, count) { for (var i = 0; i < count; i++) { var particle = self.attachAsset('snowflake', { anchorX: 0.5, anchorY: 0.5, scaleX: 0.3, scaleY: 0.3, x: x, y: y }); particle.tint = color; var angle = Math.PI * 2 * i / count; var speed = 100 + Math.random() * 100; particle.vx = Math.cos(angle) * speed; particle.vy = Math.sin(angle) * speed; particle.life = 60; // frames particles.push(particle); } }; self.update = function () { for (var i = particles.length - 1; i >= 0; i--) { var particle = particles[i]; particle.x += particle.vx * 0.016; particle.y += particle.vy * 0.016; particle.vy += 200 * 0.016; // gravity particle.life--; particle.alpha = particle.life / 60; if (particle.life <= 0) { particle.destroy(); particles.splice(i, 1); } } }; return self; }); var PolarBearDisplay = Container.expand(function () { var self = Container.call(this); var iceBlock = self.attachAsset('iceblocksad', { anchorX: 0.5, anchorY: 0.5 }); var bearSad = self.attachAsset('polarbearsad', { anchorX: 0.5, anchorY: 0.5, y: 10 }); var bearHappy = self.attachAsset('polarbearhappy', { anchorX: 0.5, anchorY: 0.5, y: 10, alpha: 0 }); self.showHappy = function () { // Generate ice particles when ice cube is destroyed particleSystem.createExplosion(self.x, self.y - 20, 0xb0e0e6, 15); tween(iceBlock, { alpha: 0 }, { duration: 1000 }); tween(bearSad, { alpha: 0 }, { duration: 1000 }); tween(bearHappy, { alpha: 1 }, { duration: 1000 }); }; return self; }); var PowerUp = Container.expand(function () { var self = Container.call(this); self.type = 'shield'; // 'shield', 'rapidfire', or 'multishot' var powerUpGraphics = self.attachAsset('snowflake', { anchorX: 0.5, anchorY: 0.5, scaleX: 1.5, scaleY: 1.5 }); if (self.type === 'rapidfire') { powerUpGraphics.tint = 0xff6600; } else if (self.type === 'multishot') { powerUpGraphics.tint = 0xff00ff; } else { powerUpGraphics.tint = 0x00ffff; } self.speed = 2; self.bobTimer = 0; self.update = function () { self.y += self.speed; self.bobTimer += 0.1; powerUpGraphics.y = Math.sin(self.bobTimer) * 10; powerUpGraphics.rotation += 0.05; }; return self; }); var RedSunRay = Container.expand(function () { var self = Container.call(this); var sunrayGraphics = self.attachAsset('sunray', { anchorX: 0.5, anchorY: 0.5 }); sunrayGraphics.tint = 0xff0000; // Make it red self.speed = 2; self.hits = 0; self.maxHits = 2; self.flashTimer = 0; self.update = function () { self.y += self.speed; // Flash effect when hit if (self.flashTimer > 0) { self.flashTimer--; var alpha = 0.3 + Math.sin(self.flashTimer * 0.5) * 0.3; sunrayGraphics.alpha = alpha; if (self.flashTimer <= 0) { sunrayGraphics.alpha = 1; } } }; self.hit = function () { self.hits++; self.flashTimer = 30; // Flash for 0.5 seconds // Scale down slightly when hit var newScale = 1 - self.hits / self.maxHits * 0.3; sunrayGraphics.scaleX = newScale; sunrayGraphics.scaleY = newScale; return self.hits >= self.maxHits; }; return self; }); var Snowflake = Container.expand(function () { var self = Container.call(this); var snowflakeGraphics = self.attachAsset('snowflake', { anchorX: 0.5, anchorY: 0.5 }); self.speed = -12; self.update = function () { self.y += self.speed; }; return self; }); var SunRay = Container.expand(function () { var self = Container.call(this); var sunrayGraphics = self.attachAsset('sunray', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 4; self.update = function () { self.y += self.speed; }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x87CEEB }); /**** * Game Code ****/ // Add frozen tundra background var backgroundTundra = game.attachAsset('frozentundra', { anchorX: 0, anchorY: 0, x: 0, y: 0 }); var cannon; var snowflakes = []; var sunrays = []; var redSunrays = []; var powerUps = []; var cannonPowerUps = []; var autoCannons = []; var polarBearDisplay; var particleSystem; var lastShotTime = 0; var lastSunRaySpawn = 0; var lastPowerUpSpawn = 0; var sunRaySpawnInterval = 3000; // 3 seconds initially var powerUpSpawnInterval = 15000; // 15 seconds var raysDestroyed = 0; var raysNeededForLevel = 10; var currentLevel = 1; var gameWon = false; var totalScore = 0; var combo = 0; var comboTimer = 0; var redSunraySpawnChance = 0.2; // Default 20% chance var redSunrayChanceReduced = false; var redSunrayChanceTimer = 0; var playerLives = 3; var maxLives = 3; var iceCubePowerUps = []; // Create score display var scoreText = new Text2('Score: 0', { size: 60, fill: 0xFFFFFF }); scoreText.anchor.set(0.5, 0); LK.gui.top.addChild(scoreText); // Create combo display var comboText = new Text2('', { size: 40, fill: 0xFFD700 }); comboText.anchor.set(0.5, 0); comboText.y = 80; LK.gui.top.addChild(comboText); // Create level display var levelText = new Text2('Level: 1', { size: 50, fill: 0xFFFFFF }); levelText.anchor.set(0, 0); levelText.x = 150; levelText.y = 20; LK.gui.topRight.addChild(levelText); // Create power-up status var powerUpText = new Text2('', { size: 35, fill: 0x00FFFF }); powerUpText.anchor.set(0, 0); powerUpText.x = 150; powerUpText.y = 80; LK.gui.topRight.addChild(powerUpText); // Create lives display var livesContainer = new Container(); var livesDisplay = []; for (var l = 0; l < maxLives; l++) { var lifeIcon = LK.getAsset('iceblocksad', { anchorX: 0.5, anchorY: 0.5, scaleX: 0.3, scaleY: 0.3, x: l * 80, y: 0 }); livesDisplay.push(lifeIcon); livesContainer.addChild(lifeIcon); } livesContainer.x = 100; livesContainer.y = 100; LK.gui.topLeft.addChild(livesContainer); // Function to update lives display function updateLivesDisplay() { for (var i = 0; i < livesDisplay.length; i++) { if (i < playerLives) { livesDisplay[i].alpha = 1; } else { livesDisplay[i].alpha = 0.3; } } } // Initialize lives display updateLivesDisplay(); // Start playing background music LK.playMusic('FrozenSavior'); // Create cannon cannon = game.addChild(new Cannon()); cannon.x = 1024; cannon.y = 2680; // Create particle system particleSystem = game.addChild(new ParticleEffect()); // Create polar bear display polarBearDisplay = game.addChild(new PolarBearDisplay()); polarBearDisplay.x = 1024; polarBearDisplay.y = 200; // Touch controls game.down = function (x, y, obj) { cannon.moveTo(x); }; game.move = function (x, y, obj) { cannon.moveTo(x); }; // Main game update loop game.update = function () { var currentTime = LK.ticks * 16.67; // Convert to milliseconds // Update combo timer if (comboTimer > 0) { comboTimer--; if (comboTimer <= 0) { combo = 0; comboText.setText(''); } } // Update red sunray chance reduction timer if (redSunrayChanceReduced) { redSunrayChanceTimer--; if (redSunrayChanceTimer <= 0) { redSunrayChanceReduced = false; redSunraySpawnChance = 0.2; // Reset to 20% } } // Auto-shoot snowflakes (faster with rapid fire) var shootInterval = cannon.rapidFireActive ? 500 : 2000; if (currentTime - lastShotTime >= shootInterval) { var snowflakeCount = cannon.multishotActive ? 10 : 1; for (var shot = 0; shot < snowflakeCount; shot++) { var newSnowflake = new Snowflake(); if (snowflakeCount === 1) { newSnowflake.x = cannon.x; } else { // Spread snowflakes in an arc var spreadAngle = (shot - (snowflakeCount - 1) / 2) * 0.3; newSnowflake.x = cannon.x + Math.sin(spreadAngle) * 50; } newSnowflake.y = cannon.y - 120; newSnowflake.lastY = newSnowflake.y; snowflakes.push(newSnowflake); game.addChild(newSnowflake); } lastShotTime = currentTime; LK.getSound('shoot').play(); } // Spawn sun rays if (currentTime - lastSunRaySpawn >= sunRaySpawnInterval) { // Dynamic chance to spawn red sunray if (Math.random() < redSunraySpawnChance) { var newRedSunRay = new RedSunRay(); newRedSunRay.x = Math.random() * (2048 - 120) + 60; newRedSunRay.y = -30; newRedSunRay.lastY = newRedSunRay.y; redSunrays.push(newRedSunRay); game.addChild(newRedSunRay); } else { var newSunRay = new SunRay(); newSunRay.x = Math.random() * (2048 - 120) + 60; newSunRay.y = -30; newSunRay.lastY = newSunRay.y; sunrays.push(newSunRay); game.addChild(newSunRay); } lastSunRaySpawn = currentTime; // Randomly vary spawn interval sunRaySpawnInterval = Math.max(800, 2000 + Math.random() * 2000 - currentLevel * 100); } // Spawn power-ups if (currentTime - lastPowerUpSpawn >= powerUpSpawnInterval) { var randomType = Math.random(); if (randomType < 0.04) { // 4% chance for cannon power-up var newCannonPowerUp = new CannonPowerUp(); newCannonPowerUp.x = Math.random() * (2048 - 200) + 100; newCannonPowerUp.y = -30; cannonPowerUps.push(newCannonPowerUp); game.addChild(newCannonPowerUp); } else { // Regular power-ups var newPowerUp = new PowerUp(); var regularType = Math.random(); if (regularType < 0.33) { newPowerUp.type = 'shield'; } else if (regularType < 0.66) { newPowerUp.type = 'rapidfire'; } else { newPowerUp.type = 'multishot'; } newPowerUp.x = Math.random() * (2048 - 200) + 100; newPowerUp.y = -30; powerUps.push(newPowerUp); game.addChild(newPowerUp); } lastPowerUpSpawn = currentTime; powerUpSpawnInterval = 12000 + Math.random() * 8000; } // Spawn ice cube power-up only if missing lives if (playerLives < maxLives && Math.random() < 0.002) { // Low spawn chance var newIceCube = new IceCubePowerUp(); newIceCube.x = Math.random() * (2048 - 200) + 100; newIceCube.y = -30; iceCubePowerUps.push(newIceCube); game.addChild(newIceCube); } // Update power-up status display var statusText = ''; if (cannon.hasShield) { statusText += 'SHIELD: ' + Math.ceil(cannon.shieldTime / 60) + 's '; } if (cannon.rapidFireActive) { statusText += 'RAPID FIRE: ' + Math.ceil(cannon.rapidFireTime / 60) + 's'; } if (cannon.multishotActive) { statusText += 'MULTISHOT: ' + Math.ceil(cannon.multishotTime / 60) + 's'; } powerUpText.setText(statusText); // Update and check snowflakes for (var i = snowflakes.length - 1; i >= 0; i--) { var snowflake = snowflakes[i]; // Check if snowflake went off screen if (snowflake.lastY >= -50 && snowflake.y < -50) { snowflake.destroy(); snowflakes.splice(i, 1); continue; } snowflake.lastY = snowflake.y; } // Update power-ups for (var p = powerUps.length - 1; p >= 0; p--) { var powerUp = powerUps[p]; if (powerUp.y > 2800) { powerUp.destroy(); powerUps.splice(p, 1); continue; } // Check collision with cannon if (powerUp.intersects(cannon)) { if (powerUp.type === 'shield') { cannon.activateShield(); } else if (powerUp.type === 'rapidfire') { cannon.activateRapidFire(); } else if (powerUp.type === 'multishot') { cannon.activateMultishot(); } particleSystem.createExplosion(powerUp.x, powerUp.y, 0x00ffff, 8); powerUp.destroy(); powerUps.splice(p, 1); } } // Update ice cube power-ups for (var ice = iceCubePowerUps.length - 1; ice >= 0; ice--) { var iceCube = iceCubePowerUps[ice]; if (iceCube.y > 2800) { iceCube.destroy(); iceCubePowerUps.splice(ice, 1); continue; } // Check collision with cannon if (iceCube.intersects(cannon)) { if (playerLives < maxLives) { playerLives++; updateLivesDisplay(); particleSystem.createExplosion(iceCube.x, iceCube.y, 0x87CEEB, 12); } iceCube.destroy(); iceCubePowerUps.splice(ice, 1); } } // Update cannon power-ups for (var cp = cannonPowerUps.length - 1; cp >= 0; cp--) { var cannonPowerUp = cannonPowerUps[cp]; if (cannonPowerUp.y > 2800) { cannonPowerUp.destroy(); cannonPowerUps.splice(cp, 1); continue; } // Check collision with cannon if (cannonPowerUp.intersects(cannon)) { // Create new auto cannon var newAutoCannon = new AutoCannon(); newAutoCannon.x = cannon.x + (Math.random() - 0.5) * 200; // Spawn near main cannon newAutoCannon.y = cannon.y; autoCannons.push(newAutoCannon); game.addChild(newAutoCannon); particleSystem.createExplosion(cannonPowerUp.x, cannonPowerUp.y, 0xffd700, 12); cannonPowerUp.destroy(); cannonPowerUps.splice(cp, 1); } } // Update auto-cannons for (var ac = autoCannons.length - 1; ac >= 0; ac--) { var autoCannon = autoCannons[ac]; // Auto-cannons have a limited lifespan (30 seconds) if (!autoCannon.lifeTimer) { autoCannon.lifeTimer = 1800; // 30 seconds at 60fps } autoCannon.lifeTimer--; if (autoCannon.lifeTimer <= 0) { // Flash effect before disappearing tween(autoCannon, { alpha: 0 }, { duration: 1000, onFinish: function onFinish() { autoCannon.destroy(); } }); autoCannons.splice(ac, 1); } } // Update and check sun rays for (var j = sunrays.length - 1; j >= 0; j--) { var sunray = sunrays[j]; // Check if sun ray reached ground if (sunray.lastY <= 2750 && sunray.y > 2750) { if (!cannon.hasShield) { playerLives--; updateLivesDisplay(); LK.effects.flashScreen(0xff0000, 1000); if (playerLives <= 0) { LK.showGameOver(); return; } } else { // Shield absorbs the hit cannon.hasShield = false; cannon.shieldTime = 0; particleSystem.createExplosion(sunray.x, sunray.y, 0x00ffff, 12); } sunray.destroy(); sunrays.splice(j, 1); } sunray.lastY = sunray.y; } // Update and check red sun rays for (var k = redSunrays.length - 1; k >= 0; k--) { var redSunray = redSunrays[k]; // Check if red sun ray reached ground if (redSunray.lastY <= 2750 && redSunray.y > 2750) { if (!cannon.hasShield) { LK.effects.flashScreen(0xff0000, 1000); LK.showGameOver(); return; } else { // Shield absorbs the hit cannon.hasShield = false; cannon.shieldTime = 0; particleSystem.createExplosion(redSunray.x, redSunray.y, 0x00ffff, 12); redSunray.destroy(); redSunrays.splice(k, 1); } } redSunray.lastY = redSunray.y; } // Check collisions between snowflakes and sun rays for (var s = snowflakes.length - 1; s >= 0; s--) { var snowflake = snowflakes[s]; for (var r = sunrays.length - 1; r >= 0; r--) { var sunray = sunrays[r]; if (snowflake.intersects(sunray)) { // Collision detected raysDestroyed++; combo++; comboTimer = 180; // 3 seconds at 60fps var points = 10 + (combo - 1) * 5; totalScore += points; scoreText.setText('Score: ' + totalScore); if (combo > 1) { comboText.setText('COMBO x' + combo + ' (+' + points + ')'); } LK.getSound('hit').play(); // Create explosion effect particleSystem.createExplosion(sunray.x, sunray.y, 0xffd700, 10); // Remove both objects snowflake.destroy(); snowflakes.splice(s, 1); sunray.destroy(); sunrays.splice(r, 1); // Check level completion if (raysDestroyed >= raysNeededForLevel && !gameWon) { gameWon = true; polarBearDisplay.showHappy(); LK.getSound('levelcomplete').play(); LK.setTimeout(function () { // Next level currentLevel++; levelText.setText('Level: ' + currentLevel); raysNeededForLevel += 5; gameWon = false; combo = 0; comboTimer = 0; comboText.setText(''); // Reset polar bear display polarBearDisplay.destroy(); polarBearDisplay = game.addChild(new PolarBearDisplay()); polarBearDisplay.x = 1024; polarBearDisplay.y = 200; }, 3000); } break; } } } // Check collisions between snowflakes and red sun rays for (var s2 = snowflakes.length - 1; s2 >= 0; s2--) { var snowflake2 = snowflakes[s2]; for (var r2 = redSunrays.length - 1; r2 >= 0; r2--) { var redSunray2 = redSunrays[r2]; if (snowflake2.intersects(redSunray2)) { // Hit the red sunray var isDestroyed = redSunray2.hit(); LK.getSound('hit').play(); // Remove snowflake snowflake2.destroy(); snowflakes.splice(s2, 1); if (isDestroyed) { // Red sunray is destroyed after 2 hits raysDestroyed++; combo++; comboTimer = 180; // 3 seconds at 60fps var points = 20 + (combo - 1) * 10; // Double points for red sunrays totalScore += points; scoreText.setText('Score: ' + totalScore); if (combo > 1) { comboText.setText('COMBO x' + combo + ' (+' + points + ')'); } // Create explosion effect particleSystem.createExplosion(redSunray2.x, redSunray2.y, 0xff0000, 15); // Remove red sunray redSunray2.destroy(); redSunrays.splice(r2, 1); // Reduce red sunray spawn chance for 10 seconds redSunrayChanceReduced = true; redSunraySpawnChance = 0.05; // Reduce to 5% redSunrayChanceTimer = 600; // 10 seconds at 60fps // Check level completion if (raysDestroyed >= raysNeededForLevel && !gameWon) { gameWon = true; polarBearDisplay.showHappy(); LK.getSound('levelcomplete').play(); LK.setTimeout(function () { // Next level currentLevel++; levelText.setText('Level: ' + currentLevel); raysNeededForLevel += 5; gameWon = false; combo = 0; comboTimer = 0; comboText.setText(''); // Reset polar bear display polarBearDisplay.destroy(); polarBearDisplay = game.addChild(new PolarBearDisplay()); polarBearDisplay.x = 1024; polarBearDisplay.y = 200; }, 3000); } } else { // Create small hit effect for first hit particleSystem.createExplosion(redSunray2.x, redSunray2.y, 0xff6666, 5); } break; } } } };
===================================================================
--- original.js
+++ change.js
@@ -1,9 +1,8 @@
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
-var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
@@ -181,33 +180,8 @@
cannonGraphics.rotation += 0.05;
};
return self;
});
-var GreenSnowflake = Container.expand(function () {
- var self = Container.call(this);
- var snowflakeGraphics = self.attachAsset('snowflake', {
- anchorX: 0.5,
- anchorY: 0.5
- });
- snowflakeGraphics.tint = 0x00ff00; // Green tint
- self.speed = -8;
- self.isRemoteControlled = true;
- self.targetX = self.x;
- self.moveSpeed = 15;
- self.update = function () {
- // Move towards target X position
- var diff = self.targetX - self.x;
- if (Math.abs(diff) > 2) {
- self.x += diff > 0 ? self.moveSpeed : -self.moveSpeed;
- }
- self.y += self.speed;
- };
- self.setTarget = function (targetX) {
- self.targetX = targetX;
- };
- return self;
-});
-// Green snowflake upgrade icon
var IceCubePowerUp = Container.expand(function () {
var self = Container.call(this);
var iceCubeGraphics = self.attachAsset('iceblocksad', {
anchorX: 0.5,
@@ -339,11 +313,9 @@
self.hits = 0;
self.maxHits = 2;
self.flashTimer = 0;
self.update = function () {
- if (!shopOpen) {
- self.y += self.speed;
- }
+ self.y += self.speed;
// Flash effect when hit
if (self.flashTimer > 0) {
self.flashTimer--;
var alpha = 0.3 + Math.sin(self.flashTimer * 0.5) * 0.3;
@@ -383,11 +355,9 @@
anchorY: 0.5
});
self.speed = 4;
self.update = function () {
- if (!shopOpen) {
- self.y += self.speed;
- }
+ self.y += self.speed;
};
return self;
});
@@ -434,15 +404,8 @@
var redSunrayChanceTimer = 0;
var playerLives = 3;
var maxLives = 3;
var iceCubePowerUps = [];
-var shopOpen = false;
-var shopButton;
-var shopContainer;
-var doubleShotUpgrade = false;
-var greenSnowflakeUpgrade = false;
-var shotCounter = 0;
-var activeGreenSnowflake = null;
// Create score display
var scoreText = new Text2('Score: 0', {
size: 60,
fill: 0xFFFFFF
@@ -504,106 +467,8 @@
}
}
// Initialize lives display
updateLivesDisplay();
-// Create shop button
-shopButton = new Text2('SHOP', {
- size: 50,
- fill: 0xFFD700
-});
-shopButton.anchor.set(1, 0);
-shopButton.x = -20;
-shopButton.y = 20;
-LK.gui.topRight.addChild(shopButton);
-// Create shop container (initially hidden)
-shopContainer = new Container();
-shopContainer.visible = false;
-// Shop background
-var shopBg = LK.getAsset('iceblocksad', {
- anchorX: 0.5,
- anchorY: 0.5,
- scaleX: 15,
- scaleY: 10,
- x: 1024,
- y: 1366,
- alpha: 0.9
-});
-shopBg.tint = 0x000080;
-shopContainer.addChild(shopBg);
-// Shop title
-var shopTitle = new Text2('UPGRADE SHOP', {
- size: 80,
- fill: 0xFFFFFF
-});
-shopTitle.anchor.set(0.5, 0.5);
-shopTitle.x = 1024;
-shopTitle.y = 900;
-shopContainer.addChild(shopTitle);
-// Points display
-var pointsDisplay = new Text2('Points: ' + (storage.points || 0), {
- size: 60,
- fill: 0xFFD700
-});
-pointsDisplay.anchor.set(0.5, 0.5);
-pointsDisplay.x = 1024;
-pointsDisplay.y = 1000;
-shopContainer.addChild(pointsDisplay);
-// Double shot upgrade icon (two snowflakes)
-var doubleShotIcon = new Container();
-var snowflake1 = LK.getAsset('snowflake', {
- anchorX: 0.5,
- anchorY: 0.5,
- scaleX: 0.8,
- scaleY: 0.8,
- x: -40,
- y: 0
-});
-var snowflake2 = LK.getAsset('snowflake', {
- anchorX: 0.5,
- anchorY: 0.5,
- scaleX: 0.8,
- scaleY: 0.8,
- x: 40,
- y: 0
-});
-doubleShotIcon.addChild(snowflake1);
-doubleShotIcon.addChild(snowflake2);
-doubleShotIcon.x = 1024;
-doubleShotIcon.y = 1200;
-shopContainer.addChild(doubleShotIcon);
-// Price text for double shot
-var doubleShotPrice = new Text2('50 pts', {
- size: 40,
- fill: 0x00FF00
-});
-doubleShotPrice.anchor.set(0.5, 0.5);
-doubleShotPrice.x = 1024;
-doubleShotPrice.y = 1280;
-shopContainer.addChild(doubleShotPrice);
-game.addChild(shopContainer);
-// Initialize storage values if they don't exist
-if (storage.points === undefined) storage.points = 0;
-if (storage.doubleShot === undefined) storage.doubleShot = false;
-if (storage.greenSnowflake === undefined) storage.greenSnowflake = false;
-// Initialize storage values if they don't exist
-if (storage.points === undefined) storage.points = 0;
-if (storage.doubleShot === undefined) storage.doubleShot = false;
-if (storage.greenSnowflake === undefined) storage.greenSnowflake = false;
-// Load purchased upgrades from storage
-doubleShotUpgrade = storage.doubleShot === true;
-greenSnowflakeUpgrade = storage.greenSnowflake === true;
-// Update shop display based on actual storage values
-if (storage.doubleShot === true) {
- doubleShotPrice.setText('OWNED');
- doubleShotPrice.fill = 0x888888;
- snowflake1.alpha = 0.5;
- snowflake2.alpha = 0.5;
-}
-if (storage.greenSnowflake === true) {
- greenSnowflakePrice.setText('OWNED');
- greenSnowflakePrice.fill = 0x888888;
- greenSnowflakeIcon.alpha = 0.5;
-}
// Start playing background music
LK.playMusic('FrozenSavior');
// Create cannon
cannon = game.addChild(new Cannon());
@@ -616,78 +481,11 @@
polarBearDisplay.x = 1024;
polarBearDisplay.y = 200;
// Touch controls
game.down = function (x, y, obj) {
- // Check if shop button was clicked (using screen coordinates)
- // Shop button is positioned at top-right, so check if click is in that area
- if (x >= 1848 && x <= 2048 && y >= 20 && y <= 80) {
- shopOpen = !shopOpen;
- shopContainer.visible = shopOpen;
- if (shopOpen) {
- pointsDisplay.setText('Points: ' + (storage.points || 0));
- // Update double shot display
- if (storage.doubleShot === true) {
- doubleShotPrice.setText('OWNED');
- doubleShotPrice.fill = 0x888888;
- snowflake1.alpha = 0.5;
- snowflake2.alpha = 0.5;
- }
- // Update green snowflake display
- if (storage.greenSnowflake === true) {
- greenSnowflakePrice.setText('OWNED');
- greenSnowflakePrice.fill = 0x888888;
- greenSnowflakeIcon.alpha = 0.5;
- }
- }
- return;
- }
- // Check shop interactions when shop is open
- if (shopOpen) {
- // Close button - positioned at center bottom of shop
- if (Math.abs(x - 1024) < 100 && Math.abs(y - 1600) < 50) {
- shopOpen = false;
- shopContainer.visible = false;
- return;
- }
- // Double shot upgrade icon - positioned at center of shop
- if (storage.doubleShot !== true && Math.abs(x - 1024) < 100 && Math.abs(y - 1200) < 100) {
- if ((storage.points || 0) >= 50) {
- storage.points = (storage.points || 0) - 50;
- storage.doubleShot = true;
- doubleShotUpgrade = true;
- doubleShotPrice.setText('OWNED');
- doubleShotPrice.fill = 0x888888;
- snowflake1.alpha = 0.5;
- snowflake2.alpha = 0.5;
- pointsDisplay.setText('Points: ' + storage.points);
- }
- return;
- }
- // Green snowflake upgrade icon - positioned below double shot
- else if (storage.greenSnowflake !== true && Math.abs(x - 1024) < 100 && Math.abs(y - 1400) < 100) {
- if ((storage.points || 0) >= 100) {
- storage.points = (storage.points || 0) - 100;
- storage.greenSnowflake = true;
- greenSnowflakeUpgrade = true;
- greenSnowflakePrice.setText('OWNED');
- greenSnowflakePrice.fill = 0x888888;
- greenSnowflakeIcon.alpha = 0.5;
- pointsDisplay.setText('Points: ' + storage.points);
- }
- return;
- }
- // Don't move cannon when shop is open
- return;
- }
cannon.moveTo(x);
};
game.move = function (x, y, obj) {
- // Don't move cannon when shop is open
- if (shopOpen) return;
- // Control active green snowflake if it exists
- if (activeGreenSnowflake && activeGreenSnowflake.isRemoteControlled) {
- activeGreenSnowflake.setTarget(x);
- }
cannon.moveTo(x);
};
// Main game update loop
game.update = function () {
@@ -707,38 +505,26 @@
redSunrayChanceReduced = false;
redSunraySpawnChance = 0.2; // Reset to 20%
}
}
- // Auto-shoot snowflakes (faster with rapid fire or double shot upgrade)
- var shootInterval = cannon.rapidFireActive ? 500 : doubleShotUpgrade ? 1000 : 2000;
+ // Auto-shoot snowflakes (faster with rapid fire)
+ var shootInterval = cannon.rapidFireActive ? 500 : 2000;
if (currentTime - lastShotTime >= shootInterval) {
- // Check if we should shoot a green snowflake every 3rd shot
- if (greenSnowflakeUpgrade && shotCounter % 3 === 2 && !activeGreenSnowflake) {
- var newGreenSnowflake = new GreenSnowflake();
- newGreenSnowflake.x = cannon.x;
- newGreenSnowflake.y = cannon.y - 120;
- newGreenSnowflake.lastY = newGreenSnowflake.y;
- snowflakes.push(newGreenSnowflake);
- game.addChild(newGreenSnowflake);
- activeGreenSnowflake = newGreenSnowflake;
- } else {
- var snowflakeCount = cannon.multishotActive ? 10 : 1;
- for (var shot = 0; shot < snowflakeCount; shot++) {
- var newSnowflake = new Snowflake();
- if (snowflakeCount === 1) {
- newSnowflake.x = cannon.x;
- } else {
- // Spread snowflakes in an arc
- var spreadAngle = (shot - (snowflakeCount - 1) / 2) * 0.3;
- newSnowflake.x = cannon.x + Math.sin(spreadAngle) * 50;
- }
- newSnowflake.y = cannon.y - 120;
- newSnowflake.lastY = newSnowflake.y;
- snowflakes.push(newSnowflake);
- game.addChild(newSnowflake);
+ var snowflakeCount = cannon.multishotActive ? 10 : 1;
+ for (var shot = 0; shot < snowflakeCount; shot++) {
+ var newSnowflake = new Snowflake();
+ if (snowflakeCount === 1) {
+ newSnowflake.x = cannon.x;
+ } else {
+ // Spread snowflakes in an arc
+ var spreadAngle = (shot - (snowflakeCount - 1) / 2) * 0.3;
+ newSnowflake.x = cannon.x + Math.sin(spreadAngle) * 50;
}
+ newSnowflake.y = cannon.y - 120;
+ newSnowflake.lastY = newSnowflake.y;
+ snowflakes.push(newSnowflake);
+ game.addChild(newSnowflake);
}
- shotCounter++;
lastShotTime = currentTime;
LK.getSound('shoot').play();
}
// Spawn sun rays
@@ -765,10 +551,10 @@
}
// Spawn power-ups
if (currentTime - lastPowerUpSpawn >= powerUpSpawnInterval) {
var randomType = Math.random();
- if (randomType < 0.2) {
- // 20% chance for cannon power-up
+ if (randomType < 0.04) {
+ // 4% chance for cannon power-up
var newCannonPowerUp = new CannonPowerUp();
newCannonPowerUp.x = Math.random() * (2048 - 200) + 100;
newCannonPowerUp.y = -30;
cannonPowerUps.push(newCannonPowerUp);
@@ -817,12 +603,8 @@
for (var i = snowflakes.length - 1; i >= 0; i--) {
var snowflake = snowflakes[i];
// Check if snowflake went off screen
if (snowflake.lastY >= -50 && snowflake.y < -50) {
- // Clean up active green snowflake reference
- if (snowflake === activeGreenSnowflake) {
- activeGreenSnowflake = null;
- }
snowflake.destroy();
snowflakes.splice(i, 1);
continue;
}
@@ -966,20 +748,15 @@
combo++;
comboTimer = 180; // 3 seconds at 60fps
var points = 10 + (combo - 1) * 5;
totalScore += points;
- storage.points = (storage.points || 0) + 1; // Award 1 point for regular sunray
scoreText.setText('Score: ' + totalScore);
if (combo > 1) {
comboText.setText('COMBO x' + combo + ' (+' + points + ')');
}
LK.getSound('hit').play();
// Create explosion effect
particleSystem.createExplosion(sunray.x, sunray.y, 0xffd700, 10);
- // Clean up active green snowflake reference
- if (snowflake === activeGreenSnowflake) {
- activeGreenSnowflake = null;
- }
// Remove both objects
snowflake.destroy();
snowflakes.splice(s, 1);
sunray.destroy();
@@ -1017,12 +794,8 @@
if (snowflake2.intersects(redSunray2)) {
// Hit the red sunray
var isDestroyed = redSunray2.hit();
LK.getSound('hit').play();
- // Clean up active green snowflake reference
- if (snowflake2 === activeGreenSnowflake) {
- activeGreenSnowflake = null;
- }
// Remove snowflake
snowflake2.destroy();
snowflakes.splice(s2, 1);
if (isDestroyed) {
@@ -1031,9 +804,8 @@
combo++;
comboTimer = 180; // 3 seconds at 60fps
var points = 20 + (combo - 1) * 10; // Double points for red sunrays
totalScore += points;
- storage.points = (storage.points || 0) + 3; // Award 3 points for red sunray
scoreText.setText('Score: ' + totalScore);
if (combo > 1) {
comboText.setText('COMBO x' + combo + ' (+' + points + ')');
}
@@ -1074,25 +846,5 @@
break;
}
}
}
-};
-// Green snowflake upgrade icon
-var greenSnowflakeIcon = LK.getAsset('snowflake', {
- anchorX: 0.5,
- anchorY: 0.5,
- scaleX: 1.2,
- scaleY: 1.2,
- x: 1024,
- y: 1400
-});
-greenSnowflakeIcon.tint = 0x00ff00;
-shopContainer.addChild(greenSnowflakeIcon);
-// Price text for green snowflake
-var greenSnowflakePrice = new Text2('100 pts', {
- size: 40,
- fill: 0x00FF00
-});
-greenSnowflakePrice.anchor.set(0.5, 0.5);
-greenSnowflakePrice.x = 1024;
-greenSnowflakePrice.y = 1480;
-shopContainer.addChild(greenSnowflakePrice);
\ No newline at end of file
+};
\ No newline at end of file
Snowflake. In-Game asset. 2d. High contrast. No shadows
Sad baby polar bear. In-Game asset. 2d. High contrast. No shadows
Happy baby polar bear. In-Game asset. 2d. High contrast. No shadows
Gigantic ice tundra. In-Game asset. 2d. High contrast. No shadows
Ice cube seen from the front. In-Game asset. 2d. High contrast. No shadows