User prompt
Please fix the bug: 'ReferenceError: Can't find variable: tween' in or related to this line: 'tween(self.scale, {' Line Number: 54 ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Please fix the bug: 'Script error.' in or related to this line: 'self.cells = {' Line Number: 522
User prompt
Update using this: // Create bee and hive trackers var beeTracker = new HoneycombUI(); beeTracker.scale.set(0.8); // Slightly smaller for bee beeTracker.position.set(hive.x - 150, hive.y + 100); var hiveTracker = new HoneycombUI(); hiveTracker.position.set(hive.x + 150, hive.y + 100); game.addChild(beeTracker); game.addChild(hiveTracker);
User prompt
Update as necessary: // First initialize our shapes for each cell type LK.init.shape('pollenCellBase', { width: 60, height: 60, color: 0xFFFFFF, // White base that we'll tint shape: 'box' }); var HoneycombUI = Container.expand(function() { var self = Container.call(this); // Color definitions with proper hex values self.colorValues = { 'red': 0xFF0000, 'blue': 0x0000FF, 'yellow': 0xFFFF00 }; self.cells = { 'red': self.createCell('red'), 'blue': self.createCell('blue'), 'yellow': self.createCell('yellow') }; self.createCell = function(colorName) { var cell = new Container(); // Create base cell var baseCell = LK.getAsset('pollenCellBase', { anchorX: 0.5, anchorY: 0.5 }); // Apply color and semi-transparency baseCell.tint = self.colorValues[colorName]; baseCell.alpha = 0.3; cell.baseShape = baseCell; cell.addChild(baseCell); // Create fill indicator (same shape but fuller opacity) var fillIndicator = LK.getAsset('pollenCellBase', { anchorX: 0.5, anchorY: 0.5 }); fillIndicator.tint = self.colorValues[colorName]; fillIndicator.alpha = 0.7; // Start with zero height for empty fillIndicator.scale.y = 0; cell.fillIndicator = fillIndicator; cell.addChild(fillIndicator); // Add amount text var text = new Text2("0", { size: 24, fill: 0xFFFFFF }); text.anchor.set(0.5); cell.amountText = text; cell.addChild(text); return cell; }; // Position cells var spacing = 70; self.cells.red.position.set(-spacing, 0); self.cells.blue.position.set(0, 0); self.cells.yellow.position.set(spacing, 0); // Add update method self.updateCell = function(color, current, max) { var cell = self.cells[color]; if (cell) { // Update fill indicator var fillAmount = current / max; cell.fillIndicator.scale.y = fillAmount; // Move fill indicator to bottom of cell and scale up cell.fillIndicator.y = (1 - fillAmount) * 30; // Half height of base cell // Update text cell.amountText.text = current.toString(); } }; return self; });
User prompt
Update as necessary using this: // First, register the honeycomb cell shape LK.init.shape('honeycombCell', { width: 60, // Adjust size as needed height: 60, color: 0x000000, // Base color, we'll create different colored versions shape: 'hexagon' // Assuming 'hexagon' is available, if not we might need 'box' }); var HoneycombUI = Container.expand(function() { var self = Container.call(this); // Create cells for each color self.cells = { 'red': self.createCell('red'), 'blue': self.createCell('blue'), 'yellow': self.createCell('yellow') }; self.createCell = function(colorName) { var cell = new Container(); // Create base cell using our registered shape var baseCell = LK.getAsset('honeycombCell', { anchorX: 0.5, anchorY: 0.5 }); cell.addChild(baseCell); // Add text for amount var text = new Text2("0", { size: 24, fill: 0xFFFFFF }); text.anchor.set(0.5); cell.amountText = text; cell.addChild(text); return cell; }; // Arrange cells var hexWidth = 70; // Adjust spacing as needed self.cells.red.position.set(-hexWidth, 0); self.cells.blue.position.set(0, 0); self.cells.yellow.position.set(hexWidth, 0); // Add all cells Object.values(self.cells).forEach(function(cell) { self.addChild(cell); }); return self; });
User prompt
Please fix the bug: 'hexagon.lineStyle is not a function. (In 'hexagon.lineStyle(2, 0xFFFFFF, 0.5)', 'hexagon.lineStyle' is undefined)' in or related to this line: 'hexagon.lineStyle(2, 0xFFFFFF, 0.5);' Line Number: 532
User prompt
Please fix the bug: 'hexagon.lineStyle is not a function. (In 'hexagon.lineStyle(2, 0xFFFFFF, 0.5)', 'hexagon.lineStyle' is undefined)' in or related to this line: 'hexagon.lineStyle(2, 0xFFFFFF, 0.5);' Line Number: 532
User prompt
Please fix the bug: 'undefined is not a constructor (evaluating 'new Graphics()')' in or related to this line: 'var hexagon = new Graphics();' Line Number: 524
User prompt
Please fix the bug: 'self.createHoneycombCell is not a function. (In 'self.createHoneycombCell(0xFF0000)', 'self.createHoneycombCell' is undefined)' in or related to this line: 'self.cells = {' Line Number: 521
User prompt
Update using this code: var HoneycombUI = Container.expand(function() { var self = Container.call(this); // Create honeycomb grid - planning for all colors self.cells = { // Primary colors 'red': self.createHoneycombCell(0xFF0000), 'blue': self.createHoneycombCell(0x0000FF), 'yellow': self.createHoneycombCell(0xFFFF00), // Hybrid colors (initially hidden but structure ready) 'purple': self.createHoneycombCell(0x800080, true), // red + blue 'green': self.createHoneycombCell(0x008000, true), // blue + yellow 'orange': self.createHoneycombCell(0xFFA500, true) // red + yellow }; self.createHoneycombCell = function(color, isHybrid) { var cell = new Container(); // Hexagon shape var hexagon = new Graphics(); var size = 30; // Size of hexagon // Draw hexagon hexagon.lineStyle(2, 0xFFFFFF, 0.5); hexagon.beginFill(0x000000, 0.3); for (var i = 0; i < 6; i++) { var angle = (i * Math.PI / 3); var x = size * Math.cos(angle); var y = size * Math.sin(angle); if (i === 0) hexagon.moveTo(x, y); else hexagon.lineTo(x, y); } hexagon.closePath(); hexagon.endFill(); cell.addChild(hexagon); // Fill graphic for amount var fill = new Graphics(); cell.fillGraphic = fill; cell.addChild(fill); // Amount text var text = new Text2("0", { size: 16, fill: 0xFFFFFF }); text.anchor.set(0.5); cell.amountText = text; cell.addChild(text); // Hide hybrid cells initially if (isHybrid) { cell.visible = false; } return cell; }; // Arrange cells in honeycomb pattern var hexHeight = 60; var hexWidth = 52; // Position primary colors self.cells.red.position.set(-hexWidth, -hexHeight/2); self.cells.blue.position.set(0, -hexHeight); self.cells.yellow.position.set(hexWidth, -hexHeight/2); // Position hybrid colors (for later) self.cells.purple.position.set(-hexWidth/2, hexHeight/2); self.cells.green.position.set(hexWidth/2, hexHeight/2); self.cells.orange.position.set(0, 0); // Add all cells Object.values(self.cells).forEach(function(cell) { self.addChild(cell); }); // Update method for changing amounts self.updateCell = function(color, current, max) { var cell = self.cells[color]; if (cell) { // Update fill var fillAmount = current / max; cell.fillGraphic.clear(); cell.fillGraphic.beginFill(color, 0.6); // Fill hexagon based on amount (from bottom up) var size = 28; // Slightly smaller than border var heightFill = fillAmount * size * 2; // ... fill calculation based on amount ... cell.fillGraphic.endFill(); // Update text cell.amountText.text = current.toString(); } }; // Method to reveal hybrid cells when unlocked self.unlockHybrid = function(color) { if (self.cells[color]) { self.cells[color].visible = true; } }; return self; }); // Create trackers for bee and hive var beeTracker = new HoneycombUI(); beeTracker.scale.set(0.7); // Smaller cells for bee beeTracker.position.set(hive.x - 150, hive.y + 100); var hiveTracker = new HoneycombUI(); hiveTracker.position.set(hive.x + 150, hive.y + 100);
User prompt
Update as necessary: // Transfer particle type remains the same if (self.type === 'transfer') { self.scale.set(0.5); self.alpha = 1; self.twinkleOffset = 0; self.twinkleSpeed = 0.1; self.update = function() { // Gentle drift down self.x += self.vx; self.y += self.vy; // Individual twinkle effect self.alpha = 0.6 + Math.sin(LK.ticks * self.twinkleSpeed + self.twinkleOffset) * 0.4; // Remove when below hive if (self.y > 100) { self.destroy(); } }; }
User prompt
Update as necessary with this: self.collectFromBee = function(bee) { if (bee.currentPollen > 0) { var particleCount = 20; var hiveWidth = 300; // Width of spawn area // Create particles gradually var particlesCreated = 0; var spawnInterval = setInterval(function() { var particle = new PollenParticle().init('transfer'); // Random position across hive width particle.x = -hiveWidth/2 + Math.random() * hiveWidth; particle.y = -200; // Start above hive // Mostly downward movement with tiny drift particle.vx = (Math.random() - 0.5) * 0.3; particle.vy = 1.5 + Math.random(); // Individual twinkle timing particle.twinkleOffset = Math.random() * Math.PI * 2; particle.twinkleSpeed = 0.1 + Math.random() * 0.1; particle.scale.set(0.5); self.addChild(particle); particlesCreated++; if (particlesCreated >= particleCount) { clearInterval(spawnInterval); } }, 50); // Spawn a new particle every 50ms self.storedPollen += bee.currentPollen; bee.currentPollen = 0; bee.pollenTypes = []; self.pollenMeter.updateMeter(self.storedPollen, 1000); bee.pollenMeter.updateMeter(0, bee.maxPollen); bee.pollenTrail.active = false; bee.pollenTrail.points = []; } };
User prompt
Update as necessary: self.collectFromBee = function(bee) { if (bee.currentPollen > 0) { // Create particles spread across the hive's width var particleCount = 20; var hiveWidth = 300; // Adjust based on hive size for (var i = 0; i < particleCount; i++) { var particle = new PollenParticle().init('transfer'); // Position randomly across hive width, start above hive particle.x = -hiveWidth/2 + Math.random() * hiveWidth; particle.y = -200; // Start above hive // Gentle downward drift with slight sideways movement particle.vx = (Math.random() - 0.5) * 1; particle.vy = 1 + Math.random(); particle.scale.set(0.5); self.addChild(particle); } self.storedPollen += bee.currentPollen; bee.currentPollen = 0; bee.pollenTypes = []; self.pollenMeter.updateMeter(self.storedPollen, 1000); bee.pollenMeter.updateMeter(0, bee.maxPollen); bee.pollenTrail.active = false; bee.pollenTrail.points = []; } }; // Transfer particle type if (self.type === 'transfer') { self.scale.set(0.5); self.alpha = 1; self.update = function() { // Gentle drift down self.x += self.vx; self.y += self.vy; // Twinkle effect self.alpha = 0.5 + Math.sin(LK.ticks * 0.2) * 0.5; // Remove when below hive if (self.y > 100) { // Adjust based on hive height self.destroy(); } }; }
User prompt
Please fix the bug: 'Timeout.tick error: clearInterval is not a function. (In 'clearInterval(streamInterval)', 'clearInterval' is undefined)' in or related to this line: 'clearInterval(streamInterval);' Line Number: 520
User prompt
Please fix the bug: 'TypeError: setTimeout is not a function. (In 'setTimeout(function () { __$(281); clearInterval(streamInterval); }, 1000)', 'setTimeout' is undefined)' in or related to this line: 'setTimeout(function () {' Line Number: 519
User prompt
Please fix the bug: 'TypeError: setInterval is not a function. (In 'setInterval(function () { __$(267); streamPaths.forEach(function (path) { __$(268); var particle = new PollenParticle().init('transfer'); // Start at bee position __$(269); particle.x = bee.x - self.x; __$(270); particle.y = bee.y - self.y; // Calculate base angle to hive __$(271); var dx = bee.x - self.x; __$(272); var dy = bee.y - self.y; __$(273); var baseAngle = Math.atan2(dy, dx); // Set velocity along stream path __$(274); var speed = 4; __$(275); var finalAngle = baseAngle + path.angle; __$(276); particle.vx = Math.cos(finalAngle) * -speed; __$(277); particle.vy = Math.sin(finalAngle) * -speed; __$(278); particle.scale.set(0.25); // Consistent small size __$(279); self.addChild(particle); }); }, 50)', 'setInterval' is undefined)' in or related to this line: 'var streamInterval = setInterval(function () {' Line Number: 499
User prompt
Update as necrsssry with: self.collectFromBee = function(bee) { if (bee.currentPollen > 0) { // Create 3 stream paths around the bee to the hive var streamPaths = [ {angle: -0.3}, // slightly up-right {angle: 0}, // direct path {angle: 0.3} // slightly up-left ]; // Create streaming effect var streamInterval = setInterval(function() { streamPaths.forEach(function(path) { var particle = new PollenParticle().init('transfer'); // Start at bee position particle.x = bee.x - self.x; particle.y = bee.y - self.y; // Calculate base angle to hive var dx = bee.x - self.x; var dy = bee.y - self.y; var baseAngle = Math.atan2(dy, dx); // Set velocity along stream path var speed = 4; var finalAngle = baseAngle + path.angle; particle.vx = Math.cos(finalAngle) * -speed; particle.vy = Math.sin(finalAngle) * -speed; particle.scale.set(0.25); // Consistent small size self.addChild(particle); }); }, 50); // Create new particles every 50ms // Stop stream after 1 second setTimeout(function() { clearInterval(streamInterval); }, 1000); self.storedPollen += bee.currentPollen; bee.currentPollen = 0; bee.pollenTypes = []; // Update meters and trail self.pollenMeter.updateMeter(self.storedPollen, 1000); bee.pollenMeter.updateMeter(0, bee.maxPollen); bee.pollenTrail.active = false; bee.pollenTrail.points = []; } }; // Simplified transfer particle if (self.type === 'transfer') { self.scale.set(0.25); // Small consistent size self.alpha = 0.8; self.update = function() { self.x += self.vx; self.y += self.vy; // Gentle fade out self.alpha -= 0.02; if (self.alpha <= 0) { self.destroy(); } }; }
User prompt
Update as necesssry with this: self.collectFromBee = function(bee) { if (bee.currentPollen > 0) { // Calculate angle from bee to top of hive var targetY = -100; // Offset from hive center to top var dx = bee.x - self.x; var dy = (bee.y - self.y) - targetY; var angle = Math.atan2(dy, dx); var distance = Math.sqrt(dx * dx + dy * dy); // Create stream of particles along path var particleCount = 12; // Consistent number for stream for (var i = 0; i < particleCount; i++) { var particle = new PollenParticle().init('transfer'); // Space particles along the path var t = i / particleCount; particle.x = bee.x - self.x; particle.y = bee.y - self.y; // Set velocity along path to hive var speed = 5; particle.vx = Math.cos(angle) * -speed; particle.vy = Math.sin(angle) * -speed; particle.scale.set(0.3); // Smaller, consistent size self.addChild(particle); } self.storedPollen += bee.currentPollen; bee.currentPollen = 0; bee.pollenTypes = []; // Update meters and trail self.pollenMeter.updateMeter(self.storedPollen, 1000); bee.pollenMeter.updateMeter(0, bee.maxPollen); bee.pollenTrail.active = false; bee.pollenTrail.points = []; } }; // Simplified transfer particle behavior if (self.type === 'transfer') { self.scale.set(0.3); self.decayRate = 0.02; self.alpha = 0.8; self.update = function() { // Simple linear movement self.x += self.vx; self.y += self.vy; // Fade out self.alpha -= 0.03; if (self.alpha <= 0) { self.destroy(); } }; }
User prompt
Make updates as necessary with this: self.collectFromBee = function(bee) { if (bee.currentPollen > 0) { // Create transfer effect var particleCount = Math.min(20, Math.floor(bee.currentPollen / 2)); // Scale particles with amount for (var i = 0; i < particleCount; i++) { var particle = new PollenParticle().init('transfer'); // Start at bee position particle.x = bee.x - self.x; // Relative to hive particle.y = bee.y - self.y; // Calculate angle and distance for curved path to hive top var angle = Math.random() * Math.PI * 2; particle.vx = Math.cos(angle) * 2; particle.vy = Math.sin(angle) * 2; // Add to hive container self.addChild(particle); } self.storedPollen += bee.currentPollen; bee.currentPollen = 0; bee.pollenTypes = []; // Update meters self.pollenMeter.updateMeter(self.storedPollen, 1000); bee.pollenMeter.updateMeter(0, bee.maxPollen); // End bee's trail bee.pollenTrail.active = false; bee.pollenTrail.points = []; } }; // Add a new particle type in PollenParticle class: self.init = function(type) { self.type = type || 'trail'; if (self.type === 'transfer') { self.scale.set(0.5 + Math.random() * 0.3); self.decayRate = 0.02; self.timeAlive = 0; self.maxTime = 1 + Math.random() * 0.5; // 1-1.5 second lifetime // Override update for transfer particles self.update = function() { self.timeAlive += 1/60; // Assuming 60fps // Curved path to hive top self.x += self.vx; self.y += self.vy - 3; // Upward bias // Slow down over time self.vx *= 0.95; self.vy *= 0.95; // Fade out near end of life if (self.timeAlive > self.maxTime * 0.7) { self.alpha = 1 - ((self.timeAlive - (self.maxTime * 0.7)) / (self.maxTime * 0.3)); } // Remove when done if (self.timeAlive >= self.maxTime) { self.destroy(); } // Add sparkle/rotation self.rotation += self.rotationSpeed; var scalePulse = 1 + Math.sin(self.timeAlive * 5) * 0.1; self.scale.set(scalePulse * self.scale.x); }; } // ... existing particle type handling ... return self; };
User prompt
Update as necessary with: var Hive = Container.expand(function() { var self = Container.call(this); var hiveSprite = self.attachAsset('Hive', { anchorX: 0.5, anchorY: 0.5 }); self.storedPollen = 0; // Add meter above hive self.pollenMeter = new PollenMeter(); self.pollenMeter.y = -200; self.addChild(self.pollenMeter); // Collection method self.collectFromBee = function(bee) { if (bee.currentPollen > 0) { self.storedPollen += bee.currentPollen; bee.currentPollen = 0; bee.pollenTypes = []; // Update both meters self.pollenMeter.updateMeter(self.storedPollen, 1000); // Example max bee.pollenMeter.updateMeter(0, bee.maxPollen); // End bee's trail bee.pollenTrail.active = false; bee.pollenTrail.points = []; } }; return self; }); ``` 3. Add collision detection between bee and hive in the game's update: ```javascript // In game.update or bee.update: if (bee && hive) { var dx = bee.x - hive.x; var dy = bee.y - hive.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance < 100) { // Adjust collection radius as needed hive.collectFromBee(bee); } }
User prompt
Update as necessary: var PollenMeter = Container.expand(function() { var self = Container.call(this); // Create background bar var background = new Graphics(); background.beginFill(0x000000, 0.3); background.drawRect(-50, -5, 100, 10); background.endFill(); self.addChild(background); // Create fill bar var fill = new Graphics(); self.fillBar = fill; self.addChild(fill); // Update method to show current pollen self.updateMeter = function(current, max) { fill.clear(); fill.beginFill(0xFFFF00); // Yellow for pollen fill.drawRect(-50, -5, (current/max) * 100, 10); fill.endFill(); }; return self; }); // Add to Bee class constructor: self.maxPollen = 50; // Cap pollen amount self.pollenMeter = new PollenMeter(); self.pollenMeter.y = -50; // Position above bee self.addChild(self.pollenMeter); // Update bee's collectPollen method: self.collectPollen = function(flower) { if (self.currentPollen < self.maxPollen && flower.hasActivePollen && !flower.pollenCollected) { var collectAmount = Math.min(25, self.maxPollen - self.currentPollen); // ... existing collection code ... // Update meter self.pollenMeter.updateMeter(self.currentPollen, self.maxPollen); } };
User prompt
Update as necessary with: self.init = function(garden) { self.garden = garden; self.gameTime = 0; self.firstBloom = false; // Just set the first bloom timer self.nextBloomTime = 90; // 1.5 seconds for first bloom }; self.update = function() { self.gameTime = LK.ticks / 60; // Count down to next bloom if (self.nextBloomTime > 0) { self.nextBloomTime--; if (self.nextBloomTime <= 0) { // Find a random bud to bloom var validBuds = []; for (var i = 0; i < self.garden.rows; i++) { for (var j = 0; j < self.garden.cols; j++) { var gridItem = self.garden.grid[i][j]; if (gridItem && gridItem.isBud) { validBuds.push({item: gridItem, x: j, y: i}); } } } if (validBuds.length > 0) { // Pick a random bud var randomIndex = Math.floor(Math.random() * validBuds.length); var selectedBud = validBuds[randomIndex]; // Create the flower var flowerColors = ['red', 'blue', 'yellow']; var randomColor = flowerColors[Math.floor(Math.random() * flowerColors.length)]; var newFlower = new BasicFlower(randomColor); newFlower.x = selectedBud.item.x; newFlower.y = selectedBud.item.y; newFlower.isFlower = true; newFlower.hasActivePollen = false; // Auto-bloomed flowers start without pollen // Update grid self.garden.removeChild(selectedBud.item); self.garden.grid[selectedBud.y][selectedBud.x] = newFlower; self.garden.addChild(newFlower); newFlower.bloom(); // Set timer for next bloom (15-20 seconds) self.nextBloomTime = (15 + Math.random() * 5) * 60; } } } };
User prompt
Update with this: // In the Bud class, modify the update function: self.update = function() { // Keep only the gentle sway animation, remove timer-based scaling self.rotation = Math.sin(LK.ticks * 0.05) * 0.1; // Remove or comment out these lines: // if (self.bloomTimer > 0) { // self.bloomTimer--; // var timerProgress = self.bloomTimer / (5 * 60); // self.scale.set(0.8 + timerProgress * 0.2); // } };
User prompt
Update as necessary with this: // Replace the init function in BudSpawner self.init = function(garden) { self.garden = garden; self.gameTime = 0; self.budTimers = {}; self.firstBloom = false; // Set first bloom timer var randomRow = Math.floor(Math.random() * self.garden.rows); var randomCol = Math.floor(Math.random() * self.garden.cols); self.budTimers[randomRow + ',' + randomCol] = 90; // Set ALL OTHER bud timers explicitly for (var i = 0; i < self.garden.rows; i++) { for (var j = 0; j < self.garden.cols; j++) { // Ensure we set a timer for every position except the first bloom self.budTimers[i + ',' + j] = (i !== randomRow || j !== randomCol) ? (10 + Math.random() * 10) * 60 : self.budTimers[i + ',' + j]; } } }; // Replace the update function in BudSpawner self.update = function() { self.gameTime = LK.ticks / 60; // Handle bud timers and blooming for (var i = 0; i < self.garden.rows; i++) { for (var j = 0; j < self.garden.cols; j++) { var budId = i + ',' + j; // If there's a timer for this position if (self.budTimers[budId] !== undefined) { var gridItem = self.garden.grid[i][j]; // Only process if it's still a bud if (gridItem && gridItem.isBud) { self.budTimers[budId]--; if (self.budTimers[budId] <= 0) { var flowerColors = ['red', 'blue', 'yellow']; var randomColor = flowerColors[Math.floor(Math.random() * flowerColors.length)]; var newFlower = new BasicFlower(randomColor); newFlower.x = gridItem.x; newFlower.y = gridItem.y; newFlower.isFlower = true; newFlower.hasActivePollen = false; // Auto-bloomed flowers start without pollen self.garden.removeChild(gridItem); self.garden.grid[i][j] = newFlower; self.garden.addChild(newFlower); newFlower.bloom(); delete self.budTimers[budId]; } } } } } };
User prompt
Update as necessary in budspawner: self.update = function() { self.gameTime = LK.ticks / 60; // Handle bud timers and blooming for (var i = 0; i < self.garden.rows; i++) { for (var j = 0; j < self.garden.cols; j++) { var gridItem = self.garden.grid[i][j]; if (gridItem && gridItem.isBud) { var budId = i + ',' + j; if (self.budTimers[budId] !== undefined) { // Only update if timer exists self.budTimers[budId]--; if (self.budTimers[budId] <= 0) { var flowerColors = ['red', 'blue', 'yellow']; var randomColor = flowerColors[Math.floor(Math.random() * flowerColors.length)]; var newFlower = new BasicFlower(randomColor); newFlower.x = gridItem.x; newFlower.y = gridItem.y; newFlower.isFlower = true; newFlower.hasActivePollen = false; // All auto-blooms after first start without pollen self.garden.removeChild(gridItem); self.garden.grid[i][j] = newFlower; self.garden.addChild(newFlower); newFlower.bloom(); delete self.budTimers[budId]; } } } } } };
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var BasicFlower = Container.expand(function (color) {
var self = Container.call(this);
// Store flower color
self.color = color || 'red'; // Default to red if no color specified
// Map color to asset name
var assetMap = {
'red': 'RedFlower',
'blue': 'BlueFlower',
'yellow': 'YellowFlower'
};
// Use correct asset based on color
var flowerGraphics = self.attachAsset(assetMap[self.color], {
anchorX: 0.5,
anchorY: 0.5
});
self.hasActivePollen = false;
self.fairyParticles = [];
self.FAIRY_COUNT = 3;
self.update = function () {
var scaleFactor = 1 + Math.sin(LK.ticks * 0.1) * 0.05;
flowerGraphics.scale.x = scaleFactor;
flowerGraphics.scale.y = scaleFactor;
flowerGraphics.rotation = Math.sin(LK.ticks * 0.1) * 0.05;
};
self.bloom = function () {
// Scale animation
self.scale.set(0.3, 0.3);
tween(self.scale, {
x: 1,
y: 1
}, {
duration: 1000,
onFinish: function onFinish() {
// After bloom animation, delay before activating pollen
LK.setTimeout(function () {
self.hasActivePollen = true;
// Create fairy particles after delay
for (var i = 0; i < self.FAIRY_COUNT; i++) {
var fairy = new PollenParticle().init('fairy');
fairy.scale.set(0.3 + Math.random() * 0.2);
fairy.x += (Math.random() - 0.5) * 60;
fairy.y += (Math.random() - 0.5) * 60;
fairy.rotation = Math.random() * Math.PI * 2;
fairy.rotationSpeed = (Math.random() - 0.5) * 0.2;
self.addChild(fairy);
self.fairyParticles.push(fairy);
}
}, 1000); // 1 second delay after bloom before pollen activates
}
});
// Create initial burst particles
self.createPollenBurst(self.x, self.y);
self.removeFairyParticles = function () {
self.fairyParticles.forEach(function (fairy) {
self.removeChild(fairy);
});
self.fairyParticles = [];
};
};
self.createPollenBurst = function (x, y) {
for (var i = 0; i < 12; i++) {
var particle = new PollenParticle().init('burst');
var angle = i / 12 * Math.PI * 2;
particle.x = x;
particle.y = y;
particle.vx = Math.cos(angle) * 3;
particle.vy = Math.sin(angle) * 3;
if (self.parent) {
self.parent.addChild(particle);
}
}
};
// Initialize pollen status
self.pollenCollected = false; // New flag to track if we've collected from it
});
var Bee = Container.expand(function () {
var self = Container.call(this);
// Create bee sprite
var beeSprite = self.attachAsset('Bee', {
anchorX: 0.5,
anchorY: 0.5
});
// Movement properties
self.targetX = self.x;
self.targetY = self.y;
self.moveSpeed = 0.1; // Adjust this for faster/slower following
self.isMoving = false;
// New pollen properties
self.maxPollen = 50; // Cap pollen amount
self.currentPollen = 0; // Current amount being carried
self.pollenTypes = []; // Array to track different pollen colors
// Format: [{color: 'red', amount: 30}, ...]
self.pollenMeter = new PollenMeter();
self.pollenMeter.y = -50; // Position above bee
self.addChild(self.pollenMeter);
// Add trail property
self.pollenTrail = new PollenTrail();
game.addChild(self.pollenTrail); // Add to game so it renders behind bee
// Pollen collection method
self.collectPollen = function (flower) {
if (self.currentPollen < self.maxPollen && flower.hasActivePollen && !flower.pollenCollected) {
var collectAmount = 25;
// Add to pollen types first
var existingType = self.pollenTypes.find(function (p) {
return p.color === flower.color;
});
if (existingType) {
existingType.amount += collectAmount;
} else {
self.pollenTypes.push({
color: flower.color,
amount: collectAmount
});
}
// Set currentPollen to match total of all types
self.currentPollen = self.pollenTypes.reduce(function (total, type) {
return total + type.amount;
}, 0);
flower.pollenCollected = true;
flower.hasActivePollen = false;
flower.removeFairyParticles();
// Update meter
self.pollenMeter.updateMeter(self.currentPollen, self.maxPollen);
}
};
self.checkFlowerCollision = function () {
// Convert bee position to garden's local space
var localPos = garden.toLocal({
x: self.x,
y: self.y
}, game);
// Calculate grid position
var gridX = Math.floor(localPos.x / garden.cellSize);
var gridY = Math.floor(localPos.y / garden.cellSize);
console.log('Grid Position:', gridX, gridY); // Debug
// Check if position is within grid bounds
if (gridX >= 0 && gridX < garden.cols && gridY >= 0 && gridY < garden.rows) {
var gridItem = garden.grid[gridY][gridX];
if (gridItem) {
console.log('Grid Item:', gridItem.isBud, self.currentPollen); // Debug
if (gridItem.isFlower && gridItem.hasActivePollen) {
// Collect pollen from flower
self.collectPollen(gridItem);
} else if (gridItem && gridItem.isBud && self.currentPollen > 0) {
// Add immediate state check and lock
if (gridItem.isBeingPollinated) {
return;
} // Skip if already being converted
gridItem.isBeingPollinated = true;
console.log('Attempting pollination'); // Debug
var pollenColor = self.usePollen(gridItem);
if (pollenColor) {
// Ensure the bud hasn't auto-bloomed
if (garden.grid[gridY][gridX] === gridItem) {
console.log('Pollination successful'); // Debug
// Convert bud to flower with the correct color
var newFlower = new BasicFlower(pollenColor);
newFlower.x = gridItem.x;
newFlower.y = gridItem.y;
newFlower.isFlower = true;
garden.removeChild(gridItem);
garden.grid[gridY][gridX] = newFlower;
garden.addChild(newFlower);
newFlower.bloom();
}
}
}
}
}
};
self.update = function () {
if (self.isMoving) {
// Smooth movement towards target
self.x += (self.targetX - self.x) * self.moveSpeed;
self.y += (self.targetY - self.y) * self.moveSpeed;
// Calculate rotation based on movement direction
var dx = self.targetX - self.x;
var dy = self.targetY - self.y;
var angle = Math.atan2(dy, dx);
self.rotation = angle + Math.PI / 2;
// Update trail when carrying pollen
if (self.currentPollen > 0) {
// Make sure trail starts if not already active
if (!self.pollenTrail.active) {
self.pollenTrail.startTrail(self.x, self.y, garden);
}
self.pollenTrail.updateTrail(self.x, self.y);
}
// Add collision check
self.checkFlowerCollision();
}
};
// Pollen usage method
self.usePollen = function (bud) {
// Add debug logs
console.log('Trying to use pollen. Amount:', self.currentPollen);
console.log('Pollen types:', self.pollenTypes);
var pollenUsed = 7;
if (self.currentPollen > 0 && self.pollenTypes.length > 0) {
// If we have less than pollenUsed, use remaining pollen
if (self.currentPollen < pollenUsed) {
pollenUsed = self.currentPollen;
}
// Reduce pollen instead of zeroing it
self.currentPollen -= pollenUsed;
// Update pollen types properly
var pType = self.pollenTypes[0];
pType.amount -= pollenUsed;
// Only clear type if it's empty
if (pType.amount <= 0) {
self.pollenTypes.shift();
}
// Only end trail if we're actually out of pollen
if (self.currentPollen <= 0 || self.pollenTypes.length === 0) {
self.pollenTrail.active = false;
self.pollenTrail.points = [];
}
return pType.color;
}
return null;
};
return self;
});
// Bud class
var Bud = Container.expand(function () {
var self = Container.call(this);
var budGraphics = self.attachAsset('Bud', {
anchorX: 0.5,
anchorY: 0.5
});
// Timer properties
self.bloomTimer = 5 * 60; // 5 seconds (assuming 60fps)
self.isBud = true;
self.isFlower = false;
// Update now handles timer and auto-bloom
self.update = function () {
// Basic animation
self.rotation = Math.sin(LK.ticks * 0.05) * 0.1;
};
self.autoBloom = function () {
if (!self.isBud) {
return;
} // Prevent double-blooming
// Get grid position
var localPos = garden.toLocal({
x: self.x,
y: self.y
}, game);
var gridX = Math.floor(localPos.x / garden.cellSize);
var gridY = Math.floor(localPos.y / garden.cellSize);
// Create random color flower
var flowerColors = ['red', 'blue', 'yellow'];
var randomColor = flowerColors[Math.floor(Math.random() * flowerColors.length)];
var newFlower = new BasicFlower(randomColor);
newFlower.x = self.x;
newFlower.y = self.y;
newFlower.isFlower = true;
newFlower.hasActivePollen = false; // Auto-bloomed flowers start dead
// Update grid
if (garden.grid[gridY] && garden.grid[gridY][gridX] === self) {
garden.removeChild(self);
garden.grid[gridY][gridX] = newFlower;
garden.addChild(newFlower);
newFlower.bloom();
}
self.isBud = false;
};
return self;
});
// Add BudSpawner to handle progressive difficulty
var BudSpawner = Container.expand(function () {
var self = Container.call(this);
self.garden = null;
self.gameTime = 0;
self.init = function (garden) {
self.garden = garden;
self.gameTime = 0;
self.firstBloom = false;
// Just set the first bloom timer
self.nextBloomTime = 90; // 1.5 seconds for first bloom
};
self.findEmptySpot = function () {
var validSpots = [];
// Match flower removal coordinate system [gridY][gridX]
for (var gridY = 0; gridY < self.garden.rows; gridY++) {
for (var gridX = 0; gridX < self.garden.cols; gridX++) {
if (!self.garden.grid[gridY][gridX]) {
validSpots.push({
x: gridX,
y: gridY
});
}
}
}
if (validSpots.length > 0) {
return validSpots[Math.floor(Math.random() * validSpots.length)];
}
return null;
};
self.getSpawnRate = function () {
// Keep original timing logic
return 16; // Spawn every frame for immediate filling
};
self.update = function () {
self.gameTime = LK.ticks / 60;
// Count down to next bloom
if (self.nextBloomTime > 0) {
self.nextBloomTime--;
if (self.nextBloomTime <= 0) {
// Find a random bud to bloom
var validBuds = [];
for (var i = 0; i < self.garden.rows; i++) {
for (var j = 0; j < self.garden.cols; j++) {
var gridItem = self.garden.grid[i][j];
if (gridItem && gridItem.isBud) {
validBuds.push({
item: gridItem,
x: j,
y: i
});
}
}
}
if (validBuds.length > 0) {
// Pick a random bud
var randomIndex = Math.floor(Math.random() * validBuds.length);
var selectedBud = validBuds[randomIndex];
// Create the flower
var flowerColors = ['red', 'blue', 'yellow'];
var randomColor = flowerColors[Math.floor(Math.random() * flowerColors.length)];
var newFlower = new BasicFlower(randomColor);
newFlower.x = selectedBud.item.x;
newFlower.y = selectedBud.item.y;
newFlower.isFlower = true;
newFlower.hasActivePollen = false; // Auto-bloomed flowers start without pollen
// Update grid
self.garden.removeChild(selectedBud.item);
self.garden.grid[selectedBud.y][selectedBud.x] = newFlower;
self.garden.addChild(newFlower);
newFlower.bloom();
// Set timer for next bloom (15-20 seconds)
self.nextBloomTime = (15 + Math.random() * 5) * 60;
}
}
}
};
});
// Simplified FlowerManager - mainly for flower conversion and management
var FlowerManager = Container.expand(function () {
var self = Container.call(this);
// Convert a bud to a flower
self.convertBudToFlower = function (bud, garden) {
var gridPos = {
x: Math.floor((bud.y - garden.y) / garden.cellSize),
y: Math.floor((bud.x - garden.x) / garden.cellSize)
};
var newFlower = new BasicFlower();
newFlower.x = bud.x;
newFlower.y = bud.y;
newFlower.isFlower = true;
garden.removeChild(bud);
garden.grid[gridPos.x][gridPos.y] = newFlower;
garden.addChild(newFlower);
// When a flower blooms:
createPollenBurst(newFlower.x, newFlower.y);
return newFlower;
};
// Empty touch handler as we're using the new trail system
self.handleTouch = function () {};
});
//<Assets used in the game will automatically appear here>
// Garden class to manage the grid of soil
var Garden = Container.expand(function () {
var self = Container.call(this);
// Add new helper method for safe grid updates
self.updateGridPosition = function (row, col, item) {
if (row >= 0 && row < self.rows && col >= 0 && col < self.cols) {
// First clear any existing item
var existingItem = self.grid[row][col];
if (existingItem && existingItem.parent) {
existingItem.parent.removeChild(existingItem);
}
// Then set new item
self.grid[row][col] = item;
return true;
}
return false;
};
self.grid = [];
self.rows = 8;
self.cols = 8;
self.cellSize = 225;
self.init = function () {
// Center the grid on screen
self.x = (2048 - self.cols * self.cellSize) / 2;
self.y = (2732 - self.rows * self.cellSize) / 2 + 2732 * 0.12 - 400;
// Initialize grid and fill with buds
for (var i = 0; i < self.rows; i++) {
self.grid[i] = [];
for (var j = 0; j < self.cols; j++) {
var bud = new Bud();
bud.x = j * self.cellSize + self.cellSize / 2;
bud.y = i * self.cellSize + self.cellSize / 2;
bud.isBud = true;
bud.isFlower = false;
self.grid[i][j] = bud;
self.addChild(bud);
}
}
};
// Helper method to convert grid position to world position
self.gridToWorld = function (gridX, gridY) {
return {
x: self.x + gridX * self.cellSize + self.cellSize / 2,
y: self.y + gridY * self.cellSize + self.cellSize / 2
};
};
// Helper method to convert world position to grid position
self.worldToGrid = function (worldX, worldY) {
var localX = worldX - self.x;
var localY = worldY - self.y;
return {
x: Math.floor(localX / self.cellSize),
y: Math.floor(localY / self.cellSize)
};
};
});
// GardenBackground class
var GardenBackground = Container.expand(function () {
var self = Container.call(this);
var gardenBackground = LK.getAsset('GardenBackground', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 1.02,
scaleY: 1.02,
x: 2048 / 2,
y: 2732 / 2
});
self.addChild(gardenBackground);
});
var Hive = Container.expand(function () {
var self = Container.call(this);
var hiveSprite = self.attachAsset('Hive', {
anchorX: 0.5,
anchorY: 0.5
});
self.storedPollen = 0;
// Add meter above hive
self.pollenMeter = new PollenMeter();
self.pollenMeter.y = -200;
self.addChild(self.pollenMeter);
// Collection method
self.collectFromBee = function (bee) {
if (bee.currentPollen > 0) {
self.storedPollen += bee.currentPollen;
bee.currentPollen = 0;
bee.pollenTypes = [];
// Update both meters
self.pollenMeter.updateMeter(self.storedPollen, 1000); // Example max
bee.pollenMeter.updateMeter(0, bee.maxPollen);
// End bee's trail
bee.pollenTrail.active = false;
bee.pollenTrail.points = [];
}
};
return self;
});
var PollenMeter = Container.expand(function () {
var self = Container.call(this);
// Create background bar
var background = LK.getAsset('marker', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 1,
scaleY: 0.1
});
self.addChild(background);
// Create fill bar
var fill = LK.getAsset('marker', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0,
scaleY: 0.1
});
fill.tint = 0xFFFF00; // Yellow for pollen
self.fillBar = fill;
self.addChild(fill);
// Update method to show current pollen
self.updateMeter = function (current, max) {
fill.scale.x = current / max;
};
return self;
});
// PollenParticle class
var PollenParticle = Container.expand(function () {
var self = Container.call(this);
// Particle properties
self.velocity = {
x: 0,
y: 0
};
self.lifespan = 1; // Goes from 1 to 0
self.decayRate = 0.02; // How fast the particle fades
self.type = 'trail'; // Can be 'trail' or 'burst'
// Create the visual element
var pollenGraphics = self.attachAsset('PollenSparkle', {
anchorX: 0.5,
anchorY: 0.5
});
// Initialize with random properties for more organic feel
self.init = function (type) {
self.type = type || 'trail';
// Set initial scale based on type
if (self.type === 'trail') {
self.scale.set(0.7 + Math.random() * 0.3); // Larger for trail
self.decayRate = 0.03; // Faster decay for trail
// Slight random velocity for trail movement
self.velocity = {
x: (Math.random() - 0.5) * 2,
y: (Math.random() - 0.5) * 2
};
} else if (self.type === 'burst') {
self.scale.set(0.5 + Math.random() * 0.3); // Smaller initial size for bursts
self.decayRate = 0.01; // Slower decay for longer travel
// Radial burst velocity
var angle = Math.random() * Math.PI * 2;
var speed = 3 + Math.random() * 5; // Increased speed for further travel
self.velocity = {
x: Math.cos(angle) * speed,
y: Math.sin(angle) * speed
};
} else if (self.type === 'fairy') {
self.lifespan = undefined; // Don't fade out
self.startAngle = Math.random() * Math.PI * 2; // Random start position
self.orbitRadius = 20 + Math.random() * 40; // Increase orbit radius variation
self.orbitSpeed = 0.005 + Math.random() * 0.03; // Increase orbit speed variation
self.update = function () {
var time = LK.ticks * self.orbitSpeed;
// Orbit motion
self.x = Math.cos(time + self.startAngle) * self.orbitRadius;
self.y = Math.sin(time + self.startAngle) * self.orbitRadius;
// Add bobbing
self.y += Math.sin(time * 2 + self.startAngle) * 10;
};
}
// Random rotation speed
self.rotationSpeed = (Math.random() - 0.5) * 0.2;
// Random starting rotation
self.rotation = Math.random() * Math.PI * 2;
// Add random rotation speed for dynamic movement
self.rotationSpeed = (Math.random() - 0.5) * 0.2;
// Full opacity to start
self.alpha = 1;
return self;
};
self.update = function () {
// Update position based on velocity
self.x += self.velocity.x;
self.y += self.velocity.y;
// Add rotation
self.rotation += self.rotationSpeed;
// Slow down velocity over time
self.velocity.x *= 0.95;
self.velocity.y *= 0.95;
// Update lifespan and alpha
self.lifespan -= self.decayRate;
self.alpha = self.lifespan;
// Scale slightly varies with life
var scalePulse = 1 + Math.sin(LK.ticks * 0.2) * 0.1;
pollenGraphics.scale.set(scalePulse * self.scale.x);
// Remove when lifecycle complete
if (self.lifespan <= 0) {
self.destroy();
}
};
});
// First, let's add a PollenTrail class to handle the dragging mechanic
var PollenTrail = Container.expand(function () {
var self = Container.call(this);
self.points = [];
self.active = false;
self.currentGarden = null; // Store reference to garden
self.MAX_SPEED = 15; // Adjust this value for proper feel
self.startTrail = function (x, y, garden) {
self.active = true;
self.points = [{
x: x,
y: y,
time: Date.now()
}];
self.startTime = Date.now();
self.trailStartTime = Date.now(); // Record start time
self.currentGarden = garden; // Store garden reference
self.lastPoint = {
x: x,
y: y
};
};
self.updateTrail = function (x, y) {
if (!self.active) {
return;
}
// Enforce maximum speed
var dx = x - self.lastPoint.x;
var dy = y - self.lastPoint.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > self.MAX_SPEED) {
var ratio = self.MAX_SPEED / distance;
x = self.lastPoint.x + dx * ratio;
y = self.lastPoint.y + dy * ratio;
}
self.points.push({
x: x,
y: y,
time: Date.now()
});
self.lastPoint = {
x: x,
y: y
};
// Create particle effect along trail
var particle = new PollenParticle().init('trail');
particle.x = x;
particle.y = y;
game.addChild(particle);
};
// Add the burst effect function
self.createPollenBurst = function (x, y) {
for (var i = 0; i < 12; i++) {
var particle = new PollenParticle().init('burst');
var angle = i / 12 * Math.PI * 2;
var distance = 30;
particle.x = x + Math.cos(angle) * distance;
particle.y = y + Math.sin(angle) * distance;
// Give particles outward velocity
particle.vx = Math.cos(angle) * 3;
particle.vy = Math.sin(angle) * 3;
game.addChild(particle);
}
};
self.endTrail = function () {
if (!self.active) {
return;
}
var affectedBuds = [];
var checkedPositions = {};
self.points.forEach(function (point) {
var localPos = self.currentGarden.toLocal({
x: point.x,
y: point.y
}, game);
var gridX = Math.floor(localPos.x / self.currentGarden.cellSize);
var gridY = Math.floor(localPos.y / self.currentGarden.cellSize);
var posKey = gridX + ',' + gridY;
if (!checkedPositions[posKey] && gridX >= 0 && gridX < self.currentGarden.cols && gridY >= 0 && gridY < self.currentGarden.rows) {
checkedPositions[posKey] = true;
var gridItem = self.currentGarden.grid[gridY][gridX];
// Verify it's a valid bud
if (gridItem && gridItem.isBud === true && gridItem.isFlower === false) {
affectedBuds.push({
bud: gridItem,
gridX: gridX,
gridY: gridY
});
}
}
});
if (affectedBuds.length >= 2) {
affectedBuds.forEach(function (budInfo) {
// IMPORTANT: Clear the grid position first
self.currentGarden.grid[budInfo.gridY][budInfo.gridX] = null;
// Remove the bud from display list
self.currentGarden.removeChild(budInfo.bud);
// Create new flower
var newFlower = new BasicFlower();
newFlower.x = budInfo.bud.x;
newFlower.y = budInfo.bud.y;
newFlower.isFlower = true;
// Update grid position and add to display list
self.currentGarden.grid[budInfo.gridY][budInfo.gridX] = newFlower;
self.currentGarden.addChild(newFlower);
// Start bloom animation
newFlower.bloom();
});
}
self.active = false;
self.points = [];
};
self.update = function () {
// Just update particles, no time checks
// Update all children particles
for (var i = self.children.length - 1; i >= 0; i--) {
var particle = self.children[i];
if (particle && particle.update) {
particle.update();
}
}
};
});
// Add ScoreManager to handle chain reactions and scoring
var ScoreManager = Container.expand(function () {
var self = Container.call(this);
self.currentScore = 0;
self.currentChain = 0;
self.chainMultiplier = 1;
self.addToChain = function () {
self.currentChain++;
self.chainMultiplier = Math.min(1 + self.currentChain * 0.5, 5); // Cap at 5x
self.addScore(100 * self.chainMultiplier);
};
self.resetChain = function () {
self.currentChain = 0;
self.chainMultiplier = 1;
};
self.addScore = function (points) {
self.currentScore += Math.floor(points);
// Update score display
if (game.scoreDisplay) {
game.scoreDisplay.text = self.currentScore.toString();
}
};
});
// Level display class
var LevelDisplay = Text2.expand(function () {
var self = Text2.call(this, 'Level 1', {
size: 150,
fill: 0xFFFFFF
});
});
// Score display class
var ScoreDisplay = Text2.expand(function () {
var self = Text2.call(this, '0', {
size: 150,
fill: 0xFFFFFF
});
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000000 //Init game with black background
});
/****
* Game Code
****/
// Declare and initialize flowerManager in global scope
var flowerManager = new FlowerManager();
var titleScreen = new Container();
var background = LK.getAsset('titlebackground', {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2,
y: 2732 / 2
});
titleScreen.addChild(background);
var logo = LK.getAsset('logo', {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2,
y: 2732 / 2
});
titleScreen.addChild(logo);
var playButton = LK.getAsset('playButton', {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2,
y: 2732 / 2 + 200
});
titleScreen.addChild(playButton);
var tutorialButton = LK.getAsset('tutorialButton', {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2,
y: 2732 / 2 + 400
});
titleScreen.addChild(tutorialButton);
game.addChild(titleScreen);
playButton.down = function (x, y, obj) {
game.removeChild(titleScreen);
var gardenBackground = new GardenBackground();
game.addChild(gardenBackground);
garden = new Garden();
garden.init();
game.addChild(garden);
var flowerManager = new FlowerManager();
game.flowerManager = flowerManager;
var pollenTrail = new PollenTrail();
game.addChild(pollenTrail);
// Ensure pollen particles are rendered on top by adding them last
game.setChildIndex(pollenTrail, game.children.length - 1);
// Initialize bud spawner
garden.budSpawner = new BudSpawner();
garden.budSpawner.init(garden);
game.addChild(garden.budSpawner);
// Touch handlers
game.down = function (x, y, obj) {
bee.isMoving = true;
bee.targetX = x;
bee.targetY = y;
};
game.move = function (x, y, obj) {
if (bee.isMoving) {
bee.targetX = x;
bee.targetY = y - 200;
}
};
game.up = function (x, y, obj) {
bee.isMoving = false;
};
// Create and position hive
var hive = new Hive();
hive.x = 2048 / 2; // Center horizontally
hive.y = 2732 * 0.97 - 200; // Move hive down by 2% of the screen height
// Create bee and position above hive
var bee = new Bee();
bee.x = hive.x; // Start above hive
bee.y = hive.y - 150;
// Add objects to game
game.addChild(hive);
game.addChild(bee);
// Initialize score display
var scoreDisplay = new ScoreDisplay();
scoreDisplay.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreDisplay);
game.scoreDisplay = scoreDisplay;
// Add the main update loop
game.update = function () {
// Update spawning system
if (game.budSpawner) {
game.budSpawner.update();
}
// Update trail system
if (pollenTrail) {
pollenTrail.update();
}
// Update garden elements
if (garden) {
// Update all flowers and buds in the grid
for (var i = 0; i < garden.rows; i++) {
for (var j = 0; j < garden.cols; j++) {
var gridItem = garden.grid[i][j];
if (gridItem && gridItem.update) {
gridItem.update();
}
}
}
}
// Update all children that have update methods
for (var i = 0; i < game.children.length; i++) {
var child = game.children[i];
if (child && child.update) {
child.update();
}
}
// Update all particles
if (game.particlesToUpdate) {
for (var i = game.particlesToUpdate.length - 1; i >= 0; i--) {
var particle = game.particlesToUpdate[i];
if (particle && particle.update) {
particle.update();
}
}
}
// Update bee
if (bee && bee.update) {
bee.update();
// Collision detection between bee and hive
if (hive) {
var dx = bee.x - hive.x;
var dy = bee.y - hive.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance < 100) {
// Adjust collection radius as needed
hive.collectFromBee(bee);
}
}
}
};
};
tutorialButton.down = function (x, y, obj) {
// Open tutorial
};
// Removed duplicate playPollenPatternAnimation method ===================================================================
--- original.js
+++ change.js
@@ -447,13 +447,31 @@
self.addChild(gardenBackground);
});
var Hive = Container.expand(function () {
var self = Container.call(this);
- // Create hive sprite
var hiveSprite = self.attachAsset('Hive', {
anchorX: 0.5,
anchorY: 0.5
});
+ self.storedPollen = 0;
+ // Add meter above hive
+ self.pollenMeter = new PollenMeter();
+ self.pollenMeter.y = -200;
+ self.addChild(self.pollenMeter);
+ // Collection method
+ self.collectFromBee = function (bee) {
+ if (bee.currentPollen > 0) {
+ self.storedPollen += bee.currentPollen;
+ bee.currentPollen = 0;
+ bee.pollenTypes = [];
+ // Update both meters
+ self.pollenMeter.updateMeter(self.storedPollen, 1000); // Example max
+ bee.pollenMeter.updateMeter(0, bee.maxPollen);
+ // End bee's trail
+ bee.pollenTrail.active = false;
+ bee.pollenTrail.points = [];
+ }
+ };
return self;
});
var PollenMeter = Container.expand(function () {
var self = Container.call(this);
@@ -855,8 +873,18 @@
}
// Update bee
if (bee && bee.update) {
bee.update();
+ // Collision detection between bee and hive
+ if (hive) {
+ var dx = bee.x - hive.x;
+ var dy = bee.y - hive.y;
+ var distance = Math.sqrt(dx * dx + dy * dy);
+ if (distance < 100) {
+ // Adjust collection radius as needed
+ hive.collectFromBee(bee);
+ }
+ }
}
};
};
tutorialButton.down = function (x, y, obj) {
A background image for a puzzle video game depicting the season of summer. Cartoon. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
A background image for a puzzle video game depicting the season of fall. Cartoon. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
A background image for a puzzle video game depicting the season of winter. Cartoon. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
Multiple stylized texts with phrases that include “Hurry!” “Time’s up!” Cartoon style.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
Create a SVG text design in bold cartoon style: "SPRING" in chunky rounded letters with floral accents and vines. Use spring pastels.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
Create an SVG text design for "SUMMER" in bold cartoon style with chunky rounded letters. Add sun rays and small flower details in warm, vibrant colors.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
Create an SVG text design for "FALL" in bold cartoon style with chunky rounded letters. Add small falling leaves and acorn accents in warm autumn colors.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
Create an SVG text design for "WINTER" in bold cartoon style with chunky rounded letters. Add small snowflake accents and icy details in cool, frosty blues and white.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
Create a SVG text design in bold cartoon style: “Bloom the garden" in chunky rounded letters with floral accents and vines. Use spring pastels.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
Create an SVG text design for "Match the blooms" in bold cartoon style with chunky rounded letters. Add sun rays and small flower details in warm, vibrant colors.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
Create an SVG text design for "Match to clear leaves" in bold cartoon style with chunky rounded letters. Add small falling leaves and acorn accents in warm autumn colors.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
Create an SVG text design for "DANCE TO STAY WARM" in bold cartoon style with chunky rounded letters. Add small snowflake accents and icy details in cool, frosty blues and white.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
Create a SVG text design in bold cartoon style: "SEASON COMPLETE!" in chunky rounded letters with stars around it . Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.