User prompt
Tüm şehirlerin toplam asker sayısı 30 ile 60 arasında rastgeledir
User prompt
Please fix the bug: 'TypeError: self.setSoldierCount is not a function' in or related to this line: 'self.setSoldierCount(0);' Line Number: 570
User prompt
Şehir görselerri değiştiğinde asker sayaçları sıfırlanır ve nokta geldikçe artmaya devam eder
User prompt
Karakterimizin noktaları şehirlere ulaştığındaki sistem ile düşmanımızın noktalarının sistemi aynıdır
User prompt
Karakterimizin noktaları şehirlere ulaştığındaki sistem ile düşmanımızın noktalarının sistemi aynıdır
User prompt
Düşmanımızın noktaları şehirdeki asker sayısından az ise şehirdeki toplam asker sayısından nokta sayısı çıkarıtılır çok ise şehir düşmanımızın görseline dönüşür
User prompt
Karakterimizin noktaları dokunduğu şehirdekinden fazlaysa rastgele meme görseli oluşur şehirde
User prompt
Şehirdeki asker sayısı sıfır olursa gelen nokta sayısı kadar artar ve şehrin ortasında asker sayısı gözükür
User prompt
Düşamanımız rastgele şehirlere noktalarını gönderir
User prompt
Düşmanımızın en yakınındaki şehir düşmanımızın görseline dönüştüyse en yakın 2.şehre saldırır
User prompt
Düşmanımızın feth ettiği şehir kadar toplam asker sayısı her saniye artar
User prompt
Feth edilen şehirlerin ortasına şehirdeki toplam asker sayısını yaz
User prompt
Feth edilen şehirlere asker sayacı oluştur
User prompt
Şehirdeki toplam asker sayısı feth edilten sonrada gözükür
User prompt
Düşmanımız en yakın şehri feth ettikten sonra en yakın diğer şehirlere geçer
User prompt
Düşmanımızın hareket ettiği şehrin asker sayısı sıfır olursa şehir görseli düşman görseline dönüşür
User prompt
Please fix the bug: 'ReferenceError: cityGraphic is not defined' in or related to this line: 'cityGraphic.tint = 0x888888; // Default gray color for uncaptured cities' Line Number: 81
User prompt
Düşmanımızın noktaları en yakın olan şehre hareket eder
User prompt
Please fix the bug: 'ReferenceError: enemy is not defined' in or related to this line: 'if (LK.ticks % 300 === 0 && game.cities && game.cities.length > 0 && enemy && enemy.soldiers > 0) {' Line Number: 854
User prompt
Düşmanımız rastgele bir şehre saldırır
User prompt
Şehirlerin asker sayısı saldırılana kadar gözükmez
User prompt
Kahramanımız şehri feth ettiğinde şehrin görseli rastgele bir meme olur
User prompt
Noktalar şehirler hariç bir noktaya dokunulursa hareket etmez
User prompt
Noktalar şehir görselini algılayınca aktif olur
User prompt
Please fix the bug: 'ReferenceError: soldiersSent is not defined' in or related to this line: 'self.setSoldierCount(self.soldiers - soldiersSent);' Line Number: 134
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1"); /**** * Classes ****/ var City = Container.expand(function () { var self = Container.call(this); // Create city graphics using shape var cityGraphic = self.attachAsset('hero', { anchorX: 0.5, anchorY: 0.5 }); // Default city properties self.name = ""; self.captured = false; self.soldiers = 0; // Track soldier count // Change city color cityGraphic.tint = 0x888888; // Default gray color for uncaptured cities // Add city name text var cityNameText = new Text2("", { size: 40, fill: 0xFFFFFF }); cityNameText.anchor.set(0.5, 0.5); cityNameText.y = 80; self.addChild(cityNameText); // Add soldier count text var soldierCountText = new Text2("0", { size: 60, fill: 0xFFFFFF }); soldierCountText.anchor.set(0.5, 0.5); soldierCountText.y = -80; // Position above the city self.addChild(soldierCountText); // Update city with name self.setName = function (name) { self.name = name; cityNameText.setText(name); }; // Set soldier count self.setSoldierCount = function (count) { self.soldiers = count; // Only show soldier count if the city has been attacked if (self.captured || self.soldiers < 10) { soldierCountText.setText(count.toString()); } else { soldierCountText.setText("?"); } }; // Capture city function self.capture = function () { if (!self.captured) { self.captured = true; cityGraphic.tint = 0x00FF00; // Change to green when captured // Increase soldier count when captured var bonusSoldiers = 20 + Math.floor(Math.random() * 31); // Add 20-50 soldiers self.setSoldierCount(self.soldiers + bonusSoldiers); // Animation effect when captured tween(cityGraphic, { scaleX: 1.2, scaleY: 1.2 }, { duration: 200, onFinish: function onFinish() { tween(cityGraphic, { scaleX: 1, scaleY: 1 }, { duration: 200 }); } }); } else { // If city is already captured, reduce soldier count by the number of soldiers that were sent // Note: The soldiers that were sent is the value that was used in moveSoldiersTo // This is already being tracked and reduced in the Hero.moveSoldiersTo method var soldiersSent = 1; // Default to 1 if not specified self.setSoldierCount(self.soldiers - soldiersSent); // If soldiers reach zero, change the city graphic to a random meme if (self.soldiers <= 0) { // Remove current city graphic self.removeChild(cityGraphic); // Generate a random meme index between 1 and 41 var randomMemeIndex = Math.floor(Math.random() * 41) + 1; // Add random meme as city graphic var memeAssetName = 'meme' + randomMemeIndex; cityGraphic = LK.getAsset(memeAssetName, { anchorX: 0.5, anchorY: 0.5 }); cityGraphic.scale.set(0.75); self.addChild(cityGraphic); // Reset soldier count to minimum self.setSoldierCount(10); } } }; // Make city interactive self.down = function () { // When city is clicked, don't capture it automatically // We'll only capture cities when soldiers reach them }; return self; }); var Hero = Container.expand(function () { var self = Container.call(this); // Default hero asset (will be replaced with selected meme) var heroGraphic = self.attachAsset('hero', { anchorX: 0.5, anchorY: 0.5 }); // Add soldier count text to the right side of hero var soldierCountText = new Text2("0", { size: 60, fill: 0xFFFFFF }); soldierCountText.anchor.set(0, 0.5); soldierCountText.x = 300; // Position to the right of the hero soldierCountText.y = 0; // Center vertically with the hero self.addChild(soldierCountText); // Container for soldier dots var soldierDotsContainer = new Container(); self.addChild(soldierDotsContainer); // Track soldier count self.soldiers = 0; // Set soldier count function self.setSoldierCount = function (count) { self.soldiers = count; soldierCountText.setText(count.toString()); // Clear existing soldier dots soldierDotsContainer.removeChildren(); // Create new soldier dots based on count var dotSize = 20; var dotSpacing = 10; var startX = 450; // Position dots to the right of the soldier count text var dotsPerRow = 40; // Maximum dots per row var rowSpacing = 30; // Spacing between rows for (var i = 0; i < self.soldiers; i++) { var dot = LK.getAsset('bullet', { // Using 'bullet' asset as a small dot width: dotSize, height: dotSize, anchorX: 0.5, anchorY: 0.5 }); dot.tint = 0x1fb6f2; // Match hero color var row = Math.floor(i / dotsPerRow); var col = i % dotsPerRow; dot.x = startX + (dotSize + dotSpacing) * col; dot.y = rowSpacing * row; soldierDotsContainer.addChild(dot); } }; // Initialize with 10 soldiers self.setSoldierCount(10); // Method to move soldier dots to clicked position self.moveSoldiersTo = function (targetX, targetY) { // Ensure we have soldiers to move if (self.soldiers <= 0 || soldierDotsContainer.children.length === 0) return; // Get all the dots var dots = soldierDotsContainer.children; // Count how many soldiers we're sending (all of them) var soldiersSent = dots.length; // For each dot, animate movement to the target position for (var i = 0; i < dots.length; i++) { var dot = dots[i]; // Store original position relative to the game var startPos = game.toLocal(soldierDotsContainer.toGlobal({ x: dot.x, y: dot.y })); // Calculate duration based on distance (further = longer animation) var dx = targetX - startPos.x; var dy = targetY - startPos.y; var distance = Math.sqrt(dx * dx + dy * dy); var duration = distance * 2; // 2ms per pixel // Add a small random delay for each dot so they don't all move at once var delay = Math.random() * 200; // Create the tween animation LK.setTimeout(function (dot, targetX, targetY, duration) { // Get current position in game coordinates var currentPos = game.toLocal(soldierDotsContainer.toGlobal({ x: dot.x, y: dot.y })); // Create a temporary dot at the same position in the game's coordinate space var tempDot = LK.getAsset('bullet', { width: dot.width, height: dot.height, anchorX: 0.5, anchorY: 0.5 }); tempDot.tint = dot.tint; tempDot.x = currentPos.x; tempDot.y = currentPos.y; // Add temp dot to game game.addChild(tempDot); // Hide the original dot dot.alpha = 0; // Animate the temporary dot to the target position tween(tempDot, { x: targetX, y: targetY }, { duration: duration, easing: tween.easeInOut, onFinish: function onFinish() { // Remove the temporary dot when animation completes tempDot.parent.removeChild(tempDot); // Check if the dot reached a city if (game.cities) { for (var j = 0; j < game.cities.length; j++) { var city = game.cities[j]; if (Math.abs(city.x - targetX) < 100 && Math.abs(city.y - targetY) < 100) { // Reached a city, capture it city.capture(); // Reduce city soldier count by hero soldier count that was sent // This is handled inside the city.capture() method now break; } } } // Show the original dot again dot.alpha = 1; } }); }.bind(null, dot, targetX, targetY, duration), delay); } // Reduce the hero's soldier count by the number of soldiers sent self.setSoldierCount(self.soldiers - soldiersSent); }; // Method to update hero with selected meme self.updateWithMeme = function (memeIndex) { // Remove current graphic self.removeChild(heroGraphic); // Add new meme image based on index var memeAssetName = 'meme' + (memeIndex % 41 + 1); heroGraphic = LK.getAsset(memeAssetName, { anchorX: 0.5, anchorY: 0.5 }); // Scale to appropriate size heroGraphic.scale.set(0.75); self.addChild(heroGraphic); }; return self; }); var MemeResultCard = Container.expand(function () { var self = Container.call(this); // Initially hidden self.visible = false; var card = self.attachAsset('memeCard', { anchorX: 0.5, anchorY: 0.5 }); // Meme image placeholder var memeImage = null; // Meme title var titleText = new Text2("Your Spirit Meme", { size: 80, fill: 0x333333 }); titleText.anchor.set(0.5, 0); titleText.y = -500; self.addChild(titleText); // Meme name var memeNameText = new Text2("", { size: 60, fill: 0xFF5722 }); memeNameText.anchor.set(0.5, 0); memeNameText.y = -400; self.addChild(memeNameText); // Description var descriptionText = new Text2("", { size: 40, fill: 0x555555 }); descriptionText.anchor.set(0.5, 0); descriptionText.y = -280; descriptionText.wordWrap = true; descriptionText.wordWrapWidth = 1400; self.addChild(descriptionText); // Close button var closeButton = new Text2("START GAME", { size: 100, fill: 0x3498DB }); closeButton.anchor.set(0.5, 0.5); closeButton.y = 550; closeButton.interactive = true; self.addChild(closeButton); closeButton.down = function () { tween(closeButton, { scaleX: 0.9, scaleY: 0.9 }, { duration: 100 }); }; closeButton.up = function () { tween(closeButton, { scaleX: 1, scaleY: 1 }, { duration: 100, onFinish: function onFinish() { self.hide(); if (self.onClose) { self.onClose(); // Remove all game elements except hero game.removeChild(wheel); game.removeChild(pointer); game.removeChild(spinButton); game.removeChild(gameTitle); game.removeChild(subtitle); game.removeChild(background); game.removeChild(resultCard); // Create cities array in game scope if (!game.cities) { game.cities = []; // City names var cityNames = ["Istanbul", "Ankara", "Izmir", "Bursa", "Antalya", "Konya"]; // Create 6 cities and position them around the screen for (var i = 0; i < 6; i++) { var city = new City(); city.setName(cityNames[i]); // Set initial soldier count to exactly 10 for all cities city.setSoldierCount(10); // Position cities in a grid (2 rows, 3 columns) var row = Math.floor(i / 3); var col = i % 3; city.x = 400 + col * 700; // Move Istanbul, Ankara and Izmir 80 units lower on Y axis if (i < 3) { // First 3 cities are Istanbul, Ankara, Izmir city.y = 880 + row * 900; // Added 80 to original y position } else { city.y = 960 + row * 900; // Added 160 to original y position for Bursa, Antalya, Konya } // Add city to game and store in array game.addChild(city); game.cities.push(city); } } // Position hero in top left corner of the screen hero.x = 290; // Updated to be 190 units to the right of previous position hero.y = 280; // Updated to be 180 units below the original position // Ensure hero is added to the scene if (!hero.parent) { game.addChild(hero); } // Add enemy to the bottom right corner of the screen var enemy = LK.getAsset('enemy', { anchorX: 0.5, anchorY: 0.5 }); enemy.x = 2048 - 250; // Right side of screen with some margin enemy.y = 2732 - 250; // Bottom of screen with some margin game.addChild(enemy); // Add soldier count text to the left of the enemy var enemySoldierCountText = new Text2("0", { size: 60, fill: 0xFFFFFF }); // Container for soldier dots var enemySoldierDotsContainer = new Container(); // Position the container relative to the enemy enemySoldierDotsContainer.x = -enemy.width / 2; enemySoldierDotsContainer.y = 0; // Add the container to the enemy enemy.addChild(enemySoldierDotsContainer); enemySoldierCountText.anchor.set(1, 0.5); enemySoldierCountText.x = enemy.x - 300; // Position to the left of the enemy enemySoldierCountText.y = enemy.y; // Center vertically with the enemy enemySoldierCountText.setText("50"); // Set initial enemy soldier count to 10 game.addChild(enemySoldierCountText); // Initialize with 50 soldiers enemy.soldiers = 50; // Add soldiers property to enemy object enemy.setSoldierCount = function (count) { enemy.soldiers = count; enemySoldierCountText.setText(count.toString()); // Clear existing soldier dots enemySoldierDotsContainer.removeChildren(); // Create new soldier dots based on count var dotSize = 20; // Same size as hero soldier dots var dotSpacing = 5; var dotsPerRow = 36; var rowSpacing = 5; var startX = -enemy.width / 2 - 120; // Start 120 units to the left of the enemy graphic var startY = -(Math.ceil(count / dotsPerRow) * (dotSize + rowSpacing)) / 2; // Center vertically for (var i = 0; i < enemy.soldiers; i++) { var dot = LK.getAsset('bullet', { // Using 'bullet' asset as a small dot width: dotSize, height: dotSize, anchorX: 0.5, anchorY: 0.5 }); dot.tint = 0xff0000; // Match enemy color var row = Math.floor(i / dotsPerRow); var col = i % dotsPerRow; dot.x = startX - (dotSize + dotSpacing) * col; // Position to the left dot.y = startY + (dotSize + rowSpacing) * row; enemySoldierDotsContainer.addChild(dot); } }; enemy.setSoldierCount(enemy.soldiers); // Render initial dots enemy.addChild(enemySoldierDotsContainer); } } }); }; self.showResult = function (memeName, index) { memeNameText.setText(""); // Remove meme name text descriptionText.setText(""); // Remove description text // Remove previous meme image if exists if (memeImage) { self.removeChild(memeImage); memeImage = null; } // Add new meme image based on index var memeAssetName = 'meme' + (index % 41 + 1); memeImage = LK.getAsset(memeAssetName, { anchorX: 0.5, anchorY: 0.5 }); memeImage.y = 100; self.addChild(memeImage); self.visible = true; // Animate card appearance card.scaleX = 0.1; card.scaleY = 0.1; card.alpha = 0; tween(card, { scaleX: 1, scaleY: 1, alpha: 1 }, { duration: 500, easing: tween.elasticOut }); }; self.hide = function () { tween(card, { scaleX: 0.1, scaleY: 0.1, alpha: 0 }, { duration: 300, onFinish: function onFinish() { self.visible = false; } }); }; function getMemeDescription(memeName, index) { var descriptions = ["You're observant and always noticing new opportunities, even when you should be focusing on what's right in front of you. You appreciate the complexity of choices and aren't afraid to show interest in something new and exciting.", "You're expressive and dramatic, never afraid to show your emotions. When you're upset, everyone knows it. You're also great at standing your ground even when faced with confusion or chaos.", "You have clear preferences and aren't afraid to express what you like and dislike. You make decisions confidently and know exactly what works for you. You're also not afraid to pass on trends that don't match your vibe.", "Your mind works in fascinating ways, and you love exploring ideas to their fullest extent. You can take simple concepts and develop them into complex philosophies. You appreciate intellectual growth and deep thinking.", "You're contemplative and always considering new perspectives. You challenge conventional wisdom and aren't afraid to question assumptions. Your thoughtful nature makes you excellent at solving problems.", "You're authentic in your reactions and wear your emotions on your sleeve. When something surprises you, everyone knows it. You bring honesty and genuine reactions to every situation.", "Much wow! Such personality! You're quirky, fun-loving, and don't take yourself too seriously. You approach life with curiosity and enthusiasm, finding joy in simple pleasures.", "You remain calm even when everything around you is falling apart. Your ability to accept challenging situations with a sense of humor makes you resilient. You're the steady presence others look to during chaos.", "You celebrate victories, both big and small. Your positive attitude helps you recognize achievements and builds confidence. You inspire others with your enthusiasm for life's successes.", "You embrace your awkwardness and aren't afraid to be yourself, even in uncomfortable situations. Your authenticity makes you relatable, and you find humor in life's awkward moments.", "You're innovative and think outside the box. Your creative approach to problems leads to unique solutions that others might not see.", "You're resilient and adaptive, thriving even in challenging situations. Your ability to find humor in difficulties makes you unstoppable.", "You're bold and unafraid to make a statement. When you enter a room, people notice, and your confidence is contagious to those around you.", "You're witty and quick with comebacks. Your sense of humor brightens people's days and helps diffuse tense situations.", "You're thoughtful and considerate, always putting others before yourself. Your empathy makes you an excellent friend and confidant.", "You're spontaneous and embrace life's unexpected moments. Your ability to go with the flow makes adventures more exciting.", "You're ambitious and persistent, never giving up on your goals even when faced with obstacles. Your determination inspires others.", "You're perceptive and notice details others miss. Your attention to the little things makes you excellent at understanding complex situations.", "You're balanced and maintain perspective even in chaotic times. Your ability to stay centered makes you a reliable presence.", "You're enthusiastic and approach life with infectious energy. Your passion ignites excitement in those around you.", "You have a keen eye for value and opportunities. Always finding ways to maximize gains with minimal effort - a natural entrepreneur!", "You're adaptable and practical, making the best of any situation with a quirky sense of humor. You navigate life with creative resourcefulness.", "You have a mischievous streak and enjoy creating a bit of chaos. Your adventurous spirit makes life exciting for everyone around you.", "You're contemplative and introspective, often lost in thought about life's deeper meanings. Your philosophical nature brings wisdom to conversations.", "You're expressive and communicate volumes without saying a word. Your authenticity resonates with people on a deeper level.", "You attract misfortune with surprising regularity, but face it with remarkable resilience and humor. Your ability to bounce back inspires others.", "You're steadfast in your opinions and enjoy intellectual debates. Your logical thinking and articulate expression make you persuasive in arguments.", "You maintain a slightly pessimistic outlook as a defense mechanism. Your sarcastic humor and straightforward nature are refreshing to those who know you.", "You possess a clever wit and enjoy a bit of harmless teasing. Your ability to find humor in everyday situations makes you delightful company.", "You're worldly and experienced, with fascinating stories to share. Your confidence and charm draw people to you naturally.", "You're intensely passionate about the people and things you care about. Your enthusiasm, while sometimes overwhelming, comes from a place of genuine love.", "You're sensitive to minor inconveniences and aren't afraid to express your frustrations. Your honesty about life's smaller struggles is relatable to everyone.", "You're efficient and value your time highly. You cut through unnecessary complications to get straight to what's important.", "You're optimistic and believe in possibilities. Your enthusiasm for new ventures inspires confidence in others.", "You celebrate life's victories with genuine joy. Your positive attitude and confidence help you overcome obstacles with grace.", "You question everything and aren't afraid to challenge conventional thinking. Your skeptical nature leads to deeper insights and understanding.", "You're perceptive about patterns and connections others miss. Your mind works in fascinating, sometimes paranoid ways that lead to unique insights.", "You're passionate about your interests and willing to invest in what you love. Your enthusiasm is contagious and inspires others to pursue their passions.", "You have a playful sense of humor that catches people off guard. Your ability to bring joy through unexpected means makes you unforgettable.", "You're practical and straightforward. You appreciate clear communication and have little patience for unnecessary complications.", "You're charming with a mischievous streak. Your ability to deliver uncomfortable truths with a smile makes difficult conversations easier."]; return descriptions[index % descriptions.length]; } return self; }); var SpinButton = Container.expand(function () { var self = Container.call(this); var buttonGraphic = self.attachAsset('spinButton', { anchorX: 0.5, anchorY: 0.5 }); var label = new Text2("SPIN", { size: 60, fill: 0xFFFFFF }); label.anchor.set(0.5, 0.5); self.addChild(label); self.down = function (x, y, obj) { tween(buttonGraphic, { scaleX: 0.9, scaleY: 0.9 }, { duration: 100 }); }; self.up = function (x, y, obj) { tween(buttonGraphic, { scaleX: 1, scaleY: 1 }, { duration: 100, onFinish: function onFinish() { if (self.onSpin) { self.onSpin(); } } }); }; return self; }); var SpinWheel = Container.expand(function () { var self = Container.call(this); // Wheel background var wheelBase = self.attachAsset('wheel', { anchorX: 0.5, anchorY: 0.5 }); // Define meme categories var memeCategories = ["Distracted Boyfriend", "Woman Yelling at Cat", "Drake Hotline Bling", "Expanding Brain", "Think About It", "Surprised Pikachu", "Doge", "This is Fine", "Success Kid", "Awkward Penguin", "Galaxy Brain", "Disaster Girl", "Hide the Pain Harold", "Confused Math Lady", "One Does Not Simply", "Evil Kermit", "SpongeBob Meme", "Crying Jordan", "Confused Nick Young", "Roll Safe", "Stonks", "Bernie Mittens", "Disaster Girl", "Sad Keanu", "Pepe the Frog", "Bad Luck Brian", "Change My Mind", "Grumpy Cat", "Condescending Wonka", "The Most Interesting Man", "Overly Attached Girlfriend", "First World Problems", "Ain't Nobody Got Time", "Doge to the Moon", "Success Baby", "Futurama Fry", "Conspiracy Keanu", "Shut Up and Take My Money", "Rick Roll", "That Would Be Great", "Willy Wonka"]; // Create wheel sections for (var i = 0; i < memeCategories.length; i++) { var section = new WheelSection(i, memeCategories.length, memeCategories[i]); self.addChild(section); } // Track wheel state self.isSpinning = false; self.currentRotation = 0; self.targetRotation = 0; self.spinSpeed = 0; self.deceleration = 0; self.memeSections = memeCategories; self.spin = function () { if (self.isSpinning) return; // Play spin sound LK.getSound('spinSound').play(); self.isSpinning = true; self.spinSpeed = 0.2 + Math.random() * 0.1; // Random starting speed // Determine how many rotations (5-10) plus a random section var rotations = 5 + Math.floor(Math.random() * 5); var randomSection = Math.floor(Math.random() * 41); // Updated to include all 41 memes var sectionAngle = 2 * Math.PI / memeCategories.length; // Calculate target rotation: current + full rotations + position to the random section self.targetRotation = self.currentRotation + rotations * 2 * Math.PI + randomSection * sectionAngle; // Calculate deceleration rate to gradually stop at the target var totalAngleToTravel = self.targetRotation - self.currentRotation; self.deceleration = self.spinSpeed * self.spinSpeed / (2 * totalAngleToTravel); }; self.update = function () { if (self.isSpinning) { // Apply current speed self.currentRotation += self.spinSpeed; self.rotation = self.currentRotation; // Play wheel sound while spinning if (!self.wheelSoundPlaying) { LK.getSound('Wheel').play(); self.wheelSoundPlaying = true; } // Decelerate if (self.currentRotation < self.targetRotation) { self.spinSpeed -= self.deceleration; // Don't let speed go negative if (self.spinSpeed <= 0.001) { self.spinSpeed = 0.001; } } else { // We've reached or passed the target self.isSpinning = false; self.wheelSoundPlaying = false; self.currentRotation = self.targetRotation; self.rotation = self.currentRotation; // Calculate which section is at the top (pointer position) self.onSpinComplete(); } } else { // Stop wheel sound when not spinning if (self.wheelSoundPlaying) { LK.getSound('Wheel').stop(); self.wheelSoundPlaying = false; } } }; self.onSpinComplete = function () { // Calculate which section is at the pointer (top) var pointingAngle = (-self.rotation % (2 * Math.PI) + 2 * Math.PI) % (2 * Math.PI); var sectionAngle = 2 * Math.PI / memeCategories.length; var sectionIndex = Math.floor(pointingAngle / sectionAngle); sectionIndex = (memeCategories.length - sectionIndex) % memeCategories.length; // Report the result if (self.onResult) { self.onResult(memeCategories[sectionIndex], sectionIndex); } // Play result sound LK.getSound('resultSound').play(); }; return self; }); var WheelSection = Container.expand(function (sectionIndex, totalSections, text) { var self = Container.call(this); var radius = 650; var angle = sectionIndex / totalSections * Math.PI * 2; var nextAngle = (sectionIndex + 1) / totalSections * Math.PI * 2; // Create a custom shape for the section using LK.getAsset var sectionShape = { width: radius * 2, height: radius * 2, color: getColorForSection(sectionIndex), shape: 'section_' + sectionIndex }; var section = LK.getAsset('section_' + sectionIndex, { anchorX: 0.5, anchorY: 0.5 }); // Position it correctly self.addChild(section); // No text labels on wheel sections function getColorForSection(index) { // A few vibrant colors that work well together var colors = [0xFF5757, // Red 0x47B8FF, // Blue 0xFFD557, // Yellow 0x7DFF57, // Green 0xFF57F7, // Pink 0x57FFBD, // Teal 0xFF8A57, // Orange 0xA757FF, // Purple 0x57FFFF, // Cyan 0xBCFF57, // Lime 0xFF9966, // Coral 0x66FF99, // Light Green 0x9966FF, // Lavender 0xFF66FF, // Magenta 0x66FFFF, // Light Blue 0xFFFF66, // Light Yellow 0x996633, // Brown 0x3399FF, // Sky Blue 0xFF3399, // Rose 0x33FF99 // Seafoam ]; return colors[index % colors.length]; } return self; }); /**** * Initialize Game ****/ // Initialize shapes for all wheel sections var game = new LK.Game({ backgroundColor: 0x2c3e50 }); /**** * Game Code ****/ // Set up game elements // Initialize shapes for all wheel sections for (var i = 0; i < 41; i++) { var radius = 650; var angle = i / 41 * Math.PI * 2; var nextAngle = (i + 1) / 41 * Math.PI * 2; // Define section shape } // Add background image var background = LK.getAsset('background', { anchorX: 0.5, anchorY: 0.5 }); background.x = 2048 / 2; background.y = 2732 / 2; game.addChild(background); var wheel = new SpinWheel(); game.addChild(wheel); wheel.x = 2048 / 2; wheel.y = 2732 / 2 - 200; // Add pointer var pointer = LK.getAsset('pointer', { anchorX: 0.5, anchorY: 0 }); game.addChild(pointer); pointer.x = wheel.x; pointer.y = wheel.y - wheel.height / 2 - 20 + 230; // Moved 230 units down (150+80) pointer.rotation = Math.PI; // Point downward // Add spin button var spinButton = new SpinButton(); game.addChild(spinButton); spinButton.x = wheel.x; spinButton.y = wheel.y + wheel.height / 2 + 200; // Add result card (initially hidden) var resultCard = new MemeResultCard(); game.addChild(resultCard); resultCard.x = wheel.x; resultCard.y = wheel.y; // Title var gameTitle = new Text2("Spin to Meme", { size: 120, fill: 0x000000 }); gameTitle.anchor.set(0.5, 0.5); gameTitle.x = wheel.x; gameTitle.y = 280; // Moved 80 units down from original position game.addChild(gameTitle); // Subtitle var subtitle = new Text2("Discover Your Spirit Meme", { size: 60, fill: 0x000000 }); subtitle.anchor.set(0.5, 0.5); subtitle.x = wheel.x; subtitle.y = 380; // Moved 80 units down from original position game.addChild(subtitle); // Create hero but don't add to scene initially var hero = new Hero(); hero.x = wheel.x + 700; // Position to the right side of the wheel hero.y = wheel.y; // hero will be added to scene only after START GAME button is clicked // Game state var isGameActive = true; // Connect components spinButton.onSpin = function () { if (isGameActive && !wheel.isSpinning && !resultCard.visible) { wheel.spin(); } }; wheel.onResult = function (meme, index) { LK.setTimeout(function () { // Update hero with selected meme hero.updateWithMeme(index); // Show result card resultCard.showResult(meme, index); }, 500); }; resultCard.onClose = function () { isGameActive = true; }; // Add timer to increase hero soldier count every second var lastSoldierIncreaseTime = Date.now(); // Add down event handler to game for moving soldiers game.down = function (x, y, obj) { // Only handle if we're in gameplay mode (wheel is gone) and hero exists if (hero && hero.parent && !wheel.parent && game.cities) { var clickedOnCity = false; var targetCity = null; // Check if the click location is near any city center for (var i = 0; i < game.cities.length; i++) { var city = game.cities[i]; var dx = x - city.x; var dy = y - city.y; var distanceSq = dx * dx + dy * dy; // Use a squared click radius for efficiency (e.g., 150px radius) var clickRadiusSq = 150 * 150; if (distanceSq < clickRadiusSq) { clickedOnCity = true; targetCity = city; // Store the target city break; // Found a city, no need to check others } } // Only move soldiers if a city was clicked if (clickedOnCity && targetCity) { // Move hero's soldier dots toward the clicked city's center // Pass the actual city coordinates to ensure accuracy hero.moveSoldiersTo(targetCity.x, targetCity.y); } } }; // Game update loop game.update = function () { if (wheel) { wheel.update(); } // If hero exists and game is in gameplay mode (not in wheel screen) if (hero && hero.parent && !wheel.parent) { // Check if a second has passed var currentTime = Date.now(); if (currentTime - lastSoldierIncreaseTime >= 1000) { // Increase soldier count by 1 hero.setSoldierCount(hero.soldiers + 1); // Update last increase time lastSoldierIncreaseTime = currentTime; } // Enemy random attack logic // Only execute every ~5 seconds (300 frames at 60fps) if (LK.ticks % 300 === 0 && game.cities && game.cities.length > 0 && enemy && enemy.soldiers > 0) { // Select a random city to attack var randomCityIndex = Math.floor(Math.random() * game.cities.length); var targetCity = game.cities[randomCityIndex]; // Number of soldiers to send (10-25% of current soldiers) var soldiersToSend = Math.max(1, Math.floor(enemy.soldiers * (0.1 + Math.random() * 0.15))); // Don't send more soldiers than the enemy has soldiersToSend = Math.min(soldiersToSend, enemy.soldiers); // Create animation of soldier dots moving to the city for (var i = 0; i < soldiersToSend; i++) { // Create a temporary dot var tempDot = LK.getAsset('enemyDot', { width: 20, height: 20, anchorX: 0.5, anchorY: 0.5 }); tempDot.tint = 0xff0000; // Red color for enemy tempDot.x = enemy.x; tempDot.y = enemy.y; game.addChild(tempDot); // Calculate duration based on distance var dx = targetCity.x - enemy.x; var dy = targetCity.y - enemy.y; var distance = Math.sqrt(dx * dx + dy * dy); var duration = distance * 1.5; // 1.5ms per pixel // Add random delay for each dot var delay = Math.random() * 300; // Animate dot to target city LK.setTimeout(function (dot, cityX, cityY, duration) { tween(dot, { x: cityX, y: cityY }, { duration: duration, easing: tween.easeInOut, onFinish: function onFinish() { // Remove dot when animation completes dot.parent.removeChild(dot); // Reduce city soldier count when all dots arrive if (targetCity.soldiers > 0) { targetCity.setSoldierCount(Math.max(0, targetCity.soldiers - 1)); } } }); }.bind(null, tempDot, targetCity.x, targetCity.y, duration), delay); } // Reduce enemy soldier count enemy.setSoldierCount(enemy.soldiers - soldiersToSend); } } }; // Start background music LK.playMusic('bgMusic');
===================================================================
--- original.js
+++ change.js
@@ -786,8 +786,60 @@
hero.setSoldierCount(hero.soldiers + 1);
// Update last increase time
lastSoldierIncreaseTime = currentTime;
}
+ // Enemy random attack logic
+ // Only execute every ~5 seconds (300 frames at 60fps)
+ if (LK.ticks % 300 === 0 && game.cities && game.cities.length > 0 && enemy && enemy.soldiers > 0) {
+ // Select a random city to attack
+ var randomCityIndex = Math.floor(Math.random() * game.cities.length);
+ var targetCity = game.cities[randomCityIndex];
+ // Number of soldiers to send (10-25% of current soldiers)
+ var soldiersToSend = Math.max(1, Math.floor(enemy.soldiers * (0.1 + Math.random() * 0.15)));
+ // Don't send more soldiers than the enemy has
+ soldiersToSend = Math.min(soldiersToSend, enemy.soldiers);
+ // Create animation of soldier dots moving to the city
+ for (var i = 0; i < soldiersToSend; i++) {
+ // Create a temporary dot
+ var tempDot = LK.getAsset('enemyDot', {
+ width: 20,
+ height: 20,
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ tempDot.tint = 0xff0000; // Red color for enemy
+ tempDot.x = enemy.x;
+ tempDot.y = enemy.y;
+ game.addChild(tempDot);
+ // Calculate duration based on distance
+ var dx = targetCity.x - enemy.x;
+ var dy = targetCity.y - enemy.y;
+ var distance = Math.sqrt(dx * dx + dy * dy);
+ var duration = distance * 1.5; // 1.5ms per pixel
+ // Add random delay for each dot
+ var delay = Math.random() * 300;
+ // Animate dot to target city
+ LK.setTimeout(function (dot, cityX, cityY, duration) {
+ tween(dot, {
+ x: cityX,
+ y: cityY
+ }, {
+ duration: duration,
+ easing: tween.easeInOut,
+ onFinish: function onFinish() {
+ // Remove dot when animation completes
+ dot.parent.removeChild(dot);
+ // Reduce city soldier count when all dots arrive
+ if (targetCity.soldiers > 0) {
+ targetCity.setSoldierCount(Math.max(0, targetCity.soldiers - 1));
+ }
+ }
+ });
+ }.bind(null, tempDot, targetCity.x, targetCity.y, duration), delay);
+ }
+ // Reduce enemy soldier count
+ enemy.setSoldierCount(enemy.soldiers - soldiersToSend);
+ }
}
};
// Start background music
LK.playMusic('bgMusic');
\ No newline at end of file