/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var MainMenu = Container.expand(function () {
var self = Container.call(this);
// Dark overlay background
self.overlay = self.attachAsset('shadowZone', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 6,
scaleY: 8,
alpha: 0.9
});
self.overlay.x = 1024;
self.overlay.y = 1366;
// Title text
self.titleText = new Text2('LUZ Y SOMBRA', {
size: 120,
fill: 0xFFFFFF
});
self.titleText.anchor.set(0.5, 0.5);
self.titleText.x = 1024;
self.titleText.y = 800;
self.addChild(self.titleText);
// Subtitle
self.subtitleText = new Text2('Transform between light and shadow\nto restore balance to the world', {
size: 50,
fill: 0xCCCCCC
});
self.subtitleText.anchor.set(0.5, 0.5);
self.subtitleText.x = 1024;
self.subtitleText.y = 1000;
self.addChild(self.subtitleText);
// Start button background with cartoon styling
self.startButton = self.attachAsset('lightZone', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 1.2,
scaleY: 0.6,
tint: 0x00FF88
});
self.startButton.x = 1024;
self.startButton.y = 1400;
// Add cartoon border effect
self.buttonBorder = self.attachAsset('shadowZone', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 1.25,
scaleY: 0.65,
tint: 0x004433,
alpha: 0.8
});
self.buttonBorder.x = 1024;
self.buttonBorder.y = 1405;
// Add shadow effect
self.buttonShadow = self.attachAsset('shadowZone', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 1.22,
scaleY: 0.62,
tint: 0x000000,
alpha: 0.4
});
self.buttonShadow.x = 1024;
self.buttonShadow.y = 1410;
// Start button text with cartoon styling
self.startText = new Text2('TAP TO START', {
size: 64,
fill: 0x003322
});
self.startText.anchor.set(0.5, 0.5);
self.startText.x = 1024;
self.startText.y = 1400;
self.addChild(self.startText);
// Add text outline effect
self.startTextOutline = new Text2('TAP TO START', {
size: 66,
fill: 0xFFFFFF
});
self.startTextOutline.anchor.set(0.5, 0.5);
self.startTextOutline.x = 1022;
self.startTextOutline.y = 1398;
self.addChild(self.startTextOutline);
// Ensure text is on top of outline
self.removeChild(self.startText);
self.addChild(self.startText);
// Enhanced pulsing animation using tween
self.startPulse = function () {
// Scale up animation for button
tween(self.startButton, {
scaleX: 1.4,
scaleY: 0.7
}, {
duration: 800,
easing: tween.easeInOut,
onFinish: function onFinish() {
// Scale down animation
tween(self.startButton, {
scaleX: 1.2,
scaleY: 0.6
}, {
duration: 800,
easing: tween.easeInOut,
onFinish: function onFinish() {
self.startPulse(); // Loop the animation
}
});
}
});
// Animate border with slight delay
tween(self.buttonBorder, {
scaleX: 1.45,
scaleY: 0.75
}, {
duration: 800,
easing: tween.easeInOut,
onFinish: function onFinish() {
tween(self.buttonBorder, {
scaleX: 1.25,
scaleY: 0.65
}, {
duration: 800,
easing: tween.easeInOut
});
}
});
// Animate shadow
tween(self.buttonShadow, {
scaleX: 1.42,
scaleY: 0.72
}, {
duration: 800,
easing: tween.easeInOut,
onFinish: function onFinish() {
tween(self.buttonShadow, {
scaleX: 1.22,
scaleY: 0.62
}, {
duration: 800,
easing: tween.easeInOut
});
}
});
// Joyful bouncing text animation
tween(self.startText, {
scaleX: 1.3,
scaleY: 1.4,
rotation: 0.1
}, {
duration: 500,
easing: tween.bounceOut,
onFinish: function onFinish() {
tween(self.startText, {
scaleX: 1.0,
scaleY: 1.0,
rotation: -0.05
}, {
duration: 700,
easing: tween.elasticOut,
onFinish: function onFinish() {
tween(self.startText, {
rotation: 0
}, {
duration: 300,
easing: tween.easeInOut
});
}
});
}
});
// Outline bouncing animation with slight offset
tween(self.startTextOutline, {
scaleX: 1.25,
scaleY: 1.35,
rotation: 0.08
}, {
duration: 500,
easing: tween.bounceOut,
onFinish: function onFinish() {
tween(self.startTextOutline, {
scaleX: 1.0,
scaleY: 1.0,
rotation: -0.03
}, {
duration: 700,
easing: tween.elasticOut,
onFinish: function onFinish() {
tween(self.startTextOutline, {
rotation: 0
}, {
duration: 300,
easing: tween.easeInOut
});
}
});
}
});
};
// Start the pulsing animation
self.startPulse();
// Rainbow color animation for the text
self.colorIndex = 0;
self.rainbowColors = [0xFF0080,
// Hot pink
0xFF4000,
// Orange red
0xFFFF00,
// Bright yellow
0x00FF40,
// Lime green
0x0080FF,
// Sky blue
0x8000FF,
// Purple
0xFF0080 // Back to hot pink
];
self.colorPulse = function () {
var currentColor = self.rainbowColors[self.colorIndex];
var nextIndex = (self.colorIndex + 1) % self.rainbowColors.length;
var nextColor = self.rainbowColors[nextIndex];
tween(self.startText, {
tint: currentColor
}, {
duration: 600,
easing: tween.easeInOut,
onFinish: function onFinish() {
self.colorIndex = nextIndex;
self.colorPulse(); // Loop the color animation
}
});
// Outline with complementary colors
var outlineColor = self.colorIndex % 2 === 0 ? 0xFFFFFF : 0x000000;
tween(self.startTextOutline, {
tint: outlineColor
}, {
duration: 600,
easing: tween.easeInOut
});
};
// Start the rainbow color animation
self.colorPulse();
self.update = function () {
// Remove old simple pulsing - now using tween animations
};
self.down = function (x, y, obj) {
// Check if click is on start button area
var buttonDistance = Math.sqrt(Math.pow(x - 1024, 2) + Math.pow(y - 1400, 2));
if (buttonDistance < 200) {
self.startGame();
}
};
self.startGame = function () {
// Remove menu and start game
self.parent.removeChild(self);
gameStarted = true;
// Show all game elements
grassBackground.visible = true;
player.visible = true;
zone1.visible = true;
zone2.visible = true;
zone3.visible = true;
zone4.visible = true;
platform1.visible = true;
platform2.visible = true;
platform3.visible = true;
platform4.visible = true;
instructionText.visible = true;
scoreText.visible = true;
transformText.visible = true;
};
return self;
});
var Platform = Container.expand(function (platformType, platformX, platformY) {
var self = Container.call(this);
self.platformType = platformType;
self.isActive = false;
var assetType = platformType === 'light' ? 'lightPlatform' : 'shadowPlatform';
self.graphics = self.attachAsset(assetType, {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.3
});
self.x = platformX;
self.y = platformY;
self.activate = function () {
if (!self.isActive) {
self.isActive = true;
LK.getSound('activate').play();
tween(self.graphics, {
alpha: 1
}, {
duration: 500
});
}
};
self.deactivate = function () {
if (self.isActive) {
self.isActive = false;
tween(self.graphics, {
alpha: 0.3
}, {
duration: 500
});
}
};
return self;
});
var Player = Container.expand(function () {
var self = Container.call(this);
self.isLightForm = true;
self.speed = 8;
self.transformCooldown = 0;
self.lightGraphics = self.attachAsset('lightForm', {
anchorX: 0.5,
anchorY: 0.5
});
self.shadowGraphics = self.attachAsset('shadowForm', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0
});
self.transform = function () {
if (self.transformCooldown > 0) return;
self.isLightForm = !self.isLightForm;
self.transformCooldown = 30;
LK.getSound('transform').play();
if (self.isLightForm) {
tween(self.lightGraphics, {
alpha: 1
}, {
duration: 300
});
tween(self.shadowGraphics, {
alpha: 0
}, {
duration: 300
});
} else {
tween(self.lightGraphics, {
alpha: 0
}, {
duration: 300
});
tween(self.shadowGraphics, {
alpha: 1
}, {
duration: 300
});
}
};
self.update = function () {
if (self.transformCooldown > 0) {
self.transformCooldown--;
}
};
return self;
});
var Zone = Container.expand(function (zoneType, zoneX, zoneY) {
var self = Container.call(this);
self.zoneType = zoneType;
self.isCorrupted = true;
self.healingProgress = 0;
self.particles = [];
var assetType = zoneType === 'light' ? 'lightZone' : 'shadowZone';
if (zoneType === 'light') {
self.skyBackground = self.attachAsset('skyBlue', {
anchorX: 0.5,
anchorY: 0.5
});
}
self.background = self.attachAsset(assetType, {
anchorX: 0.5,
anchorY: 0.5
});
self.x = zoneX;
self.y = zoneY;
self.createCorruptionParticles = function () {
for (var i = 0; i < 8; i++) {
var particle = self.addChild(LK.getAsset('corruptionParticle', {
anchorX: 0.5,
anchorY: 0.5
}));
particle.x = (Math.random() - 0.5) * 300;
particle.y = (Math.random() - 0.5) * 300;
particle.floatSpeed = Math.random() * 2 + 1;
particle.floatDirection = Math.random() * Math.PI * 2;
self.particles.push(particle);
}
};
self.heal = function () {
if (!self.isCorrupted) return;
self.healingProgress += 2;
if (self.healingProgress >= 100) {
self.isCorrupted = false;
LK.getSound('heal').play();
for (var i = self.particles.length - 1; i >= 0; i--) {
var particle = self.particles[i];
tween(particle, {
alpha: 0,
scaleX: 0,
scaleY: 0
}, {
duration: 1000,
onFinish: function onFinish() {
if (particle.parent) {
particle.parent.removeChild(particle);
}
}
});
}
self.particles = [];
tween(self.background, {
tint: 0x99CC99
}, {
duration: 2000
});
for (var j = 0; j < 12; j++) {
var healParticle = self.addChild(LK.getAsset('healingParticle', {
anchorX: 0.5,
anchorY: 0.5
}));
healParticle.x = (Math.random() - 0.5) * 400;
healParticle.y = (Math.random() - 0.5) * 400;
tween(healParticle, {
y: healParticle.y - 200,
alpha: 0,
scaleX: 2,
scaleY: 2
}, {
duration: 2000,
onFinish: function onFinish() {
if (healParticle.parent) {
healParticle.parent.removeChild(healParticle);
}
}
});
}
zonesHealed++;
scoreText.setText('Zones Healed: ' + zonesHealed + '/4');
if (zonesHealed >= 4) {
LK.setTimeout(function () {
LK.showYouWin();
}, 2000);
}
}
};
self.update = function () {
for (var i = 0; i < self.particles.length; i++) {
var particle = self.particles[i];
particle.x += Math.cos(particle.floatDirection) * particle.floatSpeed;
particle.y += Math.sin(particle.floatDirection) * particle.floatSpeed;
if (Math.abs(particle.x) > 200) {
particle.floatDirection = Math.PI - particle.floatDirection;
}
if (Math.abs(particle.y) > 200) {
particle.floatDirection = -particle.floatDirection;
}
}
};
self.createCorruptionParticles();
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x006400
});
/****
* Game Code
****/
var gameStarted = false;
var grassBackground = game.addChild(LK.getAsset('grass', {
anchorX: 0,
anchorY: 0
}));
grassBackground.x = 0;
grassBackground.y = 0;
grassBackground.visible = false;
// Create and show main menu
var mainMenu = game.addChild(new MainMenu());
var player = game.addChild(new Player());
player.x = 1024;
player.y = 1366;
player.visible = false;
var zones = [];
var platforms = [];
var zonesHealed = 0;
var zone1 = game.addChild(new Zone('light', 512, 600));
var zone2 = game.addChild(new Zone('shadow', 1536, 600));
var zone3 = game.addChild(new Zone('light', 512, 1800));
var zone4 = game.addChild(new Zone('shadow', 1536, 1800));
zones.push(zone1, zone2, zone3, zone4);
zone1.visible = false;
zone2.visible = false;
zone3.visible = false;
zone4.visible = false;
var platform1 = game.addChild(new Platform('light', 800, 900));
var platform2 = game.addChild(new Platform('shadow', 1248, 900));
var platform3 = game.addChild(new Platform('light', 800, 1500));
var platform4 = game.addChild(new Platform('shadow', 1248, 1500));
platforms.push(platform1, platform2, platform3, platform4);
platform1.visible = false;
platform2.visible = false;
platform3.visible = false;
platform4.visible = false;
var instructionText = new Text2('Tap to move player\nDouble tap to transform\nStand on matching platforms to heal zones', {
size: 40,
fill: 0xFFFFFF
});
instructionText.anchor.set(0.5, 0);
LK.gui.top.addChild(instructionText);
instructionText.y = 100;
instructionText.visible = false;
var scoreText = new Text2('Zones Healed: 0/4', {
size: 50,
fill: 0xFFFF99
});
scoreText.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreText);
scoreText.y = 200;
scoreText.visible = false;
var transformText = new Text2('', {
size: 45,
fill: 0xFF99FF
});
transformText.anchor.set(0.5, 1);
LK.gui.bottom.addChild(transformText);
transformText.visible = false;
var lastTapTime = 0;
var targetX = player.x;
var targetY = player.y;
game.down = function (x, y, obj) {
if (!gameStarted) {
return; // Menu will handle its own input
}
var currentTime = Date.now();
if (currentTime - lastTapTime < 300) {
player.transform();
} else {
targetX = x;
targetY = y;
}
lastTapTime = currentTime;
};
game.update = function () {
if (!gameStarted) {
return; // Don't update game logic until started
}
var dx = targetX - player.x;
var dy = targetY - player.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > 10) {
var moveX = dx / distance * player.speed;
var moveY = dy / distance * player.speed;
player.x += moveX;
player.y += moveY;
}
for (var i = 0; i < platforms.length; i++) {
var platform = platforms[i];
var platformDistance = Math.sqrt(Math.pow(player.x - platform.x, 2) + Math.pow(player.y - platform.y, 2));
if (platformDistance < 120) {
if (player.isLightForm && platform.platformType === 'light' || !player.isLightForm && platform.platformType === 'shadow') {
platform.activate();
} else {
platform.deactivate();
}
} else {
platform.deactivate();
}
}
for (var j = 0; j < zones.length; j++) {
var zone = zones[j];
if (!zone.isCorrupted) continue;
var zoneDistance = Math.sqrt(Math.pow(player.x - zone.x, 2) + Math.pow(player.y - zone.y, 2));
if (zoneDistance < 220) {
var nearbyPlatform = null;
for (var k = 0; k < platforms.length; k++) {
var checkPlatform = platforms[k];
var platZoneDistance = Math.sqrt(Math.pow(zone.x - checkPlatform.x, 2) + Math.pow(zone.y - checkPlatform.y, 2));
if (platZoneDistance < 400 && checkPlatform.isActive) {
var correctForm = zone.zoneType === 'light' && !player.isLightForm || zone.zoneType === 'shadow' && player.isLightForm;
if (correctForm) {
nearbyPlatform = checkPlatform;
break;
}
}
}
if (nearbyPlatform) {
zone.heal();
}
}
}
if (player.isLightForm) {
transformText.setText('Light Form - Fast Movement');
transformText.fill = "#FFFF99";
} else {
transformText.setText('Shadow Form - Energy Absorption');
transformText.fill = "#9966FF";
}
if (player.transformCooldown > 0) {
transformText.setText(transformText.text + ' (Cooldown: ' + Math.ceil(player.transformCooldown / 60) + 's)');
}
}; /****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var MainMenu = Container.expand(function () {
var self = Container.call(this);
// Dark overlay background
self.overlay = self.attachAsset('shadowZone', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 6,
scaleY: 8,
alpha: 0.9
});
self.overlay.x = 1024;
self.overlay.y = 1366;
// Title text
self.titleText = new Text2('LUZ Y SOMBRA', {
size: 120,
fill: 0xFFFFFF
});
self.titleText.anchor.set(0.5, 0.5);
self.titleText.x = 1024;
self.titleText.y = 800;
self.addChild(self.titleText);
// Subtitle
self.subtitleText = new Text2('Transform between light and shadow\nto restore balance to the world', {
size: 50,
fill: 0xCCCCCC
});
self.subtitleText.anchor.set(0.5, 0.5);
self.subtitleText.x = 1024;
self.subtitleText.y = 1000;
self.addChild(self.subtitleText);
// Start button background with cartoon styling
self.startButton = self.attachAsset('lightZone', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 1.2,
scaleY: 0.6,
tint: 0x00FF88
});
self.startButton.x = 1024;
self.startButton.y = 1400;
// Add cartoon border effect
self.buttonBorder = self.attachAsset('shadowZone', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 1.25,
scaleY: 0.65,
tint: 0x004433,
alpha: 0.8
});
self.buttonBorder.x = 1024;
self.buttonBorder.y = 1405;
// Add shadow effect
self.buttonShadow = self.attachAsset('shadowZone', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 1.22,
scaleY: 0.62,
tint: 0x000000,
alpha: 0.4
});
self.buttonShadow.x = 1024;
self.buttonShadow.y = 1410;
// Start button text with cartoon styling
self.startText = new Text2('TAP TO START', {
size: 64,
fill: 0x003322
});
self.startText.anchor.set(0.5, 0.5);
self.startText.x = 1024;
self.startText.y = 1400;
self.addChild(self.startText);
// Add text outline effect
self.startTextOutline = new Text2('TAP TO START', {
size: 66,
fill: 0xFFFFFF
});
self.startTextOutline.anchor.set(0.5, 0.5);
self.startTextOutline.x = 1022;
self.startTextOutline.y = 1398;
self.addChild(self.startTextOutline);
// Ensure text is on top of outline
self.removeChild(self.startText);
self.addChild(self.startText);
// Enhanced pulsing animation using tween
self.startPulse = function () {
// Scale up animation for button
tween(self.startButton, {
scaleX: 1.4,
scaleY: 0.7
}, {
duration: 800,
easing: tween.easeInOut,
onFinish: function onFinish() {
// Scale down animation
tween(self.startButton, {
scaleX: 1.2,
scaleY: 0.6
}, {
duration: 800,
easing: tween.easeInOut,
onFinish: function onFinish() {
self.startPulse(); // Loop the animation
}
});
}
});
// Animate border with slight delay
tween(self.buttonBorder, {
scaleX: 1.45,
scaleY: 0.75
}, {
duration: 800,
easing: tween.easeInOut,
onFinish: function onFinish() {
tween(self.buttonBorder, {
scaleX: 1.25,
scaleY: 0.65
}, {
duration: 800,
easing: tween.easeInOut
});
}
});
// Animate shadow
tween(self.buttonShadow, {
scaleX: 1.42,
scaleY: 0.72
}, {
duration: 800,
easing: tween.easeInOut,
onFinish: function onFinish() {
tween(self.buttonShadow, {
scaleX: 1.22,
scaleY: 0.62
}, {
duration: 800,
easing: tween.easeInOut
});
}
});
// Joyful bouncing text animation
tween(self.startText, {
scaleX: 1.3,
scaleY: 1.4,
rotation: 0.1
}, {
duration: 500,
easing: tween.bounceOut,
onFinish: function onFinish() {
tween(self.startText, {
scaleX: 1.0,
scaleY: 1.0,
rotation: -0.05
}, {
duration: 700,
easing: tween.elasticOut,
onFinish: function onFinish() {
tween(self.startText, {
rotation: 0
}, {
duration: 300,
easing: tween.easeInOut
});
}
});
}
});
// Outline bouncing animation with slight offset
tween(self.startTextOutline, {
scaleX: 1.25,
scaleY: 1.35,
rotation: 0.08
}, {
duration: 500,
easing: tween.bounceOut,
onFinish: function onFinish() {
tween(self.startTextOutline, {
scaleX: 1.0,
scaleY: 1.0,
rotation: -0.03
}, {
duration: 700,
easing: tween.elasticOut,
onFinish: function onFinish() {
tween(self.startTextOutline, {
rotation: 0
}, {
duration: 300,
easing: tween.easeInOut
});
}
});
}
});
};
// Start the pulsing animation
self.startPulse();
// Rainbow color animation for the text
self.colorIndex = 0;
self.rainbowColors = [0xFF0080,
// Hot pink
0xFF4000,
// Orange red
0xFFFF00,
// Bright yellow
0x00FF40,
// Lime green
0x0080FF,
// Sky blue
0x8000FF,
// Purple
0xFF0080 // Back to hot pink
];
self.colorPulse = function () {
var currentColor = self.rainbowColors[self.colorIndex];
var nextIndex = (self.colorIndex + 1) % self.rainbowColors.length;
var nextColor = self.rainbowColors[nextIndex];
tween(self.startText, {
tint: currentColor
}, {
duration: 600,
easing: tween.easeInOut,
onFinish: function onFinish() {
self.colorIndex = nextIndex;
self.colorPulse(); // Loop the color animation
}
});
// Outline with complementary colors
var outlineColor = self.colorIndex % 2 === 0 ? 0xFFFFFF : 0x000000;
tween(self.startTextOutline, {
tint: outlineColor
}, {
duration: 600,
easing: tween.easeInOut
});
};
// Start the rainbow color animation
self.colorPulse();
self.update = function () {
// Remove old simple pulsing - now using tween animations
};
self.down = function (x, y, obj) {
// Check if click is on start button area
var buttonDistance = Math.sqrt(Math.pow(x - 1024, 2) + Math.pow(y - 1400, 2));
if (buttonDistance < 200) {
self.startGame();
}
};
self.startGame = function () {
// Remove menu and start game
self.parent.removeChild(self);
gameStarted = true;
// Show all game elements
grassBackground.visible = true;
player.visible = true;
zone1.visible = true;
zone2.visible = true;
zone3.visible = true;
zone4.visible = true;
platform1.visible = true;
platform2.visible = true;
platform3.visible = true;
platform4.visible = true;
instructionText.visible = true;
scoreText.visible = true;
transformText.visible = true;
};
return self;
});
var Platform = Container.expand(function (platformType, platformX, platformY) {
var self = Container.call(this);
self.platformType = platformType;
self.isActive = false;
var assetType = platformType === 'light' ? 'lightPlatform' : 'shadowPlatform';
self.graphics = self.attachAsset(assetType, {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.3
});
self.x = platformX;
self.y = platformY;
self.activate = function () {
if (!self.isActive) {
self.isActive = true;
LK.getSound('activate').play();
tween(self.graphics, {
alpha: 1
}, {
duration: 500
});
}
};
self.deactivate = function () {
if (self.isActive) {
self.isActive = false;
tween(self.graphics, {
alpha: 0.3
}, {
duration: 500
});
}
};
return self;
});
var Player = Container.expand(function () {
var self = Container.call(this);
self.isLightForm = true;
self.speed = 8;
self.transformCooldown = 0;
self.lightGraphics = self.attachAsset('lightForm', {
anchorX: 0.5,
anchorY: 0.5
});
self.shadowGraphics = self.attachAsset('shadowForm', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0
});
self.transform = function () {
if (self.transformCooldown > 0) return;
self.isLightForm = !self.isLightForm;
self.transformCooldown = 30;
LK.getSound('transform').play();
if (self.isLightForm) {
tween(self.lightGraphics, {
alpha: 1
}, {
duration: 300
});
tween(self.shadowGraphics, {
alpha: 0
}, {
duration: 300
});
} else {
tween(self.lightGraphics, {
alpha: 0
}, {
duration: 300
});
tween(self.shadowGraphics, {
alpha: 1
}, {
duration: 300
});
}
};
self.update = function () {
if (self.transformCooldown > 0) {
self.transformCooldown--;
}
};
return self;
});
var Zone = Container.expand(function (zoneType, zoneX, zoneY) {
var self = Container.call(this);
self.zoneType = zoneType;
self.isCorrupted = true;
self.healingProgress = 0;
self.particles = [];
var assetType = zoneType === 'light' ? 'lightZone' : 'shadowZone';
if (zoneType === 'light') {
self.skyBackground = self.attachAsset('skyBlue', {
anchorX: 0.5,
anchorY: 0.5
});
}
self.background = self.attachAsset(assetType, {
anchorX: 0.5,
anchorY: 0.5
});
self.x = zoneX;
self.y = zoneY;
self.createCorruptionParticles = function () {
for (var i = 0; i < 8; i++) {
var particle = self.addChild(LK.getAsset('corruptionParticle', {
anchorX: 0.5,
anchorY: 0.5
}));
particle.x = (Math.random() - 0.5) * 300;
particle.y = (Math.random() - 0.5) * 300;
particle.floatSpeed = Math.random() * 2 + 1;
particle.floatDirection = Math.random() * Math.PI * 2;
self.particles.push(particle);
}
};
self.heal = function () {
if (!self.isCorrupted) return;
self.healingProgress += 2;
if (self.healingProgress >= 100) {
self.isCorrupted = false;
LK.getSound('heal').play();
for (var i = self.particles.length - 1; i >= 0; i--) {
var particle = self.particles[i];
tween(particle, {
alpha: 0,
scaleX: 0,
scaleY: 0
}, {
duration: 1000,
onFinish: function onFinish() {
if (particle.parent) {
particle.parent.removeChild(particle);
}
}
});
}
self.particles = [];
tween(self.background, {
tint: 0x99CC99
}, {
duration: 2000
});
for (var j = 0; j < 12; j++) {
var healParticle = self.addChild(LK.getAsset('healingParticle', {
anchorX: 0.5,
anchorY: 0.5
}));
healParticle.x = (Math.random() - 0.5) * 400;
healParticle.y = (Math.random() - 0.5) * 400;
tween(healParticle, {
y: healParticle.y - 200,
alpha: 0,
scaleX: 2,
scaleY: 2
}, {
duration: 2000,
onFinish: function onFinish() {
if (healParticle.parent) {
healParticle.parent.removeChild(healParticle);
}
}
});
}
zonesHealed++;
scoreText.setText('Zones Healed: ' + zonesHealed + '/4');
if (zonesHealed >= 4) {
LK.setTimeout(function () {
LK.showYouWin();
}, 2000);
}
}
};
self.update = function () {
for (var i = 0; i < self.particles.length; i++) {
var particle = self.particles[i];
particle.x += Math.cos(particle.floatDirection) * particle.floatSpeed;
particle.y += Math.sin(particle.floatDirection) * particle.floatSpeed;
if (Math.abs(particle.x) > 200) {
particle.floatDirection = Math.PI - particle.floatDirection;
}
if (Math.abs(particle.y) > 200) {
particle.floatDirection = -particle.floatDirection;
}
}
};
self.createCorruptionParticles();
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x006400
});
/****
* Game Code
****/
var gameStarted = false;
var grassBackground = game.addChild(LK.getAsset('grass', {
anchorX: 0,
anchorY: 0
}));
grassBackground.x = 0;
grassBackground.y = 0;
grassBackground.visible = false;
// Create and show main menu
var mainMenu = game.addChild(new MainMenu());
var player = game.addChild(new Player());
player.x = 1024;
player.y = 1366;
player.visible = false;
var zones = [];
var platforms = [];
var zonesHealed = 0;
var zone1 = game.addChild(new Zone('light', 512, 600));
var zone2 = game.addChild(new Zone('shadow', 1536, 600));
var zone3 = game.addChild(new Zone('light', 512, 1800));
var zone4 = game.addChild(new Zone('shadow', 1536, 1800));
zones.push(zone1, zone2, zone3, zone4);
zone1.visible = false;
zone2.visible = false;
zone3.visible = false;
zone4.visible = false;
var platform1 = game.addChild(new Platform('light', 800, 900));
var platform2 = game.addChild(new Platform('shadow', 1248, 900));
var platform3 = game.addChild(new Platform('light', 800, 1500));
var platform4 = game.addChild(new Platform('shadow', 1248, 1500));
platforms.push(platform1, platform2, platform3, platform4);
platform1.visible = false;
platform2.visible = false;
platform3.visible = false;
platform4.visible = false;
var instructionText = new Text2('Tap to move player\nDouble tap to transform\nStand on matching platforms to heal zones', {
size: 40,
fill: 0xFFFFFF
});
instructionText.anchor.set(0.5, 0);
LK.gui.top.addChild(instructionText);
instructionText.y = 100;
instructionText.visible = false;
var scoreText = new Text2('Zones Healed: 0/4', {
size: 50,
fill: 0xFFFF99
});
scoreText.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreText);
scoreText.y = 200;
scoreText.visible = false;
var transformText = new Text2('', {
size: 45,
fill: 0xFF99FF
});
transformText.anchor.set(0.5, 1);
LK.gui.bottom.addChild(transformText);
transformText.visible = false;
var lastTapTime = 0;
var targetX = player.x;
var targetY = player.y;
game.down = function (x, y, obj) {
if (!gameStarted) {
return; // Menu will handle its own input
}
var currentTime = Date.now();
if (currentTime - lastTapTime < 300) {
player.transform();
} else {
targetX = x;
targetY = y;
}
lastTapTime = currentTime;
};
game.update = function () {
if (!gameStarted) {
return; // Don't update game logic until started
}
var dx = targetX - player.x;
var dy = targetY - player.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > 10) {
var moveX = dx / distance * player.speed;
var moveY = dy / distance * player.speed;
player.x += moveX;
player.y += moveY;
}
for (var i = 0; i < platforms.length; i++) {
var platform = platforms[i];
var platformDistance = Math.sqrt(Math.pow(player.x - platform.x, 2) + Math.pow(player.y - platform.y, 2));
if (platformDistance < 120) {
if (player.isLightForm && platform.platformType === 'light' || !player.isLightForm && platform.platformType === 'shadow') {
platform.activate();
} else {
platform.deactivate();
}
} else {
platform.deactivate();
}
}
for (var j = 0; j < zones.length; j++) {
var zone = zones[j];
if (!zone.isCorrupted) continue;
var zoneDistance = Math.sqrt(Math.pow(player.x - zone.x, 2) + Math.pow(player.y - zone.y, 2));
if (zoneDistance < 220) {
var nearbyPlatform = null;
for (var k = 0; k < platforms.length; k++) {
var checkPlatform = platforms[k];
var platZoneDistance = Math.sqrt(Math.pow(zone.x - checkPlatform.x, 2) + Math.pow(zone.y - checkPlatform.y, 2));
if (platZoneDistance < 400 && checkPlatform.isActive) {
var correctForm = zone.zoneType === 'light' && !player.isLightForm || zone.zoneType === 'shadow' && player.isLightForm;
if (correctForm) {
nearbyPlatform = checkPlatform;
break;
}
}
}
if (nearbyPlatform) {
zone.heal();
}
}
}
if (player.isLightForm) {
transformText.setText('Light Form - Fast Movement');
transformText.fill = "#FFFF99";
} else {
transformText.setText('Shadow Form - Energy Absorption');
transformText.fill = "#9966FF";
}
if (player.transformCooldown > 0) {
transformText.setText(transformText.text + ' (Cooldown: ' + Math.ceil(player.transformCooldown / 60) + 's)');
}
};
Un campo soleado. In-Game asset. 2d. High contrast. No shadows. Cartoon
Un bosque oscuro. In-Game asset. 2d. High contrast. No shadows. Cartoon
Un círculo negro realista. In-Game asset. 2d. High contrast. No shadows. Realista
Un glitch negro. In-Game asset. 2d. High contrast. No shadows. Píxel art
Un círculo amarillo claro realista. In-Game asset. 2d. High contrast. No shadows. Realista
Un ladrillo realista. In-Game asset. 2d. High contrast. No shadows. Realista
Una pluma realista. In-Game asset. 2d. High contrast. No shadows. Realista
un corazón con un "+" verde al lado del corazon. In-Game asset. 2d. High contrast. No shadows. Cartoon
Un pasto desde arriba realista. In-Game asset. 2d. High contrast. No shadows. Realista
Un cielo azul. In-Game asset. 2d. High contrast. No shadows