User prompt
temas etiğim kişi ölsün
User prompt
temas etiğim kşi ölsün 10 saniye sonra veya üstünde öldürebilelim
User prompt
bacgraund ekle
User prompt
oyuncunun hını 20 yap
User prompt
oyuncunun hızını düşür
User prompt
karakter mauseyi takip etsin
User prompt
yeni eklediğin şey gözüksün ve yeşil olsun
User prompt
yeni bir şey oluştur ve onu ekranın sağ alt köşesine ekle
User prompt
bilmem i emergencyBtn nin altına ekle
User prompt
killBtn yi emergencyBtn nin altına ekle
User prompt
killBtn karakterin altında olsun ve emergencyBtn eski yerine geri dönsün
User prompt
emergencyBtnyi oyuncunun altında olsun
User prompt
killBtn ekranın sağ alt köşesine ekle
User prompt
Kill butonuna basan oyuncu öldürme özelliği kazanacak ve Kill butonuna bastıktan sonra bu özelliği sayesinde temas ettiği oyuncuyu öldürebilecek
User prompt
Assetteki Kill görselini buton olarak sağ alt köşeye ekle
User prompt
Hatayı düzelt
Code edit (1 edits merged)
Please save this source code
User prompt
Kill butonunu sil
User prompt
Please fix the bug: 'Can't find variable: EmergencyBtn' in or related to this line: 'emergencyBtn = new EmergencyBtn();' Line Number: 317
User prompt
Please fix the bug: 'Can't find variable: EmergencyBtn' in or related to this line: 'emergencyBtn = new EmergencyBtn();' Line Number: 317
User prompt
Please fix the bug: 'Can't find variable: SabotageNode' in or related to this line: 'var s = new SabotageNode();' Line Number: 290
User prompt
Please fix the bug: 'Can't find variable: TaskNode' in or related to this line: 'var t = new TaskNode();' Line Number: 257
User prompt
Please fix the bug: 'Can't find variable: Player' in or related to this line: 'var p = new Player();' Line Number: 149
User prompt
Please fix the bug: 'Can't find variable: KillBtn' in or related to this line: 'game.killBtn = new KillBtn();' Line Number: 45
User prompt
Asset teki Kill resmini buton olarak sağ alt köşeye ekle
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ // If killBtn exists, it will follow the player in the update loop // KillBtn class for Kill button asset var KillBtn = Container.expand(function () { var self = Container.call(this); // Attach Kill asset, anchor at center self.asset = self.attachAsset('Kill', { anchorX: 0.5, anchorY: 0.5 }); // Optionally, set size or other properties if needed self.width = self.asset.width; self.height = self.asset.height; // No interaction logic here; button is just a visual that follows the player return self; }); // Player class var Player = Container.expand(function () { var self = Container.call(this); // Default properties self.playerId = null; self.name = ''; self.isImpostor = false; self.isAlive = true; self.isLocal = false; self.isVoted = false; self.voteTarget = null; self.deadBody = null; // Attach crewmate or impostor asset based on role self.setRole = function (isImpostor) { self.isImpostor = isImpostor; // Remove previous asset if any if (self.asset) { self.removeChild(self.asset); } // Use impostor or crewmate asset var assetId = isImpostor ? 'impostor' : 'crewmate'; // Colorize based on name var colorMap = { Red: 0xd83318, Blue: 0x3b5eea, Green: 0x2ecc40, Yellow: 0xf9d423, Pink: 0xff69b4, Orange: 0xffa500, Cyan: 0x15ffff, Lime: 0x83de44, Purple: 0x800080, Brown: 0x8b4513 }; var tint = colorMap[self.name] !== undefined ? colorMap[self.name] : 0xffffff; self.asset = self.attachAsset(assetId, { anchorX: 0.5, anchorY: 0.5 }); self.asset.tint = tint; }; // Show player name above head self.showName = function () { if (self.nameTxt) { self.removeChild(self.nameTxt); } self.nameTxt = new Text2(self.name, { size: 48, fill: "#fff" }); self.nameTxt.anchor.set(0.5, 1.2); self.addChild(self.nameTxt); }; // Show dead body self.showDead = function () { self.isAlive = false; self.visible = false; if (!self.deadBody) { self.deadBody = LK.getAsset('deadbody', { anchorX: 0.5, anchorY: 0.5 }); self.deadBody.x = self.x; self.deadBody.y = self.y; self.deadBody.visible = true; if (self.parent) { self.parent.addChild(self.deadBody); } } else { self.deadBody.x = self.x; self.deadBody.y = self.y; self.deadBody.visible = true; } }; return self; }); // SabotageNode class for representing a sabotage node in the game var SabotageNode = Container.expand(function () { var self = Container.call(this); // Attach the sabotage node asset, anchor at center self.asset = self.attachAsset('sabotagenode', { anchorX: 0.5, anchorY: 0.5 }); self.width = self.asset.width; self.height = self.asset.height; self.active = false; // Optionally, you can add a visual indicator for active sabotage self.setActive = function (isActive) { self.active = isActive; self.asset.alpha = isActive ? 0.5 : 1; }; return self; }); // TaskNode class for representing a task in the game var TaskNode = Container.expand(function () { var self = Container.call(this); self.taskId = null; self.ownerId = null; self.done = false; // Attach the tasknode asset, anchor at center self.asset = self.attachAsset('tasknode', { anchorX: 0.5, anchorY: 0.5 }); self.width = self.asset.width; self.height = self.asset.height; // Optionally, you can add a visual indicator for completion self.setDone = function (isDone) { self.done = isDone; self.asset.alpha = isDone ? 0.3 : 1; }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x1a1a2e }); /**** * Game Code ****/ // Place Emergency button at the bottom right corner using LK.gui.bottomRight if (emergencyBtn) { // Remove from previous parent if needed if (emergencyBtn.parent) emergencyBtn.parent.removeChild(emergencyBtn); emergencyBtn.x = 0; emergencyBtn.y = 0; LK.gui.bottomRight.addChild(emergencyBtn); emergencyBtn.visible = true; } // Removed updateKillBtn and setupKillBtn logic as killBtn now follows the player // Simple sound for meeting // Simple sound for kill // Simple sound for task complete // Voting button (red) // Voting button (blue) // Button for emergency meeting // Dead body (gray ellipse) // Sabotage node (yellow box) // Task node (small green box) // Crewmate and Impostor avatars (simple colored ellipses) // Game state: 'playing', 'meeting', 'voting', 'ended' game.state = 'playing'; // Game variables var playerCount = 6; // For MVP, fixed at 6 (1 impostor, 5 crewmates) var impostorCount = 1; var players = []; var tasks = []; var sabotageNodes = []; var deadBodies = []; var votingBtns = []; var votes = {}; var voteResults = {}; var meetingTimer = null; var votingTimer = null; var taskGoal = 4; // Number of tasks per crewmate var sabotageActive = false; var sabotageTimer = null; var sabotageDuration = 6000; // ms var emergencyBtn = null; var skipBtn = null; var infoTxt = null; var taskBar = null; var taskBarBg = null; var meetingCalled = false; var localPlayer = null; // Helper: Random name generator function randomName() { var names = ['Red', 'Blue', 'Green', 'Yellow', 'Pink', 'Orange', 'Cyan', 'Lime', 'Purple', 'Brown']; return names[Math.floor(Math.random() * names.length)]; } // Helper: Shuffle array function shuffle(arr) { for (var i = arr.length - 1; i > 0; i--) { var j = Math.floor(Math.random() * (i + 1)); var t = arr[i]; arr[i] = arr[j]; arr[j] = t; } return arr; } // Initialize players function setupPlayers() { players = []; var roles = []; for (var i = 0; i < impostorCount; i++) roles.push(true); for (var i = impostorCount; i < playerCount; i++) roles.push(false); // Always assign impostor to local player (player 0) roles = []; roles[0] = true; // local player is impostor for (var i = 1; i < playerCount; i++) roles[i] = false; shuffle(roles.slice(1)); // shuffle only the crewmates for variety // Prepare a unique name pool so each player gets a unique color var namePool = ['Red', 'Blue', 'Green', 'Yellow', 'Pink', 'Orange', 'Cyan', 'Lime', 'Purple', 'Brown']; for (var i = 0; i < playerCount; i++) { var p = new Player(); p.playerId = i; // Assign a unique name/color to each player var nameIdx = Math.floor(Math.random() * namePool.length); p.name = namePool[nameIdx]; namePool.splice(nameIdx, 1); // Remove used name so no duplicates p.setRole(i === 0); // local player is impostor, others are crewmates p.isAlive = true; // Spread players in larger world p.x = 600 + i % 3 * 1200; p.y = 800 + Math.floor(i / 3) * 1200; p.showName(); p.isLocal = i === 0; // For MVP, player 0 is local if (p.isLocal) { localPlayer = p; } // Mark impostor visually for local player (for debug, can be removed in production) if (p.isImpostor && p.isLocal) { // Optionally, you could show a message or highlight // infoTxt.setText('You are the Impostor!'); } players.push(p); game.addChild(p); } game.localPlayer = localPlayer; } // Initialize tasks function setupTasks() { tasks = []; var worldWidth = 4096; var spacing = worldWidth / (taskGoal + 1); for (var i = 0; i < taskGoal; i++) { var t = new TaskNode(); t.taskId = i; t.ownerId = localPlayer.playerId; t.x = spacing * (i + 1); t.y = 600; tasks.push(t); game.addChild(t); } } // Initialize sabotage nodes function setupSabotage() { sabotageNodes = []; for (var i = 0; i < 2; i++) { var s = new SabotageNode(); s.x = 800 + i * 2400; s.y = 3400; sabotageNodes.push(s); game.addChild(s); } } // Emergency meeting button function setupEmergencyBtn() { emergencyBtn = new EmergencyBtn(); emergencyBtn.x = 2048 / 2; emergencyBtn.y = 2732 - 200; game.addChild(emergencyBtn); } // Task bar function setupTaskBar() { if (!taskBarBg) { taskBarBg = LK.getAsset('tasknode', { anchorX: 0.5, anchorY: 0 }); taskBarBg.width = 800; taskBarBg.height = 40; taskBarBg.tint = 0x222222; taskBarBg.x = 2048 / 2; taskBarBg.y = 80; LK.gui.top.addChild(taskBarBg); } if (!taskBar) { taskBar = LK.getAsset('tasknode', { anchorX: 0.5, anchorY: 0 }); taskBar.width = 0; taskBar.height = 40; taskBar.tint = 0x83de44; taskBar.x = 2048 / 2; taskBar.y = 80; LK.gui.top.addChild(taskBar); } } // Info text function setupInfoTxt() { if (!infoTxt) { infoTxt = new Text2('', { size: 64, fill: "#fff" }); infoTxt.anchor.set(0.5, 0); LK.gui.top.addChild(infoTxt); infoTxt.x = 2048 / 2; infoTxt.y = 160; } } // Voting skip button function setupSkipBtn() { skipBtn = new VoteBtn(); skipBtn.x = 2048 / 2; skipBtn.y = 2732 - 300; skipBtn.visible = false; game.addChild(skipBtn); } // Update task bar function updateTaskBar() { var done = 0; for (var i = 0; i < tasks.length; i++) { if (tasks[i].done) done++; } var percent = done / taskGoal; taskBar.width = 800 * percent; } // Complete a task game.completeTask = function (task) { updateTaskBar(); // Check win var allDone = true; for (var i = 0; i < tasks.length; i++) { if (!tasks[i].done) allDone = false; } if (allDone) { // If all tasks are done, impostor wins (crewmates lose) gameEnd('impostors'); } }; // Sabotage triggered game.sabotageTriggered = function (node) { sabotageActive = true; sabotageTimer = LK.setTimeout(function () { sabotageActive = false; node.active = false; node.asset.alpha = 1; // If sabotage not fixed, impostors win gameEnd('impostors'); }, sabotageDuration); // Show info infoTxt.setText('Sabotage! Fix it!'); tween(infoTxt, { alpha: 1 }, { duration: 200 }); }; // Call emergency meeting game.callMeeting = function () { if (meetingCalled) return; meetingCalled = true; LK.getSound('meeting').play(); game.state = 'meeting'; infoTxt.setText('Emergency Meeting!'); // Remove all dead bodies for (var i = 0; i < players.length; i++) { if (!players[i].isAlive && players[i].deadBody) { players[i].deadBody.visible = false; } } // After 2 seconds, go to voting meetingTimer = LK.setTimeout(function () { game.startVoting(); }, 2000); }; // Start voting phase game.startVoting = function () { game.state = 'voting'; infoTxt.setText('Vote: Who is the Impostor?'); // Show voting buttons for each player for (var i = 0; i < votingBtns.length; i++) { votingBtns[i].destroy(); } votingBtns = []; var alivePlayers = []; for (var i = 0; i < players.length; i++) { if (players[i].isAlive) alivePlayers.push(players[i]); } var spacing = 2048 / (alivePlayers.length + 1); for (var i = 0; i < alivePlayers.length; i++) { var btn = new Container(); var asset = btn.attachAsset(alivePlayers[i].isImpostor ? 'votebtnred' : 'votebtn', { anchorX: 0.5, anchorY: 0.5 }); btn.x = spacing * (i + 1); btn.y = 1200; var txt = new Text2(alivePlayers[i].name, { size: 48, fill: "#fff" }); txt.anchor.set(0.5, 0.5); btn.addChild(txt); btn.down = function (targetPlayer) { return function (x, y, obj) { if (game.state === 'voting' && !game.localPlayer.isVoted && targetPlayer.isAlive && targetPlayer !== game.localPlayer) { game.voteFor(targetPlayer); } }; }(alivePlayers[i]); votingBtns.push(btn); game.addChild(btn); } // Show skip button skipBtn.visible = true; // Voting timer (auto skip after 10s) votingTimer = LK.setTimeout(function () { if (!game.localPlayer.isVoted) { game.voteFor(null); } }, 10000); }; // Vote for a player (or skip) game.voteFor = function (targetPlayer) { if (game.localPlayer.isVoted) return; game.localPlayer.isVoted = true; game.localPlayer.voteTarget = targetPlayer ? targetPlayer.playerId : null; LK.getSound('vote').play(); // Show confirmation infoTxt.setText('Voted!'); // Wait for all votes (MVP: AI votes randomly) var allVoted = true; for (var i = 0; i < players.length; i++) { if (players[i].isAlive && !players[i].isVoted) allVoted = false; } if (!allVoted) { // Simulate AI votes after 1s LK.setTimeout(function () { for (var i = 0; i < players.length; i++) { if (players[i].isAlive && !players[i].isVoted) { // AI votes randomly (not self) var choices = []; for (var j = 0; j < players.length; j++) { if (players[j].isAlive && players[j] !== players[i]) choices.push(players[j]); } if (Math.random() < 0.2) { // 20% skip players[i].voteTarget = null; } else { players[i].voteTarget = choices[Math.floor(Math.random() * choices.length)].playerId; } players[i].isVoted = true; } } game.tallyVotes(); }, 1000); } else { game.tallyVotes(); } }; // Tally votes and resolve game.tallyVotes = function () { // Clear voting timer if (votingTimer) { LK.clearTimeout(votingTimer); votingTimer = null; } // Hide voting buttons for (var i = 0; i < votingBtns.length; i++) { votingBtns[i].destroy(); } votingBtns = []; skipBtn.visible = false; // Count votes var counts = {}; var skipCount = 0; for (var i = 0; i < players.length; i++) { if (players[i].isAlive) { var v = players[i].voteTarget; if (v === null) { skipCount++; } else { if (!counts[v]) counts[v] = 0; counts[v]++; } } } // Find max var maxVotes = 0; var maxPlayerId = null; for (var pid in counts) { if (counts[pid] > maxVotes) { maxVotes = counts[pid]; maxPlayerId = parseInt(pid); } } // If tie or skip, no one ejected var tie = false; var totalVotes = 0; for (var pid in counts) { if (counts[pid] === maxVotes && parseInt(pid) !== maxPlayerId) tie = true; totalVotes += counts[pid]; } if (skipCount >= maxVotes || tie || maxPlayerId === null) { infoTxt.setText('No one was ejected.'); } else { // Eject player var ejected = null; for (var i = 0; i < players.length; i++) { if (players[i].playerId === maxPlayerId) { ejected = players[i]; break; } } if (ejected) { ejected.showDead(); infoTxt.setText(ejected.name + ' was ejected!'); // Check win var impostorsLeft = 0, crewmatesLeft = 0; for (var i = 0; i < players.length; i++) { if (players[i].isAlive) { if (players[i].isImpostor) impostorsLeft++;else crewmatesLeft++; } } if (impostorsLeft === 0) { gameEnd('crewmates'); return; } if (impostorsLeft >= crewmatesLeft) { gameEnd('impostors'); return; } } } // Reset votes for (var i = 0; i < players.length; i++) { players[i].isVoted = false; players[i].voteTarget = null; } // Resume play after 2s LK.setTimeout(function () { infoTxt.setText(''); game.state = 'playing'; meetingCalled = false; }, 2000); }; // End game function gameEnd(winner) { game.state = 'ended'; if (winner === 'crewmates') { LK.showYouWin(); } else { // If local player is impostor, show win, else show game over if (game.localPlayer && game.localPlayer.isImpostor) { LK.showYouWin(); } else { LK.showGameOver(); } } } // Kill action (impostor only) function tryKill(target) { if (!game.localPlayer.isImpostor || !target.isAlive || !game.localPlayer.isAlive) return; // Must be close var dx = target.x - game.localPlayer.x; var dy = target.y - game.localPlayer.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist < 200) { target.showDead(); LK.getSound('kill').play(); // Show dead body if (target.deadBody) target.deadBody.visible = true; // Check win var impostorsLeft = 0, crewmatesLeft = 0; for (var i = 0; i < players.length; i++) { if (players[i].isAlive) { if (players[i].isImpostor) impostorsLeft++;else crewmatesLeft++; } } if (impostorsLeft === 0) { gameEnd('crewmates'); return; } if (impostorsLeft >= crewmatesLeft) { gameEnd('impostors'); return; } } } // Move handler (drag local player) var dragNode = null; function handleMove(x, y, obj) { if (game.state !== 'playing') return; if (dragNode) { // Clamp to expanded game area var worldWidth = 4096; var worldHeight = 4096; var nx = Math.max(100, Math.min(worldWidth - 100, x)); var ny = Math.max(200, Math.min(worldHeight - 200, y)); // Reduce movement speed for local player if (dragNode === game.localPlayer) { // Only move a fraction toward the target per move event var speed = 18; // Lower value = slower movement var dx = nx - dragNode.x; var dy = ny - dragNode.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist > speed) { dragNode.x += dx / dist * speed; dragNode.y += dy / dist * speed; } else { dragNode.x = nx; dragNode.y = ny; } } else { dragNode.x = nx; dragNode.y = ny; } // Camera follow: center camera on local player, clamp to world bounds if (game.localPlayer) { var camX = Math.max(0, Math.min(worldWidth - 2048, game.localPlayer.x - 1024)); var camY = Math.max(0, Math.min(worldHeight - 2732, game.localPlayer.y - 1366)); game.x = -camX; game.y = -camY; } } // If impostor, check for kill if (game.state === 'playing' && game.localPlayer && game.localPlayer.isImpostor && game.localPlayer.isAlive) { for (var i = 0; i < players.length; i++) { var target = players[i]; if (target !== game.localPlayer && target.isAlive && !target.isImpostor && game.localPlayer.intersects(target)) { tryKill(target); } } } } game.move = handleMove; // Down handler (start drag or interact) game.down = function (x, y, obj) { if (game.state !== 'playing') return; // Only drag local player if touch is on them var lp = game.localPlayer; var dx = x - lp.x; var dy = y - lp.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist < 100 && lp.isAlive) { dragNode = lp; handleMove(x, y, obj); } }; game.up = function (x, y, obj) { dragNode = null; }; // Game update loop game.update = function () { // AI players move randomly if (game.state === 'playing') { for (var i = 0; i < players.length; i++) { var p = players[i]; if (!p.isLocal && p.isAlive) { // Random walk if (LK.ticks % (60 + i * 7) === 0) { var tx = 200 + Math.random() * (2048 - 400); var ty = 500 + Math.random() * (2732 - 1000); tween(p, { x: tx, y: ty }, { duration: 1200 + Math.random() * 800, easing: tween.easeInOut }); } // AI crewmates complete tasks if (!p.isImpostor) { for (var j = 0; j < tasks.length; j++) { var t = tasks[j]; if (!t.done && t.ownerId === p.playerId) { var dx = t.x - p.x; var dy = t.y - p.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist < 120) { t.done = true; t.asset.alpha = 0.3; updateTaskBar(); } } } } // AI impostor kills if (p.isImpostor) { for (var j = 0; j < players.length; j++) { var target = players[j]; if (target !== p && target.isAlive && !target.isImpostor) { var dx = target.x - p.x; var dy = target.y - p.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist < 180 && Math.random() < 0.01) { target.showDead(); if (target.deadBody) target.deadBody.visible = true; } } } } } } } }; // Initial setup setupPlayers(); setupTasks(); setupSabotage(); setupEmergencyBtn(); setupTaskBar(); setupInfoTxt(); setupSkipBtn(); updateTaskBar();
===================================================================
--- original.js
+++ change.js
@@ -154,22 +154,8 @@
emergencyBtn.y = 0;
LK.gui.bottomRight.addChild(emergencyBtn);
emergencyBtn.visible = true;
}
-// Create Kill button if not already created
-if (!game.killBtn) {
- game.killBtn = new KillBtn();
-}
-// Place Kill button just below Emergency button at the bottom right
-if (game.killBtn) {
- // Remove from previous parent if needed
- if (game.killBtn.parent) game.killBtn.parent.removeChild(game.killBtn);
- game.killBtn.x = 0;
- // Place killBtn just below emergencyBtn (emergencyBtn height is 271.88)
- game.killBtn.y = emergencyBtn && emergencyBtn.asset ? emergencyBtn.asset.height + 32 : 320;
- LK.gui.bottomRight.addChild(game.killBtn);
- game.killBtn.visible = true;
-}
// Removed updateKillBtn and setupKillBtn logic as killBtn now follows the player
// Simple sound for meeting
// Simple sound for kill
// Simple sound for task complete
@@ -730,18 +716,8 @@
}
}
}
}
- // Make Kill button follow the local player (impostor)
- if (game.killBtn && game.localPlayer && game.localPlayer.isImpostor && game.localPlayer.isAlive) {
- // Position killBtn near the local player, offset to the right and below
- var offsetX = 120;
- var offsetY = 120;
- game.killBtn.x = game.localPlayer.x + offsetX;
- game.killBtn.y = game.localPlayer.y + offsetY;
- // Ensure killBtn is visible
- game.killBtn.visible = true;
- }
};
// Initial setup
setupPlayers();
setupTasks();