User prompt
When impostor caught me, add %20 change dodge it,when i dodge the impostor change the text to dodged! For a second
User prompt
Make impostor 2x bigger and add,left and right turning logic based on the move direction both imp and player ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Make the button a bit taller and makethe door dont be covered by the text,put it a bit down
User prompt
Counter says task %97 etc. I need to fixing generator %97 etc.
User prompt
Add a basic hitboxto tasks
User prompt
Dont use facekit or something just use normal hitbox
User prompt
Please fix the bug: 'Uncaught ReferenceError: facekit is not defined' in or related to this line: 'var alpha = facekit.getImageAlphaAt('task', imgX / self.sprite.width, imgY / self.sprite.height);' Line Number: 104
User prompt
Make realistic hitbox to tasks based on the texture
User prompt
Make task 3x bigger,and make the counter,not task,do fixing generator
User prompt
Dont teleport me to tasks,if im near to task and i touch it starts to being complete
User prompt
Make tasks starts to complete when touch it
User prompt
Make every task take 3 seconds
User prompt
Make impostor and me 2x slower
User prompt
When i go on a task add a counter that shows how many seconds to finish the task
User prompt
Add a logic that my character walks to where i touch
User prompt
Make a game that a charecter chases me,im trying to complete all 5 tasks tasks take 5-10 seconds(randomizeed in every task)if i finish all tasks a door will open and i will escape
User prompt
Delete this all game
User prompt
Reset this game
User prompt
Impostor must chase me and others
User prompt
Make impostor run to crewmates and kill them with 15 second cooldown
Code edit (1 edits merged)
Please save this source code
User prompt
Impostor Hunt
Initial prompt
Make me a geme like among us
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
// Crewmate/Impostor player class
var Player = Container.expand(function () {
var self = Container.call(this);
// Role: 'crewmate' or 'impostor'
self.role = 'crewmate';
self.isAlive = true;
self.isLocal = false; // Only one player is local (user-controlled)
self.playerId = 0; // Unique id
// Attach asset based on role
self.setRole = function (role) {
self.role = role;
if (self.sprite) {
self.removeChild(self.sprite);
}
var assetId = role === 'impostor' ? 'impostor' : 'crewmate';
self.sprite = self.attachAsset(assetId, {
anchorX: 0.5,
anchorY: 0.5
});
};
// Show dead body
self.showDeadBody = function () {
if (self.sprite) self.removeChild(self.sprite);
self.sprite = self.attachAsset('deadbody', {
anchorX: 0.5,
anchorY: 0.5
});
};
// For touch feedback
self.flash = function () {
LK.effects.flashObject(self, 0xffffff, 200);
};
// For movement tween
self.moveTo = function (x, y, duration) {
tween(self, {
x: x,
y: y
}, {
duration: duration || 200,
easing: tween.easeInOut
});
};
// For kill animation
self.kill = function () {
self.isAlive = false;
self.showDeadBody();
tween(self, {
alpha: 0.7
}, {
duration: 400
});
};
// For respawn (not used in MVP)
self.respawn = function () {
self.isAlive = true;
self.setRole(self.role);
self.alpha = 1;
};
// Set initial role
self.setRole('crewmate');
return self;
});
// Task class
var Task = Container.expand(function () {
var self = Container.call(this);
self.completed = false;
self.taskId = 0;
self.sprite = self.attachAsset('task', {
anchorX: 0.5,
anchorY: 0.5
});
// Mark as completed
self.complete = function () {
self.completed = true;
tween(self.sprite, {
alpha: 0.3
}, {
duration: 300
});
};
return self;
});
// Button class (for tasks and emergency)
var UIButton = Container.expand(function () {
var self = Container.call(this);
self.label = '';
self.onPress = null;
self.type = 'button'; // 'button' or 'emergency'
self.bg = self.attachAsset('button', {
anchorX: 0.5,
anchorY: 0.5
});
self.text = new Text2('', {
size: 60,
fill: 0x222222
});
self.text.anchor.set(0.5, 0.5);
self.addChild(self.text);
self.setType = function (type) {
self.type = type;
if (type === 'emergency') {
self.removeChild(self.bg);
self.bg = self.attachAsset('emergency', {
anchorX: 0.5,
anchorY: 0.5
});
self.addChildAt(self.bg, 0);
}
};
self.setLabel = function (label) {
self.label = label;
self.text.setText(label);
};
// Touch event
self.down = function (x, y, obj) {
if (self.onPress && typeof self.onPress === 'function') {
self.onPress();
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x222b38
});
/****
* Game Code
****/
// Emergency button asset: orange box
// Button asset: green box
// Dead body asset: gray ellipse
// Task asset: yellow box
// Impostor asset: red ellipse
// Crewmate asset: blue ellipse
// --- Game State ---
var players = [];
var tasks = [];
var deadBodies = [];
var localPlayer = null;
var impostorPlayer = null;
var numPlayers = 5; // MVP: 5 players (1 local, 4 AI)
var numTasks = 6; // MVP: 6 tasks
var tasksCompleted = 0;
var meetingActive = false;
var voting = false;
var votedPlayerId = null;
var votes = {};
var gameEnded = false;
// --- UI Elements ---
var taskCounterTxt = new Text2('', {
size: 90,
fill: 0xFFFFFF
});
taskCounterTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(taskCounterTxt);
var infoTxt = new Text2('', {
size: 70,
fill: 0xFFFAE0
});
infoTxt.anchor.set(0.5, 0);
LK.gui.bottom.addChild(infoTxt);
var emergencyBtn = null;
var reportBtn = null;
var voteBtns = [];
// --- Utility Functions ---
// Random position for tasks (avoid top left 100x100)
function getRandomTaskPos(i) {
var margin = 200;
var cols = 3,
rows = 2;
var col = i % cols,
row = Math.floor(i / cols);
var x = margin + col * ((2048 - 2 * margin) / (cols - 1));
var y = 400 + row * ((2732 - 800) / (rows - 1));
return {
x: x,
y: y
};
}
// Random position for players (avoid top left)
function getRandomPlayerPos(i) {
var margin = 300;
var angle = 2 * Math.PI / numPlayers * i;
var radius = 700;
var x = 1024 + Math.cos(angle) * radius;
var y = 1366 + Math.sin(angle) * radius;
if (x < margin) x = margin;
if (x > 2048 - margin) x = 2048 - margin;
if (y < margin) y = margin;
if (y > 2732 - margin) y = 2732 - margin;
return {
x: x,
y: y
};
}
// Find nearest task to a player
function findNearestTask(px, py) {
var minDist = 99999,
nearest = null;
for (var i = 0; i < tasks.length; ++i) {
var t = tasks[i];
if (t.completed) continue;
var dx = t.x - px,
dy = t.y - py;
var dist = dx * dx + dy * dy;
if (dist < minDist) {
minDist = dist;
nearest = t;
}
}
return nearest;
}
// Find nearest alive player (for impostor AI)
function findNearestAlivePlayer(px, py, excludeId) {
var minDist = 99999,
nearest = null;
for (var i = 0; i < players.length; ++i) {
var p = players[i];
if (!p.isAlive || p.playerId === excludeId) continue;
var dx = p.x - px,
dy = p.y - py;
var dist = dx * dx + dy * dy;
if (dist < minDist) {
minDist = dist;
nearest = p;
}
}
return nearest;
}
// Check win/lose conditions
function checkGameEnd() {
if (gameEnded) return;
// Crewmates win: all tasks completed or impostor ejected
if (tasksCompleted >= numTasks) {
showEnd('Crewmates Win!\nAll tasks completed!');
return;
}
var impostorAlive = impostorPlayer && impostorPlayer.isAlive;
if (!impostorAlive) {
showEnd('Crewmates Win!\nImpostor ejected!');
return;
}
// Impostor wins: only 1 crewmate left alive
var aliveCrew = 0;
for (var i = 0; i < players.length; ++i) {
if (players[i].isAlive && players[i].role === 'crewmate') aliveCrew++;
}
if (aliveCrew <= 1) {
showEnd('Impostor Wins!\nAll crewmates eliminated!');
return;
}
}
// Show end screen
function showEnd(msg) {
gameEnded = true;
LK.effects.flashScreen(0x000000, 1200);
LK.setTimeout(function () {
LK.showGameOver(msg);
}, 1200);
}
// Update task counter UI
function updateTaskCounter() {
taskCounterTxt.setText('Tasks: ' + tasksCompleted + ' / ' + numTasks);
}
// Show info text
function showInfo(msg, duration) {
infoTxt.setText(msg);
if (duration) {
LK.setTimeout(function () {
if (infoTxt.text === msg) infoTxt.setText('');
}, duration);
}
}
// --- Game Setup ---
// Create players
for (var i = 0; i < numPlayers; ++i) {
var p = new Player();
p.playerId = i;
p.isLocal = i === 0;
p.setRole('crewmate');
var pos = getRandomPlayerPos(i);
p.x = pos.x;
p.y = pos.y;
players.push(p);
game.addChild(p);
if (p.isLocal) localPlayer = p;
}
// Randomly assign impostor
var impostorIdx = Math.floor(Math.random() * numPlayers);
players[impostorIdx].setRole('impostor');
impostorPlayer = players[impostorIdx];
impostorPlayer.killCooldown = 0;
// Create tasks
for (var i = 0; i < numTasks; ++i) {
var t = new Task();
t.taskId = i;
var pos = getRandomTaskPos(i);
t.x = pos.x;
t.y = pos.y;
tasks.push(t);
game.addChild(t);
}
// Emergency meeting button (bottom right)
emergencyBtn = new UIButton();
emergencyBtn.setType('emergency');
emergencyBtn.setLabel('Emergency');
emergencyBtn.x = 2048 - 250;
emergencyBtn.y = 2732 - 180;
emergencyBtn.onPress = function () {
if (!meetingActive && !gameEnded) {
startMeeting('Emergency Meeting!');
}
};
game.addChild(emergencyBtn);
// Report button (hidden by default)
reportBtn = new UIButton();
reportBtn.setLabel('Report');
reportBtn.x = 2048 - 250;
reportBtn.y = 2732 - 340;
reportBtn.visible = false;
reportBtn.onPress = function () {
if (!meetingActive && !gameEnded) {
startMeeting('Body Reported!');
}
};
game.addChild(reportBtn);
// --- Game Logic ---
// Dragging for local player
var dragging = false;
var dragOffset = {
x: 0,
y: 0
};
// Handle move events for dragging and task interaction
function handleMove(x, y, obj) {
if (gameEnded || meetingActive) return;
if (dragging && localPlayer && localPlayer.isAlive) {
// Clamp to game area
var nx = x,
ny = y;
var w = localPlayer.width / 2,
h = localPlayer.height / 2;
if (nx < w) nx = w;
if (nx > 2048 - w) nx = 2048 - w;
if (ny < h) ny = h;
if (ny > 2732 - h) ny = 2732 - h;
localPlayer.x = nx;
localPlayer.y = ny;
}
// Check for task interaction
if (localPlayer && localPlayer.isAlive) {
for (var i = 0; i < tasks.length; ++i) {
var t = tasks[i];
if (!t.completed && localPlayer.intersects(t)) {
// Complete task
t.complete();
tasksCompleted++;
updateTaskCounter();
showInfo('Task Completed!', 900);
checkGameEnd();
break;
}
}
}
// Check for dead body report
var foundBody = false;
for (var i = 0; i < deadBodies.length; ++i) {
var db = deadBodies[i];
if (localPlayer && localPlayer.isAlive && localPlayer.intersects(db)) {
foundBody = true;
break;
}
}
reportBtn.visible = foundBody && !meetingActive && !gameEnded;
}
game.move = handleMove;
// Touch down: start dragging local player
game.down = function (x, y, obj) {
if (gameEnded || meetingActive) return;
if (localPlayer && localPlayer.isAlive) {
dragging = true;
dragOffset.x = x - localPlayer.x;
dragOffset.y = y - localPlayer.y;
handleMove(x, y, obj);
}
};
// Touch up: stop dragging
game.up = function (x, y, obj) {
dragging = false;
};
// --- Meeting and Voting ---
function startMeeting(reason) {
meetingActive = true;
showInfo(reason, 2000);
// Stop all movement
dragging = false;
// Show voting UI after short delay
LK.setTimeout(function () {
showVotingUI();
}, 1200);
}
// Show voting UI: buttons for each player
function showVotingUI() {
voting = true;
votes = {};
votedPlayerId = null;
// Remove old vote buttons
for (var i = 0; i < voteBtns.length; ++i) {
if (voteBtns[i].parent) voteBtns[i].parent.removeChild(voteBtns[i]);
}
voteBtns = [];
// Create a button for each alive player
var btnW = 400,
btnH = 160;
var startY = 800,
gapY = 200;
var btnX = 1024;
var btnCount = 0;
for (var i = 0; i < players.length; ++i) {
var p = players[i];
if (!p.isAlive) continue;
var btn = new UIButton();
btn.setLabel('Vote: ' + (p.role === 'impostor' && gameEnded ? 'Impostor' : 'Player ' + (p.playerId + 1)));
btn.x = btnX;
btn.y = startY + btnCount * gapY;
btn.bg.width = btnW;
btn.bg.height = btnH;
(function (pid) {
btn.onPress = function () {
if (!voting) return;
votedPlayerId = pid;
finishVoting();
};
})(p.playerId);
game.addChild(btn);
voteBtns.push(btn);
btnCount++;
}
// Info
showInfo('Tap a player to vote out', 0);
}
// Finish voting: eject player with most votes (MVP: local player votes, AI random)
function finishVoting() {
voting = false;
// Remove vote buttons
for (var i = 0; i < voteBtns.length; ++i) {
if (voteBtns[i].parent) voteBtns[i].parent.removeChild(voteBtns[i]);
}
voteBtns = [];
// Tally votes: local player + random AI votes
var voteCounts = {};
for (var i = 0; i < players.length; ++i) {
var p = players[i];
if (!p.isAlive) continue;
voteCounts[p.playerId] = 0;
}
// Local player vote
if (votedPlayerId !== null) {
voteCounts[votedPlayerId]++;
}
// AI votes (random)
for (var i = 1; i < players.length; ++i) {
var p = players[i];
if (!p.isAlive) continue;
var choices = [];
for (var j = 0; j < players.length; ++j) {
if (players[j].isAlive) choices.push(players[j].playerId);
}
var aiVote = choices[Math.floor(Math.random() * choices.length)];
voteCounts[aiVote]++;
}
// Find player with most votes
var maxVotes = -1,
ejectedId = null;
for (var pid in voteCounts) {
if (voteCounts[pid] > maxVotes) {
maxVotes = voteCounts[pid];
ejectedId = parseInt(pid);
}
}
// Eject player
var ejected = players[ejectedId];
if (ejected && ejected.isAlive) {
ejected.isAlive = false;
ejected.kill();
// Show dead body
var db = new Container();
var dbSprite = db.attachAsset('deadbody', {
anchorX: 0.5,
anchorY: 0.5
});
db.x = ejected.x;
db.y = ejected.y;
deadBodies.push(db);
game.addChild(db);
showInfo('Player ' + (ejected.playerId + 1) + ' was ejected!', 1800);
}
// Hide report button
reportBtn.visible = false;
// Resume game after delay
LK.setTimeout(function () {
meetingActive = false;
if (impostorPlayer) impostorPlayer.killCooldown = 0;
checkGameEnd();
showInfo('', 0);
}, 1800);
}
// --- Impostor Actions ---
// Impostor AI: move toward nearest crewmate and kill if close
function impostorAI() {
if (!impostorPlayer || !impostorPlayer.isAlive || meetingActive || gameEnded) return;
// Find nearest alive crewmate
var target = findNearestAlivePlayer(impostorPlayer.x, impostorPlayer.y, impostorPlayer.playerId);
if (!target) return;
// Move toward target
var dx = target.x - impostorPlayer.x,
dy = target.y - impostorPlayer.y;
var dist = Math.sqrt(dx * dx + dy * dy);
var speed = 6;
if (dist > 10) {
var nx = impostorPlayer.x + dx / dist * speed;
var ny = impostorPlayer.y + dy / dist * speed;
impostorPlayer.x = nx;
impostorPlayer.y = ny;
}
// Kill if close and cooldown expired
if (typeof impostorPlayer.killCooldown === 'undefined') impostorPlayer.killCooldown = 0;
if (dist < 80 && target.isAlive && impostorPlayer.killCooldown <= 0) {
target.kill();
// Show dead body
var db = new Container();
var dbSprite = db.attachAsset('deadbody', {
anchorX: 0.5,
anchorY: 0.5
});
db.x = target.x;
db.y = target.y;
deadBodies.push(db);
game.addChild(db);
showInfo('A crewmate was eliminated!', 1200);
checkGameEnd();
impostorPlayer.killCooldown = 900; // 15 seconds at 60fps
}
if (impostorPlayer.killCooldown > 0) impostorPlayer.killCooldown--;
}
// AI crewmates: move toward nearest task and complete
function crewmateAI() {
for (var i = 0; i < players.length; ++i) {
var p = players[i];
if (p.isLocal || !p.isAlive || p.role !== 'crewmate') continue;
var t = findNearestTask(p.x, p.y);
if (!t) continue;
var dx = t.x - p.x,
dy = t.y - p.y;
var dist = Math.sqrt(dx * dx + dy * dy);
var speed = 5;
if (dist > 10) {
var nx = p.x + dx / dist * speed;
var ny = p.y + dy / dist * speed;
p.x = nx;
p.y = ny;
}
// Complete task if close
if (dist < 60 && !t.completed) {
t.complete();
tasksCompleted++;
updateTaskCounter();
showInfo('A task was completed!', 900);
checkGameEnd();
}
}
}
// --- Main Game Update ---
game.update = function () {
if (gameEnded) {
if (impostorPlayer) impostorPlayer.killCooldown = 0;
return;
}
updateTaskCounter();
// AI
if (!meetingActive) {
impostorAI();
crewmateAI();
}
// Hide report button if no body nearby
if (!meetingActive && !gameEnded) {
var foundBody = false;
for (var i = 0; i < deadBodies.length; ++i) {
var db = deadBodies[i];
if (localPlayer && localPlayer.isAlive && localPlayer.intersects(db)) {
foundBody = true;
break;
}
}
reportBtn.visible = foundBody;
}
};
// --- Initial UI ---
updateTaskCounter();
showInfo('Complete all tasks!\nBeware the Impostor!', 2500); ===================================================================
--- original.js
+++ change.js
@@ -300,8 +300,9 @@
// Randomly assign impostor
var impostorIdx = Math.floor(Math.random() * numPlayers);
players[impostorIdx].setRole('impostor');
impostorPlayer = players[impostorIdx];
+impostorPlayer.killCooldown = 0;
// Create tasks
for (var i = 0; i < numTasks; ++i) {
var t = new Task();
t.taskId = i;
@@ -510,8 +511,9 @@
reportBtn.visible = false;
// Resume game after delay
LK.setTimeout(function () {
meetingActive = false;
+ if (impostorPlayer) impostorPlayer.killCooldown = 0;
checkGameEnd();
showInfo('', 0);
}, 1800);
}
@@ -532,10 +534,11 @@
var ny = impostorPlayer.y + dy / dist * speed;
impostorPlayer.x = nx;
impostorPlayer.y = ny;
}
- // Kill if close
- if (dist < 80 && target.isAlive) {
+ // Kill if close and cooldown expired
+ if (typeof impostorPlayer.killCooldown === 'undefined') impostorPlayer.killCooldown = 0;
+ if (dist < 80 && target.isAlive && impostorPlayer.killCooldown <= 0) {
target.kill();
// Show dead body
var db = new Container();
var dbSprite = db.attachAsset('deadbody', {
@@ -547,9 +550,11 @@
deadBodies.push(db);
game.addChild(db);
showInfo('A crewmate was eliminated!', 1200);
checkGameEnd();
+ impostorPlayer.killCooldown = 900; // 15 seconds at 60fps
}
+ if (impostorPlayer.killCooldown > 0) impostorPlayer.killCooldown--;
}
// AI crewmates: move toward nearest task and complete
function crewmateAI() {
for (var i = 0; i < players.length; ++i) {
@@ -578,9 +583,12 @@
}
}
// --- Main Game Update ---
game.update = function () {
- if (gameEnded) return;
+ if (gameEnded) {
+ if (impostorPlayer) impostorPlayer.killCooldown = 0;
+ return;
+ }
updateTaskCounter();
// AI
if (!meetingActive) {
impostorAI();
Wooden door. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat,sharp edges,straight lines,creepy and bloody look
A skull head holding a knife . No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat.dark,bloody look on knife and head,make my drawing better
A scared man,make my drawing better . No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat.only head,make hands as a circle.dont add body
Cabinet,metal,bloody look,sharp edges. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
Fullscreen modern App Store landscape banner, 16:9, high definition, for a game titled "die by moonlight" and with the description "A game where player fix generators and tries to escape killer.". No text on banner,put the name on the up-left corner