Code edit (11 edits merged)
Please save this source code
User prompt
Biraz daha yukarı
User prompt
Şimdi bunu para yazısının altına yerleştir
User prompt
Bana dikdörtgen, siyah bir image oluşturur musun
User prompt
Puanı para ile değiştir. Yani score yerine money değişkeni oluştur. Bu bizim paramız olucak. Birde ekranda Puan yazmasın. Sadece (ne kadar paramız varsa + "$") yazsın. Rengi yeşil olsun
Code edit (2 edits merged)
Please save this source code
User prompt
Hayır shelf pozisyonu her seferinde değişmesin. Bu düzenli yiyecek satırlarının yerleri değişsin. Shelfleri eski hâline getir
User prompt
Yiyecekleri daha düzenli yerleştirebilir misin? Mesela ekmek ekmek ekmek gibi bir satıra aynı şeyleri dezebilirsin. Birde her seferinde rastgele yerlerde oluşsun
User prompt
Şimdi farklı farklı ürünler ekleyelim. Birden fazla ürün olsun. Bu lar meyve de olabilir süt falan da.
User prompt
Sardan 1. Kişi çıkmışsa; o anda alışverişini bitirmiş bir müşteri sıranın en arkasına geçmek yerine 1. Kişinin yerine geçmeye çalılıyor. Bu sırada 2. Kişi de 1. Kişinin yerine geçmeye çalıştığı için iç içe giriyorlar
Code edit (1 edits merged)
Please save this source code
Code edit (2 edits merged)
Please save this source code
User prompt
Ya şu queue area'yı bi sil. Bir tane queue çizgisi oluştur. Bu çizgiyi kullanarak yapalım. Hiç böyle uğraşmayalım. Bütün sıra kodlarını da sil.
User prompt
Daha solda duran kişi 1. Kişi değil, 2. Kişi oldu
User prompt
Ya artık yap şu dediğimi! Sıradaki 1. Kişinin konumunu sola al, diğerlerin konumlarını dizelt. Sıradaki 1. Kişi sıradan çıktıktan sonra diğer tüm müşteriler 1. Nin yerine geçmeye çalışıyor. Onu da düzelt
User prompt
Birde sırası gelen müşterinin diğer müşterilerden daha aşağıda durmasını istemiyorum. Hepsi aynı hizada dursun
Code edit (5 edits merged)
Please save this source code
User prompt
Tüm müşteriler 1. Kişinin sağında beklesin
User prompt
Sırayı düzeltebilir misin. Sıraya giren 2. Kişi 1. Kişinin solunda duruyor, diğerleri ise 1. Kişinin sağında bekliyor
Code edit (1 edits merged)
Please save this source code
User prompt
Müşteri gelme hızını 1.5 katına çıkarabilir misin
Code edit (1 edits merged)
Please save this source code
Code edit (2 edits merged)
Please save this source code
User prompt
Tamam şimdi geri eski hâline alabilirsin
User prompt
Şimdilik müşteri doğma hızını 9 katına çıkarabilir misin
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ var Customer = Container.expand(function () { var self = Container.call(this); var graphics = self.attachAsset('customer', { anchorX: 0.5, anchorY: 1 }); self.items = []; self.currentItemIndex = 0; self.isBeingServed = false; self.patience = 100; self.maxPatience = 100; self.waitTime = 0; self.isShopping = true; self.targetShelf = null; self.itemsToCollect = Math.floor(Math.random() * 3) + 2; self.upset = false; self.angry = false; self.upsetStartTime = 0; self.paid = false; self.placeItemsOnCounter = function () { var startY = counterY + 50 - self.items.length * 70 / 2; for (var i = 0; i < self.items.length; i++) { var item = self.items[i]; item.x = 900; // Move to the left from center item.y = startY + i * 70; // Place items vertically game.addChild(item); } }; self.allItemsScanned = function () { for (var i = 0; i < self.items.length; i++) { if (!self.items[i].scanned) { return false; } } return true; }; self.getTotalValue = function () { var total = 0; for (var i = 0; i < self.items.length; i++) { total += self.items[i].value; } return total; }; self.completeTransaction = function () { // Mark customer as paid self.paid = true; // If customer was upset, stop shaking animation if (self.upset) { tween.stop(self, { x: true }); self.x = self.originalX; } // Remove items from counter for (var i = 0; i < self.items.length; i++) { if (self.items[i].parent) { self.items[i].destroy(); } } // Add to score LK.setScore(LK.getScore() + self.getTotalValue()); scoreTxt.setText('Score: ' + LK.getScore()); // Play sound LK.getSound('cashRegister').play(); // Move customer out tween(self, { x: -200 }, { duration: 1000, onFinish: function onFinish() { self.destroy(); } }); }; self.collectItemFromShelf = function () { if (self.items.length < self.itemsToCollect && self.targetShelf) { var takenProduct = self.targetShelf.takeProduct(); if (takenProduct) { var product = new Product(); // Set the product to match what was taken from shelf product.value = takenProduct.value; product.name = takenProduct.name; product.productType = takenProduct.productType; self.items.push(product); // Visual feedback tween(graphics, { scaleX: 1.2, scaleY: 1.2 }, { duration: 200, onFinish: function onFinish() { tween(graphics, { scaleX: 1, scaleY: 1 }, { duration: 200 }); } }); } } }; self.update = function () { // Track wait time for customers being served if (self.isBeingServed && !self.upset && !self.angry && !self.paid) { self.waitTime++; // Check if customer should become upset (5 seconds = 300 frames at 60fps) if (self.waitTime >= 300) { self.upset = true; self.upsetStartTime = 0; // Change color to indicate upset state (slightly darker) graphics.tint = 0x888888; // Start shaking animation self.originalX = self.x; self.shakeAnimation = function () { if (self.upset && !self.angry && !self.paid) { tween(self, { x: self.originalX + (Math.random() - 0.5) * 20 }, { duration: 100, onFinish: function onFinish() { if (self.upset && !self.angry && !self.paid) { self.shakeAnimation(); } } }); } }; self.shakeAnimation(); } } // Track upset time and transition to angry (only if not paid) if (self.upset && !self.angry && !self.paid) { self.upsetStartTime++; // Check if customer should become angry (3 seconds = 180 frames at 60fps) if (self.upsetStartTime >= 180) { self.angry = true; // Stop shaking animation tween.stop(self, { x: true }); self.x = self.originalX; // Change color to red when angry graphics.tint = 0xFF0000; // Remove items from counter when angry customer leaves for (var i = 0; i < self.items.length; i++) { if (self.items[i].parent) { self.items[i].destroy(); } } // Make angry customer leave the store tween(self, { x: -200 }, { duration: 1000, onFinish: function onFinish() { self.destroy(); } }); } } }; return self; }); var Product = Container.expand(function () { var self = Container.call(this); // Define product types with their properties var productTypes = [{ asset: 'apple', name: 'Apple', value: 2 }, { asset: 'banana', name: 'Banana', value: 1 }, { asset: 'orange', name: 'Orange', value: 3 }, { asset: 'milk', name: 'Milk', value: 5 }, { asset: 'bread', name: 'Bread', value: 4 }, { asset: 'cheese', name: 'Cheese', value: 6 }]; // Randomly select a product type var selectedType = productTypes[Math.floor(Math.random() * productTypes.length)]; var graphics = self.attachAsset(selectedType.asset, { anchorX: 0.5, anchorY: 0.5 }); self.scanned = false; self.value = selectedType.value; self.name = selectedType.name; self.productType = selectedType.asset; // Visual feedback for scanned items self.scan = function () { if (!self.scanned) { self.scanned = true; graphics.alpha = 0.5; // Make transparent when scanned LK.getSound('itemScan').play(); } }; self.down = function (x, y, obj) { self.scan(); }; return self; }); var Shelf = Container.expand(function () { var self = Container.call(this); var graphics = self.attachAsset('shelf', { anchorX: 0.5, anchorY: 0.5 }); self.products = []; // Create products on shelf self.createProducts = function () { var rows = 3; var cols = 3; var spacing = 80; var startX = -100; var startY = -120; // Define product types for this shelf var productTypes = [{ asset: 'apple', name: 'Apple', value: 2 }, { asset: 'banana', name: 'Banana', value: 1 }, { asset: 'orange', name: 'Orange', value: 3 }, { asset: 'milk', name: 'Milk', value: 5 }, { asset: 'bread', name: 'Bread', value: 4 }, { asset: 'cheese', name: 'Cheese', value: 6 }]; // Each shelf will have products organized by type in rows var shelfProductTypes = []; var numTypes = Math.min(rows, productTypes.length); // One type per row, max 3 types for (var t = 0; t < numTypes; t++) { var randomType = productTypes[Math.floor(Math.random() * productTypes.length)]; // Make sure we don't duplicate types on same shelf var alreadyExists = false; for (var e = 0; e < shelfProductTypes.length; e++) { if (shelfProductTypes[e].asset === randomType.asset) { alreadyExists = true; break; } } if (!alreadyExists) { shelfProductTypes.push(randomType); } else { t--; // Try again with different type } } for (var row = 0; row < rows; row++) { for (var col = 0; col < cols; col++) { // Each row has the same product type var selectedType = shelfProductTypes[row % shelfProductTypes.length]; var product = self.attachAsset(selectedType.asset, { anchorX: 0.5, anchorY: 0.5 }); product.x = startX + col * spacing; product.y = startY + row * spacing; product.available = true; product.productType = selectedType.asset; product.name = selectedType.name; product.value = selectedType.value; self.products.push(product); } } }; self.createProducts(); self.takeProduct = function () { for (var i = 0; i < self.products.length; i++) { if (self.products[i].available) { var product = self.products[i]; product.available = false; product.visible = false; return { value: product.value, name: product.name, productType: product.productType }; } } return null; }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0xfffca1 }); /**** * Game Code ****/ var customers = []; var customerQueue = []; var currentCustomer = null; var spawnTimer = 0; var spawnDelay = 360; // 6 seconds at 60fps (540/1.5) var counterY = 2300; // Bottom of screen // No changes needed - the code already ensures only the customer being served gets angry var shelves = []; // Generate random shelf positions var shelfPositions = []; var numShelves = 4; for (var s = 0; s < numShelves; s++) { var attempts = 0; var validPosition = false; var newPos; while (!validPosition && attempts < 20) { newPos = { x: Math.random() * 1400 + 300, // Random x between 300-1700 y: Math.random() * 600 + 600 // Random y between 600-1200 }; // Check if position is too close to other shelves validPosition = true; for (var p = 0; p < shelfPositions.length; p++) { var distance = Math.sqrt(Math.pow(newPos.x - shelfPositions[p].x, 2) + Math.pow(newPos.y - shelfPositions[p].y, 2)); if (distance < 250) { // Minimum distance between shelves validPosition = false; break; } } attempts++; } if (validPosition) { shelfPositions.push(newPos); } } for (var i = 0; i < shelfPositions.length; i++) { var shelf = new Shelf(); shelf.x = shelfPositions[i].x; shelf.y = shelfPositions[i].y; shelves.push(shelf); game.addChild(shelf); } // Create cash register at bottom center var cashRegister = game.addChild(LK.getAsset('cashRegister', { anchorX: 0.5, anchorY: 0.5 })); cashRegister.x = 1024; // Center of screen cashRegister.y = counterY; // Bottom position // Create queue line var queueLine = game.addChild(LK.getAsset('queueLine', { anchorX: 0.5, anchorY: 0.5 })); queueLine.x = 1024; // Center of screen queueLine.y = counterY - 300; // Position above cash register // Create score display var scoreTxt = new Text2('Score: 0', { size: 60, fill: 0x000000 }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); // Create instructions var instructionsTxt = new Text2('Tap items to scan them!', { size: 40, fill: 0x0000 }); instructionsTxt.anchor.set(0.5, 0); instructionsTxt.y = 80; LK.gui.top.addChild(instructionsTxt); function spawnCustomer() { var customer = new Customer(); customer.x = 1024; // Center of screen customer.y = -200; // Above screen customers.push(customer); game.addChild(customer); // Customer shopping sequence var shelfIndex = 0; var _visitShelf = function visitShelf() { if (shelfIndex < shelves.length && customer.items.length < customer.itemsToCollect) { var targetShelf = shelves[Math.floor(Math.random() * shelves.length)]; tween(customer, { x: targetShelf.x, y: targetShelf.y + 250 }, { duration: 1500, onFinish: function onFinish() { customer.targetShelf = targetShelf; customer.collectItemFromShelf(); shelfIndex++; LK.setTimeout(function () { if (customer.items.length < customer.itemsToCollect) { _visitShelf(); } else { // Done shopping, join queue customer.isShopping = false; customerQueue.push(customer); var queuePosition = queueLine.x + customerQueue.length * 200; tween(customer, { x: queuePosition, y: queueLine.y }, { duration: 1500 }); } }, 500); } }); } }; // Start shopping by entering store tween(customer, { y: 400 }, { duration: 1000, onFinish: function onFinish() { _visitShelf(); } }); } function serveNextCustomer() { if (customerQueue.length > 0 && !currentCustomer) { currentCustomer = customerQueue.shift(); currentCustomer.isBeingServed = true; // Move customer to cash register tween(currentCustomer, { x: 896, y: queueLine.y }, { duration: 1500, onFinish: function onFinish() { currentCustomer.placeItemsOnCounter(); } }); // Move other customers forward in queue - only move existing queue members for (var i = 0; i < customerQueue.length; i++) { var queuePos = queueLine.x + (i + 1) * 200; tween(customerQueue[i], { x: queuePos, y: queueLine.y }, { duration: 1000 }); } } } game.update = function () { spawnTimer++; // Spawn new customers if (spawnTimer >= spawnDelay) { spawnCustomer(); spawnTimer = 0; // Gradually increase spawn rate if (spawnDelay > 120) { spawnDelay -= 2; } } // Check if current customer transaction is complete if (currentCustomer && currentCustomer.isBeingServed) { // Shaking effect is now handled by tween animations instead of direct position manipulation // Only check for scanned items if customer hasn't left if (currentCustomer.parent && currentCustomer.allItemsScanned()) { currentCustomer.completeTransaction(); // Remove from customers array for (var i = customers.length - 1; i >= 0; i--) { if (customers[i] === currentCustomer) { customers.splice(i, 1); break; } } currentCustomer = null; // Serve next customer after a short delay LK.setTimeout(function () { serveNextCustomer(); }, 500); } // Check if customer left angry if (currentCustomer && !currentCustomer.parent) { // Remove from customers array for (var i = customers.length - 1; i >= 0; i--) { if (customers[i] === currentCustomer) { customers.splice(i, 1); break; } } currentCustomer = null; // Serve next customer after a short delay LK.setTimeout(function () { serveNextCustomer(); }, 500); } } // Serve next customer if none is being served if (!currentCustomer) { serveNextCustomer(); } // Game over condition - too many customers waiting if (customerQueue.length >= 5) { LK.showGameOver(); } }; // Initial customer spawn LK.setTimeout(function () { spawnCustomer(); }, 1000); // No changes required - the current implementation already makes angry customers walk out normally through the store entrance using tween animations
===================================================================
--- original.js
+++ change.js
@@ -260,19 +260,31 @@
asset: 'cheese',
name: 'Cheese',
value: 6
}];
- // Each shelf will have a random selection of 2-3 product types
+ // Each shelf will have products organized by type in rows
var shelfProductTypes = [];
- var numTypes = Math.floor(Math.random() * 2) + 2; // 2-3 types per shelf
+ var numTypes = Math.min(rows, productTypes.length); // One type per row, max 3 types
for (var t = 0; t < numTypes; t++) {
var randomType = productTypes[Math.floor(Math.random() * productTypes.length)];
- shelfProductTypes.push(randomType);
+ // Make sure we don't duplicate types on same shelf
+ var alreadyExists = false;
+ for (var e = 0; e < shelfProductTypes.length; e++) {
+ if (shelfProductTypes[e].asset === randomType.asset) {
+ alreadyExists = true;
+ break;
+ }
+ }
+ if (!alreadyExists) {
+ shelfProductTypes.push(randomType);
+ } else {
+ t--; // Try again with different type
+ }
}
for (var row = 0; row < rows; row++) {
for (var col = 0; col < cols; col++) {
- // Select random product type for this position
- var selectedType = shelfProductTypes[Math.floor(Math.random() * shelfProductTypes.length)];
+ // Each row has the same product type
+ var selectedType = shelfProductTypes[row % shelfProductTypes.length];
var product = self.attachAsset(selectedType.asset, {
anchorX: 0.5,
anchorY: 0.5
});
@@ -322,21 +334,37 @@
var spawnDelay = 360; // 6 seconds at 60fps (540/1.5)
var counterY = 2300; // Bottom of screen
// No changes needed - the code already ensures only the customer being served gets angry
var shelves = [];
-var shelfPositions = [{
- x: 400,
- y: 800
-}, {
- x: 800,
- y: 800
-}, {
- x: 1200,
- y: 800
-}, {
- x: 1600,
- y: 800
-}];
+// Generate random shelf positions
+var shelfPositions = [];
+var numShelves = 4;
+for (var s = 0; s < numShelves; s++) {
+ var attempts = 0;
+ var validPosition = false;
+ var newPos;
+ while (!validPosition && attempts < 20) {
+ newPos = {
+ x: Math.random() * 1400 + 300,
+ // Random x between 300-1700
+ y: Math.random() * 600 + 600 // Random y between 600-1200
+ };
+ // Check if position is too close to other shelves
+ validPosition = true;
+ for (var p = 0; p < shelfPositions.length; p++) {
+ var distance = Math.sqrt(Math.pow(newPos.x - shelfPositions[p].x, 2) + Math.pow(newPos.y - shelfPositions[p].y, 2));
+ if (distance < 250) {
+ // Minimum distance between shelves
+ validPosition = false;
+ break;
+ }
+ }
+ attempts++;
+ }
+ if (validPosition) {
+ shelfPositions.push(newPos);
+ }
+}
for (var i = 0; i < shelfPositions.length; i++) {
var shelf = new Shelf();
shelf.x = shelfPositions[i].x;
shelf.y = shelfPositions[i].y;
A shiny blue ball. In-Game asset. 2d. High contrast. No shadows
Üzerinde meyve, sebze gibi ürün bulundurmayan; market kasa bankosu. Üstten görünüm.. In-Game asset. 2d. High contrast. No shadows
Shiny apple. In-Game asset. 2d. High contrast. No shadows
Koparılmamış ve ayrılmamış, bir tutam muz. In-Game asset. 2d. High contrast. No shadows
Cheese. In-Game asset. 2d. High contrast. No shadows
Milk. In-Game asset. 2d. High contrast. No shadows
Orange. In-Game asset. 2d. High contrast. No shadows
Shelf. In-Game asset. 2d. High contrast. No shadows
Bread. In-Game asset. 2d. High contrast. No shadows
Continue button. In-Game asset. 2d. High contrast. No shadows
Cut this
Shop button. In-Game asset. 2d. High contrast. No shadows
A green Open button. In-Game asset. 2d. High contrast. No shadows
Rectangle red close button with "close" title. In-Game asset. 2d. High contrast. No shadows
Buy button. In-Game asset. 2d. High contrast. No shadows
Yiyecek kategorisi butonu. In-Game asset. 2d. High contrast. No shadows
Eşya kategorisi butonu. Üstünde "furniture" yazsın. In-Game asset. 2d. High contrast. No shadows
Kişiselleştirme kategorisi butonu. Boyutu 250x125 olsun. Çekiç sembolü olabilir. Rengi turuncu olsun. Yazı ingilizce olsun. Duş çerçevesi siyah olsun.. In-Game asset. 2d. High contrast. No shadows
İtem çerçevesi. In-Game asset. 2d. High contrast. No shadows