User prompt
Tüm assetlerin alphasını kaldır
User prompt
itemlerin alphası 1 olsun.
User prompt
Skordan gelmeyen itemleri inventory e ekleyebileyim.
User prompt
Slotta item kaldı, bjnu mallar gridine kkoyabileyim.
User prompt
Bir itemin skor item durumu nerede olursa olsun, slot çekilince false değerine değiştir.
User prompt
Bir itemin skor item kod işareti, slot çekilince false olsun.
User prompt
Slot itemi one getir
User prompt
Mallar itemleri ve slot item alphalarıni kaldir
User prompt
Menu screen önde olsun
User prompt
Oyuna bir menu ekranı ekle basla yukle kaydet olsun ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
Kaydet ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
1x puanı 50 ye düşür
User prompt
Satla alin yerini değiştir
User prompt
Al butonunu satın altina getir
User prompt
Al buton satın hemen üstunde olsun
User prompt
Al butonu ekle ve al butonuna basinca 1000 skor harcayıp slotta item oluştur.
User prompt
Slotta item yoksa slota tıklatma
User prompt
Slotta item yoksa skor refund yapma
User prompt
Skor iteme görsel işareti yerine kodda işaretle
User prompt
Skor iteme slotta tiklanirsa yok olsun ve skora refund olsun. ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Skor item icin bir işaret koy ve sonraki slot çekinceye kadar işaretli kalsin
User prompt
Skor item slotta tiklaninca sadece yok olsun ve refund olsun. ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Skordan gelen item bir sonraki slot cekiminde goodsitem gibi davransın. Slot çekimine kadar slot iteme tiklaninca geriye refund olsun ve gooditeme tiklaninca ilgili hucreye gitsin ve tekrar tiklaninca slota geri donsun ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Skordan gelen item bir sonraki slot cekimine kadar slota tiklayinca hep skora geri ilave olup silinsin ve mallar gridine gitmesin ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Skordan gelen item bir sonraki slot cekimine kadar belli olsun ve slota tiklayinca hep skora geri ilave olup silinsin animasyon da ekle. ↪💡 Consider importing and using the following plugins: @upit/tween.v1
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ var DropShape = Container.expand(function (shapeType, color, shapeForm) { var self = Container.call(this); self.shapeType = shapeType; self.color = color; self.shapeForm = shapeForm; self.speed = 0; self.targetY = 0; self.isMoving = false; self.lane = 0; self.row = -1; var assetId = color + shapeForm; var shapeGraphics = self.attachAsset(assetId, { anchorX: 0.5, anchorY: 0.5 }); self.startDrop = function (lane, startY, endY, targetRow) { self.lane = lane; self.y = startY; self.targetY = endY; self.targetRow = targetRow; self.speed = 120; // Double the speed for much faster movement self.isMoving = true; self.rotationComplete = false; // Add slot machine spinning effect - faster rotation tween(self, { rotation: Math.PI * 4 }, { duration: 800, // Much faster rotation animation easing: tween.easeOut, onFinish: function onFinish() { self.rotationComplete = true; } }); }; self.update = function () { if (self.isMoving) { self.y += self.speed; // Much faster settling with aggressive deceleration var distanceToTarget = Math.abs(self.targetY - self.y); if (distanceToTarget < 150) { self.speed = Math.max(8, self.speed * 0.85); // Higher minimum speed and faster deceleration } // Stop at target with bounce effect if (self.y >= self.targetY) { self.y = self.targetY; self.isMoving = false; self.speed = 0; // No bounce animation to keep consistent size // Calculate which row this shape is in - use targetRow if available if (self.targetRow !== undefined) { self.row = self.targetRow; } else { self.row = Math.floor((self.y - gridStartY) / (cellSize + cellMargin)); } } } }; return self; }); var GoodsItem = Container.expand(function (goodsType) { var self = Container.call(this); self.goodsType = goodsType; var itemGraphics = self.attachAsset(goodsType, { anchorX: 0.5, anchorY: 0.5 }); self.down = function (x, y, obj) { // Prevent interaction while any sequence or animation is running if (isScoreRefunding || isSequenceRunning || isTweenAnimating) return; // Check if this item is from score if (self.isFromScore) { // Always refund score items from current pull generation, prevent movement to goods grid if (self.scoreGeneration === pullGeneration) { // Set refund flag to prevent multiple clicks isScoreRefunding = true; // Destroy the item and refund 1000 to score self.destroy(); // Clear from inventory if it was the current inventory item if (currentInventoryItem === self) { currentInventoryItem = null; } // Clear from goods grid if it was placed there var gridIndex = goodsGrid.indexOf(self); if (gridIndex !== -1) { goodsGrid[gridIndex] = null; } LK.setScore(LK.getScore() + 1000); updateScore(); // Clear refund flag after animation completes LK.setTimeout(function () { isScoreRefunding = false; }, 300); return; } // Score items from current generation cannot move to goods grid return; } // Move this item to inventory slot moveToInventory(self); }; return self; }); var Lever = Container.expand(function () { var self = Container.call(this); self.isPulled = false; self.canPull = true; var leverBase = self.attachAsset('lever', { anchorX: 0.5, anchorY: 1.0 }); self.leverHandle = self.attachAsset('leverHandle', { anchorX: 0.5, anchorY: 0.5 }); self.leverHandle.y = -700; self.pull = function () { if (!self.canPull || isShifting || isAnimating) return; // Check if player has enough money (10₺ required) if (money < 10) return; // Deduct 10₺ for using the slot machine money -= 10; updateMoney(); pullCount++; // Increment pull count pullGeneration++; // Increment pull generation to track slot pull cycles self.canPull = false; self.isPulled = true; LK.getSound('leverPull').play(); // Animate lever handle moving down - much faster tween(self.leverHandle, { y: -100 }, { duration: 15, easing: tween.easeOut }); // Keep lever pulled state - will be reset on touch release // Allow immediate next pull self.canPull = true; }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x2a1810 }); /**** * Game Code ****/ var lanes = []; var dropShapes = []; var cellSize = 300; // Square cell size var cellMargin = 15; // 15 pixel margin between cells var totalGridWidth = 4 * cellSize + 3 * cellMargin; // Total width of 4 columns with margins var totalGridHeight = 4 * cellSize + 3 * cellMargin; // Total height of 4 rows with margins var gridStartX = (2048 - totalGridWidth) / 2 - 200; // Shift the 4x5 grid to the left var gridStartY = 600 - (cellSize + cellMargin); // Shift grid up by one grid cell height var laneWidth = cellSize + cellMargin; // Width per column including margin var laneBackgroundWidth = cellSize; // Square cell background var cellHeight = cellSize + cellMargin; // Height per row including margin var shapeTypes = ['red', 'blue', 'green', 'yellow']; var shapeForms = ['Shape', 'Circle']; var lever; var scoreTxt; var money = 0; var moneyTxt; var goodsGrid = []; var inventorySlot = null; var currentInventoryItem = null; var sellButton = null; var goodsTypes = ['apple', 'banana', 'orange', 'grape', 'bread', 'cheese', 'meat', 'fish']; // Create lane backgrounds for 4x4 grid for (var col = 0; col < 4; col++) { for (var row = 0; row < 4; row++) { var assetType = 'cell'; var cellBack = LK.getAsset(assetType, { width: cellSize, height: cellSize, anchorX: 0.5, anchorY: 0.5, alpha: 0.3 }); cellBack.x = gridStartX + col * (cellSize + cellMargin) + cellSize / 2; cellBack.y = gridStartY + row * (cellSize + cellMargin) + cellSize / 2; game.addChild(cellBack); } } // Result cell removed // Create lever lever = game.addChild(new Lever()); lever.x = 1700; // Move to the left lever.y = 1400 - (cellSize + cellMargin); // Move up by one cell height // Create score display scoreTxt = new Text2('Skor: 0', { size: 80, fill: 0xFFFFFF }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); // Create money display moneyTxt = new Text2('Para: 0₺', { size: 60, fill: 0x00ff00 }); moneyTxt.anchor.set(0.5, 0); moneyTxt.y = 100; LK.gui.top.addChild(moneyTxt); // Create goods grid (4x3) below main grid var goodsGridStartX = gridStartX; var goodsGridStartY = gridStartY + totalGridHeight + 100; var goodsCellSize = cellSize; // Use same size as main grid cells (300px) var goodsMargin = cellMargin; // Use same margin as main grid (15px) for (var row = 0; row < 3; row++) { for (var col = 0; col < 4; col++) { // Create cell background var cellBack = LK.getAsset('goodsCell', { width: goodsCellSize, height: goodsCellSize, anchorX: 0.5, anchorY: 0.5, alpha: 0.8 }); cellBack.x = goodsGridStartX + col * (goodsCellSize + goodsMargin) + goodsCellSize / 2; cellBack.y = goodsGridStartY + row * (goodsCellSize + goodsMargin) + goodsCellSize / 2; game.addChild(cellBack); // Only create goods item for the first cell (start with 1 item) if (row === 0 && col === 0) { var randomGoodsType = goodsTypes[Math.floor(Math.random() * goodsTypes.length)]; var goodsItem = new GoodsItem(randomGoodsType); goodsItem.x = cellBack.x; goodsItem.y = cellBack.y; game.addChild(goodsItem); goodsGrid.push(goodsItem); } else { goodsGrid.push(null); } } } // Create inventory slot on the right side inventorySlot = LK.getAsset('inventorySlot', { width: goodsCellSize, height: goodsCellSize, anchorX: 0.5, anchorY: 0.5, alpha: 0.6 }); inventorySlot.x = 1750; inventorySlot.y = goodsGridStartY + goodsCellSize / 2; inventorySlot.down = function (x, y, obj) { // Prevent interaction while any sequence or animation is running if (isScoreRefunding || isSequenceRunning || isTweenAnimating) return; // If there's an item in inventory, handle refund if it's from score if (currentInventoryItem && currentInventoryItem.isFromScore) { // Always refund score items from current pull generation if (currentInventoryItem.scoreGeneration === pullGeneration) { // Set refund flag to prevent multiple clicks isScoreRefunding = true; // Destroy the item and refund 1000 to score currentInventoryItem.destroy(); // Clear from goods grid if it was placed there var gridIndex = goodsGrid.indexOf(currentInventoryItem); if (gridIndex !== -1) { goodsGrid[gridIndex] = null; } currentInventoryItem = null; LK.setScore(LK.getScore() + 1000); updateScore(); // Clear refund flag after animation completes LK.setTimeout(function () { isScoreRefunding = false; }, 300); return; } // Score items from current generation cannot move to goods grid return; } else if (currentInventoryItem && !currentInventoryItem.isFromScore) { // Only allow non-score items to move to goods grid var gridIndex = goodsGrid.indexOf(currentInventoryItem); if (gridIndex !== -1) { var row = Math.floor(gridIndex / 4); var col = gridIndex % 4; var targetX = goodsGridStartX + col * (goodsCellSize + goodsMargin) + goodsCellSize / 2; var targetY = goodsGridStartY + row * (goodsCellSize + goodsMargin) + goodsCellSize / 2; tween(currentInventoryItem, { x: targetX, y: targetY }, { duration: 300, easing: tween.easeOut }); } currentInventoryItem = null; } else if (LK.getScore() >= 1000) { // Only generate item if inventory is empty and score >= 1000 var randomGoodsType = goodsTypes[Math.floor(Math.random() * goodsTypes.length)]; var goodsItem = new GoodsItem(randomGoodsType); goodsItem.x = inventorySlot.x; goodsItem.y = inventorySlot.y; // Mark as item generated from score goodsItem.isFromScore = true; goodsItem.scoreGeneration = pullGeneration; // Track which pull generation this item is from game.addChild(goodsItem); currentInventoryItem = goodsItem; // Deduct 1000 from score LK.setScore(LK.getScore() - 1000); updateScore(); } }; game.addChild(inventorySlot); // Create sell button below inventory slot sellButton = LK.getAsset('sellButton', { width: goodsCellSize, height: goodsCellSize / 2, anchorX: 0.5, anchorY: 0.5 }); sellButton.x = inventorySlot.x; sellButton.y = inventorySlot.y + goodsCellSize / 2 + goodsMargin + goodsCellSize / 4; game.addChild(sellButton); // Add sell button text var sellButtonText = new Text2('Sat', { size: 80, fill: 0xffffff }); sellButtonText.anchor.set(0.5, 0.5); sellButtonText.x = sellButton.x; sellButtonText.y = sellButton.y; game.addChild(sellButtonText); function updateScore() { scoreTxt.setText('Skor: ' + LK.getScore()); } function updateMoney() { moneyTxt.setText('Para: ' + money + '₺'); } function moveToInventory(goodsItem) { // If clicking on the same item that's already in inventory, return it to grid if (currentInventoryItem === goodsItem) { var gridIndex = goodsGrid.indexOf(currentInventoryItem); if (gridIndex !== -1) { var row = Math.floor(gridIndex / 4); var col = gridIndex % 4; var targetX = goodsGridStartX + col * (goodsCellSize + goodsMargin) + goodsCellSize / 2; var targetY = goodsGridStartY + row * (goodsCellSize + goodsMargin) + goodsCellSize / 2; isTweenAnimating = true; tween(currentInventoryItem, { x: targetX, y: targetY }, { duration: 300, easing: tween.easeOut, onFinish: function onFinish() { isTweenAnimating = false; } }); } currentInventoryItem = null; return; } if (currentInventoryItem) { // Return current item to its original position in grid var gridIndex = goodsGrid.indexOf(currentInventoryItem); if (gridIndex !== -1) { var row = Math.floor(gridIndex / 4); var col = gridIndex % 4; var targetX = goodsGridStartX + col * (goodsCellSize + goodsMargin) + goodsCellSize / 2; var targetY = goodsGridStartY + row * (goodsCellSize + goodsMargin) + goodsCellSize / 2; isTweenAnimating = true; tween(currentInventoryItem, { x: targetX, y: targetY }, { duration: 300, easing: tween.easeOut, onFinish: function onFinish() { isTweenAnimating = false; } }); } } // Move new item to inventory - preserve score flag currentInventoryItem = goodsItem; // Keep the score flag so items can still be refunded if they were from score // currentInventoryItem.isFromScore remains unchanged isTweenAnimating = true; tween(goodsItem, { x: inventorySlot.x, y: inventorySlot.y }, { duration: 300, easing: tween.easeOut, onFinish: function onFinish() { isTweenAnimating = false; } }); } function sellItem() { if (currentInventoryItem) { money += 100; updateMoney(); // Flash money text tween(moneyTxt, { scaleX: 1.3, scaleY: 1.3 }, { duration: 200, onFinish: function onFinish() { tween(moneyTxt, { scaleX: 1.0, scaleY: 1.0 }, { duration: 200 }); } }); // Remove sold item without replacement var gridIndex = goodsGrid.indexOf(currentInventoryItem); if (gridIndex !== -1) { currentInventoryItem.destroy(); goodsGrid[gridIndex] = null; } currentInventoryItem = null; } } function buyItem() { // Original buy functionality (unchanged) // Check if player has enough money (50₺ required) if (money < 50) return; // Find first empty slot in goods grid var emptySlotIndex = -1; for (var i = 0; i < goodsGrid.length; i++) { if (goodsGrid[i] === null) { emptySlotIndex = i; break; } } // If no empty slot, don't buy if (emptySlotIndex === -1) return; // Deduct money for buying item money -= 50; updateMoney(); // Flash money text tween(moneyTxt, { scaleX: 1.3, scaleY: 1.3 }, { duration: 200, onFinish: function onFinish() { tween(moneyTxt, { scaleX: 1.0, scaleY: 1.0 }, { duration: 200 }); } }); // Create new random goods item var randomGoodsType = goodsTypes[Math.floor(Math.random() * goodsTypes.length)]; var goodsItem = new GoodsItem(randomGoodsType); // Calculate position based on empty slot index var row = Math.floor(emptySlotIndex / 4); var col = emptySlotIndex % 4; var targetX = goodsGridStartX + col * (goodsCellSize + goodsMargin) + goodsCellSize / 2; var targetY = goodsGridStartY + row * (goodsCellSize + goodsMargin) + goodsCellSize / 2; goodsItem.x = targetX; goodsItem.y = targetY; game.addChild(goodsItem); goodsGrid[emptySlotIndex] = goodsItem; } function getRandomShape() { var color = shapeTypes[Math.floor(Math.random() * shapeTypes.length)]; var form = shapeForms[Math.floor(Math.random() * shapeForms.length)]; return { color: color, form: form }; } function spawnShapes() { spawnNewShapes(); } function spawnNewShapes() { // Prevent spawning if already animating if (isAnimating || isSequenceRunning) return; // Set animation flags to prevent all interactions isAnimating = true; isSequenceRunning = true; // Fill all rows sequentially starting from row 3 (bottom) going up to row 0 (top) fillRowSequentially(3); } function fillRowSequentially(currentRow) { if (currentRow < 0) { // All rows filled, clear all animation flags isAnimating = false; isSequenceRunning = false; return; } // Fill current row with shapes var currentRowShapes = []; for (var i = 0; i < 4; i++) { (function (laneIndex) { LK.setTimeout(function () { var shapeData = getRandomShape(); var shape = new DropShape(shapeData.color + shapeData.form, shapeData.color, shapeData.form); shape.x = gridStartX + laneIndex * (cellSize + cellMargin) + cellSize / 2; var targetY = gridStartY + currentRow * (cellSize + cellMargin) + cellSize / 2; shape.startDrop(laneIndex, gridStartY - 100, targetY, currentRow); currentRowShapes.push(shape); game.addChild(shape); dropShapes.push(shape); }, laneIndex * 50); // Stagger each lane by 50ms })(i); } // Wait for all rotation animations to complete before proceeding function waitForRotationComplete() { var allRotationComplete = true; for (var i = 0; i < currentRowShapes.length; i++) { if (!currentRowShapes[i].rotationComplete) { allRotationComplete = false; break; } } if (allRotationComplete) { // All rotations complete, now check matches and fill next row checkMatchesForRow(currentRow, function () { // After checking matches for current row, fill the next row up fillRowSequentially(currentRow - 1); }); } else { // Check again in 50ms LK.setTimeout(waitForRotationComplete, 50); } } // Start checking after shapes are spawned (account for stagger time) LK.setTimeout(waitForRotationComplete, 300); } function checkMatches() { // Check result row (row 3 - bottom row) for matches checkMatchesForRow(3); } function checkMatchesForRow(targetRow, callback) { // Check specific row for matches var rowShapes = []; for (var i = 0; i < dropShapes.length; i++) { if (dropShapes[i].row === targetRow) { rowShapes.push(dropShapes[i]); } } if (rowShapes.length < 2) { if (callback) callback(); return; } // Count identical shapes (same color + same form) var shapeColorCount = {}; for (var i = 0; i < rowShapes.length; i++) { var shape = rowShapes[i]; shapeColorCount[shape.color + shape.shapeForm] = (shapeColorCount[shape.color + shape.shapeForm] || 0) + 1; } // Find all matching groups var matchingGroups = []; for (var key in shapeColorCount) { if (shapeColorCount[key] === 4) { matchingGroups.push({ type: key, count: 4, points: 500 }); } else if (shapeColorCount[key] === 3) { matchingGroups.push({ type: key, count: 3, points: 250 }); } else if (shapeColorCount[key] === 2) { matchingGroups.push({ type: key, count: 2, points: 500 }); } } if (matchingGroups.length > 0) { // Process each matching group sequentially processMatchingGroups(matchingGroups, rowShapes, 0, callback); } else { // No match, call callback immediately if (callback) callback(); } } function processMatchingGroups(matchingGroups, rowShapes, groupIndex, callback) { if (groupIndex >= matchingGroups.length) { // All groups processed, call final callback if (callback) callback(); return; } var group = matchingGroups[groupIndex]; var points = group.points; // Add points for this group LK.setScore(LK.getScore() + points); updateScore(); updateMoney(); // Play sound based on match count if (points === 500 && group.count === 4) { LK.getSound('4xMatch').play(); } else if (points === 250) { LK.getSound('3xMatch').play(); } else if (points === 500 && group.count === 2) { LK.getSound('2xMatch').play(); } // Enhanced visual feedback for wins var flashColor = points >= 500 ? 0xffd700 : points >= 250 ? 0xff6600 : 0xffffff; // Collect shapes for this specific group var scoringShapes = []; for (var i = 0; i < rowShapes.length; i++) { var shape = rowShapes[i]; if (shape.color + shape.shapeForm === group.type) { scoringShapes.push(shape); } } // Animate only the scoring shapes for this group var animationsCompleted = 0; var totalAnimations = scoringShapes.length; for (var i = 0; i < scoringShapes.length; i++) { var shape = scoringShapes[i]; LK.effects.flashObject(shape, flashColor, 1000); // Add temporary scaling and glow effect (function (currentShape) { tween(currentShape, { scaleX: 1.8, scaleY: 1.8, alpha: 1.2 }, { duration: 300, easing: tween.easeOut, onFinish: function onFinish() { // Return to original size and alpha tween(currentShape, { scaleX: 1.0, scaleY: 1.0, alpha: 1.0 }, { duration: 200, easing: tween.easeIn, onFinish: function onFinish() { animationsCompleted++; if (animationsCompleted >= totalAnimations) { // All animations for this group completed, process next group after delay LK.setTimeout(function () { processMatchingGroups(matchingGroups, rowShapes, groupIndex + 1, callback); }, 200); // Small delay between groups } } }); } }); })(shape); } // Animate score text on big wins if (points >= 250) { tween(scoreTxt, { scaleX: 1.2, scaleY: 1.2 }, { duration: 200, onFinish: function onFinish() { tween(scoreTxt, { scaleX: 1.0, scaleY: 1.0 }, { duration: 200 }); } }); } } function isGridFull() { for (var laneIndex = 0; laneIndex < 4; laneIndex++) { var occupiedRows = 0; for (var j = 0; j < dropShapes.length; j++) { if (dropShapes[j].lane === laneIndex && !dropShapes[j].isMoving) { occupiedRows++; } } if (occupiedRows >= 4) { return true; } } return false; } function shiftShapesDown() { isShifting = true; isAnimating = true; // Move all shapes down by one row var shapesToShift = 0; var shapesCompleted = 0; // Count shapes that need to be shifted for (var i = 0; i < dropShapes.length; i++) { if (!dropShapes[i].isMoving) { shapesToShift++; } } for (var i = 0; i < dropShapes.length; i++) { var shape = dropShapes[i]; if (!shape.isMoving) { shape.row += 1; var newTargetY = gridStartY + shape.row * (cellSize + cellMargin) + cellSize / 2; // Animate the shift down - much faster tween(shape, { y: newTargetY }, { duration: 120, // Much faster shift animation easing: tween.easeOut, onFinish: function onFinish() { shapesCompleted++; if (shapesCompleted >= shapesToShift) { isShifting = false; isAnimating = false; } } }); } } // Fallback to reset flag if no shapes to shift if (shapesToShift === 0) { isShifting = false; isAnimating = false; } } function cleanupOffscreenShapes() { // Check if any shape has reached row 4 (beyond the 4x4 grid) var shouldClearAll = false; for (var i = 0; i < dropShapes.length; i++) { if (dropShapes[i].row >= 4) { shouldClearAll = true; break; } } // If any shape reached row 4, clear all shapes from the grid if (shouldClearAll) { for (var i = dropShapes.length - 1; i >= 0; i--) { var shape = dropShapes[i]; shape.destroy(); dropShapes.splice(i, 1); } } else { // Original cleanup logic for shapes that might be off-screen for (var i = dropShapes.length - 1; i >= 0; i--) { var shape = dropShapes[i]; // Clean up shapes that go beyond the bottom of the 4x4 grid (row 4 and beyond) if (shape.row >= 4) { // No scaling animation to keep consistent size shape.destroy(); dropShapes.splice(i, 1); } } } } var lastLeverPulled = false; var isDragging = false; var dragStartY = 0; var dragThreshold = 200; // Minimum drag distance to trigger slot var isShifting = false; // Flag to prevent lever pulling during animations var isAnimating = false; // Flag to track if any animations are ongoing var pullCount = 0; // Track number of pulls var pullGeneration = 0; // Track slot pull generation for score item refund behavior var isScoreRefunding = false; // Flag to prevent clicks during score refund var isSequenceRunning = false; // Flag to prevent any sequence/animation var isTweenAnimating = false; // Flag to track tween animations // Add touch/drag functionality to game - only near lever handle game.down = function (x, y, obj) { // Prevent interaction while any sequence or animation is running if (isSequenceRunning || isTweenAnimating) return; // Check if sell button was clicked var sellButtonDistance = Math.sqrt(Math.pow(x - sellButton.x, 2) + Math.pow(y - sellButton.y, 2)); if (sellButtonDistance <= goodsCellSize / 2) { sellItem(); return; } // Check if clicked on goods grid cells when inventory has item if (currentInventoryItem && currentInventoryItem.isFromScore && currentInventoryItem.scoreGeneration !== pullGeneration) { for (var row = 0; row < 3; row++) { for (var col = 0; col < 4; col++) { var cellX = goodsGridStartX + col * (goodsCellSize + goodsMargin) + goodsCellSize / 2; var cellY = goodsGridStartY + row * (goodsCellSize + goodsMargin) + goodsCellSize / 2; var cellDistance = Math.sqrt(Math.pow(x - cellX, 2) + Math.pow(y - cellY, 2)); if (cellDistance <= goodsCellSize / 2) { var gridIndex = row * 4 + col; // Move inventory item to any clicked cell (empty or occupied) // Check if this item was already in the grid (existing item being moved) var wasAlreadyInGrid = goodsGrid.indexOf(currentInventoryItem) !== -1; var itemToMove = currentInventoryItem; // If target cell is occupied, swap items if (goodsGrid[gridIndex] !== null) { var targetItem = goodsGrid[gridIndex]; // Move target item to inventory isTweenAnimating = true; tween(targetItem, { x: inventorySlot.x, y: inventorySlot.y }, { duration: 300, easing: tween.easeOut, onFinish: function onFinish() { isTweenAnimating = false; } }); // Keep target item's score flag so it can still be refunded if it was from score // targetItem.isFromScore remains unchanged currentInventoryItem = targetItem; } else { currentInventoryItem = null; } // Move the item to the clicked cell if (itemToMove) { isTweenAnimating = true; tween(itemToMove, { x: cellX, y: cellY }, { duration: 300, easing: tween.easeOut, onFinish: function onFinish() { isTweenAnimating = false; } }); // Remove item from its old position if it was already in grid if (wasAlreadyInGrid) { var oldIndex = goodsGrid.indexOf(itemToMove); if (oldIndex !== -1) { goodsGrid[oldIndex] = null; } } // Place the item in the new grid position goodsGrid[gridIndex] = itemToMove; // Keep the score flag when placing in grid so it can still be refunded // itemToMove.isFromScore remains unchanged } return; } } } } if (!isShifting && !isAnimating) { // Calculate lever handle's world position var handleWorldX = lever.x; var handleWorldY = lever.y + lever.leverHandle.y; // Check if touch is near the lever handle (within 200 pixels) var distance = Math.sqrt(Math.pow(x - handleWorldX, 2) + Math.pow(y - handleWorldY, 2)); if (distance <= 200) { isDragging = true; dragStartY = y; } } }; game.move = function (x, y, obj) { if (isDragging && !isShifting && !isAnimating) { var dragDistance = y - dragStartY; // If dragged down enough, trigger lever pull if (dragDistance > dragThreshold) { lever.pull(); isDragging = false; // Prevent multiple triggers during same drag } } }; game.up = function (x, y, obj) { isDragging = false; // Only allow lever handle to return up when touch is released if (lever.isPulled) { // Animate lever handle back up when released - much faster tween(lever.leverHandle, { y: -700 }, { duration: 30, easing: tween.easeOut, onFinish: function onFinish() { // Play lever release sound when handle reaches top LK.getSound('leverRelease').play(); // Clear all cells first for (var i = dropShapes.length - 1; i >= 0; i--) { var shape = dropShapes[i]; shape.destroy(); dropShapes.splice(i, 1); } // Start spawning immediately after clearing spawnShapes(); } }); lever.isPulled = false; } }; game.update = function () { cleanupOffscreenShapes(); // Update lever appearance based on money availability if (money < 10) { // Show passive lever when not enough money if (lever.leverHandle.texture !== LK.getAsset('leverHandlePassive', {}).texture) { lever.removeChild(lever.leverHandle); lever.leverHandle = lever.attachAsset('leverHandlePassive', { anchorX: 0.5, anchorY: 0.5 }); lever.leverHandle.y = -700; } } else { // Show active lever when enough money if (lever.leverHandle.texture !== LK.getAsset('leverHandle', {}).texture) { lever.removeChild(lever.leverHandle); lever.leverHandle = lever.attachAsset('leverHandle', { anchorX: 0.5, anchorY: 0.5 }); lever.leverHandle.y = -700; } } }; updateScore();
===================================================================
--- original.js
+++ change.js
@@ -75,58 +75,35 @@
});
self.down = function (x, y, obj) {
// Prevent interaction while any sequence or animation is running
if (isScoreRefunding || isSequenceRunning || isTweenAnimating) return;
- // Check if this item is from score and currently in goods grid
+ // Check if this item is from score
if (self.isFromScore) {
- var gridIndex = goodsGrid.indexOf(self);
- if (gridIndex !== -1) {
- // Item is in goods grid, move it to inventory slot
- moveToInventory(self);
- return;
- } else {
- // Item is in inventory slot, refund to score with animation
+ // Always refund score items from current pull generation, prevent movement to goods grid
+ if (self.scoreGeneration === pullGeneration) {
// Set refund flag to prevent multiple clicks
isScoreRefunding = true;
- // Animate item flying up to score with golden trail effect
- tween(self, {
- y: self.y - 300,
- scaleX: 0.3,
- scaleY: 0.3,
- alpha: 0.0
- }, {
- duration: 600,
- easing: tween.easeOut,
- onFinish: function onFinish() {
- // Destroy the item and refund 1000 to score
- self.destroy();
- // Clear from inventory if it was the current inventory item
- if (currentInventoryItem === self) {
- currentInventoryItem = null;
- }
- LK.setScore(LK.getScore() + 1000);
- updateScore();
- // Flash score text to show refund
- tween(scoreTxt, {
- scaleX: 1.3,
- scaleY: 1.3
- }, {
- duration: 200,
- onFinish: function onFinish() {
- tween(scoreTxt, {
- scaleX: 1.0,
- scaleY: 1.0
- }, {
- duration: 200
- });
- }
- });
- // Clear refund flag after animation completes
- isScoreRefunding = false;
- }
- });
+ // Destroy the item and refund 1000 to score
+ self.destroy();
+ // Clear from inventory if it was the current inventory item
+ if (currentInventoryItem === self) {
+ currentInventoryItem = null;
+ }
+ // Clear from goods grid if it was placed there
+ var gridIndex = goodsGrid.indexOf(self);
+ if (gridIndex !== -1) {
+ goodsGrid[gridIndex] = null;
+ }
+ LK.setScore(LK.getScore() + 1000);
+ updateScore();
+ // Clear refund flag after animation completes
+ LK.setTimeout(function () {
+ isScoreRefunding = false;
+ }, 300);
return;
}
+ // Score items from current generation cannot move to goods grid
+ return;
}
// Move this item to inventory slot
moveToInventory(self);
};
@@ -152,8 +129,9 @@
// Deduct 10₺ for using the slot machine
money -= 10;
updateMoney();
pullCount++; // Increment pull count
+ pullGeneration++; // Increment pull generation to track slot pull cycles
self.canPull = false;
self.isPulled = true;
LK.getSound('leverPull').play();
// Animate lever handle moving down - much faster
@@ -283,49 +261,29 @@
// Prevent interaction while any sequence or animation is running
if (isScoreRefunding || isSequenceRunning || isTweenAnimating) return;
// If there's an item in inventory, handle refund if it's from score
if (currentInventoryItem && currentInventoryItem.isFromScore) {
- // Set refund flag to prevent multiple clicks
- isScoreRefunding = true;
- // Animate item flying up to score with golden trail effect
- tween(currentInventoryItem, {
- y: currentInventoryItem.y - 300,
- scaleX: 0.3,
- scaleY: 0.3,
- alpha: 0.0
- }, {
- duration: 600,
- easing: tween.easeOut,
- onFinish: function onFinish() {
- // Destroy the item and refund 1000 to score
- currentInventoryItem.destroy();
- // Clear from goods grid if it was placed there
- var gridIndex = goodsGrid.indexOf(currentInventoryItem);
- if (gridIndex !== -1) {
- goodsGrid[gridIndex] = null;
- }
- currentInventoryItem = null;
- LK.setScore(LK.getScore() + 1000);
- updateScore();
- // Flash score text to show refund
- tween(scoreTxt, {
- scaleX: 1.3,
- scaleY: 1.3
- }, {
- duration: 200,
- onFinish: function onFinish() {
- tween(scoreTxt, {
- scaleX: 1.0,
- scaleY: 1.0
- }, {
- duration: 200
- });
- }
- });
- // Clear refund flag after animation completes
- isScoreRefunding = false;
+ // Always refund score items from current pull generation
+ if (currentInventoryItem.scoreGeneration === pullGeneration) {
+ // Set refund flag to prevent multiple clicks
+ isScoreRefunding = true;
+ // Destroy the item and refund 1000 to score
+ currentInventoryItem.destroy();
+ // Clear from goods grid if it was placed there
+ var gridIndex = goodsGrid.indexOf(currentInventoryItem);
+ if (gridIndex !== -1) {
+ goodsGrid[gridIndex] = null;
}
- });
+ currentInventoryItem = null;
+ LK.setScore(LK.getScore() + 1000);
+ updateScore();
+ // Clear refund flag after animation completes
+ LK.setTimeout(function () {
+ isScoreRefunding = false;
+ }, 300);
+ return;
+ }
+ // Score items from current generation cannot move to goods grid
return;
} else if (currentInventoryItem && !currentInventoryItem.isFromScore) {
// Only allow non-score items to move to goods grid
var gridIndex = goodsGrid.indexOf(currentInventoryItem);
@@ -343,48 +301,16 @@
});
}
currentInventoryItem = null;
} else if (LK.getScore() >= 1000) {
- // Add pulsing animation to make it obvious it's from score
- var _pulseItem = function pulseItem() {
- if (goodsItem && !goodsItem.destroyed) {
- tween(goodsItem, {
- alpha: 1.0,
- scaleX: 1.1,
- scaleY: 1.1
- }, {
- duration: 800,
- easing: tween.easeInOut,
- onFinish: function onFinish() {
- if (goodsItem && !goodsItem.destroyed) {
- tween(goodsItem, {
- alpha: 0.8,
- scaleX: 1.0,
- scaleY: 1.0
- }, {
- duration: 800,
- easing: tween.easeInOut,
- onFinish: _pulseItem
- });
- }
- }
- });
- }
- };
// Only generate item if inventory is empty and score >= 1000
var randomGoodsType = goodsTypes[Math.floor(Math.random() * goodsTypes.length)];
var goodsItem = new GoodsItem(randomGoodsType);
goodsItem.x = inventorySlot.x;
goodsItem.y = inventorySlot.y;
// Mark as item generated from score
goodsItem.isFromScore = true;
- // Track which pull this item was generated on
- goodsItem.generatedOnPull = pullCount;
- lastPullCountWhenItemGenerated = pullCount;
- // Add visual distinction with golden tint and pulsing effect
- goodsItem.tint = 0xffd700; // Golden tint
- goodsItem.alpha = 0.8;
- _pulseItem();
+ goodsItem.scoreGeneration = pullGeneration; // Track which pull generation this item is from
game.addChild(goodsItem);
currentInventoryItem = goodsItem;
// Deduct 1000 from score
LK.setScore(LK.getScore() - 1000);
@@ -845,12 +771,12 @@
var dragThreshold = 200; // Minimum drag distance to trigger slot
var isShifting = false; // Flag to prevent lever pulling during animations
var isAnimating = false; // Flag to track if any animations are ongoing
var pullCount = 0; // Track number of pulls
+var pullGeneration = 0; // Track slot pull generation for score item refund behavior
var isScoreRefunding = false; // Flag to prevent clicks during score refund
-var isSequenceRunning = false; // Flag to prevent interactions during any sequence/animation
+var isSequenceRunning = false; // Flag to prevent any sequence/animation
var isTweenAnimating = false; // Flag to track tween animations
-var lastPullCountWhenItemGenerated = -1; // Track when score item was generated
// Add touch/drag functionality to game - only near lever handle
game.down = function (x, y, obj) {
// Prevent interaction while any sequence or animation is running
if (isSequenceRunning || isTweenAnimating) return;
@@ -860,9 +786,9 @@
sellItem();
return;
}
// Check if clicked on goods grid cells when inventory has item
- if (currentInventoryItem && currentInventoryItem.isFromScore) {
+ if (currentInventoryItem && currentInventoryItem.isFromScore && currentInventoryItem.scoreGeneration !== pullGeneration) {
for (var row = 0; row < 3; row++) {
for (var col = 0; col < 4; col++) {
var cellX = goodsGridStartX + col * (goodsCellSize + goodsMargin) + goodsCellSize / 2;
var cellY = goodsGridStartY + row * (goodsCellSize + goodsMargin) + goodsCellSize / 2;
@@ -958,28 +884,8 @@
easing: tween.easeOut,
onFinish: function onFinish() {
// Play lever release sound when handle reaches top
LK.getSound('leverRelease').play();
- // Reset visual distinction for all score items that were generated before this pull
- if (currentInventoryItem && currentInventoryItem.isFromScore && currentInventoryItem.generatedOnPull < pullCount) {
- // Remove visual effects for items from previous pulls
- tween.stop(currentInventoryItem); // Stop pulsing animation
- currentInventoryItem.tint = 0xffffff; // Reset tint
- currentInventoryItem.alpha = 1.0; // Reset alpha
- currentInventoryItem.scaleX = 1.0; // Reset scale
- currentInventoryItem.scaleY = 1.0; // Reset scale
- }
- // Check goods grid for score items from previous pulls
- for (var i = 0; i < goodsGrid.length; i++) {
- var item = goodsGrid[i];
- if (item && item.isFromScore && item.generatedOnPull < pullCount) {
- tween.stop(item); // Stop pulsing animation
- item.tint = 0xffffff; // Reset tint
- item.alpha = 1.0; // Reset alpha
- item.scaleX = 1.0; // Reset scale
- item.scaleY = 1.0; // Reset scale
- }
- }
// Clear all cells first
for (var i = dropShapes.length - 1; i >= 0; i--) {
var shape = dropShapes[i];
shape.destroy();
Corn. In-Game asset. 2d. High contrast. No shadows
Green apple. In-Game asset. 2d. High contrast. No shadows
Grape. In-Game asset. 2d. High contrast. No shadows
Green grape. In-Game asset. 2d. High contrast. No shadows
ekmek. In-Game asset. 2d. High contrast. No shadows
peynir. In-Game asset. 2d. High contrast. No shadows
meat. In-Game asset. 2d. High contrast. No shadows
fish. In-Game asset. 2d. High contrast. No shadows
red apple. In-Game asset. 2d. High contrast. No shadows
orange. In-Game asset. 2d. High contrast. No shadows
3d gray ball shiny. In-Game asset. 2d. High contrast. No shadows
200x800 inset corners box gray shiny. In-Game asset. 2d. High contrast. No shadows