User prompt
Kapıyı açınca 2 odaya geçelim
User prompt
Kutuya iki kere tıklayınca açılsın
User prompt
Levye kapının yanında olsun
User prompt
Kapı 3 anahtarı yerine koyunca açılsın
User prompt
Suya tıklayınca 2 anahtar çıksın
User prompt
Birazcık daha zor olsun
User prompt
Oyunu Türkçe yazılar ekle
Code edit (1 edits merged)
Please save this source code
User prompt
Time Loop Escape Room
Initial prompt
Zamanda Sıkışmış Kaçış Odası (Escape Room) Konu: Her başarısızlıkta zaman geri sarılıyor ama ortam değişiyor. İnteraktif objeler, hafif hikâye anlatımı ve fizik bulmacaları ekleyebilirsin.
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1"); /**** * Classes ****/ var CombinationLock = Container.expand(function (x, y, correctSeq) { var self = Container.call(this); self.correctSequence = correctSeq; self.currentSequence = []; self.maxLength = 4; var graphics = self.attachAsset('button', { anchorX: 0.5, anchorY: 0.5 }); graphics.tint = 0x4444ff; self.x = x; self.y = y; self.addToSequence = function (value) { self.currentSequence.push(value); if (self.currentSequence.length > self.maxLength) { self.currentSequence.shift(); } showMessage("Kombinasyon: " + self.currentSequence.join('-')); }; self.checkSequence = function () { if (self.currentSequence.length === self.correctSequence.length) { for (var i = 0; i < self.currentSequence.length; i++) { if (self.currentSequence[i] !== self.correctSequence[i]) { return false; } } return true; } return false; }; self.reset = function () { self.currentSequence = []; }; self.down = function (x, y, obj) { self.addToSequence(1); }; return self; }); var Door = Container.expand(function (x, y) { var self = Container.call(this); var graphics = self.attachAsset('door', { anchorX: 0.5, anchorY: 0.5 }); self.x = x; self.y = y; self.isLocked = true; self.tryOpen = function () { if (self.isLocked) { showMessage("Kapı kilitli. Bir anahtara ihtiyacınız var!"); return false; } else { showMessage("Kapı açılıyor! Kaçtınız!"); LK.getSound('success').play(); return true; } }; self.unlock = function () { self.isLocked = false; graphics.tint = 0x00ff00; LK.effects.flashObject(self, 0xffffff, 1000); showMessage("Kapı kilidi açıldı!"); }; self.down = function (x, y, obj) { if (self.tryOpen()) { victory(); } }; return self; }); var InteractiveObject = Container.expand(function (type, x, y, data) { var self = Container.call(this); self.objectType = type; self.objectData = data || {}; self.isExamined = false; self.isUsed = false; self.requiredSequence = data ? data.requiredSequence : null; var graphics = self.attachAsset(type, { anchorX: 0.5, anchorY: 0.5 }); self.x = x; self.y = y; self.examine = function () { self.isExamined = true; LK.effects.flashObject(self, 0xffffff, 500); LK.getSound('click').play(); if (self.objectType === 'note') { showMessage("Notta yazıyor: '" + self.objectData.text + "'"); } else if (self.objectType === 'key') { showMessage("Altın bir anahtar. Bir şeyleri açabilir..."); } else if (self.objectType === 'box') { if (self.objectData.isLocked && currentLoop > 2) { showMessage("Kutu kilitli. Doğru sırayla düğmelere basın!"); } else { showMessage("Ahşap bir kutu. Ağır hissediliyor."); } } else if (self.objectType === 'button') { showMessage("Renkli bir düğme. Sırası önemli olabilir..."); } else if (self.objectType === 'lever') { showMessage("Metal bir kol. Çekilebilir."); } else if (self.objectType === 'water') { if (!self.objectData.hasSpawnedKeys) { // Spawn 2 keys when water is clicked var key1 = new InteractiveObject('key', self.x - 100, self.y - 100); var key2 = new InteractiveObject('key', self.x + 100, self.y - 100); gameObjects.push(key1); gameObjects.push(key2); game.addChild(key1); game.addChild(key2); self.objectData.hasSpawnedKeys = true; showMessage("Sudan 2 anahtar çıktı!"); LK.effects.flashObject(self, 0xffffff, 1000); } else { showMessage("Su artık boş görünüyor..."); } } }; self.use = function () { if (self.objectType === 'button') { // Add penalty for wrong sequence if (self.requiredSequence && combination.length === 0) { combination.push(self.objectData.buttonId); } else if (self.requiredSequence && combination.length < self.requiredSequence.length) { combination.push(self.objectData.buttonId); if (combination[combination.length - 1] !== self.requiredSequence[combination.length - 1]) { penalties++; startTime -= wrongActionPenalty; showMessage("Yanlış sıra! " + wrongActionPenalty / 1000 + " saniye ceza!"); LK.effects.flashScreen(0xff0000, 500); combination = []; } } self.isUsed = !self.isUsed; graphics.tint = self.isUsed ? 0x00ff00 : 0xff4444; LK.getSound('click').play(); showMessage(self.isUsed ? "Düğme etkinleştirildi!" : "Düğme devre dışı!"); } else if (self.objectType === 'lever') { self.isUsed = !self.isUsed; graphics.rotation = self.isUsed ? Math.PI / 4 : 0; LK.getSound('click').play(); showMessage(self.isUsed ? "Kol çekildi!" : "Kol sıfırlandı!"); } }; self.down = function (x, y, obj) { if (self.objectType === 'key') { draggedObject = self; } else { self.examine(); } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x1a1a1a }); /**** * Game Code ****/ var currentLoop = storage.currentLoop || 0; var baseTimeLimit = 60000; // 60 seconds var timeLimit = Math.max(30000, baseTimeLimit - currentLoop * 5000); // Reduce by 5s each loop, minimum 30s var startTime = 0; var gameObjects = []; var draggedObject = null; var door = null; var messageText = null; var timerText = null; var loopText = null; var isGameActive = true; var combination = []; var correctCombination = []; var wrongActionPenalty = 5000; // 5 second penalty var penalties = 0; var keysCollected = 0; var requiredKeys = 3; // UI Setup var titleText = new Text2('Zamanda Sıkışmış Kaçış Odası', { size: 80, fill: '#ffffff' }); titleText.anchor.set(0.5, 0); LK.gui.top.addChild(titleText); timerText = new Text2('Süre: 60s', { size: 60, fill: '#ffff00' }); timerText.anchor.set(1, 0); LK.gui.topRight.addChild(timerText); loopText = new Text2('Döngü: ' + (currentLoop + 1), { size: 50, fill: '#00ffff' }); loopText.anchor.set(0, 0); loopText.x = 120; LK.gui.topLeft.addChild(loopText); messageText = new Text2('', { size: 50, fill: '#ffffff' }); messageText.anchor.set(0.5, 1); LK.gui.bottom.addChild(messageText); function showMessage(text) { messageText.setText(text); messageText.alpha = 1; tween(messageText, { alpha: 0 }, { duration: 3000 }); } function initializeRoom() { // Clear existing objects for (var i = gameObjects.length - 1; i >= 0; i--) { gameObjects[i].destroy(); } gameObjects = []; // Create door door = new Door(2048 - 200, 2732 / 2); game.addChild(door); // Create objects based on loop number var keyX = 300 + currentLoop * 50 % 400; var keyY = 2000 + currentLoop * 30 % 200; var key = new InteractiveObject('key', keyX, keyY); gameObjects.push(key); game.addChild(key); // Box position changes each loop var boxX = 500 + currentLoop * 100 % 600; var boxY = 1500 + currentLoop * 80 % 400; var box = new InteractiveObject('box', boxX, boxY, { containsKey: currentLoop > 0 }); gameObjects.push(box); game.addChild(box); // Button appears after first loop if (currentLoop > 0) { var button = new InteractiveObject('button', 1500, 1800, { buttonId: 1 }); gameObjects.push(button); game.addChild(button); } // Lever appears after second loop if (currentLoop > 1) { var lever = new InteractiveObject('lever', 1200, 1600); gameObjects.push(lever); game.addChild(lever); } // Multiple buttons with combination system (loop 3+) if (currentLoop > 2) { correctCombination = [1, 3, 2, 4]; // Correct sequence combination = []; // Reset combination var buttonPositions = [{ x: 1400, y: 1600 }, { x: 1600, y: 1600 }, { x: 1400, y: 1800 }, { x: 1600, y: 1800 }]; for (var b = 0; b < 4; b++) { var colorButton = new InteractiveObject('button', buttonPositions[b].x, buttonPositions[b].y, { buttonId: b + 1, requiredSequence: correctCombination }); var graphics = colorButton.children[0]; var colors = [0xff4444, 0x44ff44, 0x4444ff, 0xffff44]; graphics.tint = colors[b]; gameObjects.push(colorButton); game.addChild(colorButton); } } // Water object that spawns keys when clicked var water = new InteractiveObject('water', 600, 800, { hasSpawnedKeys: false }); gameObjects.push(water); game.addChild(water); // Note with different text each loop var noteTexts = ["Anahtar kapıyı açar...", "Kutu sırları gizliyor...", "Düğmeler ve kollar odayı kontrol ediyor...", "Sıra önemli: Kırmızı, Mavi, Yeşil, Sarı...", "Her hata zaman kaybettirir..."]; var note = new InteractiveObject('note', 800, 1200, { text: noteTexts[Math.min(currentLoop, noteTexts.length - 1)] }); gameObjects.push(note); game.addChild(note); startTime = Date.now(); isGameActive = true; showMessage("Döngü " + (currentLoop + 1) + " - Kaçış yolu bulun!"); } function resetLoop() { currentLoop++; storage.currentLoop = currentLoop; timeLimit = Math.max(30000, baseTimeLimit - currentLoop * 5000); // Update time limit combination = []; penalties = 0; keysCollected = 0; LK.getSound('reset').play(); LK.effects.flashScreen(0xff0000, 1000); loopText.setText('Döngü: ' + (currentLoop + 1)); // Reset after a short delay LK.setTimeout(function () { initializeRoom(); }, 1000); } function victory() { isGameActive = false; showMessage("Kapı açıldı! Hangi odaya girmek istiyorsunuz?"); showRoomSelection(); } function showRoomSelection() { // Create room selection buttons var room1Button = new InteractiveObject('button', 1024 - 200, 1366, { roomId: 1 }); var room2Button = new InteractiveObject('button', 1024 + 200, 1366, { roomId: 2 }); // Style the buttons differently room1Button.children[0].tint = 0x00ff00; room2Button.children[0].tint = 0x0000ff; gameObjects.push(room1Button); gameObjects.push(room2Button); game.addChild(room1Button); game.addChild(room2Button); // Add room labels var room1Label = new Text2('Oda 1', { size: 40, fill: '#ffffff' }); room1Label.anchor.set(0.5, 0.5); room1Label.x = 1024 - 200; room1Label.y = 1466; game.addChild(room1Label); var room2Label = new Text2('Oda 2', { size: 40, fill: '#ffffff' }); room2Label.anchor.set(0.5, 0.5); room2Label.x = 1024 + 200; room2Label.y = 1466; game.addChild(room2Label); // Override down function to handle room selection room1Button.down = function (x, y, obj) { enterRoom(1); }; room2Button.down = function (x, y, obj) { enterRoom(2); }; } function enterRoom(roomNumber) { showMessage("Oda " + roomNumber + " seçildi!"); // Reset progress storage.currentLoop = 0; currentLoop = 0; LK.setTimeout(function () { LK.showYouWin(); }, 2000); } function checkPuzzleCompletion() { // Progressive difficulty system if (currentLoop === 0) { // First loop: just need key return true; } else if (currentLoop === 1) { // Second loop: need button pressed for (var i = 0; i < gameObjects.length; i++) { if (gameObjects[i].objectType === 'button' && gameObjects[i].isUsed) { return true; } } return false; } else if (currentLoop === 2) { // Third loop: need button and lever var buttonPressed = false; var leverPulled = false; for (var i = 0; i < gameObjects.length; i++) { if (gameObjects[i].objectType === 'button' && gameObjects[i].isUsed) { buttonPressed = true; } if (gameObjects[i].objectType === 'lever' && gameObjects[i].isUsed) { leverPulled = true; } } return buttonPressed && leverPulled; } else { // Later loops: need correct button combination if (combination.length === correctCombination.length) { for (var i = 0; i < combination.length; i++) { if (combination[i] !== correctCombination[i]) { return false; } } return true; } return false; } } game.move = function (x, y, obj) { if (draggedObject) { draggedObject.x = x; draggedObject.y = y; // Check if key is dropped on door if (draggedObject.objectType === 'key' && door.intersects(draggedObject)) { if (checkPuzzleCompletion()) { keysCollected++; draggedObject.destroy(); // Remove key from gameObjects array for (var i = 0; i < gameObjects.length; i++) { if (gameObjects[i] === draggedObject) { gameObjects.splice(i, 1); break; } } draggedObject = null; if (keysCollected >= requiredKeys) { door.unlock(); showMessage("3 anahtar toplandı! Kapı açılıyor!"); } else { showMessage(requiredKeys - keysCollected + " anahtar daha gerekiyor!"); } } else { showMessage("Önce başka bir şey yapılması gerekiyor..."); } } } }; game.up = function (x, y, obj) { draggedObject = null; }; game.down = function (x, y, obj) { // Handle clicking on objects for (var i = 0; i < gameObjects.length; i++) { if (gameObjects[i].objectType === 'button' || gameObjects[i].objectType === 'lever') { var objPos = gameObjects[i].toGlobal({ x: 0, y: 0 }); var gamePos = game.toLocal(objPos); var distance = Math.sqrt(Math.pow(x - gamePos.x, 2) + Math.pow(y - gamePos.y, 2)); if (distance < 100) { gameObjects[i].use(); break; } } } }; game.update = function () { if (!isGameActive) return; var currentTime = Date.now(); var elapsed = currentTime - startTime; var remaining = Math.max(0, timeLimit - elapsed); var timerDisplay = 'Süre: ' + Math.ceil(remaining / 1000) + 's'; if (penalties > 0) { timerDisplay += ' (Ceza: ' + penalties + ')'; } timerText.setText(timerDisplay); if (remaining <= 0) { isGameActive = false; showMessage("Süre doldu! Oda sıfırlanıyor..."); LK.setTimeout(function () { resetLoop(); }, 2000); } }; // Initialize first room initializeRoom();
===================================================================
--- original.js
+++ change.js
@@ -98,26 +98,12 @@
showMessage("Notta yazıyor: '" + self.objectData.text + "'");
} else if (self.objectType === 'key') {
showMessage("Altın bir anahtar. Bir şeyleri açabilir...");
} else if (self.objectType === 'box') {
- if (!self.objectData.clickCount) {
- self.objectData.clickCount = 0;
- }
- self.objectData.clickCount++;
- if (self.objectData.clickCount >= 2) {
- if (!self.objectData.hasOpened) {
- self.objectData.hasOpened = true;
- var key = new InteractiveObject('key', self.x + 50, self.y + 50);
- gameObjects.push(key);
- game.addChild(key);
- showMessage("Kutu açıldı! İçinden bir anahtar çıktı!");
- LK.effects.flashObject(self, 0x00ff00, 1000);
- graphics.tint = 0x00ff00;
- } else {
- showMessage("Kutu zaten açılmış.");
- }
+ if (self.objectData.isLocked && currentLoop > 2) {
+ showMessage("Kutu kilitli. Doğru sırayla düğmelere basın!");
} else {
- showMessage("Kutu sarsıldı... Bir kez daha tıklayın.");
+ showMessage("Ahşap bir kutu. Ağır hissediliyor.");
}
} else if (self.objectType === 'button') {
showMessage("Renkli bir düğme. Sırası önemli olabilir...");
} else if (self.objectType === 'lever') {
@@ -336,9 +322,53 @@
}, 1000);
}
function victory() {
isGameActive = false;
- showMessage("Tebrikler! " + (currentLoop + 1) + " döngüde kaçtınız!");
+ showMessage("Kapı açıldı! Hangi odaya girmek istiyorsunuz?");
+ showRoomSelection();
+}
+function showRoomSelection() {
+ // Create room selection buttons
+ var room1Button = new InteractiveObject('button', 1024 - 200, 1366, {
+ roomId: 1
+ });
+ var room2Button = new InteractiveObject('button', 1024 + 200, 1366, {
+ roomId: 2
+ });
+ // Style the buttons differently
+ room1Button.children[0].tint = 0x00ff00;
+ room2Button.children[0].tint = 0x0000ff;
+ gameObjects.push(room1Button);
+ gameObjects.push(room2Button);
+ game.addChild(room1Button);
+ game.addChild(room2Button);
+ // Add room labels
+ var room1Label = new Text2('Oda 1', {
+ size: 40,
+ fill: '#ffffff'
+ });
+ room1Label.anchor.set(0.5, 0.5);
+ room1Label.x = 1024 - 200;
+ room1Label.y = 1466;
+ game.addChild(room1Label);
+ var room2Label = new Text2('Oda 2', {
+ size: 40,
+ fill: '#ffffff'
+ });
+ room2Label.anchor.set(0.5, 0.5);
+ room2Label.x = 1024 + 200;
+ room2Label.y = 1466;
+ game.addChild(room2Label);
+ // Override down function to handle room selection
+ room1Button.down = function (x, y, obj) {
+ enterRoom(1);
+ };
+ room2Button.down = function (x, y, obj) {
+ enterRoom(2);
+ };
+}
+function enterRoom(roomNumber) {
+ showMessage("Oda " + roomNumber + " seçildi!");
// Reset progress
storage.currentLoop = 0;
currentLoop = 0;
LK.setTimeout(function () {