/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var AquaticPlantSpot = Container.expand(function (x, y) {
var self = Container.call(this);
self.x = x;
self.y = y;
self.planted = false;
self.plantType = null;
self.plantTime = 0;
self.grown = false;
self.regrowTime = 0;
self.isAquatic = true;
var waterGraphics = self.attachAsset('water', {
anchorX: 0.5,
anchorY: 0.5,
tint: 0x4169E1
});
// Move water graphics to the back layer
self.setChildIndex(waterGraphics, 0);
var plantGraphics = null;
self.plantSeed = function (seedType) {
if (self.planted) return false;
self.planted = true;
self.plantType = seedType === 'fish2' ? 'fish2' : 'fish'; // Support both fish types
self.plantTime = LK.ticks;
self.grown = false;
self.isColorful = false;
// 5% chance for colorful fish (3x price)
if (Math.random() < 0.05) {
self.isColorful = true;
}
var finalScale = 1.0;
var assetName;
if (self.plantType === 'fish2') {
assetName = self.isColorful ? 'colorful_Fish2' : 'Fish2';
} else {
assetName = self.isColorful ? 'colorful_fish' : 'fish';
}
plantGraphics = self.attachAsset(assetName, {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.5,
scaleX: 0.3,
scaleY: 0.3
});
// Add colorful tint for special fish
if (self.isColorful) {
plantGraphics.tint = 0xFFD700; // Golden fish
}
// Ensure fish graphics appear above water
self.setChildIndex(plantGraphics, self.children.length - 1);
// Animate fish growth over 3 seconds (faster than plants)
tween(plantGraphics, {
scaleX: finalScale,
scaleY: finalScale
}, {
duration: 3000,
easing: tween.easeOut
});
// Add swimming animation for colorful fish
if (self.isColorful) {
var swimmingAnimation = function swimmingAnimation() {
if (plantGraphics) {
tween(plantGraphics, {
x: 20
}, {
duration: 1000,
easing: tween.easeInOut,
onFinish: function onFinish() {
tween(plantGraphics, {
x: -20
}, {
duration: 1000,
easing: tween.easeInOut,
onFinish: function onFinish() {
tween(plantGraphics, {
x: 0
}, {
duration: 1000,
easing: tween.easeInOut,
onFinish: swimmingAnimation
});
}
});
}
});
}
};
// Start swimming animation after growth completes
LK.setTimeout(swimmingAnimation, 3000);
}
LK.getSound('plant').play();
LK.getSound('Water').play();
return true;
};
self.harvest = function () {
if (!self.grown) return null;
var harvestedType = self.plantType; // Use the actual planted type (fish or fish2)
var isColorfulHarvest = self.isColorful;
// Fish regrow like bananas
if (plantGraphics) {
tween(plantGraphics, {
alpha: 0.3,
scaleX: 0.5,
scaleY: 0.5
}, {
duration: 500,
easing: tween.easeIn
});
}
self.grown = false;
self.regrowTime = LK.ticks;
LK.getSound('harvest').play();
return {
type: harvestedType,
colorful: isColorfulHarvest,
chocolate: self.isChocolate || false
};
};
self.update = function () {
if (self.planted && !self.grown) {
// Check if this spot is affected by a sprinkler
var speedMultiplier = 1;
for (var i = 0; i < sprinklers.length; i++) {
var sprinkler = sprinklers[i];
var distanceX = Math.abs(self.x - sprinkler.x);
var distanceY = Math.abs(self.y - sprinkler.y);
// Regular sprinkler: 2x speed in 3x3 area
if (distanceX <= 660 && distanceY <= 660) {
speedMultiplier = 2;
break;
}
}
// Check if it's time to regrow after harvest
if (self.regrowTime > 0) {
var regrowTime = self.plantType === 'fish2' ? 2700 : 3300; // 45 seconds for fish2, 55 for fish
if (LK.ticks - self.regrowTime > regrowTime / speedMultiplier) {
self.grown = true;
self.regrowTime = 0;
if (plantGraphics) {
var regrowScale = 1.0;
tween(plantGraphics, {
alpha: 1.0,
scaleX: regrowScale,
scaleY: regrowScale
}, {
duration: 1000,
easing: tween.easeOut
});
}
}
} else if (self.regrowTime === 0 && LK.ticks - self.plantTime > (self.plantType === 'fish2' ? 2700 : 3300) / speedMultiplier) {
// 45 seconds for fish2, 55 seconds for fish initial growth
self.grown = true;
if (plantGraphics) {
plantGraphics.alpha = 1.0;
}
}
}
};
self.down = function () {
if (self.grown) {
var harvested = self.harvest();
if (harvested) {
var harvestType = harvested.type;
if (harvested.chocolate) {
var baseType = harvestType === 'fish2' ? 'fish2' : 'fish';
inventory['choco_' + baseType] = (inventory['choco_' + baseType] || 0) + 1;
} else if (harvested.colorful) {
var baseType = harvestType === 'fish2' ? 'fish2' : 'fish';
inventory['colorful_' + baseType] = (inventory['colorful_' + baseType] || 0) + 1;
} else {
inventory[harvestType] = (inventory[harvestType] || 0) + 1;
}
updateInventoryDisplay();
}
} else if (!self.planted && selectedSprinkler) {
// Place sprinkler
var sprinklerCost = 35;
if (money >= sprinklerCost) {
var sprinkler = new Sprinkler(self.x, self.y);
sprinklers.push(sprinkler);
game.addChild(sprinkler);
money -= sprinklerCost;
updateMoneyDisplay();
selectedSprinkler = false;
gearShop.visible = false;
}
} else if (!self.planted && selectedFish && money >= 100) {
// Plant fish in aquatic spots
if (self.plantSeed('fish')) {
money -= 100;
updateMoneyDisplay();
selectedFish = false;
fishShop.visible = false;
}
} else if (!self.planted && selectedFish2 && money >= 150) {
// Plant fish2 in aquatic spots
if (self.plantSeed('fish2')) {
money -= 150;
updateMoneyDisplay();
selectedFish2 = false;
fishShop.visible = false;
}
} else if (!self.planted && selectedSeed && money >= seedPrices[selectedSeed]) {
// Don't plant fruit seeds in water - this is an aquatic spot for fish only
// No planting action will occur, but we can provide feedback
selectedSeed = null;
seedShop.visible = false;
}
};
return self;
});
var Button = Container.expand(function (text, onClick) {
var self = Container.call(this);
var buttonBg = self.attachAsset('button', {
anchorX: 0.5,
anchorY: 0.5
});
var buttonText = new Text2(text, {
size: 30,
fill: 0xFFFFFF
});
buttonText.anchor.set(0.5, 0.5);
self.addChild(buttonText);
self.down = function () {
if (onClick) onClick();
};
return self;
});
var FishShop = Container.expand(function () {
var self = Container.call(this);
var background = self.attachAsset('seedShopBg', {
anchorX: 0.5,
anchorY: 0.5
});
var titleText = new Text2('FISH SHOP', {
size: 80,
fill: 0x000000
});
titleText.anchor.set(0.5, 0.5);
titleText.y = -600;
self.addChild(titleText);
// Fish item
var fishButton = new Container();
fishButton.x = 0;
fishButton.y = -300;
var fishIcon = fishButton.attachAsset('fish', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 1.5,
scaleY: 1.5
});
fishIcon.x = -300;
var nameText = new Text2('Fish', {
size: 70,
fill: 0x000000
});
nameText.anchor.set(0, 0.5);
nameText.x = -200;
fishButton.addChild(nameText);
var priceText = new Text2('$100', {
size: 70,
fill: 0xFFFF00
});
priceText.anchor.set(1, 0.5);
priceText.x = 300;
fishButton.addChild(priceText);
var descText = new Text2('Grows in 55 seconds, sells for $120', {
size: 40,
fill: 0x666666
});
descText.anchor.set(0.5, 0);
descText.y = 50;
fishButton.addChild(descText);
fishButton.down = function () {
if (money >= 100) {
selectedFish = true;
self.visible = false;
LK.getSound('Buy').play();
}
};
self.addChild(fishButton);
// Fish2 item
var fish2Button = new Container();
fish2Button.x = 0;
fish2Button.y = -100;
var fish2Icon = fish2Button.attachAsset('Fish2', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 1.5,
scaleY: 1.5
});
fish2Icon.x = -300;
var name2Text = new Text2('Fish2', {
size: 70,
fill: 0x000000
});
name2Text.anchor.set(0, 0.5);
name2Text.x = -200;
fish2Button.addChild(name2Text);
var price2Text = new Text2('$150', {
size: 70,
fill: 0xFFFF00
});
price2Text.anchor.set(1, 0.5);
price2Text.x = 300;
fish2Button.addChild(price2Text);
var desc2Text = new Text2('Grows in 45 seconds, sells for $180', {
size: 40,
fill: 0x666666
});
desc2Text.anchor.set(0.5, 0);
desc2Text.y = 50;
fish2Button.addChild(desc2Text);
fish2Button.down = function () {
if (money >= 150) {
selectedFish2 = true;
self.visible = false;
LK.getSound('Buy').play();
}
};
self.addChild(fish2Button);
var closeButton = new Button('CLOSE', function () {
self.visible = false;
});
closeButton.y = 300;
self.addChild(closeButton);
return self;
});
var GearShop = Container.expand(function () {
var self = Container.call(this);
var background = self.attachAsset('seedShopBg', {
anchorX: 0.5,
anchorY: 0.5
});
var titleText = new Text2('GEAR SHOP', {
size: 80,
fill: 0x000000
});
titleText.anchor.set(0.5, 0.5);
titleText.y = -600;
self.addChild(titleText);
// Sprinkler item
var sprinklerButton = new Container();
sprinklerButton.x = 0;
sprinklerButton.y = -200;
var sprinklerIcon = LK.getAsset('sprinkler', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 1.5,
scaleY: 1.5
});
sprinklerIcon.x = -300;
sprinklerButton.addChild(sprinklerIcon);
var nameText = new Text2('Sprinkler', {
size: 70,
fill: 0x000000
});
nameText.anchor.set(0, 0.5);
nameText.x = -200;
sprinklerButton.addChild(nameText);
var priceText = new Text2('$35', {
size: 70,
fill: 0xFFFF00
});
priceText.anchor.set(1, 0.5);
priceText.x = 300;
sprinklerButton.addChild(priceText);
var descText = new Text2('2x growth speed in 3x3 area', {
size: 40,
fill: 0x666666
});
descText.anchor.set(0.5, 0);
descText.y = 50;
sprinklerButton.addChild(descText);
sprinklerButton.down = function () {
if (money >= 35) {
selectedSprinkler = 'regular';
self.visible = false;
LK.getSound('Buy').play();
}
};
self.addChild(sprinklerButton);
var closeButton = new Button('CLOSE', function () {
self.visible = false;
});
closeButton.y = 200;
self.addChild(closeButton);
return self;
});
var PlantSpot = Container.expand(function (x, y) {
var self = Container.call(this);
self.x = x;
self.y = y;
self.planted = false;
self.plantType = null;
self.plantTime = 0;
self.grown = false;
self.regrowTime = 0;
var dirtGraphics = self.attachAsset('dirt', {
anchorX: 0.5,
anchorY: 0.5
});
// Move dirt graphics to the back layer
self.setChildIndex(dirtGraphics, 0);
var plantGraphics = null;
self.plantSeed = function (seedType) {
if (self.planted) return false;
self.planted = true;
self.plantType = seedType;
self.plantTime = LK.ticks;
self.grown = false;
self.isColorful = false;
// 5% chance for colorful fruit (3x price)
if (Math.random() < 0.05) {
self.isColorful = true;
self.plantType = 'colorful_' + seedType;
}
var finalScale = 1.0;
plantGraphics = self.attachAsset(self.plantType, {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.5,
scaleX: 0.3,
scaleY: 0.3
});
// Ensure plant graphics appear above soil, especially for giant fruits
self.setChildIndex(plantGraphics, self.children.length - 1);
// Animate plant growth over 5 seconds
tween(plantGraphics, {
scaleX: finalScale,
scaleY: finalScale
}, {
duration: 5000,
easing: tween.easeOut
});
// Add rainbow tint animation for colorful fruits
if (self.isColorful) {
var colorfulAnimation = function colorfulAnimation() {
var colors = [0xff0000, 0x00ff00, 0x0000ff, 0xffff00, 0xff00ff, 0x00ffff];
var currentColor = 0;
var _animateColor = function animateColor() {
if (plantGraphics) {
tween(plantGraphics, {
tint: colors[currentColor]
}, {
duration: 800,
easing: tween.easeInOut,
onFinish: function onFinish() {
currentColor = (currentColor + 1) % colors.length;
_animateColor();
}
});
}
};
_animateColor();
};
// Start colorful animation after growth completes
LK.setTimeout(colorfulAnimation, 5000);
}
LK.getSound('plant').play();
return true;
};
self.harvest = function () {
if (!self.grown) return null;
var harvestedType = self.plantType;
var isColorfulHarvest = self.isColorful;
// Check if this is a regrowing fruit (banana, dragon fruit, coconut, or apple)
var isBanana = harvestedType === 'banana' || harvestedType === 'colorful_banana';
var isDragonFruit = harvestedType === 'dragonfruit' || harvestedType === 'colorful_dragonfruit';
var isCoconut = harvestedType === 'coconut' || harvestedType === 'colorful_coconut';
var isApple = harvestedType === 'apple' || harvestedType === 'colorful_apple';
if (isBanana || isDragonFruit || isCoconut || isApple) {
// Hide the plant graphics with animation for regrowing fruits
if (plantGraphics) {
tween(plantGraphics, {
alpha: 0.3,
scaleX: 0.5,
scaleY: 0.5
}, {
duration: 500,
easing: tween.easeIn
});
}
self.grown = false;
self.regrowTime = LK.ticks;
} else {
// For carrots and strawberries, reset the plant completely
if (plantGraphics) {
plantGraphics.destroy();
plantGraphics = null;
}
self.planted = false;
self.plantType = null;
self.plantTime = 0;
self.grown = false;
self.isColorful = false;
self.regrowTime = 0;
}
LK.getSound('harvest').play();
return {
type: harvestedType,
colorful: isColorfulHarvest,
chocolate: self.isChocolate || false
};
};
self.update = function () {
if (self.planted && !self.grown) {
// Check if this spot is affected by a sprinkler
var speedMultiplier = 1;
for (var i = 0; i < sprinklers.length; i++) {
var sprinkler = sprinklers[i];
var distanceX = Math.abs(self.x - sprinkler.x);
var distanceY = Math.abs(self.y - sprinkler.y);
// Regular sprinkler: 2x speed in 3x3 area (660px = 3 * 220px spacing)
if (distanceX <= 660 && distanceY <= 660) {
speedMultiplier = 2;
break;
}
}
// Check if it's time to regrow after harvest (for bananas, dragon fruit, and coconut)
if (self.regrowTime > 0) {
var isBanana = self.plantType === 'banana' || self.plantType === 'colorful_banana';
var isDragonFruit = self.plantType === 'dragonfruit' || self.plantType === 'colorful_dragonfruit';
var isCoconut = self.plantType === 'coconut' || self.plantType === 'colorful_coconut';
var isApple = self.plantType === 'apple' || self.plantType === 'colorful_apple';
var regrowReady = false;
if (isBanana && LK.ticks - self.regrowTime > 1140 / speedMultiplier) {
// 19 seconds at 60fps for banana regrow (halved with sprinkler)
regrowReady = true;
} else if ((isDragonFruit || isCoconut) && LK.ticks - self.regrowTime > 1320 / speedMultiplier) {
// 22 seconds at 60fps for dragon fruit and coconut regrow (halved with sprinkler)
regrowReady = true;
} else if (isApple && LK.ticks - self.regrowTime > 1200 / speedMultiplier) {
// 20 seconds at 60fps for apple regrow (halved with sprinkler)
regrowReady = true;
}
if (regrowReady) {
self.grown = true;
self.regrowTime = 0;
if (plantGraphics) {
var regrowScale = 1.0;
tween(plantGraphics, {
alpha: 1.0,
scaleX: regrowScale,
scaleY: regrowScale
}, {
duration: 1000,
easing: tween.easeOut
});
}
}
} else if (self.regrowTime === 0 && LK.ticks - self.plantTime > 300 / speedMultiplier) {
// 5 seconds at 60fps for initial growth (halved with sprinkler)
self.grown = true;
if (plantGraphics) {
plantGraphics.alpha = 1.0;
}
}
}
};
self.down = function () {
if (self.grown) {
var harvested = self.harvest();
if (harvested) {
var harvestType = harvested.type;
if (harvested.chocolate) {
// Store chocolate fruits separately for 4x price
var baseType = harvestType.replace('colorful_', '');
// Special case for carrots - use Chococarrot asset name
if (baseType === 'carrot') {
inventory['Chococarrot'] = (inventory['Chococarrot'] || 0) + 1;
} else {
inventory['choco_' + baseType] = (inventory['choco_' + baseType] || 0) + 1;
}
} else if (harvested.colorful) {
// Store colorful fruits separately for 3x price
var baseType = harvestType.replace('colorful_', '');
inventory['colorful_' + baseType] = (inventory['colorful_' + baseType] || 0) + 1;
} else {
inventory[harvestType] = (inventory[harvestType] || 0) + 1;
}
updateInventoryDisplay();
}
} else if (!self.planted && selectedSprinkler) {
// Place sprinkler
var sprinklerCost = 35;
if (money >= sprinklerCost) {
var sprinkler = new Sprinkler(self.x, self.y);
sprinklers.push(sprinkler);
game.addChild(sprinkler);
money -= sprinklerCost;
updateMoneyDisplay();
selectedSprinkler = false;
gearShop.visible = false;
}
} else if (!self.planted && selectedSeed && money >= seedPrices[selectedSeed]) {
if (self.plantSeed(selectedSeed)) {
money -= seedPrices[selectedSeed];
updateMoneyDisplay();
selectedSeed = null;
seedShop.visible = false;
}
}
};
return self;
});
var SeedShop = Container.expand(function () {
var self = Container.call(this);
var background = self.attachAsset('seedShopBg', {
anchorX: 0.5,
anchorY: 0.5
});
var titleText = new Text2('SEED SHOP', {
size: 80,
fill: 0x000000
});
titleText.anchor.set(0.5, 0.5);
titleText.y = -600;
self.addChild(titleText);
var seedTypes = ['carrot', 'strawberry', 'banana', 'coconut', 'dragonfruit', 'apple', 'orange'];
var seedNames = ['Carrot', 'Strawberry', 'Banana', 'Coconut', 'Dragon Fruit', 'Apple', 'Orange'];
// Use uniform medium size for all seeds in shop
var uniformScale = 0.5; // Medium size for all seeds
for (var i = 0; i < seedTypes.length; i++) {
var seedButton = new Container();
seedButton.x = 0;
seedButton.y = -400 + i * 150;
// Use larger scale for orange and apple icons
var iconScale = uniformScale;
if (seedTypes[i] === 'orange' || seedTypes[i] === 'apple') {
iconScale = 0.8; // Larger size for orange and apple
}
var seedIcon = LK.getAsset(seedTypes[i], {
anchorX: 0.5,
anchorY: 0.5,
scaleX: iconScale,
scaleY: iconScale
});
seedIcon.x = -400;
seedButton.addChild(seedIcon);
var nameText = new Text2(seedNames[i], {
size: 70,
fill: 0x000000
});
nameText.anchor.set(0, 0.5);
nameText.x = -250;
seedButton.addChild(nameText);
var priceText = new Text2('$' + seedPrices[seedTypes[i]], {
size: 70,
fill: 0xFFFF00
});
priceText.anchor.set(1, 0.5);
priceText.x = 300;
seedButton.addChild(priceText);
seedButton.seedType = seedTypes[i];
seedButton.down = function () {
if (money >= seedPrices[this.seedType]) {
selectedSeed = this.seedType;
self.visible = false;
LK.getSound('Buy').play();
}
};
self.addChild(seedButton);
}
var closeButton = new Button('CLOSE', function () {
self.visible = false;
});
closeButton.y = 650;
closeButton.scaleX = 1.5;
closeButton.scaleY = 1.5;
self.addChild(closeButton);
return self;
});
var Sprinkler = Container.expand(function (x, y) {
var self = Container.call(this);
self.x = x;
self.y = y;
self.type = 'regular';
var sprinklerGraphics = self.attachAsset('sprinkler', {
anchorX: 0.5,
anchorY: 0.5
});
// Add pulsing animation to show it's active
function animateSprinkler() {
tween(sprinklerGraphics, {
scaleX: 1.2,
scaleY: 1.2,
alpha: 0.7
}, {
duration: 1000,
easing: tween.easeInOut,
onFinish: function onFinish() {
tween(sprinklerGraphics, {
scaleX: 1.0,
scaleY: 1.0,
alpha: 1.0
}, {
duration: 1000,
easing: tween.easeInOut,
onFinish: animateSprinkler
});
}
});
}
animateSprinkler();
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x228B22
});
/****
* Game Code
****/
// Add grass background
var grassBackground = game.attachAsset('grass_bg', {
anchorX: 0,
anchorY: 0,
x: 0,
y: 0
});
var money = 0;
var inventory = {};
var selectedSeed = null;
var selectedSprinkler = false;
var selectedFish = false;
var selectedFish2 = false;
var sprinklers = [];
var seedPrices = {
carrot: 10,
strawberry: 50,
banana: 80,
coconut: 160,
dragonfruit: 250,
apple: 30,
orange: 175
};
var sellPrices = {
carrot: 15,
strawberry: 40,
banana: 60,
coconut: 135,
dragonfruit: 200,
fish: 110,
fish2: 75,
apple: 35,
orange: 125,
colorful_carrot: 45,
colorful_strawberry: 120,
colorful_banana: 180,
colorful_coconut: 405,
colorful_dragonfruit: 600,
colorful_fish: 330,
colorful_fish2: 540,
colorful_apple: 105,
colorful_orange: 375,
choco_carrot: 60,
Chococarrot: 60,
choco_strawberry: 160,
choco_banana: 240,
choco_coconut: 540,
choco_dragonfruit: 800,
choco_fish: 440,
choco_fish2: 720,
choco_apple: 140,
choco_orange: 500
};
// Create plant spots in a grid - start with 64 lands arranged in a grid (32 top + 32 bottom)
var plantSpots = [];
var spacing = 220;
var landsPerRow = 8;
var totalRows = 8; // 4 rows for top + 4 rows for bottom
var totalWidth = (landsPerRow - 1) * spacing;
var startX = (2048 - totalWidth) / 2; // Center horizontally on screen
var startY = 600; // Move starting Y up to accommodate bottom section
// Create 32 initial plant spots in 8 columns, 4 rows (top section)
for (var i = 0; i < 32; i++) {
var col = i % 8;
var row = Math.floor(i / 8);
var spot = new PlantSpot(startX + col * spacing, startY + row * spacing);
plantSpots.push(spot);
game.addChild(spot);
}
// Create another 32 plant spots at the bottom (8 columns, 4 rows)
var bottomStartY = startY + 4 * spacing + 100; // Add gap between top and bottom sections
for (var i = 0; i < 32; i++) {
var col = i % 8;
var row = Math.floor(i / 8);
var spot;
// Make the bottom 16 spots (last 2 rows) aquatic
if (i >= 16) {
spot = new AquaticPlantSpot(startX + col * spacing, bottomStartY + row * spacing);
} else {
spot = new PlantSpot(startX + col * spacing, bottomStartY + row * spacing);
}
plantSpots.push(spot);
game.addChild(spot);
}
// Plant initial carrots
plantSpots[0].plantSeed('carrot');
plantSpots[1].plantSeed('carrot');
// UI Elements
var moneyText = new Text2('Money: $0', {
size: 50,
fill: 0x000000
});
moneyText.anchor.set(0, 0);
moneyText.x = 150;
moneyText.y = 50;
LK.gui.topLeft.addChild(moneyText);
var inventoryText = new Text2('Inventory: Empty', {
size: 50,
fill: 0x000000
});
inventoryText.anchor.set(0, 1);
inventoryText.x = 100;
inventoryText.y = -100;
LK.gui.bottomLeft.addChild(inventoryText);
// Make inventory alive with pulsing animation
function animateInventory() {
tween(inventoryText, {
scaleX: 1.1,
scaleY: 1.1
}, {
duration: 1000,
easing: tween.easeInOut,
onFinish: function onFinish() {
tween(inventoryText, {
scaleX: 1.0,
scaleY: 1.0
}, {
duration: 1000,
easing: tween.easeInOut,
onFinish: animateInventory
});
}
});
}
animateInventory();
var sellButton = new Button('SELL ALL', function () {
var totalSale = 0;
// Check if we get the 10% price boost (30% chance)
var priceBoost = Math.random() < 0.3 ? 1.1 : 1.0;
for (var itemType in inventory) {
if (inventory[itemType] > 0) {
var basePrice;
basePrice = sellPrices[itemType];
// 25% chance for strawberries to sell for 50 instead of 40
if (itemType === 'strawberry' && Math.random() < 0.25) {
basePrice = 50;
}
// 25% chance for colorful strawberries to sell for 150 instead of 120 (proportional increase)
if (itemType === 'colorful_strawberry' && Math.random() < 0.25) {
basePrice = 150;
}
// 35% chance for fish2 to sell for 85 instead of 75
if (itemType === 'fish2' && Math.random() < 0.35) {
basePrice = 85;
}
basePrice *= priceBoost;
totalSale += inventory[itemType] * basePrice;
inventory[itemType] = 0;
}
}
if (totalSale > 0) {
money += totalSale;
updateMoneyDisplay();
updateInventoryDisplay();
LK.getSound('sell').play();
}
});
sellButton.x = 600;
sellButton.y = 100;
sellButton.scaleX = 1.3;
sellButton.scaleY = 1.3;
LK.gui.topLeft.addChild(sellButton);
var seedButton = new Button('SEEDS', function () {
seedShop.visible = true;
});
seedButton.x = 900;
seedButton.y = 100;
seedButton.scaleX = 1.3;
seedButton.scaleY = 1.3;
LK.gui.topLeft.addChild(seedButton);
var freeCoinsButton = new Button('FREE COINS', function () {
money += 500;
updateMoneyDisplay();
});
freeCoinsButton.x = 1200;
freeCoinsButton.y = 100;
freeCoinsButton.scaleX = 1.3;
freeCoinsButton.scaleY = 1.3;
LK.gui.topLeft.addChild(freeCoinsButton);
var gearButton = new Button('GEAR SHOP', function () {
gearShop.visible = true;
});
gearButton.x = 600;
gearButton.y = 250;
gearButton.scaleX = 1.3;
gearButton.scaleY = 1.3;
LK.gui.topLeft.addChild(gearButton);
var fishButton = new Button('FISH SHOP', function () {
fishShop.visible = true;
});
fishButton.x = 900;
fishButton.y = 250;
fishButton.scaleX = 1.3;
fishButton.scaleY = 1.3;
LK.gui.topLeft.addChild(fishButton);
var seedShop = new SeedShop();
seedShop.x = 1024;
seedShop.y = 1366;
seedShop.visible = false;
game.addChild(seedShop);
var gearShop = new GearShop();
gearShop.x = 1024;
gearShop.y = 1366;
gearShop.visible = false;
game.addChild(gearShop);
var fishShop = new FishShop();
fishShop.x = 1024;
fishShop.y = 1366;
fishShop.visible = false;
game.addChild(fishShop);
// Button sliding variables
var topButtons = [sellButton, seedButton, freeCoinsButton, gearButton, fishButton];
var buttonBasePositions = [600, 900, 1200, 600, 900];
var slideOffset = 0;
var maxSlideOffset = 400; // Maximum pixels to slide
// Sliding functions
function slideButtonsLeft() {
slideOffset = Math.min(slideOffset + 100, maxSlideOffset);
updateButtonPositions();
}
function slideButtonsRight() {
slideOffset = Math.max(slideOffset - 100, -maxSlideOffset);
updateButtonPositions();
}
function updateButtonPositions() {
for (var i = 0; i < topButtons.length; i++) {
tween(topButtons[i], {
x: buttonBasePositions[i] + slideOffset
}, {
duration: 300,
easing: tween.easeOut
});
}
}
function updateMoneyDisplay() {
moneyText.setText('Money: $' + money);
}
function updateInventoryDisplay() {
var inventoryStr = 'Inventory: ';
var hasItems = false;
for (var itemType in inventory) {
if (inventory[itemType] > 0) {
if (hasItems) inventoryStr += ', ';
inventoryStr += itemType + ' x' + inventory[itemType];
hasItems = true;
}
}
if (!hasItems) {
inventoryStr += 'Empty';
}
inventoryText.setText(inventoryStr);
}
function expandLands(targetCount) {
var currentCount = plantSpots.length;
if (targetCount === 12 && currentCount === 6) {
// Expand from 6 to 12 lands - add 6 more in 3 columns, 4 rows total
for (var i = currentCount; i < targetCount; i++) {
var col = i % 3;
var row = Math.floor(i / 3);
var newSpot = new PlantSpot(startX + col * spacing, startY + row * spacing);
plantSpots.push(newSpot);
game.addChild(newSpot);
}
} else if (targetCount === 18 && currentCount === 12) {
// Expand from 12 to 18 lands - rearrange to left column and add right column
var leftStartY = 800;
// First, move existing 12 lands to left side (3 columns, up to 4 rows)
for (var i = 0; i < currentCount; i++) {
var spot = plantSpots[i];
var newX = startX + i % 3 * spacing;
var newY = leftStartY + Math.floor(i / 3) * spacing;
tween(spot, {
x: newX,
y: newY
}, {
duration: 1000,
easing: tween.easeInOut
});
}
// Add 6 new lands to the right side
var rightStartX = startX + 4 * spacing;
for (var i = currentCount; i < targetCount; i++) {
var rightIndex = i - currentCount;
var col = rightIndex % 3;
var row = Math.floor(rightIndex / 3);
var newSpot = new PlantSpot(rightStartX + col * spacing, leftStartY + row * spacing);
plantSpots.push(newSpot);
game.addChild(newSpot);
}
}
}
function expandLandsForDragonFruit() {
var currentCount = plantSpots.length;
// Calculate center positioning for all lands
var totalLands = currentCount + 12; // Current lands + 12 new lands
var landsPerRow = 6; // 6 lands per row for better centering
var totalRows = Math.ceil(totalLands / landsPerRow);
var totalWidth = (landsPerRow - 1) * spacing;
var totalHeight = (totalRows - 1) * spacing;
var centerStartX = (2048 - totalWidth) / 2; // Center horizontally on screen
var centerStartY = 800;
// Move all existing lands to center positions
for (var i = 0; i < currentCount; i++) {
var spot = plantSpots[i];
var col = i % landsPerRow;
var row = Math.floor(i / landsPerRow);
var newX = centerStartX + col * spacing;
var newY = centerStartY + row * spacing;
tween(spot, {
x: newX,
y: newY
}, {
duration: 1000,
easing: tween.easeInOut
});
}
// Add 12 new lands continuing from center positions
for (var i = 0; i < 12; i++) {
var landIndex = currentCount + i;
var col = landIndex % landsPerRow;
var row = Math.floor(landIndex / landsPerRow);
var newX = centerStartX + col * spacing;
var newY = centerStartY + row * spacing;
var newSpot = new PlantSpot(newX, newY);
plantSpots.push(newSpot);
game.addChild(newSpot);
}
}
// Play background music
LK.playMusic('Music');
// Touch controls for sliding buttons
var touchStartX = 0;
var isDraggingButtons = false;
game.down = function (x, y, obj) {
// Check if touch is in the top button area
if (y < 200) {
touchStartX = x;
isDraggingButtons = true;
}
};
game.up = function (x, y, obj) {
if (isDraggingButtons) {
var deltaX = x - touchStartX;
if (Math.abs(deltaX) > 50) {
// Minimum swipe distance
if (deltaX > 0) {
slideButtonsLeft();
} else {
slideButtonsRight();
}
}
isDraggingButtons = false;
}
};
game.update = function () {
// Plant spots update automatically through their update methods
}; /****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var AquaticPlantSpot = Container.expand(function (x, y) {
var self = Container.call(this);
self.x = x;
self.y = y;
self.planted = false;
self.plantType = null;
self.plantTime = 0;
self.grown = false;
self.regrowTime = 0;
self.isAquatic = true;
var waterGraphics = self.attachAsset('water', {
anchorX: 0.5,
anchorY: 0.5,
tint: 0x4169E1
});
// Move water graphics to the back layer
self.setChildIndex(waterGraphics, 0);
var plantGraphics = null;
self.plantSeed = function (seedType) {
if (self.planted) return false;
self.planted = true;
self.plantType = seedType === 'fish2' ? 'fish2' : 'fish'; // Support both fish types
self.plantTime = LK.ticks;
self.grown = false;
self.isColorful = false;
// 5% chance for colorful fish (3x price)
if (Math.random() < 0.05) {
self.isColorful = true;
}
var finalScale = 1.0;
var assetName;
if (self.plantType === 'fish2') {
assetName = self.isColorful ? 'colorful_Fish2' : 'Fish2';
} else {
assetName = self.isColorful ? 'colorful_fish' : 'fish';
}
plantGraphics = self.attachAsset(assetName, {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.5,
scaleX: 0.3,
scaleY: 0.3
});
// Add colorful tint for special fish
if (self.isColorful) {
plantGraphics.tint = 0xFFD700; // Golden fish
}
// Ensure fish graphics appear above water
self.setChildIndex(plantGraphics, self.children.length - 1);
// Animate fish growth over 3 seconds (faster than plants)
tween(plantGraphics, {
scaleX: finalScale,
scaleY: finalScale
}, {
duration: 3000,
easing: tween.easeOut
});
// Add swimming animation for colorful fish
if (self.isColorful) {
var swimmingAnimation = function swimmingAnimation() {
if (plantGraphics) {
tween(plantGraphics, {
x: 20
}, {
duration: 1000,
easing: tween.easeInOut,
onFinish: function onFinish() {
tween(plantGraphics, {
x: -20
}, {
duration: 1000,
easing: tween.easeInOut,
onFinish: function onFinish() {
tween(plantGraphics, {
x: 0
}, {
duration: 1000,
easing: tween.easeInOut,
onFinish: swimmingAnimation
});
}
});
}
});
}
};
// Start swimming animation after growth completes
LK.setTimeout(swimmingAnimation, 3000);
}
LK.getSound('plant').play();
LK.getSound('Water').play();
return true;
};
self.harvest = function () {
if (!self.grown) return null;
var harvestedType = self.plantType; // Use the actual planted type (fish or fish2)
var isColorfulHarvest = self.isColorful;
// Fish regrow like bananas
if (plantGraphics) {
tween(plantGraphics, {
alpha: 0.3,
scaleX: 0.5,
scaleY: 0.5
}, {
duration: 500,
easing: tween.easeIn
});
}
self.grown = false;
self.regrowTime = LK.ticks;
LK.getSound('harvest').play();
return {
type: harvestedType,
colorful: isColorfulHarvest,
chocolate: self.isChocolate || false
};
};
self.update = function () {
if (self.planted && !self.grown) {
// Check if this spot is affected by a sprinkler
var speedMultiplier = 1;
for (var i = 0; i < sprinklers.length; i++) {
var sprinkler = sprinklers[i];
var distanceX = Math.abs(self.x - sprinkler.x);
var distanceY = Math.abs(self.y - sprinkler.y);
// Regular sprinkler: 2x speed in 3x3 area
if (distanceX <= 660 && distanceY <= 660) {
speedMultiplier = 2;
break;
}
}
// Check if it's time to regrow after harvest
if (self.regrowTime > 0) {
var regrowTime = self.plantType === 'fish2' ? 2700 : 3300; // 45 seconds for fish2, 55 for fish
if (LK.ticks - self.regrowTime > regrowTime / speedMultiplier) {
self.grown = true;
self.regrowTime = 0;
if (plantGraphics) {
var regrowScale = 1.0;
tween(plantGraphics, {
alpha: 1.0,
scaleX: regrowScale,
scaleY: regrowScale
}, {
duration: 1000,
easing: tween.easeOut
});
}
}
} else if (self.regrowTime === 0 && LK.ticks - self.plantTime > (self.plantType === 'fish2' ? 2700 : 3300) / speedMultiplier) {
// 45 seconds for fish2, 55 seconds for fish initial growth
self.grown = true;
if (plantGraphics) {
plantGraphics.alpha = 1.0;
}
}
}
};
self.down = function () {
if (self.grown) {
var harvested = self.harvest();
if (harvested) {
var harvestType = harvested.type;
if (harvested.chocolate) {
var baseType = harvestType === 'fish2' ? 'fish2' : 'fish';
inventory['choco_' + baseType] = (inventory['choco_' + baseType] || 0) + 1;
} else if (harvested.colorful) {
var baseType = harvestType === 'fish2' ? 'fish2' : 'fish';
inventory['colorful_' + baseType] = (inventory['colorful_' + baseType] || 0) + 1;
} else {
inventory[harvestType] = (inventory[harvestType] || 0) + 1;
}
updateInventoryDisplay();
}
} else if (!self.planted && selectedSprinkler) {
// Place sprinkler
var sprinklerCost = 35;
if (money >= sprinklerCost) {
var sprinkler = new Sprinkler(self.x, self.y);
sprinklers.push(sprinkler);
game.addChild(sprinkler);
money -= sprinklerCost;
updateMoneyDisplay();
selectedSprinkler = false;
gearShop.visible = false;
}
} else if (!self.planted && selectedFish && money >= 100) {
// Plant fish in aquatic spots
if (self.plantSeed('fish')) {
money -= 100;
updateMoneyDisplay();
selectedFish = false;
fishShop.visible = false;
}
} else if (!self.planted && selectedFish2 && money >= 150) {
// Plant fish2 in aquatic spots
if (self.plantSeed('fish2')) {
money -= 150;
updateMoneyDisplay();
selectedFish2 = false;
fishShop.visible = false;
}
} else if (!self.planted && selectedSeed && money >= seedPrices[selectedSeed]) {
// Don't plant fruit seeds in water - this is an aquatic spot for fish only
// No planting action will occur, but we can provide feedback
selectedSeed = null;
seedShop.visible = false;
}
};
return self;
});
var Button = Container.expand(function (text, onClick) {
var self = Container.call(this);
var buttonBg = self.attachAsset('button', {
anchorX: 0.5,
anchorY: 0.5
});
var buttonText = new Text2(text, {
size: 30,
fill: 0xFFFFFF
});
buttonText.anchor.set(0.5, 0.5);
self.addChild(buttonText);
self.down = function () {
if (onClick) onClick();
};
return self;
});
var FishShop = Container.expand(function () {
var self = Container.call(this);
var background = self.attachAsset('seedShopBg', {
anchorX: 0.5,
anchorY: 0.5
});
var titleText = new Text2('FISH SHOP', {
size: 80,
fill: 0x000000
});
titleText.anchor.set(0.5, 0.5);
titleText.y = -600;
self.addChild(titleText);
// Fish item
var fishButton = new Container();
fishButton.x = 0;
fishButton.y = -300;
var fishIcon = fishButton.attachAsset('fish', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 1.5,
scaleY: 1.5
});
fishIcon.x = -300;
var nameText = new Text2('Fish', {
size: 70,
fill: 0x000000
});
nameText.anchor.set(0, 0.5);
nameText.x = -200;
fishButton.addChild(nameText);
var priceText = new Text2('$100', {
size: 70,
fill: 0xFFFF00
});
priceText.anchor.set(1, 0.5);
priceText.x = 300;
fishButton.addChild(priceText);
var descText = new Text2('Grows in 55 seconds, sells for $120', {
size: 40,
fill: 0x666666
});
descText.anchor.set(0.5, 0);
descText.y = 50;
fishButton.addChild(descText);
fishButton.down = function () {
if (money >= 100) {
selectedFish = true;
self.visible = false;
LK.getSound('Buy').play();
}
};
self.addChild(fishButton);
// Fish2 item
var fish2Button = new Container();
fish2Button.x = 0;
fish2Button.y = -100;
var fish2Icon = fish2Button.attachAsset('Fish2', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 1.5,
scaleY: 1.5
});
fish2Icon.x = -300;
var name2Text = new Text2('Fish2', {
size: 70,
fill: 0x000000
});
name2Text.anchor.set(0, 0.5);
name2Text.x = -200;
fish2Button.addChild(name2Text);
var price2Text = new Text2('$150', {
size: 70,
fill: 0xFFFF00
});
price2Text.anchor.set(1, 0.5);
price2Text.x = 300;
fish2Button.addChild(price2Text);
var desc2Text = new Text2('Grows in 45 seconds, sells for $180', {
size: 40,
fill: 0x666666
});
desc2Text.anchor.set(0.5, 0);
desc2Text.y = 50;
fish2Button.addChild(desc2Text);
fish2Button.down = function () {
if (money >= 150) {
selectedFish2 = true;
self.visible = false;
LK.getSound('Buy').play();
}
};
self.addChild(fish2Button);
var closeButton = new Button('CLOSE', function () {
self.visible = false;
});
closeButton.y = 300;
self.addChild(closeButton);
return self;
});
var GearShop = Container.expand(function () {
var self = Container.call(this);
var background = self.attachAsset('seedShopBg', {
anchorX: 0.5,
anchorY: 0.5
});
var titleText = new Text2('GEAR SHOP', {
size: 80,
fill: 0x000000
});
titleText.anchor.set(0.5, 0.5);
titleText.y = -600;
self.addChild(titleText);
// Sprinkler item
var sprinklerButton = new Container();
sprinklerButton.x = 0;
sprinklerButton.y = -200;
var sprinklerIcon = LK.getAsset('sprinkler', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 1.5,
scaleY: 1.5
});
sprinklerIcon.x = -300;
sprinklerButton.addChild(sprinklerIcon);
var nameText = new Text2('Sprinkler', {
size: 70,
fill: 0x000000
});
nameText.anchor.set(0, 0.5);
nameText.x = -200;
sprinklerButton.addChild(nameText);
var priceText = new Text2('$35', {
size: 70,
fill: 0xFFFF00
});
priceText.anchor.set(1, 0.5);
priceText.x = 300;
sprinklerButton.addChild(priceText);
var descText = new Text2('2x growth speed in 3x3 area', {
size: 40,
fill: 0x666666
});
descText.anchor.set(0.5, 0);
descText.y = 50;
sprinklerButton.addChild(descText);
sprinklerButton.down = function () {
if (money >= 35) {
selectedSprinkler = 'regular';
self.visible = false;
LK.getSound('Buy').play();
}
};
self.addChild(sprinklerButton);
var closeButton = new Button('CLOSE', function () {
self.visible = false;
});
closeButton.y = 200;
self.addChild(closeButton);
return self;
});
var PlantSpot = Container.expand(function (x, y) {
var self = Container.call(this);
self.x = x;
self.y = y;
self.planted = false;
self.plantType = null;
self.plantTime = 0;
self.grown = false;
self.regrowTime = 0;
var dirtGraphics = self.attachAsset('dirt', {
anchorX: 0.5,
anchorY: 0.5
});
// Move dirt graphics to the back layer
self.setChildIndex(dirtGraphics, 0);
var plantGraphics = null;
self.plantSeed = function (seedType) {
if (self.planted) return false;
self.planted = true;
self.plantType = seedType;
self.plantTime = LK.ticks;
self.grown = false;
self.isColorful = false;
// 5% chance for colorful fruit (3x price)
if (Math.random() < 0.05) {
self.isColorful = true;
self.plantType = 'colorful_' + seedType;
}
var finalScale = 1.0;
plantGraphics = self.attachAsset(self.plantType, {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.5,
scaleX: 0.3,
scaleY: 0.3
});
// Ensure plant graphics appear above soil, especially for giant fruits
self.setChildIndex(plantGraphics, self.children.length - 1);
// Animate plant growth over 5 seconds
tween(plantGraphics, {
scaleX: finalScale,
scaleY: finalScale
}, {
duration: 5000,
easing: tween.easeOut
});
// Add rainbow tint animation for colorful fruits
if (self.isColorful) {
var colorfulAnimation = function colorfulAnimation() {
var colors = [0xff0000, 0x00ff00, 0x0000ff, 0xffff00, 0xff00ff, 0x00ffff];
var currentColor = 0;
var _animateColor = function animateColor() {
if (plantGraphics) {
tween(plantGraphics, {
tint: colors[currentColor]
}, {
duration: 800,
easing: tween.easeInOut,
onFinish: function onFinish() {
currentColor = (currentColor + 1) % colors.length;
_animateColor();
}
});
}
};
_animateColor();
};
// Start colorful animation after growth completes
LK.setTimeout(colorfulAnimation, 5000);
}
LK.getSound('plant').play();
return true;
};
self.harvest = function () {
if (!self.grown) return null;
var harvestedType = self.plantType;
var isColorfulHarvest = self.isColorful;
// Check if this is a regrowing fruit (banana, dragon fruit, coconut, or apple)
var isBanana = harvestedType === 'banana' || harvestedType === 'colorful_banana';
var isDragonFruit = harvestedType === 'dragonfruit' || harvestedType === 'colorful_dragonfruit';
var isCoconut = harvestedType === 'coconut' || harvestedType === 'colorful_coconut';
var isApple = harvestedType === 'apple' || harvestedType === 'colorful_apple';
if (isBanana || isDragonFruit || isCoconut || isApple) {
// Hide the plant graphics with animation for regrowing fruits
if (plantGraphics) {
tween(plantGraphics, {
alpha: 0.3,
scaleX: 0.5,
scaleY: 0.5
}, {
duration: 500,
easing: tween.easeIn
});
}
self.grown = false;
self.regrowTime = LK.ticks;
} else {
// For carrots and strawberries, reset the plant completely
if (plantGraphics) {
plantGraphics.destroy();
plantGraphics = null;
}
self.planted = false;
self.plantType = null;
self.plantTime = 0;
self.grown = false;
self.isColorful = false;
self.regrowTime = 0;
}
LK.getSound('harvest').play();
return {
type: harvestedType,
colorful: isColorfulHarvest,
chocolate: self.isChocolate || false
};
};
self.update = function () {
if (self.planted && !self.grown) {
// Check if this spot is affected by a sprinkler
var speedMultiplier = 1;
for (var i = 0; i < sprinklers.length; i++) {
var sprinkler = sprinklers[i];
var distanceX = Math.abs(self.x - sprinkler.x);
var distanceY = Math.abs(self.y - sprinkler.y);
// Regular sprinkler: 2x speed in 3x3 area (660px = 3 * 220px spacing)
if (distanceX <= 660 && distanceY <= 660) {
speedMultiplier = 2;
break;
}
}
// Check if it's time to regrow after harvest (for bananas, dragon fruit, and coconut)
if (self.regrowTime > 0) {
var isBanana = self.plantType === 'banana' || self.plantType === 'colorful_banana';
var isDragonFruit = self.plantType === 'dragonfruit' || self.plantType === 'colorful_dragonfruit';
var isCoconut = self.plantType === 'coconut' || self.plantType === 'colorful_coconut';
var isApple = self.plantType === 'apple' || self.plantType === 'colorful_apple';
var regrowReady = false;
if (isBanana && LK.ticks - self.regrowTime > 1140 / speedMultiplier) {
// 19 seconds at 60fps for banana regrow (halved with sprinkler)
regrowReady = true;
} else if ((isDragonFruit || isCoconut) && LK.ticks - self.regrowTime > 1320 / speedMultiplier) {
// 22 seconds at 60fps for dragon fruit and coconut regrow (halved with sprinkler)
regrowReady = true;
} else if (isApple && LK.ticks - self.regrowTime > 1200 / speedMultiplier) {
// 20 seconds at 60fps for apple regrow (halved with sprinkler)
regrowReady = true;
}
if (regrowReady) {
self.grown = true;
self.regrowTime = 0;
if (plantGraphics) {
var regrowScale = 1.0;
tween(plantGraphics, {
alpha: 1.0,
scaleX: regrowScale,
scaleY: regrowScale
}, {
duration: 1000,
easing: tween.easeOut
});
}
}
} else if (self.regrowTime === 0 && LK.ticks - self.plantTime > 300 / speedMultiplier) {
// 5 seconds at 60fps for initial growth (halved with sprinkler)
self.grown = true;
if (plantGraphics) {
plantGraphics.alpha = 1.0;
}
}
}
};
self.down = function () {
if (self.grown) {
var harvested = self.harvest();
if (harvested) {
var harvestType = harvested.type;
if (harvested.chocolate) {
// Store chocolate fruits separately for 4x price
var baseType = harvestType.replace('colorful_', '');
// Special case for carrots - use Chococarrot asset name
if (baseType === 'carrot') {
inventory['Chococarrot'] = (inventory['Chococarrot'] || 0) + 1;
} else {
inventory['choco_' + baseType] = (inventory['choco_' + baseType] || 0) + 1;
}
} else if (harvested.colorful) {
// Store colorful fruits separately for 3x price
var baseType = harvestType.replace('colorful_', '');
inventory['colorful_' + baseType] = (inventory['colorful_' + baseType] || 0) + 1;
} else {
inventory[harvestType] = (inventory[harvestType] || 0) + 1;
}
updateInventoryDisplay();
}
} else if (!self.planted && selectedSprinkler) {
// Place sprinkler
var sprinklerCost = 35;
if (money >= sprinklerCost) {
var sprinkler = new Sprinkler(self.x, self.y);
sprinklers.push(sprinkler);
game.addChild(sprinkler);
money -= sprinklerCost;
updateMoneyDisplay();
selectedSprinkler = false;
gearShop.visible = false;
}
} else if (!self.planted && selectedSeed && money >= seedPrices[selectedSeed]) {
if (self.plantSeed(selectedSeed)) {
money -= seedPrices[selectedSeed];
updateMoneyDisplay();
selectedSeed = null;
seedShop.visible = false;
}
}
};
return self;
});
var SeedShop = Container.expand(function () {
var self = Container.call(this);
var background = self.attachAsset('seedShopBg', {
anchorX: 0.5,
anchorY: 0.5
});
var titleText = new Text2('SEED SHOP', {
size: 80,
fill: 0x000000
});
titleText.anchor.set(0.5, 0.5);
titleText.y = -600;
self.addChild(titleText);
var seedTypes = ['carrot', 'strawberry', 'banana', 'coconut', 'dragonfruit', 'apple', 'orange'];
var seedNames = ['Carrot', 'Strawberry', 'Banana', 'Coconut', 'Dragon Fruit', 'Apple', 'Orange'];
// Use uniform medium size for all seeds in shop
var uniformScale = 0.5; // Medium size for all seeds
for (var i = 0; i < seedTypes.length; i++) {
var seedButton = new Container();
seedButton.x = 0;
seedButton.y = -400 + i * 150;
// Use larger scale for orange and apple icons
var iconScale = uniformScale;
if (seedTypes[i] === 'orange' || seedTypes[i] === 'apple') {
iconScale = 0.8; // Larger size for orange and apple
}
var seedIcon = LK.getAsset(seedTypes[i], {
anchorX: 0.5,
anchorY: 0.5,
scaleX: iconScale,
scaleY: iconScale
});
seedIcon.x = -400;
seedButton.addChild(seedIcon);
var nameText = new Text2(seedNames[i], {
size: 70,
fill: 0x000000
});
nameText.anchor.set(0, 0.5);
nameText.x = -250;
seedButton.addChild(nameText);
var priceText = new Text2('$' + seedPrices[seedTypes[i]], {
size: 70,
fill: 0xFFFF00
});
priceText.anchor.set(1, 0.5);
priceText.x = 300;
seedButton.addChild(priceText);
seedButton.seedType = seedTypes[i];
seedButton.down = function () {
if (money >= seedPrices[this.seedType]) {
selectedSeed = this.seedType;
self.visible = false;
LK.getSound('Buy').play();
}
};
self.addChild(seedButton);
}
var closeButton = new Button('CLOSE', function () {
self.visible = false;
});
closeButton.y = 650;
closeButton.scaleX = 1.5;
closeButton.scaleY = 1.5;
self.addChild(closeButton);
return self;
});
var Sprinkler = Container.expand(function (x, y) {
var self = Container.call(this);
self.x = x;
self.y = y;
self.type = 'regular';
var sprinklerGraphics = self.attachAsset('sprinkler', {
anchorX: 0.5,
anchorY: 0.5
});
// Add pulsing animation to show it's active
function animateSprinkler() {
tween(sprinklerGraphics, {
scaleX: 1.2,
scaleY: 1.2,
alpha: 0.7
}, {
duration: 1000,
easing: tween.easeInOut,
onFinish: function onFinish() {
tween(sprinklerGraphics, {
scaleX: 1.0,
scaleY: 1.0,
alpha: 1.0
}, {
duration: 1000,
easing: tween.easeInOut,
onFinish: animateSprinkler
});
}
});
}
animateSprinkler();
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x228B22
});
/****
* Game Code
****/
// Add grass background
var grassBackground = game.attachAsset('grass_bg', {
anchorX: 0,
anchorY: 0,
x: 0,
y: 0
});
var money = 0;
var inventory = {};
var selectedSeed = null;
var selectedSprinkler = false;
var selectedFish = false;
var selectedFish2 = false;
var sprinklers = [];
var seedPrices = {
carrot: 10,
strawberry: 50,
banana: 80,
coconut: 160,
dragonfruit: 250,
apple: 30,
orange: 175
};
var sellPrices = {
carrot: 15,
strawberry: 40,
banana: 60,
coconut: 135,
dragonfruit: 200,
fish: 110,
fish2: 75,
apple: 35,
orange: 125,
colorful_carrot: 45,
colorful_strawberry: 120,
colorful_banana: 180,
colorful_coconut: 405,
colorful_dragonfruit: 600,
colorful_fish: 330,
colorful_fish2: 540,
colorful_apple: 105,
colorful_orange: 375,
choco_carrot: 60,
Chococarrot: 60,
choco_strawberry: 160,
choco_banana: 240,
choco_coconut: 540,
choco_dragonfruit: 800,
choco_fish: 440,
choco_fish2: 720,
choco_apple: 140,
choco_orange: 500
};
// Create plant spots in a grid - start with 64 lands arranged in a grid (32 top + 32 bottom)
var plantSpots = [];
var spacing = 220;
var landsPerRow = 8;
var totalRows = 8; // 4 rows for top + 4 rows for bottom
var totalWidth = (landsPerRow - 1) * spacing;
var startX = (2048 - totalWidth) / 2; // Center horizontally on screen
var startY = 600; // Move starting Y up to accommodate bottom section
// Create 32 initial plant spots in 8 columns, 4 rows (top section)
for (var i = 0; i < 32; i++) {
var col = i % 8;
var row = Math.floor(i / 8);
var spot = new PlantSpot(startX + col * spacing, startY + row * spacing);
plantSpots.push(spot);
game.addChild(spot);
}
// Create another 32 plant spots at the bottom (8 columns, 4 rows)
var bottomStartY = startY + 4 * spacing + 100; // Add gap between top and bottom sections
for (var i = 0; i < 32; i++) {
var col = i % 8;
var row = Math.floor(i / 8);
var spot;
// Make the bottom 16 spots (last 2 rows) aquatic
if (i >= 16) {
spot = new AquaticPlantSpot(startX + col * spacing, bottomStartY + row * spacing);
} else {
spot = new PlantSpot(startX + col * spacing, bottomStartY + row * spacing);
}
plantSpots.push(spot);
game.addChild(spot);
}
// Plant initial carrots
plantSpots[0].plantSeed('carrot');
plantSpots[1].plantSeed('carrot');
// UI Elements
var moneyText = new Text2('Money: $0', {
size: 50,
fill: 0x000000
});
moneyText.anchor.set(0, 0);
moneyText.x = 150;
moneyText.y = 50;
LK.gui.topLeft.addChild(moneyText);
var inventoryText = new Text2('Inventory: Empty', {
size: 50,
fill: 0x000000
});
inventoryText.anchor.set(0, 1);
inventoryText.x = 100;
inventoryText.y = -100;
LK.gui.bottomLeft.addChild(inventoryText);
// Make inventory alive with pulsing animation
function animateInventory() {
tween(inventoryText, {
scaleX: 1.1,
scaleY: 1.1
}, {
duration: 1000,
easing: tween.easeInOut,
onFinish: function onFinish() {
tween(inventoryText, {
scaleX: 1.0,
scaleY: 1.0
}, {
duration: 1000,
easing: tween.easeInOut,
onFinish: animateInventory
});
}
});
}
animateInventory();
var sellButton = new Button('SELL ALL', function () {
var totalSale = 0;
// Check if we get the 10% price boost (30% chance)
var priceBoost = Math.random() < 0.3 ? 1.1 : 1.0;
for (var itemType in inventory) {
if (inventory[itemType] > 0) {
var basePrice;
basePrice = sellPrices[itemType];
// 25% chance for strawberries to sell for 50 instead of 40
if (itemType === 'strawberry' && Math.random() < 0.25) {
basePrice = 50;
}
// 25% chance for colorful strawberries to sell for 150 instead of 120 (proportional increase)
if (itemType === 'colorful_strawberry' && Math.random() < 0.25) {
basePrice = 150;
}
// 35% chance for fish2 to sell for 85 instead of 75
if (itemType === 'fish2' && Math.random() < 0.35) {
basePrice = 85;
}
basePrice *= priceBoost;
totalSale += inventory[itemType] * basePrice;
inventory[itemType] = 0;
}
}
if (totalSale > 0) {
money += totalSale;
updateMoneyDisplay();
updateInventoryDisplay();
LK.getSound('sell').play();
}
});
sellButton.x = 600;
sellButton.y = 100;
sellButton.scaleX = 1.3;
sellButton.scaleY = 1.3;
LK.gui.topLeft.addChild(sellButton);
var seedButton = new Button('SEEDS', function () {
seedShop.visible = true;
});
seedButton.x = 900;
seedButton.y = 100;
seedButton.scaleX = 1.3;
seedButton.scaleY = 1.3;
LK.gui.topLeft.addChild(seedButton);
var freeCoinsButton = new Button('FREE COINS', function () {
money += 500;
updateMoneyDisplay();
});
freeCoinsButton.x = 1200;
freeCoinsButton.y = 100;
freeCoinsButton.scaleX = 1.3;
freeCoinsButton.scaleY = 1.3;
LK.gui.topLeft.addChild(freeCoinsButton);
var gearButton = new Button('GEAR SHOP', function () {
gearShop.visible = true;
});
gearButton.x = 600;
gearButton.y = 250;
gearButton.scaleX = 1.3;
gearButton.scaleY = 1.3;
LK.gui.topLeft.addChild(gearButton);
var fishButton = new Button('FISH SHOP', function () {
fishShop.visible = true;
});
fishButton.x = 900;
fishButton.y = 250;
fishButton.scaleX = 1.3;
fishButton.scaleY = 1.3;
LK.gui.topLeft.addChild(fishButton);
var seedShop = new SeedShop();
seedShop.x = 1024;
seedShop.y = 1366;
seedShop.visible = false;
game.addChild(seedShop);
var gearShop = new GearShop();
gearShop.x = 1024;
gearShop.y = 1366;
gearShop.visible = false;
game.addChild(gearShop);
var fishShop = new FishShop();
fishShop.x = 1024;
fishShop.y = 1366;
fishShop.visible = false;
game.addChild(fishShop);
// Button sliding variables
var topButtons = [sellButton, seedButton, freeCoinsButton, gearButton, fishButton];
var buttonBasePositions = [600, 900, 1200, 600, 900];
var slideOffset = 0;
var maxSlideOffset = 400; // Maximum pixels to slide
// Sliding functions
function slideButtonsLeft() {
slideOffset = Math.min(slideOffset + 100, maxSlideOffset);
updateButtonPositions();
}
function slideButtonsRight() {
slideOffset = Math.max(slideOffset - 100, -maxSlideOffset);
updateButtonPositions();
}
function updateButtonPositions() {
for (var i = 0; i < topButtons.length; i++) {
tween(topButtons[i], {
x: buttonBasePositions[i] + slideOffset
}, {
duration: 300,
easing: tween.easeOut
});
}
}
function updateMoneyDisplay() {
moneyText.setText('Money: $' + money);
}
function updateInventoryDisplay() {
var inventoryStr = 'Inventory: ';
var hasItems = false;
for (var itemType in inventory) {
if (inventory[itemType] > 0) {
if (hasItems) inventoryStr += ', ';
inventoryStr += itemType + ' x' + inventory[itemType];
hasItems = true;
}
}
if (!hasItems) {
inventoryStr += 'Empty';
}
inventoryText.setText(inventoryStr);
}
function expandLands(targetCount) {
var currentCount = plantSpots.length;
if (targetCount === 12 && currentCount === 6) {
// Expand from 6 to 12 lands - add 6 more in 3 columns, 4 rows total
for (var i = currentCount; i < targetCount; i++) {
var col = i % 3;
var row = Math.floor(i / 3);
var newSpot = new PlantSpot(startX + col * spacing, startY + row * spacing);
plantSpots.push(newSpot);
game.addChild(newSpot);
}
} else if (targetCount === 18 && currentCount === 12) {
// Expand from 12 to 18 lands - rearrange to left column and add right column
var leftStartY = 800;
// First, move existing 12 lands to left side (3 columns, up to 4 rows)
for (var i = 0; i < currentCount; i++) {
var spot = plantSpots[i];
var newX = startX + i % 3 * spacing;
var newY = leftStartY + Math.floor(i / 3) * spacing;
tween(spot, {
x: newX,
y: newY
}, {
duration: 1000,
easing: tween.easeInOut
});
}
// Add 6 new lands to the right side
var rightStartX = startX + 4 * spacing;
for (var i = currentCount; i < targetCount; i++) {
var rightIndex = i - currentCount;
var col = rightIndex % 3;
var row = Math.floor(rightIndex / 3);
var newSpot = new PlantSpot(rightStartX + col * spacing, leftStartY + row * spacing);
plantSpots.push(newSpot);
game.addChild(newSpot);
}
}
}
function expandLandsForDragonFruit() {
var currentCount = plantSpots.length;
// Calculate center positioning for all lands
var totalLands = currentCount + 12; // Current lands + 12 new lands
var landsPerRow = 6; // 6 lands per row for better centering
var totalRows = Math.ceil(totalLands / landsPerRow);
var totalWidth = (landsPerRow - 1) * spacing;
var totalHeight = (totalRows - 1) * spacing;
var centerStartX = (2048 - totalWidth) / 2; // Center horizontally on screen
var centerStartY = 800;
// Move all existing lands to center positions
for (var i = 0; i < currentCount; i++) {
var spot = plantSpots[i];
var col = i % landsPerRow;
var row = Math.floor(i / landsPerRow);
var newX = centerStartX + col * spacing;
var newY = centerStartY + row * spacing;
tween(spot, {
x: newX,
y: newY
}, {
duration: 1000,
easing: tween.easeInOut
});
}
// Add 12 new lands continuing from center positions
for (var i = 0; i < 12; i++) {
var landIndex = currentCount + i;
var col = landIndex % landsPerRow;
var row = Math.floor(landIndex / landsPerRow);
var newX = centerStartX + col * spacing;
var newY = centerStartY + row * spacing;
var newSpot = new PlantSpot(newX, newY);
plantSpots.push(newSpot);
game.addChild(newSpot);
}
}
// Play background music
LK.playMusic('Music');
// Touch controls for sliding buttons
var touchStartX = 0;
var isDraggingButtons = false;
game.down = function (x, y, obj) {
// Check if touch is in the top button area
if (y < 200) {
touchStartX = x;
isDraggingButtons = true;
}
};
game.up = function (x, y, obj) {
if (isDraggingButtons) {
var deltaX = x - touchStartX;
if (Math.abs(deltaX) > 50) {
// Minimum swipe distance
if (deltaX > 0) {
slideButtonsLeft();
} else {
slideButtonsRight();
}
}
isDraggingButtons = false;
}
};
game.update = function () {
// Plant spots update automatically through their update methods
};
background grass 8 bit. In-Game asset. 2d. High contrast. No shadows
Stone 8 bit. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
Neon
Choco
Choco but all parts of the carrot are visible and only the carrot is painted brown
Blueberry 8 bit. In-Game asset. 2d. High contrast. No shadows
Delete stones, 2d
Cactus 8 bit. In-Game asset. 2d. High contrast. No shadows
8 bit nectarine tree. In-Game asset. 2d. High contrast. No shadows
Cherry tree 8 bit. In-Game asset. 2d. High contrast. No shadows
8 bit pineapple. In-Game asset. 2d. High contrast. No shadows
Kiwi tree 8bit. In-Game asset. 2d. High contrast. No shadows
make trees leaves orange
fruits are black with purple leaves and particles around them
8 bit cherry seed. In-Game asset. 2d. High contrast. No shadows
8bit kiwi seed. In-Game asset. 2d. High contrast. No shadows
Mango seed 8bit. In-Game asset. 2d. High contrast. No shadows
winged and white
make the leaves of the tree white
8 bit pineapple seed. In-Game asset. 2d. High contrast. No shadows
purple black mysterious unknown fruit seed 8bit. In-Game asset. 2d. High contrast. No shadows
8 bit blueberry seed. In-Game asset. 2d. High contrast. No shadows
cactus with pink spines and a small pink flower on top 8bit. In-Game asset. 2d. High contrast. No shadows
Neon
Neon
Neon