User prompt
make it so when the game is started it gives the player a choice between the hammer or the sword
User prompt
make it so if a enemy is parried by a sword they get stunned for 5 seconds and if a parry is landed by a sword it gives 5 seconds of i frames ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
make the parry window longer around 3 seconds and if it is missed give it a 2 second cooldown
User prompt
make it so the enemys do not go for melee attacks instead when they are in shooting range they stay in place and back up when the player gets closer
User prompt
make it so when a enemy is parried it gets stunned and if the player is using a hammer why the parry happens the enemy gets killed
User prompt
make the parry button bigger
User prompt
add a parry button
User prompt
make enemys feeze on level up screen and make the enemys have a hitpoints system where every weapon does a set amount of damage the pistol does 5 the rifle does 2 and the shotgun goes 10 and the enemys have 10 hp and give the rifle and pistol large range before there bullets disapeer and give the shotgun short range
User prompt
make a xp system when ever you level up it gives you three options one to increese damage one to give you more hp and one to increese range and make the shotgun deal more damage
User prompt
make it so you can aim the rifle while shooting and make it take three hits to kill a normal enemy
User prompt
remove the old movement and keep the double click movement
User prompt
make the rifle a starting weapon
User prompt
make the hp regen when you go in a new room
User prompt
Please fix the bug: 'Uncaught TypeError: setTimeout is not a function' in or related to this line: 'setTimeout(function () {' Line Number: 839
User prompt
make it so when right click is held it will use full auto and shoot automatically if the rifle is equiped ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
make so when i click on a weapon in the hotbar the trashcan icon lights up and if i click on it the weapon gets trashed and make the shotgun ammo not a pickup that goes into the hotbar but one that when is picked up it gets turned into shotgun ammo ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Please fix the bug: 'Uncaught TypeError: Cannot read properties of undefined (reading 'toGlobal')' in or related to this line: 'var localPos = hotbar.toLocal(obj.parent.toGlobal(obj.position));' Line Number: 581
User prompt
make a trash icon by the hotbar and if you drag a weapon into it it gets rid of it ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
the shotgun feels overpowered add a ammo system for the gunshot and have it start with 5 ammo and once you run out you have to kill things for more ammo make it a 10% chance for a things you kill to drop shotgun ammo and make the ammo counter to the left of the hotbar and make the hp a bar and not a counter ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
add a hotbar at the bottom of the screen that the player can click on to switch weapons and add a shotgun that can be found on the floor and when the player goes over it it goes into the hotbar
User prompt
Please fix the bug: 'TypeError: easing is not a function' in or related to this line: 'lastClickTime = 0; // Reset to prevent triple click' Line Number: 585
User prompt
please fix error
User prompt
make the parry right click and add a double click movement system
User prompt
redo the whole game
Code edit (1 edits merged)
Please save this source code
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ var Bullet = Container.expand(function (isPlayerBullet) { var self = Container.call(this); self.isPlayerBullet = isPlayerBullet || false; var bulletGraphics = self.attachAsset(self.isPlayerBullet ? 'bullet' : 'enemyBullet', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 8; self.direction = 0; self.active = true; self.update = function () { if (!self.active) return; self.x += Math.cos(self.direction) * self.speed; self.y += Math.sin(self.direction) * self.speed; // Check bounds if (self.x < -50 || self.x > 2098 || self.y < -50 || self.y > 2782) { self.active = false; } }; return self; }); var Enemy = Container.expand(function () { var self = Container.call(this); var enemyGraphics = self.attachAsset('enemy', { anchorX: 0.5, anchorY: 0.5 }); self.health = 3; self.speed = 1.5; self.shootTimer = 0; self.shootCooldown = 90; // 1.5 seconds at 60fps self.active = true; self.update = function () { if (!self.active || !player) return; // Move towards player var dx = player.x - self.x; var dy = player.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance > 5) { self.x += dx / distance * self.speed; self.y += dy / distance * self.speed; } // Shooting logic self.shootTimer++; if (self.shootTimer >= self.shootCooldown && distance < 400) { self.shoot(); self.shootTimer = 0; } }; self.shoot = function () { var bullet = new Bullet(false); var angle = Math.atan2(player.y - self.y, player.x - self.x); bullet.direction = angle; bullet.x = self.x; bullet.y = self.y; enemyBullets.push(bullet); currentRoom.addChild(bullet); }; self.takeDamage = function () { self.health--; LK.effects.flashObject(self, 0xFFFFFF, 200); if (self.health <= 0) { self.active = false; LK.getSound('enemyHit').play(); } }; return self; }); var Player = Container.expand(function () { var self = Container.call(this); var playerGraphics = self.attachAsset('player', { anchorX: 0.5, anchorY: 0.5 }); var meleeWeapon = self.attachAsset('sword', { anchorX: 0.5, anchorY: 1.0, x: 25, y: 0 }); self.health = 5; self.maxHealth = 5; self.speed = 4; self.shootCooldown = 0; self.parryCooldown = 0; self.weaponType = 'sword'; // 'sword' or 'hammer' self.parryWindow = 0; self.switchWeapon = function () { self.weaponType = self.weaponType === 'sword' ? 'hammer' : 'sword'; meleeWeapon.destroy(); meleeWeapon = self.attachAsset(self.weaponType, { anchorX: 0.5, anchorY: 1.0, x: 25, y: 0 }); }; self.shoot = function (targetX, targetY) { if (self.shootCooldown > 0) return; var bullet = new Bullet(true); var angle = Math.atan2(targetY - self.y, targetX - self.x); bullet.direction = angle; bullet.x = self.x; bullet.y = self.y; playerBullets.push(bullet); currentRoom.addChild(bullet); LK.getSound('shoot').play(); self.shootCooldown = 15; // 0.25 seconds }; self.parry = function () { if (self.parryCooldown > 0) return; var parryDuration = self.weaponType === 'sword' ? 10 : 20; // frames var parryPower = self.weaponType === 'sword' ? 1 : 2; self.parryWindow = parryDuration; self.parryCooldown = self.weaponType === 'sword' ? 30 : 60; // Visual feedback var parryFX = currentRoom.attachAsset('parryEffect', { anchorX: 0.5, anchorY: 0.5, x: self.x, y: self.y, alpha: 0.7 }); tween(parryFX, { alpha: 0, scaleX: 1.5, scaleY: 1.5 }, { duration: parryDuration * 16.67, onFinish: function onFinish() { parryFX.destroy(); } }); LK.getSound('parry').play(); }; self.takeDamage = function () { self.health--; LK.effects.flashObject(self, 0xFF0000, 500); LK.getSound('playerHit').play(); if (self.health <= 0) { LK.showGameOver(); } updateHealthDisplay(); }; self.update = function () { if (self.shootCooldown > 0) self.shootCooldown--; if (self.parryCooldown > 0) self.parryCooldown--; if (self.parryWindow > 0) self.parryWindow--; }; return self; }); var Room = Container.expand(function () { var self = Container.call(this); self.enemies = []; self.cleared = false; self.roomWidth = 1800; self.roomHeight = 2400; self.generateRoom = function () { // Create walls for (var i = 0; i < 18; i++) { var topWall = self.attachAsset('wall', { x: i * 100 + 124, y: 166 }); var bottomWall = self.attachAsset('wall', { x: i * 100 + 124, y: 2466 }); } for (var j = 0; j < 23; j++) { var leftWall = self.attachAsset('wall', { x: 124, y: j * 100 + 166 }); var rightWall = self.attachAsset('wall', { x: 1824, y: j * 100 + 166 }); } // Generate enemies var enemyCount = Math.floor(Math.random() * 4) + 3; for (var k = 0; k < enemyCount; k++) { var enemy = new Enemy(); enemy.x = Math.random() * 1400 + 300; enemy.y = Math.random() * 1800 + 400; self.enemies.push(enemy); self.addChild(enemy); } // Create door for next room if (!nextRoomDoor) { nextRoomDoor = self.attachAsset('door', { anchorX: 0.5, anchorY: 0.5, x: 1024, y: 166 }); } }; self.checkCleared = function () { var activeEnemies = 0; for (var i = 0; i < self.enemies.length; i++) { if (self.enemies[i].active) { activeEnemies++; } } if (activeEnemies === 0 && !self.cleared) { self.cleared = true; if (nextRoomDoor) { tween(nextRoomDoor, { tint: 0x2ECC71 }, { duration: 500 }); } } return self.cleared; }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x2C3E50 }); /**** * Game Code ****/ var player; var currentRoom; var playerBullets = []; var enemyBullets = []; var roomNumber = 1; var nextRoomDoor; // UI Elements var healthText = new Text2('Health: 5/5', { size: 60, fill: 0xE74C3C }); healthText.anchor.set(0, 0); LK.gui.topRight.addChild(healthText); var roomText = new Text2('Room: 1', { size: 60, fill: 0x3498DB }); roomText.anchor.set(0.5, 0); LK.gui.top.addChild(roomText); var weaponText = new Text2('Weapon: Sword', { size: 50, fill: 0x95A5A6 }); weaponText.anchor.set(0, 1); LK.gui.bottomLeft.addChild(weaponText); function updateHealthDisplay() { healthText.setText('Health: ' + player.health + '/' + player.maxHealth); } function updateRoomDisplay() { roomText.setText('Room: ' + roomNumber); } function updateWeaponDisplay() { weaponText.setText('Weapon: ' + (player.weaponType === 'sword' ? 'Sword' : 'Hammer')); } function generateNewRoom() { if (currentRoom) { currentRoom.destroy(); } currentRoom = new Room(); currentRoom.generateRoom(); game.addChild(currentRoom); // Reset player position player.x = 1024; player.y = 2200; // Clear bullets playerBullets = []; enemyBullets = []; roomNumber++; updateRoomDisplay(); } // Initialize first room and player currentRoom = new Room(); currentRoom.generateRoom(); game.addChild(currentRoom); player = new Player(); player.x = 1024; player.y = 2200; currentRoom.addChild(player); var isDragging = false; var dragStartX = 0; var dragStartY = 0; game.down = function (x, y, obj) { isDragging = true; dragStartX = x; dragStartY = y; }; game.up = function (x, y, obj) { if (isDragging) { var dragDistance = Math.sqrt((x - dragStartX) * (x - dragStartX) + (y - dragStartY) * (y - dragStartY)); if (dragDistance < 50) { // Tap - shoot player.shoot(x, y); } else { // Swipe - parry player.parry(); } } isDragging = false; }; game.update = function () { if (!player || !currentRoom) return; // Update player player.update(); // Update bullets for (var i = playerBullets.length - 1; i >= 0; i--) { var bullet = playerBullets[i]; bullet.update(); if (!bullet.active) { bullet.destroy(); playerBullets.splice(i, 1); continue; } // Check collision with enemies for (var j = 0; j < currentRoom.enemies.length; j++) { var enemy = currentRoom.enemies[j]; if (enemy.active && bullet.intersects(enemy)) { enemy.takeDamage(); bullet.active = false; bullet.destroy(); playerBullets.splice(i, 1); break; } } } // Update enemy bullets for (var k = enemyBullets.length - 1; k >= 0; k--) { var enemyBullet = enemyBullets[k]; enemyBullet.update(); if (!enemyBullet.active) { enemyBullet.destroy(); enemyBullets.splice(k, 1); continue; } // Check collision with player if (enemyBullet.intersects(player)) { if (player.parryWindow > 0) { // Successful parry var deflectedBullet = new Bullet(true); deflectedBullet.x = enemyBullet.x; deflectedBullet.y = enemyBullet.y; deflectedBullet.direction = enemyBullet.direction + Math.PI; deflectedBullet.speed = 12; playerBullets.push(deflectedBullet); currentRoom.addChild(deflectedBullet); LK.effects.flashObject(player, 0xF1C40F, 300); } else { // Player takes damage player.takeDamage(); } enemyBullet.active = false; enemyBullet.destroy(); enemyBullets.splice(k, 1); } } // Update enemies for (var l = 0; l < currentRoom.enemies.length; l++) { var enemy = currentRoom.enemies[l]; if (enemy.active) { enemy.update(); } } // Check if room is cleared if (currentRoom.checkCleared()) { // Check if player touches door if (nextRoomDoor && player.intersects(nextRoomDoor)) { generateNewRoom(); } } // Weapon switching (every 5 seconds for demo) if (LK.ticks % 300 === 0) { player.switchWeapon(); updateWeaponDisplay(); } };
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Bullet = Container.expand(function (isPlayerBullet) {
var self = Container.call(this);
self.isPlayerBullet = isPlayerBullet || false;
var bulletGraphics = self.attachAsset(self.isPlayerBullet ? 'bullet' : 'enemyBullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 8;
self.direction = 0;
self.active = true;
self.update = function () {
if (!self.active) return;
self.x += Math.cos(self.direction) * self.speed;
self.y += Math.sin(self.direction) * self.speed;
// Check bounds
if (self.x < -50 || self.x > 2098 || self.y < -50 || self.y > 2782) {
self.active = false;
}
};
return self;
});
var Enemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('enemy', {
anchorX: 0.5,
anchorY: 0.5
});
self.health = 3;
self.speed = 1.5;
self.shootTimer = 0;
self.shootCooldown = 90; // 1.5 seconds at 60fps
self.active = true;
self.update = function () {
if (!self.active || !player) return;
// Move towards player
var dx = player.x - self.x;
var dy = player.y - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > 5) {
self.x += dx / distance * self.speed;
self.y += dy / distance * self.speed;
}
// Shooting logic
self.shootTimer++;
if (self.shootTimer >= self.shootCooldown && distance < 400) {
self.shoot();
self.shootTimer = 0;
}
};
self.shoot = function () {
var bullet = new Bullet(false);
var angle = Math.atan2(player.y - self.y, player.x - self.x);
bullet.direction = angle;
bullet.x = self.x;
bullet.y = self.y;
enemyBullets.push(bullet);
currentRoom.addChild(bullet);
};
self.takeDamage = function () {
self.health--;
LK.effects.flashObject(self, 0xFFFFFF, 200);
if (self.health <= 0) {
self.active = false;
LK.getSound('enemyHit').play();
}
};
return self;
});
var Player = Container.expand(function () {
var self = Container.call(this);
var playerGraphics = self.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5
});
var meleeWeapon = self.attachAsset('sword', {
anchorX: 0.5,
anchorY: 1.0,
x: 25,
y: 0
});
self.health = 5;
self.maxHealth = 5;
self.speed = 4;
self.shootCooldown = 0;
self.parryCooldown = 0;
self.weaponType = 'sword'; // 'sword' or 'hammer'
self.parryWindow = 0;
self.switchWeapon = function () {
self.weaponType = self.weaponType === 'sword' ? 'hammer' : 'sword';
meleeWeapon.destroy();
meleeWeapon = self.attachAsset(self.weaponType, {
anchorX: 0.5,
anchorY: 1.0,
x: 25,
y: 0
});
};
self.shoot = function (targetX, targetY) {
if (self.shootCooldown > 0) return;
var bullet = new Bullet(true);
var angle = Math.atan2(targetY - self.y, targetX - self.x);
bullet.direction = angle;
bullet.x = self.x;
bullet.y = self.y;
playerBullets.push(bullet);
currentRoom.addChild(bullet);
LK.getSound('shoot').play();
self.shootCooldown = 15; // 0.25 seconds
};
self.parry = function () {
if (self.parryCooldown > 0) return;
var parryDuration = self.weaponType === 'sword' ? 10 : 20; // frames
var parryPower = self.weaponType === 'sword' ? 1 : 2;
self.parryWindow = parryDuration;
self.parryCooldown = self.weaponType === 'sword' ? 30 : 60;
// Visual feedback
var parryFX = currentRoom.attachAsset('parryEffect', {
anchorX: 0.5,
anchorY: 0.5,
x: self.x,
y: self.y,
alpha: 0.7
});
tween(parryFX, {
alpha: 0,
scaleX: 1.5,
scaleY: 1.5
}, {
duration: parryDuration * 16.67,
onFinish: function onFinish() {
parryFX.destroy();
}
});
LK.getSound('parry').play();
};
self.takeDamage = function () {
self.health--;
LK.effects.flashObject(self, 0xFF0000, 500);
LK.getSound('playerHit').play();
if (self.health <= 0) {
LK.showGameOver();
}
updateHealthDisplay();
};
self.update = function () {
if (self.shootCooldown > 0) self.shootCooldown--;
if (self.parryCooldown > 0) self.parryCooldown--;
if (self.parryWindow > 0) self.parryWindow--;
};
return self;
});
var Room = Container.expand(function () {
var self = Container.call(this);
self.enemies = [];
self.cleared = false;
self.roomWidth = 1800;
self.roomHeight = 2400;
self.generateRoom = function () {
// Create walls
for (var i = 0; i < 18; i++) {
var topWall = self.attachAsset('wall', {
x: i * 100 + 124,
y: 166
});
var bottomWall = self.attachAsset('wall', {
x: i * 100 + 124,
y: 2466
});
}
for (var j = 0; j < 23; j++) {
var leftWall = self.attachAsset('wall', {
x: 124,
y: j * 100 + 166
});
var rightWall = self.attachAsset('wall', {
x: 1824,
y: j * 100 + 166
});
}
// Generate enemies
var enemyCount = Math.floor(Math.random() * 4) + 3;
for (var k = 0; k < enemyCount; k++) {
var enemy = new Enemy();
enemy.x = Math.random() * 1400 + 300;
enemy.y = Math.random() * 1800 + 400;
self.enemies.push(enemy);
self.addChild(enemy);
}
// Create door for next room
if (!nextRoomDoor) {
nextRoomDoor = self.attachAsset('door', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 166
});
}
};
self.checkCleared = function () {
var activeEnemies = 0;
for (var i = 0; i < self.enemies.length; i++) {
if (self.enemies[i].active) {
activeEnemies++;
}
}
if (activeEnemies === 0 && !self.cleared) {
self.cleared = true;
if (nextRoomDoor) {
tween(nextRoomDoor, {
tint: 0x2ECC71
}, {
duration: 500
});
}
}
return self.cleared;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x2C3E50
});
/****
* Game Code
****/
var player;
var currentRoom;
var playerBullets = [];
var enemyBullets = [];
var roomNumber = 1;
var nextRoomDoor;
// UI Elements
var healthText = new Text2('Health: 5/5', {
size: 60,
fill: 0xE74C3C
});
healthText.anchor.set(0, 0);
LK.gui.topRight.addChild(healthText);
var roomText = new Text2('Room: 1', {
size: 60,
fill: 0x3498DB
});
roomText.anchor.set(0.5, 0);
LK.gui.top.addChild(roomText);
var weaponText = new Text2('Weapon: Sword', {
size: 50,
fill: 0x95A5A6
});
weaponText.anchor.set(0, 1);
LK.gui.bottomLeft.addChild(weaponText);
function updateHealthDisplay() {
healthText.setText('Health: ' + player.health + '/' + player.maxHealth);
}
function updateRoomDisplay() {
roomText.setText('Room: ' + roomNumber);
}
function updateWeaponDisplay() {
weaponText.setText('Weapon: ' + (player.weaponType === 'sword' ? 'Sword' : 'Hammer'));
}
function generateNewRoom() {
if (currentRoom) {
currentRoom.destroy();
}
currentRoom = new Room();
currentRoom.generateRoom();
game.addChild(currentRoom);
// Reset player position
player.x = 1024;
player.y = 2200;
// Clear bullets
playerBullets = [];
enemyBullets = [];
roomNumber++;
updateRoomDisplay();
}
// Initialize first room and player
currentRoom = new Room();
currentRoom.generateRoom();
game.addChild(currentRoom);
player = new Player();
player.x = 1024;
player.y = 2200;
currentRoom.addChild(player);
var isDragging = false;
var dragStartX = 0;
var dragStartY = 0;
game.down = function (x, y, obj) {
isDragging = true;
dragStartX = x;
dragStartY = y;
};
game.up = function (x, y, obj) {
if (isDragging) {
var dragDistance = Math.sqrt((x - dragStartX) * (x - dragStartX) + (y - dragStartY) * (y - dragStartY));
if (dragDistance < 50) {
// Tap - shoot
player.shoot(x, y);
} else {
// Swipe - parry
player.parry();
}
}
isDragging = false;
};
game.update = function () {
if (!player || !currentRoom) return;
// Update player
player.update();
// Update bullets
for (var i = playerBullets.length - 1; i >= 0; i--) {
var bullet = playerBullets[i];
bullet.update();
if (!bullet.active) {
bullet.destroy();
playerBullets.splice(i, 1);
continue;
}
// Check collision with enemies
for (var j = 0; j < currentRoom.enemies.length; j++) {
var enemy = currentRoom.enemies[j];
if (enemy.active && bullet.intersects(enemy)) {
enemy.takeDamage();
bullet.active = false;
bullet.destroy();
playerBullets.splice(i, 1);
break;
}
}
}
// Update enemy bullets
for (var k = enemyBullets.length - 1; k >= 0; k--) {
var enemyBullet = enemyBullets[k];
enemyBullet.update();
if (!enemyBullet.active) {
enemyBullet.destroy();
enemyBullets.splice(k, 1);
continue;
}
// Check collision with player
if (enemyBullet.intersects(player)) {
if (player.parryWindow > 0) {
// Successful parry
var deflectedBullet = new Bullet(true);
deflectedBullet.x = enemyBullet.x;
deflectedBullet.y = enemyBullet.y;
deflectedBullet.direction = enemyBullet.direction + Math.PI;
deflectedBullet.speed = 12;
playerBullets.push(deflectedBullet);
currentRoom.addChild(deflectedBullet);
LK.effects.flashObject(player, 0xF1C40F, 300);
} else {
// Player takes damage
player.takeDamage();
}
enemyBullet.active = false;
enemyBullet.destroy();
enemyBullets.splice(k, 1);
}
}
// Update enemies
for (var l = 0; l < currentRoom.enemies.length; l++) {
var enemy = currentRoom.enemies[l];
if (enemy.active) {
enemy.update();
}
}
// Check if room is cleared
if (currentRoom.checkCleared()) {
// Check if player touches door
if (nextRoomDoor && player.intersects(nextRoomDoor)) {
generateNewRoom();
}
}
// Weapon switching (every 5 seconds for demo)
if (LK.ticks % 300 === 0) {
player.switchWeapon();
updateWeaponDisplay();
}
};