User prompt
Handle çok hızlı hareket etsin aşağıya çekince ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Kaydirma ile aynı anda olsun ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Slotu çekince handle aşağıya çek ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Asağiya kaydirinca kaydirma animasyonu olsun ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
activation from lever handle Loading Dokunmayı kaldır sadece slotu kaydırıp biraktiktan donra calissin ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Dokunma ile calismasin sadece kaydirma ile calissin
User prompt
Slotu çektiğimde aşagiya insin ve ben bıraktigimda yukarı ciksin ve spawn o anda baslasın ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Tüm hücreler ayni anda dolsun ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Ortadaki cizgiyi kaldır. Ortadaki 4 huce icin farkli asset ekle
User prompt
Ortadaki çizgiyi kaldır ortadaki hucreler icin baska asset ekle
User prompt
Handle mesafesini uzat daha aşağıya kadar cekince hareket etsin ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Handle daha aşağıya insin.
User prompt
1 saniye sonra izin ver. ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Bir sonraki slot çekme islemine 0.5 saniye sonra izin ver. ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Bir onceki islem tamamlanmadan slotun tekrar cekilmesine izin verme. ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Hucreler dolunca slot cekilince yeni sekiller gelmeden hucrelerdeki sekilleri bir alt hucreye kaydir. En alttaki hucreden de patlayarak yok et. Bellekten de sil. ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Hucreler aşağıya kaymadan spawn olmasin yeni sekiller.
User prompt
Slot dokunarak ve kaydırarak da calissin ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Hucreler dolunca yeni sekiller geldiginde hucrekerdeki sekilleri bir alt hucreye kaydir. En alttaki hucreden de patlayarak yok et. Bellekten de sol ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Sekil Hızını 4 kat arttir
User prompt
Düşen şekiller daha hızlı hücreye yerleşsin. Hücre doluysa yeni gelen sekil bir üst hucreye yerleşsin ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Lever ve handle 2 kat büyüt
User prompt
Handle daha fazla aşağıya hareket etsin ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Lever handle dokununca aşağıya dogru hareket etsin ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Kol hareket etmesin
/**** * 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 = 8; self.isMoving = true; // Add slot machine spinning effect tween(self, { rotation: Math.PI * 4 }, { duration: 2000, easing: tween.easeOut }); }; self.update = function () { if (self.isMoving) { self.y += self.speed; // Realistic slot machine deceleration var distanceToTarget = Math.abs(self.targetY - self.y); if (distanceToTarget < 150) { self.speed = Math.max(0.5, self.speed * 0.85); } // Stop at target with bounce effect if (self.y >= self.targetY) { self.y = self.targetY; self.isMoving = false; self.speed = 0; // Add settling bounce animation tween(self, { scaleY: 0.9 }, { duration: 100, onFinish: function onFinish() { tween(self, { scaleY: 1.0 }, { duration: 150, easing: tween.bounceOut }); } }); // Calculate which row this shape is in self.row = Math.floor((self.y - gridStartY) / (cellSize + cellMargin)); } } }; 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 }); var leverHandle = self.attachAsset('leverHandle', { anchorX: 0.5, anchorY: 0.5 }); leverHandle.y = -350; self.pull = function () { if (!self.canPull) return; self.canPull = false; self.isPulled = true; LK.getSound('leverPull').play(); // Reset lever state without animations LK.setTimeout(function () { self.isPulled = false; self.canPull = true; }, 100); }; self.down = function (x, y, obj) { self.pull(); }; 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 = 5 * cellSize + 4 * cellMargin; // Total height of 5 rows with margins var gridStartX = (2048 - totalGridWidth) / 2 - 200; // Shift the 4x5 grid to the left var gridStartY = 600; 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; // Create lane backgrounds for 4x5 grid for (var col = 0; col < 4; col++) { for (var row = 0; row < 5; row++) { var cellBack = LK.getAsset('cell', { 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); } } // Highlight middle row (winning line) - row 2 in 4x5 grid var winLine = LK.getAsset('cell', { width: totalGridWidth, // Width for 4 columns height: 8, color: 0xffd700, anchorX: 0.5, anchorY: 0.5, alpha: 0.7 }); winLine.x = gridStartX + totalGridWidth / 2; // Center on grid winLine.y = gridStartY + 2 * (cellSize + cellMargin) + cellSize / 2; // Middle row (row 2 of 5) game.addChild(winLine); // 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); function updateScore() { scoreTxt.setText('Score: ' + LK.getScore()); } 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() { // Staggered spawning for authentic slot machine feel 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; // Find the lowest available position in this lane var targetRow = 0; for (var row = 4; row >= 0; row--) { var occupied = false; for (var j = 0; j < dropShapes.length; j++) { if (dropShapes[j].lane === laneIndex && dropShapes[j].row === row) { occupied = true; break; } } if (!occupied) { targetRow = row; break; } } var targetY = gridStartY + targetRow * (cellSize + cellMargin) + cellSize / 2; shape.startDrop(laneIndex, gridStartY - 100, targetY); // Add initial scale animation shape.scaleX = 0.5; shape.scaleY = 0.5; tween(shape, { scaleX: 1.0, scaleY: 1.0 }, { duration: 300, easing: tween.bounceOut }); game.addChild(shape); dropShapes.push(shape); }, i * 150); // Stagger by 150ms per lane })(i); } } function checkMatches() { // Check middle row (row 2) for matches var middleRowShapes = []; for (var i = 0; i < dropShapes.length; i++) { if (dropShapes[i].row === 2) { middleRowShapes.push(dropShapes[i]); } } if (middleRowShapes.length < 3) return; // Count shapes by type and color var shapeCount = {}; var colorCount = {}; var shapeColorCount = {}; for (var i = 0; i < middleRowShapes.length; i++) { var shape = middleRowShapes[i]; shapeCount[shape.shapeForm] = (shapeCount[shape.shapeForm] || 0) + 1; colorCount[shape.color] = (colorCount[shape.color] || 0) + 1; shapeColorCount[shape.color + shape.shapeForm] = (shapeColorCount[shape.color + shape.shapeForm] || 0) + 1; } var points = 0; var matched = false; // Check for 4 same shapes + colors = 1000 points for (var key in shapeColorCount) { if (shapeColorCount[key] === 4) { points = 1000; matched = true; break; } } // Check for 4 same shapes = 100 points if (!matched) { for (var key in shapeCount) { if (shapeCount[key] === 4) { points = 100; matched = true; break; } } } // Check for 3 same shapes + colors = 300 points if (!matched) { for (var key in shapeColorCount) { if (shapeColorCount[key] === 3) { points = 300; matched = true; break; } } } // Check for 3 same shapes = 50 points if (!matched) { for (var key in shapeCount) { if (shapeCount[key] === 3) { points = 50; matched = true; break; } } } if (matched) { LK.setScore(LK.getScore() + points); updateScore(); LK.getSound('scoreMatch').play(); // Enhanced visual feedback for wins var flashColor = points >= 1000 ? 0xffd700 : points >= 300 ? 0xff6600 : 0xffffff; for (var i = 0; i < middleRowShapes.length; i++) { var shape = middleRowShapes[i]; LK.effects.flashObject(shape, flashColor, 1000); // Add pulsing animation for winning shapes tween(shape, { scaleX: 1.3, scaleY: 1.3 }, { duration: 300, easing: tween.easeOut, onFinish: function onFinish() { tween(shape, { scaleX: 1.0, scaleY: 1.0 }, { duration: 200 }); } }); } // Animate score text on big wins if (points >= 300) { tween(scoreTxt, { scaleX: 1.2, scaleY: 1.2 }, { duration: 200, onFinish: function onFinish() { tween(scoreTxt, { scaleX: 1.0, scaleY: 1.0 }, { duration: 200 }); } }); } } } function cleanupOffscreenShapes() { for (var i = dropShapes.length - 1; i >= 0; i--) { var shape = dropShapes[i]; // Clean up shapes that go beyond the bottom of the 4x5 grid if (shape.y > gridStartY + 5 * (cellSize + cellMargin) + cellSize / 2) { shape.destroy(); dropShapes.splice(i, 1); } } } var lastLeverPulled = false; game.update = function () { // Check if lever was pulled var currentLeverPulled = lever.isPulled; if (!lastLeverPulled && currentLeverPulled) { spawnShapes(); } lastLeverPulled = currentLeverPulled; // 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 === 2 && !dropShapes[i].checked) { dropShapes[i].checked = true; hasNewlyStoppedShapes = true; } } if (hasNewlyStoppedShapes) { checkMatches(); } } cleanupOffscreenShapes(); }; 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) {
self.lane = lane;
self.y = startY;
self.targetY = endY;
self.speed = 8;
self.isMoving = true;
// Add slot machine spinning effect
tween(self, {
rotation: Math.PI * 4
}, {
duration: 2000,
easing: tween.easeOut
});
};
self.update = function () {
if (self.isMoving) {
self.y += self.speed;
// Realistic slot machine deceleration
var distanceToTarget = Math.abs(self.targetY - self.y);
if (distanceToTarget < 150) {
self.speed = Math.max(0.5, self.speed * 0.85);
}
// Stop at target with bounce effect
if (self.y >= self.targetY) {
self.y = self.targetY;
self.isMoving = false;
self.speed = 0;
// Add settling bounce animation
tween(self, {
scaleY: 0.9
}, {
duration: 100,
onFinish: function onFinish() {
tween(self, {
scaleY: 1.0
}, {
duration: 150,
easing: tween.bounceOut
});
}
});
// Calculate which row this shape is in
self.row = Math.floor((self.y - gridStartY) / (cellSize + cellMargin));
}
}
};
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
});
var leverHandle = self.attachAsset('leverHandle', {
anchorX: 0.5,
anchorY: 0.5
});
leverHandle.y = -350;
self.pull = function () {
if (!self.canPull) return;
self.canPull = false;
self.isPulled = true;
LK.getSound('leverPull').play();
// Reset lever state without animations
LK.setTimeout(function () {
self.isPulled = false;
self.canPull = true;
}, 100);
};
self.down = function (x, y, obj) {
self.pull();
};
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 = 5 * cellSize + 4 * cellMargin; // Total height of 5 rows with margins
var gridStartX = (2048 - totalGridWidth) / 2 - 200; // Shift the 4x5 grid to the left
var gridStartY = 600;
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;
// Create lane backgrounds for 4x5 grid
for (var col = 0; col < 4; col++) {
for (var row = 0; row < 5; row++) {
var cellBack = LK.getAsset('cell', {
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);
}
}
// Highlight middle row (winning line) - row 2 in 4x5 grid
var winLine = LK.getAsset('cell', {
width: totalGridWidth,
// Width for 4 columns
height: 8,
color: 0xffd700,
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.7
});
winLine.x = gridStartX + totalGridWidth / 2; // Center on grid
winLine.y = gridStartY + 2 * (cellSize + cellMargin) + cellSize / 2; // Middle row (row 2 of 5)
game.addChild(winLine);
// 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);
function updateScore() {
scoreTxt.setText('Score: ' + LK.getScore());
}
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() {
// Staggered spawning for authentic slot machine feel
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;
// Find the lowest available position in this lane
var targetRow = 0;
for (var row = 4; row >= 0; row--) {
var occupied = false;
for (var j = 0; j < dropShapes.length; j++) {
if (dropShapes[j].lane === laneIndex && dropShapes[j].row === row) {
occupied = true;
break;
}
}
if (!occupied) {
targetRow = row;
break;
}
}
var targetY = gridStartY + targetRow * (cellSize + cellMargin) + cellSize / 2;
shape.startDrop(laneIndex, gridStartY - 100, targetY);
// Add initial scale animation
shape.scaleX = 0.5;
shape.scaleY = 0.5;
tween(shape, {
scaleX: 1.0,
scaleY: 1.0
}, {
duration: 300,
easing: tween.bounceOut
});
game.addChild(shape);
dropShapes.push(shape);
}, i * 150); // Stagger by 150ms per lane
})(i);
}
}
function checkMatches() {
// Check middle row (row 2) for matches
var middleRowShapes = [];
for (var i = 0; i < dropShapes.length; i++) {
if (dropShapes[i].row === 2) {
middleRowShapes.push(dropShapes[i]);
}
}
if (middleRowShapes.length < 3) return;
// Count shapes by type and color
var shapeCount = {};
var colorCount = {};
var shapeColorCount = {};
for (var i = 0; i < middleRowShapes.length; i++) {
var shape = middleRowShapes[i];
shapeCount[shape.shapeForm] = (shapeCount[shape.shapeForm] || 0) + 1;
colorCount[shape.color] = (colorCount[shape.color] || 0) + 1;
shapeColorCount[shape.color + shape.shapeForm] = (shapeColorCount[shape.color + shape.shapeForm] || 0) + 1;
}
var points = 0;
var matched = false;
// Check for 4 same shapes + colors = 1000 points
for (var key in shapeColorCount) {
if (shapeColorCount[key] === 4) {
points = 1000;
matched = true;
break;
}
}
// Check for 4 same shapes = 100 points
if (!matched) {
for (var key in shapeCount) {
if (shapeCount[key] === 4) {
points = 100;
matched = true;
break;
}
}
}
// Check for 3 same shapes + colors = 300 points
if (!matched) {
for (var key in shapeColorCount) {
if (shapeColorCount[key] === 3) {
points = 300;
matched = true;
break;
}
}
}
// Check for 3 same shapes = 50 points
if (!matched) {
for (var key in shapeCount) {
if (shapeCount[key] === 3) {
points = 50;
matched = true;
break;
}
}
}
if (matched) {
LK.setScore(LK.getScore() + points);
updateScore();
LK.getSound('scoreMatch').play();
// Enhanced visual feedback for wins
var flashColor = points >= 1000 ? 0xffd700 : points >= 300 ? 0xff6600 : 0xffffff;
for (var i = 0; i < middleRowShapes.length; i++) {
var shape = middleRowShapes[i];
LK.effects.flashObject(shape, flashColor, 1000);
// Add pulsing animation for winning shapes
tween(shape, {
scaleX: 1.3,
scaleY: 1.3
}, {
duration: 300,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(shape, {
scaleX: 1.0,
scaleY: 1.0
}, {
duration: 200
});
}
});
}
// Animate score text on big wins
if (points >= 300) {
tween(scoreTxt, {
scaleX: 1.2,
scaleY: 1.2
}, {
duration: 200,
onFinish: function onFinish() {
tween(scoreTxt, {
scaleX: 1.0,
scaleY: 1.0
}, {
duration: 200
});
}
});
}
}
}
function cleanupOffscreenShapes() {
for (var i = dropShapes.length - 1; i >= 0; i--) {
var shape = dropShapes[i];
// Clean up shapes that go beyond the bottom of the 4x5 grid
if (shape.y > gridStartY + 5 * (cellSize + cellMargin) + cellSize / 2) {
shape.destroy();
dropShapes.splice(i, 1);
}
}
}
var lastLeverPulled = false;
game.update = function () {
// Check if lever was pulled
var currentLeverPulled = lever.isPulled;
if (!lastLeverPulled && currentLeverPulled) {
spawnShapes();
}
lastLeverPulled = currentLeverPulled;
// 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 === 2 && !dropShapes[i].checked) {
dropShapes[i].checked = true;
hasNewlyStoppedShapes = true;
}
}
if (hasNewlyStoppedShapes) {
checkMatches();
}
}
cleanupOffscreenShapes();
};
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