User prompt
Switch turn to computer aid opponent when player's stone stops moving
User prompt
If player pressed on the rightButton asset then the opponent is the computer
User prompt
AS THE STONE THROWN BY THE PLAYER STOPS, IT GIVES THE RIGHT TO STEP TO THE OPPONENT
User prompt
ENSURE THIS TASK: GAME RULES: PLAYER AND MACHINE-CONTROLLED OPPONENT TAKE ALTERNATE
User prompt
Then do these points to ensure these tasks
User prompt
Remove stoneLightBlue asset from the game logic but not from the asset list
User prompt
Please fix the bug: 'TypeError: stone is undefined' in or related to this line: 'return stone !== selectedStone && stone.canMove;' Line Number: 691
User prompt
Please fix the bug: 'TypeError: stone is undefined' in or related to this line: 'return stone !== selectedStone && stone.canMove;' Line Number: 691
User prompt
Please fix the bug: 'TypeError: stone is undefined' in or related to this line: 'return stone !== selectedStone && stone.canMove;' Line Number: 692
User prompt
Please fix the bug: 'TypeError: stone is undefined' in or related to this line: 'return stone !== selectedStone && stone.canMove;' Line Number: 691
User prompt
Remove stoneLightBlue asset from the game logic but not from the asset list
User prompt
Please fix the bug: 'stoneLightBlue is not defined' in or related to this line: 'var stones = [stone, stoneRed, stoneYellow, stoneGreen, stoneOrange, stonePink, stonePurple, stoneNeon, stoneLightBlue];' Line Number: 402
User prompt
Please fix the bug: 'stoneLightBlue is not defined' in or related to this line: 'var stones = [stone, stoneRed, stoneYellow, stoneGreen, stoneOrange, stonePink, stonePurple, stoneNeon, stoneLightBlue];' Line Number: 390
User prompt
Please fix the bug: 'stoneLightBlue is not defined' in or related to this line: 'var stones = [stone, stoneRed, stoneYellow, stoneGreen, stoneOrange, stonePink, stonePurple, stoneNeon, stoneLightBlue];' Line Number: 378
User prompt
Please fix the bug: 'stoneLightBlue is not defined' in or related to this line: 'var stones = [stone, stoneRed, stoneYellow, stoneGreen, stoneOrange, stonePink, stonePurple, stoneNeon, stoneLightBlue];' Line Number: 366
User prompt
Please fix the bug: 'TypeError: stone is undefined' in or related to this line: 'return stone !== selectedStone && stone.canMove;' Line Number: 729
User prompt
THEN ENSURE THIS TASK
User prompt
If the selected curling stone has already left the red line, i.e. is over it, the player cannot touch it again
User prompt
Please fix the bug: 'ReferenceError: anotherObject is not defined' in or related to this line: 'selectedStone.lastWasIntersecting = selectedStone.intersects(anotherObject);' Line Number: 711
User prompt
Please fix the bug: 'ReferenceError: VALUE is not defined' in or related to this line: 'if (self.lastX <= VALUE && self.x > VALUE) {' Line Number: 57
User prompt
do it
User prompt
The player can only touch the same stone once, and cannot hit it again while moving
User prompt
do it
User prompt
try other method to Prevent stone from being moved again after crossing up the red line
User prompt
One of the game rules of the match is that if the curling stone has left the red line - i.e. it has moved above it - the player cannot move it again
/**** * Classes ****/ // The assets will be automatically created and loaded by the LK engine // Create a class for the curling stone var CurlingStone = Container.expand(function () { var self = Container.call(this); var stoneGraphics = self.attachAsset('stoneBlue', { anchorX: 0.5, anchorY: 0.5 }); self.lastX = self.x + Math.cos(self.direction) * self.speed; // Update lastX before position change self.lastY = self.y + Math.sin(self.direction) * self.speed; // Update lastY before position change self.canMove = true; // Initialize canMove property to allow movement initially self.touched = false; // Track if the stone has been touched self.speed = 0; self.direction = 0; self.update = function () { self.x += Math.cos(self.direction) * self.speed; self.y += Math.sin(self.direction) * self.speed; // Check if the stone has crossed the red line if (self.lastY <= 2732 * 0.75 + 300 && self.y > 2732 * 0.75 + 300) { self.canMove = false; // Disable further movement } self.lastX = self.x; // Update lastX after position change // Define VALUE and VALUE2 for X and Y coordinate checks var VALUE = 1000; // Example value for X coordinate check var VALUE2 = 500; // Example value for Y coordinate check // Check if we reached the X position (VALUE) right now as we were not there before if (self.lastX <= VALUE && self.x > VALUE) { // Trigger action here } self.lastY = self.y; // Update lastY after position change // Check if we reached the X (VALUE2) and Y (VALUE) position right at this frame, and not the frame before if (self.lastY <= VALUE && self.y > VALUE && self.x <= VALUE2 && self.x > VALUE2) { // Trigger action here } // Check if we reached the Y position (VALUE) right at this frame now as we were not there before (last update tick) if (self.lastY <= VALUE && self.y > VALUE) { // Trigger action here } // Check for intersections with other stones stones.forEach(function (otherStone) { if (otherStone !== self && self.intersects(otherStone)) { // Calculate the angle of collision var angle = Math.atan2(self.y - otherStone.y, self.x - otherStone.x); // Calculate new direction for both stones var selfNewDirection = angle + Math.PI; var otherStoneNewDirection = angle; // Swap speeds for a simple elastic collision effect var tempSpeed = self.speed; self.speed = otherStone.speed; otherStone.speed = tempSpeed; // Set new directions self.direction = selfNewDirection; otherStone.direction = otherStoneNewDirection; } }); self.lastX = self.x; // Update lastX after position change self.lastY = self.y; // Update lastY after position change self.speed *= 0.99; // friction if (self.speed < 0.1) { self.speed = 0; } }; self["throw"] = function (speed, direction) { self.speed = speed; self.direction = direction; }; }); // Create a class for the game mode selection pop-up var GameModePopup = Container.expand(function () { var self = Container.call(this); // Create background for the pop-up // Removed the duplicated whiteCenter asset from the map // Create text for the pop-up var text = new Text2('Choose Game Mode', { size: 150, fill: 0x000000 }); text.anchor.set(0.5, 0.5); text.x = 2048 / 2; text.y = 2732 / 2; self.addChild(text); // Create text for choosing curling stone var chooseStoneText = new Text2('Choose Curling Stone', { size: 120, fill: 0x000000 }); chooseStoneText.anchor.set(0.5, 0.5); chooseStoneText.x = 2048 / 2; chooseStoneText.y = 2732 / 2 + 600; self.addChild(chooseStoneText); }); var GreenStone = Container.expand(function () { var self = Container.call(this); var stoneGraphics = self.attachAsset('stoneGreen', { anchorX: 0.5, anchorY: 0.5 }); self.lastX = self.x; // Initialize lastX for tracking previous X position self.lastY = self.y; // Initialize lastY for tracking previous Y position self.speed = 0; self.direction = 0; self.update = function () { self.x += Math.cos(self.direction) * self.speed; self.y += Math.sin(self.direction) * self.speed; self.lastX = self.x; // Update lastX after position change self.lastY = self.y; // Update lastY after position change self.speed *= 0.99; // friction if (self.speed < 0.1) { self.speed = 0; } }; self["throw"] = function (speed, direction) { self.speed = speed; self.direction = direction; }; }); var NeonStone = Container.expand(function () { var self = Container.call(this); var stoneGraphics = self.attachAsset('stoneNeon', { anchorX: 0.5, anchorY: 0.5 }); self.lastX = self.x; // Initialize lastX for tracking previous X position self.lastY = self.y; // Initialize lastY for tracking previous Y position self.speed = 0; self.direction = 0; self.update = function () { self.x += Math.cos(self.direction) * self.speed; self.y += Math.sin(self.direction) * self.speed; self.lastX = self.x; // Update lastX after position change self.lastY = self.y; // Update lastY after position change self.speed *= 0.99; // friction if (self.speed < 0.1) { self.speed = 0; } }; self["throw"] = function (speed, direction) { self.speed = speed; self.direction = direction; }; }); var OrangeStone = Container.expand(function () { var self = Container.call(this); var stoneGraphics = self.attachAsset('stoneOrange', { anchorX: 0.5, anchorY: 0.5 }); self.lastX = self.x; // Initialize lastX for tracking previous X position self.lastY = self.y; // Initialize lastY for tracking previous Y position self.speed = 0; self.direction = 0; self.update = function () { self.x += Math.cos(self.direction) * self.speed; self.y += Math.sin(self.direction) * self.speed; self.lastX = self.x; // Update lastX after position change self.lastY = self.y; // Update lastY after position change self.speed *= 0.99; // friction if (self.speed < 0.1) { self.speed = 0; } }; self["throw"] = function (speed, direction) { self.speed = speed; self.direction = direction; }; }); var PinkStone = Container.expand(function () { var self = Container.call(this); var stoneGraphics = self.attachAsset('stonePink', { anchorX: 0.5, anchorY: 0.5 }); self.lastX = self.x; // Initialize lastX for tracking previous X position self.lastY = self.y; // Initialize lastY for tracking previous Y position self.speed = 0; self.direction = 0; self.update = function () { self.x += Math.cos(self.direction) * self.speed; self.y += Math.sin(self.direction) * self.speed; self.lastX = self.x; // Update lastX after position change self.lastY = self.y; // Update lastY after position change self.speed *= 0.99; // friction if (self.speed < 0.1) { self.speed = 0; } }; self["throw"] = function (speed, direction) { self.speed = speed; self.direction = direction; }; }); var PurpleStone = Container.expand(function () { var self = Container.call(this); var stoneGraphics = self.attachAsset('stonePurple', { anchorX: 0.5, anchorY: 0.5 }); self.lastX = self.x; // Initialize lastX for tracking previous X position self.lastY = self.y; // Initialize lastY for tracking previous Y position self.speed = 0; self.direction = 0; self.update = function () { self.x += Math.cos(self.direction) * self.speed; self.y += Math.sin(self.direction) * self.speed; self.lastX = self.x; // Update lastX after position change self.lastY = self.y; // Update lastY after position change self.speed *= 0.99; // friction if (self.speed < 0.1) { self.speed = 0; } }; self["throw"] = function (speed, direction) { self.speed = speed; self.direction = direction; }; }); var RedStone = Container.expand(function () { var self = Container.call(this); var stoneGraphics = self.attachAsset('stoneRed', { anchorX: 0.5, anchorY: 0.5 }); self.lastX = self.x; // Initialize lastX for tracking previous X position self.lastY = self.y; // Initialize lastY for tracking previous Y position self.speed = 0; self.direction = 0; self.update = function () { self.x += Math.cos(self.direction) * self.speed; self.y += Math.sin(self.direction) * self.speed; self.lastX = self.x; // Update lastX after position change self.lastY = self.y; // Update lastY after position change self.speed *= 0.99; // friction if (self.speed < 0.1) { self.speed = 0; } }; self["throw"] = function (speed, direction) { self.speed = speed; self.direction = direction; }; }); var YellowStone = Container.expand(function () { var self = Container.call(this); var stoneGraphics = self.attachAsset('stoneYellow', { anchorX: 0.5, anchorY: 0.5 }); self.lastX = self.x; // Initialize lastX for tracking previous X position self.lastY = self.y; // Initialize lastY for tracking previous Y position self.speed = 0; self.direction = 0; self.update = function () { self.x += Math.cos(self.direction) * self.speed; self.y += Math.sin(self.direction) * self.speed; self.lastX = self.x; // Update lastX after position change self.lastY = self.y; // Update lastY after position change self.speed *= 0.99; // friction if (self.speed < 0.1) { self.speed = 0; } }; self["throw"] = function (speed, direction) { self.speed = speed; self.direction = direction; }; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0xFFFFFF // Init game with white background }); /**** * Game Code ****/ function isExactlyOneStoneBelowRedLine() { var stones = [stoneRed, stoneYellow, stoneGreen, stoneOrange, stonePink, stonePurple, stoneNeon]; // Initialize stones array without null stone var count = 0; stones.forEach(function (stone) { if (stone.y > 2732 * 0.75 + 300) { // Removed game over condition when stone intersects target if (!startButton) { // Check if startButton is null, indicating it has disappeared // Logic to start the match console.log("Match has started!"); } count++; } }); return count === 1; } // Initialize stones array to track all stones var stones = [stone, stoneRed, stoneYellow, stoneGreen, stoneOrange, stonePink, stonePurple, stoneNeon]; var anotherObject = whiteCenter; // Define anotherObject for intersection checks // Initialize startButton variable var startButton = null; // Function to check the visibility of the start button function checkStartButtonVisibility() { if (gameMode !== null && selectedStone !== null && selectedStone.y > 2732 * 0.75 + 300 && (selectAsset.visible || selectGreenAsset.visible)) { // Logic to display the start button startButton = LK.getAsset('startButton', { anchorX: 0.5, anchorY: 0.5, x: 2048 / 2, y: 2732 * 0.25 }); startButton.visible = true; startButton.interactive = true; startButton.on('down', startButtonClickHandler); game.addChild(startButton); } else { if (startButton) { startButton.visible = false; } } } // Initialize playerStartText variable var playerStartText = null; // Initialize game mode variable var gameMode = null; var selectedStone = null; // Track selected stone var currentTurn = 'player'; // Initialize turn tracker, starting with the player // Display the game mode selection pop-up var gameModePopup = new GameModePopup(); game.addChild(gameModePopup); // Add first game mode asset to the map var gameModeAsset1 = LK.getAsset('gameModeAsset', { anchorX: 0.5, anchorY: 0.5, x: 2048 / 2, y: 2732 / 2 }); game.addChild(gameModeAsset1); // Add second game mode asset to the map var gameModeAsset2 = LK.getAsset('gameModeAsset', { anchorX: 0.5, anchorY: 0.5, x: 2048 / 2, y: 2732 / 2 + 600 // Adjusted position for the second asset }); game.addChild(gameModeAsset2); // Add left button to the center of the map var leftButton = LK.getAsset('leftButton', { anchorX: 1.0, // Align right edge anchorY: 0.0, x: 2048 / 2, y: gameModeAsset1.y + gameModeAsset1.height / 2 }); game.addChild(leftButton); // Add playervsplayer asset to the map var playervsplayerAsset = LK.getAsset('playervsplayer', { anchorX: 0.5, anchorY: 0.5, x: leftButton.x - leftButton.width / 2, y: leftButton.y + leftButton.height / 2 }); game.addChild(playervsplayerAsset); // Add select asset to indicate selection var selectAsset = LK.getAsset('select', { anchorX: 0.5, anchorY: 0.5, x: leftButton.x - leftButton.width / 2, y: leftButton.y + leftButton.height / 2 }); selectAsset.visible = false; // Initially hidden game.addChild(selectAsset); // Add right button to the center of the map var rightButton = LK.getAsset('rightButton', { anchorX: 0.0, // Align left edge anchorY: 0.0, x: 2048 / 2, y: gameModeAsset1.y + gameModeAsset1.height / 2 }); game.addChild(rightButton); // Add selectgreen asset to the map var selectGreenAsset = LK.getAsset('selectgreen', { anchorX: 0.5, anchorY: 0.5, x: rightButton.x + rightButton.width / 2, y: rightButton.y + rightButton.height / 2 }); selectGreenAsset.visible = false; // Initially hidden game.addChild(selectGreenAsset); // Function to handle player vs ai mode selection function selectPlayerVsAIMode() { gameMode = 'playerVsAI'; selectGreenAsset.visible = !selectGreenAsset.visible; if (selectGreenAsset.visible) { selectAsset.visible = false; } selectGreenAsset.x = rightButton.x + rightButton.width / 2; selectGreenAsset.y = rightButton.y + rightButton.height / 2; checkStartButtonVisibility(); } // Function to handle player vs player mode selection function selectPlayerVsPlayerMode() { gameMode = 'playerVsPlayer'; selectAsset.visible = !selectAsset.visible; if (selectAsset.visible) { selectGreenAsset.visible = false; } selectAsset.x = leftButton.x - leftButton.width / 2; selectAsset.y = leftButton.y + leftButton.height / 2; checkStartButtonVisibility(); } // Add interaction to playervsplayerAsset playervsplayerAsset.interactive = true; playervsplayerAsset.on('down', selectPlayerVsPlayerMode); // Add playervsai asset to the map var playervsaiAsset = LK.getAsset('playervsai', { anchorX: 0.5, anchorY: 0.5, x: rightButton.x + rightButton.width / 2, y: rightButton.y + rightButton.height / 2 }); playervsaiAsset.interactive = true; playervsaiAsset.on('down', selectPlayerVsAIMode); game.addChild(playervsaiAsset); // Add center line to the game var centerLine = LK.getAsset('centerLine', { anchorX: 0.5, anchorY: 0.0, x: 2048 / 2, y: 0 }); // Add left lane to the game var leftLane = LK.getAsset('leftLane', { anchorX: 0.5, anchorY: 0.0, x: 50, y: 0 }); game.addChild(leftLane); // Add right lane to the game var rightLane = LK.getAsset('rightLane', { anchorX: 0.5, anchorY: 0.0, x: 2048 - 50, y: 0 }); game.addChild(rightLane); // Add red horizontal line to the lower quarter of the map var redLine = LK.getAsset('redLine', { anchorX: 0.5, anchorY: 0.5, x: 2048 / 2, y: 2732 * 0.75 + 300 }); // Add grey horizontal target line to the upper quadrant of the map var targetLine = LK.getAsset('targetLine', { anchorX: 0.5, anchorY: 0.5, x: 2048 / 2, y: 2732 * 0.25 }); var whiteRing = LK.getAsset('whiteRing', { anchorX: 0.5, anchorY: 0.5, x: 2048 / 2, y: 2732 * 0.25 }); var redRing = LK.getAsset('redRing', { anchorX: 0.5, anchorY: 0.5, x: 2048 / 2, y: 2732 * 0.25 }); var blueRing = LK.getAsset('blueRing', { anchorX: 0.5, anchorY: 0.5, x: 2048 / 2, y: 2732 * 0.25 }); game.addChild(blueRing); game.addChild(whiteRing); game.addChild(redRing); // Add whiteCenter to the center of the redRing var whiteCenter = LK.getAsset('whiteCenter', { anchorX: 0.5, anchorY: 0.5, x: redRing.x, y: redRing.y }); game.addChild(whiteCenter); game.addChild(centerLine); game.addChild(redLine); game.addChild(targetLine); var stoneSpacing = 200; var totalStones = 8; var startX = 2048 / 2 - stoneSpacing * (totalStones - 1) / 2; var stone = game.addChild(new CurlingStone()); stone.x = startX; stone.y = 2732 * 0.75 + 500 - 350; stone.interactive = true; stone.on('down', function () { if (selectedStone && selectedStone !== stone) { selectedStone.y = 2732 * 0.75 + 500 - 350; // Reset previous stone position } if (startButton && startButton.visible === false) { stone.y = stone.y === 2732 * 0.75 + 500 ? 2732 * 0.75 + 500 - 350 : 2732 * 0.75 + 500; } else { stone.y = stone.y === 2732 * 0.75 + 500 ? 2732 * 0.75 + 500 - 350 : 2732 * 0.75 + 500; // Allow movement above redline } selectedStone = stone; checkStartButtonVisibility(); }); stone.on('select', function () { // Logic for when stoneBlue is selected console.log("stoneBlue selected"); }); var stoneRed = game.addChild(new RedStone()); stoneRed.x = startX + stoneSpacing; stoneRed.y = 2732 * 0.75 + 500 - 350; stoneRed.interactive = true; stoneRed.on('down', function () { if (selectedStone && selectedStone !== stoneRed) { selectedStone.y = 2732 * 0.75 + 500 - 350; // Reset previous stone position } stoneRed.y = stoneRed.y === 2732 * 0.75 + 500 ? 2732 * 0.75 + 500 - 350 : 2732 * 0.75 + 500; selectedStone = stoneRed; checkStartButtonVisibility(); }); var stoneYellow = game.addChild(new YellowStone()); stoneYellow.x = startX + stoneSpacing * 2; stoneYellow.y = 2732 * 0.75 + 500 - 350; stoneYellow.interactive = true; stoneYellow.on('down', function () { if (selectedStone && selectedStone !== stoneYellow) { selectedStone.y = 2732 * 0.75 + 500 - 350; // Reset previous stone position } stoneYellow.y = stoneYellow.y === 2732 * 0.75 + 500 ? 2732 * 0.75 + 500 - 350 : 2732 * 0.75 + 500; selectedStone = stoneYellow; checkStartButtonVisibility(); }); var stoneGreen = game.addChild(new GreenStone()); stoneGreen.x = startX + stoneSpacing * 3; stoneGreen.y = 2732 * 0.75 + 500 - 350; stoneGreen.interactive = true; stoneGreen.on('down', function () { if (selectedStone && selectedStone !== stoneGreen) { selectedStone.y = 2732 * 0.75 + 500 - 350; // Reset previous stone position } stoneGreen.y = stoneGreen.y === 2732 * 0.75 + 500 ? 2732 * 0.75 + 500 - 350 : 2732 * 0.75 + 500; selectedStone = stoneGreen; checkStartButtonVisibility(); }); var stoneOrange = game.addChild(new OrangeStone()); stoneOrange.x = startX + stoneSpacing * 4; stoneOrange.y = 2732 * 0.75 + 500 - 350; stoneOrange.interactive = true; stoneOrange.on('down', function () { if (selectedStone && selectedStone !== stoneOrange) { selectedStone.y = 2732 * 0.75 + 500 - 350; // Reset previous stone position } stoneOrange.y = stoneOrange.y === 2732 * 0.75 + 500 ? 2732 * 0.75 + 500 - 350 : 2732 * 0.75 + 500; selectedStone = stoneOrange; checkStartButtonVisibility(); }); var stonePink = game.addChild(new PinkStone()); stonePink.x = startX + stoneSpacing * 5; stonePink.y = 2732 * 0.75 + 500 - 350; stonePink.interactive = true; stonePink.on('down', function () { if (selectedStone && selectedStone !== stonePink) { selectedStone.y = 2732 * 0.75 + 500 - 350; // Reset previous stone position } stonePink.y = stonePink.y === 2732 * 0.75 + 500 ? 2732 * 0.75 + 500 - 350 : 2732 * 0.75 + 500; selectedStone = stonePink; checkStartButtonVisibility(); }); var stonePurple = game.addChild(new PurpleStone()); stonePurple.x = startX + stoneSpacing * 6; stonePurple.y = 2732 * 0.75 + 500 - 350; stonePurple.interactive = true; stonePurple.on('down', function () { if (selectedStone && selectedStone !== stonePurple) { selectedStone.y = 2732 * 0.75 + 500 - 350; // Reset previous stone position } stonePurple.y = stonePurple.y === 2732 * 0.75 + 500 ? 2732 * 0.75 + 500 - 350 : 2732 * 0.75 + 500; selectedStone = stonePurple; checkStartButtonVisibility(); }); var stoneNeon = game.addChild(new NeonStone()); stoneNeon.x = startX + stoneSpacing * 7; stoneNeon.y = 2732 * 0.75 + 500 - 350; stoneNeon.interactive = true; stoneNeon.on('down', function () { if (selectedStone && selectedStone !== stoneNeon) { selectedStone.y = 2732 * 0.75 + 500 - 350; // Reset previous stone position } stoneNeon.y = stoneNeon.y === 2732 * 0.75 + 500 ? 2732 * 0.75 + 500 - 350 : 2732 * 0.75 + 500; selectedStone = stoneNeon; checkStartButtonVisibility(); }); // Initialize the game state var throwing = false; var throwStart = null; // Handle touch events game.down = function (x, y, obj) { if (selectedStone && currentTurn === 'player') { if (selectedStone.canMove && !selectedStone.touched && y > 2732 * 0.75 + 300 && y < 2732 && selectedStone.lastY <= 2732 * 0.75 + 300 && selectedStone.y <= 2732 * 0.75 + 300) { selectedStone.touched = true; // Mark the stone as touched selectedStone.lastX = selectedStone.x; // Update lastX before position change selectedStone.lastY = selectedStone.y; // Update lastY before position change selectedStone.x = x; selectedStone.y = y; selectedStone.interactive = false; // Disable interaction for dragging } throwing = true; } throwStart = { x: x, y: y }; }; game.up = function (x, y, obj) { if (throwing && selectedStone) { // Hide 'PLAYER START' text if it exists if (playerStartText) { playerStartText.visible = false; } var dx = x - throwStart.x; // Calculate the difference in x var dy = y - throwStart.y; // Calculate the difference in y var speed = Math.sqrt(dx * dx + dy * dy) / 50; // Adjust speed calculation for push var direction = Math.atan2(dy, dx); // Calculate direction selectedStone["throw"](speed, direction); // Apply throw with calculated speed and direction throwing = false; currentTurn = currentTurn === 'player' ? 'ai' : 'player'; // Toggle turn } }; // Update the game state game.update = function () { // Removed game over condition when stone intersects target if (selectedStone) { // I care about the exact frame when I intersect, so check I was not intersecting / colliding before if (selectedStone.lastWasIntersecting === false && selectedStone.intersects(anotherObject)) { // Trigger action here } selectedStone.lastWasIntersecting = selectedStone.intersects(anotherObject); selectedStone.update(); if (selectedStone.lastX !== selectedStone.x || selectedStone.lastY !== selectedStone.y) { selectedStone.lastX = selectedStone.x; // Update lastX before position change selectedStone.lastY = selectedStone.y; // Update lastY before position change } // Check if the stone has reached the target line if (selectedStone.lastY <= 2732 * 0.25 && selectedStone.y > 2732 * 0.25) { console.log("Stone reached the target line!"); // Additional logic for when the stone reaches the target line } } if (currentTurn === 'ai' && !throwing) { // AI logic to select a stone and push it var aiStone = stones.find(function (stone) { return stone !== selectedStone && stone.canMove; }); if (aiStone) { var aiSpeed = Math.random() * 5 + 1; // Random speed for AI var aiDirection = Math.PI / 2; // AI pushes straight up aiStone["throw"](aiSpeed, aiDirection); currentTurn = 'player'; // Switch back to player's turn } } }; function startButtonClickHandler() { // Move the selected stone to the center line bottom under the red line center if (selectedStone) { selectedStone.x = 2048 / 2; // Center horizontally selectedStone.y = 2732 * 0.75 + 400; // Position between the red line and the center bottom selectedStone.interactive = false; // Disable interaction for dragging } // AI selects a stone of a different color var stones = [stoneRed, stoneYellow, stoneGreen, stoneOrange, stonePink, stonePurple, stoneNeon]; var aiSelectedStone = null; do { aiSelectedStone = stones[Math.floor(Math.random() * stones.length)]; } while (aiSelectedStone === selectedStone); // Move AI selected stone to a different position if (aiSelectedStone) { aiSelectedStone.x = 2048 / 2 + 100; // Slightly offset from the player's stone aiSelectedStone.y = 2732 * 0.75 + 400; } // Hide non-selected stones var stones = [stone, stoneRed, stoneYellow, stoneGreen, stoneOrange, stonePink, stonePurple, stoneNeon]; stones.forEach(function (stone) { if (stone !== selectedStone) { stone.visible = false; } stone.interactive = false; // Disable interaction for all stones }); // Hide other specified assets gameModeAsset1.visible = false; gameModeAsset2.visible = false; leftButton.visible = false; playervsaiAsset.visible = false; playervsplayerAsset.visible = false; rightButton.visible = false; selectAsset.visible = false; selectGreenAsset.visible = false; if (startButton && startButton.visible) { // Add 'PLAYER START' text to the top center of the map var playerStartText = new Text2('PLAYER START', { size: 75, fill: 0x000000 }); playerStartText.anchor.set(0.5, 0.5); playerStartText.x = 2048 / 2 - 20; playerStartText.y = 75; // Position at the top center, moved up by 25 units game.addChild(playerStartText); startButton.destroy(); // Destroy the startButton to ensure it disappears completely startButton = null; // Set startButton to null to remove reference } // Remove texts from the map gameModePopup.visible = false; }
===================================================================
--- original.js
+++ change.js
@@ -675,9 +675,9 @@
selectedStone.y = 2732 * 0.75 + 400; // Position between the red line and the center bottom
selectedStone.interactive = false; // Disable interaction for dragging
}
// AI selects a stone of a different color
- var stones = [stone, stoneRed, stoneYellow, stoneGreen, stoneOrange, stonePink, stonePurple, stoneNeon];
+ var stones = [stoneRed, stoneYellow, stoneGreen, stoneOrange, stonePink, stonePurple, stoneNeon];
var aiSelectedStone = null;
do {
aiSelectedStone = stones[Math.floor(Math.random() * stones.length)];
} while (aiSelectedStone === selectedStone);
black curling stone with pink top, top view.
Black curlingstone with purple top, top view.
Black curlingstone with yellow top, top view.
Black curlingstone with orange top, top view.
black curlingstone with neongreen top, top view.
Black curlingstone with neonblue top, top view.
add a text to the center: "Player vs Player"
neongreen rectangle with rounded corners, transparent in the middle.
Red button with white start text.