/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
var Bullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.attachAsset('bullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 20;
self.direction = {
x: 0,
y: -1
}; // Default direction is upward
self.update = function () {
self.x += self.direction.x * self.speed;
self.y += self.direction.y * self.speed;
};
return self;
});
var CameraHead = Container.expand(function () {
var self = Container.call(this);
// Main camera body
var body = self.attachAsset('cameraHead', {
anchorX: 0.5,
anchorY: 0.5
});
// Camera lens
var lens = self.attachAsset('cameraLens', {
anchorX: 0.5,
anchorY: 0.5,
y: -40
});
// Flash effect (initially invisible)
var flashEffect = self.attachAsset('flash', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0
});
// Public properties
self.isShooting = false;
self.shootCooldown = 0;
self.flashEnabled = true;
// Activate flash effect
self.flash = function () {
if (!self.flashEnabled) return;
self.flashEnabled = false;
flashEffect.alpha = 0.7;
tween(flashEffect, {
alpha: 0
}, {
duration: 300,
onFinish: function onFinish() {
self.flashEnabled = true;
}
});
};
self.update = function () {
if (self.shootCooldown > 0) {
self.shootCooldown--;
}
};
return self;
});
var ToiletMonster = Container.expand(function () {
var self = Container.call(this);
// Toilet body
var body = self.attachAsset('toiletBody', {
anchorX: 0.5,
anchorY: 0.5
});
// Toilet seat
var seat = self.attachAsset('toiletSeat', {
anchorX: 0.5,
anchorY: 0.5,
y: -30
});
// Human head
var head = self.attachAsset('humanHead', {
anchorX: 0.5,
anchorY: 0.5,
y: -70
});
// Public properties
self.speed = 3;
self.health = 1;
self.points = 100;
self.direction = {
x: 0,
y: 0
};
// Set target position to move towards
self.setTarget = function (targetX, targetY) {
var dx = targetX - self.x;
var dy = targetY - self.y;
var dist = Math.sqrt(dx * dx + dy * dy);
if (dist > 0) {
self.direction.x = dx / dist;
self.direction.y = dy / dist;
}
};
// Take damage
self.takeDamage = function () {
self.health--;
// Flash white
tween(self, {
alpha: 0.2
}, {
duration: 100,
onFinish: function onFinish() {
tween(self, {
alpha: 1
}, {
duration: 100
});
}
});
return self.health <= 0;
};
self.update = function () {
self.x += self.direction.x * self.speed;
self.y += self.direction.y * self.speed;
// Wobble animation
seat.rotation = Math.sin(LK.ticks / 10) * 0.1;
head.rotation = Math.sin(LK.ticks / 15 + 1) * 0.05;
};
return self;
});
var BossToiletMonster = ToiletMonster.expand(function () {
var self = ToiletMonster.call(this);
// Make it bigger
self.scale.set(1.5);
// Override properties
self.health = 3;
self.speed = 2;
self.points = 300;
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x33aa88
});
/****
* Game Code
****/
// Game state variables
var player;
var bullets = [];
var toilets = [];
var score = 0;
var spawnCooldown = 0;
var gameLevel = 1;
var enemiesKilled = 0;
// UI elements
var scoreTxt;
var levelTxt;
// Initialize game
function initGame() {
// Create player
player = new CameraHead();
player.x = 2048 / 2;
player.y = 2732 - 300;
game.addChild(player);
// Create score text
scoreTxt = new Text2('Score: 0', {
size: 80,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0, 0);
LK.gui.topRight.addChild(scoreTxt);
// Create level text
levelTxt = new Text2('Level: 1', {
size: 80,
fill: 0xFFFFFF
});
levelTxt.anchor.set(1, 0);
LK.gui.topLeft.addChild(levelTxt);
levelTxt.x = 200; // Move away from very top left corner
// Update score
updateScore(0);
// Play background music
LK.playMusic('gameMusic');
}
// Update score display
function updateScore(points) {
score += points;
LK.setScore(score);
scoreTxt.setText('Score: ' + score);
}
// Spawn a toilet monster
function spawnToilet() {
var toilet;
// Spawn boss every 10 kills
if (enemiesKilled > 0 && enemiesKilled % 10 === 0) {
toilet = new BossToiletMonster();
} else {
toilet = new ToiletMonster();
}
// Adjust difficulty based on level
toilet.speed += (gameLevel - 1) * 0.5;
// Position toilet at random edge of screen
var edge = Math.floor(Math.random() * 4); // 0: top, 1: right, 2: bottom, 3: left
switch (edge) {
case 0:
// Top
toilet.x = Math.random() * 2048;
toilet.y = -100;
break;
case 1:
// Right
toilet.x = 2048 + 100;
toilet.y = Math.random() * 2732;
break;
case 2:
// Bottom
toilet.x = Math.random() * 2048;
toilet.y = 2732 + 100;
break;
case 3:
// Left
toilet.x = -100;
toilet.y = Math.random() * 2732;
break;
}
// Set target to player
toilet.setTarget(player.x, player.y);
// Add to game
toilets.push(toilet);
game.addChild(toilet);
}
// Fire a bullet
function fireBullet(targetX, targetY) {
if (player.shootCooldown > 0) return;
// Create bullet
var bullet = new Bullet();
bullet.x = player.x;
bullet.y = player.y - 50;
// Calculate direction to target
var dx = targetX - bullet.x;
var dy = targetY - bullet.y;
var dist = Math.sqrt(dx * dx + dy * dy);
if (dist > 0) {
bullet.direction.x = dx / dist;
bullet.direction.y = dy / dist;
}
// Add to game
bullets.push(bullet);
game.addChild(bullet);
// Flash camera
player.flash();
// Play sound
LK.getSound('shoot').play();
// Set cooldown
player.shootCooldown = 10;
}
// Main game update
game.update = function () {
// Update player
player.update();
// Spawn toilets
if (spawnCooldown <= 0) {
spawnToilet();
spawnCooldown = Math.max(30, 120 - gameLevel * 10); // Spawn faster as level increases
} else {
spawnCooldown--;
}
// Update bullets
for (var i = bullets.length - 1; i >= 0; i--) {
var bullet = bullets[i];
bullet.update();
// Check if bullet is off screen
if (bullet.x < -100 || bullet.x > 2148 || bullet.y < -100 || bullet.y > 2832) {
bullet.destroy();
bullets.splice(i, 1);
continue;
}
// Check collision with toilets
for (var j = toilets.length - 1; j >= 0; j--) {
var toilet = toilets[j];
if (bullet.intersects(toilet)) {
// Destroy bullet
bullet.destroy();
bullets.splice(i, 1);
// Damage toilet
if (toilet.takeDamage()) {
// If toilet is destroyed
updateScore(toilet.points);
LK.getSound('toiletDeath').play();
toilet.destroy();
toilets.splice(j, 1);
enemiesKilled++;
// Level up every 15 kills
if (enemiesKilled % 15 === 0) {
gameLevel++;
levelTxt.setText('Level: ' + gameLevel);
}
} else {
// Hit but not destroyed
LK.getSound('hit').play();
}
break;
}
}
// Break loop if bullet was removed
if (i >= bullets.length) {
break;
}
}
// Update toilets
for (var i = toilets.length - 1; i >= 0; i--) {
var toilet = toilets[i];
toilet.update();
// Check collision with player
if (toilet.intersects(player)) {
// Game over
LK.getSound('playerDeath').play();
LK.effects.flashScreen(0xff0000, 1000);
LK.showGameOver();
return;
}
// Periodically update target to follow player
if (LK.ticks % 60 === 0) {
toilet.setTarget(player.x, player.y);
}
}
};
// Handle touch/mouse events
var touchX = 0;
var touchY = 0;
var isDragging = false;
game.down = function (x, y, obj) {
touchX = x;
touchY = y;
// If clicked near player, start dragging
var dx = x - player.x;
var dy = y - player.y;
var dist = Math.sqrt(dx * dx + dy * dy);
if (dist < 150) {
isDragging = true;
} else {
// Fire bullet towards click position
fireBullet(x, y);
}
};
game.move = function (x, y, obj) {
touchX = x;
touchY = y;
// Move player if dragging
if (isDragging) {
player.x = x;
// Restrict player to bottom third of screen
player.y = Math.max(2732 / 3 * 2, Math.min(y, 2732 - 100));
}
};
game.up = function (x, y, obj) {
isDragging = false;
};
// Initialize the game
initGame(); ===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,369 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+var storage = LK.import("@upit/storage.v1");
+
+/****
+* Classes
+****/
+var Bullet = Container.expand(function () {
+ var self = Container.call(this);
+ var bulletGraphics = self.attachAsset('bullet', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 20;
+ self.direction = {
+ x: 0,
+ y: -1
+ }; // Default direction is upward
+ self.update = function () {
+ self.x += self.direction.x * self.speed;
+ self.y += self.direction.y * self.speed;
+ };
+ return self;
+});
+var CameraHead = Container.expand(function () {
+ var self = Container.call(this);
+ // Main camera body
+ var body = self.attachAsset('cameraHead', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ // Camera lens
+ var lens = self.attachAsset('cameraLens', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ y: -40
+ });
+ // Flash effect (initially invisible)
+ var flashEffect = self.attachAsset('flash', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ alpha: 0
+ });
+ // Public properties
+ self.isShooting = false;
+ self.shootCooldown = 0;
+ self.flashEnabled = true;
+ // Activate flash effect
+ self.flash = function () {
+ if (!self.flashEnabled) return;
+ self.flashEnabled = false;
+ flashEffect.alpha = 0.7;
+ tween(flashEffect, {
+ alpha: 0
+ }, {
+ duration: 300,
+ onFinish: function onFinish() {
+ self.flashEnabled = true;
+ }
+ });
+ };
+ self.update = function () {
+ if (self.shootCooldown > 0) {
+ self.shootCooldown--;
+ }
+ };
+ return self;
+});
+var ToiletMonster = Container.expand(function () {
+ var self = Container.call(this);
+ // Toilet body
+ var body = self.attachAsset('toiletBody', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ // Toilet seat
+ var seat = self.attachAsset('toiletSeat', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ y: -30
+ });
+ // Human head
+ var head = self.attachAsset('humanHead', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ y: -70
+ });
+ // Public properties
+ self.speed = 3;
+ self.health = 1;
+ self.points = 100;
+ self.direction = {
+ x: 0,
+ y: 0
+ };
+ // Set target position to move towards
+ self.setTarget = function (targetX, targetY) {
+ var dx = targetX - self.x;
+ var dy = targetY - self.y;
+ var dist = Math.sqrt(dx * dx + dy * dy);
+ if (dist > 0) {
+ self.direction.x = dx / dist;
+ self.direction.y = dy / dist;
+ }
+ };
+ // Take damage
+ self.takeDamage = function () {
+ self.health--;
+ // Flash white
+ tween(self, {
+ alpha: 0.2
+ }, {
+ duration: 100,
+ onFinish: function onFinish() {
+ tween(self, {
+ alpha: 1
+ }, {
+ duration: 100
+ });
+ }
+ });
+ return self.health <= 0;
+ };
+ self.update = function () {
+ self.x += self.direction.x * self.speed;
+ self.y += self.direction.y * self.speed;
+ // Wobble animation
+ seat.rotation = Math.sin(LK.ticks / 10) * 0.1;
+ head.rotation = Math.sin(LK.ticks / 15 + 1) * 0.05;
+ };
+ return self;
+});
+var BossToiletMonster = ToiletMonster.expand(function () {
+ var self = ToiletMonster.call(this);
+ // Make it bigger
+ self.scale.set(1.5);
+ // Override properties
+ self.health = 3;
+ self.speed = 2;
+ self.points = 300;
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x33aa88
+});
+
+/****
+* Game Code
+****/
+// Game state variables
+var player;
+var bullets = [];
+var toilets = [];
+var score = 0;
+var spawnCooldown = 0;
+var gameLevel = 1;
+var enemiesKilled = 0;
+// UI elements
+var scoreTxt;
+var levelTxt;
+// Initialize game
+function initGame() {
+ // Create player
+ player = new CameraHead();
+ player.x = 2048 / 2;
+ player.y = 2732 - 300;
+ game.addChild(player);
+ // Create score text
+ scoreTxt = new Text2('Score: 0', {
+ size: 80,
+ fill: 0xFFFFFF
+ });
+ scoreTxt.anchor.set(0, 0);
+ LK.gui.topRight.addChild(scoreTxt);
+ // Create level text
+ levelTxt = new Text2('Level: 1', {
+ size: 80,
+ fill: 0xFFFFFF
+ });
+ levelTxt.anchor.set(1, 0);
+ LK.gui.topLeft.addChild(levelTxt);
+ levelTxt.x = 200; // Move away from very top left corner
+ // Update score
+ updateScore(0);
+ // Play background music
+ LK.playMusic('gameMusic');
+}
+// Update score display
+function updateScore(points) {
+ score += points;
+ LK.setScore(score);
+ scoreTxt.setText('Score: ' + score);
+}
+// Spawn a toilet monster
+function spawnToilet() {
+ var toilet;
+ // Spawn boss every 10 kills
+ if (enemiesKilled > 0 && enemiesKilled % 10 === 0) {
+ toilet = new BossToiletMonster();
+ } else {
+ toilet = new ToiletMonster();
+ }
+ // Adjust difficulty based on level
+ toilet.speed += (gameLevel - 1) * 0.5;
+ // Position toilet at random edge of screen
+ var edge = Math.floor(Math.random() * 4); // 0: top, 1: right, 2: bottom, 3: left
+ switch (edge) {
+ case 0:
+ // Top
+ toilet.x = Math.random() * 2048;
+ toilet.y = -100;
+ break;
+ case 1:
+ // Right
+ toilet.x = 2048 + 100;
+ toilet.y = Math.random() * 2732;
+ break;
+ case 2:
+ // Bottom
+ toilet.x = Math.random() * 2048;
+ toilet.y = 2732 + 100;
+ break;
+ case 3:
+ // Left
+ toilet.x = -100;
+ toilet.y = Math.random() * 2732;
+ break;
+ }
+ // Set target to player
+ toilet.setTarget(player.x, player.y);
+ // Add to game
+ toilets.push(toilet);
+ game.addChild(toilet);
+}
+// Fire a bullet
+function fireBullet(targetX, targetY) {
+ if (player.shootCooldown > 0) return;
+ // Create bullet
+ var bullet = new Bullet();
+ bullet.x = player.x;
+ bullet.y = player.y - 50;
+ // Calculate direction to target
+ var dx = targetX - bullet.x;
+ var dy = targetY - bullet.y;
+ var dist = Math.sqrt(dx * dx + dy * dy);
+ if (dist > 0) {
+ bullet.direction.x = dx / dist;
+ bullet.direction.y = dy / dist;
+ }
+ // Add to game
+ bullets.push(bullet);
+ game.addChild(bullet);
+ // Flash camera
+ player.flash();
+ // Play sound
+ LK.getSound('shoot').play();
+ // Set cooldown
+ player.shootCooldown = 10;
+}
+// Main game update
+game.update = function () {
+ // Update player
+ player.update();
+ // Spawn toilets
+ if (spawnCooldown <= 0) {
+ spawnToilet();
+ spawnCooldown = Math.max(30, 120 - gameLevel * 10); // Spawn faster as level increases
+ } else {
+ spawnCooldown--;
+ }
+ // Update bullets
+ for (var i = bullets.length - 1; i >= 0; i--) {
+ var bullet = bullets[i];
+ bullet.update();
+ // Check if bullet is off screen
+ if (bullet.x < -100 || bullet.x > 2148 || bullet.y < -100 || bullet.y > 2832) {
+ bullet.destroy();
+ bullets.splice(i, 1);
+ continue;
+ }
+ // Check collision with toilets
+ for (var j = toilets.length - 1; j >= 0; j--) {
+ var toilet = toilets[j];
+ if (bullet.intersects(toilet)) {
+ // Destroy bullet
+ bullet.destroy();
+ bullets.splice(i, 1);
+ // Damage toilet
+ if (toilet.takeDamage()) {
+ // If toilet is destroyed
+ updateScore(toilet.points);
+ LK.getSound('toiletDeath').play();
+ toilet.destroy();
+ toilets.splice(j, 1);
+ enemiesKilled++;
+ // Level up every 15 kills
+ if (enemiesKilled % 15 === 0) {
+ gameLevel++;
+ levelTxt.setText('Level: ' + gameLevel);
+ }
+ } else {
+ // Hit but not destroyed
+ LK.getSound('hit').play();
+ }
+ break;
+ }
+ }
+ // Break loop if bullet was removed
+ if (i >= bullets.length) {
+ break;
+ }
+ }
+ // Update toilets
+ for (var i = toilets.length - 1; i >= 0; i--) {
+ var toilet = toilets[i];
+ toilet.update();
+ // Check collision with player
+ if (toilet.intersects(player)) {
+ // Game over
+ LK.getSound('playerDeath').play();
+ LK.effects.flashScreen(0xff0000, 1000);
+ LK.showGameOver();
+ return;
+ }
+ // Periodically update target to follow player
+ if (LK.ticks % 60 === 0) {
+ toilet.setTarget(player.x, player.y);
+ }
+ }
+};
+// Handle touch/mouse events
+var touchX = 0;
+var touchY = 0;
+var isDragging = false;
+game.down = function (x, y, obj) {
+ touchX = x;
+ touchY = y;
+ // If clicked near player, start dragging
+ var dx = x - player.x;
+ var dy = y - player.y;
+ var dist = Math.sqrt(dx * dx + dy * dy);
+ if (dist < 150) {
+ isDragging = true;
+ } else {
+ // Fire bullet towards click position
+ fireBullet(x, y);
+ }
+};
+game.move = function (x, y, obj) {
+ touchX = x;
+ touchY = y;
+ // Move player if dragging
+ if (isDragging) {
+ player.x = x;
+ // Restrict player to bottom third of screen
+ player.y = Math.max(2732 / 3 * 2, Math.min(y, 2732 - 100));
+ }
+};
+game.up = function (x, y, obj) {
+ isDragging = false;
+};
+// Initialize the game
+initGame();
\ No newline at end of file
A head with hair. In-Game asset. 2d. High contrast. No shadows
A white toilet facing toward. In-Game asset. 2d. High contrast. No shadows
A camera headed person with a suit on. In-Game asset. 2d. High contrast. No shadows
Gun. In-Game asset. 2d. High contrast. No shadows
Bullet. In-Game asset. 2d. High contrast. No shadows