User prompt
Y ahora muevela arriba de la hotbar entre los botones
User prompt
Haz que la barra sea igual de larga que la pantalla
User prompt
Ahora añade una progres barr que simbolice la experiencia, que se pueda ganar xp plantando, cosechando, vendiendo y comprando mejoras y cada nivel que subas cueste mas llegar al siguiente ↪💡 Consider importing and using the following plugins: @upit/storage.v1, @upit/tween.v1
User prompt
Separalas un poco mas
User prompt
Junta las monedas y la imagen un poco mas para que queden juntas con un margen
User prompt
Pon las monedas arriba en el centro
User prompt
Algo falla con las monedas revisalo y arreglalo
User prompt
Quita el cuadrado del fonso
User prompt
Olvidalo dejalo como lo teniamos antes de moverlo abajo a la derecha
User prompt
Dejalo como estaba antes abajo a la izquierda
User prompt
Pero el cuadrado también
User prompt
Mas centrado
User prompt
Pon el recuento de monedas con su cuadrado de fondo arriba en el centro
User prompt
Dejalo como estaba antes
User prompt
Hazle un marco negro a el cuadrado del fondo de las monedas bordeandolo
User prompt
Haz que el trazo se actualice cada vez que cambien los numeros de la cantidad de monedas que hay ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
La imagen no se anima, arreglalo ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Haz que cuando se venda un cultivo se anime la imagen de la moneda ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Haz que cada vez que se sumen monedas se anime la imagen y cuando se resten se anime tambien ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Un poco abajo pero no mucho
User prompt
Mueve el texto de las monedas un poco hacia arriba pero deja la imagen igual
User prompt
Y redondea las puntas del cuadrado
User prompt
Ahora mueve el recuento de monedas un poco a la izquierda
User prompt
Un poco mas
User prompt
Mueve el cuadrado mas abajo a la derecha
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
var BuyPanel = Container.expand(function () {
var self = Container.call(this);
// Create rounded horizontal background
var panelBg = LK.getAsset('shopPanel', {
anchorX: 0.5,
anchorY: 0.5
});
// Make corners rounded by scaling height and applying visual rounding effect
panelBg.scale.set(1.5, 0.6); // Make it wider and more horizontal like inventory panel
self.addChild(panelBg);
var titleText = new Text2('COMPRAR SEMILLAS', {
size: 50,
fill: 0x000000
});
titleText.anchor.set(0.5, 0.5);
titleText.x = 0;
titleText.y = -200;
self.addChild(titleText);
var closeBtn = self.addChild(LK.getAsset('closeButton', {
anchorX: 0.5,
anchorY: 0.5,
x: 800,
y: -250
}));
var closeBtnText = new Text2('X', {
size: 30,
fill: 0xFFFFFF
});
closeBtnText.anchor.set(0.5, 0.5);
closeBtn.addChild(closeBtnText);
// Switch to sell panel button
var sellPanelBtn = self.addChild(LK.getAsset('sellButton', {
anchorX: 0.5,
anchorY: 0.5,
x: -700,
y: 200
}));
var sellPanelBtnText = new Text2('VENDER', {
size: 30,
fill: 0xFFFFFF
});
sellPanelBtnText.anchor.set(0.5, 0.5);
sellPanelBtn.addChild(sellPanelBtnText);
// Seed shop items
var seedItems = [{
name: 'Semillas de Lechuga',
type: 'crop1',
price: 5
}, {
name: 'Semillas de Tomate',
type: 'crop2',
price: 10
}, {
name: 'Semillas de Maíz',
type: 'crop3',
price: 20
}];
var buyItems = [];
seedItems.forEach(function (item, index) {
var row = Math.floor(index / 4);
var col = index % 4;
var shopItem = new ShopItem(item.type, item.price, false);
shopItem.x = -400 + col * 400;
shopItem.y = 80 + row * 200;
self.addChild(shopItem);
buyItems.push(shopItem);
shopItem.button.down = function (x, y, obj) {
if (coins >= item.price) {
coins -= item.price;
if (!seeds[item.type]) {
seeds[item.type] = 0;
}
seeds[item.type] += 5;
LK.getSound('purchase').play();
updateUI();
}
};
});
sellPanelBtn.down = function (x, y, obj) {
self.visible = false;
sellPanel.visible = true;
sellPanel.updateSellSection();
};
closeBtn.down = function (x, y, obj) {
self.visible = false;
isBuyPanelOpen = false;
};
return self;
});
var FarmPlot = Container.expand(function () {
var self = Container.call(this);
var plotGraphics = self.attachAsset('farmPlot', {
anchorX: 0.5,
anchorY: 0.5
});
self.cropType = null;
self.plantTime = 0;
self.growthStage = 0;
self.currentCrop = null;
self.isEmpty = true;
self.isReady = false;
self.plantCrop = function (cropType) {
if (!self.isEmpty) return false;
self.cropType = cropType;
self.plantTime = LK.ticks;
self.growthStage = 0;
self.isEmpty = false;
self.isReady = false;
// Create seedling
self.currentCrop = self.addChild(LK.getAsset('seedling', {
anchorX: 0.5,
anchorY: 0.5,
y: -20
}));
LK.getSound('plant').play();
return true;
};
self.harvestCrop = function () {
if (!self.isReady) return null;
var harvestedCrop = {
type: self.cropType,
value: cropData[self.cropType].value
};
// Remove crop visual
if (self.currentCrop) {
self.currentCrop.destroy();
self.currentCrop = null;
}
// Reset plot
self.cropType = null;
self.plantTime = 0;
self.growthStage = 0;
self.isEmpty = true;
self.isReady = false;
LK.getSound('harvest').play();
return harvestedCrop;
};
self.update = function () {
if (self.isEmpty || !self.cropType) return;
var elapsed = LK.ticks - self.plantTime;
var growthTime = cropData[self.cropType].growthTime;
if (elapsed >= growthTime && !self.isReady) {
// Crop is ready
self.isReady = true;
if (self.currentCrop) {
self.currentCrop.destroy();
}
self.currentCrop = self.addChild(LK.getAsset(self.cropType, {
anchorX: 0.5,
anchorY: 0.5,
y: -20
}));
// Add glow effect for ready crops
tween(self.currentCrop, {
alpha: 0.7
}, {
duration: 500,
easing: tween.easeInOut
});
tween(self.currentCrop, {
alpha: 1.0
}, {
duration: 500,
easing: tween.easeInOut,
onFinish: function onFinish() {
if (self.currentCrop && self.isReady) {
tween(self.currentCrop, {
alpha: 0.7
}, {
duration: 500,
easing: tween.easeInOut
});
tween(self.currentCrop, {
alpha: 1.0
}, {
duration: 500,
easing: tween.easeInOut,
onFinish: function onFinish() {
if (self.currentCrop && self.isReady) {
self.update();
}
}
});
}
}
});
} else if (elapsed < growthTime && elapsed > growthTime * 0.5 && self.growthStage === 0) {
// Half grown
self.growthStage = 1;
if (self.currentCrop) {
tween(self.currentCrop, {
scaleX: 1.2,
scaleY: 1.2
}, {
duration: 300
});
}
}
};
self.down = function (x, y, obj) {
if (self.isReady) {
var harvest = self.harvestCrop();
if (harvest) {
// Add to inventory
if (!inventory[harvest.type]) {
inventory[harvest.type] = 0;
}
inventory[harvest.type]++;
updateUI();
}
} else if (self.isEmpty && selectedSeed && seeds[selectedSeed] > 0) {
if (self.plantCrop(selectedSeed)) {
seeds[selectedSeed]--;
updateUI();
}
}
};
return self;
});
var HotbarSlot = Container.expand(function (seedType, index) {
var self = Container.call(this);
self.seedType = seedType;
self.index = index;
self.isSelected = false;
var slotBg = self.attachAsset('hotbarSlot', {
anchorX: 0.5,
anchorY: 0.5
});
self.selectedBg = self.addChild(LK.getAsset('hotbarSlotSelected', {
anchorX: 0.5,
anchorY: 0.5
}));
self.selectedBg.visible = false;
// Add seed visual
if (seedType) {
var seedVisual = self.addChild(LK.getAsset(seedType, {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.8,
scaleY: 0.8
}));
}
// Add count text
self.countText = new Text2('0', {
size: 30,
fill: 0xFFFFFF
});
self.countText.anchor.set(0.5, 0.5);
self.countText.x = 0;
self.countText.y = 40;
self.addChild(self.countText);
self.updateCount = function (count) {
self.countText.setText(count.toString());
self.alpha = count > 0 ? 1.0 : 0.5;
};
self.setSelected = function (selected) {
self.isSelected = selected;
self.selectedBg.visible = selected;
if (selected) {
tween(self, {
scaleX: 1.1,
scaleY: 1.1
}, {
duration: 200,
easing: tween.easeInOut
});
} else {
tween(self, {
scaleX: 1.0,
scaleY: 1.0
}, {
duration: 200,
easing: tween.easeInOut
});
}
};
self.down = function (x, y, obj) {
if (seeds[self.seedType] > 0) {
selectedSeed = self.seedType;
updateHotbar();
}
};
return self;
});
var InventoryItem = Container.expand(function (itemType, count, isHarvested) {
var self = Container.call(this);
// Item icon without background frame - larger size
var itemIcon = self.addChild(LK.getAsset(itemType, {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 1.5,
scaleY: 1.5
}));
// Item name below the image - larger text
var itemName = new Text2(cropData[itemType] ? cropData[itemType].name : itemType, {
size: 45,
fill: 0x000000
});
itemName.anchor.set(0.5, 0.5);
itemName.x = 0;
itemName.y = 80; // Position below the item image
self.addChild(itemName);
// Count text - larger size
self.countText = new Text2(count.toString(), {
size: 40,
fill: 0x000000
});
self.countText.anchor.set(0.5, 0.5);
self.countText.x = 0;
self.countText.y = 120; // Position below the item name
self.addChild(self.countText);
self.updateCount = function (newCount) {
self.countText.setText(newCount.toString());
self.alpha = newCount > 0 ? 1.0 : 0.5;
};
return self;
});
var InventoryPanel = Container.expand(function () {
var self = Container.call(this);
// Create rounded horizontal background
var panelBg = LK.getAsset('shopPanel', {
anchorX: 0.5,
anchorY: 0.5
});
// Make corners rounded by scaling height and applying visual rounding effect
panelBg.scale.set(1.5, 0.6); // Make it wider and more horizontal like shop and upgrades panels
self.addChild(panelBg);
var titleText = new Text2('INVENTARIO', {
size: 50,
fill: 0x000000
});
titleText.anchor.set(0.5, 0.5);
titleText.x = 0;
titleText.y = -200;
self.addChild(titleText);
var closeBtn = self.addChild(LK.getAsset('closeButton', {
anchorX: 0.5,
anchorY: 0.5,
x: 800,
y: -250
}));
var closeBtnText = new Text2('X', {
size: 30,
fill: 0xFFFFFF
});
closeBtnText.anchor.set(0.5, 0.5);
closeBtn.addChild(closeBtnText);
self.inventoryTexts = [];
self.updateInventory = function () {
// Clear existing items
self.inventoryTexts.forEach(function (item) {
item.destroy();
});
self.inventoryTexts = [];
// Create grid layout - wider spacing for larger items
var itemsPerRow = 4;
var itemSpacing = 220;
var currentRow = 0;
var currentCol = 0;
// Adjust positioning for horizontal layout with proper margins within background
var startX = -400; // Adjust left margin to stay within background
var startY = 80;
// Show seeds
Object.keys(seeds).forEach(function (seedType) {
if (seeds[seedType] > 0) {
var item = new InventoryItem(seedType, seeds[seedType], false);
item.x = startX + currentCol * itemSpacing;
item.y = startY;
self.addChild(item);
self.inventoryTexts.push(item);
currentCol++;
}
});
// Show harvested crops
Object.keys(inventory).forEach(function (cropType) {
if (inventory[cropType] > 0) {
var item = new InventoryItem(cropType, inventory[cropType], true);
item.x = startX + currentCol * itemSpacing;
item.y = startY;
self.addChild(item);
self.inventoryTexts.push(item);
currentCol++;
}
});
};
closeBtn.down = function (x, y, obj) {
self.visible = false;
isInventoryOpen = false;
};
return self;
});
var Minion = Container.expand(function () {
var self = Container.call(this);
// Create minion visual using character asset
var minionGraphics = self.attachAsset('character', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 1.2,
scaleY: 1.2
});
self.targetPlot = null;
self.isMoving = false;
self.harvestTimer = 0;
// Find next ready crop to harvest
self.findNextTarget = function () {
var readyPlots = farmPlots.filter(function (plot) {
return plot.isReady;
});
if (readyPlots.length > 0) {
// Find closest ready plot
var closestPlot = readyPlots[0];
var minDistance = Math.abs(self.x - closestPlot.x) + Math.abs(self.y - closestPlot.y);
readyPlots.forEach(function (plot) {
var distance = Math.abs(self.x - plot.x) + Math.abs(self.y - plot.y);
if (distance < minDistance) {
minDistance = distance;
closestPlot = plot;
}
});
return closestPlot;
}
return null;
};
// Move to target plot
self.moveToPlot = function (plot) {
if (self.isMoving || !plot) return;
self.isMoving = true;
self.targetPlot = plot;
// Calculate movement duration based on distance
var distance = Math.sqrt(Math.pow(plot.x - self.x, 2) + Math.pow(plot.y - self.y, 2));
var duration = Math.max(500, distance * 2); // Minimum 0.5 seconds
// Animate movement to plot
tween(self, {
x: plot.x,
y: plot.y
}, {
duration: duration,
easing: tween.easeInOut,
onFinish: function onFinish() {
self.isMoving = false;
self.harvestCrop();
}
});
// Add walking animation - slight bouncing
tween(minionGraphics, {
scaleY: 1.4
}, {
duration: 200,
easing: tween.easeInOut
});
tween(minionGraphics, {
scaleY: 1.2
}, {
duration: 200,
easing: tween.easeInOut
});
};
// Harvest crop at current location
self.harvestCrop = function () {
if (self.targetPlot && self.targetPlot.isReady) {
var harvest = self.targetPlot.harvestCrop();
if (harvest) {
// Add to inventory
if (!inventory[harvest.type]) {
inventory[harvest.type] = 0;
}
inventory[harvest.type]++;
// Show harvested crop above minion's head
var harvestedCropDisplay = self.addChild(LK.getAsset(harvest.type, {
anchorX: 0.5,
anchorY: 0.5,
x: 0,
y: -80,
scaleX: 0.8,
scaleY: 0.8
}));
// Animate the harvested crop display
tween(harvestedCropDisplay, {
y: -120,
alpha: 0.7
}, {
duration: 800,
easing: tween.easeOut
});
tween(harvestedCropDisplay, {
alpha: 0
}, {
duration: 1200,
easing: tween.easeInOut,
onFinish: function onFinish() {
harvestedCropDisplay.destroy();
}
});
// Add harvest animation - flash green
tween(minionGraphics, {
tint: 0x00ff00
}, {
duration: 300,
easing: tween.easeInOut
});
tween(minionGraphics, {
tint: 0xffffff
}, {
duration: 300,
easing: tween.easeInOut
});
updateUI();
}
}
self.targetPlot = null;
};
// Wander around the farm when there's nothing to harvest
self.wanderAround = function () {
if (self.isMoving || farmPlots.length === 0) return;
// Pick a random farm plot to visit
var randomIndex = Math.floor(Math.random() * farmPlots.length);
var randomPlot = farmPlots[randomIndex];
if (randomPlot) {
self.isMoving = true;
// Calculate movement duration based on distance
var distance = Math.sqrt(Math.pow(randomPlot.x - self.x, 2) + Math.pow(randomPlot.y - self.y, 2));
var duration = Math.max(1000, distance * 3); // Slower wandering movement
// Animate movement to random plot
tween(self, {
x: randomPlot.x,
y: randomPlot.y
}, {
duration: duration,
easing: tween.easeInOut,
onFinish: function onFinish() {
self.isMoving = false;
}
});
// Add walking animation - slight bouncing
tween(minionGraphics, {
scaleY: 1.4
}, {
duration: 200,
easing: tween.easeInOut
});
tween(minionGraphics, {
scaleY: 1.2
}, {
duration: 200,
easing: tween.easeInOut
});
}
};
self.update = function () {
// Only act if not currently moving
if (!self.isMoving) {
self.harvestTimer++;
// Look for crops to harvest every 60 ticks (1 second)
if (self.harvestTimer >= 60) {
self.harvestTimer = 0;
var nextTarget = self.findNextTarget();
if (nextTarget) {
self.moveToPlot(nextTarget);
} else {
// No crops to harvest, wander around
self.wanderAround();
}
}
}
};
return self;
});
var SellPanel = Container.expand(function () {
var self = Container.call(this);
// Create rounded horizontal background
var panelBg = LK.getAsset('shopPanel', {
anchorX: 0.5,
anchorY: 0.5
});
// Make corners rounded by scaling height and applying visual rounding effect
panelBg.scale.set(1.5, 0.6); // Make it wider and more horizontal like inventory panel
self.addChild(panelBg);
var titleText = new Text2('VENDER CULTIVOS', {
size: 50,
fill: 0x000000
});
titleText.anchor.set(0.5, 0.5);
titleText.x = 0;
titleText.y = -200;
self.addChild(titleText);
var closeBtn = self.addChild(LK.getAsset('closeButton', {
anchorX: 0.5,
anchorY: 0.5,
x: 800,
y: -250
}));
var closeBtnText = new Text2('X', {
size: 30,
fill: 0xFFFFFF
});
closeBtnText.anchor.set(0.5, 0.5);
closeBtn.addChild(closeBtnText);
// Switch to buy panel button
var buyPanelBtn = self.addChild(LK.getAsset('buyButton', {
anchorX: 0.5,
anchorY: 0.5,
x: -700,
y: 200
}));
var buyPanelBtnText = new Text2('COMPRAR', {
size: 30,
fill: 0xFFFFFF
});
buyPanelBtnText.anchor.set(0.5, 0.5);
buyPanelBtn.addChild(buyPanelBtnText);
// Sell all button
var sellAllBtn = self.addChild(LK.getAsset('sellAllButton', {
anchorX: 0.5,
anchorY: 0.5,
x: 700,
y: 200
}));
var sellAllBtnText = new Text2('VENDER TODO', {
size: 35,
fill: 0xFFFFFF
});
sellAllBtnText.anchor.set(0.5, 0.5);
sellAllBtn.addChild(sellAllBtnText);
// Initialize sell texts array
self.sellTexts = [];
self.updateSellSection = function () {
// Clear existing sell items
self.sellTexts.forEach(function (item) {
item.destroy();
});
self.sellTexts = [];
// Create grid layout for sell items
var itemsPerRow = 4;
var itemSpacing = 180;
var currentRow = 0;
var currentCol = 0;
var startX = -300;
var startY = 80;
// Show harvested crops for selling
Object.keys(inventory).forEach(function (cropType) {
if (inventory[cropType] > 0) {
var sellPrice = Math.floor(cropData[cropType].value * 0.8); // 80% of original value
var sellItem = new ShopItem(cropType, sellPrice, true, inventory[cropType]);
sellItem.x = -400 + currentCol * 400;
sellItem.y = startY + currentRow * 200;
self.addChild(sellItem);
self.sellTexts.push(sellItem);
sellItem.button.down = function (x, y, obj) {
if (inventory[cropType] > 0) {
inventory[cropType]--;
coins += sellPrice;
// Animate coin icon when selling crop
animateCoins(true);
LK.getSound('purchase').play();
updateUI();
self.updateSellSection();
}
};
currentCol++;
if (currentCol >= itemsPerRow) {
currentCol = 0;
currentRow++;
}
}
});
};
sellAllBtn.down = function (x, y, obj) {
var totalEarnings = 0;
Object.keys(inventory).forEach(function (cropType) {
if (inventory[cropType] > 0) {
var sellPrice = Math.floor(cropData[cropType].value * 0.8);
totalEarnings += sellPrice * inventory[cropType];
inventory[cropType] = 0;
}
});
if (totalEarnings > 0) {
coins += totalEarnings;
// Animate coin icon when selling all crops
animateCoins(true);
LK.getSound('purchase').play();
updateUI();
self.updateSellSection();
}
};
buyPanelBtn.down = function (x, y, obj) {
self.visible = false;
buyPanel.visible = true;
};
closeBtn.down = function (x, y, obj) {
self.visible = false;
isSellPanelOpen = false;
};
return self;
});
var ShopItem = Container.expand(function (itemType, price, isSellItem, count) {
var self = Container.call(this);
// Background slot
var slotBg = self.attachAsset('hotbarSlot', {
anchorX: 0.5,
anchorY: 0.5
});
// Item icon
var itemIcon = self.addChild(LK.getAsset(itemType, {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.8,
scaleY: 0.8
}));
// Price text - larger and positioned above item
var priceText = new Text2(price + ' monedas', {
size: 40,
fill: 0x000000
});
priceText.anchor.set(0.5, 0.5);
priceText.x = 0;
priceText.y = -110;
self.addChild(priceText);
// Count text (for sell items)
if (isSellItem && count > 0) {
self.countText = new Text2('x' + count, {
size: 20,
fill: 0xFFFFFF
});
self.countText.anchor.set(0.5, 0.5);
self.countText.x = 0;
self.countText.y = -40;
self.addChild(self.countText);
}
// Button
var buttonAsset = isSellItem ? 'sellButton' : 'buyButton';
var button = self.addChild(LK.getAsset(buttonAsset, {
anchorX: 0.5,
anchorY: 0.5,
x: 0,
y: 120
}));
var buttonText = new Text2(isSellItem ? 'VENDER' : 'COMPRAR', {
size: 20,
fill: 0xFFFFFF
});
buttonText.anchor.set(0.5, 0.5);
button.addChild(buttonText);
self.button = button;
self.itemType = itemType;
self.price = price;
self.isSellItem = isSellItem;
self.updateCount = function (newCount) {
if (self.countText) {
self.countText.setText('x' + newCount);
}
self.alpha = newCount > 0 ? 1.0 : 0.3;
};
return self;
});
var UpgradesPanel = Container.expand(function () {
var self = Container.call(this);
// Create rounded horizontal background
var panelBg = LK.getAsset('upgradesPanel', {
anchorX: 0.5,
anchorY: 0.5
});
// Make corners rounded by scaling height and applying visual rounding effect
panelBg.scale.set(1.5, 0.6); // Make it wider and more horizontal like inventory panel
self.addChild(panelBg);
var titleText = new Text2('MEJORAS', {
size: 50,
fill: 0x000000
});
titleText.anchor.set(0.5, 0.5);
titleText.x = 0;
titleText.y = -200;
self.addChild(titleText);
var closeBtn = self.addChild(LK.getAsset('closeButton', {
anchorX: 0.5,
anchorY: 0.5,
x: 800,
y: -250
}));
var closeBtnText = new Text2('X', {
size: 40,
fill: 0xFFFFFF
});
closeBtnText.anchor.set(0.5, 0.5);
closeBtn.addChild(closeBtnText);
// More Plots Upgrade
var plotUpgradeContainer = new Container();
plotUpgradeContainer.x = -400; // Left side positioning within smaller background
plotUpgradeContainer.y = 0; // Center vertically in smaller background
self.addChild(plotUpgradeContainer);
var plotIcon = plotUpgradeContainer.addChild(LK.getAsset('farmPlot', {
anchorX: 0.5,
anchorY: 0.5
}));
var plotTitle = new Text2('MÁS PARCELAS', {
size: 35,
fill: 0x000000
});
plotTitle.anchor.set(0.5, 0.5);
plotTitle.x = 0;
plotTitle.y = 80;
plotUpgradeContainer.addChild(plotTitle);
var plotPrice = new Text2('100 monedas', {
size: 40,
fill: 0x000000
});
plotPrice.anchor.set(0.5, 0.5);
plotPrice.x = 0;
plotPrice.y = -80;
plotUpgradeContainer.addChild(plotPrice);
var plotBtn = plotUpgradeContainer.addChild(LK.getAsset('buyButton', {
anchorX: 0.5,
anchorY: 0.5,
x: 0,
y: 130
}));
var plotBtnText = new Text2('COMPRAR', {
size: 20,
fill: 0xFFFFFF
});
plotBtnText.anchor.set(0.5, 0.5);
plotBtn.addChild(plotBtnText);
// Speed Upgrade
var speedUpgradeContainer = new Container();
speedUpgradeContainer.x = 0; // Keep centered
speedUpgradeContainer.y = 0; // Center vertically in smaller background
self.addChild(speedUpgradeContainer);
var speedIcon = speedUpgradeContainer.addChild(LK.getAsset('seedling', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 2,
scaleY: 2
}));
var speedTitle = new Text2('ACELERAR CULTIVOS', {
size: 30,
fill: 0x000000
});
speedTitle.anchor.set(0.5, 0.5);
speedTitle.x = 0;
speedTitle.y = 80;
speedUpgradeContainer.addChild(speedTitle);
var speedPrice = new Text2('50 monedas', {
size: 40,
fill: 0x000000
});
speedPrice.anchor.set(0.5, 0.5);
speedPrice.x = 0;
speedPrice.y = -80;
speedUpgradeContainer.addChild(speedPrice);
var speedBtn = speedUpgradeContainer.addChild(LK.getAsset('buyButton', {
anchorX: 0.5,
anchorY: 0.5,
x: 0,
y: 130
}));
var speedBtnText = new Text2('COMPRAR', {
size: 20,
fill: 0xFFFFFF
});
speedBtnText.anchor.set(0.5, 0.5);
speedBtn.addChild(speedBtnText);
// Companion Upgrade
var companionUpgradeContainer = new Container();
companionUpgradeContainer.x = 400; // Right side positioning within smaller background
companionUpgradeContainer.y = 0; // Center vertically in smaller background
self.addChild(companionUpgradeContainer);
var companionIcon = companionUpgradeContainer.addChild(LK.getAsset('character', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.8,
scaleY: 0.8
}));
var companionTitle = new Text2('COMPAÑERO', {
size: 35,
fill: 0x000000
});
companionTitle.anchor.set(0.5, 0.5);
companionTitle.x = 0;
companionTitle.y = 80;
companionUpgradeContainer.addChild(companionTitle);
var companionPrice = new Text2('800 monedas', {
size: 40,
fill: 0x000000
});
companionPrice.anchor.set(0.5, 0.5);
companionPrice.x = 0;
companionPrice.y = -80;
companionUpgradeContainer.addChild(companionPrice);
var companionBtn = companionUpgradeContainer.addChild(LK.getAsset('buyButton', {
anchorX: 0.5,
anchorY: 0.5,
x: 0,
y: 130
}));
var companionBtnText = new Text2('COMPRAR', {
size: 20,
fill: 0xFFFFFF
});
companionBtnText.anchor.set(0.5, 0.5);
companionBtn.addChild(companionBtnText);
// Button handlers
plotBtn.down = function (x, y, obj) {
if (coins >= 100 && totalPlots < 64) {
// Max 64 plots (4 grids of 4x4)
coins -= 100;
totalPlots++; // Add one plot at a time
repositionAllPlots(); // Recreate all plots with new layout
storage.totalPlots = totalPlots; // Save the new total
LK.getSound('purchase').play();
updateUI();
// Close upgrades panel after purchase
self.visible = false;
isUpgradesPanelOpen = false;
}
};
speedBtn.down = function (x, y, obj) {
if (coins >= 50) {
coins -= 50;
// Accelerate all growing crops
farmPlots.forEach(function (plot) {
if (!plot.isEmpty && !plot.isReady) {
plot.plantTime -= 150; // Reduce by 2.5 seconds
}
});
LK.getSound('purchase').play();
updateUI();
}
};
// Update companion button appearance based on current state
self.updateCompanionButton = function () {
if (hasCompanion) {
companionBtn.alpha = 0.5;
companionBtnText.setText('COMPRADO');
} else {
companionBtn.alpha = 1.0;
companionBtnText.setText('COMPRAR');
}
};
// Initialize companion button state
self.updateCompanionButton();
companionBtn.down = function (x, y, obj) {
if (coins >= 800 && !hasCompanion) {
coins -= 800;
hasCompanion = true;
self.updateCompanionButton();
LK.getSound('purchase').play();
updateUI();
// Create minion when companion is purchased
minion = new Minion();
minion.x = 1024; // Start at center
minion.y = 1200; // Above the farm plots
minion.zIndex = 100; // Render above plots but below UI
game.addChild(minion);
}
};
closeBtn.down = function (x, y, obj) {
self.visible = false;
isUpgradesPanelOpen = false;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x228B22
});
/****
* Game Code
****/
// Add background image
var backgroundImage = game.addChild(LK.getAsset('gameBackground', {
anchorX: 0,
anchorY: 0,
x: 0,
y: 0
}));
backgroundImage.zIndex = -2000; // Ensure it's behind everything
// Game data
var cropData = {
'crop1': {
name: 'Lechuga',
growthTime: 300,
value: 8
},
// 5 seconds
'crop2': {
name: 'Tomate',
growthTime: 600,
value: 18
},
// 10 seconds
'crop3': {
name: 'Maíz',
growthTime: 900,
value: 35
} // 15 seconds
};
// Clear saved data and reset to initial state
storage.coins = 50;
storage.seeds = {
'crop1': 5,
'crop2': 0,
'crop3': 0
};
storage.inventory = {};
storage.hasCompanion = false;
storage.totalPlots = 16;
// Game state - reset to beginning values
var coins = 900;
var seeds = {
'crop1': 5,
'crop2': 0,
'crop3': 0
};
var inventory = {};
var selectedSeed = 'crop1';
var isBuyPanelOpen = false;
var isSellPanelOpen = false;
var isInventoryOpen = false;
var isUpgradesPanelOpen = false;
var hasCompanion = false;
var companionTimer = 0;
var minion = null;
// No minion at start since companion is not purchased
// UI elements
var coinsContainer = new Container();
coinsContainer.x = 1700;
coinsContainer.y = 2500;
coinsContainer.zIndex = 400;
game.addChild(coinsContainer);
// Add black border rectangle behind coins background
var coinsBorder = coinsContainer.addChild(LK.getAsset('fullScreenOverlay', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.22,
scaleY: 0.068,
x: 90,
y: 60
}));
coinsBorder.alpha = 1.0;
coinsBorder.zIndex = -2;
// Add background rectangle with low opacity behind coins display
var coinsBackground = coinsContainer.addChild(LK.getAsset('fullScreenOverlay', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.2,
scaleY: 0.06,
x: 90,
y: 60
}));
// Round the corners using tween for visual effect
tween(coinsBackground, {
scaleX: 0.21,
scaleY: 0.061
}, {
duration: 100,
easing: tween.easeInOut
});
tween(coinsBackground, {
scaleX: 0.2,
scaleY: 0.06
}, {
duration: 100,
easing: tween.easeInOut
});
coinsBackground.alpha = 0.3;
coinsBackground.zIndex = -1;
var coinIcon = coinsContainer.addChild(LK.getAsset('coinIcon', {
anchorX: 0.5,
anchorY: 0.5,
x: 220,
y: 60
}));
// Make coinIcon globally accessible for animations
window.coinIcon = coinIcon;
var coinsText = new Text2(coins.toString(), {
size: 120,
fill: 0xFFD700,
fontStyle: 'bold',
dropShadow: true,
dropShadowColor: 0x000000,
dropShadowBlur: 4,
dropShadowDistance: 3,
stroke: 0x000000,
strokeThickness: 8
});
coinsText.anchor.set(0.5, 0);
coinsText.x = 20;
coinsText.y = -10;
coinsContainer.addChild(coinsText);
// Create horizontal tabs container positioned above coins
var tabsContainer = new Container();
tabsContainer.x = 1024;
tabsContainer.y = 2350; // Position above coins text
tabsContainer.zIndex = 500; // Ensure tabs render above coins
game.addChild(tabsContainer);
// Shop button
var shopBtn = LK.getAsset('shopButton', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 1.2,
scaleY: 1.2
});
var shopBtnText = new Text2('TIENDA', {
size: 35,
fill: 0xFFFFFF
});
shopBtnText.anchor.set(0.5, 0.5);
shopBtn.addChild(shopBtnText);
shopBtn.x = -300;
shopBtn.y = 0;
tabsContainer.addChild(shopBtn);
// Inventory button
var invBtn = LK.getAsset('inventoryButton', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 1.2,
scaleY: 1.2
});
var invBtnText = new Text2('INVENTARIO', {
size: 30,
fill: 0xFFFFFF
});
invBtnText.anchor.set(0.5, 0.5);
invBtn.addChild(invBtnText);
invBtn.x = 0;
invBtn.y = 0;
tabsContainer.addChild(invBtn);
// Upgrades button
var upgradesBtn = LK.getAsset('upgradesButton', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 1.2,
scaleY: 1.2
});
var upgradesBtnText = new Text2('MEJORAS', {
size: 30,
fill: 0xFFFFFF
});
upgradesBtnText.anchor.set(0.5, 0.5);
upgradesBtn.addChild(upgradesBtnText);
upgradesBtn.x = 300;
upgradesBtn.y = 0;
tabsContainer.addChild(upgradesBtn);
// Create farm plots in 4x4 grid
var farmPlots = [];
var totalPlots = 16; // Start with 16 plots (4x4)
var plotSpacingX = 140;
var plotSpacingY = 100;
var plotMargin = 30; // Margin between plot groups
// Calculate center position for the main 4x4 grid
var mainGridCenterX = 1024; // Center of screen
var mainGridCenterY = 900; // Positioned to avoid UI overlap
// Calculate starting position for centered 4x4 grid
var mainStartX = mainGridCenterX - 3 * plotSpacingX / 2;
var mainStartY = mainGridCenterY - 3 * plotSpacingY / 2;
function createPlotAtPosition(x, y) {
var plot = new FarmPlot();
plot.x = x;
plot.y = y;
game.addChild(plot);
farmPlots.push(plot);
}
function repositionAllPlots() {
// Clear existing plots
farmPlots.forEach(function (plot) {
plot.destroy();
});
farmPlots = [];
var plotsCreated = 0;
// Main 4x4 grid (center)
for (var row = 0; row < 4 && plotsCreated < totalPlots; row++) {
for (var col = 0; col < 4 && plotsCreated < totalPlots; col++) {
createPlotAtPosition(mainStartX + col * plotSpacingX, mainStartY + row * plotSpacingY);
plotsCreated++;
}
}
// Right 4x4 grid (if more than 16 plots)
if (totalPlots > 16) {
var rightStartX = mainStartX + 4 * plotSpacingX + plotMargin;
var rightStartY = mainStartY;
for (var row = 0; row < 4 && plotsCreated < totalPlots; row++) {
for (var col = 0; col < 4 && plotsCreated < totalPlots; col++) {
createPlotAtPosition(rightStartX + col * plotSpacingX, rightStartY + row * plotSpacingY);
plotsCreated++;
}
}
}
// Bottom-left 4x4 grid (if more than 32 plots)
if (totalPlots > 32) {
var bottomLeftStartX = mainStartX;
var bottomLeftStartY = mainStartY + 4 * plotSpacingY + plotMargin;
for (var row = 0; row < 4 && plotsCreated < totalPlots; row++) {
for (var col = 0; col < 4 && plotsCreated < totalPlots; col++) {
createPlotAtPosition(bottomLeftStartX + col * plotSpacingX, bottomLeftStartY + row * plotSpacingY);
plotsCreated++;
}
}
}
// Bottom-right 4x4 grid (if more than 48 plots)
if (totalPlots > 48) {
var bottomRightStartX = mainStartX + 4 * plotSpacingX + plotMargin;
var bottomRightStartY = mainStartY + 4 * plotSpacingY + plotMargin;
for (var row = 0; row < 4 && plotsCreated < totalPlots; row++) {
for (var col = 0; col < 4 && plotsCreated < totalPlots; col++) {
createPlotAtPosition(bottomRightStartX + col * plotSpacingX, bottomRightStartY + row * plotSpacingY);
plotsCreated++;
}
}
}
// Ensure all farm plots render below interface panels
farmPlots.forEach(function (plot) {
plot.zIndex = -1000;
});
}
// Initialize farm plots
repositionAllPlots();
// Buy and sell panels - positioned as horizontal scroll above coins
var buyPanel = new BuyPanel();
buyPanel.x = 1024;
buyPanel.y = 1800;
buyPanel.visible = false;
buyPanel.zIndex = 600;
game.addChild(buyPanel);
var sellPanel = new SellPanel();
sellPanel.x = 1024;
sellPanel.y = 1800;
sellPanel.visible = false;
sellPanel.zIndex = 600;
game.addChild(sellPanel);
var inventoryPanel = new InventoryPanel();
inventoryPanel.x = 1024;
inventoryPanel.y = 1800;
inventoryPanel.visible = false;
inventoryPanel.zIndex = 600;
game.addChild(inventoryPanel);
var upgradesPanel = new UpgradesPanel();
upgradesPanel.x = 1024;
upgradesPanel.y = 1800;
upgradesPanel.visible = false;
upgradesPanel.zIndex = 600;
game.addChild(upgradesPanel);
// Button event handlers
shopBtn.down = function (x, y, obj) {
if (!isInventoryOpen && !isSellPanelOpen && !isUpgradesPanelOpen) {
buyPanel.visible = true;
isBuyPanelOpen = true;
}
};
invBtn.down = function (x, y, obj) {
if (!isBuyPanelOpen && !isSellPanelOpen && !isUpgradesPanelOpen) {
inventoryPanel.visible = true;
inventoryPanel.updateInventory();
isInventoryOpen = true;
}
};
upgradesBtn.down = function (x, y, obj) {
if (!isBuyPanelOpen && !isSellPanelOpen && !isInventoryOpen) {
upgradesPanel.visible = true;
isUpgradesPanelOpen = true;
}
};
// Create hotbar
var hotbarSlots = [];
var hotbarContainer = new Container();
hotbarContainer.x = 1024;
hotbarContainer.y = 2600;
hotbarContainer.zIndex = 400;
game.addChild(hotbarContainer);
// Create hotbar slots for each seed type
var seedTypes = ['crop1', 'crop2', 'crop3'];
seedTypes.forEach(function (seedType, index) {
var slot = new HotbarSlot(seedType, index);
slot.x = (index - 1) * 180;
slot.y = 0;
hotbarContainer.addChild(slot);
hotbarSlots.push(slot);
});
function updateHotbar() {
hotbarSlots.forEach(function (slot) {
var count = seeds[slot.seedType] || 0;
slot.updateCount(count);
slot.setSelected(slot.seedType === selectedSeed);
});
}
// Initialize hotbar
updateHotbar();
// Remove old seed selection behavior - hotbar handles it now
game.down = function (x, y, obj) {
// Hotbar slots handle their own clicks now
};
var lastCoins = coins; // Track last coins value for animation detection
function animateCoins(increase) {
if (increase) {
// Animate for coin increase (green pulse and scale up)
tween(window.coinIcon, {
scaleX: 1.3,
scaleY: 1.3,
tint: 0x00ff00
}, {
duration: 200,
easing: tween.easeOut
});
tween(window.coinIcon, {
scaleX: 1.0,
scaleY: 1.0,
tint: 0xffffff
}, {
duration: 300,
easing: tween.easeInOut
});
} else {
// Animate for coin decrease (red pulse and slight shrink)
tween(window.coinIcon, {
scaleX: 0.8,
scaleY: 0.8,
tint: 0xff0000
}, {
duration: 200,
easing: tween.easeOut
});
tween(window.coinIcon, {
scaleX: 1.0,
scaleY: 1.0,
tint: 0xffffff
}, {
duration: 300,
easing: tween.easeInOut
});
}
}
function updateUI() {
// Store current text before updating
var currentText = coinsText.text;
var newText = coins.toString();
// Update the coins text
coinsText.setText(newText);
updateHotbar();
// Check if the displayed text actually changed and animate accordingly
if (currentText !== newText) {
if (coins > lastCoins) {
animateCoins(true); // Coins increased
} else if (coins < lastCoins) {
animateCoins(false); // Coins decreased
}
}
lastCoins = coins; // Update last coins value
// Save progress
storage.coins = coins;
storage.seeds = seeds;
storage.inventory = inventory;
storage.hasCompanion = hasCompanion;
}
game.update = function () {
// Update all farm plots
farmPlots.forEach(function (plot) {
// Plot update is called automatically
});
// Minion handles harvesting automatically through its own update method
}; ===================================================================
--- original.js
+++ change.js
@@ -1038,8 +1038,19 @@
coinsContainer.x = 1700;
coinsContainer.y = 2500;
coinsContainer.zIndex = 400;
game.addChild(coinsContainer);
+// Add black border rectangle behind coins background
+var coinsBorder = coinsContainer.addChild(LK.getAsset('fullScreenOverlay', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: 0.22,
+ scaleY: 0.068,
+ x: 90,
+ y: 60
+}));
+coinsBorder.alpha = 1.0;
+coinsBorder.zIndex = -2;
// Add background rectangle with low opacity behind coins display
var coinsBackground = coinsContainer.addChild(LK.getAsset('fullScreenOverlay', {
anchorX: 0.5,
anchorY: 0.5,
buy button. In-Game asset. 2d. High contrast. No shadows
inventory button. In-Game asset. 2d. High contrast. No shadows
shop button. In-Game asset. 2d. High contrast. No shadows
X button. In-Game asset. 2d. High contrast. No shadows
dirt. In-Game asset. 2d. High contrast. No shadows
lechuga. In-Game asset. 2d. High contrast. No shadows
tomate. In-Game asset. 2d. High contrast. No shadows
semilla. In-Game asset. 2d. High contrast. No shadows
sell button. In-Game asset. 2d. High contrast. No shadows
maiz. In-Game asset. 2d. High contrast. No shadows
sell all button. In-Game asset. 2d. High contrast. No shadows
upgrade button. In-Game asset. 2d. High contrast. No shadows
Hotbar slot. In-Game asset. 2d. High contrast. No shadows
Quita el cesped de abajo
Flying minion flower. In-Game asset. 2d. High contrast. No shadows
Aspersor. In-Game asset. 2d. High contrast. No shadows
Que sea verde y hectagonal
Arbol de habilidades botón. In-Game asset. 2d. High contrast. No shadows
calabaza. In-Game asset. 2d. High contrast. No shadows
sandia entera
planta uva. In-Game asset. 2d. High contrast. No shadows
trufa. In-Game asset. 2d. High contrast. No shadows
orquidea. In-Game asset. 2d. High contrast. No shadows