Code edit (2 edits merged)
Please save this source code
User prompt
change item label color to red
Code edit (14 edits merged)
Please save this source code
User prompt
change item label text color to orange
User prompt
change item label text color to black
Code edit (2 edits merged)
Please save this source code
User prompt
Add border to inventory slot
Code edit (1 edits merged)
Please save this source code
User prompt
increase inventory slot size
Code edit (3 edits merged)
Please save this source code
User prompt
add margin to inventory
Code edit (10 edits merged)
Please save this source code
User prompt
add margin to inventory slot
User prompt
add margin to InventorySlot
Code edit (4 edits merged)
Please save this source code
User prompt
add margin to InventorySlot
Code edit (1 edits merged)
Please save this source code
Code edit (1 edits merged)
Please save this source code
Code edit (22 edits merged)
Please save this source code
User prompt
Please fix the bug: 'InternalError: too much recursion' in or related to this line: 'originalUpdate.call(this);' Line Number: 592
Code edit (1 edits merged)
Please save this source code
Code edit (1 edits merged)
Please save this source code
User prompt
seedIcon not select-able
Code edit (1 edits merged)
Please save this source code
User prompt
Farm Survival: Harvest or Perish
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1", {
highestDay: 1,
totalHarvests: 0
});
/****
* Classes
****/
var InventorySlot = Container.expand(function () {
var self = Container.call(this);
self.item = null;
self.quantity = 0;
self.selected = false;
var background = self.attachAsset('inventorySlot', {
anchorX: 0.5,
anchorY: 0.5
});
self.icon = null;
self.itemLabel = new Text2('', {
size: 24,
fill: 0xFFFFFF
});
self.itemLabel.anchor.set(0.5, 0);
self.itemLabel.y = 30;
self.addChild(self.itemLabel);
self.quantityLabel = new Text2('0', {
size: 24,
fill: 0xFFFFFF
});
self.quantityLabel.anchor.set(1, 1);
self.quantityLabel.x = 40;
self.quantityLabel.y = 40;
self.addChild(self.quantityLabel);
self.setItem = function (itemType, amount) {
self.item = itemType;
self.quantity = amount;
// Remove previous icon if exists
if (self.icon) {
self.removeChild(self.icon);
self.icon = null;
}
// Create new icon
if (itemType) {
var iconAssetId = '';
if (itemType === 'wheatSeed' || itemType === 'cornSeed' || itemType === 'potatoSeed') {
iconAssetId = 'seedIcon';
} else if (itemType === 'water') {
iconAssetId = 'waterIcon';
} else if (itemType === 'fertilizer') {
iconAssetId = 'fertilizerIcon';
} else if (itemType === 'wheat' || itemType === 'corn' || itemType === 'potato') {
iconAssetId = 'foodIcon';
}
if (iconAssetId) {
self.icon = LK.getAsset(iconAssetId, {
anchorX: 0.5,
anchorY: 0.5
});
// Set icon tint based on item type
if (itemType === 'wheatSeed') {
self.icon.tint = 0xFFD700; // Gold
} else if (itemType === 'cornSeed') {
self.icon.tint = 0xFFFF00; // Yellow
} else if (itemType === 'potatoSeed') {
self.icon.tint = 0xCD853F; // Peru
} else if (itemType === 'wheat') {
self.icon.tint = 0xDAA520; // Golden rod
} else if (itemType === 'corn') {
self.icon.tint = 0xF0E68C; // Khaki
} else if (itemType === 'potato') {
self.icon.tint = 0xD2B48C; // Tan
}
self.addChild(self.icon);
}
}
// Update labels
self.itemLabel.setText(itemType ? itemType : '');
self.quantityLabel.setText(amount > 0 ? amount.toString() : '');
};
self.addItems = function (amount) {
if (self.item) {
self.quantity += amount;
self.quantityLabel.setText(self.quantity.toString());
return true;
}
return false;
};
self.removeItems = function (amount) {
if (self.item && self.quantity >= amount) {
self.quantity -= amount;
self.quantityLabel.setText(self.quantity > 0 ? self.quantity.toString() : '');
if (self.quantity <= 0) {
self.setItem(null, 0);
}
return true;
}
return false;
};
self.select = function () {
self.selected = true;
background.tint = 0xAAAAAA;
};
self.deselect = function () {
self.selected = false;
background.tint = 0xFFFFFF;
};
self.down = function (x, y, obj) {
if (game && !self.selected && self.item && self.quantity > 0) {
// Deselect any previously selected slot
if (selectedInventorySlot) {
selectedInventorySlot.deselect();
}
// Select this slot
selectedInventorySlot = self;
self.select();
}
};
return self;
});
var Plot = Container.expand(function () {
var self = Container.call(this);
self.planted = false;
self.growthStage = 0;
self.growthTime = 0;
self.maxGrowthTime = 300; // 5 seconds at 60 FPS
self.cropType = null;
var dirtGraphics = self.attachAsset('dirt', {
anchorX: 0.5,
anchorY: 0.5
});
self.seedling = self.attachAsset('seedling', {
anchorX: 0.5,
anchorY: 0.5,
visible: false
});
self.crop = self.attachAsset('crop', {
anchorX: 0.5,
anchorY: 0.5,
visible: false
});
self.plant = function (cropType) {
if (!self.planted) {
self.planted = true;
self.growthStage = 0;
self.growthTime = 0;
self.cropType = cropType;
self.seedling.visible = true;
self.crop.visible = false;
// Change seedling color based on crop type
if (cropType === 'wheat') {
self.seedling.tint = 0x00FF00; // Green
self.crop.tint = 0xFFD700; // Gold
self.maxGrowthTime = 300; // 5 seconds
} else if (cropType === 'corn') {
self.seedling.tint = 0x32CD32; // Lime Green
self.crop.tint = 0xFFFF00; // Yellow
self.maxGrowthTime = 420; // 7 seconds
} else if (cropType === 'potato') {
self.seedling.tint = 0x556B2F; // Dark Olive Green
self.crop.tint = 0xCD853F; // Peru
self.maxGrowthTime = 240; // 4 seconds
}
LK.getSound('plantSound').play();
return true;
}
return false;
};
self.harvest = function () {
if (self.planted && self.growthStage === 2) {
LK.getSound('harvestSound').play();
var harvestYield = {
type: self.cropType,
quantity: 1
};
// Reset plot state
self.planted = false;
self.growthStage = 0;
self.growthTime = 0;
self.cropType = null;
self.seedling.visible = false;
self.crop.visible = false;
return harvestYield;
}
return null;
};
self.update = function () {
if (self.planted) {
self.growthTime++;
// Handle growth stages
if (self.growthTime >= self.maxGrowthTime && self.growthStage < 2) {
self.growthStage = 2; // Fully grown
self.seedling.visible = false;
self.crop.visible = true;
} else if (self.growthTime >= self.maxGrowthTime / 2 && self.growthStage < 1) {
self.growthStage = 1; // Middle stage
self.seedling.scale.set(1.3, 1.3);
}
}
};
self.down = function (x, y, obj) {
// Will be handled by game's plot interaction logic
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x5DA130 // Green background for farm theme
});
/****
* Game Code
****/
// Game state
var gameDay = 1;
var energy = 100;
var maxEnergy = 100;
var weatherCondition = 'sunny'; // sunny, cloudy, rainy, stormy
var weatherEffects = {
'sunny': {
growthMultiplier: 1.2,
energyDrain: 1.0
},
'cloudy': {
growthMultiplier: 1.0,
energyDrain: 0.8
},
'rainy': {
growthMultiplier: 1.5,
energyDrain: 1.2
},
'stormy': {
growthMultiplier: 0.7,
energyDrain: 1.5
}
};
var selectedInventorySlot = null;
var dayTimer = 0;
var dayLength = 3600; // 60 seconds at 60 FPS
var endOfDayTriggered = false;
// Create farm grid
var gridSize = 5;
var plotSize = 120;
var gridStartX = (2048 - gridSize * plotSize) / 2;
var gridStartY = 400;
var plots = [];
// Create plots
for (var row = 0; row < gridSize; row++) {
for (var col = 0; col < gridSize; col++) {
var plot = new Plot();
plot.x = gridStartX + col * plotSize;
plot.y = gridStartY + row * plotSize;
plot.gridX = col;
plot.gridY = row;
plots.push(plot);
game.addChild(plot);
}
}
// Create inventory system
var inventorySize = 8;
var inventorySlots = [];
var inventoryStartX = (2048 - inventorySize * 110) / 2;
var inventoryStartY = 2400;
// Create inventory slots
for (var i = 0; i < inventorySize; i++) {
var slot = new InventorySlot();
slot.x = inventoryStartX + i * 110;
slot.y = inventoryStartY;
slot.slotIndex = i;
inventorySlots.push(slot);
game.addChild(slot);
}
// Initialize inventory with starting items
inventorySlots[0].setItem('wheatSeed', 5);
inventorySlots[1].setItem('cornSeed', 3);
inventorySlots[2].setItem('potatoSeed', 2);
inventorySlots[3].setItem('water', 10);
inventorySlots[4].setItem('fertilizer', 2);
// Create UI elements
// Day counter
var dayCounter = new Text2('Day: 1', {
size: 50,
fill: 0xFFFFFF
});
dayCounter.anchor.set(0.5, 0.5);
var dayCounterBg = LK.getAsset('dayCounterBg', {
anchorX: 0.5,
anchorY: 0.5
});
dayCounterBg.x = 120;
dayCounterBg.y = 60;
dayCounter.x = 120;
dayCounter.y = 60;
game.addChild(dayCounterBg);
game.addChild(dayCounter);
// Weather indicator
var weatherIcon = LK.getAsset('weatherIndicator', {
anchorX: 0.5,
anchorY: 0.5
});
weatherIcon.x = 230;
weatherIcon.y = 60;
game.addChild(weatherIcon);
// Energy bar
var energyBarBg = LK.getAsset('energyBarBg', {
anchorX: 0,
anchorY: 0.5
});
energyBarBg.x = 300;
energyBarBg.y = 60;
game.addChild(energyBarBg);
var energyBarFill = LK.getAsset('energyBar', {
anchorX: 0,
anchorY: 0.5
});
energyBarFill.x = 300;
energyBarFill.y = 60;
game.addChild(energyBarFill);
var energyLabel = new Text2('Energy: 100/100', {
size: 30,
fill: 0xFFFFFF
});
energyLabel.anchor.set(0.5, 0.5);
energyLabel.x = 550;
energyLabel.y = 60;
game.addChild(energyLabel);
// Instructions
var instructionsText = new Text2('Select seeds from inventory and tap plots to plant. Harvest when crops are fully grown.', {
size: 30,
fill: 0xFFFFFF
});
instructionsText.anchor.set(0.5, 0);
instructionsText.x = 2048 / 2;
instructionsText.y = 150;
game.addChild(instructionsText);
// Stats display
var statsText = new Text2('Harvests: 0', {
size: 30,
fill: 0xFFFFFF
});
statsText.anchor.set(0.5, 0);
statsText.x = 2048 / 2;
statsText.y = 200;
game.addChild(statsText);
// Helper functions
function updateEnergyDisplay() {
energyBarFill.scale.x = energy / maxEnergy;
energyLabel.setText("Energy: ".concat(Math.floor(energy), "/").concat(maxEnergy));
}
function updateWeatherDisplay() {
if (weatherCondition === 'sunny') {
weatherIcon.tint = 0xFFFF00; // Yellow
} else if (weatherCondition === 'cloudy') {
weatherIcon.tint = 0xCCCCCC; // Gray
} else if (weatherCondition === 'rainy') {
weatherIcon.tint = 0x4682B4; // Steel Blue
} else if (weatherCondition === 'stormy') {
weatherIcon.tint = 0x191970; // Midnight Blue
}
}
function changeWeather() {
var weatherOptions = ['sunny', 'cloudy', 'rainy', 'stormy'];
var weights = [4, 3, 2, 1];
// Adjust weights based on day number (increase difficulty)
if (gameDay > 5) {
weights = [3, 3, 3, 2];
}
if (gameDay > 10) {
weights = [2, 3, 3, 3];
}
// Create weighted selection array
var selectionArray = [];
for (var i = 0; i < weatherOptions.length; i++) {
for (var j = 0; j < weights[i]; j++) {
selectionArray.push(weatherOptions[i]);
}
}
// Select random weather
var randomIndex = Math.floor(Math.random() * selectionArray.length);
weatherCondition = selectionArray[randomIndex];
LK.getSound('weatherChangeSound').play();
updateWeatherDisplay();
}
function startNewDay() {
gameDay++;
dayCounter.setText("Day: ".concat(gameDay));
energy = maxEnergy;
updateEnergyDisplay();
changeWeather();
dayTimer = 0;
endOfDayTriggered = false;
// Record highest day if applicable
if (gameDay > storage.highestDay) {
storage.highestDay = gameDay;
}
// Add some random seeds based on day progression
var seedChance = 0.5 + gameDay * 0.05;
if (Math.random() < seedChance) {
// Find empty slot
var emptySlot = inventorySlots.find(function (slot) {
return !slot.item;
});
if (emptySlot) {
var seedTypes = ['wheatSeed', 'cornSeed', 'potatoSeed'];
var randomSeed = seedTypes[Math.floor(Math.random() * seedTypes.length)];
var amount = 1 + Math.floor(Math.random() * Math.min(gameDay, 5));
emptySlot.setItem(randomSeed, amount);
}
}
// Add new challenge effects as days progress
if (gameDay > 3) {
// Reduce energy max slightly each day
maxEnergy = Math.max(50, 100 - (gameDay - 3) * 5);
energy = maxEnergy;
updateEnergyDisplay();
}
}
function endDay() {
// Check game over condition
var hasSeeds = inventorySlots.some(function (slot) {
return slot.item && (slot.item === 'wheatSeed' || slot.item === 'cornSeed' || slot.item === 'potatoSeed') && slot.quantity > 0;
});
var hasFood = inventorySlots.some(function (slot) {
return slot.item && (slot.item === 'wheat' || slot.item === 'corn' || slot.item === 'potato') && slot.quantity > 0;
});
var hasGrowingCrops = plots.some(function (plot) {
return plot.planted;
});
if (!hasSeeds && !hasFood && !hasGrowingCrops) {
// Game over - no way to continue
statsText.setText("Game Over! You survived ".concat(gameDay, " days. Total harvests: ").concat(storage.totalHarvests));
LK.showGameOver();
return;
}
// Consume food at end of day
var foodConsumed = false;
for (var _i = 0, _inventorySlots = inventorySlots; _i < _inventorySlots.length; _i++) {
var slot = _inventorySlots[_i];
if (slot.item === 'wheat' || slot.item === 'corn' || slot.item === 'potato') {
slot.removeItems(1);
foodConsumed = true;
break;
}
}
if (!foodConsumed) {
// Game over - no food to eat
statsText.setText("Game Over! You survived ".concat(gameDay, " days but starved. Total harvests: ").concat(storage.totalHarvests));
LK.showGameOver();
return;
}
// Start new day
startNewDay();
}
// Event handlers
game.down = function (x, y, obj) {
// Check if we tapped an inventory slot
for (var i = 0; i < inventorySlots.length; i++) {
var slot = inventorySlots[i];
if (slot.getBounds().contains(x, y)) {
// Deselect previous slot
if (selectedInventorySlot) {
selectedInventorySlot.deselect();
}
// Select new slot if it has items
if (slot.item && slot.quantity > 0) {
selectedInventorySlot = slot;
slot.select();
} else {
selectedInventorySlot = null;
}
return;
}
}
// Check if we tapped a plot
for (var j = 0; j < plots.length; j++) {
var plot = plots[j];
if (plot.getBounds().contains(x, y)) {
// If we have a selected inventory item
if (selectedInventorySlot && selectedInventorySlot.item) {
var item = selectedInventorySlot.item;
// Handle planting
if ((item === 'wheatSeed' || item === 'cornSeed' || item === 'potatoSeed') && !plot.planted) {
if (energy >= 10) {
var cropType = item.replace('Seed', '');
if (plot.plant(cropType)) {
selectedInventorySlot.removeItems(1);
energy -= 10;
updateEnergyDisplay();
}
}
}
// Handle harvesting
else if (plot.planted && plot.growthStage === 2) {
var harvestResult = plot.harvest();
if (harvestResult) {
// Find empty slot or matching crop slot
var targetSlot = inventorySlots.find(function (slot) {
return !slot.item || slot.item === harvestResult.type;
});
if (targetSlot) {
if (!targetSlot.item) {
targetSlot.setItem(harvestResult.type, harvestResult.quantity);
} else {
targetSlot.addItems(harvestResult.quantity);
}
energy -= 5;
updateEnergyDisplay();
// Update harvests counter
storage.totalHarvests++;
statsText.setText("Harvests: ".concat(storage.totalHarvests));
}
}
}
// Handle water
else if (item === 'water' && plot.planted) {
if (energy >= 5) {
selectedInventorySlot.removeItems(1);
plot.growthTime += 60; // Boost growth
energy -= 5;
updateEnergyDisplay();
}
}
// Handle fertilizer
else if (item === 'fertilizer' && plot.planted) {
if (energy >= 5) {
selectedInventorySlot.removeItems(1);
plot.growthTime += 120; // Bigger boost than water
energy -= 5;
updateEnergyDisplay();
}
}
// If selected slot is now empty, deselect it
if (selectedInventorySlot && selectedInventorySlot.quantity <= 0) {
selectedInventorySlot.deselect();
selectedInventorySlot = null;
}
}
return;
}
}
};
// Start playing music
LK.playMusic('farmMusic');
// Game update loop
game.update = function () {
// Update day timer
dayTimer++;
// Update energy decay based on weather
var weatherEffect = weatherEffects[weatherCondition];
energy -= 0.01 * weatherEffect.energyDrain;
energy = Math.max(0, energy);
updateEnergyDisplay();
// Check for end of day
if (dayTimer >= dayLength && !endOfDayTriggered) {
endOfDayTriggered = true;
endDay();
}
// Update all plots
for (var i = 0; i < plots.length; i++) {
// Apply weather growth multiplier
var originalUpdate = plots[i].update;
plots[i].update = function () {
if (this.planted) {
this.growthTime += weatherEffect.growthMultiplier - 1;
}
originalUpdate.call(this);
};
plots[i].update();
}
// Game over if energy reaches zero
if (energy <= 0) {
statsText.setText("Game Over! You ran out of energy on day ".concat(gameDay, ". Total harvests: ").concat(storage.totalHarvests));
LK.showGameOver();
}
}; ===================================================================
--- original.js
+++ change.js
@@ -108,9 +108,17 @@
self.selected = false;
background.tint = 0xFFFFFF;
};
self.down = function (x, y, obj) {
- // Selection handling will be done in game code
+ if (game && !self.selected && self.item && self.quantity > 0) {
+ // Deselect any previously selected slot
+ if (selectedInventorySlot) {
+ selectedInventorySlot.deselect();
+ }
+ // Select this slot
+ selectedInventorySlot = self;
+ self.select();
+ }
};
return self;
});
var Plot = Container.expand(function () {