/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Enemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('enemy', {
anchorX: 0.5,
anchorY: 0.5
});
self.maxHealth = 40;
self.health = 40;
self.attackPower = 15;
self.speed = 1;
self.lastAttackTime = 0;
self.attackCooldown = 120; // 2 seconds at 60fps
self.attackRange = 80;
self.takeDamage = function (damage) {
self.health = Math.max(0, self.health - damage);
LK.effects.flashObject(self, 0xffffff, 100);
LK.getSound('enemyHit').play();
if (self.health <= 0) {
self.die();
}
};
self.die = function () {
enemies.splice(enemies.indexOf(self), 1);
self.destroy();
checkWaveComplete();
};
self.update = function () {
// 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 > self.attackRange) {
var moveX = dx / distance * self.speed;
var moveY = dy / distance * self.speed;
var newX = self.x + moveX;
var newY = self.y + moveY;
// Keep enemy in arena bounds
var centerX = 2048 / 2;
var centerY = 2732 / 2;
var arenaRadius = 380;
var distFromCenter = Math.sqrt((newX - centerX) * (newX - centerX) + (newY - centerY) * (newY - centerY));
if (distFromCenter <= arenaRadius) {
self.x = newX;
self.y = newY;
}
} else {
// Attack player if in range and cooldown is over
if (LK.ticks - self.lastAttackTime >= self.attackCooldown) {
player.takeDamage(self.attackPower);
self.lastAttackTime = LK.ticks;
}
}
};
return self;
});
var FastEnemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('fastEnemy', {
anchorX: 0.5,
anchorY: 0.5
});
self.maxHealth = 25;
self.health = 25;
self.attackPower = 10;
self.speed = 2.5;
self.lastAttackTime = 0;
self.attackCooldown = 90; // 1.5 seconds at 60fps
self.attackRange = 60;
self.takeDamage = function (damage) {
self.health = Math.max(0, self.health - damage);
LK.effects.flashObject(self, 0xffffff, 100);
LK.getSound('enemyHit').play();
if (self.health <= 0) {
self.die();
}
};
self.die = function () {
enemies.splice(enemies.indexOf(self), 1);
self.destroy();
checkWaveComplete();
};
self.update = function () {
// 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 > self.attackRange) {
var moveX = dx / distance * self.speed;
var moveY = dy / distance * self.speed;
var newX = self.x + moveX;
var newY = self.y + moveY;
// Keep enemy in arena bounds
var centerX = 2048 / 2;
var centerY = 2732 / 2;
var arenaRadius = 380;
var distFromCenter = Math.sqrt((newX - centerX) * (newX - centerX) + (newY - centerY) * (newY - centerY));
if (distFromCenter <= arenaRadius) {
self.x = newX;
self.y = newY;
}
} else {
// Attack player if in range and cooldown is over
if (LK.ticks - self.lastAttackTime >= self.attackCooldown) {
player.takeDamage(self.attackPower);
self.lastAttackTime = LK.ticks;
}
}
};
return self;
});
var NarrativeText = Container.expand(function () {
var self = Container.call(this);
self.textDisplay = new Text2('', {
size: 40,
fill: 0xFFFFFF
});
self.textDisplay.anchor.set(0.5, 0.5);
self.addChild(self.textDisplay);
self.messages = ["Fight bravely!", "Enemies approach!", "Stay alert!", "Collect power-ups!", "Victory is near!", "Survive the wave!", "Show your strength!", "Battle continues!"];
self.currentMessage = 0;
self.messageTimer = 0;
self.messageDuration = 180; // 3 seconds at 60fps
self.showMessage = function (message) {
self.textDisplay.setText(message);
self.messageTimer = self.messageDuration;
};
self.update = function () {
if (self.messageTimer > 0) {
self.messageTimer--;
self.textDisplay.alpha = Math.min(1, self.messageTimer / 60);
}
// Show random narrative messages
if (LK.ticks % 300 === 0 && Math.random() < 0.3) {
var message = self.messages[Math.floor(Math.random() * self.messages.length)];
self.showMessage(message);
}
};
return self;
});
var Player = Container.expand(function () {
var self = Container.call(this);
var playerGraphics = self.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5
});
self.maxHealth = 100;
self.health = 100;
self.attackPower = 20;
self.attackBoostTime = 0;
self.lastAttackTime = 0;
self.attackCooldown = 500; // 500ms cooldown between attacks
self.takeDamage = function (damage) {
self.health = Math.max(0, self.health - damage);
LK.effects.flashObject(self, 0xff0000, 200);
LK.getSound('hit').play();
updatePlayerHealthBar();
if (narrativeText) {
narrativeText.showMessage("You take damage!");
}
if (self.health <= 0) {
if (narrativeText) {
narrativeText.showMessage("Game Over!");
}
LK.showGameOver();
}
};
self.heal = function (amount) {
self.health = Math.min(self.maxHealth, self.health + amount);
updatePlayerHealthBar();
};
self.boostAttack = function () {
self.attackBoostTime = LK.ticks + 300; // 5 second boost at 60fps
playerGraphics.tint = 0xffd700;
};
self.attack = function (enemy) {
if (LK.ticks - self.lastAttackTime < self.attackCooldown / (1000 / 60)) return false;
var damage = self.attackPower;
if (LK.ticks < self.attackBoostTime) {
damage *= 2;
}
enemy.takeDamage(damage);
self.lastAttackTime = LK.ticks;
return true;
};
self.update = function () {
if (LK.ticks >= self.attackBoostTime) {
playerGraphics.tint = 0xffffff;
}
};
return self;
});
var PowerUp = Container.expand(function (type) {
var self = Container.call(this);
self.type = type;
var assetName = type === 'health' ? 'healthPotion' : 'attackBooster';
var powerUpGraphics = self.attachAsset(assetName, {
anchorX: 0.5,
anchorY: 0.5
});
self.lifeTime = 600; // 10 seconds at 60fps
self.age = 0;
self.collect = function () {
if (self.type === 'health') {
player.heal(30);
if (narrativeText) {
narrativeText.showMessage("Health restored!");
}
} else {
player.boostAttack();
if (narrativeText) {
narrativeText.showMessage("Attack boosted!");
}
}
LK.getSound('powerup').play();
powerUps.splice(powerUps.indexOf(self), 1);
self.destroy();
};
self.update = function () {
self.age++;
// Pulse effect
var pulse = Math.sin(self.age * 0.2) * 0.2 + 1;
powerUpGraphics.scaleX = pulse;
powerUpGraphics.scaleY = pulse;
// Remove if expired
if (self.age >= self.lifeTime) {
powerUps.splice(powerUps.indexOf(self), 1);
self.destroy();
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x1a1a1a
});
/****
* Game Code
****/
// Game variables
var player;
var enemies = [];
var powerUps = [];
var currentWave = 1;
var dragNode = null;
var lastPowerUpSpawn = 0;
var narrativeText;
// UI elements
var waveText;
var playerHealthBar;
var playerHealthBarBg;
// Create arena
var arena = game.addChild(LK.getAsset('arena', {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2,
y: 2732 / 2
}));
// Create player
player = game.addChild(new Player());
player.x = 2048 / 2;
player.y = 2732 / 2;
// Create UI
waveText = new Text2('Wave 1', {
size: 60,
fill: 0xFFFFFF
});
waveText.anchor.set(0.5, 0);
LK.gui.top.addChild(waveText);
waveText.y = 100;
// Health bar background
playerHealthBarBg = LK.gui.bottomLeft.addChild(LK.getAsset('healthBarBg', {
x: 100,
y: -100
}));
// Health bar
playerHealthBar = LK.gui.bottomLeft.addChild(LK.getAsset('healthBar', {
x: 100,
y: -100
}));
// Initialize narrative system
narrativeText = new NarrativeText();
narrativeText.x = 2048 / 2;
narrativeText.y = 200;
LK.gui.center.addChild(narrativeText);
function updatePlayerHealthBar() {
var healthPercent = player.health / player.maxHealth;
playerHealthBar.scaleX = healthPercent;
}
function spawnWave(waveNumber) {
var enemyCount = Math.min(2 + waveNumber, 8);
var fastEnemyCount = Math.max(0, waveNumber - 2);
for (var i = 0; i < enemyCount; i++) {
spawnEnemy();
}
for (var j = 0; j < fastEnemyCount; j++) {
spawnFastEnemy();
}
waveText.setText('Wave ' + waveNumber);
narrativeText.showMessage("Wave " + waveNumber + " begins!");
}
function spawnEnemy() {
var enemy = game.addChild(new Enemy());
// Spawn at random position on arena edge
var angle = Math.random() * Math.PI * 2;
var radius = 350;
var centerX = 2048 / 2;
var centerY = 2732 / 2;
enemy.x = centerX + Math.cos(angle) * radius;
enemy.y = centerY + Math.sin(angle) * radius;
enemies.push(enemy);
}
function spawnFastEnemy() {
var enemy = game.addChild(new FastEnemy());
// Spawn at random position on arena edge
var angle = Math.random() * Math.PI * 2;
var radius = 350;
var centerX = 2048 / 2;
var centerY = 2732 / 2;
enemy.x = centerX + Math.cos(angle) * radius;
enemy.y = centerY + Math.sin(angle) * radius;
enemies.push(enemy);
}
function spawnPowerUp() {
var type = Math.random() < 0.6 ? 'health' : 'attack';
var powerUp = game.addChild(new PowerUp(type));
// Spawn at random position in arena
var angle = Math.random() * Math.PI * 2;
var radius = Math.random() * 300;
var centerX = 2048 / 2;
var centerY = 2732 / 2;
powerUp.x = centerX + Math.cos(angle) * radius;
powerUp.y = centerY + Math.sin(angle) * radius;
powerUps.push(powerUp);
}
function checkWaveComplete() {
if (enemies.length === 0) {
currentWave++;
LK.setScore(currentWave - 1);
// Small delay before next wave
LK.setTimeout(function () {
spawnWave(currentWave);
}, 2000);
}
}
function isInArena(x, y) {
var centerX = 2048 / 2;
var centerY = 2732 / 2;
var distance = Math.sqrt((x - centerX) * (x - centerX) + (y - centerY) * (y - centerY));
return distance <= 380;
}
// Touch controls
game.down = function (x, y, obj) {
if (isInArena(x, y)) {
dragNode = player;
player.x = x;
player.y = y;
}
};
game.move = function (x, y, obj) {
if (dragNode && isInArena(x, y)) {
dragNode.x = x;
dragNode.y = y;
}
};
game.up = function (x, y, obj) {
dragNode = null;
};
// Main game loop
game.update = function () {
// Update narrative system
narrativeText.update();
// Check player attacks on enemies
for (var i = enemies.length - 1; i >= 0; i--) {
var enemy = enemies[i];
var distance = Math.sqrt((player.x - enemy.x) * (player.x - enemy.x) + (player.y - enemy.y) * (player.y - enemy.y));
if (distance < 70) {
player.attack(enemy);
}
}
// Check power-up collection
for (var j = powerUps.length - 1; j >= 0; j--) {
var powerUp = powerUps[j];
var distance = Math.sqrt((player.x - powerUp.x) * (player.x - powerUp.x) + (player.y - powerUp.y) * (player.y - powerUp.y));
if (distance < 50) {
powerUp.collect();
}
}
// Spawn power-ups occasionally
if (LK.ticks - lastPowerUpSpawn > 300 && Math.random() < 0.02) {
if (powerUps.length < 3) {
spawnPowerUp();
lastPowerUpSpawn = LK.ticks;
}
}
};
// Start first wave
spawnWave(currentWave); ===================================================================
--- original.js
+++ change.js
@@ -1,9 +1,8 @@
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
-var facekit = LK.import("@upit/facekit.v1");
/****
* Classes
****/
@@ -124,9 +123,9 @@
fill: 0xFFFFFF
});
self.textDisplay.anchor.set(0.5, 0.5);
self.addChild(self.textDisplay);
- self.messages = ["You are being hunted...", "They can see you clearly now", "You try to dodge their attacks", "Your movements are being watched", "They are closing in on you", "You search for power-ups desperately", "Your health is their target", "You fight back against the watchers"];
+ self.messages = ["Fight bravely!", "Enemies approach!", "Stay alert!", "Collect power-ups!", "Victory is near!", "Survive the wave!", "Show your strength!", "Battle continues!"];
self.currentMessage = 0;
self.messageTimer = 0;
self.messageDuration = 180; // 3 seconds at 60fps
self.showMessage = function (message) {
@@ -163,13 +162,13 @@
LK.effects.flashObject(self, 0xff0000, 200);
LK.getSound('hit').play();
updatePlayerHealthBar();
if (narrativeText) {
- narrativeText.showMessage("You feel their strike upon you");
+ narrativeText.showMessage("You take damage!");
}
if (self.health <= 0) {
if (narrativeText) {
- narrativeText.showMessage("They have defeated you...");
+ narrativeText.showMessage("Game Over!");
}
LK.showGameOver();
}
};
@@ -211,14 +210,14 @@
self.collect = function () {
if (self.type === 'health') {
player.heal(30);
if (narrativeText) {
- narrativeText.showMessage("You restore your strength");
+ narrativeText.showMessage("Health restored!");
}
} else {
player.boostAttack();
if (narrativeText) {
- narrativeText.showMessage("You feel more powerful");
+ narrativeText.showMessage("Attack boosted!");
}
}
LK.getSound('powerup').play();
powerUps.splice(powerUps.indexOf(self), 1);
@@ -237,43 +236,8 @@
}
};
return self;
});
-var SecondPersonCamera = Container.expand(function () {
- var self = Container.call(this);
- self.targetEnemy = null;
- self.cameraOffset = {
- x: 0,
- y: 0
- };
- self.smoothing = 0.1;
- self.setTarget = function (enemy) {
- self.targetEnemy = enemy;
- };
- self.update = function () {
- if (self.targetEnemy && !self.targetEnemy.destroyed) {
- // Calculate desired camera position (behind enemy looking at player)
- var dx = player.x - self.targetEnemy.x;
- var dy = player.y - self.targetEnemy.y;
- var distance = Math.sqrt(dx * dx + dy * dy);
- if (distance > 0) {
- // Position camera behind enemy
- var offsetDistance = 150;
- var targetX = self.targetEnemy.x - dx / distance * offsetDistance;
- var targetY = self.targetEnemy.y - dy / distance * offsetDistance;
- // Smooth camera movement
- self.cameraOffset.x += (targetX - 2048 / 2 - self.cameraOffset.x) * self.smoothing;
- self.cameraOffset.y += (targetY - 2732 / 2 - self.cameraOffset.y) * self.smoothing;
- }
- } else {
- // Find new target enemy
- if (enemies.length > 0) {
- self.setTarget(enemies[Math.floor(Math.random() * enemies.length)]);
- }
- }
- };
- return self;
-});
/****
* Initialize Game
****/
@@ -290,11 +254,9 @@
var powerUps = [];
var currentWave = 1;
var dragNode = null;
var lastPowerUpSpawn = 0;
-var secondPersonCamera;
var narrativeText;
-var faceDetected = false;
// UI elements
var waveText;
var playerHealthBar;
var playerHealthBarBg;
@@ -326,29 +288,13 @@
playerHealthBar = LK.gui.bottomLeft.addChild(LK.getAsset('healthBar', {
x: 100,
y: -100
}));
-// Initialize second-person systems
-secondPersonCamera = new SecondPersonCamera();
+// Initialize narrative system
narrativeText = new NarrativeText();
narrativeText.x = 2048 / 2;
narrativeText.y = 200;
LK.gui.center.addChild(narrativeText);
-// Setup face tracking for second-person immersion
-facekit.onFaceDetected = function (faces) {
- faceDetected = faces.length > 0;
- if (faceDetected && faces[0]) {
- // Use face position to influence camera perspective
- var face = faces[0];
- var faceX = face.x * 2048;
- var faceY = face.y * 2732;
- // Adjust camera based on where player is looking
- if (secondPersonCamera.targetEnemy) {
- secondPersonCamera.cameraOffset.x += (faceX - 2048 / 2) * 0.02;
- secondPersonCamera.cameraOffset.y += (faceY - 2732 / 2) * 0.02;
- }
- }
-};
function updatePlayerHealthBar() {
var healthPercent = player.health / player.maxHealth;
playerHealthBar.scaleX = healthPercent;
}
@@ -360,10 +306,10 @@
}
for (var j = 0; j < fastEnemyCount; j++) {
spawnFastEnemy();
}
- waveText.setText('They send Wave ' + waveNumber + ' after you');
- narrativeText.showMessage("You face wave " + waveNumber + " of your pursuers");
+ waveText.setText('Wave ' + waveNumber);
+ narrativeText.showMessage("Wave " + waveNumber + " begins!");
}
function spawnEnemy() {
var enemy = game.addChild(new Enemy());
// Spawn at random position on arena edge
@@ -432,19 +378,10 @@
dragNode = null;
};
// Main game loop
game.update = function () {
- // Update second-person systems
- secondPersonCamera.update();
+ // Update narrative system
narrativeText.update();
- // Apply camera transformation for second-person perspective
- game.x = -secondPersonCamera.cameraOffset.x;
- game.y = -secondPersonCamera.cameraOffset.y;
- // Add subtle perspective effects when face is detected
- if (faceDetected) {
- game.rotation = Math.sin(LK.ticks * 0.01) * 0.02; // Slight sway
- narrativeText.showMessage("You are being observed...");
- }
// Check player attacks on enemies
for (var i = enemies.length - 1; i >= 0; i--) {
var enemy = enemies[i];
var distance = Math.sqrt((player.x - enemy.x) * (player.x - enemy.x) + (player.y - enemy.y) * (player.y - enemy.y));
Dio. In-Game asset. 2d. High contrast. No shadows
Star platinum jojo. In-Game asset. 2d. High contrast. No shadows
Un hombre con pelo largo color rosado con manchas negras y sin camisa con pantalón morado jojo's. In-Game asset. 2d. High contrast. No shadows
Jotaro con cuerpo y que se vea su cabeza jojo's. In-Game asset. 2d. High contrast. No shadows
Egipto Scenery. In-Game asset. 2d. High contrast. No shadows
Point. In-Game asset. 2d. High contrast. No shadows
Barra de vida jojo's. In-Game asset. 2d. High contrast. No shadows
Star platinum jotaro con cuerpo completo jojo's. In-Game asset. 2d. High contrast. No shadows
Bala. In-Game asset. 2d. High contrast. No shadows
Kars cuerpo completo jojo's. In-Game asset. 2d. High contrast. No shadows
Jolyne cuerpo completo jojo's. In-Game asset. 2d. High contrast. No shadows
Kakyoin cuerpo completo jojo's. In-Game asset. 2d. High contrast. No shadows
Un pueblo con casa y un piso café jojo's. In-Game asset. 2d. High contrast. No shadows
Hazlo grande