User prompt
rename randomEasing
Code edit (3 edits merged)
Please save this source code
User prompt
update corners so the logo stays with screen boundaries
User prompt
fix x: isLogoIn ? -logo.width : 1024, y: isLogoIn ? -logo.height : 1366 to stay in screen boundaries
Code edit (1 edits merged)
Please save this source code
User prompt
in ` tween(logo, { x: isLogoIn ? logo.width / 2 : 1024, y: isLogoIn ? logo.height / 2 : 1366 } ` use a random corner
User prompt
in ` tween(logo, { x: isLogoIn ? logo.width / 2 : 1024, y: isLogoIn ? logo.height / 2 : 1366 } ` use a random corner instead of logo.width / 2, logo.height / 2
User prompt
in corners change 50 offset to 20
Code edit (2 edits merged)
Please save this source code
User prompt
Please fix the bug: 'TypeError: corner is undefined' in or related to this line: 'corner.x = logo.x;' Line Number: 78
Code edit (7 edits merged)
Please save this source code
User prompt
Ok. clean the code
User prompt
restore the first logo entrance code : ``` tween(logo, { x: 1024, y: 1366 }, { duration: 2000, easing: tween.elasticIn, onFinish: function onFinish() { isMoving = false; // Set the flag to false when the logo stops moving logoIn = true; } }); ```
Code edit (3 edits merged)
Please save this source code
Code edit (1 edits merged)
Please save this source code
===================================================================
--- original.js
+++ change.js
@@ -5,1387 +5,104 @@
/****
* Classes
****/
-var Tile = Container.expand(function () {
+// Logo class
+var Logo = Container.expand(function () {
var self = Container.call(this);
- // Properties
- self.type = 'empty';
- self.baseTint = 0x8FBE00;
- self.baseTintLight = 0x5ED000;
- self.maxWaterSize = 260;
- self.flowSpeed = 12;
- self.startFlowTicks = 0;
- self.flow = false;
- self.connections = [];
- self.position = {
- x: 0,
- y: 0
- };
- self.rotation = 0;
- // Methods
- self.setType = function (type, x, y) {
- self.type = type;
- var baseTileAsset = type == 'start' || type == 'end' || puzzleManager && puzzleManager.levelConfigs && puzzleManager.levelConfigs[puzzleManager.currentLevel] && puzzleManager.levelConfigs[puzzleManager.currentLevel].fixedTiles && puzzleManager.levelConfigs[puzzleManager.currentLevel].fixedTiles.includes(x + ',' + y) ? 'baseTile' : 'baseMobileTile';
- if (type == 'empty') {
- return;
- }
- // Attach baseTile asset
- self.baseTile = self.attachAsset(baseTileAsset, {
- anchorX: 0.5,
- anchorY: 0.5,
- width: tileSize,
- height: tileSize,
- tint: 0xFFFFFF
- });
- self.width = tileSize;
- self.height = tileSize;
- switch (type) {
- case 'start':
- self.attachAsset('startPipeAsset', {
- anchorX: 0.5,
- anchorY: 0.5,
- x: 20,
- y: 40,
- tint: self.baseTint
- });
- self.valve = self.attachAsset('vane', {
- anchorX: 0.5,
- anchorY: 0.5,
- x: 20,
- y: -8,
- tint: self.baseTint
- });
- self.water = self.attachAsset('waterV', {
- anchorX: 0.5,
- anchorY: 0,
- x: -0,
- y: -120,
- height: 0,
- visible: false,
- dir: ''
- });
- break;
- case 'end':
- self.attachAsset('endPipeAsset', {
- anchorX: 0.5,
- anchorY: 0.5,
- x: 0,
- y: 55,
- tint: self.baseTint
- });
- self.water = self.attachAsset('waterV', {
- anchorX: 0.5,
- anchorY: 0,
- x: -0,
- y: -120,
- height: 0,
- visible: false,
- dir: ''
- });
- self.fountain = self.attachAsset('fontain', {
- anchorX: 0.5,
- anchorY: 0.5,
- x: 0,
- y: 0,
- width: 0,
- height: 0,
- visible: false
- });
- break;
- case 'crossPipe':
- self.attachAsset('straightPipeHAsset', {
- anchorX: 0.5,
- anchorY: 0.5,
- y: -40,
- tint: self.baseTint
- });
- self.attachAsset('straightPipeHAsset', {
- anchorX: 0.5,
- anchorY: 0.5,
- scaleY: -1,
- y: 30,
- tint: self.baseTint
- });
- self.attachAsset('straightPipeVAsset', {
- anchorX: 0.5,
- anchorY: 0.5,
- x: -30,
- tint: self.baseTint
- });
- self.attachAsset('straightPipeVAsset', {
- anchorX: 0.5,
- anchorY: 0.5,
- scaleX: -1,
- x: 30,
- tint: self.baseTint
- });
- self.water = self.attachAsset('waterV', {
- anchorX: 0.5,
- anchorY: 0,
- x: -0,
- y: -120,
- height: 0,
- visible: false,
- dir: ''
- });
- break;
- case 'straightPipeH':
- self.attachAsset('straightPipeHAsset', {
- anchorX: 0.5,
- anchorY: 0.5,
- y: -40,
- tint: self.baseTint
- });
- self.attachAsset('straightPipeHAsset', {
- anchorX: 0.5,
- anchorY: 0.5,
- scaleY: -1,
- y: 30,
- tint: self.baseTint
- });
- self.water = self.attachAsset('waterH', {
- anchorX: 0,
- anchorY: 0.5,
- x: -130,
- y: -5,
- width: 0,
- visible: false,
- dir: 'lr'
- });
- break;
- case 'straightPipeV':
- self.attachAsset('straightPipeVAsset', {
- anchorX: 0.5,
- anchorY: 0.5,
- x: -30,
- tint: self.baseTint
- });
- self.attachAsset('straightPipeVAsset', {
- anchorX: 0.5,
- anchorY: 0.5,
- scaleX: -1,
- x: 30,
- tint: self.baseTint
- });
- self.water = self.attachAsset('waterV', {
- anchorX: 0.5,
- anchorY: 0,
- x: -0,
- y: -120,
- height: 0,
- visible: false,
- dir: 'tb'
- });
- break;
- case 'cornerPipe':
- self.attachAsset('cornerPipeAsset', {
- anchorX: 0.5,
- anchorY: 0.5,
- x: -60,
- y: -60,
- tint: self.baseTintLight
- });
- // Corner part of the water
- self.waterCorner = self.attachAsset('waterCorner', {
- anchorX: 1,
- anchorY: 1,
- width: 108,
- height: 108,
- x: -65,
- y: -65,
- rotation: -Math.PI / 2,
- //-Math.PI / 2, at start to -Math.PI,
- visible: false,
- dir: ''
- });
- // Vertical part of the water
- self.waterV = self.attachAsset('waterV', {
- anchorX: 0.5,
- anchorY: 0,
- width: 110,
- x: -120,
- y: -5,
- rotation: -Math.PI / 2,
- height: 0,
- visible: false,
- dir: ''
- });
- // Horizontal part of the water
- self.waterH = self.attachAsset('waterH', {
- anchorX: 0,
- anchorY: 0.5,
- x: -5,
- y: -50,
- //-15,
- width: 0,
- height: 112,
- rotation: -Math.PI / 2,
- visible: false,
- dir: ''
- });
- // Corner part of the water
- self.waterCornerCover = self.attachAsset('waterCorner', {
- anchorX: 1,
- anchorY: 1,
- width: 108,
- height: 108,
- x: -65,
- y: -65,
- rotation: -Math.PI,
- visible: false,
- dir: ''
- });
- self.attachAsset('cornerPipeSection', {
- anchorX: 0.5,
- anchorY: 0.5,
- width: 148,
- height: 148,
- x: -0,
- y: -0,
- tint: self.baseTintLight
- });
- self.attachAsset('pipeRing', {
- anchorX: 0.5,
- anchorY: 0.5,
- width: 144,
- height: 30,
- x: 0,
- y: -80,
- rotation: Math.PI * 0,
- tint: self.baseTintLight
- });
- self.attachAsset('pipeRing', {
- anchorX: 0.5,
- anchorY: 0.5,
- width: 144,
- height: 30,
- x: -80,
- y: -5,
- rotation: Math.PI * 0.5,
- tint: self.baseTintLight
- });
- // self.attachAsset('pipeRing', {
- // anchorX: 0.5,
- // anchorY: 0.5,
- // width: 150,
- // height: 40,
- // x: -30,
- // y: -30,
- // rotation: Math.PI * 0.25,
- // tint: self.baseTintLight
- // });
- break;
- }
- };
- self.updatePosition = function (x, y) {
- self.position.x = x;
- self.position.y = y;
- if (self.baseTile) {
- self.baseTile.width = tileSize;
- self.baseTile.height = tileSize;
- }
- self.x = x * tileSize + gridBoard.x - gridBoard.width / 2 + tileSize / 2 + boardOffsetX;
- self.y = y * tileSize + gridBoard.y - gridBoard.height / 2 + tileSize / 2 + boardOffsetY;
- log('Tile index:', x, y, 'Tile position:', self.x, self.y, 'Tile dimensions:', self.width, self.height, ' self:', self);
- };
- self.normalizeRotation = function (rotation) {
- // If rotation is a number (radians), convert it to our direction system
- if (typeof rotation === 'number') {
- // Convert radians to our direction system
- // 0 = right
- // π/2 = down
- // π = left
- // 3π/2 = up
- var angle = rotation % (2 * Math.PI);
- if (angle < 0) {
- angle += 2 * Math.PI;
- }
- if (angle < Math.PI / 4 || angle > 7 * Math.PI / 4) {
- return 'right';
- }
- if (angle < 3 * Math.PI / 4) {
- return 'down';
- }
- if (angle < 5 * Math.PI / 4) {
- return 'left';
- }
- return 'up';
- }
- return rotation || 'down';
- };
- self.setRotation = function (direction) {
- switch (direction) {
- case 'left':
- self.rotation = Math.PI * 0.5;
- break;
- case 'right':
- self.rotation = -Math.PI * 0.5;
- break;
- case 'up':
- self.rotation = 0;
- break;
- case 'down':
- self.rotation = Math.PI;
- break;
- }
- log('Tile position:', self.x, self.y, 'Tile rotation:', self.rotation);
- };
- self.update = function () {
- if (self.flow) {
- if (!self.startFlowTicks) {
- self.startFlowTicks = LK.ticks;
- if (self.water) {
- self.water.visible = true;
- }
- if (self.waterV) {
- self.waterV.visible = true;
- }
- if (self.waterH) {
- self.waterH.visible = true;
- }
- }
- if (self.type === 'start') {
- // Rotate valve for start pipe
- var rotationValue = (LK.ticks - self.startFlowTicks) * 0.1;
- if (self.valve) {
- self.valve.rotation = rotationValue;
- }
- if (rotationValue >= Math.PI * 3) {
- self.flow = false;
- }
- } else if (self.type === 'cornerPipe') {
- // Corner pipe animation
- var progress = (LK.ticks - self.startFlowTicks) * self.flowSpeed; // Accelerate water speed
- var thirdSize = self.maxWaterSize / 3 - 10; // Split animation into three phases
- var sidesSize = self.maxWaterSize / 3; //+ 40;
- if (progress < self.maxWaterSize) {
- // Phase 1: Vertical water grows
- if (progress < thirdSize) {
- if (self.waterV) {
- self.waterV.height = progress;
- }
- }
- // Phase 2: Corner water appears and rotates
- else if (progress < thirdSize * 2) {
- if (self.waterV) {
- self.waterV.height = thirdSize; // Keep vertical at full first-phase height
- }
- if (self.waterCorner) {
- self.waterCorner.visible = true;
- self.waterCorner.alpha = Math.min(Math.max(0, ((progress - thirdSize) / thirdSize - 0.5) * 2, 0), 1); // Animate alpha from 0 to 1
- // Calculate rotation from -PI/2 to -PI
- var rotationProgress = (progress - thirdSize) / thirdSize; // 0 to 1
- self.waterCorner.rotation = -Math.PI / 2 - rotationProgress * Math.PI / 2;
- }
- }
- // Phase 3: Horizontal water grows
- else {
- if (self.waterV) {
- self.waterV.height = thirdSize;
- }
- if (self.waterCorner) {
- self.waterCorner.visible = true;
- self.waterCorner.alpha = 1;
- self.waterCorner.rotation = -Math.PI; // Keep at final rotation
- }
- if (self.waterH) {
- self.waterH.visible = true;
- self.waterH.width = Math.min(progress - thirdSize * 2, sidesSize);
- }
- }
- } else {
- self.flow = false;
- }
- } else if (self.type === 'end' && self.fountain) {
- // Animate fountain growth
- var sizeValue = (LK.ticks - self.startFlowTicks) * self.flowSpeed;
- if (sizeValue < self.maxWaterSize) {
- self.fountain.width = sizeValue;
- self.fountain.height = sizeValue;
- if (!self.fountain.visible) {
- self.fountain.visible = true;
- LK.getSound('fountain').play(); // Play fountain sound when it becomes visible
- }
- } else {
- self.flow = false;
- if (!waterDropInterval) {
- createWaterDrops(self.x, self.y, game);
- waterDropInterval = LK.setInterval(function () {
- createWaterDrops(self.x, self.y, game);
- }, 500 + Math.random() * 500);
- animateSoil();
- }
- }
- } else if (self.water) {
- // Regular pipe animation
- var heightValue = (LK.ticks - self.startFlowTicks) * self.flowSpeed;
- if (self.water.dir != '' && heightValue < self.maxWaterSize) {
- if (self.water.dir == 'tb') {
- self.water.height = heightValue;
- }
- if (self.water.dir == 'lr') {
- self.water.width = heightValue;
- }
- } else {
- self.flow = false;
- }
- }
- }
- if (self.type === 'end' && self.fountain && self.fountain.visible) {
- self.fountain.rotation += 0.1; // Rotate the fountain indefinitely
- var sizeVariation = 30 * Math.sin(LK.ticks * 0.1);
- self.fountain.width = 250 + sizeVariation;
- self.fountain.height = 250 + sizeVariation;
- }
- };
- self.setType(self.type);
- return self;
-});
-var WaterDrop = Container.expand(function () {
- var self = Container.call(this);
- var waterDropGraphics = self.attachAsset('waterDrop', {
+ var logoGraphics = self.attachAsset('logo', {
anchorX: 0.5,
anchorY: 0.5
});
- // Set initial tint to a random color
- var rainbowColors = [0xC7ECFE, 0xDDFDFF, 0xF4FFFF, 0xC8F8FF]; // Rainbow [0xFF0000, 0xFF7F00, 0xFFFF00, 0x00FF00, 0x0000FF, 0x4B0082, 0x8B00FF];
- waterDropGraphics.tint = rainbowColors[Math.floor(Math.random() * rainbowColors.length)];
- self.vx = 0;
- self.vy = 0;
- self.life = 0;
- self.size = 7;
- self.alpha = 0.75 + Math.random() * 0.25;
- self.update = function () {
- self.x += self.vx;
- self.y += self.vy;
- self.rotation = Math.atan2(self.vy, self.vx) + Math.PI * 0.55;
- // Animate size
- var sizeProgress = (120 - self.life) / 120; // Assuming life starts at 120
- waterDropGraphics.width = self.size + sizeProgress * self.size * 2;
- waterDropGraphics.height = self.size * 2 + sizeProgress * self.size * 4;
- self.life--;
- if (self.life <= 0) {
- self.visible = false;
- }
- };
- return self;
});
/****
* Initialize Game
****/
+//<Write entity 'classes' with empty functions for important behavior here>
var game = new LK.Game({
- backgroundColor: 0x000000
+ backgroundColor: 0x5D92B1 //Change background color to pastel dark blue
});
/****
* Game Code
****/
-function _slicedToArray(r, e) {
- return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest();
-}
-function _nonIterableRest() {
- throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
-}
-function _unsupportedIterableToArray(r, a) {
- if (r) {
- if ("string" == typeof r) {
- return _arrayLikeToArray(r, a);
- }
- var t = {}.toString.call(r).slice(8, -1);
- return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0;
- }
-}
-function _arrayLikeToArray(r, a) {
- (null == a || a > r.length) && (a = r.length);
- for (var e = 0, n = Array(a); e < a; e++) {
- n[e] = r[e];
- }
- return n;
-}
-function _iterableToArrayLimit(r, l) {
- var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"];
- if (null != t) {
- var e,
- n,
- i,
- u,
- a = [],
- f = !0,
- o = !1;
- try {
- if (i = (t = t.call(r)).next, 0 === l) {
- if (Object(t) !== t) {
- return;
- }
- f = !1;
- } else {
- for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0) {
- ;
- }
- }
- } catch (r) {
- o = !0, n = r;
- } finally {
- try {
- if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) {
- return;
- }
- } finally {
- if (o) {
- throw n;
- }
- }
- }
- return a;
- }
-}
-function _arrayWithHoles(r) {
- if (Array.isArray(r)) {
- return r;
- }
-}
-var SimpleSet = function SimpleSet() {
- this.items = {};
- this.has = function (item) {
- return this.items.hasOwnProperty(item);
- };
- this.add = function (item) {
- if (!this.has(item)) {
- this.items[item] = true;
- }
- };
+var logo = game.addChild(new Logo());
+logo.x = -logo.width;
+logo.y = -logo.height;
+var logoIn = false; // Track the state of the logo (in or out)
+var easingIndex = 0;
+var easingFunctionsIn = [tween.linear, tween.easeIn, tween.elasticIn, tween.bounceIn];
+var easingFunctionsInNames = ['linear', 'easeIn', 'elasticIn', 'bounceIn'];
+var easingFunctionsOut = [tween.linear, tween.easeOut, tween.elasticOut, tween.bounceOut];
+var easingFunctionsOutNames = ['linear', 'easeOut', 'elasticOut', 'bounceOut'];
+var corners = [{
+ x: logo.width / 2 + 20,
+ y: logo.height / 2 + 20
+},
+// Top left
+{
+ x: 2048 - logo.width / 2 - 20,
+ y: logo.height / 2 + 20
+},
+// Top right
+{
+ x: logo.width / 2 + 20,
+ y: 2732 - logo.height / 2 - 20
+},
+// Bottom left
+{
+ x: 2048 - logo.width / 2 - 20,
+ y: 2732 - logo.height / 2 - 20
+} // Bottom right
+];
+var isMoving = false; // Flag to check if the logo is moving
+game.down = function (x, y, obj) {
+ if (isMoving) {
+ return;
+ } // If the logo is moving, ignore the click
+ animateLogo(logoIn);
+ //easingText.setText(logoIn ? easingFunctionsInNames[easingIndex % easingFunctionsIn.length] : easingFunctionsOutNames[easingIndex % easingFunctionsOut.length]);
};
-var PuzzleManager = function PuzzleManager() {
- var self = this;
- // Properties
- self.currentLevel = 1;
- self.maxLevels = 30;
- self.grid = [];
- self.gridSize = 4;
- self.selectedTile = null;
- self.waterFlowing = false;
- self.isComplete = false;
- // Level configurations
- self.levelConfigs = {
- 1: {
- tiles: [['start', 'straightPipeV', 'straightPipeV', 'cornerPipe'], [null, null, null, 'straightPipeH'], [null, null, 'straightPipeH', null], [null, null, null, 'end']],
- rotations: {
- '0,3': 'left',
- '3,3': 'left'
- },
- fixedTiles: ['0,0', '0,1', '0,2', '0,3', '1,3', '3,3'] // All tiles fixed except 2,2
- },
- 2: {
- tiles: [['start', 'straightPipeV', null, 'end'], ['cornerPipe', 'cornerPipe', 'straightPipeH', null], [null, 'straightPipeV', null, null], [null, 'cornerPipe', 'straightPipeH', null]],
- rotations: {
- '0,1': 'down',
- '1,0': 'right',
- '1,1': 'left',
- '3,1': 'up'
- },
- fixedTiles: ['0,0', '0,3'] // Only start and end are fixed
- },
- 3: {
- tiles: [['start', null, 'cornerPipe', 'end'], ['straightPipeV', 'straightPipeH', 'cornerPipe', null], [null, 'cornerPipe', 'straightPipeV', 'straightPipeH'], ['cornerPipe', 'straightPipeH', null, null]],
- rotations: {
- '0,2': 'left',
- '1,2': 'down',
- '2,1': 'up',
- '3,0': 'right'
- },
- fixedTiles: ['0,0', '0,3'] // Only start and end are fixed
- },
- 4: {
- tiles: [['start', 'straightPipeV', 'cornerPipe', null], [null, null, 'straightPipeH', 'cornerPipe'], ['straightPipeH', 'cornerPipe', 'straightPipeV', 'end'], [null, 'straightPipeV', 'cornerPipe', null]],
- rotations: {
- '0,2': 'left',
- '1,3': 'down',
- '2,1': 'up',
- '2,2': 'right'
- },
- fixedTiles: ['0,0', '2,3'] // Only start and end are fixed
- },
- 5: {
- tiles: [['start', null, 'cornerPipe', 'straightPipeH'], ['straightPipeV', 'cornerPipe', 'straightPipeV', 'end'], ['cornerPipe', 'straightPipeH', 'cornerPipe', null], [null, null, 'straightPipeV', 'cornerPipe']],
- rotations: {
- '0,2': 'down',
- '1,1': 'right',
- '2,0': 'up',
- '2,2': 'left',
- '3,3': 'up'
- },
- fixedTiles: ['0,0', '1,3'] // Only start and end are fixed
- }
- // Add more levels here
- };
- self.initPuzzle = function () {
- log("Initializing puzzle for level", self.currentLevel);
- // Clear existing grid
- self.grid = [];
- // Get level config
- var config = self.levelConfigs[self.currentLevel];
- if (!config) {
- log("No configuration for level", self.currentLevel);
- return;
- }
- // Initialize grid
- for (var i = 0; i < self.gridSize; i++) {
- self.grid[i] = [];
- for (var j = 0; j < self.gridSize; j++) {
- var tile = new Tile();
- if (config.tiles[i] && config.tiles[i][j]) {
- tile.setType(config.tiles[i][j], i, j);
- }
- tile.updatePosition(i, j);
- self.grid[i][j] = tile;
- game.addChild(tile);
- }
- }
- // Apply rotations
- if (config.rotations) {
- for (var pos in config.rotations) {
- /*var _pos$split$map = pos.split(',').map(Number),
- _pos$split$map2 = _slicedToArray(_pos$split$map, 2),
- x = _pos$split$map2[0],
- y = _pos$split$map2[1];
- self.grid[x][y].setRotation(config.rotations[pos]);*/
- var _pos$split$map = pos.split(',').map(Number),
- x = _pos$split$map[0],
- y = _pos$split$map[1];
- self.grid[x][y].setRotation(config.rotations[pos]);
- }
- }
- };
- self.selectTile = function (x, y) {
- // Convert screen coordinates to grid coordinates
- if (!isPlaying) {
- return;
- }
- // Adjust coordinate calculation to use grid board position and size
- var boardX = gridBoard.x - gridBoard.width / 2;
- var boardY = gridBoard.y - gridBoard.height / 2;
- var gridX = Math.floor((x - boardX) / tileSize);
- var gridY = Math.floor((y - boardY) / tileSize);
- log("Grid coordinates:", gridX, gridY);
- // Check if coordinates are within grid
- if (gridX >= 0 && gridX < self.gridSize && gridY >= 0 && gridY < self.gridSize) {
- var tile = self.grid[gridX][gridY];
- var key = gridX + ',' + gridY;
- // Check if tile exists, is not empty, not start/end, and not fixed
- if (tile && tile.type !== 'empty' && tile.type !== 'start' && tile.type !== 'end' && (!self.levelConfigs[self.currentLevel].fixedTiles || !self.levelConfigs[self.currentLevel].fixedTiles.includes(key))) {
- self.selectedTile = {
- x: gridX,
- y: gridY,
- tile: tile
- };
- // Check possible moves
- self.checkPossibleMoves();
- }
- }
- };
- self.checkPossibleMoves = function () {
- if (!self.selectedTile) {
- return;
- }
- var x = self.selectedTile.x;
- var y = self.selectedTile.y;
- var possibleMoves = [];
- // Check each direction
- // Right
- if (x < self.gridSize - 1 && self.grid[x + 1][y].type === 'empty') {
- possibleMoves.push('right');
- }
- // Left
- if (x > 0 && self.grid[x - 1][y].type === 'empty') {
- possibleMoves.push('left');
- }
- // Down
- if (y < self.gridSize - 1 && self.grid[x][y + 1].type === 'empty') {
- possibleMoves.push('down');
- }
- // Up
- if (y > 0 && self.grid[x][y - 1].type === 'empty') {
- possibleMoves.push('up');
- }
- self.selectedTile.possibleMoves = possibleMoves;
- };
- self.moveTile = function (direction) {
- if (!isPlaying || !self.selectedTile || !self.selectedTile.possibleMoves.includes(direction)) {
- LK.getSound('tileBlocked').play(); // Play tileBlocked sound
- return;
- }
- var oldX = self.selectedTile.x;
- var oldY = self.selectedTile.y;
- var newX = oldX;
- var newY = oldY;
- // Calculate new position
- switch (direction) {
- case 'right':
- newX++;
- break;
- case 'left':
- newX--;
- break;
- case 'down':
- newY++;
- break;
- case 'up':
- newY--;
- break;
- }
- // Swap tiles
- var movingTile = self.grid[oldX][oldY];
- var emptyTile = self.grid[newX][newY];
- // Play tile slide sound
- LK.getSound('tileSlide').play();
- // Update grid
- self.grid[newX][newY] = movingTile;
- self.grid[oldX][oldY] = emptyTile;
- // Update positions
- movingTile.updatePosition(newX, newY);
- emptyTile.updatePosition(oldX, oldY);
- // Clear selection
- self.selectedTile = null;
- // Check if puzzle is solved
- if (self.checkWinCondition()) {
- self.isComplete = true;
- self.startWaterFlow();
- LK.getSound('levelWon').play(); // Play levelWon sound
- levelText.setText('Level: ' + self.currentLevel + ' Solved!');
- isPlaying = false;
- }
- };
- self.startWaterFlow = function () {
- if (self.waterFlowing) {
- return;
- }
- self.waterFlowing = true;
- // Find start position
- var startX = -1,
- startY = -1;
- for (var i = 0; i < self.gridSize; i++) {
- for (var j = 0; j < self.gridSize; j++) {
- if (self.grid[i][j].type === 'start') {
- startX = i;
- startY = j;
- break;
- }
- }
- if (startX !== -1) {
- break;
- }
- }
- // Start the flow animation from the start tile
- if (startX !== -1) {
- var startTile = self.grid[startX][startY];
- startTile.flow = true;
- startTile.startFlowTicks = 0;
- // Start valve animation
- if (startTile.valve) {
- startTile.valve.rotationSpeed = 0.1;
- }
- // Start flowing through pipes
- self.flowThroughPipe(startX, startY + 1, [startX + ',' + startY]);
- }
- };
- self.flowThroughPipe = function (x, y, visited) {
- log("Entering flowThroughPipe with position:", x, y, "Visited:", visited);
- if (x < 0 || x >= self.gridSize || y < 0 || y >= self.gridSize) {
- return;
- }
- var key = x + ',' + y;
- if (visited.includes(key)) {
- return;
- }
- visited.push(key);
- var tile = self.grid[x][y];
- log("Tile found at position:", x, y, "Type:", tile ? tile.type : "none");
- if (!tile || tile.type === 'empty') {
- return;
- }
- // Start flow animation for this tile
- tile.flow = true;
- if (tile.water) {
- tile.water.visible = true;
- }
- if (tile.waterV) {
- tile.waterV.visible = true;
- }
- if (tile.waterH) {
- tile.waterH.visible = true;
- }
- // Get next positions to flow to
- var nextPositions = [];
- switch (tile.type) {
- case 'straightPipeV':
- nextPositions.push([x, y - 1], [x, y + 1]); // Up and down
- break;
- case 'straightPipeH':
- nextPositions.push([x - 1, y], [x + 1, y]); // Left and right
- break;
- case 'cornerPipe':
- var normalizedRotation = tile.normalizeRotation(tile.rotation);
- log("Corner pipe with normalized rotation:", normalizedRotation);
- switch (normalizedRotation) {
- case 'up':
- // ┗
- log("Corner pipe up - checking up and right");
- nextPositions.push([x, y - 1], [x + 1, y]); // Up and right
- break;
- case 'right':
- // ┏
- log("Corner pipe right - checking right and down");
- nextPositions.push([x + 1, y], [x, y + 1]); // Right and down
- break;
- case 'down':
- // ┓
- log("Corner pipe down - checking up and right");
- nextPositions.push([x, y - 1], [x + 1, y]); // Up and right as per working version
- break;
- case 'left':
- // ┛
- log("Corner pipe left - checking left and up");
- nextPositions.push([x - 1, y], [x, y - 1]); // Left and up
- break;
- }
- break;
- case 'end':
- // Create water drops effect
- createWaterDrops(tile.x, tile.y + 100, game);
- break;
- }
- log("Next positions to flow to from", x, y, ":", nextPositions);
- // Wait for flow animation to complete before moving to next tiles
- LK.setTimeout(function () {
- for (var i = 0; i < nextPositions.length; i++) {
- self.flowThroughPipe(nextPositions[i][0], nextPositions[i][1], visited);
- }
- }, 300); // Wait 300ms before flowing to next tile
- };
- self.reset = function () {
- self.selectedTile = null;
- if (self.isComplete) {
- self.currentLevel++;
- } else {
- self.currentLevel = self.currentLevel || 1;
- }
- self.isComplete = false;
- self.waterFlowing = false;
- // Remove previous level tiles
- self.grid.forEach(function (row) {
- row.forEach(function (tile) {
- if (tile) {
- tile.destroy();
- }
- });
- });
- self.initPuzzle();
- };
- self.checkWinCondition = function () {
- // Find start position
- log("=== Starting Win Condition Check ===");
- log("Grid state:");
- for (var i = 0; i < self.gridSize; i++) {
- var row = [];
- for (var j = 0; j < self.gridSize; j++) {
- var tile = self.grid[i][j];
- row.push(tile ? "".concat(tile.type, "(").concat(tile.rotation, ")") : 'empty');
- }
- log("Row", i + ":", row.join(' | '));
- }
- var startX = -1,
- startY = -1;
- for (var i = 0; i < self.gridSize; i++) {
- for (var j = 0; j < self.gridSize; j++) {
- if (self.grid[i][j].type === 'start') {
- startX = i;
- startY = j;
- log("Start tile found at:", startX, startY);
- break;
- }
- }
- if (startX !== -1) {
- break;
- }
- }
- // Use array to track visited positions
- var visited = [];
- log("Starting path check from:", startX, startY + 1);
- // Start flowing down from start
- var result = self.canReachEnd(startX, startY + 1, visited);
- log("Path check complete. Result:", result);
- log("Visited positions:", visited);
- log("=== Win Condition Check Complete ===");
- return result;
- };
- self.canReachEnd = function (x, y, visited) {
- // Check bounds
- log("Checking position:", x, y);
- if (x < 0 || x >= self.gridSize || y < 0 || y >= self.gridSize) {
- log("Position out of bounds");
- return false;
- }
- // Create position key
- var key = x + ',' + y;
- if (visited.includes(key)) {
- log("Position already visited:", key);
- return false;
- }
- visited.push(key);
- var tile = self.grid[x][y];
- if (!tile || tile.type === 'empty') {
- log("No tile or empty tile at position:", x, y);
- return false;
- }
- // Get normalized rotation from tile
- var normalizedRotation = tile.normalizeRotation(tile.rotation);
- log("Checking tile:", tile.type, "with normalized rotation:", normalizedRotation, "at position:", x, y);
- // If we reached the end, success!
- if (tile.type === 'end') {
- log("Found end tile!");
- return true;
- }
- // Get next possible positions based on current tile type and rotation
- var nextPositions = [];
- switch (tile.type) {
- case 'straightPipeV':
- log("Straight vertical pipe - checking up and down");
- nextPositions.push([x, y - 1], [x, y + 1]); // Up and down
- break;
- case 'straightPipeH':
- log("Straight horizontal pipe - checking left and right");
- nextPositions.push([x - 1, y], [x + 1, y]); // Left and right
- break;
- case 'cornerPipe':
- log("Corner pipe with normalized rotation:", normalizedRotation);
- switch (normalizedRotation) {
- case 'up':
- // ┗
- log("Corner pipe up - checking up and right");
- nextPositions.push([x, y - 1], [x + 1, y]); // Up and right
- break;
- case 'right':
- // ┏
- log("Corner pipe right - checking right and down");
- nextPositions.push([x + 1, y], [x, y + 1]); // Right and down
- break;
- case 'down':
- // ┓
- log("Corner pipe down - checking up and right");
- nextPositions.push([x, y - 1], [x + 1, y]); // Up and right as per working version
- break;
- case 'left':
- // ┛
- log("Corner pipe left - checking left and up");
- nextPositions.push([x - 1, y], [x, y - 1]); // Left and up
- break;
- }
- break;
- case 'start':
- // Start tile connects downward
- log("Start tile - checking down connection");
- nextPositions.push([x, y + 1]);
- break;
- }
- log("Checking next positions:", nextPositions);
- // Try each possible next position
- for (var i = 0; i < nextPositions.length; i++) {
- var nextX = nextPositions[i][0];
- var nextY = nextPositions[i][1];
- log("Trying next position:", nextX, nextY);
- if (self.canReachEnd(nextX, nextY, visited)) {
- log("Found valid path through:", nextX, nextY);
- return true;
- }
- }
- log("No valid path found from:", x, y);
- return false;
- };
- return this;
-};
-/****
-* Game Variables
-****/
-var debug = true;
-function log() {
- if (debug) {
- console.log.apply(console, arguments);
+function animateLogo(isLogoIn) {
+ isMoving = true; // Set the flag to true when the logo starts moving
+ var corner;
+ if (isLogoIn) {
+ // If logo is in, animate it out
+ selectedEasing = easingFunctionsOut[easingIndex % easingFunctionsOut.length];
+ easingText.setText(easingFunctionsOutNames[easingIndex % easingFunctionsOut.length]);
+ // Randomly select a corner for the logo to appear
+ corner = corners[Math.floor(Math.random() * corners.length)];
+ } else {
+ // If logo is out, animate it in
+ selectedEasing = easingFunctionsIn[easingIndex % easingFunctionsIn.length];
+ easingText.setText(easingFunctionsInNames[easingIndex % easingFunctionsIn.length]);
+ corner = corners[Math.floor(Math.random() * corners.length)];
}
-}
-// Game constants
-var tileSize = 400;
-var boardOffsetX = 90;
-var boardOffsetY = 90;
-// Game state variables
-var GAME_STATE = {
- INIT: 'INIT',
- MENU: 'MENU',
- NEW_ROUND: 'NEW_ROUND',
- PLAYING: 'PLAYING',
- SCORE: 'SCORE'
-};
-var currentState = GAME_STATE.INIT;
-var isPlaying = true;
-var backgroundLayer;
-var middleLayer;
-var gridBoard;
-var gridBoardSoil;
-var growGrass;
-var isMouseDown = false;
-var startX = 0;
-var startY = 0;
-var selectedTile = null;
-var dragThreshold = 20;
-var levelText;
-var waterDrops = [];
-var waterDropInterval;
-var logo;
-var puzzleManager;
-/****
-* Helper Functions
-****/
-function createWaterDrops(x, y, game) {
- for (var i = 0; i < 30; i++) {
- var waterDrop = waterDrops.find(function (drop) {
- return !drop.visible;
- });
- if (!waterDrop) {
- waterDrop = new WaterDrop();
- waterDrops.push(waterDrop);
- game.addChild(waterDrop);
- }
- waterDrop.x = x;
- waterDrop.y = y;
- var angle = Math.random() * Math.PI * 2;
- var speed = Math.random() * 3 + 3;
- var easeFactor = Math.random() * 0.05 + 0.95; // Random easing factor between 0.95 and 1.0
- waterDrop.vx = Math.cos(angle) * speed * easeFactor;
- waterDrop.vy = Math.sin(angle) * speed * easeFactor;
- waterDrop.life = 250;
- waterDrop.visible = true;
- }
-}
-function animateSoil() {
- log("Animate soil...");
- gridBoardSoil.visible = true;
- gridBoardSoil.alpha = 0;
- var alphaIncrement = 0.05; // Adjust the increment for desired speed
- // Animate all baseTile tiles' alpha from 1 to 0
- puzzleManager.grid.forEach(function (row) {
- row.forEach(function (tile) {
- if (tile.baseTile) {
- tile.baseTile.alpha = 1;
- LK.setInterval(function () {
- if (tile.baseTile.alpha > 0) {
- tile.baseTile.alpha -= alphaIncrement;
- }
- }, 50);
- }
- });
- });
- var soilAnimation = LK.setInterval(function () {
- if (gridBoardSoil.alpha < 1) {
- gridBoardSoil.alpha += alphaIncrement;
- } else {
- LK.clearInterval(soilAnimation);
- growGrass.visible = true;
- // Animate growGrass alpha from 0 to 1
- var grassAnimation = LK.setInterval(function () {
- if (growGrass.alpha < 1) {
- growGrass.alpha += 0.05; // Adjust the increment for desired speed
- } else {
- LK.clearInterval(grassAnimation);
- LK.setTimeout(function () {
- cleanPlayingState();
- initNewRoundState();
- }, 2000);
- }
- }, 75); // Adjust the interval for desired speed
- }
- }, 50); // Adjust the interval for desired speed
-}
-/****
-* Game State Management
-****/
-function initializeGame() {
- // Init and Add backgroundLayer
- backgroundLayer = new Container();
- middleLayer = new Container();
- game.addChild(backgroundLayer);
- // Initialize grid board
- gridBoard = LK.getAsset('gridBoard', {
- anchorX: 0.5,
- anchorY: 0.5,
- visible: false
- });
- gridBoard.x = 2048 / 2;
- gridBoard.y = 2732 / 2;
- game.addChild(gridBoard);
- // Initialize grid board soil
- gridBoardSoil = LK.getAsset('gridBoardSoil', {
- anchorX: 0.5,
- anchorY: 0.5,
- visible: false,
- alpha: 0
- });
- gridBoardSoil.x = 2048 / 2 + 20;
- gridBoardSoil.y = 2732 / 2 - 20;
- game.addChild(gridBoardSoil);
- game.addChild(middleLayer);
- // Create growGrass asset
- growGrass = LK.getAsset('growGrass', {
- anchorX: 0.5,
- anchorY: 0.5,
- visible: false,
- alpha: 0
- });
- growGrass.x = 2048 / 2 + 20;
- growGrass.y = 2732 / 2;
- middleLayer.addChild(growGrass);
- // Initialize game assets and variables
- puzzleManager = new PuzzleManager();
- // Initialize level text
- levelText = new Text2("Level 1", {
- size: 100,
- fill: 0xFFFFFF
- });
- levelText.x = 2048 / 2;
- levelText.y = 200;
- levelText.anchorX = 0.5;
- levelText.visible = false;
- // Add the level text to the game
- game.addChild(levelText);
- // Transition to menu state
- changeGameState(GAME_STATE.MENU);
-}
-function initMenuState() {
- // Show level selection UI
- console.log("Entering Menu State");
- isPlaying = false;
- // Add backgroundPlaying1 to the menu state
- var backgroundPlaying1 = LK.getAsset('backgroundPlaying1', {
- anchorX: 0.5,
- anchorY: 0.5
- });
- backgroundPlaying1.x = 2048 / 2;
- backgroundPlaying1.y = 2732 / 2;
- backgroundLayer.addChild(backgroundPlaying1);
- // Add logo to the menu state
- logo = LK.getAsset('logo', {
- anchorX: 0.5,
- anchorY: 0.5,
- width: 1480,
- height: 1480
- });
- logo.x = 2048 / 2;
- logo.y = -logo.height; // Initialize logo out of screen
- middleLayer.addChild(logo);
- // Update any menu animations here
tween(logo, {
- x: 2048 / 2,
- // Center horizontally
- y: 2732 / 2 - 50 // Center vertically with offset
+ x: isLogoIn ? corner.x : 1024,
+ y: isLogoIn ? corner.y : 1366
}, {
- duration: 1000,
- easing: tween.bounceOut // Use predefined bounceOut easing function
- });
-}
-function handleMenuLoop() {}
-function cleanMenuState() {
- if (logo) {
- logo.visible = false;
- game.removeChild(logo);
- }
-}
-function initNewRoundState() {
- // Create and add backgroundPlaying1 to backgroundLayer
- var backgroundPlaying1 = LK.getAsset('backgroundPlaying1', {
- anchorX: 0.5,
- anchorY: 0.5
- });
- backgroundPlaying1.x = 2048 / 2;
- backgroundPlaying1.y = 2732 / 2;
- backgroundLayer.addChild(backgroundPlaying1);
- levelText.visible = true;
- levelText.text = "Level 1";
- // Reset puzzle manager for new round
- console.log("Entering New Round State");
- if (puzzleManager) {
- puzzleManager.reset();
- }
- // Show gridBoard
- gridBoard.visible = true;
- // After a short delay, transition to PLAYING state
- LK.setTimeout(function () {
- changeGameState(GAME_STATE.PLAYING);
- }, 1000);
-}
-function handleNewRoundLoop() {
- // Any pre-game animations can go here
-}
-function cleanNewRoundState() {
- // Clean up any new round state
-}
-function initPlayingState() {
- // Start the gameplay
- console.log("Entering Playing State");
- isPlaying = true;
-}
-function handlePlayingLoop() {
- // Update game logic
- if (puzzleManager) {
- puzzleManager.update();
- // Check if level is complete
- if (puzzleManager.isComplete) {
- changeGameState(GAME_STATE.SCORE);
- }
- }
-}
-function cleanPlayingState() {
- isPlaying = false;
- // Reset gridBoardSoil visibility and alpha
- if (gridBoardSoil) {
- gridBoardSoil.visible = false;
- gridBoardSoil.alpha = 0;
- }
- // Hide growGrass
- if (growGrass) {
- growGrass.visible = false;
- growGrass.alpha = 0;
- }
- // Stop waterdrops animations if any
- if (waterDropInterval) {
- LK.clearInterval(waterDropInterval);
- waterDropInterval = null;
- }
- // Remove remaining waterdrops if any
- for (var i = waterDrops.length - 1; i >= 0; i--) {
- if (waterDrops[i].visible) {
- waterDrops[i].destroy();
- waterDrops.splice(i, 1);
- }
- }
-}
-function initScoreState() {
- // Show score screen
- console.log("Entering Score State");
- levelText.visible = true;
- levelText.text = "Level Complete!\nTap to continue";
-}
-function handleScoreLoop() {
- // Update any score animations
- if (puzzleManager) {
- puzzleManager.update();
- }
-}
-function cleanScoreState() {
- levelText.visible = false;
-}
-function changeGameState(newState) {
- // Clean up current state
- console.log("Changing state from", currentState, "to", newState);
- switch (currentState) {
- case GAME_STATE.MENU:
- cleanMenuState();
- break;
- case GAME_STATE.NEW_ROUND:
- cleanNewRoundState();
- break;
- case GAME_STATE.PLAYING:
- cleanPlayingState();
- break;
- case GAME_STATE.SCORE:
- cleanScoreState();
- break;
- }
- // Initialize new state
- currentState = newState;
- switch (newState) {
- case GAME_STATE.MENU:
- initMenuState();
- break;
- case GAME_STATE.NEW_ROUND:
- initNewRoundState();
- break;
- case GAME_STATE.PLAYING:
- initPlayingState();
- break;
- case GAME_STATE.SCORE:
- initScoreState();
- break;
- }
-}
-/****
-* Event Handlers
-****/
-game.down = function (x, y, obj) {
- switch (currentState) {
- case GAME_STATE.MENU:
- changeGameState(GAME_STATE.NEW_ROUND);
- break;
- case GAME_STATE.PLAYING:
- startX = x;
- startY = y;
- isMouseDown = true;
- if (puzzleManager) {
- puzzleManager.selectTile(x, y);
+ duration: 2000,
+ easing: selectedEasing,
+ onFinish: function onFinish() {
+ isMoving = false; // Set the flag to false when the logo stops moving
+ if (isLogoIn) {
+ animateLogo(false);
+ } else {
+ easingIndex++;
}
- break;
- case GAME_STATE.SCORE:
- changeGameState(GAME_STATE.MENU);
- break;
- }
-};
-game.move = function (x, y, obj) {
- if (currentState !== GAME_STATE.PLAYING || !isMouseDown || !puzzleManager || !puzzleManager.selectedTile) {
- return;
- }
- var deltaX = x - startX;
- var deltaY = y - startY;
- // Only move if drag distance exceeds threshold
- if (Math.abs(deltaX) > dragThreshold || Math.abs(deltaY) > dragThreshold) {
- var direction = null;
- if (Math.abs(deltaX) > Math.abs(deltaY)) {
- direction = deltaX > 0 ? 'right' : 'left';
- } else {
- direction = deltaY > 0 ? 'down' : 'up';
}
- puzzleManager.moveTile(direction);
- isMouseDown = false; // Reset after move
- }
-};
-game.up = function (x, y, obj) {
- isMouseDown = false;
- if (currentState === GAME_STATE.PLAYING && puzzleManager) {
- puzzleManager.selectedTile = null;
- }
-};
-/****
-* Main Update Loop
-****/
-function update() {
- // Handle state-specific updates
- switch (currentState) {
- case GAME_STATE.MENU:
- handleMenuLoop();
- break;
- case GAME_STATE.NEW_ROUND:
- handleNewRoundLoop();
- break;
- case GAME_STATE.PLAYING:
- handlePlayingLoop();
- break;
- case GAME_STATE.SCORE:
- handleScoreLoop();
- break;
- }
- // Update water drops
- for (var i = waterDrops.length - 1; i >= 0; i--) {
- if (waterDrops[i].visible) {
- waterDrops[i].update();
- }
- }
+ });
+ logoIn = !isLogoIn;
}
-// Start the game
-initializeGame();
\ No newline at end of file
+// Add a text 'Easing' in bottom center
+var easingText = new Text2('Easing', {
+ size: 150,
+ fill: 0x0000FF
+});
+easingText.anchor.set(0.5, 1); // Sets anchor to the center of the bottom edge of the text.
+easingText.x = 1024; // Center of the game width
+easingText.y = 2632; // Bottom of the game height
+easingText.tint = 0xFF0000;
+game.addChild(easingText);
+animateLogo(true);
\ No newline at end of file