User prompt
Skor ile gelen iteme basinca yok olsun ve skora geriye 1000 eklensin.
User prompt
Please fix the bug: 'Script error.' in or related to this line: 'tween(currentInventoryItem || goodsGrid[gridIndex], {' Line Number: 795 ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Mallar gridinden slota gönderilen item icin bir baska hucreye basılsa bile oraya itemi tasima
User prompt
Eğer skordan gelen item ise ona göre davran.
User prompt
Eğer mevcuttaki bir item slota eklendiyse bu item için skora 1000 ekleme yapma
User prompt
Eğer mevcuttaki bir item slota eklendiyse bu item için skora 1000 ekleme yapma
User prompt
Eğer mevcuttaki bir item slota eklendiyse bu item için skora 1000 ekleme.
User prompt
Skor 1000 i geçtiğinde ve inventor slot boş ise, inventor slota basarsak rastgele bir mal getir ve skordan 1000 eksilt. Eger Inventory slottaki mala tıklanırsa mal kaybolsun ve skora geri 1000 eklensin. Eğer inventory slotta mal varken mallar gridinde bir hücreye tiklanırsa o hucreye o mal gelsin. Tüm bu işlemlerde parada bir değişiklik olmasın.
User prompt
3x puanini 250, 4x puanini 500 puan yap
User prompt
Al butonunu kaldır
User prompt
Inventory items e tiklayıp inventory slota koyduysak eger inventory slottaki lteme tiklayinca geri gönder
User prompt
Test için skora 1000tl ekle ve goster
User prompt
Skor 1000 i geçtiğinde inventor slota basarsak rastgele bir mal getir ve skordan 1000 eksilt. Eger Inventory slottaki mala tıklanırsa mal kaybolsun ve skora geri 1000 eklensin. Eğer inventory slotta mal varken mallar gridinde bir hücreye tiklanırsa o hucreye o mal gelsin. Tüm bu işlemlerde parada bur değişiklik olmasın.
User prompt
Skor 1000 i geçtiğinde inventor slota basarsak rastgele bir mal getir ve skordan 1000 eksilt. Eger Inventory slottaki mala tıklanırsa mal kaybolsun ve skora geri 1000 eklensin. Eğer inventory slotta mal varken mallar gridinde bir hücreye tiklanırsa o hucreye o mal gelsin. Tüm bu işlemlerde parada bur değişiklik olmasın.
User prompt
Al butonunu kaldır
User prompt
Skor 1000 i geçtiğinde inventor slota basarsak rastgele bir mal getir ve skordan 1000 eksilt. Eger Inventory slottaki mala tıklanırsa alım iptal olsun. Eğer inventory slotta mal varken mallar gridinde bir hücreye tiklarsam o hucreye o mal gelsin. Tüm bu işlemlerde parada bur değişiklik olmasın.
User prompt
Test icin başlangıçta 1500 skor ekle
User prompt
Test icin başlangıçta 1500 skor yaz
User prompt
Al butonuna basınca 1000 skor varsa inventor slota rastgele bir mal getir ve skordan 1000 eksilt. Inventory slottaki mala tıklarsam mal yok olsun ve skora geriye 1000 eklensin yani istek iptal olsun. Ancak inventory slotta mal varken mallar gridinde bir hücreye tiklarsam o hucreye o mal gelsin.
User prompt
Al butonuna basınca 1000 skor varsa inventorye rastgele bir mal getir ve skordan 1000 eksilt.
User prompt
Al ve Sat yer değiştir ekranda
User prompt
Al butonunu biraz daha yukarı taşı. Aralıklar aynı uzunlukta olsun.
User prompt
Al butonunu biraz yukarı taşı.
User prompt
Sat butonunun heman altına ayni boyutta Al butonu ekle
User prompt
Sat butonunu biraz daha yukarı taşı
/**** * 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) { // 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 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; 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; tween(currentInventoryItem, { x: targetX, y: targetY }, { duration: 300, easing: tween.easeOut }); } 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; tween(currentInventoryItem, { x: targetX, y: targetY }, { duration: 300, easing: tween.easeOut }); } } // Move new item to inventory currentInventoryItem = goodsItem; tween(goodsItem, { x: inventorySlot.x, y: inventorySlot.y }, { duration: 300, easing: tween.easeOut }); } 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 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) return; // Set animation flag to prevent lever activation for all pulls isAnimating = 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 animation flag for all pulls isAnimating = 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: 250 }); } else if (shapeColorCount[key] === 3) { matchingGroups.push({ type: key, count: 3, points: 100 }); } else if (shapeColorCount[key] === 2) { matchingGroups.push({ type: key, count: 2, points: 50 }); } } 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 === 250) { LK.getSound('4xMatch').play(); } else if (points === 100) { LK.getSound('3xMatch').play(); } else if (points === 50) { LK.getSound('2xMatch').play(); } // Enhanced visual feedback for wins var flashColor = points >= 250 ? 0xffd700 : points >= 100 ? 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 >= 100) { 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 // Add touch/drag functionality to game - only near lever handle game.down = function (x, y, obj) { // 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; } 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();
/****
* 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) {
// 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
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;
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;
tween(currentInventoryItem, {
x: targetX,
y: targetY
}, {
duration: 300,
easing: tween.easeOut
});
}
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;
tween(currentInventoryItem, {
x: targetX,
y: targetY
}, {
duration: 300,
easing: tween.easeOut
});
}
}
// Move new item to inventory
currentInventoryItem = goodsItem;
tween(goodsItem, {
x: inventorySlot.x,
y: inventorySlot.y
}, {
duration: 300,
easing: tween.easeOut
});
}
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 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) return;
// Set animation flag to prevent lever activation for all pulls
isAnimating = 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 animation flag for all pulls
isAnimating = 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: 250
});
} else if (shapeColorCount[key] === 3) {
matchingGroups.push({
type: key,
count: 3,
points: 100
});
} else if (shapeColorCount[key] === 2) {
matchingGroups.push({
type: key,
count: 2,
points: 50
});
}
}
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 === 250) {
LK.getSound('4xMatch').play();
} else if (points === 100) {
LK.getSound('3xMatch').play();
} else if (points === 50) {
LK.getSound('2xMatch').play();
}
// Enhanced visual feedback for wins
var flashColor = points >= 250 ? 0xffd700 : points >= 100 ? 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 >= 100) {
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
// Add touch/drag functionality to game - only near lever handle
game.down = function (x, y, obj) {
// 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;
}
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();
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