User prompt
Hey, I want to change how item pickup works now: Current Behavior: Right now, I can collect an item by tapping on it. New Behavior I Want: I don't want to tap on the item anymore. Instead, the item should be automatically collected when the player gets close enough to it. What You Need to Do: 1. Define a pickup radius: Set a distance (for example: 50 pixels or 1 unit) as the pickup range. When the player is within this range of an item, it should be picked up automatically. 2. In the update loop: For each frame (or at regular intervals), check: Is the player within pickup distance of any item? If yes, collect the item.
User prompt
Please fix the bug: 'TypeError: isFinite is not a function' in or related to this line: 'if (isFinite(ratio)) {' Line Number: 127
User prompt
Please fix the bug: 'TypeError: isFinite is not a function' in or related to this line: 'if (window.isFinite ? window.isFinite(ratio) : isFinite(ratio)) {' Line Number: 127
User prompt
Please fix the bug: 'TypeError: isFinite is not a function' in or related to this line: 'if (isFinite(ratio) && ratio > 0 && ratio < 1) {' Line Number: 126
User prompt
When moving toward a target, if there's an item in the way: The character should stop at a safe distance, so its collider does not touch or enter the item's collider at all. In other words, the character should stop just outside the item's bounds.
User prompt
If the target position (the place I tapped) is inside or overlapping an item, the character should not try to move there. Find the closest non-colliding position around the item and move there instead. ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Allow item collection only by tapping on the item images . Not any wider area
User prompt
Allow item collection only by tapping on the image . Not any other area
User prompt
Allow item collection only by tapping on the image . Not any other area
User prompt
Hey, now I need you to create a character and implement movement logic for it. Here are the details: 1. Character Creation Add a player with the image "player". The character starts at a fixed/default position. 2. Tap-to-Move Behavior When I tap (or click) anywhere on the screen, the character should move toward that position. The movement should be smooth and at a constant speed. The character should stop when it reaches the destination. 3. Collision Rules The character should not pass through items that are already on the screen. There must be collision detection between the character and the items. If there's an item in the path, the character should stop (or later we can add pathfinding to walk around it, but for now just stop). 4. Additional Notes The items are already present in the scene — use them for collision checks. If needed, add colliders to the character and items. ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
When I touch an item to move it, it jumps to the bottom-right corner of the screen instead of staying under my finger. I can’t move it naturally — it doesn’t follow my finger’s position accurately. When dragging starts, you need to: 1. Store the offset between the touch position and the item’s position. Example: offset = item.position - touch.position 2. During dragging, update the item’s position using: item.position = touch.position + offset Or however it fits with the engine’s coordinate system.
User prompt
When dragging starts, you need to: 1. Store the offset between the touch position and the item’s position. Example: offset = item.position - touch.position 2. During dragging, update the item’s position using: item.position = touch.position + offset Or however it fits with the engine’s coordinate system.
User prompt
Please fix the bug: 'Uncaught TypeError: Cannot read properties of undefined (reading 'call')' in or related to this line: 'ResourceButton.prototype.down.call(btnRef, x, y, obj);' Line Number: 300
User prompt
Please fix the bug: 'Uncaught RangeError: Maximum call stack size exceeded' in or related to this line: 'btnRef._originalDown(x, y, obj);' Line Number: 293
User prompt
1. Use the existing "movement" image Use "movement as a button. Place it above the merchant button. 2. Add Toggle Functionality When the "movement" image is tapped: Toggle a variable like isMovementMode (true/false). If it’s true, items become draggable. If it’s false, items stop being draggable. 3. Enable Item Dragging In movement mode (isMovementMode == true): I can tap and drag any item on the screen. The item should follow my finger and stay where I release it. Only move actual game items, not UI elements like buttons. 4. Disable Dragging When isMovementMode == false, items should not respond to dragging at all. 5. Important Notes Make sure only one item can be dragged at a time. Don’t allow dragging items off-screen.
User prompt
Move the movement button to the left down corner
User prompt
Add the image "movement" To right up corner. When i tap movement, i should be able to move the items on the screen
User prompt
Please fix the bug: 'Cannot set properties of undefined (setting 'down')' in or related to this line: 'movementBtn.down = function (x, y, obj) {' Line Number: 409
User prompt
Add the image"movement" To the top of the merchant button. When i tap movement, i should be able to move the items on the screen
User prompt
Collect item when tapping is done. Not when it starts.
User prompt
There should be a gap between the amounts and item images on the merchant screen
User prompt
Add amount Demonstrator to the left of the item images on the merchant screen
User prompt
Items move to the right down corner when touched. Also doesn't start counting 30 secs. Fix these.
User prompt
I cant move items more than 1 time. Fix this. Also when i touch items they move randomly. Fix this too.
User prompt
Items get lost when i touch them. Fix this.
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1"); /**** * Classes ****/ // (InventoryPopup class removed) // ResourceButton: A button for collecting a resource with cooldown var ResourceButton = Container.expand(function () { var self = Container.call(this); // Properties to be set after creation: // self.resourceType (string) // self.iconId (string) // self.cooldown (ms) // self.onCollect (function) // State self.isCoolingDown = false; self.lastCollectTime = 0; // Button background removed (resourceBtnBg no longer used) // Icon // NOTE: Do not attach icon here, as iconId is not set yet. It will be attached after construction in Game Code. // Attach a placeholder (invisible) so children[1] exists for later replacement. var icon = self.attachAsset('cowIcon', { anchorX: 0.5, anchorY: 0.5, alpha: 0 // invisible placeholder }); icon.y = 0; // Cooldown overlay (semi-transparent) // Attach a placeholder (invisible) so children[2] exists for later replacement. var cooldownOverlay = self.attachAsset('cooldownOverlay', { anchorX: 0.5, anchorY: 0.5, alpha: 0 // invisible placeholder }); // Amount text (shows +1 when collected) var plusText = new Text2("+1", { size: 80, fill: 0xFFFFFF }); plusText.anchor.set(0.5, 0.5); plusText.alpha = 0; self.addChild(plusText); // Cooldown timer text var cdText = new Text2("", { size: 60, fill: 0xFFFFFF }); cdText.anchor.set(0.5, 0); // Place the cooldown text below the icon (icon is at y=0, icon is 2x scaled, so offset by icon height) cdText.y = 140; self.addChild(cdText); // Button press handler self.down = function (x, y, obj) { if (self.isCoolingDown) return; // Play cow sound if this is the cow button if (self.resourceType === "cow") { LK.getSound('Cow').play(); } // Play wheat sound if this is the wheat button if (self.resourceType === "wheat") { LK.getSound('Wheat').play(); } // Play ore sound if this is the ore button if (self.resourceType === "ore") { LK.getSound('Ore').play(); } // Play wood sound if this is the wood button if (self.resourceType === "wood") { LK.getSound('Wood').play(); } // Play fish sound if this is the fish button if (self.resourceType === "fish") { LK.getSound('Fish').play(); } self.startCooldown(); if (typeof self.onCollect === "function") self.onCollect(); // Animate +1 plusText.alpha = 1; plusText.y = -40; tween(plusText, { y: -120, alpha: 0 }, { duration: 700, easing: tween.easeOut }); }; // Start cooldown self.startCooldown = function () { self.isCoolingDown = true; self.lastCollectTime = Date.now(); cooldownOverlay.alpha = 0.5; cdText.visible = true; }; // End cooldown self.endCooldown = function () { self.isCoolingDown = false; cooldownOverlay.alpha = 0; cdText.visible = false; }; // Update cooldown overlay and timer self.update = function () { if (!self.isCoolingDown) return; var elapsed = Date.now() - self.lastCollectTime; var left = Math.max(0, self.cooldown - elapsed); if (left <= 0) { self.endCooldown(); } else { // Show seconds left cdText.setText(Math.ceil(left / 1000) + "s"); } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x2d2d2d }); /**** * Game Code ****/ // Resource definitions var resources = [{ type: "cow", iconId: "cowIcon", cooldown: 30000 // 30s }, { type: "fish", iconId: "fishIcon", cooldown: 30000 }, { type: "wheat", iconId: "wheatIcon", cooldown: 30000 }, { type: "ore", iconId: "oreIcon", cooldown: 30000 }, { type: "wood", iconId: "woodIcon", cooldown: 30000 }]; // --- GLOBAL ARRAYS for resource buttons and amount texts --- var resourceButtons = []; var resourceAmountTexts = []; // Resource amounts (persisted) var resourceAmounts = { cow: storage.cow || 0, fish: storage.fish || 0, wheat: storage.wheat || 0, ore: storage.ore || 0, wood: storage.wood || 0 }; // Save resource amounts to storage function saveResources() { storage.cow = resourceAmounts.cow; storage.fish = resourceAmounts.fish; storage.wheat = resourceAmounts.wheat; storage.ore = resourceAmounts.ore; storage.wood = resourceAmounts.wood; } // --- START SCREEN LOGIC --- var startScreenShown = false; var startImage = null; var startTween1 = null; var startTween2 = null; var startTween3 = null; var mainScreenInit = false; // Hide all main game UI until start screen is done function showMainScreen() { if (mainScreenInit) return; mainScreenInit = true; // Create resource buttons var btnSpacing = 350; var btnStartY = 900; var btnX = 2048 / 2; window.resourceButtons = []; for (var i = 0; i < resources.length; i++) { var res = resources[i]; var btn = new ResourceButton(); btn.resourceType = res.type; btn.iconId = res.iconId; btn.cooldown = res.cooldown; btn.x = btnX; btn.y = btnStartY + i * btnSpacing; btn.onCollect = function (rtype, btnIdx) { return function () { resourceAmounts[rtype]++; saveResources(); // Update the corresponding amount text for (var j = 0; j < resourceAmountTexts.length; j++) { if (resourceAmountTexts[j].type === rtype) { resourceAmountTexts[j].text.setText(resourceAmounts[rtype] + ""); break; } } }; }(res.type, i); // Set up icon and overlay after iconId is set if (btn.children.length > 1) { btn.removeChild(btn.children[1]); // Remove placeholder icon if exists } var icon = btn.attachAsset(res.iconId, { anchorX: 0.5, anchorY: 0.5, scaleX: 2, scaleY: 2 }); icon.y = 0; if (btn.children.length > 1) { btn.removeChild(btn.children[1]); // Remove placeholder overlay if exists } var overlay = btn.attachAsset('cooldownOverlay', { anchorX: 0.5, anchorY: 0.5, alpha: 0, scaleX: 2, scaleY: 2 }); // Add to game game.addChild(btn); resourceButtons.push(btn); } // Add resource amount text next to each button (1cm = 40px gap) window.resourceAmountTexts = []; // Amount numbers and frames next to items on the main screen have been removed as requested. } // Show start image and animate, then show main screen function showStartScreen() { if (startScreenShown) return; startScreenShown = true; // Create start image centered startImage = LK.getAsset('Start', { anchorX: 0.5, anchorY: 0.5, scaleX: 1, scaleY: 1 }); startImage.x = 2048 / 2; startImage.y = 2732 / 2; startImage.alpha = 0; startImage.scaleX = 0.7; startImage.scaleY = 0.7; game.addChild(startImage); // Fade in and scale up startTween1 = tween(startImage, { alpha: 1, scaleX: 1.1, scaleY: 1.1 }, { duration: 600, easing: tween.easeOut, onFinish: function onFinish() { // Pulse scale startTween2 = tween(startImage, { scaleX: 1, scaleY: 1 }, { duration: 300, easing: tween.easeInOut, onFinish: function onFinish() { // Wait, then fade out and remove startTween3 = tween(startImage, { alpha: 0, scaleX: 1.2, scaleY: 1.2 }, { duration: 500, easing: tween.easeIn, onFinish: function onFinish() { if (startImage && startImage.parent) startImage.parent.removeChild(startImage); startImage = null; showMainScreen(); } }); } }); } }); } // Start the game with the start screen showStartScreen(); // Place the start button at the same place as the pause button (top right corner) if (typeof LK.gui !== "undefined" && LK.gui.topRight) { // If there is a start button, place it at the top right if (typeof LK.startButton !== "undefined") { LK.gui.topRight.addChild(LK.startButton); } } // Add merchant button with image at the bottom right corner var merchantCornerBtn = LK.getAsset('Merchant', { anchorX: 0.5, anchorY: 0.5 }); merchantCornerBtn.x = 2048 - 180; merchantCornerBtn.y = 2732 - 180; merchantCornerBtn.scaleX = 0.8; merchantCornerBtn.scaleY = 0.8; game.addChild(merchantCornerBtn); // Open merchant popup when tapped merchantCornerBtn.down = function (x, y, obj) { if (merchantPopup) return; // Block input to resource buttons for (var i = 0; i < resourceButtons.length; i++) { resourceButtons[i].interactive = false; } // Directly open the merchant popup logic (copied from yellowBtn.down) if (merchantPopup) return; // Fade overlay merchantFade = new Container(); var fadeBg = LK.getAsset('cooldownOverlay', { anchorX: 0, anchorY: 0, width: 2048, height: 2732, color: 0x000000, alpha: 0.0 }); merchantFade.addChild(fadeBg); merchantFade.interactive = true; // Block input to game behind merchantFade.zIndex = 1000; game.addChild(merchantFade); // Animate fade in tween(fadeBg, { alpha: 0.7 }, { duration: 350, easing: tween.easeOut }); // Popup box merchantPopup = new Container(); var boxW = 1000, boxH = 1400; var popupBg = LK.getAsset('inventoryBg', { anchorX: 0.5, anchorY: 0.5, width: boxW, height: boxH, color: 0x333333 }); merchantPopup.addChild(popupBg); merchantPopup.x = 2048 / 2; merchantPopup.y = 2732 / 2; merchantPopup.zIndex = 1001; // Merchant "avatar" (just a text for now) var merchantText = new Text2("Merchant", { size: 120, fill: 0xFFE066 }); merchantText.anchor.set(0.5, 0); merchantText.x = 0; merchantText.y = -boxH / 2 + 60; merchantPopup.addChild(merchantText); // Info text var infoText = new Text2("Sell your items for gold!", { size: 60, fill: "#fff" }); infoText.anchor.set(0.5, 0); infoText.x = 0; infoText.y = merchantText.y + 150; merchantPopup.addChild(infoText); // Gold display if (typeof storage.gold === "undefined") storage.gold = 0; var goldAmount = storage.gold || 0; var goldText = new Text2("Gold: " + goldAmount, { size: 80, fill: 0xFFD700 }); goldText.anchor.set(0.5, 0); // Add a gap between gold text and info text goldText.x = 0; goldText.y = infoText.y + 80; merchantPopup.addChild(goldText); // Resource sell button definitions var sellDefs = [{ type: "wood", icon: "woodIcon", price: 2, label: "Wood" }, { type: "fish", icon: "fishIcon", price: 1, label: "Fish" }, { type: "cow", icon: "cowIcon", price: 3, label: "Cow" }, { type: "ore", icon: "oreIcon", price: 4, label: "Ore" }, { type: "wheat", icon: "wheatIcon", price: 1, label: "Wheat" }]; // Layout: vertical stack, centered, with clear horizontal separation for icon, label, amount, price, and button // Move sell buttons further down to avoid overlap with gold text var sellBtnStartY = goldText.y + 180; // Increased gap below gold text var sellBtnSpacing = 210; // Increased vertical spacing between rows var sellBtnW = 900, // Slightly wider for more space sellBtnH = 150; var merchantSellBtns = []; for (var i = 0; i < sellDefs.length; i++) { (function (i) { var def = sellDefs[i]; var btnY = sellBtnStartY + i * sellBtnSpacing; // Amount demonstrator (amount owned) - to the left of the icon var amtOwned = resourceAmounts[def.type] || 0; var amtOwnedText = new Text2(amtOwned + "", { size: 64, fill: "#fff" }); amtOwnedText.anchor.set(1, 0.5); // Add a larger gap between amount and icon (was 50, now 10 for more space) amtOwnedText.x = -sellBtnW / 2 + 10; // 10px from left edge for more gap amtOwnedText.y = btnY; merchantPopup.addChild(amtOwnedText); // Icon var icon = LK.getAsset(def.icon, { anchorX: 0.5, anchorY: 0.5 }); // Move icon further right to increase gap from amount (was 100, now 80) icon.x = -sellBtnW / 2 + 80; icon.y = btnY; merchantPopup.addChild(icon); // Resource label var resLabel = new Text2(def.label, { size: 64, fill: "#fff" }); resLabel.anchor.set(0, 0.5); // Add more horizontal space between label and arrows resLabel.x = -sellBtnW / 2 + 200; resLabel.y = btnY; merchantPopup.addChild(resLabel); // Amount owned var amt = resourceAmounts[def.type] || 0; // --- Amount selector state --- var sellAmount = 1; // Down arrow var downArrow = new Text2("▼", { size: 64, fill: "#fff" }); downArrow.anchor.set(0.5, 0.5); // Move arrows and amount text further right to add horizontal space downArrow.x = -sellBtnW / 2 + 520 - 60; downArrow.y = btnY; downArrow.interactive = true; merchantPopup.addChild(downArrow); // Up arrow var upArrow = new Text2("▲", { size: 64, fill: "#fff" }); upArrow.anchor.set(0.5, 0.5); upArrow.x = -sellBtnW / 2 + 520 + 60; upArrow.y = btnY; upArrow.interactive = true; merchantPopup.addChild(upArrow); // Amount text (between arrows) var amtText = new Text2("x" + sellAmount, { size: 64, fill: "#fff" }); amtText.anchor.set(0.5, 0.5); amtText.x = -sellBtnW / 2 + 520; amtText.y = btnY; merchantPopup.addChild(amtText); // Arrow logic downArrow.down = function () { if (sellAmount > 1) { sellAmount--; amtText.setText("x" + sellAmount); } }; upArrow.down = function () { var maxSell = resourceAmounts[def.type]; if (sellAmount < maxSell) { sellAmount++; amtText.setText("x" + sellAmount); } }; // Price var priceText = new Text2(def.price + " coins", { size: 56, fill: 0xFFD700 }); priceText.anchor.set(1, 0.5); // Add more horizontal space between amount selector and coins text priceText.x = sellBtnW / 2 - 100; // was -120, now -100 for more gap after amount selector priceText.y = btnY; merchantPopup.addChild(priceText); // Sell button var sellBtn = LK.getAsset('inventoryBtn', { anchorX: 0.5, anchorY: 0.5, color: 0xFFE066 }); sellBtn.x = sellBtnW / 2 - 30; // was -80, now -30 for more gap after coins text sellBtn.y = btnY; merchantPopup.addChild(sellBtn); // Sell button label (removed) // Sell logic var sellAllTimeout = null; var sellAllInterval = null; sellBtn.down = function (x, y, obj) { // Start a timeout to trigger sell all after 500ms if (resourceAmounts[def.type] > 0) { // Sell the selected amount (or as much as possible) var toSell = Math.min(sellAmount, resourceAmounts[def.type]); if (toSell > 0) { resourceAmounts[def.type] -= toSell; storage[def.type] = resourceAmounts[def.type]; goldAmount += def.price * toSell; storage.gold = goldAmount; LK.getSound('Coin').play(); amtText.setText("x" + Math.min(sellAmount, resourceAmounts[def.type])); goldText.setText("Gold: " + goldAmount); // Also update main screen resource amount for (var j = 0; j < resourceAmountTexts.length; j++) { if (resourceAmountTexts[j].type === def.type) { resourceAmountTexts[j].text.setText(resourceAmounts[def.type] + ""); break; } } // Update merchant popup amount demonstrator amtOwnedText.setText(resourceAmounts[def.type] + ""); // Clamp sellAmount to available if (resourceAmounts[def.type] < sellAmount) { sellAmount = Math.max(1, resourceAmounts[def.type]); amtText.setText("x" + sellAmount); } // Animate gold text goldText.scale.set(1.2, 1.2); tween(goldText.scale, { x: 1, y: 1 }, { duration: 300, easing: tween.easeOut }); } } // Start long-press detection if (sellAllTimeout) LK.clearTimeout(sellAllTimeout); if (sellAllInterval) LK.clearInterval(sellAllInterval); sellAllTimeout = LK.setTimeout(function () { // Start selling all at a fast interval sellAllInterval = LK.setInterval(function () { if (resourceAmounts[def.type] > 0) { // Sell the selected amount (or as much as possible) var toSell = Math.min(sellAmount, resourceAmounts[def.type]); if (toSell > 0) { resourceAmounts[def.type] -= toSell; storage[def.type] = resourceAmounts[def.type]; goldAmount += def.price * toSell; storage.gold = goldAmount; LK.getSound('Coin').play(); amtText.setText("x" + Math.min(sellAmount, resourceAmounts[def.type])); goldText.setText("Gold: " + goldAmount); // Also update main screen resource amount for (var j = 0; j < resourceAmountTexts.length; j++) { if (resourceAmountTexts[j].type === def.type) { resourceAmountTexts[j].text.setText(resourceAmounts[def.type] + ""); break; } } // Update merchant popup amount demonstrator amtOwnedText.setText(resourceAmounts[def.type] + ""); // Clamp sellAmount to available if (resourceAmounts[def.type] < sellAmount) { sellAmount = Math.max(1, resourceAmounts[def.type]); amtText.setText("x" + sellAmount); } // Animate gold text goldText.scale.set(1.2, 1.2); tween(goldText.scale, { x: 1, y: 1 }, { duration: 300, easing: tween.easeOut }); } } else { // Stop interval if nothing left to sell if (sellAllInterval) LK.clearInterval(sellAllInterval); sellAllInterval = null; } }, 50); // Sell every 50ms }, 500); // Long press threshold: 500ms }; // Stop selling on up sellBtn.up = function (x, y, obj) { if (sellAllTimeout) LK.clearTimeout(sellAllTimeout); sellAllTimeout = null; if (sellAllInterval) LK.clearInterval(sellAllInterval); sellAllInterval = null; }; merchantSellBtns.push({ btn: sellBtn, amtText: amtText }); })(i); } // Close button var closeBtn = LK.getAsset('closeBtn', { anchorX: 0.5, anchorY: 0.5 }); closeBtn.x = boxW / 2 - 60; closeBtn.y = -boxH / 2 + 60; merchantPopup.addChild(closeBtn); // Close logic closeBtn.down = function () { // Restore input to resource buttons for (var i = 0; i < resourceButtons.length; i++) { resourceButtons[i].interactive = true; } // Animate fade out if (merchantFade && merchantFade.children.length > 0) { tween(merchantFade.children[0], { alpha: 0 }, { duration: 250, easing: tween.easeIn, onFinish: function onFinish() { if (merchantFade && merchantFade.parent) merchantFade.parent.removeChild(merchantFade); merchantFade = null; } }); } else if (merchantFade && merchantFade.parent) { merchantFade.parent.removeChild(merchantFade); merchantFade = null; } if (merchantPopup && merchantPopup.parent) merchantPopup.parent.removeChild(merchantPopup); merchantPopup = null; }; // Add popup to game game.addChild(merchantPopup); }; // Only keep the merchant button at the bottom right corner // (Removed button "a" and its label) // --- Merchant Popup logic --- var merchantPopup = null; var merchantFade = null; // (yellowBtn and blueBtn handlers removed) // Play background music when the game starts LK.playMusic('Bg'); // Game update loop game.update = function () { // Update all resource buttons (for cooldowns) for (var i = 0; i < resourceButtons.length; i++) { resourceButtons[i].update(); } }; // --- Asset Initialization Section --- // Resource button background // Cooldown overlay (semi-transparent) // Inventory popup background // Inventory button (top right) // Close button for popup // Resource icons // Stop background music when the game is paused game.pause = function () { LK.stopMusic(); }; // Resume background music when the game continues game["continue"] = function () { LK.playMusic('Bg'); };
===================================================================
--- original.js
+++ change.js
@@ -426,17 +426,19 @@
size: 64,
fill: "#fff"
});
amtOwnedText.anchor.set(1, 0.5);
- amtOwnedText.x = -sellBtnW / 2 + 50; // 50px from left edge
+ // Add a larger gap between amount and icon (was 50, now 10 for more space)
+ amtOwnedText.x = -sellBtnW / 2 + 10; // 10px from left edge for more gap
amtOwnedText.y = btnY;
merchantPopup.addChild(amtOwnedText);
// Icon
var icon = LK.getAsset(def.icon, {
anchorX: 0.5,
anchorY: 0.5
});
- icon.x = -sellBtnW / 2 + 100;
+ // Move icon further right to increase gap from amount (was 100, now 80)
+ icon.x = -sellBtnW / 2 + 80;
icon.y = btnY;
merchantPopup.addChild(icon);
// Resource label
var resLabel = new Text2(def.label, {
Merchant. In-Game asset. 2d. High contrast. No shadows
Coin, "m" sign. In-Game asset. 2d. High contrast. No shadows
Frame. In-Game asset. 2d. High contrast. No shadows
My farm, wheat, cow, ore, pickaxe. Starting screen style. In-Game asset. 2d. High contrast. No shadows
Movement button, item moving button. In-Game asset. 2d. High contrast. No shadows
A cute middle eastern farmer character. In-Game asset. 2d. High contrast. No shadows
Mowing sickle. In-Game asset. 2d. High contrast. No shadows
Watering waterdrops watering can. In-Game asset. 2d. High contrast. No shadows
Historical frame with beige interior.