User prompt
Make the baterangs go the other way
User prompt
Make the stuff come from the other direction
User prompt
Make the most obstacles and coins come from the other direction
User prompt
Fix error[L598]
User prompt
Fix it
User prompt
Please fix the bug: 'Script error.' in or related to this line: 'if (obj.event.type === "touchstart") {' Line Number: 598
Code edit (1 edits merged)
Please save this source code
User prompt
Batman: Night Runner
Initial prompt
Make a endless runner Batmobile game where you go side to side
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1", {
highScore: 0
});
/****
* Classes
****/
var BackgroundBuilding = Container.expand(function () {
var self = Container.call(this);
var buildingGraphics = self.attachAsset('buildingPiece', {
anchorX: 0.5,
anchorY: 0.5
});
// Randomize building color slightly
var colorVariation = Math.random() * 0x222222;
buildingGraphics.tint = 0x333333 + colorVariation;
// Randomize building height
var heightScale = 0.8 + Math.random() * 1.2;
buildingGraphics.scaleY = heightScale;
self.speed = 2 + Math.random() * 2; // Slightly randomized speed for parallax
self.update = function () {
self.y -= self.speed;
// Loop building if it goes off screen
if (self.y < -500) {
self.y = 2732 + 100;
self.x = Math.random() * 2048; // Random horizontal position
}
};
return self;
});
var Batarang = Container.expand(function () {
var self = Container.call(this);
var batarangGraphics = self.attachAsset('batarang', {
anchorX: 0.5,
anchorY: 0.5
});
self.active = true;
self.speed = 20;
self.update = function () {
self.y -= self.speed;
batarangGraphics.rotation += 0.2;
// Remove if off screen
if (self.y < -50) {
self.active = false;
}
};
return self;
});
var Batmobile = Container.expand(function () {
var self = Container.call(this);
var batmobileGraphics = self.attachAsset('batmobile', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 10;
self.jumpHeight = 0;
self.isJumping = false;
self.lane = 1; // 0 = left, 1 = center, 2 = right
self.lanePositions = [600, 1024, 1448]; // x positions for the three lanes
self.groundY = 2300; // ground position
self.jumping = false;
self.invincible = false;
self.jump = function () {
if (!self.jumping) {
self.jumping = true;
// Jump up
tween(self, {
y: self.groundY - 300
}, {
duration: 500,
easing: tween.easeOut,
onFinish: function onFinish() {
// Fall back down
tween(self, {
y: self.groundY
}, {
duration: 500,
easing: tween.easeIn,
onFinish: function onFinish() {
self.jumping = false;
}
});
}
});
}
};
self.moveLeft = function () {
if (self.lane > 0) {
self.lane--;
tween(self, {
x: self.lanePositions[self.lane]
}, {
duration: 200,
easing: tween.easeOut
});
}
};
self.moveRight = function () {
if (self.lane < 2) {
self.lane++;
tween(self, {
x: self.lanePositions[self.lane]
}, {
duration: 200,
easing: tween.easeOut
});
}
};
self.makeInvincible = function (duration) {
self.invincible = true;
// Flash effect
var flashCount = 0;
var flashInterval = LK.setInterval(function () {
batmobileGraphics.alpha = batmobileGraphics.alpha === 1 ? 0.3 : 1;
flashCount++;
if (flashCount >= 10) {
LK.clearInterval(flashInterval);
batmobileGraphics.alpha = 1;
self.invincible = false;
}
}, duration / 10);
};
self.shootBatarang = function () {
var batarang = new Batarang();
batarang.x = self.x;
batarang.y = self.y - 30;
game.addChild(batarang);
activeBatarangs.push(batarang);
LK.getSound('batarangThrow').play();
};
return self;
});
var Gadget = Container.expand(function () {
var self = Container.call(this);
var gadgetGraphics = self.attachAsset('gadget', {
anchorX: 0.5,
anchorY: 0.5
});
self.type = 'gadget';
self.active = true;
// Add some floating animation
tween(gadgetGraphics, {
y: 10
}, {
duration: 800,
easing: tween.easeInOut,
onFinish: function onFinish() {
tween(gadgetGraphics, {
y: -10
}, {
duration: 800,
easing: tween.easeInOut,
onFinish: function onFinish() {
if (self.active) {
self.update(); // Restart animation
}
}
});
}
});
self.update = function () {
self.y -= gameSpeed;
// Remove if off screen
if (self.y < -50) {
self.active = false;
}
// Spin the gadget
gadgetGraphics.rotation += 0.05;
};
return self;
});
var Obstacle = Container.expand(function () {
var self = Container.call(this);
var obstacleGraphics = self.attachAsset('obstacle', {
anchorX: 0.5,
anchorY: 0.5
});
self.type = 'obstacle';
self.active = true;
self.update = function () {
self.y -= gameSpeed;
// Remove if off screen
if (self.y < -100) {
self.active = false;
}
};
return self;
});
var Road = Container.expand(function () {
var self = Container.call(this);
var roadGraphics = self.attachAsset('roadPiece', {
anchorX: 0.5,
anchorY: 0.5
});
self.update = function () {
self.y -= gameSpeed;
// Loop road if it goes off screen
if (self.y < -150) {
self.y = 2732 + 150;
}
};
return self;
});
var Villain = Container.expand(function () {
var self = Container.call(this);
var villainGraphics = self.attachAsset('villain', {
anchorX: 0.5,
anchorY: 0.5
});
self.type = 'villain';
self.active = true;
self.health = 1;
self.update = function () {
self.y -= gameSpeed;
// Remove if off screen
if (self.y < -150) {
self.active = false;
}
};
self.hit = function () {
self.health--;
if (self.health <= 0) {
self.active = false;
LK.setScore(LK.getScore() + 100);
LK.effects.flashObject(self, 0xff0000, 300);
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000000
});
/****
* Game Code
****/
// Initialize assets used in this game. Scale them according to what is needed for the game.
// Assets are automatically created and loaded during gameplay or via static code analysis
// Game configuration
var gameSpeed = 10;
var spawnRate = 60; // Lower = more frequent spawns
var difficultyTimer = 0;
var difficultyInterval = 1000; // Increase difficulty every 1000 ticks (about 16 seconds)
var gameOver = false;
var canShoot = true;
var shootCooldown = 30; // Cooldown in frames
var currentCooldown = 0;
var gadgetCount = 0;
// Game elements
var batmobile;
var obstacles = [];
var villains = [];
var gadgets = [];
var activeBatarangs = [];
var roadPieces = [];
var buildings = [];
var lanePositions = [600, 1024, 1448]; // x positions for the three lanes
// UI Elements
var scoreTxt;
var gadgetTxt;
var highScoreTxt;
// Initialize the game
function initGame() {
// Reset variables
gameSpeed = 10;
gameOver = false;
obstacles = [];
villains = [];
gadgets = [];
activeBatarangs = [];
difficultyTimer = 0;
gadgetCount = 0;
// Set background color to dark blue (night sky)
game.setBackgroundColor(0x111133);
// Play background music
LK.playMusic('batmanTheme', {
fade: {
start: 0,
end: 0.7,
duration: 1000
}
});
// Create the road
createRoad();
// Create background buildings
createBuildings();
// Create the Batmobile
batmobile = new Batmobile();
batmobile.x = lanePositions[1]; // Start in center lane
batmobile.y = 2300; // Position near bottom of screen
game.addChild(batmobile);
// Create UI
createUI();
// Reset score
LK.setScore(0);
}
function createRoad() {
// Create several road pieces to form a continuous road
for (var i = 0; i < 3; i++) {
var road = new Road();
road.x = 1024; // Center of screen
road.y = i * 300 + 2300; // Stacked vertically with the first one at the bottom
game.addChild(road);
roadPieces.push(road);
}
}
function createBuildings() {
// Create background buildings for parallax effect
for (var i = 0; i < 15; i++) {
var building = new BackgroundBuilding();
building.x = Math.random() * 2048; // Random x position
building.y = Math.random() * 2732; // Random y position
game.addChild(building);
buildings.push(building);
}
}
function createUI() {
// Score text
scoreTxt = new Text2('SCORE: 0', {
size: 70,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0, 0);
scoreTxt.x = 150;
scoreTxt.y = 50;
LK.gui.addChild(scoreTxt);
// Gadget counter
gadgetTxt = new Text2('GADGETS: 0', {
size: 70,
fill: 0xFFFFFF
});
gadgetTxt.anchor.set(0, 0);
gadgetTxt.x = 150;
gadgetTxt.y = 130;
LK.gui.addChild(gadgetTxt);
// High score
highScoreTxt = new Text2('HIGH SCORE: ' + storage.highScore, {
size: 70,
fill: 0xFFFFFF
});
highScoreTxt.anchor.set(1, 0);
highScoreTxt.x = 1900;
highScoreTxt.y = 50;
LK.gui.addChild(highScoreTxt);
}
function spawnObstacle() {
var lane = Math.floor(Math.random() * 3); // Random lane
var obstacle = new Obstacle();
obstacle.x = lanePositions[lane];
obstacle.y = 2732 + 100; // Start just off-screen at the bottom
game.addChild(obstacle);
obstacles.push(obstacle);
}
function spawnVillain() {
var lane = Math.floor(Math.random() * 3); // Random lane
var villain = new Villain();
villain.x = lanePositions[lane];
villain.y = 2732 + 100; // Start just off-screen at the bottom
game.addChild(villain);
villains.push(villain);
}
function spawnGadget() {
var lane = Math.floor(Math.random() * 3); // Random lane
var gadget = new Gadget();
gadget.x = lanePositions[lane];
gadget.y = 2732 + 100; // Start just off-screen at the bottom
game.addChild(gadget);
gadgets.push(gadget);
}
function checkCollisions() {
// Check Batmobile collision with obstacles
for (var i = obstacles.length - 1; i >= 0; i--) {
var obstacle = obstacles[i];
if (obstacle.active && batmobile.intersects(obstacle) && !batmobile.invincible) {
// Collision with obstacle
LK.getSound('crash').play();
LK.effects.flashScreen(0xff0000, 500);
// Update high score if needed
if (LK.getScore() > storage.highScore) {
storage.highScore = LK.getScore();
highScoreTxt.setText('HIGH SCORE: ' + storage.highScore);
}
LK.showGameOver();
gameOver = true;
return;
}
}
// Check Batmobile collision with villains
for (var i = villains.length - 1; i >= 0; i--) {
var villain = villains[i];
if (villain.active && batmobile.intersects(villain) && !batmobile.invincible) {
// Collision with villain
LK.getSound('crash').play();
LK.effects.flashScreen(0xff0000, 500);
// Update high score if needed
if (LK.getScore() > storage.highScore) {
storage.highScore = LK.getScore();
highScoreTxt.setText('HIGH SCORE: ' + storage.highScore);
}
LK.showGameOver();
gameOver = true;
return;
}
}
// Check Batmobile collection of gadgets
for (var i = gadgets.length - 1; i >= 0; i--) {
var gadget = gadgets[i];
if (gadget.active && batmobile.intersects(gadget)) {
// Collect gadget
gadget.active = false;
LK.getSound('collect').play();
LK.setScore(LK.getScore() + 50);
gadgetCount++;
gadgetTxt.setText('GADGETS: ' + gadgetCount);
// Flash gadget
LK.effects.flashObject(gadget, 0xffff00, 300);
gadgets.splice(i, 1);
gadget.destroy();
}
}
// Check Batarang collision with villains
for (var i = activeBatarangs.length - 1; i >= 0; i--) {
var batarang = activeBatarangs[i];
if (batarang.active) {
for (var j = villains.length - 1; j >= 0; j--) {
var villain = villains[j];
if (villain.active && batarang.intersects(villain)) {
// Hit villain with batarang
villain.hit();
batarang.active = false;
activeBatarangs.splice(i, 1);
batarang.destroy();
if (!villain.active) {
villains.splice(j, 1);
villain.destroy();
}
break;
}
}
}
}
}
function updateGameElements() {
// Update road pieces
for (var i = 0; i < roadPieces.length; i++) {
roadPieces[i].update();
}
// Update buildings for parallax effect
for (var i = 0; i < buildings.length; i++) {
buildings[i].update();
}
// Update obstacles
for (var i = obstacles.length - 1; i >= 0; i--) {
var obstacle = obstacles[i];
obstacle.update();
if (!obstacle.active) {
obstacles.splice(i, 1);
obstacle.destroy();
}
}
// Update villains
for (var i = villains.length - 1; i >= 0; i--) {
var villain = villains[i];
villain.update();
if (!villain.active) {
villains.splice(i, 1);
villain.destroy();
}
}
// Update gadgets
for (var i = gadgets.length - 1; i >= 0; i--) {
var gadget = gadgets[i];
gadget.update();
if (!gadget.active) {
gadgets.splice(i, 1);
gadget.destroy();
}
}
// Update batarangs
for (var i = activeBatarangs.length - 1; i >= 0; i--) {
var batarang = activeBatarangs[i];
batarang.update();
if (!batarang.active) {
activeBatarangs.splice(i, 1);
batarang.destroy();
}
}
}
function increaseDifficulty() {
difficultyTimer++;
if (difficultyTimer >= difficultyInterval) {
difficultyTimer = 0;
// Increase game speed
gameSpeed += 0.5;
// Make spawns more frequent
if (spawnRate > 30) {
spawnRate -= 2;
}
// Flash screen to indicate difficulty increase
LK.effects.flashScreen(0x0000ff, 300);
}
}
function updateUI() {
scoreTxt.setText('SCORE: ' + LK.getScore());
}
function handleShoot() {
if (currentCooldown > 0) {
currentCooldown--;
} else {
canShoot = true;
}
}
// Initialize the game when it starts
initGame();
// Game update loop
game.update = function () {
if (gameOver) return;
// Increase score by 1 every frame
LK.setScore(LK.getScore() + 1);
// Update UI
updateUI();
// Handle shooting cooldown
handleShoot();
// Update all game elements
updateGameElements();
// Check for collisions
checkCollisions();
// Increase difficulty over time
increaseDifficulty();
// Randomly spawn obstacles, villains, and gadgets
if (LK.ticks % spawnRate === 0) {
// 70% chance for obstacle, 20% chance for villain, 10% chance for gadget
var rand = Math.random();
if (rand < 0.7) {
spawnObstacle();
} else if (rand < 0.9) {
spawnVillain();
} else {
spawnGadget();
}
}
};
// Handle touch inputs
game.down = function (x, y, obj) {
if (gameOver) return;
// Determine which action to take based on touch position
if (y < 1366) {
// Upper half of screen - shoot if we have gadgets
if (gadgetCount > 0 && canShoot) {
batmobile.shootBatarang();
gadgetCount--;
gadgetTxt.setText('GADGETS: ' + gadgetCount);
canShoot = false;
currentCooldown = shootCooldown;
}
} else {
// Lower half of screen - movement
if (x < 1024) {
batmobile.moveLeft();
} else {
batmobile.moveRight();
}
}
};
// Handle swipe up for jump
var startY = 0;
game.move = function (x, y, obj) {
if (gameOver) return;
if (obj.event.type === "touchstart") {
startY = y;
} else if (obj.event.type === "touchmove") {
var deltaY = startY - y;
if (deltaY > 100) {
// If swiped up more than 100px
batmobile.jump();
startY = y; // Reset to prevent multiple jumps
}
}
}; ===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,587 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+var storage = LK.import("@upit/storage.v1", {
+ highScore: 0
+});
+
+/****
+* Classes
+****/
+var BackgroundBuilding = Container.expand(function () {
+ var self = Container.call(this);
+ var buildingGraphics = self.attachAsset('buildingPiece', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ // Randomize building color slightly
+ var colorVariation = Math.random() * 0x222222;
+ buildingGraphics.tint = 0x333333 + colorVariation;
+ // Randomize building height
+ var heightScale = 0.8 + Math.random() * 1.2;
+ buildingGraphics.scaleY = heightScale;
+ self.speed = 2 + Math.random() * 2; // Slightly randomized speed for parallax
+ self.update = function () {
+ self.y -= self.speed;
+ // Loop building if it goes off screen
+ if (self.y < -500) {
+ self.y = 2732 + 100;
+ self.x = Math.random() * 2048; // Random horizontal position
+ }
+ };
+ return self;
+});
+var Batarang = Container.expand(function () {
+ var self = Container.call(this);
+ var batarangGraphics = self.attachAsset('batarang', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.active = true;
+ self.speed = 20;
+ self.update = function () {
+ self.y -= self.speed;
+ batarangGraphics.rotation += 0.2;
+ // Remove if off screen
+ if (self.y < -50) {
+ self.active = false;
+ }
+ };
+ return self;
+});
+var Batmobile = Container.expand(function () {
+ var self = Container.call(this);
+ var batmobileGraphics = self.attachAsset('batmobile', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 10;
+ self.jumpHeight = 0;
+ self.isJumping = false;
+ self.lane = 1; // 0 = left, 1 = center, 2 = right
+ self.lanePositions = [600, 1024, 1448]; // x positions for the three lanes
+ self.groundY = 2300; // ground position
+ self.jumping = false;
+ self.invincible = false;
+ self.jump = function () {
+ if (!self.jumping) {
+ self.jumping = true;
+ // Jump up
+ tween(self, {
+ y: self.groundY - 300
+ }, {
+ duration: 500,
+ easing: tween.easeOut,
+ onFinish: function onFinish() {
+ // Fall back down
+ tween(self, {
+ y: self.groundY
+ }, {
+ duration: 500,
+ easing: tween.easeIn,
+ onFinish: function onFinish() {
+ self.jumping = false;
+ }
+ });
+ }
+ });
+ }
+ };
+ self.moveLeft = function () {
+ if (self.lane > 0) {
+ self.lane--;
+ tween(self, {
+ x: self.lanePositions[self.lane]
+ }, {
+ duration: 200,
+ easing: tween.easeOut
+ });
+ }
+ };
+ self.moveRight = function () {
+ if (self.lane < 2) {
+ self.lane++;
+ tween(self, {
+ x: self.lanePositions[self.lane]
+ }, {
+ duration: 200,
+ easing: tween.easeOut
+ });
+ }
+ };
+ self.makeInvincible = function (duration) {
+ self.invincible = true;
+ // Flash effect
+ var flashCount = 0;
+ var flashInterval = LK.setInterval(function () {
+ batmobileGraphics.alpha = batmobileGraphics.alpha === 1 ? 0.3 : 1;
+ flashCount++;
+ if (flashCount >= 10) {
+ LK.clearInterval(flashInterval);
+ batmobileGraphics.alpha = 1;
+ self.invincible = false;
+ }
+ }, duration / 10);
+ };
+ self.shootBatarang = function () {
+ var batarang = new Batarang();
+ batarang.x = self.x;
+ batarang.y = self.y - 30;
+ game.addChild(batarang);
+ activeBatarangs.push(batarang);
+ LK.getSound('batarangThrow').play();
+ };
+ return self;
+});
+var Gadget = Container.expand(function () {
+ var self = Container.call(this);
+ var gadgetGraphics = self.attachAsset('gadget', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.type = 'gadget';
+ self.active = true;
+ // Add some floating animation
+ tween(gadgetGraphics, {
+ y: 10
+ }, {
+ duration: 800,
+ easing: tween.easeInOut,
+ onFinish: function onFinish() {
+ tween(gadgetGraphics, {
+ y: -10
+ }, {
+ duration: 800,
+ easing: tween.easeInOut,
+ onFinish: function onFinish() {
+ if (self.active) {
+ self.update(); // Restart animation
+ }
+ }
+ });
+ }
+ });
+ self.update = function () {
+ self.y -= gameSpeed;
+ // Remove if off screen
+ if (self.y < -50) {
+ self.active = false;
+ }
+ // Spin the gadget
+ gadgetGraphics.rotation += 0.05;
+ };
+ return self;
+});
+var Obstacle = Container.expand(function () {
+ var self = Container.call(this);
+ var obstacleGraphics = self.attachAsset('obstacle', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.type = 'obstacle';
+ self.active = true;
+ self.update = function () {
+ self.y -= gameSpeed;
+ // Remove if off screen
+ if (self.y < -100) {
+ self.active = false;
+ }
+ };
+ return self;
+});
+var Road = Container.expand(function () {
+ var self = Container.call(this);
+ var roadGraphics = self.attachAsset('roadPiece', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.update = function () {
+ self.y -= gameSpeed;
+ // Loop road if it goes off screen
+ if (self.y < -150) {
+ self.y = 2732 + 150;
+ }
+ };
+ return self;
+});
+var Villain = Container.expand(function () {
+ var self = Container.call(this);
+ var villainGraphics = self.attachAsset('villain', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.type = 'villain';
+ self.active = true;
+ self.health = 1;
+ self.update = function () {
+ self.y -= gameSpeed;
+ // Remove if off screen
+ if (self.y < -150) {
+ self.active = false;
+ }
+ };
+ self.hit = function () {
+ self.health--;
+ if (self.health <= 0) {
+ self.active = false;
+ LK.setScore(LK.getScore() + 100);
+ LK.effects.flashObject(self, 0xff0000, 300);
+ }
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
backgroundColor: 0x000000
-});
\ No newline at end of file
+});
+
+/****
+* Game Code
+****/
+// Initialize assets used in this game. Scale them according to what is needed for the game.
+// Assets are automatically created and loaded during gameplay or via static code analysis
+// Game configuration
+var gameSpeed = 10;
+var spawnRate = 60; // Lower = more frequent spawns
+var difficultyTimer = 0;
+var difficultyInterval = 1000; // Increase difficulty every 1000 ticks (about 16 seconds)
+var gameOver = false;
+var canShoot = true;
+var shootCooldown = 30; // Cooldown in frames
+var currentCooldown = 0;
+var gadgetCount = 0;
+// Game elements
+var batmobile;
+var obstacles = [];
+var villains = [];
+var gadgets = [];
+var activeBatarangs = [];
+var roadPieces = [];
+var buildings = [];
+var lanePositions = [600, 1024, 1448]; // x positions for the three lanes
+// UI Elements
+var scoreTxt;
+var gadgetTxt;
+var highScoreTxt;
+// Initialize the game
+function initGame() {
+ // Reset variables
+ gameSpeed = 10;
+ gameOver = false;
+ obstacles = [];
+ villains = [];
+ gadgets = [];
+ activeBatarangs = [];
+ difficultyTimer = 0;
+ gadgetCount = 0;
+ // Set background color to dark blue (night sky)
+ game.setBackgroundColor(0x111133);
+ // Play background music
+ LK.playMusic('batmanTheme', {
+ fade: {
+ start: 0,
+ end: 0.7,
+ duration: 1000
+ }
+ });
+ // Create the road
+ createRoad();
+ // Create background buildings
+ createBuildings();
+ // Create the Batmobile
+ batmobile = new Batmobile();
+ batmobile.x = lanePositions[1]; // Start in center lane
+ batmobile.y = 2300; // Position near bottom of screen
+ game.addChild(batmobile);
+ // Create UI
+ createUI();
+ // Reset score
+ LK.setScore(0);
+}
+function createRoad() {
+ // Create several road pieces to form a continuous road
+ for (var i = 0; i < 3; i++) {
+ var road = new Road();
+ road.x = 1024; // Center of screen
+ road.y = i * 300 + 2300; // Stacked vertically with the first one at the bottom
+ game.addChild(road);
+ roadPieces.push(road);
+ }
+}
+function createBuildings() {
+ // Create background buildings for parallax effect
+ for (var i = 0; i < 15; i++) {
+ var building = new BackgroundBuilding();
+ building.x = Math.random() * 2048; // Random x position
+ building.y = Math.random() * 2732; // Random y position
+ game.addChild(building);
+ buildings.push(building);
+ }
+}
+function createUI() {
+ // Score text
+ scoreTxt = new Text2('SCORE: 0', {
+ size: 70,
+ fill: 0xFFFFFF
+ });
+ scoreTxt.anchor.set(0, 0);
+ scoreTxt.x = 150;
+ scoreTxt.y = 50;
+ LK.gui.addChild(scoreTxt);
+ // Gadget counter
+ gadgetTxt = new Text2('GADGETS: 0', {
+ size: 70,
+ fill: 0xFFFFFF
+ });
+ gadgetTxt.anchor.set(0, 0);
+ gadgetTxt.x = 150;
+ gadgetTxt.y = 130;
+ LK.gui.addChild(gadgetTxt);
+ // High score
+ highScoreTxt = new Text2('HIGH SCORE: ' + storage.highScore, {
+ size: 70,
+ fill: 0xFFFFFF
+ });
+ highScoreTxt.anchor.set(1, 0);
+ highScoreTxt.x = 1900;
+ highScoreTxt.y = 50;
+ LK.gui.addChild(highScoreTxt);
+}
+function spawnObstacle() {
+ var lane = Math.floor(Math.random() * 3); // Random lane
+ var obstacle = new Obstacle();
+ obstacle.x = lanePositions[lane];
+ obstacle.y = 2732 + 100; // Start just off-screen at the bottom
+ game.addChild(obstacle);
+ obstacles.push(obstacle);
+}
+function spawnVillain() {
+ var lane = Math.floor(Math.random() * 3); // Random lane
+ var villain = new Villain();
+ villain.x = lanePositions[lane];
+ villain.y = 2732 + 100; // Start just off-screen at the bottom
+ game.addChild(villain);
+ villains.push(villain);
+}
+function spawnGadget() {
+ var lane = Math.floor(Math.random() * 3); // Random lane
+ var gadget = new Gadget();
+ gadget.x = lanePositions[lane];
+ gadget.y = 2732 + 100; // Start just off-screen at the bottom
+ game.addChild(gadget);
+ gadgets.push(gadget);
+}
+function checkCollisions() {
+ // Check Batmobile collision with obstacles
+ for (var i = obstacles.length - 1; i >= 0; i--) {
+ var obstacle = obstacles[i];
+ if (obstacle.active && batmobile.intersects(obstacle) && !batmobile.invincible) {
+ // Collision with obstacle
+ LK.getSound('crash').play();
+ LK.effects.flashScreen(0xff0000, 500);
+ // Update high score if needed
+ if (LK.getScore() > storage.highScore) {
+ storage.highScore = LK.getScore();
+ highScoreTxt.setText('HIGH SCORE: ' + storage.highScore);
+ }
+ LK.showGameOver();
+ gameOver = true;
+ return;
+ }
+ }
+ // Check Batmobile collision with villains
+ for (var i = villains.length - 1; i >= 0; i--) {
+ var villain = villains[i];
+ if (villain.active && batmobile.intersects(villain) && !batmobile.invincible) {
+ // Collision with villain
+ LK.getSound('crash').play();
+ LK.effects.flashScreen(0xff0000, 500);
+ // Update high score if needed
+ if (LK.getScore() > storage.highScore) {
+ storage.highScore = LK.getScore();
+ highScoreTxt.setText('HIGH SCORE: ' + storage.highScore);
+ }
+ LK.showGameOver();
+ gameOver = true;
+ return;
+ }
+ }
+ // Check Batmobile collection of gadgets
+ for (var i = gadgets.length - 1; i >= 0; i--) {
+ var gadget = gadgets[i];
+ if (gadget.active && batmobile.intersects(gadget)) {
+ // Collect gadget
+ gadget.active = false;
+ LK.getSound('collect').play();
+ LK.setScore(LK.getScore() + 50);
+ gadgetCount++;
+ gadgetTxt.setText('GADGETS: ' + gadgetCount);
+ // Flash gadget
+ LK.effects.flashObject(gadget, 0xffff00, 300);
+ gadgets.splice(i, 1);
+ gadget.destroy();
+ }
+ }
+ // Check Batarang collision with villains
+ for (var i = activeBatarangs.length - 1; i >= 0; i--) {
+ var batarang = activeBatarangs[i];
+ if (batarang.active) {
+ for (var j = villains.length - 1; j >= 0; j--) {
+ var villain = villains[j];
+ if (villain.active && batarang.intersects(villain)) {
+ // Hit villain with batarang
+ villain.hit();
+ batarang.active = false;
+ activeBatarangs.splice(i, 1);
+ batarang.destroy();
+ if (!villain.active) {
+ villains.splice(j, 1);
+ villain.destroy();
+ }
+ break;
+ }
+ }
+ }
+ }
+}
+function updateGameElements() {
+ // Update road pieces
+ for (var i = 0; i < roadPieces.length; i++) {
+ roadPieces[i].update();
+ }
+ // Update buildings for parallax effect
+ for (var i = 0; i < buildings.length; i++) {
+ buildings[i].update();
+ }
+ // Update obstacles
+ for (var i = obstacles.length - 1; i >= 0; i--) {
+ var obstacle = obstacles[i];
+ obstacle.update();
+ if (!obstacle.active) {
+ obstacles.splice(i, 1);
+ obstacle.destroy();
+ }
+ }
+ // Update villains
+ for (var i = villains.length - 1; i >= 0; i--) {
+ var villain = villains[i];
+ villain.update();
+ if (!villain.active) {
+ villains.splice(i, 1);
+ villain.destroy();
+ }
+ }
+ // Update gadgets
+ for (var i = gadgets.length - 1; i >= 0; i--) {
+ var gadget = gadgets[i];
+ gadget.update();
+ if (!gadget.active) {
+ gadgets.splice(i, 1);
+ gadget.destroy();
+ }
+ }
+ // Update batarangs
+ for (var i = activeBatarangs.length - 1; i >= 0; i--) {
+ var batarang = activeBatarangs[i];
+ batarang.update();
+ if (!batarang.active) {
+ activeBatarangs.splice(i, 1);
+ batarang.destroy();
+ }
+ }
+}
+function increaseDifficulty() {
+ difficultyTimer++;
+ if (difficultyTimer >= difficultyInterval) {
+ difficultyTimer = 0;
+ // Increase game speed
+ gameSpeed += 0.5;
+ // Make spawns more frequent
+ if (spawnRate > 30) {
+ spawnRate -= 2;
+ }
+ // Flash screen to indicate difficulty increase
+ LK.effects.flashScreen(0x0000ff, 300);
+ }
+}
+function updateUI() {
+ scoreTxt.setText('SCORE: ' + LK.getScore());
+}
+function handleShoot() {
+ if (currentCooldown > 0) {
+ currentCooldown--;
+ } else {
+ canShoot = true;
+ }
+}
+// Initialize the game when it starts
+initGame();
+// Game update loop
+game.update = function () {
+ if (gameOver) return;
+ // Increase score by 1 every frame
+ LK.setScore(LK.getScore() + 1);
+ // Update UI
+ updateUI();
+ // Handle shooting cooldown
+ handleShoot();
+ // Update all game elements
+ updateGameElements();
+ // Check for collisions
+ checkCollisions();
+ // Increase difficulty over time
+ increaseDifficulty();
+ // Randomly spawn obstacles, villains, and gadgets
+ if (LK.ticks % spawnRate === 0) {
+ // 70% chance for obstacle, 20% chance for villain, 10% chance for gadget
+ var rand = Math.random();
+ if (rand < 0.7) {
+ spawnObstacle();
+ } else if (rand < 0.9) {
+ spawnVillain();
+ } else {
+ spawnGadget();
+ }
+ }
+};
+// Handle touch inputs
+game.down = function (x, y, obj) {
+ if (gameOver) return;
+ // Determine which action to take based on touch position
+ if (y < 1366) {
+ // Upper half of screen - shoot if we have gadgets
+ if (gadgetCount > 0 && canShoot) {
+ batmobile.shootBatarang();
+ gadgetCount--;
+ gadgetTxt.setText('GADGETS: ' + gadgetCount);
+ canShoot = false;
+ currentCooldown = shootCooldown;
+ }
+ } else {
+ // Lower half of screen - movement
+ if (x < 1024) {
+ batmobile.moveLeft();
+ } else {
+ batmobile.moveRight();
+ }
+ }
+};
+// Handle swipe up for jump
+var startY = 0;
+game.move = function (x, y, obj) {
+ if (gameOver) return;
+ if (obj.event.type === "touchstart") {
+ startY = y;
+ } else if (obj.event.type === "touchmove") {
+ var deltaY = startY - y;
+ if (deltaY > 100) {
+ // If swiped up more than 100px
+ batmobile.jump();
+ startY = y; // Reset to prevent multiple jumps
+ }
+ }
+};
\ No newline at end of file