/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1"); /**** * Classes ****/ var Player = Container.expand(function () { var self = Container.call(this); var playerGraphics = self.attachAsset('player', { anchorX: 0.5, anchorY: 0.5 }); var greetingBubble = self.attachAsset('greeting', { anchorX: 0.5, anchorY: 1.0, x: 0, y: -70 }); var greetingText = new Text2('¡Hola!', { size: 30, fill: '#000000' }); greetingText.anchor.set(0.5, 0.5); greetingText.x = 0; greetingText.y = -70; self.addChild(greetingText); greetingBubble.visible = false; greetingText.visible = false; self.showGreeting = function () { greetingBubble.visible = true; greetingText.visible = true; greetingBubble.alpha = 1; greetingText.alpha = 1; tween(greetingBubble, { alpha: 0 }, { duration: 800, onFinish: function onFinish() { greetingBubble.visible = false; } }); tween(greetingText, { alpha: 0 }, { duration: 800, onFinish: function onFinish() { greetingText.visible = false; } }); }; self.isGreeting = false; self.greetingCooldown = 0; self.update = function () { if (self.greetingCooldown > 0) { self.greetingCooldown--; } }; self.greet = function () { if (self.greetingCooldown <= 0) { self.isGreeting = true; self.showGreeting(); self.greetingCooldown = 15; // Short cooldown to prevent spam LK.setTimeout(function () { self.isGreeting = false; }, 250); return true; } return false; }; return self; }); var Townsperson = Container.expand(function (isSpecial) { var self = Container.call(this); self.isSpecial = isSpecial || false; var assetId = self.isSpecial ? 'specialPerson' : 'townsperson'; var personGraphics = self.attachAsset(assetId, { anchorX: 0.5, anchorY: 0.5 }); self.greeted = false; self.speed = 1 + Math.random() * 2; self.direction = Math.random() * Math.PI * 2; self.targetX = null; self.targetY = null; self.moveTimeout = 0; self.setRandomDirection = function () { self.direction = Math.random() * Math.PI * 2; }; self.setRandomTarget = function () { self.targetX = 100 + Math.random() * (2048 - 200); self.targetY = 100 + Math.random() * (2732 - 200); // Calculate direction to target var dx = self.targetX - self.x; var dy = self.targetY - self.y; self.direction = Math.atan2(dy, dx); // Reset timeout self.moveTimeout = 60 + Math.floor(Math.random() * 120); // 1-3 seconds }; self.update = function () { if (self.moveTimeout <= 0) { self.setRandomTarget(); } else { self.moveTimeout--; } if (self.targetX !== null && self.targetY !== null) { // Move toward target var dx = self.targetX - self.x; var dy = self.targetY - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance < 5) { // Close enough, get new target self.setRandomTarget(); } else { var moveX = Math.cos(self.direction) * self.speed; var moveY = Math.sin(self.direction) * self.speed; self.x += moveX; self.y += moveY; // Boundary check if (self.x < 50) { self.x = 50; } if (self.x > 2048 - 50) { self.x = 2048 - 50; } if (self.y < 50) { self.y = 50; } if (self.y > 2732 - 50) { self.y = 2732 - 50; } } } else { self.setRandomTarget(); } }; self.greet = function () { if (!self.greeted) { self.greeted = true; // Flash effect LK.effects.flashObject(self, 0x00FF00, 300); // Slight movement bounce var currentX = self.x; var currentY = self.y; tween(self, { x: currentX + Math.cos(self.direction) * 20, y: currentY + Math.sin(self.direction) * 20 }, { duration: 150, easing: tween.easeOut, onFinish: function onFinish() { tween(self, { x: currentX, y: currentY }, { duration: 150, easing: tween.easeIn }); } }); return true; } return false; }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x88CC99 }); /**** * Game Code ****/ // Define gameplay variables var player = null; var townspeople = []; var score = 0; var combo = 0; var maxCombo = 0; var level = 1; var spawnTimer = 0; var dragNode = null; var gameTime = 0; var gameActive = true; // UI elements var scoreTxt = new Text2('Score: 0', { size: 60, fill: 0xFFFFFF }); scoreTxt.anchor.set(1, 0); LK.gui.topRight.addChild(scoreTxt); var comboTxt = new Text2('Combo: 0', { size: 40, fill: 0xFFFFFF }); comboTxt.anchor.set(1, 0); comboTxt.y = 70; LK.gui.topRight.addChild(comboTxt); var levelTxt = new Text2('Level: 1', { size: 40, fill: 0xFFFFFF }); levelTxt.anchor.set(0, 0); levelTxt.x = 120; // Leave space for platform menu icon LK.gui.topLeft.addChild(levelTxt); var timeTxt = new Text2('Time: 60', { size: 40, fill: 0xFFFFFF }); timeTxt.anchor.set(0.5, 0); LK.gui.top.addChild(timeTxt); // Start the game function initGame() { // Reset game state townspeople.forEach(function (person) { person.destroy(); }); townspeople = []; score = 0; combo = 0; maxCombo = 0; level = 1; gameTime = 60; // 60 second game gameActive = true; // Reset UI updateUI(); // Create player if (player) { player.destroy(); } player = new Player(); player.x = 2048 / 2; player.y = 2732 / 2; game.addChild(player); // Initial townspeople spawnTownspeople(5); // Play music LK.playMusic('fiestaMusic'); } function spawnTownspeople(count) { for (var i = 0; i < count; i++) { spawnTownsperson(); } } function spawnTownsperson() { var isSpecial = Math.random() < 0.2; // 20% chance for special person var person = new Townsperson(isSpecial); // Position on the edge of the screen var side = Math.floor(Math.random() * 4); switch (side) { case 0: // Top person.x = Math.random() * 2048; person.y = 50; break; case 1: // Right person.x = 2048 - 50; person.y = Math.random() * 2732; break; case 2: // Bottom person.x = Math.random() * 2048; person.y = 2732 - 50; break; case 3: // Left person.x = 50; person.y = Math.random() * 2732; break; } // Make sure it's not too close to the player var dx = person.x - player.x; var dy = person.y - player.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance < 300) { person.x = Math.random() * 2048; person.y = Math.random() * 2732; } game.addChild(person); townspeople.push(person); return person; } function updateUI() { scoreTxt.setText('Score: ' + score); comboTxt.setText('Combo: x' + combo); levelTxt.setText('Level: ' + level); timeTxt.setText('Time: ' + Math.ceil(gameTime)); } function updateLevel() { var previousLevel = level; // Calculate level based on score level = Math.floor(score / 500) + 1; // Cap at level 10 if (level > 10) { level = 10; } // If level increased if (level > previousLevel) { // Spawn more townspeople for each level spawnTownspeople(level); // Update UI levelTxt.setText('Level: ' + level); // Flash level text tween(levelTxt, { alpha: 0 }, { duration: 200, onFinish: function onFinish() { tween(levelTxt, { alpha: 1 }, { duration: 200 }); } }); } } function handleMove(x, y, obj) { if (dragNode) { dragNode.x = x; dragNode.y = y; // Keep player within bounds if (dragNode.x < 50) { dragNode.x = 50; } if (dragNode.x > 2048 - 50) { dragNode.x = 2048 - 50; } if (dragNode.y < 50) { dragNode.y = 50; } if (dragNode.y > 2732 - 50) { dragNode.y = 2732 - 50; } // Check for greetings when player moves if (player.isGreeting) { checkGreetings(); } } } function checkGreetings() { var greetedSomeone = false; for (var i = 0; i < townspeople.length; i++) { var person = townspeople[i]; // Only check for non-greeted people if (!person.greeted && player.intersects(person)) { if (person.greet()) { greetedSomeone = true; // Add score var pointsEarned = 10 * combo * (person.isSpecial ? 3 : 1); score += pointsEarned; // Show points gained var pointsTxt = new Text2("+" + pointsEarned, { size: 40, fill: person.isSpecial ? "#FFD700" : "#FFFFFF" }); pointsTxt.anchor.set(0.5, 0.5); pointsTxt.x = person.x; pointsTxt.y = person.y - 60; game.addChild(pointsTxt); tween(pointsTxt, { y: pointsTxt.y - 80, alpha: 0 }, { duration: 1000, onFinish: function onFinish() { pointsTxt.destroy(); } }); // Update combo combo++; if (combo > maxCombo) { maxCombo = combo; } // Play sound if (person.isSpecial) { LK.getSound('specialGreet').play(); } else { LK.getSound('greet').play(); } // Update level based on score updateLevel(); } } } if (greetedSomeone) { // Play combo sound if it's getting high if (combo > 1 && combo % 5 === 0) { LK.getSound('combo').play(); // Flash combo text tween(comboTxt, { scaleX: 1.5, scaleY: 1.5 }, { duration: 200, onFinish: function onFinish() { tween(comboTxt, { scaleX: 1, scaleY: 1 }, { duration: 200 }); } }); } } // Update UI updateUI(); } game.down = function (x, y, obj) { if (!gameActive) { return; } dragNode = player; handleMove(x, y, obj); // Greet if (player.greet()) { checkGreetings(); } }; game.up = function (x, y, obj) { dragNode = null; }; game.move = handleMove; game.update = function () { if (!gameActive) { return; } // Update game time gameTime -= 1 / 60; // Assuming 60 FPS if (gameTime <= 0) { gameOver(); return; } // Update UI updateUI(); // Spawn new townspeople occasionally spawnTimer++; if (spawnTimer >= 180) { // Every 3 seconds spawnTimer = 0; // Chance to spawn increases with level if (Math.random() < 0.2 + level * 0.05) { spawnTownsperson(); } } // Reset combo if no greets for a while if (player.greetingCooldown <= 0 && combo > 0) { var comboDecayRate = 1 / 180; // Lose combo after 3 seconds of inactivity combo = Math.max(0, combo - comboDecayRate); if (combo < 1) { combo = 0; updateUI(); } } // Update all townspeople for (var i = townspeople.length - 1; i >= 0; i--) { var person = townspeople[i]; // Remove greeted people after a while if (person.greeted) { person.alpha -= 0.01; if (person.alpha <= 0) { person.destroy(); townspeople.splice(i, 1); continue; } } } }; function gameOver() { gameActive = false; // Set final score LK.setScore(score); // Show game over LK.showGameOver(); } // Initialize the game initGame();
===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,485 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+var storage = LK.import("@upit/storage.v1");
+
+/****
+* Classes
+****/
+var Player = Container.expand(function () {
+ var self = Container.call(this);
+ var playerGraphics = self.attachAsset('player', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ var greetingBubble = self.attachAsset('greeting', {
+ anchorX: 0.5,
+ anchorY: 1.0,
+ x: 0,
+ y: -70
+ });
+ var greetingText = new Text2('¡Hola!', {
+ size: 30,
+ fill: '#000000'
+ });
+ greetingText.anchor.set(0.5, 0.5);
+ greetingText.x = 0;
+ greetingText.y = -70;
+ self.addChild(greetingText);
+ greetingBubble.visible = false;
+ greetingText.visible = false;
+ self.showGreeting = function () {
+ greetingBubble.visible = true;
+ greetingText.visible = true;
+ greetingBubble.alpha = 1;
+ greetingText.alpha = 1;
+ tween(greetingBubble, {
+ alpha: 0
+ }, {
+ duration: 800,
+ onFinish: function onFinish() {
+ greetingBubble.visible = false;
+ }
+ });
+ tween(greetingText, {
+ alpha: 0
+ }, {
+ duration: 800,
+ onFinish: function onFinish() {
+ greetingText.visible = false;
+ }
+ });
+ };
+ self.isGreeting = false;
+ self.greetingCooldown = 0;
+ self.update = function () {
+ if (self.greetingCooldown > 0) {
+ self.greetingCooldown--;
+ }
+ };
+ self.greet = function () {
+ if (self.greetingCooldown <= 0) {
+ self.isGreeting = true;
+ self.showGreeting();
+ self.greetingCooldown = 15; // Short cooldown to prevent spam
+ LK.setTimeout(function () {
+ self.isGreeting = false;
+ }, 250);
+ return true;
+ }
+ return false;
+ };
+ return self;
+});
+var Townsperson = Container.expand(function (isSpecial) {
+ var self = Container.call(this);
+ self.isSpecial = isSpecial || false;
+ var assetId = self.isSpecial ? 'specialPerson' : 'townsperson';
+ var personGraphics = self.attachAsset(assetId, {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.greeted = false;
+ self.speed = 1 + Math.random() * 2;
+ self.direction = Math.random() * Math.PI * 2;
+ self.targetX = null;
+ self.targetY = null;
+ self.moveTimeout = 0;
+ self.setRandomDirection = function () {
+ self.direction = Math.random() * Math.PI * 2;
+ };
+ self.setRandomTarget = function () {
+ self.targetX = 100 + Math.random() * (2048 - 200);
+ self.targetY = 100 + Math.random() * (2732 - 200);
+ // Calculate direction to target
+ var dx = self.targetX - self.x;
+ var dy = self.targetY - self.y;
+ self.direction = Math.atan2(dy, dx);
+ // Reset timeout
+ self.moveTimeout = 60 + Math.floor(Math.random() * 120); // 1-3 seconds
+ };
+ self.update = function () {
+ if (self.moveTimeout <= 0) {
+ self.setRandomTarget();
+ } else {
+ self.moveTimeout--;
+ }
+ if (self.targetX !== null && self.targetY !== null) {
+ // Move toward target
+ var dx = self.targetX - self.x;
+ var dy = self.targetY - self.y;
+ var distance = Math.sqrt(dx * dx + dy * dy);
+ if (distance < 5) {
+ // Close enough, get new target
+ self.setRandomTarget();
+ } else {
+ var moveX = Math.cos(self.direction) * self.speed;
+ var moveY = Math.sin(self.direction) * self.speed;
+ self.x += moveX;
+ self.y += moveY;
+ // Boundary check
+ if (self.x < 50) {
+ self.x = 50;
+ }
+ if (self.x > 2048 - 50) {
+ self.x = 2048 - 50;
+ }
+ if (self.y < 50) {
+ self.y = 50;
+ }
+ if (self.y > 2732 - 50) {
+ self.y = 2732 - 50;
+ }
+ }
+ } else {
+ self.setRandomTarget();
+ }
+ };
+ self.greet = function () {
+ if (!self.greeted) {
+ self.greeted = true;
+ // Flash effect
+ LK.effects.flashObject(self, 0x00FF00, 300);
+ // Slight movement bounce
+ var currentX = self.x;
+ var currentY = self.y;
+ tween(self, {
+ x: currentX + Math.cos(self.direction) * 20,
+ y: currentY + Math.sin(self.direction) * 20
+ }, {
+ duration: 150,
+ easing: tween.easeOut,
+ onFinish: function onFinish() {
+ tween(self, {
+ x: currentX,
+ y: currentY
+ }, {
+ duration: 150,
+ easing: tween.easeIn
+ });
+ }
+ });
+ return true;
+ }
+ return false;
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x88CC99
+});
+
+/****
+* Game Code
+****/
+// Define gameplay variables
+var player = null;
+var townspeople = [];
+var score = 0;
+var combo = 0;
+var maxCombo = 0;
+var level = 1;
+var spawnTimer = 0;
+var dragNode = null;
+var gameTime = 0;
+var gameActive = true;
+// UI elements
+var scoreTxt = new Text2('Score: 0', {
+ size: 60,
+ fill: 0xFFFFFF
+});
+scoreTxt.anchor.set(1, 0);
+LK.gui.topRight.addChild(scoreTxt);
+var comboTxt = new Text2('Combo: 0', {
+ size: 40,
+ fill: 0xFFFFFF
+});
+comboTxt.anchor.set(1, 0);
+comboTxt.y = 70;
+LK.gui.topRight.addChild(comboTxt);
+var levelTxt = new Text2('Level: 1', {
+ size: 40,
+ fill: 0xFFFFFF
+});
+levelTxt.anchor.set(0, 0);
+levelTxt.x = 120; // Leave space for platform menu icon
+LK.gui.topLeft.addChild(levelTxt);
+var timeTxt = new Text2('Time: 60', {
+ size: 40,
+ fill: 0xFFFFFF
+});
+timeTxt.anchor.set(0.5, 0);
+LK.gui.top.addChild(timeTxt);
+// Start the game
+function initGame() {
+ // Reset game state
+ townspeople.forEach(function (person) {
+ person.destroy();
+ });
+ townspeople = [];
+ score = 0;
+ combo = 0;
+ maxCombo = 0;
+ level = 1;
+ gameTime = 60; // 60 second game
+ gameActive = true;
+ // Reset UI
+ updateUI();
+ // Create player
+ if (player) {
+ player.destroy();
+ }
+ player = new Player();
+ player.x = 2048 / 2;
+ player.y = 2732 / 2;
+ game.addChild(player);
+ // Initial townspeople
+ spawnTownspeople(5);
+ // Play music
+ LK.playMusic('fiestaMusic');
+}
+function spawnTownspeople(count) {
+ for (var i = 0; i < count; i++) {
+ spawnTownsperson();
+ }
+}
+function spawnTownsperson() {
+ var isSpecial = Math.random() < 0.2; // 20% chance for special person
+ var person = new Townsperson(isSpecial);
+ // Position on the edge of the screen
+ var side = Math.floor(Math.random() * 4);
+ switch (side) {
+ case 0:
+ // Top
+ person.x = Math.random() * 2048;
+ person.y = 50;
+ break;
+ case 1:
+ // Right
+ person.x = 2048 - 50;
+ person.y = Math.random() * 2732;
+ break;
+ case 2:
+ // Bottom
+ person.x = Math.random() * 2048;
+ person.y = 2732 - 50;
+ break;
+ case 3:
+ // Left
+ person.x = 50;
+ person.y = Math.random() * 2732;
+ break;
+ }
+ // Make sure it's not too close to the player
+ var dx = person.x - player.x;
+ var dy = person.y - player.y;
+ var distance = Math.sqrt(dx * dx + dy * dy);
+ if (distance < 300) {
+ person.x = Math.random() * 2048;
+ person.y = Math.random() * 2732;
+ }
+ game.addChild(person);
+ townspeople.push(person);
+ return person;
+}
+function updateUI() {
+ scoreTxt.setText('Score: ' + score);
+ comboTxt.setText('Combo: x' + combo);
+ levelTxt.setText('Level: ' + level);
+ timeTxt.setText('Time: ' + Math.ceil(gameTime));
+}
+function updateLevel() {
+ var previousLevel = level;
+ // Calculate level based on score
+ level = Math.floor(score / 500) + 1;
+ // Cap at level 10
+ if (level > 10) {
+ level = 10;
+ }
+ // If level increased
+ if (level > previousLevel) {
+ // Spawn more townspeople for each level
+ spawnTownspeople(level);
+ // Update UI
+ levelTxt.setText('Level: ' + level);
+ // Flash level text
+ tween(levelTxt, {
+ alpha: 0
+ }, {
+ duration: 200,
+ onFinish: function onFinish() {
+ tween(levelTxt, {
+ alpha: 1
+ }, {
+ duration: 200
+ });
+ }
+ });
+ }
+}
+function handleMove(x, y, obj) {
+ if (dragNode) {
+ dragNode.x = x;
+ dragNode.y = y;
+ // Keep player within bounds
+ if (dragNode.x < 50) {
+ dragNode.x = 50;
+ }
+ if (dragNode.x > 2048 - 50) {
+ dragNode.x = 2048 - 50;
+ }
+ if (dragNode.y < 50) {
+ dragNode.y = 50;
+ }
+ if (dragNode.y > 2732 - 50) {
+ dragNode.y = 2732 - 50;
+ }
+ // Check for greetings when player moves
+ if (player.isGreeting) {
+ checkGreetings();
+ }
+ }
+}
+function checkGreetings() {
+ var greetedSomeone = false;
+ for (var i = 0; i < townspeople.length; i++) {
+ var person = townspeople[i];
+ // Only check for non-greeted people
+ if (!person.greeted && player.intersects(person)) {
+ if (person.greet()) {
+ greetedSomeone = true;
+ // Add score
+ var pointsEarned = 10 * combo * (person.isSpecial ? 3 : 1);
+ score += pointsEarned;
+ // Show points gained
+ var pointsTxt = new Text2("+" + pointsEarned, {
+ size: 40,
+ fill: person.isSpecial ? "#FFD700" : "#FFFFFF"
+ });
+ pointsTxt.anchor.set(0.5, 0.5);
+ pointsTxt.x = person.x;
+ pointsTxt.y = person.y - 60;
+ game.addChild(pointsTxt);
+ tween(pointsTxt, {
+ y: pointsTxt.y - 80,
+ alpha: 0
+ }, {
+ duration: 1000,
+ onFinish: function onFinish() {
+ pointsTxt.destroy();
+ }
+ });
+ // Update combo
+ combo++;
+ if (combo > maxCombo) {
+ maxCombo = combo;
+ }
+ // Play sound
+ if (person.isSpecial) {
+ LK.getSound('specialGreet').play();
+ } else {
+ LK.getSound('greet').play();
+ }
+ // Update level based on score
+ updateLevel();
+ }
+ }
+ }
+ if (greetedSomeone) {
+ // Play combo sound if it's getting high
+ if (combo > 1 && combo % 5 === 0) {
+ LK.getSound('combo').play();
+ // Flash combo text
+ tween(comboTxt, {
+ scaleX: 1.5,
+ scaleY: 1.5
+ }, {
+ duration: 200,
+ onFinish: function onFinish() {
+ tween(comboTxt, {
+ scaleX: 1,
+ scaleY: 1
+ }, {
+ duration: 200
+ });
+ }
+ });
+ }
+ }
+ // Update UI
+ updateUI();
+}
+game.down = function (x, y, obj) {
+ if (!gameActive) {
+ return;
+ }
+ dragNode = player;
+ handleMove(x, y, obj);
+ // Greet
+ if (player.greet()) {
+ checkGreetings();
+ }
+};
+game.up = function (x, y, obj) {
+ dragNode = null;
+};
+game.move = handleMove;
+game.update = function () {
+ if (!gameActive) {
+ return;
+ }
+ // Update game time
+ gameTime -= 1 / 60; // Assuming 60 FPS
+ if (gameTime <= 0) {
+ gameOver();
+ return;
+ }
+ // Update UI
+ updateUI();
+ // Spawn new townspeople occasionally
+ spawnTimer++;
+ if (spawnTimer >= 180) {
+ // Every 3 seconds
+ spawnTimer = 0;
+ // Chance to spawn increases with level
+ if (Math.random() < 0.2 + level * 0.05) {
+ spawnTownsperson();
+ }
+ }
+ // Reset combo if no greets for a while
+ if (player.greetingCooldown <= 0 && combo > 0) {
+ var comboDecayRate = 1 / 180; // Lose combo after 3 seconds of inactivity
+ combo = Math.max(0, combo - comboDecayRate);
+ if (combo < 1) {
+ combo = 0;
+ updateUI();
+ }
+ }
+ // Update all townspeople
+ for (var i = townspeople.length - 1; i >= 0; i--) {
+ var person = townspeople[i];
+ // Remove greeted people after a while
+ if (person.greeted) {
+ person.alpha -= 0.01;
+ if (person.alpha <= 0) {
+ person.destroy();
+ townspeople.splice(i, 1);
+ continue;
+ }
+ }
+ }
+};
+function gameOver() {
+ gameActive = false;
+ // Set final score
+ LK.setScore(score);
+ // Show game over
+ LK.showGameOver();
+}
+// Initialize the game
+initGame();
\ No newline at end of file