User prompt
4 sırada dolmadan slot aktif olmasın.
User prompt
Sıralar arasındaki bekleme zamanıni yariya düsur ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Slotu çekince tüm sıralar ardışık olarak sırayla dolsun ve puan kuralları her sıra için geçerli olsun ve animasyonlar da sırayla ardışık olarak oynasın. ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Slotu çekince 4 sıra da dolsun ve tüm puan kuralları ve animasyonları 4 sıra için de geçerli olsun. ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
4 row da bitince hücreleri temizle.
User prompt
Middle celli kaldır
User prompt
Ana gridi 4x4 e düşür. Orta hücreyi en alta al. Adını da sonuc hücre diye degistir.
User prompt
Seçileni ekranı daha guzel boşluklu ayarla.
User prompt
Seçilen hucre arasını ac.
User prompt
Seçilene tıklayınca geri koy.
User prompt
Sell hucresinin mesafesi hücreler arasıyla ayni olsun. Seçilen mala tiklayınca inventorye geri koy
User prompt
Mallar gridini 4x3 yerine 4x2 yap. Boyutunu slot gridi ile aynı yap. Satış hücresini de aynı boyut yap ve butonu da hemdn altına büyüt. Ekran yerlesimleri uyumlu olsun. Ayrıca başlangıçta 1 malımız olsun. Sat yerine Sell yaz
User prompt
Mal hücreleri 4 tanesi yukardaki 3 hücre boyutu kadar büyüsün.
User prompt
Mal hücreleri ve mallar biraz daha büyük olsun.
User prompt
Satılan malın yerine yeni mal otomatik gelmesin
User prompt
Aşağıya 4x3 hucreden oluşan mallar gridi ekle. Her bir hücre içinde çeşitli renkte ve şekilde assetler olsun. Bunlardan birini tıklayınca sağda bulunan bir hucreye taşı. Sagdaki hücrenin altinda bir buton olsun. Butonda sat yazsın. Butona basınca money değerimiz 100₺ artsin. ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Hücreler transparan olmasın.
User prompt
Arkaplanı yeşil yap.
User prompt
Tüm ekranı bir grid boyu yukarı kaydır.
User prompt
Kaydirma sadece handle a yakin bir yerde olsun.
User prompt
Please fix the bug: 'RangeError: Maximum call stack size exceeded' in or related to this line: 'var shapeGraphics = self.attachAsset(assetId, {' Line Number: 41
User prompt
Tedt için 4x puan alacagim sekil gönder
User prompt
Test için4 aynı renk ve aynı şekil gönder
User prompt
Test için 4ü gönder
User prompt
2 şekil puanı icin scorMatch yerine 2xMatch asseti kullan. scoreMatch assetini sil.
/****
* 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) {
self.lane = lane;
self.y = startY;
self.targetY = endY;
self.speed = 120; // Double the speed for much faster movement
self.isMoving = true;
// Add slot machine spinning effect - faster rotation
tween(self, {
rotation: Math.PI * 4
}, {
duration: 800,
// Much faster rotation animation
easing: tween.easeOut
});
};
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 || !isGridFull()) return;
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;
// Create score display
scoreTxt = new Text2('Score: 0', {
size: 80,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Create money display
moneyTxt = new Text2('Money: 0₺', {
size: 60,
fill: 0x00ff00
});
moneyTxt.anchor.set(0.5, 0);
moneyTxt.y = 100;
LK.gui.top.addChild(moneyTxt);
// Create goods grid (4x2) 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 < 2; 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 = 1600;
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('Sell', {
size: 60,
fill: 0xffffff
});
sellButtonText.anchor.set(0.5, 0.5);
sellButtonText.x = sellButton.x;
sellButtonText.y = sellButton.y;
game.addChild(sellButtonText);
function updateScore() {
scoreTxt.setText('Score: ' + LK.getScore());
}
function updateMoney() {
moneyTxt.setText('Money: ' + 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() {
// Fill all rows sequentially starting from row 3 (bottom) going up to row 0 (top)
fillRowSequentially(3);
}
function fillRowSequentially(currentRow) {
if (currentRow < 0) return; // All rows filled
// Fill current row with shapes
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);
shape.targetRow = currentRow; // Track which row this shape belongs to
game.addChild(shape);
dropShapes.push(shape);
}, laneIndex * 50); // Stagger each lane by 50ms
})(i);
}
// Wait for current row to finish, then check matches and fill next row
LK.setTimeout(function () {
checkMatchesForRow(currentRow, function () {
// After checking matches for current row, fill the next row up
fillRowSequentially(currentRow - 1);
});
}, 500); // Wait 0.5 seconds for shapes to settle
}
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;
}
var points = 0;
var matched = false;
// Check for identical shapes: 4 = 250 points, 3 = 100 points, 2 = 50 points
for (var key in shapeColorCount) {
if (shapeColorCount[key] === 4) {
points = 250;
matched = true;
break;
} else if (shapeColorCount[key] === 3) {
points = 100;
matched = true;
break;
} else if (shapeColorCount[key] === 2) {
points = 50;
matched = true;
break;
}
}
if (matched) {
LK.setScore(LK.getScore() + points);
updateScore();
updateMoney();
// Play different 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;
// Find which shapes actually contributed to the score
var scoringShapes = [];
var targetShapeType = '';
for (var key in shapeColorCount) {
if (shapeColorCount[key] === 4 && points === 250 || shapeColorCount[key] === 3 && points === 100 || shapeColorCount[key] === 2 && points === 50) {
targetShapeType = key;
break;
}
}
// Collect only the shapes that actually scored
for (var i = 0; i < rowShapes.length; i++) {
var shape = rowShapes[i];
if (shape.color + shape.shapeForm === targetShapeType) {
scoringShapes.push(shape);
}
}
// Animate only the scoring shapes
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
});
}
});
})(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
});
}
});
}
// Wait for animations to complete before calling callback
LK.setTimeout(function () {
if (callback) callback();
}, 1500); // Wait for match animations to complete
} else {
// No match, call callback immediately
if (callback) callback();
}
}
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;
// 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;
}
}
});
}
}
// Fallback to reset flag if no shapes to shift
if (shapesToShift === 0) {
isShifting = 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
// 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 && isGridFull()) {
// 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 && isGridFull()) {
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();
// Spawn shapes immediately when handle reaches top
if (isGridFull()) {
shiftShapesDown();
cleanupOffscreenShapes();
// Spawn immediately after shift
spawnShapes();
} else {
spawnShapes();
}
}
});
lever.isPulled = false;
}
};
game.update = function () {
// Check for completed drops and matches
var allStopped = true;
for (var i = 0; i < dropShapes.length; i++) {
if (dropShapes[i].isMoving) {
allStopped = false;
break;
}
}
if (allStopped && dropShapes.length > 0) {
var hasNewlyStoppedShapes = false;
for (var i = 0; i < dropShapes.length; i++) {
if (dropShapes[i].row === 3 && !dropShapes[i].checked) {
dropShapes[i].checked = true;
hasNewlyStoppedShapes = true;
}
}
if (hasNewlyStoppedShapes) {
checkMatches();
}
}
cleanupOffscreenShapes();
};
updateScore(); ===================================================================
--- original.js
+++ change.js
@@ -87,9 +87,9 @@
anchorY: 0.5
});
self.leverHandle.y = -700;
self.pull = function () {
- if (!self.canPull || isShifting) return;
+ if (!self.canPull || isShifting || !isGridFull()) return;
self.canPull = false;
self.isPulled = true;
LK.getSound('leverPull').play();
// Animate lever handle moving down - much faster
@@ -571,9 +571,9 @@
if (sellButtonDistance <= goodsCellSize / 2) {
sellItem();
return;
}
- if (!isShifting) {
+ if (!isShifting && isGridFull()) {
// 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)
@@ -584,9 +584,9 @@
}
}
};
game.move = function (x, y, obj) {
- if (isDragging && !isShifting) {
+ if (isDragging && !isShifting && isGridFull()) {
var dragDistance = y - dragStartY;
// If dragged down enough, trigger lever pull
if (dragDistance > dragThreshold) {
lever.pull();
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