/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ var ChainLetter = Container.expand(function (letter, targetX, targetY) { var self = Container.call(this); var graphics = self.attachAsset('chainLetter', { anchorX: 0.5, anchorY: 0.5 }); var letterText = new Text2(letter, { size: 60, fill: 0xFFFFFF }); letterText.anchor.set(0.5, 0.5); self.addChild(letterText); self.letter = letter; self.targetX = targetX; self.targetY = targetY; self.followDistance = 150; return self; }); var LetterD = Container.expand(function () { var self = Container.call(this); var graphics = self.attachAsset('letterD', { anchorX: 0.5, anchorY: 0.5 }); var letterText = new Text2('Д', { size: 80, fill: 0xFFFFFF }); letterText.anchor.set(0.5, 0.5); self.addChild(letterText); return self; }); var Obstacle = Container.expand(function () { var self = Container.call(this); var graphics = self.attachAsset('obstacle', { anchorX: 0.5, anchorY: 0.5 }); return self; }); var Target = Container.expand(function () { var self = Container.call(this); var graphics = self.attachAsset('target', { anchorX: 0.5, anchorY: 0.5 }); self.collected = false; self.update = function () { self.rotation += 0.05; }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x2F4F4F }); /**** * Game Code ****/ var cyrillicAlphabet = ['Й', 'Ц', 'У', 'К', 'Е', 'Н', 'Г', 'Ш', 'Щ', 'З', 'Ф', 'Ы', 'В', 'А', 'П', 'Р', 'О', 'Л', 'Я', 'Ч', 'С', 'М', 'И', 'Т', 'Ь']; var letterD = game.addChild(new LetterD()); letterD.x = 1024; letterD.y = 1366; var chainLetters = []; var targets = []; var obstacles = []; var currentLetterIndex = 0; var birthTimer = 0; var birthInterval = 180; // 3 seconds at 60fps var level = 1; var targetsCollected = 0; var targetsRequired = 5; var dragNode = null; // Level text var levelText = new Text2('Level ' + level, { size: 100, fill: 0xFFFFFF }); levelText.anchor.set(0.5, 0); LK.gui.top.addChild(levelText); // Score text var scoreText = new Text2('Chain: 0', { size: 80, fill: 0xFFFFFF }); scoreText.anchor.set(0, 0); scoreText.x = 50; scoreText.y = 50; game.addChild(scoreText); // Progress text var progressText = new Text2('Targets: 0/' + targetsRequired, { size: 60, fill: 0xFFFFFF }); progressText.anchor.set(1, 0); progressText.x = 1998; progressText.y = 50; game.addChild(progressText); function createLevel() { // Clear existing targets and obstacles for (var i = targets.length - 1; i >= 0; i--) { targets[i].destroy(); targets.splice(i, 1); } for (var i = obstacles.length - 1; i >= 0; i--) { obstacles[i].destroy(); obstacles.splice(i, 1); } // Create targets for (var i = 0; i < targetsRequired; i++) { var target = game.addChild(new Target()); target.x = Math.random() * 1800 + 124; target.y = Math.random() * 2400 + 166; targets.push(target); } // Create obstacles var numObstacles = Math.min(level + 2, 8); for (var i = 0; i < numObstacles; i++) { var obstacle = game.addChild(new Obstacle()); obstacle.x = Math.random() * 1800 + 124; obstacle.y = Math.random() * 2400 + 166; // Make sure obstacles don't spawn too close to player start var distToPlayer = Math.sqrt(Math.pow(obstacle.x - letterD.x, 2) + Math.pow(obstacle.y - letterD.y, 2)); if (distToPlayer < 300) { obstacle.x = Math.random() * 1000 + 1000; obstacle.y = Math.random() * 1000 + 1500; } obstacles.push(obstacle); } targetsCollected = 0; progressText.setText('Targets: 0/' + targetsRequired); } function giveBirth() { if (currentLetterIndex < cyrillicAlphabet.length) { var newLetter = game.addChild(new ChainLetter(cyrillicAlphabet[currentLetterIndex])); newLetter.x = letterD.x; newLetter.y = letterD.y; chainLetters.push(newLetter); currentLetterIndex++; LK.getSound('birth').play(); scoreText.setText('Chain: ' + chainLetters.length); // Flash effect for birth LK.effects.flashObject(letterD, 0xFFFFFF, 300); } } function updateChain() { if (chainLetters.length > 0) { // First letter follows D var firstLetter = chainLetters[0]; var dx = letterD.x - firstLetter.x; var dy = letterD.y - firstLetter.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance > firstLetter.followDistance) { var moveX = dx / distance * 3; var moveY = dy / distance * 3; firstLetter.x += moveX; firstLetter.y += moveY; } // Other letters follow the previous letter for (var i = 1; i < chainLetters.length; i++) { var currentLetter = chainLetters[i]; var previousLetter = chainLetters[i - 1]; dx = previousLetter.x - currentLetter.x; dy = previousLetter.y - currentLetter.y; distance = Math.sqrt(dx * dx + dy * dy); if (distance > currentLetter.followDistance) { moveX = dx / distance * 3; moveY = dy / distance * 3; currentLetter.x += moveX; currentLetter.y += moveY; } } } } function checkCollisions() { // Check D collision with obstacles for (var i = 0; i < obstacles.length; i++) { if (letterD.intersects(obstacles[i])) { // Game over - chain broken LK.effects.flashScreen(0xFF0000, 1000); LK.showGameOver(); return; } } // Check chain collision with obstacles for (var i = 0; i < chainLetters.length; i++) { for (var j = 0; j < obstacles.length; j++) { if (chainLetters[i].intersects(obstacles[j])) { LK.effects.flashScreen(0xFF0000, 1000); LK.showGameOver(); return; } } } // Check target collection for (var i = targets.length - 1; i >= 0; i--) { var target = targets[i]; if (!target.collected && letterD.intersects(target)) { target.collected = true; target.destroy(); targets.splice(i, 1); targetsCollected++; LK.setScore(LK.getScore() + 10); LK.getSound('collect').play(); progressText.setText('Targets: ' + targetsCollected + '/' + targetsRequired); if (targetsCollected >= targetsRequired) { // Level complete level++; targetsRequired = Math.min(targetsRequired + 2, 10); levelText.setText('Level ' + level); LK.getSound('complete').play(); LK.effects.flashScreen(0x00FF00, 500); // Check win condition if (currentLetterIndex >= cyrillicAlphabet.length && level > 3) { LK.showYouWin(); return; } createLevel(); } } } } function handleMove(x, y, obj) { if (dragNode) { dragNode.x = x; dragNode.y = y; // Keep D within bounds dragNode.x = Math.max(60, Math.min(dragNode.x, 1988)); dragNode.y = Math.max(60, Math.min(dragNode.y, 2672)); } } game.move = handleMove; game.down = function (x, y, obj) { dragNode = letterD; handleMove(x, y, obj); }; game.up = function (x, y, obj) { dragNode = null; }; game.update = function () { birthTimer++; if (birthTimer >= birthInterval) { giveBirth(); birthTimer = 0; // Decrease birth interval slightly each time for increasing difficulty birthInterval = Math.max(120, birthInterval - 2); } updateChain(); checkCollisions(); }; // Initialize first level createLevel();
===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,264 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+
+/****
+* Classes
+****/
+var ChainLetter = Container.expand(function (letter, targetX, targetY) {
+ var self = Container.call(this);
+ var graphics = self.attachAsset('chainLetter', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ var letterText = new Text2(letter, {
+ size: 60,
+ fill: 0xFFFFFF
+ });
+ letterText.anchor.set(0.5, 0.5);
+ self.addChild(letterText);
+ self.letter = letter;
+ self.targetX = targetX;
+ self.targetY = targetY;
+ self.followDistance = 150;
+ return self;
+});
+var LetterD = Container.expand(function () {
+ var self = Container.call(this);
+ var graphics = self.attachAsset('letterD', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ var letterText = new Text2('Д', {
+ size: 80,
+ fill: 0xFFFFFF
+ });
+ letterText.anchor.set(0.5, 0.5);
+ self.addChild(letterText);
+ return self;
+});
+var Obstacle = Container.expand(function () {
+ var self = Container.call(this);
+ var graphics = self.attachAsset('obstacle', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ return self;
+});
+var Target = Container.expand(function () {
+ var self = Container.call(this);
+ var graphics = self.attachAsset('target', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.collected = false;
+ self.update = function () {
+ self.rotation += 0.05;
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x2F4F4F
+});
+
+/****
+* Game Code
+****/
+var cyrillicAlphabet = ['Й', 'Ц', 'У', 'К', 'Е', 'Н', 'Г', 'Ш', 'Щ', 'З', 'Ф', 'Ы', 'В', 'А', 'П', 'Р', 'О', 'Л', 'Я', 'Ч', 'С', 'М', 'И', 'Т', 'Ь'];
+var letterD = game.addChild(new LetterD());
+letterD.x = 1024;
+letterD.y = 1366;
+var chainLetters = [];
+var targets = [];
+var obstacles = [];
+var currentLetterIndex = 0;
+var birthTimer = 0;
+var birthInterval = 180; // 3 seconds at 60fps
+var level = 1;
+var targetsCollected = 0;
+var targetsRequired = 5;
+var dragNode = null;
+// Level text
+var levelText = new Text2('Level ' + level, {
+ size: 100,
+ fill: 0xFFFFFF
+});
+levelText.anchor.set(0.5, 0);
+LK.gui.top.addChild(levelText);
+// Score text
+var scoreText = new Text2('Chain: 0', {
+ size: 80,
+ fill: 0xFFFFFF
+});
+scoreText.anchor.set(0, 0);
+scoreText.x = 50;
+scoreText.y = 50;
+game.addChild(scoreText);
+// Progress text
+var progressText = new Text2('Targets: 0/' + targetsRequired, {
+ size: 60,
+ fill: 0xFFFFFF
+});
+progressText.anchor.set(1, 0);
+progressText.x = 1998;
+progressText.y = 50;
+game.addChild(progressText);
+function createLevel() {
+ // Clear existing targets and obstacles
+ for (var i = targets.length - 1; i >= 0; i--) {
+ targets[i].destroy();
+ targets.splice(i, 1);
+ }
+ for (var i = obstacles.length - 1; i >= 0; i--) {
+ obstacles[i].destroy();
+ obstacles.splice(i, 1);
+ }
+ // Create targets
+ for (var i = 0; i < targetsRequired; i++) {
+ var target = game.addChild(new Target());
+ target.x = Math.random() * 1800 + 124;
+ target.y = Math.random() * 2400 + 166;
+ targets.push(target);
+ }
+ // Create obstacles
+ var numObstacles = Math.min(level + 2, 8);
+ for (var i = 0; i < numObstacles; i++) {
+ var obstacle = game.addChild(new Obstacle());
+ obstacle.x = Math.random() * 1800 + 124;
+ obstacle.y = Math.random() * 2400 + 166;
+ // Make sure obstacles don't spawn too close to player start
+ var distToPlayer = Math.sqrt(Math.pow(obstacle.x - letterD.x, 2) + Math.pow(obstacle.y - letterD.y, 2));
+ if (distToPlayer < 300) {
+ obstacle.x = Math.random() * 1000 + 1000;
+ obstacle.y = Math.random() * 1000 + 1500;
+ }
+ obstacles.push(obstacle);
+ }
+ targetsCollected = 0;
+ progressText.setText('Targets: 0/' + targetsRequired);
+}
+function giveBirth() {
+ if (currentLetterIndex < cyrillicAlphabet.length) {
+ var newLetter = game.addChild(new ChainLetter(cyrillicAlphabet[currentLetterIndex]));
+ newLetter.x = letterD.x;
+ newLetter.y = letterD.y;
+ chainLetters.push(newLetter);
+ currentLetterIndex++;
+ LK.getSound('birth').play();
+ scoreText.setText('Chain: ' + chainLetters.length);
+ // Flash effect for birth
+ LK.effects.flashObject(letterD, 0xFFFFFF, 300);
+ }
+}
+function updateChain() {
+ if (chainLetters.length > 0) {
+ // First letter follows D
+ var firstLetter = chainLetters[0];
+ var dx = letterD.x - firstLetter.x;
+ var dy = letterD.y - firstLetter.y;
+ var distance = Math.sqrt(dx * dx + dy * dy);
+ if (distance > firstLetter.followDistance) {
+ var moveX = dx / distance * 3;
+ var moveY = dy / distance * 3;
+ firstLetter.x += moveX;
+ firstLetter.y += moveY;
+ }
+ // Other letters follow the previous letter
+ for (var i = 1; i < chainLetters.length; i++) {
+ var currentLetter = chainLetters[i];
+ var previousLetter = chainLetters[i - 1];
+ dx = previousLetter.x - currentLetter.x;
+ dy = previousLetter.y - currentLetter.y;
+ distance = Math.sqrt(dx * dx + dy * dy);
+ if (distance > currentLetter.followDistance) {
+ moveX = dx / distance * 3;
+ moveY = dy / distance * 3;
+ currentLetter.x += moveX;
+ currentLetter.y += moveY;
+ }
+ }
+ }
+}
+function checkCollisions() {
+ // Check D collision with obstacles
+ for (var i = 0; i < obstacles.length; i++) {
+ if (letterD.intersects(obstacles[i])) {
+ // Game over - chain broken
+ LK.effects.flashScreen(0xFF0000, 1000);
+ LK.showGameOver();
+ return;
+ }
+ }
+ // Check chain collision with obstacles
+ for (var i = 0; i < chainLetters.length; i++) {
+ for (var j = 0; j < obstacles.length; j++) {
+ if (chainLetters[i].intersects(obstacles[j])) {
+ LK.effects.flashScreen(0xFF0000, 1000);
+ LK.showGameOver();
+ return;
+ }
+ }
+ }
+ // Check target collection
+ for (var i = targets.length - 1; i >= 0; i--) {
+ var target = targets[i];
+ if (!target.collected && letterD.intersects(target)) {
+ target.collected = true;
+ target.destroy();
+ targets.splice(i, 1);
+ targetsCollected++;
+ LK.setScore(LK.getScore() + 10);
+ LK.getSound('collect').play();
+ progressText.setText('Targets: ' + targetsCollected + '/' + targetsRequired);
+ if (targetsCollected >= targetsRequired) {
+ // Level complete
+ level++;
+ targetsRequired = Math.min(targetsRequired + 2, 10);
+ levelText.setText('Level ' + level);
+ LK.getSound('complete').play();
+ LK.effects.flashScreen(0x00FF00, 500);
+ // Check win condition
+ if (currentLetterIndex >= cyrillicAlphabet.length && level > 3) {
+ LK.showYouWin();
+ return;
+ }
+ createLevel();
+ }
+ }
+ }
+}
+function handleMove(x, y, obj) {
+ if (dragNode) {
+ dragNode.x = x;
+ dragNode.y = y;
+ // Keep D within bounds
+ dragNode.x = Math.max(60, Math.min(dragNode.x, 1988));
+ dragNode.y = Math.max(60, Math.min(dragNode.y, 2672));
+ }
+}
+game.move = handleMove;
+game.down = function (x, y, obj) {
+ dragNode = letterD;
+ handleMove(x, y, obj);
+};
+game.up = function (x, y, obj) {
+ dragNode = null;
+};
+game.update = function () {
+ birthTimer++;
+ if (birthTimer >= birthInterval) {
+ giveBirth();
+ birthTimer = 0;
+ // Decrease birth interval slightly each time for increasing difficulty
+ birthInterval = Math.max(120, birthInterval - 2);
+ }
+ updateChain();
+ checkCollisions();
+};
+// Initialize first level
+createLevel();
\ No newline at end of file