User prompt
Make fire and smoke live for 30% longer
User prompt
Make fire and smoke live for 2x as long
User prompt
2x how many fire particels we have
User prompt
Make the spawn area for fire and smoke 30% larger
User prompt
The fire ans smoke spawn to high up on the y axis, move them all down by 300px
User prompt
Move spawn place down by 300px
User prompt
Move spawn place down by 400px
User prompt
Make the spawn area of fire and smoke twice as big
User prompt
Make the spawn area of fire and smoke twice as big
User prompt
Make the fire particels move half as fast
Code edit (1 edits merged)
Please save this source code
User prompt
Always spawn smoke particels behind the fire particels
User prompt
10x how many smoke particels we have
User prompt
Make all smoke particles much smaller, range should be 5-10px
User prompt
Make smoke particles be slower moving longer lasting
User prompt
Make the fire particels have blend mode = 1
Remix started
Copy Fire Animations
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ var FireParticle = Container.expand(function () { var self = Container.call(this); // Create particle graphics based on type var graphics; self.particleType = 'fire'; // default type self.setType = function (type) { if (self.graphics) { self.removeChild(self.graphics); } self.particleType = type; if (type === 'fire') { self.graphics = self.attachAsset('fireParticle', { anchorX: 0.5, anchorY: 0.5 }); self.graphics.blendMode = 1; } else if (type === 'core') { self.graphics = self.attachAsset('fireCore', { anchorX: 0.5, anchorY: 0.5 }); self.graphics.blendMode = 1; } else if (type === 'smoke') { self.graphics = self.attachAsset('smoke', { anchorX: 0.5, anchorY: 0.5 }); } }; // Initialize with default type self.setType('fire'); // Particle properties self.velocityX = 0; self.velocityY = 0; self.life = 1.0; self.maxLife = 1.0; self.update = function () { // Move particle self.x += self.velocityX; self.y += self.velocityY; // Reduce life - slower for smoke particles if (self.particleType === 'smoke') { self.life -= 0.0054; } else { self.life -= 0.0154; } // Update appearance based on life if (self.graphics) { self.graphics.alpha = Math.max(0, self.life / self.maxLife); if (self.particleType !== 'smoke') { self.graphics.scaleX = self.life; self.graphics.scaleY = self.life; } } // Add some randomness to movement - less for smoke if (self.particleType === 'smoke') { self.velocityX += (Math.random() - 0.5) * 0.1; self.velocityY += (Math.random() - 0.5) * 0.05; } else { self.velocityX += (Math.random() - 0.5) * 0.25; self.velocityY += (Math.random() - 0.5) * 0.15; } // Gravity effect for smoke if (self.particleType === 'smoke') { self.velocityY -= 0.02; } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x51ff00 }); /**** * Game Code ****/ // Add background image fullscreen // Fire color assets that grow with wood placement var fireColorSize = 100; // Base size that will grow by 5 each wood placement var background = game.attachAsset('background1', { x: 0, y: 0, width: 2048, height: 2732 }); // Fire animation system var fireParticles = []; var fireBaseX = 1024; // Center of screen var fireBaseY = 1800; // Center of screen vertically var baseFireScale = 0.2; // Base scale factor for fire size (20x20) var fireScale = baseFireScale; // Current fire scale (will increase with burning wood) var burningWoodCount = 0; // Track number of burning wood pieces var lastWoodPlacedTime = LK.ticks; // Track when wood was last placed on fire var fireReductionTimer = 10 * 60; // 10 seconds at 60fps var gameStartTime = LK.ticks; // Track when game started var initialFireReductionStarted = true; // Track if initial reduction has started var fireGrowthTimer = null; // Timer for automatic fire growth var maxFireScale = 2.0; // Maximum fire scale (200x200 pixels) // Play fire sound repeatedly var fireSoundTimer = LK.setInterval(function () { LK.getSound('Firesound').play(); }, 2000); // Play every 2 seconds // Track wood placement count for incremental growth var woodPlacementCount = 0; // Function to update fire color asset sizes function updateFireColorSizes() { fireColorSize = Math.min(100 + woodPlacementCount * 5, 200); // Grow by 5 pixels per wood, max 200 // Reinitialize all fire color assets with new size } // Create fire particles continuously var fireTimer = LK.setInterval(function () { // Create main fire particles for (var i = 0; i < 16; i++) { var particle = new FireParticle(); // Use different fire color assets randomly var fireTypes = ['fireParticle', 'fireOrange', 'fireLightOrange', 'fireGold', 'fireBlue', 'fireGreen', 'fireMagenta', 'fireCyan', 'firePurple']; var randomFireType = fireTypes[Math.floor(Math.random() * fireTypes.length)]; if (particle.graphics) { particle.removeChild(particle.graphics); } particle.graphics = particle.attachAsset(randomFireType, { anchorX: 0.5, anchorY: 0.5 }); particle.graphics.blendMode = 1; particle.x = fireBaseX + (Math.random() - 0.5) * 2080 * fireScale; particle.y = fireBaseY + 300 + (Math.random() - 0.5) * 832 * fireScale; particle.velocityX = (Math.random() - 0.5) * 4; particle.velocityY = -Math.random() * 10 - 4; particle.life = 1.0; particle.maxLife = 1.0; // Scale animation - much bigger particles particle.graphics.scaleX = 2.0 + Math.random() * 2.0; particle.graphics.scaleY = 2.0 + Math.random() * 2.0; tween(particle.graphics, { scaleX: particle.graphics.scaleX * 3.0, scaleY: particle.graphics.scaleY * 3.0 }, { duration: 500 + Math.random() * 500, easing: tween.easeOut }); fireParticles.push(particle); game.addChild(particle); } // Create core fire particles (yellow/white) for (var j = 0; j < 10; j++) { var coreParticle = new FireParticle(); // Use core fire assets randomly var coreTypes = ['fireCore', 'fireYellowWhite', 'whiteParticle']; var randomCoreType = coreTypes[Math.floor(Math.random() * coreTypes.length)]; if (coreParticle.graphics) { coreParticle.removeChild(coreParticle.graphics); } coreParticle.graphics = coreParticle.attachAsset(randomCoreType, { anchorX: 0.5, anchorY: 0.5 }); coreParticle.graphics.blendMode = 1; coreParticle.x = fireBaseX + (Math.random() - 0.5) * 1300 * fireScale; coreParticle.y = fireBaseY + 300 + (Math.random() - 0.5) * 624 * fireScale; coreParticle.velocityX = (Math.random() - 0.5) * 3; coreParticle.velocityY = -Math.random() * 9 - 5; coreParticle.life = 1.0; coreParticle.maxLife = 1.0; // Much bigger core particles coreParticle.graphics.scaleX = 2.5; coreParticle.graphics.scaleY = 2.5; fireParticles.push(coreParticle); game.addChild(coreParticle); } // Create bright white hot center particles for (var k = 0; k < 6; k++) { var whiteParticle = new FireParticle(); if (whiteParticle.graphics) { whiteParticle.removeChild(whiteParticle.graphics); } whiteParticle.graphics = whiteParticle.attachAsset('whiteParticle', { anchorX: 0.5, anchorY: 0.5 }); whiteParticle.graphics.blendMode = 1; whiteParticle.x = fireBaseX + (Math.random() - 0.5) * 780 * fireScale; whiteParticle.y = fireBaseY + 300 + (Math.random() - 0.5) * 416 * fireScale; whiteParticle.velocityX = (Math.random() - 0.5) * 2; whiteParticle.velocityY = -Math.random() * 7.5 - 4; whiteParticle.life = 1.0; whiteParticle.maxLife = 1.0; // Intense white hot center particles whiteParticle.graphics.scaleX = 1.8; whiteParticle.graphics.scaleY = 1.8; // Add white glow effect with tween tween(whiteParticle.graphics, { scaleX: whiteParticle.graphics.scaleX * 2.5, scaleY: whiteParticle.graphics.scaleY * 2.5 }, { duration: 400 + Math.random() * 300, easing: tween.easeOut }); fireParticles.push(whiteParticle); game.addChild(whiteParticle); } // Create white base particles at the bottom of the fire for (var m = 0; m < 12; m++) { var whiteBaseParticle = new FireParticle(); if (whiteBaseParticle.graphics) { whiteBaseParticle.removeChild(whiteBaseParticle.graphics); } whiteBaseParticle.graphics = whiteBaseParticle.attachAsset('whiteParticle', { anchorX: 0.5, anchorY: 0.5 }); whiteBaseParticle.graphics.blendMode = 1; whiteBaseParticle.x = fireBaseX + (Math.random() - 0.5) * 1040 * fireScale; whiteBaseParticle.y = fireBaseY + 300 + 150 * fireScale + (Math.random() - 0.5) * 520 * fireScale; whiteBaseParticle.velocityX = (Math.random() - 0.5) * 1.5; whiteBaseParticle.velocityY = -Math.random() * 2.5 - 1; whiteBaseParticle.life = 1.0; whiteBaseParticle.maxLife = 1.0; // Base white particles same size as other fire particles whiteBaseParticle.graphics.scaleX = 2.0 + Math.random() * 1.0; whiteBaseParticle.graphics.scaleY = 2.0 + Math.random() * 1.0; // Add gentle scaling animation tween(whiteBaseParticle.graphics, { scaleX: whiteBaseParticle.graphics.scaleX * 2.0, scaleY: whiteBaseParticle.graphics.scaleY * 2.0 }, { duration: 600 + Math.random() * 400, easing: tween.easeOut }); fireParticles.push(whiteBaseParticle); game.addChild(whiteBaseParticle); // Move white base particles to back (behind fire) game.setChildIndex(whiteBaseParticle, 1); } // Create smoke particles (black/dark) - 10x more particles for (var s = 0; s < 10; s++) { var smokeParticle = new FireParticle(); // Use different smoke color assets randomly var smokeTypes = ['smoke', 'smokeGray', 'smokeLightGray', 'smokePurple', 'smokeTeal', 'smokeYellow']; var randomSmokeType = smokeTypes[Math.floor(Math.random() * smokeTypes.length)]; if (smokeParticle.graphics) { smokeParticle.removeChild(smokeParticle.graphics); } smokeParticle.graphics = smokeParticle.attachAsset(randomSmokeType, { anchorX: 0.5, anchorY: 0.5 }); smokeParticle.x = fireBaseX + (Math.random() - 0.5) * 1664 * fireScale; smokeParticle.y = fireBaseY + 300 - 300 * fireScale - Math.random() * 1040 * fireScale; smokeParticle.velocityX = (Math.random() - 0.5) * 3; smokeParticle.velocityY = -Math.random() * 3 - 1; smokeParticle.life = 3.9; smokeParticle.maxLife = 3.9; // Smoke particles start small (5-10px range) and grow slightly var startScale = 0.05 + Math.random() * 0.05; // 5-10px range from 100px base tween(smokeParticle.graphics, { scaleX: startScale * 2, scaleY: startScale * 2 }, { duration: 7800, easing: tween.easeOut }); smokeParticle.graphics.scaleX = startScale; smokeParticle.graphics.scaleY = startScale; fireParticles.push(smokeParticle); game.addChild(smokeParticle); // Move smoke particles to back (behind fire particles) game.setChildIndex(smokeParticle, 1); } }, 80); // Update fire system game.update = function () { // Count burning wood pieces and update fire scale burningWoodCount = 0; for (var w = 0; w < woodPieces.length; w++) { if (woodPieces[w].isBurning) { burningWoodCount++; } } // Start fire reduction only after no wood has been placed for a while AND fire has stopped growing var timeSinceLastWood = LK.ticks - lastWoodPlacedTime; var delayBeforeReduction = 5 * 60; // 5 seconds delay before starting reduction var fireFinishedGrowing = fireScale >= maxFireScale || fireGrowthTimer === null; if (!initialFireReductionStarted && timeSinceLastWood >= delayBeforeReduction && burningWoodCount === 0 && fireFinishedGrowing) { // Create a dummy object to tween the fireScale value var fireScaleObj = { value: fireScale }; // Begin fire reduction after delay using tween - first phase to 5x5 size var minSize = 5.0 / 100.0; // 5x5 pixels out of 100 pixel base asset tween(fireScaleObj, { value: minSize }, { duration: 8000, // 8 seconds to reach minimum size easing: tween.linear, onFinish: function onFinish() { // Start second phase: reduce from 5x5 to 0x0 tween(fireScaleObj, { value: 0 }, { duration: 2000, // 2 seconds to reach 0 easing: tween.linear, onFinish: function onFinish() { // Create dark overlay for screen fade var darkOverlay = LK.getAsset('smoke', { anchorX: 0, anchorY: 0, scaleX: 20.48, scaleY: 27.32, alpha: 0, x: 0, y: 0 }); darkOverlay.tint = 0x000000; game.addChild(darkOverlay); // Fade screen to black then show game over tween(darkOverlay, { alpha: 1 }, { duration: 1500, easing: tween.easeIn, onFinish: function onFinish() { LK.showGameOver(); } }); } }); } }); // Store reference to update fireScale each frame game.fireScaleObj = fireScaleObj; initialFireReductionStarted = true; } // Update fire scale from tween if active if (game.fireScaleObj) { fireScale = game.fireScaleObj.value; } // Add scale increase from burning wood var scaleIncrease = burningWoodCount * (30.0 / 100.0); // 30 pixels out of 100 pixel base asset fireScale = Math.max(0, fireScale + scaleIncrease); // Fire continues burning even at 400x400 pixels - no cleanup needed // Update and clean up particles for (var i = fireParticles.length - 1; i >= 0; i--) { var particle = fireParticles[i]; // Remove dead particles if (particle.life <= 0) { particle.destroy(); fireParticles.splice(i, 1); continue; } } // Update wood burning particles - wood now burns indefinitely for (var w = woodPieces.length - 1; w >= 0; w--) { var wood = woodPieces[w]; if (wood.isBurning) { // Clean up dead burn particles for (var b = wood.burnParticles.length - 1; b >= 0; b--) { var burnParticle = wood.burnParticles[b]; if (burnParticle.life <= 0) { wood.burnParticles.splice(b, 1); } } } } // Add flickering effect to the fire base if (LK.ticks % 10 === 0) { fireBaseX = 1024 + (Math.random() - 0.5) * 120 * fireScale; } }; // Array to track wood pieces var woodPieces = []; var draggedWood = null; // Track currently dragged wood var woodButton = game.attachAsset('woodButton', { x: 2048 - 100 - 100, y: 2732 - 100 - 50, // Adjusted Y to account for button height anchorX: 0.5, anchorY: 0.5 }); // Ensure wood button is visible on top of background game.setChildIndex(woodButton, game.children.length - 1); // Wood button click handler woodButton.down = function (x, y, obj) { // Create new wood piece at button position var newWood = game.attachAsset('Wood', { x: woodButton.x, y: woodButton.y, anchorX: 0.5, anchorY: 0.5 }); // Add wood piece properties newWood.isBurning = false; newWood.burnParticles = []; newWood.isDragging = true; // Mark as dragging woodPieces.push(newWood); // Ensure wood piece is visible on top of background game.setChildIndex(newWood, game.children.length - 1); // Set as active dragged wood draggedWood = newWood; }; // Game move handler for dragging wood game.move = function (x, y, obj) { if (draggedWood) { draggedWood.x = x; draggedWood.y = y; } }; // Game touch handler to start dragging existing wood pieces game.down = function (x, y, obj) { // Check if touch is on any existing wood piece for (var i = 0; i < woodPieces.length; i++) { var wood = woodPieces[i]; // Check if touch is within wood bounds var woodLeft = wood.x - wood.width / 2; var woodRight = wood.x + wood.width / 2; var woodTop = wood.y - wood.height / 2; var woodBottom = wood.y + wood.height / 2; if (x >= woodLeft && x <= woodRight && y >= woodTop && y <= woodBottom) { // Set this wood as the dragged piece draggedWood = wood; wood.isDragging = true; // Stop current burning if it was burning if (wood.isBurning && wood.fireTimer) { LK.clearInterval(wood.fireTimer); wood.fireTimer = null; // Clean up current burn particles for (var b = wood.burnParticles.length - 1; b >= 0; b--) { var burnParticle = wood.burnParticles[b]; burnParticle.destroy(); wood.burnParticles.splice(b, 1); } } // Reset burning state to allow re-placement wood.isBurning = false; wood.burnStartTime = null; break; } } }; // Game up handler to stop dragging and check for fire placement game.up = function (x, y, obj) { if (draggedWood) { // Check if wood is placed on fire area when released var fireDistance = Math.sqrt(Math.pow(draggedWood.x - fireBaseX, 2) + Math.pow(draggedWood.y - fireBaseY, 2)); if (fireDistance < 200 * fireScale) { // Always allow placement on fire, regardless of previous burning state draggedWood.isBurning = true; lastWoodPlacedTime = LK.ticks; // Update last wood placement time // Stop and reset the fire reduction system when wood is placed if (initialFireReductionStarted && game.fireScaleObj) { tween.stop(game.fireScaleObj, { value: true }); // Reset fire scale to a stable value while wood is burning game.fireScaleObj.value = Math.max(baseFireScale, game.fireScaleObj.value); // Reset the reduction system to allow it to restart after delay initialFireReductionStarted = false; game.fireScaleObj = null; } // Increment wood placement count for growing effect woodPlacementCount++; // Update fire color asset sizes by 5 pixels updateFireColorSizes(); // Calculate incremental growth - each wood placement grows more than the previous var baseGrowthAmount = 5.0 / 100.0; // Base growth of 5 pixels worth of scale var incrementalGrowthAmount = baseGrowthAmount + woodPlacementCount * 2.0 / 100.0; // Additional 2 pixels per placement // Apply the incremental growth using tween for smooth effect var currentFireScale = game.fireScaleObj ? game.fireScaleObj.value : fireScale; var targetFireScale = Math.min(currentFireScale + incrementalGrowthAmount, maxFireScale); if (game.fireScaleObj) { // Stop current tween and start new one tween.stop(game.fireScaleObj, { value: true }); } var fireScaleObj = { value: currentFireScale }; tween(fireScaleObj, { value: targetFireScale }, { duration: 800, easing: tween.easeOut, onFinish: function onFinish() { fireScale = targetFireScale; } }); game.fireScaleObj = fireScaleObj; // Update fireScale immediately for particle system fireScale = targetFireScale; // Check if fire has reached 200x200 and trigger vanish if (fireScale >= maxFireScale) { fireScale = maxFireScale; // Vanish fire when it reaches 200x200 pixels var fireScaleObj = { value: fireScale }; tween(fireScaleObj, { value: 0 }, { duration: 2000, easing: tween.linear, onFinish: function onFinish() { // Create bright overlay for win screen fade var brightOverlay = LK.getAsset('fireCore', { anchorX: 0, anchorY: 0, scaleX: 20.48, scaleY: 27.32, alpha: 0, x: 0, y: 0 }); brightOverlay.tint = 0xffd700; game.addChild(brightOverlay); // Fade screen to golden then show you win tween(brightOverlay, { alpha: 0.8 }, { duration: 1500, easing: tween.easeIn, onFinish: function onFinish() { LK.showYouWin(); } }); } }); game.fireScaleObj = fireScaleObj; } startWoodBurning(draggedWood, draggedWood.x, draggedWood.y); } draggedWood.isDragging = false; draggedWood = null; } }; // Function to start wood burning at touch position function startWoodBurning(wood, touchX, touchY) { // Wood now burns indefinitely - no destruction timer needed // Create fire particles on the touched side of the wood var fireTimer = LK.setInterval(function () { for (var j = 0; j < 6; j++) { var burnParticle = new FireParticle(); // Use different fire color assets randomly for burning wood var fireTypes = ['fireParticle', 'fireOrange', 'fireLightOrange', 'fireGold', 'fireBlue', 'fireGreen', 'fireMagenta', 'fireCyan', 'firePurple']; var randomFireType = fireTypes[Math.floor(Math.random() * fireTypes.length)]; if (burnParticle.graphics) { burnParticle.removeChild(burnParticle.graphics); } burnParticle.graphics = burnParticle.attachAsset(randomFireType, { anchorX: 0.5, anchorY: 0.5 }); burnParticle.graphics.blendMode = 1; burnParticle.x = touchX + (Math.random() - 0.5) * 60; burnParticle.y = touchY + (Math.random() - 0.5) * 30; burnParticle.velocityX = (Math.random() - 0.5) * 2; burnParticle.velocityY = -Math.random() * 4 - 1; burnParticle.life = 1.0; burnParticle.maxLife = 1.0; burnParticle.graphics.scaleX = 0.5 + Math.random() * 0.5; burnParticle.graphics.scaleY = 0.5 + Math.random() * 0.5; wood.burnParticles.push(burnParticle); fireParticles.push(burnParticle); game.addChild(burnParticle); } }, 200); wood.fireTimer = fireTimer; }
===================================================================
--- original.js
+++ change.js
@@ -47,11 +47,11 @@
self.x += self.velocityX;
self.y += self.velocityY;
// Reduce life - slower for smoke particles
if (self.particleType === 'smoke') {
- self.life -= 0.0035;
+ self.life -= 0.0054;
} else {
- self.life -= 0.01;
+ self.life -= 0.0154;
}
// Update appearance based on life
if (self.graphics) {
self.graphics.alpha = Math.max(0, self.life / self.maxLife);
@@ -85,10 +85,10 @@
/****
* Game Code
****/
-// Fire color assets that grow with wood placement
// Add background image fullscreen
+// Fire color assets that grow with wood placement
var fireColorSize = 100; // Base size that will grow by 5 each wood placement
var background = game.attachAsset('background1', {
x: 0,
y: 0,
@@ -260,17 +260,17 @@
smokeParticle.x = fireBaseX + (Math.random() - 0.5) * 1664 * fireScale;
smokeParticle.y = fireBaseY + 300 - 300 * fireScale - Math.random() * 1040 * fireScale;
smokeParticle.velocityX = (Math.random() - 0.5) * 3;
smokeParticle.velocityY = -Math.random() * 3 - 1;
- smokeParticle.life = 6.0;
- smokeParticle.maxLife = 6.0;
+ smokeParticle.life = 3.9;
+ smokeParticle.maxLife = 3.9;
// Smoke particles start small (5-10px range) and grow slightly
var startScale = 0.05 + Math.random() * 0.05; // 5-10px range from 100px base
tween(smokeParticle.graphics, {
scaleX: startScale * 2,
scaleY: startScale * 2
}, {
- duration: 12000,
+ duration: 7800,
easing: tween.easeOut
});
smokeParticle.graphics.scaleX = startScale;
smokeParticle.graphics.scaleY = startScale;