Code edit (1 edits merged)
Please save this source code
User prompt
Please fix the bug: 'Cannot read properties of undefined (reading 'x')' in or related to this line: 'valueTextShadow.anchor.set(0.5, 0.5);' Line Number: 46
User prompt
Please fix the bug: 'Cannot read properties of undefined (reading 'x')' in or related to this line: 'valueTextShadow.x = tileGraphics.x;' Line Number: 38
Code edit (2 edits merged)
Please save this source code
User prompt
Please fix the bug: 'Cannot read properties of undefined (reading 'anchor')' in or related to this line: 'valueText.anchor.set(0.5, 0.5);' Line Number: 44
Code edit (2 edits merged)
Please save this source code
User prompt
Please fix the bug: 'Cannot read properties of undefined (reading 'addChild')' in or related to this line: 'backgroundLayer.addChild(gradient);' Line Number: 113
User prompt
Please fix the bug: 'Cannot read properties of undefined (reading 'addChild')' in or related to this line: 'backgroundLayer.addChild(gradient);' Line Number: 113
User prompt
Please fix the bug: 'Graphics is not a constructor' in or related to this line: 'var gradient = new Graphics();' Line Number: 102
User prompt
use a radial blue gradiant for the bg
User prompt
make bg black
Code edit (1 edits merged)
Please save this source code
User prompt
use these colors for tiles : #16C47F #FFD65A #FF9D23 #F93827 and add a corresponding blue
Code edit (7 edits merged)
Please save this source code
User prompt
replace pastel colors with more bright colors
Code edit (1 edits merged)
Please save this source code
User prompt
in ``` x: col * tileOffsetX - (levelData ? levelData.tiles.length : 0) * 50 + (row % 2 === 1 ? -50 : 0), y: row * tileOffsetY - (levelData ? levelData.tiles.length : 0) * 50, ``` use tileSize
User prompt
in HexTile, for tileSize, use the HexTile asset width
User prompt
like tileOffsetX, add a constant in HexTile for tile size (100)
User prompt
use 0x7086A6 for bg
User prompt
use a pasel blue for the background
User prompt
make paset colors a bit darker
Code edit (1 edits merged)
Please save this source code
User prompt
to make the board look like a real hxa grid, add an offset to tiles on odd lines
User prompt
Please fix the bug: 'Cannot read properties of undefined (reading 'length')' in or related to this line: 'var tileGraphics = self.attachAsset('hexTile', {' Line Number: 26
/**** * Classes ****/ /***********************************************************************************************/ /******************************************* ASSETS CLASSES ************************************/ /***********************************************************************************************/ // HexTile class to represent each tile on the board var HexTile = Container.expand(function (value, col, row, levelData) { var self = Container.call(this); // Properties self.value = value; self.originalValue = value; self.col = col; self.row = row; self.neighbors = []; // Asset Attachments var tileGraphics = self.attachAsset('hexTile', { anchorX: 0.5, anchorY: 0.5, x: col * 100 - (levelData ? levelData.tiles.length : 0) * 50, y: row * 100 - (levelData ? levelData.tiles.length : 0) * 50, tint: tileColors[self.value] // Apply tint based on tile value }); var valueText = new Text2(self.value.toString(), { size: 50, fill: 0xFFFFFF }); valueText.anchor.set(0.5, 0.5); valueText.x = tileGraphics.x; valueText.y = tileGraphics.y; self.addChild(valueText); // Functions self.playOperationEffect = function () { // Play operation animation }; return self; }); // OperationButton class to represent each operation button var OperationButton = Container.expand(function (type, uses) { var self = Container.call(this); // Properties self.type = type; self.remainingUses = uses; // Asset Attachments var buttonGraphics = self.attachAsset('operationButton', { anchorX: 0.5, anchorY: 0.5, x: 0, y: 0 }); var usesText = self.attachAsset('usesText', { anchorX: 0.5, anchorY: 0.5, x: 0, y: 30, text: uses.toString() }); // Functions self.updateUses = function () { usesText.setText(self.remainingUses.toString()); }; return self; }); // StartButton class to represent the start button var StartButton = Container.expand(function () { var self = Container.call(this); // Asset Attachments var buttonGraphics = self.attachAsset('startButton', { anchorX: 0.5, anchorY: 0.5, x: 0, y: 0 }); return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x000000 //Init game with black background }); /**** * Game Code ****/ /***********************************************************************************************/ /************************************* GAME OBJECTS CLASSES ************************************/ /***********************************************************************************************/ function PuzzleManager(game) { var self = this; // Properties self.game = game; self.currentLevel = 1; self.board = []; self.operations = []; self.isAnimating = false; self.selectedOperation = null; self.moveCount = 0; self.levelData = null; // Core Functions self.initPuzzle = function () { self.loadLevel(self.currentLevel); }; self.reset = function () { self.loadLevel(self.currentLevel); }; self.loadLevel = function (levelNumber) { // Load level configuration self.levelData = levelConfigs[levelNumber] || { tiles: [], operations: [] }; self.createBoard(); self.createOperations(); }; self.createBoard = function () { self.board = []; for (var row = 0; row < self.levelData.tiles.length; row++) { for (var col = 0; col < self.levelData.tiles[row].length; col++) { var value = self.levelData.tiles[row][col]; if (value !== "") { var tile = new HexTile(value, col, row, self.levelData); self.board.push(tile); boardContainer.addChild(tile); } } } }; self.createOperations = function () { self.operations = []; for (var i = 0; i < self.levelData.operations.length; i++) { var opData = self.levelData.operations[i]; var operation = new OperationButton(opData.type, opData.uses); self.operations.push(operation); operation.x = centerX + (i - (self.levelData.operations.length - 1) / 2) * 120; // Space buttons evenly operation.y = 2500; // Position near the bottom of the screen self.game.addChild(operation); } }; self.applyOperation = function (operation, tile) { if (operation.remainingUses > 0) { self.propagateOperation(operation, tile); operation.remainingUses--; operation.updateUses(); self.checkWinCondition(); } }; self.propagateOperation = function (operation, startTile) { var visited = new Set(); var toProcess = [startTile]; var targetValue = startTile.value; while (toProcess.length > 0) { var currentTile = toProcess.pop(); if (visited.has(currentTile)) { continue; } visited.add(currentTile); // Apply operation currentTile.setValue(currentTile.value + parseInt(operation.type)); currentTile.playOperationEffect(); // Check neighbors var _iterator = _createForOfIteratorHelper(currentTile.neighbors), _step; try { for (_iterator.s(); !(_step = _iterator.n()).done;) { var neighbor = _step.value; if (neighbor.value === targetValue && !visited.has(neighbor)) { toProcess.push(neighbor); } } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } } }; self.checkWinCondition = function () { var _iterator2 = _createForOfIteratorHelper(self.board), _step2; try { for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) { var tile = _step2.value; if (tile.value !== 0) { return false; } } } catch (err) { _iterator2.e(err); } finally { _iterator2.f(); } self.playVictoryAnimation(); return true; }; // Animation Functions self.playVictoryAnimation = function () { // Play level complete animation }; } /***********************************************************************************************/ /************************************* UTILITY FUNCTIONS ************************************/ /***********************************************************************************************/ function log() { if (debug) { console.log.apply(console, arguments); } } function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) { throw o; } } } }; } 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; } /***********************************************************************************************/ /************************************* GAME STATE MANAGEMENT ************************************/ /***********************************************************************************************/ function initMenuState() { // Initialize the game state for MENU log("Initializing MENU State"); startButton.visible = true; if (debug) { changeGameState(GAME_STATE.NEW_ROUND); } } function handleMenuLoop() { // Handle the game loop for MENU state log("Handling MENU Loop"); } function cleanMenuState() { // Clean up the game state for MENU log("Cleaning MENU State"); startButton.visible = false; } function initNewRoundState() { // Initialize the game state for NEW_ROUND log("Initializing NEW_ROUND State"); puzzleManager.initPuzzle(); } function handleNewRoundLoop() { // Handle the game loop for NEW_ROUND state log("Handling NEW_ROUND Loop"); } function cleanNewRoundState() { // Clean up the game state for NEW_ROUND log("Cleaning NEW_ROUND State"); } function initPlayingState() { // Initialize the game state for PLAYING log("Initializing PLAYING State"); } function handlePlayingLoop() { // Handle the game loop for PLAYING state log("Handling PLAYING Loop"); } function cleanPlayingState() { // Clean up the game state for PLAYING log("Cleaning PLAYING State"); } function initScoreState() { // Initialize the game state for SCORE log("Initializing SCORE State"); } function handleScoreLoop() { // Handle the game loop for SCORE state log("Handling SCORE Loop"); } function cleanScoreState() { // Clean up the game state for SCORE log("Cleaning SCORE State"); } function changeGameState(newState) { log("Changing game state from", currentState, "to", newState); // Clean up the current state switch (currentState) { case GAME_STATE.INIT: // Do nothing break; 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; default: log("Unknown state:", currentState); } // Set the new state currentState = newState; // Initialize the new state 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; default: log("Unknown state:", newState); } } /***********************************************************************************************/ /****************************************** EVENT HANDLERS *************************************/ /***********************************************************************************************/ game.down = function (x, y, obj) { switch (currentState) { case GAME_STATE.MENU: handleMenuStateDown(x, y, obj); break; case GAME_STATE.PLAYING: handlePlayingStateDown(x, y, obj); break; case GAME_STATE.SCORE: handleScoreStateDown(x, y, obj); break; default: log("Unknown state:", currentState); } }; game.move = function (x, y, obj) { switch (currentState) { case GAME_STATE.MENU: handleMenuStateMove(x, y, obj); break; case GAME_STATE.PLAYING: handlePlayingStateMove(x, y, obj); break; case GAME_STATE.SCORE: handleScoreStateMove(x, y, obj); break; default: log("Unknown state:", currentState); } }; game.up = function (x, y, obj) { switch (currentState) { case GAME_STATE.MENU: handleMenuStateUp(x, y, obj); break; case GAME_STATE.PLAYING: handlePlayingStateUp(x, y, obj); break; case GAME_STATE.SCORE: handleScoreStateUp(x, y, obj); break; default: log("Unknown state:", currentState); } }; function handleScoreStateUp(x, y, obj) { // Implement logic for handling up event in SCORE state log("Handling up event in SCORE state"); } function handlePlayingStateUp(x, y, obj) { // Implement logic for handling up event in PLAYING state log("Handling up event in PLAYING state"); } function handleMenuStateUp(x, y, obj) { // Implement logic for handling up event in MENU state log("Handling up event in MENU state"); } function handleScoreStateMove(x, y, obj) { // Implement logic for handling move event in SCORE state //log("Handling move event in SCORE state"); } function handlePlayingStateMove(x, y, obj) { // Implement logic for handling move event in PLAYING state //log("Handling move event in PLAYING state"); } function handleMenuStateMove(x, y, obj) { // Implement logic for handling move event in MENU state //log("Handling move event in MENU state"); } function handleScoreStateDown(x, y, obj) { // Implement logic for handling down event in SCORE state log("Handling down event in SCORE state"); } function handlePlayingStateDown(x, y, obj) { // Implement logic for handling down event in PLAYING state log("Handling down event in PLAYING state"); } function handleMenuStateDown(x, y, obj) { // Implement logic for handling down event in MENU state log("Handling down event in MENU state"); changeGameState(GAME_STATE.NEW_ROUND); } // Initialize PuzzleManager //<Assets used in the game will automatically appear here> //<Write imports for supported plugins here> /***********************************************************************************************/ /****************************************** GLOBAL VARIABLES ***********************************/ /***********************************************************************************************/ var debug = true; var isPlaying = false; var GAME_STATE = { INIT: 'INIT', MENU: 'MENU', NEW_ROUND: 'NEW_ROUND', PLAYING: 'PLAYING', SCORE: 'SCORE' }; var currentState = GAME_STATE.INIT; var boardContainer; var puzzleManager; var startButton; var backgroundLayer; var middleLayer; var foregroundLayer; var centerX = 1024; var centerY = 1366; var tileColors = { 0: 0xffc1cc, // Light Pink 1: 0xffe4b5, // Moccasin 2: 0xb0e0e6, // Powder Blue 3: 0xd8bfd8 // Thistle }; var levelConfigs = { 1: { tiles: [[1, 1, 1], ["", 2, 2], ["", 1, ""]], operations: [{ type: '+1', uses: 3 }, { type: '-1', uses: 2 }] }, 2: { tiles: [[2, 2, 2], ["", 3, 3], ["", 2, ""]], operations: [{ type: '+1', uses: 2 }, { type: '-1', uses: 3 }] } }; // Example configuration for two levels /***********************************************************************************************/ /***************************************** GAME INITIALISATION *********************************/ /***********************************************************************************************/ function initializeGame() { backgroundLayer = new Container(); middleLayer = new Container(); foregroundLayer = new Container(); game.addChild(backgroundLayer); game.addChild(middleLayer); game.addChild(foregroundLayer); boardContainer = new Container(); middleLayer.addChild(boardContainer); boardContainer.x = centerX; boardContainer.y = centerY; puzzleManager = new PuzzleManager(game); startButton = new StartButton(); startButton.x = centerX; // Center horizontally startButton.y = centerY; // Center vertically game.addChild(startButton); startButton.visible = false; // Transition to menu state changeGameState(GAME_STATE.MENU); } initializeGame();
/****
* Classes
****/
/***********************************************************************************************/
/******************************************* ASSETS CLASSES ************************************/
/***********************************************************************************************/
// HexTile class to represent each tile on the board
var HexTile = Container.expand(function (value, col, row, levelData) {
var self = Container.call(this);
// Properties
self.value = value;
self.originalValue = value;
self.col = col;
self.row = row;
self.neighbors = [];
// Asset Attachments
var tileGraphics = self.attachAsset('hexTile', {
anchorX: 0.5,
anchorY: 0.5,
x: col * 100 - (levelData ? levelData.tiles.length : 0) * 50,
y: row * 100 - (levelData ? levelData.tiles.length : 0) * 50,
tint: tileColors[self.value] // Apply tint based on tile value
});
var valueText = new Text2(self.value.toString(), {
size: 50,
fill: 0xFFFFFF
});
valueText.anchor.set(0.5, 0.5);
valueText.x = tileGraphics.x;
valueText.y = tileGraphics.y;
self.addChild(valueText);
// Functions
self.playOperationEffect = function () {
// Play operation animation
};
return self;
});
// OperationButton class to represent each operation button
var OperationButton = Container.expand(function (type, uses) {
var self = Container.call(this);
// Properties
self.type = type;
self.remainingUses = uses;
// Asset Attachments
var buttonGraphics = self.attachAsset('operationButton', {
anchorX: 0.5,
anchorY: 0.5,
x: 0,
y: 0
});
var usesText = self.attachAsset('usesText', {
anchorX: 0.5,
anchorY: 0.5,
x: 0,
y: 30,
text: uses.toString()
});
// Functions
self.updateUses = function () {
usesText.setText(self.remainingUses.toString());
};
return self;
});
// StartButton class to represent the start button
var StartButton = Container.expand(function () {
var self = Container.call(this);
// Asset Attachments
var buttonGraphics = self.attachAsset('startButton', {
anchorX: 0.5,
anchorY: 0.5,
x: 0,
y: 0
});
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000000 //Init game with black background
});
/****
* Game Code
****/
/***********************************************************************************************/
/************************************* GAME OBJECTS CLASSES ************************************/
/***********************************************************************************************/
function PuzzleManager(game) {
var self = this;
// Properties
self.game = game;
self.currentLevel = 1;
self.board = [];
self.operations = [];
self.isAnimating = false;
self.selectedOperation = null;
self.moveCount = 0;
self.levelData = null;
// Core Functions
self.initPuzzle = function () {
self.loadLevel(self.currentLevel);
};
self.reset = function () {
self.loadLevel(self.currentLevel);
};
self.loadLevel = function (levelNumber) {
// Load level configuration
self.levelData = levelConfigs[levelNumber] || {
tiles: [],
operations: []
};
self.createBoard();
self.createOperations();
};
self.createBoard = function () {
self.board = [];
for (var row = 0; row < self.levelData.tiles.length; row++) {
for (var col = 0; col < self.levelData.tiles[row].length; col++) {
var value = self.levelData.tiles[row][col];
if (value !== "") {
var tile = new HexTile(value, col, row, self.levelData);
self.board.push(tile);
boardContainer.addChild(tile);
}
}
}
};
self.createOperations = function () {
self.operations = [];
for (var i = 0; i < self.levelData.operations.length; i++) {
var opData = self.levelData.operations[i];
var operation = new OperationButton(opData.type, opData.uses);
self.operations.push(operation);
operation.x = centerX + (i - (self.levelData.operations.length - 1) / 2) * 120; // Space buttons evenly
operation.y = 2500; // Position near the bottom of the screen
self.game.addChild(operation);
}
};
self.applyOperation = function (operation, tile) {
if (operation.remainingUses > 0) {
self.propagateOperation(operation, tile);
operation.remainingUses--;
operation.updateUses();
self.checkWinCondition();
}
};
self.propagateOperation = function (operation, startTile) {
var visited = new Set();
var toProcess = [startTile];
var targetValue = startTile.value;
while (toProcess.length > 0) {
var currentTile = toProcess.pop();
if (visited.has(currentTile)) {
continue;
}
visited.add(currentTile);
// Apply operation
currentTile.setValue(currentTile.value + parseInt(operation.type));
currentTile.playOperationEffect();
// Check neighbors
var _iterator = _createForOfIteratorHelper(currentTile.neighbors),
_step;
try {
for (_iterator.s(); !(_step = _iterator.n()).done;) {
var neighbor = _step.value;
if (neighbor.value === targetValue && !visited.has(neighbor)) {
toProcess.push(neighbor);
}
}
} catch (err) {
_iterator.e(err);
} finally {
_iterator.f();
}
}
};
self.checkWinCondition = function () {
var _iterator2 = _createForOfIteratorHelper(self.board),
_step2;
try {
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
var tile = _step2.value;
if (tile.value !== 0) {
return false;
}
}
} catch (err) {
_iterator2.e(err);
} finally {
_iterator2.f();
}
self.playVictoryAnimation();
return true;
};
// Animation Functions
self.playVictoryAnimation = function () {
// Play level complete animation
};
}
/***********************************************************************************************/
/************************************* UTILITY FUNCTIONS ************************************/
/***********************************************************************************************/
function log() {
if (debug) {
console.log.apply(console, arguments);
}
}
function _createForOfIteratorHelper(r, e) {
var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"];
if (!t) {
if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) {
t && (r = t);
var _n = 0,
F = function F() {};
return {
s: F,
n: function n() {
return _n >= r.length ? {
done: !0
} : {
done: !1,
value: r[_n++]
};
},
e: function e(r) {
throw r;
},
f: F
};
}
throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
var o,
a = !0,
u = !1;
return {
s: function s() {
t = t.call(r);
},
n: function n() {
var r = t.next();
return a = r.done, r;
},
e: function e(r) {
u = !0, o = r;
},
f: function f() {
try {
a || null == t["return"] || t["return"]();
} finally {
if (u) {
throw o;
}
}
}
};
}
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;
}
/***********************************************************************************************/
/************************************* GAME STATE MANAGEMENT ************************************/
/***********************************************************************************************/
function initMenuState() {
// Initialize the game state for MENU
log("Initializing MENU State");
startButton.visible = true;
if (debug) {
changeGameState(GAME_STATE.NEW_ROUND);
}
}
function handleMenuLoop() {
// Handle the game loop for MENU state
log("Handling MENU Loop");
}
function cleanMenuState() {
// Clean up the game state for MENU
log("Cleaning MENU State");
startButton.visible = false;
}
function initNewRoundState() {
// Initialize the game state for NEW_ROUND
log("Initializing NEW_ROUND State");
puzzleManager.initPuzzle();
}
function handleNewRoundLoop() {
// Handle the game loop for NEW_ROUND state
log("Handling NEW_ROUND Loop");
}
function cleanNewRoundState() {
// Clean up the game state for NEW_ROUND
log("Cleaning NEW_ROUND State");
}
function initPlayingState() {
// Initialize the game state for PLAYING
log("Initializing PLAYING State");
}
function handlePlayingLoop() {
// Handle the game loop for PLAYING state
log("Handling PLAYING Loop");
}
function cleanPlayingState() {
// Clean up the game state for PLAYING
log("Cleaning PLAYING State");
}
function initScoreState() {
// Initialize the game state for SCORE
log("Initializing SCORE State");
}
function handleScoreLoop() {
// Handle the game loop for SCORE state
log("Handling SCORE Loop");
}
function cleanScoreState() {
// Clean up the game state for SCORE
log("Cleaning SCORE State");
}
function changeGameState(newState) {
log("Changing game state from", currentState, "to", newState);
// Clean up the current state
switch (currentState) {
case GAME_STATE.INIT:
// Do nothing
break;
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;
default:
log("Unknown state:", currentState);
}
// Set the new state
currentState = newState;
// Initialize the new state
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;
default:
log("Unknown state:", newState);
}
}
/***********************************************************************************************/
/****************************************** EVENT HANDLERS *************************************/
/***********************************************************************************************/
game.down = function (x, y, obj) {
switch (currentState) {
case GAME_STATE.MENU:
handleMenuStateDown(x, y, obj);
break;
case GAME_STATE.PLAYING:
handlePlayingStateDown(x, y, obj);
break;
case GAME_STATE.SCORE:
handleScoreStateDown(x, y, obj);
break;
default:
log("Unknown state:", currentState);
}
};
game.move = function (x, y, obj) {
switch (currentState) {
case GAME_STATE.MENU:
handleMenuStateMove(x, y, obj);
break;
case GAME_STATE.PLAYING:
handlePlayingStateMove(x, y, obj);
break;
case GAME_STATE.SCORE:
handleScoreStateMove(x, y, obj);
break;
default:
log("Unknown state:", currentState);
}
};
game.up = function (x, y, obj) {
switch (currentState) {
case GAME_STATE.MENU:
handleMenuStateUp(x, y, obj);
break;
case GAME_STATE.PLAYING:
handlePlayingStateUp(x, y, obj);
break;
case GAME_STATE.SCORE:
handleScoreStateUp(x, y, obj);
break;
default:
log("Unknown state:", currentState);
}
};
function handleScoreStateUp(x, y, obj) {
// Implement logic for handling up event in SCORE state
log("Handling up event in SCORE state");
}
function handlePlayingStateUp(x, y, obj) {
// Implement logic for handling up event in PLAYING state
log("Handling up event in PLAYING state");
}
function handleMenuStateUp(x, y, obj) {
// Implement logic for handling up event in MENU state
log("Handling up event in MENU state");
}
function handleScoreStateMove(x, y, obj) {
// Implement logic for handling move event in SCORE state
//log("Handling move event in SCORE state");
}
function handlePlayingStateMove(x, y, obj) {
// Implement logic for handling move event in PLAYING state
//log("Handling move event in PLAYING state");
}
function handleMenuStateMove(x, y, obj) {
// Implement logic for handling move event in MENU state
//log("Handling move event in MENU state");
}
function handleScoreStateDown(x, y, obj) {
// Implement logic for handling down event in SCORE state
log("Handling down event in SCORE state");
}
function handlePlayingStateDown(x, y, obj) {
// Implement logic for handling down event in PLAYING state
log("Handling down event in PLAYING state");
}
function handleMenuStateDown(x, y, obj) {
// Implement logic for handling down event in MENU state
log("Handling down event in MENU state");
changeGameState(GAME_STATE.NEW_ROUND);
}
// Initialize PuzzleManager
//<Assets used in the game will automatically appear here>
//<Write imports for supported plugins here>
/***********************************************************************************************/
/****************************************** GLOBAL VARIABLES ***********************************/
/***********************************************************************************************/
var debug = true;
var isPlaying = false;
var GAME_STATE = {
INIT: 'INIT',
MENU: 'MENU',
NEW_ROUND: 'NEW_ROUND',
PLAYING: 'PLAYING',
SCORE: 'SCORE'
};
var currentState = GAME_STATE.INIT;
var boardContainer;
var puzzleManager;
var startButton;
var backgroundLayer;
var middleLayer;
var foregroundLayer;
var centerX = 1024;
var centerY = 1366;
var tileColors = {
0: 0xffc1cc,
// Light Pink
1: 0xffe4b5,
// Moccasin
2: 0xb0e0e6,
// Powder Blue
3: 0xd8bfd8 // Thistle
};
var levelConfigs = {
1: {
tiles: [[1, 1, 1], ["", 2, 2], ["", 1, ""]],
operations: [{
type: '+1',
uses: 3
}, {
type: '-1',
uses: 2
}]
},
2: {
tiles: [[2, 2, 2], ["", 3, 3], ["", 2, ""]],
operations: [{
type: '+1',
uses: 2
}, {
type: '-1',
uses: 3
}]
}
}; // Example configuration for two levels
/***********************************************************************************************/
/***************************************** GAME INITIALISATION *********************************/
/***********************************************************************************************/
function initializeGame() {
backgroundLayer = new Container();
middleLayer = new Container();
foregroundLayer = new Container();
game.addChild(backgroundLayer);
game.addChild(middleLayer);
game.addChild(foregroundLayer);
boardContainer = new Container();
middleLayer.addChild(boardContainer);
boardContainer.x = centerX;
boardContainer.y = centerY;
puzzleManager = new PuzzleManager(game);
startButton = new StartButton();
startButton.x = centerX; // Center horizontally
startButton.y = centerY; // Center vertically
game.addChild(startButton);
startButton.visible = false;
// Transition to menu state
changeGameState(GAME_STATE.MENU);
}
initializeGame();
tick
Sound effect
tileEntrance
Sound effect
tileRemove
Sound effect
operationSelect
Sound effect
operationCancel
Sound effect
tileChangeValue
Sound effect
resetSound
Sound effect
levelFailed
Sound effect
menuLevelSelect
Sound effect
menuCellEnter
Sound effect
applause
Sound effect
bgMusic
Music
tada
Sound effect