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 (isPlayer, gunType) { var self = Container.call(this); self.isPlayer = isPlayer || false; self.gunType = gunType || 'pistol'; var bulletGraphics = self.attachAsset(self.isPlayer ? 'bullet' : 'enemyBullet', { anchorX: 0.5, anchorY: 0.5 }); // Different bullet properties based on gun type if (self.isPlayer) { switch (self.gunType) { case 'pistol': self.speed = 12; self.damage = 1; break; case 'rifle': self.speed = 18; self.damage = 2; break; case 'shotgun': self.speed = 10; self.damage = 3; break; } } else { self.speed = 8; self.damage = 1; } 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 < -100 || self.x > 2148 || self.y < -100 || self.y > 2832) { self.active = false; } }; return self; }); var Enemy = Container.expand(function (roomLevel) { var self = Container.call(this); var enemyGraphics = self.attachAsset('enemy', { anchorX: 0.5, anchorY: 0.5 }); // Scale difficulty with room level self.health = Math.min(1 + Math.floor(roomLevel / 2), 5); self.speed = Math.min(1 + roomLevel * 0.2, 3); self.shootTimer = 0; self.shootCooldown = Math.max(120 - roomLevel * 5, 60); self.active = true; self.lastPlayerX = 0; self.lastPlayerY = 0; self.update = function () { if (!self.active || !player) return; // Track last position for intersection detection self.lastPlayerX = player.x; self.lastPlayerY = player.y; // 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 > 40) { self.x += dx / distance * self.speed; self.y += dy / distance * self.speed; } // Shooting logic self.shootTimer++; if (self.shootTimer >= self.shootCooldown && distance < 500) { 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); game.addChild(bullet); }; self.takeDamage = function (damage) { self.health -= damage; LK.effects.flashObject(self, 0xFFFFFF, 200); if (self.health <= 0) { self.active = false; LK.setScore(LK.getScore() + 10); LK.getSound('enemyHit').play(); // 20% chance to drop weapon pickup if (Math.random() < 0.2) { spawnPickup(self.x, self.y); } } }; return self; }); var Pickup = Container.expand(function (type, x, y) { var self = Container.call(this); self.type = type; // 'gun' or 'melee' self.x = x; self.y = y; self.active = true; self.bobOffset = Math.random() * Math.PI * 2; self.startY = y; var pickupGraphics = self.attachAsset(type === 'gun' ? 'gunPickup' : 'meleePickup', { anchorX: 0.5, anchorY: 0.5 }); // Determine what weapon this pickup contains if (type === 'gun') { var guns = ['pistol', 'rifle', 'shotgun']; self.weapon = guns[Math.floor(Math.random() * guns.length)]; } else { var melees = ['sword', 'hammer']; self.weapon = melees[Math.floor(Math.random() * melees.length)]; } self.update = function () { if (!self.active) return; // Bobbing animation self.y = self.startY + Math.sin(LK.ticks * 0.1 + self.bobOffset) * 5; // Check pickup collision with player if (self.intersects(player)) { self.active = false; if (self.type === 'gun') { player.switchGun(self.weapon); } else { player.switchMelee(self.weapon); } LK.getSound('pickup').play(); LK.setScore(LK.getScore() + 5); self.destroy(); } }; return self; }); var Player = Container.expand(function () { var self = Container.call(this); var playerGraphics = self.attachAsset('player', { anchorX: 0.5, anchorY: 0.5 }); // Gun display var gunGraphics = self.attachAsset('pistol', { anchorX: 0, anchorY: 0.5, x: 20, y: 0 }); // Melee weapon display var meleeGraphics = self.attachAsset('sword', { anchorX: 0.5, anchorY: 1, x: -15, y: -10 }); self.health = 3; self.maxHealth = 3; self.speed = 5; self.shootCooldown = 0; self.parryCooldown = 0; self.parryWindow = 0; // Weapon systems self.currentGun = 'pistol'; self.currentMelee = 'sword'; // Gun properties self.gunStats = { pistol: { cooldown: 12, spread: 0 }, rifle: { cooldown: 8, spread: 0.1 }, shotgun: { cooldown: 30, spread: 0.3, pellets: 3 } }; // Melee properties self.meleeStats = { sword: { parryWindow: 8, cooldown: 25, effect: 'reflect', color: 0x1abc9c }, hammer: { parryWindow: 15, cooldown: 45, effect: 'shockwave', color: 0xe74c3c } }; self.shoot = function (targetX, targetY) { if (self.shootCooldown > 0) return; var gunStat = self.gunStats[self.currentGun]; var baseAngle = Math.atan2(targetY - self.y, targetX - self.x); if (self.currentGun === 'shotgun') { // Shotgun fires multiple pellets for (var i = 0; i < gunStat.pellets; i++) { var bullet = new Bullet(true, self.currentGun); bullet.direction = baseAngle + (Math.random() - 0.5) * gunStat.spread; bullet.x = self.x; bullet.y = self.y; playerBullets.push(bullet); game.addChild(bullet); } } else { var bullet = new Bullet(true, self.currentGun); bullet.direction = baseAngle + (Math.random() - 0.5) * gunStat.spread; bullet.x = self.x; bullet.y = self.y; playerBullets.push(bullet); game.addChild(bullet); } LK.getSound('shoot').play(); self.shootCooldown = gunStat.cooldown; }; self.parry = function () { if (self.parryCooldown > 0) return; var meleeStat = self.meleeStats[self.currentMelee]; self.parryWindow = meleeStat.parryWindow; self.parryCooldown = meleeStat.cooldown; // Visual feedback var parryFX = game.attachAsset('parryEffect', { anchorX: 0.5, anchorY: 0.5, x: self.x, y: self.y, alpha: 0.8, tint: meleeStat.color }); tween(parryFX, { alpha: 0, scaleX: 2, scaleY: 2 }, { duration: meleeStat.parryWindow * 16.67, onFinish: function onFinish() { parryFX.destroy(); } }); LK.getSound('parry').play(); }; self.switchGun = function (newGun) { if (newGun && self.gunStats[newGun]) { self.currentGun = newGun; gunGraphics.destroy(); gunGraphics = self.attachAsset(newGun, { anchorX: 0, anchorY: 0.5, x: 20, y: 0 }); } }; self.switchMelee = function (newMelee) { if (newMelee && self.meleeStats[newMelee]) { self.currentMelee = newMelee; meleeGraphics.destroy(); meleeGraphics = self.attachAsset(newMelee, { anchorX: 0.5, anchorY: 1, x: -15, y: -10 }); } }; self.takeDamage = function () { self.health--; LK.effects.flashObject(self, 0xFF0000, 500); LK.getSound('playerHit').play(); if (self.health <= 0) { LK.showGameOver(); } }; self.heal = function (amount) { self.health = Math.min(self.health + amount, self.maxHealth); }; 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 (level) { var self = Container.call(this); self.level = level || 1; self.enemies = []; self.pickups = []; self.cleared = false; self.door = null; self.generateRoom = function () { // Create border walls var wallSize = 60; var roomWidth = 2048; var roomHeight = 2732; var wallsX = Math.floor(roomWidth / wallSize); var wallsY = Math.floor(roomHeight / wallSize); // Top and bottom walls for (var i = 0; i < wallsX; i++) { var topWall = self.attachAsset('wall', { x: i * wallSize, y: 0 }); var bottomWall = self.attachAsset('wall', { x: i * wallSize, y: roomHeight - wallSize }); } // Left and right walls for (var j = 1; j < wallsY - 1; j++) { var leftWall = self.attachAsset('wall', { x: 0, y: j * wallSize }); var rightWall = self.attachAsset('wall', { x: roomWidth - wallSize, y: j * wallSize }); } // Generate enemies var enemyCount = Math.min(2 + self.level, 8); for (var k = 0; k < enemyCount; k++) { var enemy = new Enemy(self.level); enemy.x = 200 + Math.random() * (roomWidth - 400); enemy.y = 200 + Math.random() * (roomHeight - 400); self.enemies.push(enemy); self.addChild(enemy); } // Create exit door (initially locked) self.door = self.attachAsset('door', { anchorX: 0.5, anchorY: 0.5, x: roomWidth / 2, y: wallSize / 2, tint: 0xc0392b }); }; 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; // Unlock door if (self.door) { tween(self.door, { tint: 0x27ae60 }, { duration: 500 }); } } return self.cleared; }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x1a1a1a }); /**** * Game Code ****/ var player; var currentRoom; var playerBullets = []; var enemyBullets = []; var pickups = []; var roomLevel = 1; var dragStartX = 0; var dragStartY = 0; var isDragging = false; // UI Elements var scoreText = new Text2('Score: 0', { size: 40, fill: '#ffffff' }); scoreText.anchor.set(0.5, 0); LK.gui.top.addChild(scoreText); var healthText = new Text2('Health: 3/3', { size: 35, fill: '#e74c3c' }); healthText.anchor.set(1, 0); LK.gui.topRight.addChild(healthText); var roomText = new Text2('Room: 1', { size: 30, fill: '#3498db' }); roomText.anchor.set(0, 0); roomText.x = 120; LK.gui.topLeft.addChild(roomText); var gunText = new Text2('Gun: Pistol', { size: 28, fill: '#f39c12' }); gunText.anchor.set(0, 1); LK.gui.bottomLeft.addChild(gunText); var meleeText = new Text2('Melee: Sword', { size: 28, fill: '#9b59b6' }); meleeText.anchor.set(1, 1); LK.gui.bottomRight.addChild(meleeText); function updateUI() { scoreText.setText('Score: ' + LK.getScore()); healthText.setText('Health: ' + player.health + '/' + player.maxHealth); roomText.setText('Room: ' + roomLevel); gunText.setText('Gun: ' + player.currentGun.charAt(0).toUpperCase() + player.currentGun.slice(1)); meleeText.setText('Melee: ' + player.currentMelee.charAt(0).toUpperCase() + player.currentMelee.slice(1)); } function spawnPickup(x, y) { var pickupType = Math.random() < 0.6 ? 'gun' : 'melee'; var pickup = new Pickup(pickupType, x, y); pickups.push(pickup); game.addChild(pickup); } function generateNewRoom() { // Clear current room if (currentRoom) { currentRoom.destroy(); } // Clear bullets and pickups for (var i = 0; i < playerBullets.length; i++) { playerBullets[i].destroy(); } for (var j = 0; j < enemyBullets.length; j++) { enemyBullets[j].destroy(); } for (var k = 0; k < pickups.length; k++) { pickups[k].destroy(); } playerBullets = []; enemyBullets = []; pickups = []; // Create new room roomLevel++; currentRoom = new Room(roomLevel); currentRoom.generateRoom(); game.addChild(currentRoom); // Reset player position player.x = 1024; player.y = 2400; game.addChild(player); updateUI(); } // Initialize game currentRoom = new Room(roomLevel); currentRoom.generateRoom(); game.addChild(currentRoom); player = new Player(); player.x = 1024; player.y = 2400; game.addChild(player); updateUI(); // Touch controls game.down = function (x, y, obj) { isDragging = true; dragStartX = x; dragStartY = y; }; game.move = function (x, y, obj) { if (isDragging) { var dx = x - dragStartX; var dy = y - dragStartY; var distance = Math.sqrt(dx * dx + dy * dy); // Move player based on drag if (distance > 20) { var moveSpeed = player.speed; var newX = player.x + dx / distance * moveSpeed; var newY = player.y + dy / distance * moveSpeed; // Keep player in bounds player.x = Math.max(80, Math.min(1968, newX)); player.y = Math.max(80, Math.min(2652, newY)); } } }; game.up = function (x, y, obj) { if (isDragging) { var dx = x - dragStartX; var dy = y - dragStartY; var distance = Math.sqrt(dx * dx + dy * dy); if (distance < 30) { // Tap - shoot player.shoot(x, y); } else if (distance > 100) { // Long swipe - parry player.parry(); } } isDragging = false; }; // Main game loop game.update = function () { if (!player || !currentRoom) return; // Update player player.update(); // Update player 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.damage); 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 meleeStat = player.meleeStats[player.currentMelee]; if (meleeStat.effect === 'reflect') { // Reflect bullet back var reflectedBullet = new Bullet(true, 'pistol'); reflectedBullet.x = enemyBullet.x; reflectedBullet.y = enemyBullet.y; reflectedBullet.direction = enemyBullet.direction + Math.PI; reflectedBullet.speed = 15; playerBullets.push(reflectedBullet); game.addChild(reflectedBullet); } else if (meleeStat.effect === 'shockwave') { // Damage nearby enemies for (var l = 0; l < currentRoom.enemies.length; l++) { var nearbyEnemy = currentRoom.enemies[l]; var dx = nearbyEnemy.x - player.x; var dy = nearbyEnemy.y - player.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance < 150 && nearbyEnemy.active) { nearbyEnemy.takeDamage(2); } } } LK.effects.flashObject(player, meleeStat.color, 300); LK.setScore(LK.getScore() + 3); } else { // Player takes damage player.takeDamage(); } enemyBullet.active = false; enemyBullet.destroy(); enemyBullets.splice(k, 1); } } // Update enemies for (var m = 0; m < currentRoom.enemies.length; m++) { var enemy = currentRoom.enemies[m]; if (enemy.active) { enemy.update(); } } // Update pickups for (var n = pickups.length - 1; n >= 0; n--) { var pickup = pickups[n]; pickup.update(); if (!pickup.active) { pickups.splice(n, 1); } } // Check room completion if (currentRoom.checkCleared()) { // Check if player reaches door if (currentRoom.door && player.intersects(currentRoom.door)) { generateNewRoom(); } } // Update UI periodically if (LK.ticks % 30 === 0) { updateUI(); } };
===================================================================
--- original.js
+++ change.js
@@ -5,53 +5,79 @@
/****
* Classes
****/
-var Bullet = Container.expand(function (isPlayerBullet) {
+var Bullet = Container.expand(function (isPlayer, gunType) {
var self = Container.call(this);
- self.isPlayerBullet = isPlayerBullet || false;
- var bulletGraphics = self.attachAsset(self.isPlayerBullet ? 'bullet' : 'enemyBullet', {
+ self.isPlayer = isPlayer || false;
+ self.gunType = gunType || 'pistol';
+ var bulletGraphics = self.attachAsset(self.isPlayer ? 'bullet' : 'enemyBullet', {
anchorX: 0.5,
anchorY: 0.5
});
- self.speed = 8;
+ // Different bullet properties based on gun type
+ if (self.isPlayer) {
+ switch (self.gunType) {
+ case 'pistol':
+ self.speed = 12;
+ self.damage = 1;
+ break;
+ case 'rifle':
+ self.speed = 18;
+ self.damage = 2;
+ break;
+ case 'shotgun':
+ self.speed = 10;
+ self.damage = 3;
+ break;
+ }
+ } else {
+ self.speed = 8;
+ self.damage = 1;
+ }
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) {
+ if (self.x < -100 || self.x > 2148 || self.y < -100 || self.y > 2832) {
self.active = false;
}
};
return self;
});
-var Enemy = Container.expand(function () {
+var Enemy = Container.expand(function (roomLevel) {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('enemy', {
anchorX: 0.5,
anchorY: 0.5
});
- self.health = 3;
- self.speed = 1.5;
+ // Scale difficulty with room level
+ self.health = Math.min(1 + Math.floor(roomLevel / 2), 5);
+ self.speed = Math.min(1 + roomLevel * 0.2, 3);
self.shootTimer = 0;
- self.shootCooldown = 90; // 1.5 seconds at 60fps
+ self.shootCooldown = Math.max(120 - roomLevel * 5, 60);
self.active = true;
+ self.lastPlayerX = 0;
+ self.lastPlayerY = 0;
self.update = function () {
if (!self.active || !player) return;
+ // Track last position for intersection detection
+ self.lastPlayerX = player.x;
+ self.lastPlayerY = player.y;
// 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) {
+ if (distance > 40) {
self.x += dx / distance * self.speed;
self.y += dy / distance * self.speed;
}
// Shooting logic
self.shootTimer++;
- if (self.shootTimer >= self.shootCooldown && distance < 400) {
+ if (self.shootTimer >= self.shootCooldown && distance < 500) {
self.shoot();
self.shootTimer = 0;
}
};
@@ -61,149 +87,270 @@
bullet.direction = angle;
bullet.x = self.x;
bullet.y = self.y;
enemyBullets.push(bullet);
- currentRoom.addChild(bullet);
+ game.addChild(bullet);
};
- self.takeDamage = function () {
- self.health--;
+ self.takeDamage = function (damage) {
+ self.health -= damage;
LK.effects.flashObject(self, 0xFFFFFF, 200);
if (self.health <= 0) {
self.active = false;
+ LK.setScore(LK.getScore() + 10);
LK.getSound('enemyHit').play();
+ // 20% chance to drop weapon pickup
+ if (Math.random() < 0.2) {
+ spawnPickup(self.x, self.y);
+ }
}
};
return self;
});
+var Pickup = Container.expand(function (type, x, y) {
+ var self = Container.call(this);
+ self.type = type; // 'gun' or 'melee'
+ self.x = x;
+ self.y = y;
+ self.active = true;
+ self.bobOffset = Math.random() * Math.PI * 2;
+ self.startY = y;
+ var pickupGraphics = self.attachAsset(type === 'gun' ? 'gunPickup' : 'meleePickup', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ // Determine what weapon this pickup contains
+ if (type === 'gun') {
+ var guns = ['pistol', 'rifle', 'shotgun'];
+ self.weapon = guns[Math.floor(Math.random() * guns.length)];
+ } else {
+ var melees = ['sword', 'hammer'];
+ self.weapon = melees[Math.floor(Math.random() * melees.length)];
+ }
+ self.update = function () {
+ if (!self.active) return;
+ // Bobbing animation
+ self.y = self.startY + Math.sin(LK.ticks * 0.1 + self.bobOffset) * 5;
+ // Check pickup collision with player
+ if (self.intersects(player)) {
+ self.active = false;
+ if (self.type === 'gun') {
+ player.switchGun(self.weapon);
+ } else {
+ player.switchMelee(self.weapon);
+ }
+ LK.getSound('pickup').play();
+ LK.setScore(LK.getScore() + 5);
+ self.destroy();
+ }
+ };
+ 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,
+ // Gun display
+ var gunGraphics = self.attachAsset('pistol', {
+ anchorX: 0,
+ anchorY: 0.5,
+ x: 20,
y: 0
});
- self.health = 5;
- self.maxHealth = 5;
- self.speed = 4;
+ // Melee weapon display
+ var meleeGraphics = self.attachAsset('sword', {
+ anchorX: 0.5,
+ anchorY: 1,
+ x: -15,
+ y: -10
+ });
+ self.health = 3;
+ self.maxHealth = 3;
+ self.speed = 5;
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
- });
+ // Weapon systems
+ self.currentGun = 'pistol';
+ self.currentMelee = 'sword';
+ // Gun properties
+ self.gunStats = {
+ pistol: {
+ cooldown: 12,
+ spread: 0
+ },
+ rifle: {
+ cooldown: 8,
+ spread: 0.1
+ },
+ shotgun: {
+ cooldown: 30,
+ spread: 0.3,
+ pellets: 3
+ }
};
+ // Melee properties
+ self.meleeStats = {
+ sword: {
+ parryWindow: 8,
+ cooldown: 25,
+ effect: 'reflect',
+ color: 0x1abc9c
+ },
+ hammer: {
+ parryWindow: 15,
+ cooldown: 45,
+ effect: 'shockwave',
+ color: 0xe74c3c
+ }
+ };
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);
+ var gunStat = self.gunStats[self.currentGun];
+ var baseAngle = Math.atan2(targetY - self.y, targetX - self.x);
+ if (self.currentGun === 'shotgun') {
+ // Shotgun fires multiple pellets
+ for (var i = 0; i < gunStat.pellets; i++) {
+ var bullet = new Bullet(true, self.currentGun);
+ bullet.direction = baseAngle + (Math.random() - 0.5) * gunStat.spread;
+ bullet.x = self.x;
+ bullet.y = self.y;
+ playerBullets.push(bullet);
+ game.addChild(bullet);
+ }
+ } else {
+ var bullet = new Bullet(true, self.currentGun);
+ bullet.direction = baseAngle + (Math.random() - 0.5) * gunStat.spread;
+ bullet.x = self.x;
+ bullet.y = self.y;
+ playerBullets.push(bullet);
+ game.addChild(bullet);
+ }
LK.getSound('shoot').play();
- self.shootCooldown = 15; // 0.25 seconds
+ self.shootCooldown = gunStat.cooldown;
};
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;
+ var meleeStat = self.meleeStats[self.currentMelee];
+ self.parryWindow = meleeStat.parryWindow;
+ self.parryCooldown = meleeStat.cooldown;
// Visual feedback
- var parryFX = currentRoom.attachAsset('parryEffect', {
+ var parryFX = game.attachAsset('parryEffect', {
anchorX: 0.5,
anchorY: 0.5,
x: self.x,
y: self.y,
- alpha: 0.7
+ alpha: 0.8,
+ tint: meleeStat.color
});
tween(parryFX, {
alpha: 0,
- scaleX: 1.5,
- scaleY: 1.5
+ scaleX: 2,
+ scaleY: 2
}, {
- duration: parryDuration * 16.67,
+ duration: meleeStat.parryWindow * 16.67,
onFinish: function onFinish() {
parryFX.destroy();
}
});
LK.getSound('parry').play();
};
+ self.switchGun = function (newGun) {
+ if (newGun && self.gunStats[newGun]) {
+ self.currentGun = newGun;
+ gunGraphics.destroy();
+ gunGraphics = self.attachAsset(newGun, {
+ anchorX: 0,
+ anchorY: 0.5,
+ x: 20,
+ y: 0
+ });
+ }
+ };
+ self.switchMelee = function (newMelee) {
+ if (newMelee && self.meleeStats[newMelee]) {
+ self.currentMelee = newMelee;
+ meleeGraphics.destroy();
+ meleeGraphics = self.attachAsset(newMelee, {
+ anchorX: 0.5,
+ anchorY: 1,
+ x: -15,
+ y: -10
+ });
+ }
+ };
self.takeDamage = function () {
self.health--;
LK.effects.flashObject(self, 0xFF0000, 500);
LK.getSound('playerHit').play();
if (self.health <= 0) {
LK.showGameOver();
}
- updateHealthDisplay();
};
+ self.heal = function (amount) {
+ self.health = Math.min(self.health + amount, self.maxHealth);
+ };
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 Room = Container.expand(function (level) {
var self = Container.call(this);
+ self.level = level || 1;
self.enemies = [];
+ self.pickups = [];
self.cleared = false;
- self.roomWidth = 1800;
- self.roomHeight = 2400;
+ self.door = null;
self.generateRoom = function () {
- // Create walls
- for (var i = 0; i < 18; i++) {
+ // Create border walls
+ var wallSize = 60;
+ var roomWidth = 2048;
+ var roomHeight = 2732;
+ var wallsX = Math.floor(roomWidth / wallSize);
+ var wallsY = Math.floor(roomHeight / wallSize);
+ // Top and bottom walls
+ for (var i = 0; i < wallsX; i++) {
var topWall = self.attachAsset('wall', {
- x: i * 100 + 124,
- y: 166
+ x: i * wallSize,
+ y: 0
});
var bottomWall = self.attachAsset('wall', {
- x: i * 100 + 124,
- y: 2466
+ x: i * wallSize,
+ y: roomHeight - wallSize
});
}
- for (var j = 0; j < 23; j++) {
+ // Left and right walls
+ for (var j = 1; j < wallsY - 1; j++) {
var leftWall = self.attachAsset('wall', {
- x: 124,
- y: j * 100 + 166
+ x: 0,
+ y: j * wallSize
});
var rightWall = self.attachAsset('wall', {
- x: 1824,
- y: j * 100 + 166
+ x: roomWidth - wallSize,
+ y: j * wallSize
});
}
// Generate enemies
- var enemyCount = Math.floor(Math.random() * 4) + 3;
+ var enemyCount = Math.min(2 + self.level, 8);
for (var k = 0; k < enemyCount; k++) {
- var enemy = new Enemy();
- enemy.x = Math.random() * 1400 + 300;
- enemy.y = Math.random() * 1800 + 400;
+ var enemy = new Enemy(self.level);
+ enemy.x = 200 + Math.random() * (roomWidth - 400);
+ enemy.y = 200 + Math.random() * (roomHeight - 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
- });
- }
+ // Create exit door (initially locked)
+ self.door = self.attachAsset('door', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ x: roomWidth / 2,
+ y: wallSize / 2,
+ tint: 0xc0392b
+ });
};
self.checkCleared = function () {
var activeEnemies = 0;
for (var i = 0; i < self.enemies.length; i++) {
@@ -212,11 +359,12 @@
}
}
if (activeEnemies === 0 && !self.cleared) {
self.cleared = true;
- if (nextRoomDoor) {
- tween(nextRoomDoor, {
- tint: 0x2ECC71
+ // Unlock door
+ if (self.door) {
+ tween(self.door, {
+ tint: 0x27ae60
}, {
duration: 500
});
}
@@ -229,9 +377,9 @@
/****
* Initialize Game
****/
var game = new LK.Game({
- backgroundColor: 0x2C3E50
+ backgroundColor: 0x1a1a1a
});
/****
* Game Code
@@ -239,88 +387,139 @@
var player;
var currentRoom;
var playerBullets = [];
var enemyBullets = [];
-var roomNumber = 1;
-var nextRoomDoor;
+var pickups = [];
+var roomLevel = 1;
+var dragStartX = 0;
+var dragStartY = 0;
+var isDragging = false;
// UI Elements
-var healthText = new Text2('Health: 5/5', {
- size: 60,
- fill: 0xE74C3C
+var scoreText = new Text2('Score: 0', {
+ size: 40,
+ fill: '#ffffff'
});
-healthText.anchor.set(0, 0);
+scoreText.anchor.set(0.5, 0);
+LK.gui.top.addChild(scoreText);
+var healthText = new Text2('Health: 3/3', {
+ size: 35,
+ fill: '#e74c3c'
+});
+healthText.anchor.set(1, 0);
LK.gui.topRight.addChild(healthText);
var roomText = new Text2('Room: 1', {
- size: 60,
- fill: 0x3498DB
+ size: 30,
+ fill: '#3498db'
});
-roomText.anchor.set(0.5, 0);
-LK.gui.top.addChild(roomText);
-var weaponText = new Text2('Weapon: Sword', {
- size: 50,
- fill: 0x95A5A6
+roomText.anchor.set(0, 0);
+roomText.x = 120;
+LK.gui.topLeft.addChild(roomText);
+var gunText = new Text2('Gun: Pistol', {
+ size: 28,
+ fill: '#f39c12'
});
-weaponText.anchor.set(0, 1);
-LK.gui.bottomLeft.addChild(weaponText);
-function updateHealthDisplay() {
+gunText.anchor.set(0, 1);
+LK.gui.bottomLeft.addChild(gunText);
+var meleeText = new Text2('Melee: Sword', {
+ size: 28,
+ fill: '#9b59b6'
+});
+meleeText.anchor.set(1, 1);
+LK.gui.bottomRight.addChild(meleeText);
+function updateUI() {
+ scoreText.setText('Score: ' + LK.getScore());
healthText.setText('Health: ' + player.health + '/' + player.maxHealth);
+ roomText.setText('Room: ' + roomLevel);
+ gunText.setText('Gun: ' + player.currentGun.charAt(0).toUpperCase() + player.currentGun.slice(1));
+ meleeText.setText('Melee: ' + player.currentMelee.charAt(0).toUpperCase() + player.currentMelee.slice(1));
}
-function updateRoomDisplay() {
- roomText.setText('Room: ' + roomNumber);
+function spawnPickup(x, y) {
+ var pickupType = Math.random() < 0.6 ? 'gun' : 'melee';
+ var pickup = new Pickup(pickupType, x, y);
+ pickups.push(pickup);
+ game.addChild(pickup);
}
-function updateWeaponDisplay() {
- weaponText.setText('Weapon: ' + (player.weaponType === 'sword' ? 'Sword' : 'Hammer'));
-}
function generateNewRoom() {
+ // Clear current room
if (currentRoom) {
currentRoom.destroy();
}
- currentRoom = new Room();
+ // Clear bullets and pickups
+ for (var i = 0; i < playerBullets.length; i++) {
+ playerBullets[i].destroy();
+ }
+ for (var j = 0; j < enemyBullets.length; j++) {
+ enemyBullets[j].destroy();
+ }
+ for (var k = 0; k < pickups.length; k++) {
+ pickups[k].destroy();
+ }
+ playerBullets = [];
+ enemyBullets = [];
+ pickups = [];
+ // Create new room
+ roomLevel++;
+ currentRoom = new Room(roomLevel);
currentRoom.generateRoom();
game.addChild(currentRoom);
// Reset player position
player.x = 1024;
- player.y = 2200;
- // Clear bullets
- playerBullets = [];
- enemyBullets = [];
- roomNumber++;
- updateRoomDisplay();
+ player.y = 2400;
+ game.addChild(player);
+ updateUI();
}
-// Initialize first room and player
-currentRoom = new Room();
+// Initialize game
+currentRoom = new Room(roomLevel);
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;
+player.y = 2400;
+game.addChild(player);
+updateUI();
+// Touch controls
game.down = function (x, y, obj) {
isDragging = true;
dragStartX = x;
dragStartY = y;
};
+game.move = function (x, y, obj) {
+ if (isDragging) {
+ var dx = x - dragStartX;
+ var dy = y - dragStartY;
+ var distance = Math.sqrt(dx * dx + dy * dy);
+ // Move player based on drag
+ if (distance > 20) {
+ var moveSpeed = player.speed;
+ var newX = player.x + dx / distance * moveSpeed;
+ var newY = player.y + dy / distance * moveSpeed;
+ // Keep player in bounds
+ player.x = Math.max(80, Math.min(1968, newX));
+ player.y = Math.max(80, Math.min(2652, newY));
+ }
+ }
+};
game.up = function (x, y, obj) {
if (isDragging) {
- var dragDistance = Math.sqrt((x - dragStartX) * (x - dragStartX) + (y - dragStartY) * (y - dragStartY));
- if (dragDistance < 50) {
+ var dx = x - dragStartX;
+ var dy = y - dragStartY;
+ var distance = Math.sqrt(dx * dx + dy * dy);
+ if (distance < 30) {
// Tap - shoot
player.shoot(x, y);
- } else {
- // Swipe - parry
+ } else if (distance > 100) {
+ // Long swipe - parry
player.parry();
}
}
isDragging = false;
};
+// Main game loop
game.update = function () {
if (!player || !currentRoom) return;
// Update player
player.update();
- // Update bullets
+ // Update player bullets
for (var i = playerBullets.length - 1; i >= 0; i--) {
var bullet = playerBullets[i];
bullet.update();
if (!bullet.active) {
@@ -331,9 +530,9 @@
// 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();
+ enemy.takeDamage(bullet.damage);
bullet.active = false;
bullet.destroy();
playerBullets.splice(i, 1);
break;
@@ -352,16 +551,32 @@
// 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);
+ var meleeStat = player.meleeStats[player.currentMelee];
+ if (meleeStat.effect === 'reflect') {
+ // Reflect bullet back
+ var reflectedBullet = new Bullet(true, 'pistol');
+ reflectedBullet.x = enemyBullet.x;
+ reflectedBullet.y = enemyBullet.y;
+ reflectedBullet.direction = enemyBullet.direction + Math.PI;
+ reflectedBullet.speed = 15;
+ playerBullets.push(reflectedBullet);
+ game.addChild(reflectedBullet);
+ } else if (meleeStat.effect === 'shockwave') {
+ // Damage nearby enemies
+ for (var l = 0; l < currentRoom.enemies.length; l++) {
+ var nearbyEnemy = currentRoom.enemies[l];
+ var dx = nearbyEnemy.x - player.x;
+ var dy = nearbyEnemy.y - player.y;
+ var distance = Math.sqrt(dx * dx + dy * dy);
+ if (distance < 150 && nearbyEnemy.active) {
+ nearbyEnemy.takeDamage(2);
+ }
+ }
+ }
+ LK.effects.flashObject(player, meleeStat.color, 300);
+ LK.setScore(LK.getScore() + 3);
} else {
// Player takes damage
player.takeDamage();
}
@@ -370,23 +585,30 @@
enemyBullets.splice(k, 1);
}
}
// Update enemies
- for (var l = 0; l < currentRoom.enemies.length; l++) {
- var enemy = currentRoom.enemies[l];
+ for (var m = 0; m < currentRoom.enemies.length; m++) {
+ var enemy = currentRoom.enemies[m];
if (enemy.active) {
enemy.update();
}
}
- // Check if room is cleared
+ // Update pickups
+ for (var n = pickups.length - 1; n >= 0; n--) {
+ var pickup = pickups[n];
+ pickup.update();
+ if (!pickup.active) {
+ pickups.splice(n, 1);
+ }
+ }
+ // Check room completion
if (currentRoom.checkCleared()) {
- // Check if player touches door
- if (nextRoomDoor && player.intersects(nextRoomDoor)) {
+ // Check if player reaches door
+ if (currentRoom.door && player.intersects(currentRoom.door)) {
generateNewRoom();
}
}
- // Weapon switching (every 5 seconds for demo)
- if (LK.ticks % 300 === 0) {
- player.switchWeapon();
- updateWeaponDisplay();
+ // Update UI periodically
+ if (LK.ticks % 30 === 0) {
+ updateUI();
}
};
\ No newline at end of file