/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
var facekit = LK.import("@upit/facekit.v1");
/****
* Classes
****/
var Bridge = Container.expand(function () {
var self = Container.call(this);
self.blocks = [];
self.extending = false;
self.currentLength = 0;
self.maxLength = 500;
self.placed = false;
self.extend = function () {
if (self.placed || self.currentLength >= self.maxLength) {
return;
}
self.extending = true;
self.currentLength += 10;
// Update existing blocks
for (var i = 0; i < self.blocks.length; i++) {
self.blocks[i].width = self.currentLength;
}
// Create a new block if needed
if (self.blocks.length === 0) {
var block = self.attachAsset('bridgeBlock', {
anchorX: 0,
anchorY: 0.5,
width: self.currentLength,
height: 30
});
self.blocks.push(block);
}
};
self.place = function () {
if (!self.extending || self.placed) {
return;
}
self.extending = false;
self.placed = true;
LK.getSound('place').play();
return self.currentLength;
};
self.reset = function () {
self.currentLength = 0;
self.extending = false;
self.placed = false;
for (var i = 0; i < self.blocks.length; i++) {
self.blocks[i].width = 0;
}
};
return self;
});
var Chicken = Container.expand(function () {
var self = Container.call(this);
var chickenGraphics = self.attachAsset('chicken', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 2;
self.moving = false;
self.fell = false;
self.crossed = false;
self.startMoving = function () {
self.moving = true;
};
self.update = function () {
if (self.moving && !self.fell && !self.crossed) {
self.x += self.speed;
}
};
self.fall = function () {
if (self.fell) {
return;
}
self.fell = true;
tween(self, {
y: self.y + 500,
alpha: 0
}, {
duration: 1000,
easing: tween.easeIn,
onFinish: function onFinish() {
self.moving = false;
}
});
LK.getSound('fail').play();
};
self.crossComplete = function () {
self.crossed = true;
self.moving = false;
LK.getSound('success').play();
LK.setScore(LK.getScore() + 1);
};
self.reset = function (x, y) {
self.x = x;
self.y = y;
self.alpha = 1;
self.moving = false;
self.fell = false;
self.crossed = false;
};
return self;
});
var Gap = Container.expand(function () {
var self = Container.call(this);
var gapGraphics = self.attachAsset('gap', {
anchorX: 0.5,
anchorY: 0
});
return self;
});
var Level = Container.expand(function (levelConfig) {
var self = Container.call(this);
// Initialize with default config if none provided
self.config = levelConfig || {
gapWidth: 300,
startX: 300,
endX: 800,
platformY: 1800
};
// Create platforms
self.startPlatform = new Platform();
self.startPlatform.x = self.config.startX;
self.startPlatform.y = self.config.platformY;
self.addChild(self.startPlatform);
self.endPlatform = new Platform();
self.endPlatform.x = self.config.endX;
self.endPlatform.y = self.config.platformY;
self.addChild(self.endPlatform);
// Create gap
self.gap = new Gap();
self.gap.x = (self.config.startX + self.config.endX) / 2;
self.gap.y = self.config.platformY;
self.gap.width = self.config.gapWidth;
self.addChild(self.gap);
// Create bridge
self.bridge = new Bridge();
self.bridge.x = self.config.startX + 100; // Bridge starts at edge of platform
self.bridge.y = self.config.platformY - 15; // Slightly above platform
self.addChild(self.bridge);
// Create chicken
self.chicken = new Chicken();
self.chicken.x = self.config.startX - 50;
self.chicken.y = self.config.platformY - 50;
self.addChild(self.chicken);
self.reset = function () {
self.bridge.reset();
self.chicken.reset(self.config.startX - 50, self.config.platformY - 50);
};
return self;
});
var Platform = Container.expand(function () {
var self = Container.call(this);
var platformGraphics = self.attachAsset('platform', {
anchorX: 0.5,
anchorY: 0
});
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87CEEB
});
/****
* Game Code
****/
// Game state variables
var currentLevel = 0;
var levels = [];
var levelConfigs = [{
gapWidth: 300,
startX: 600,
endX: 1100,
platformY: 1800
}, {
gapWidth: 400,
startX: 500,
endX: 1200,
platformY: 1800
}, {
gapWidth: 500,
startX: 400,
endX: 1300,
platformY: 1800
}];
var gameActive = false;
var mouthWasOpen = false;
var levelComplete = false;
var allLevelsComplete = false;
// Initialize UI elements
var titleText = new Text2('Cluck the Gap', {
size: 120,
fill: 0x000000
});
titleText.anchor.set(0.5, 0.5);
titleText.x = 2048 / 2;
titleText.y = 400;
game.addChild(titleText);
var instructionText = new Text2('Open your mouth to extend the bridge\nClose your mouth to place it', {
size: 60,
fill: 0x000000
});
instructionText.anchor.set(0.5, 0.5);
instructionText.x = 2048 / 2;
instructionText.y = 550;
game.addChild(instructionText);
var startButton = LK.getAsset('bridgeBlock', {
width: 300,
height: 100,
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2,
y: 700
});
game.addChild(startButton);
var startText = new Text2('START', {
size: 80,
fill: 0xFFFFFF
});
startText.anchor.set(0.5, 0.5);
startText.x = 2048 / 2;
startText.y = 700;
game.addChild(startText);
var levelText = new Text2('Level 1', {
size: 80,
fill: 0x000000
});
levelText.anchor.set(0.5, 0);
levelText.visible = false;
LK.gui.top.addChild(levelText);
var scoreText = new Text2('Chickens Saved: 0', {
size: 60,
fill: 0x000000
});
scoreText.anchor.set(1, 0);
scoreText.visible = false;
LK.gui.topRight.addChild(scoreText);
// Initialize game levels
function setupLevels() {
// Clear any existing levels
if (levels.length > 0) {
for (var i = 0; i < levels.length; i++) {
if (levels[i].parent) {
levels[i].parent.removeChild(levels[i]);
}
}
levels = [];
}
// Create new levels
for (var i = 0; i < levelConfigs.length; i++) {
var level = new Level(levelConfigs[i]);
level.visible = false;
game.addChild(level);
levels.push(level);
}
}
// Start the game
function startGame() {
// Reset game state
LK.setScore(0);
currentLevel = 0;
levelComplete = false;
allLevelsComplete = false;
gameActive = true;
// Hide menu elements
titleText.visible = false;
instructionText.visible = false;
startButton.visible = false;
startText.visible = false;
// Show game UI
levelText.visible = true;
levelText.setText('Level ' + (currentLevel + 1));
scoreText.visible = true;
scoreText.setText('Chickens Saved: ' + LK.getScore());
// Setup levels
setupLevels();
// Show current level
levels[currentLevel].visible = true;
// Start background music
LK.playMusic('bgMusic');
}
// Move to next level
function nextLevel() {
if (currentLevel >= levelConfigs.length - 1) {
// All levels complete
allLevelsComplete = true;
LK.showYouWin();
return;
}
// Hide current level
levels[currentLevel].visible = false;
// Move to next level
currentLevel++;
// Show new level
levelText.setText('Level ' + (currentLevel + 1));
levels[currentLevel].visible = true;
levelComplete = false;
}
// Event handlers
startButton.down = function () {
startGame();
};
// Main game update loop
game.update = function () {
if (!gameActive) {
return;
}
// Update current level
var level = levels[currentLevel];
if (!level) {
return;
}
// Check for mouth open/close to control bridge
if (facekit.mouthOpen && !mouthWasOpen) {
// Mouth just opened
mouthWasOpen = true;
} else if (facekit.mouthOpen && mouthWasOpen) {
// Mouth staying open - extend bridge
level.bridge.extend();
} else if (!facekit.mouthOpen && mouthWasOpen) {
// Mouth just closed - place bridge
mouthWasOpen = false;
level.bridge.place();
// Start chicken moving
level.chicken.startMoving();
}
// Update chicken movement
level.chicken.update();
// Check for chicken falling
if (level.chicken.moving && !level.chicken.fell && !level.chicken.crossed) {
// Check if chicken has reached the bridge
if (level.chicken.x >= level.bridge.x) {
// Check if bridge is long enough
var requiredLength = level.config.endX - level.bridge.x;
if (!level.bridge.placed || level.bridge.currentLength < requiredLength) {
// Bridge not placed or too short - chicken falls
level.chicken.fall();
// Reset level after delay
LK.setTimeout(function () {
level.reset();
}, 2000);
}
}
// Check if chicken has successfully crossed
if (level.chicken.x >= level.config.endX - 50) {
// Chicken safely crossed
level.chicken.crossComplete();
scoreText.setText('Chickens Saved: ' + LK.getScore());
// Mark level as complete
levelComplete = true;
// Move to next level after delay
LK.setTimeout(function () {
nextLevel();
}, 2000);
}
}
};
// Play background music
LK.playMusic('bgMusic', {
fade: {
start: 0,
end: 0.3,
duration: 1000
}
}); /****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
var facekit = LK.import("@upit/facekit.v1");
/****
* Classes
****/
var Bridge = Container.expand(function () {
var self = Container.call(this);
self.blocks = [];
self.extending = false;
self.currentLength = 0;
self.maxLength = 500;
self.placed = false;
self.extend = function () {
if (self.placed || self.currentLength >= self.maxLength) {
return;
}
self.extending = true;
self.currentLength += 10;
// Update existing blocks
for (var i = 0; i < self.blocks.length; i++) {
self.blocks[i].width = self.currentLength;
}
// Create a new block if needed
if (self.blocks.length === 0) {
var block = self.attachAsset('bridgeBlock', {
anchorX: 0,
anchorY: 0.5,
width: self.currentLength,
height: 30
});
self.blocks.push(block);
}
};
self.place = function () {
if (!self.extending || self.placed) {
return;
}
self.extending = false;
self.placed = true;
LK.getSound('place').play();
return self.currentLength;
};
self.reset = function () {
self.currentLength = 0;
self.extending = false;
self.placed = false;
for (var i = 0; i < self.blocks.length; i++) {
self.blocks[i].width = 0;
}
};
return self;
});
var Chicken = Container.expand(function () {
var self = Container.call(this);
var chickenGraphics = self.attachAsset('chicken', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 2;
self.moving = false;
self.fell = false;
self.crossed = false;
self.startMoving = function () {
self.moving = true;
};
self.update = function () {
if (self.moving && !self.fell && !self.crossed) {
self.x += self.speed;
}
};
self.fall = function () {
if (self.fell) {
return;
}
self.fell = true;
tween(self, {
y: self.y + 500,
alpha: 0
}, {
duration: 1000,
easing: tween.easeIn,
onFinish: function onFinish() {
self.moving = false;
}
});
LK.getSound('fail').play();
};
self.crossComplete = function () {
self.crossed = true;
self.moving = false;
LK.getSound('success').play();
LK.setScore(LK.getScore() + 1);
};
self.reset = function (x, y) {
self.x = x;
self.y = y;
self.alpha = 1;
self.moving = false;
self.fell = false;
self.crossed = false;
};
return self;
});
var Gap = Container.expand(function () {
var self = Container.call(this);
var gapGraphics = self.attachAsset('gap', {
anchorX: 0.5,
anchorY: 0
});
return self;
});
var Level = Container.expand(function (levelConfig) {
var self = Container.call(this);
// Initialize with default config if none provided
self.config = levelConfig || {
gapWidth: 300,
startX: 300,
endX: 800,
platformY: 1800
};
// Create platforms
self.startPlatform = new Platform();
self.startPlatform.x = self.config.startX;
self.startPlatform.y = self.config.platformY;
self.addChild(self.startPlatform);
self.endPlatform = new Platform();
self.endPlatform.x = self.config.endX;
self.endPlatform.y = self.config.platformY;
self.addChild(self.endPlatform);
// Create gap
self.gap = new Gap();
self.gap.x = (self.config.startX + self.config.endX) / 2;
self.gap.y = self.config.platformY;
self.gap.width = self.config.gapWidth;
self.addChild(self.gap);
// Create bridge
self.bridge = new Bridge();
self.bridge.x = self.config.startX + 100; // Bridge starts at edge of platform
self.bridge.y = self.config.platformY - 15; // Slightly above platform
self.addChild(self.bridge);
// Create chicken
self.chicken = new Chicken();
self.chicken.x = self.config.startX - 50;
self.chicken.y = self.config.platformY - 50;
self.addChild(self.chicken);
self.reset = function () {
self.bridge.reset();
self.chicken.reset(self.config.startX - 50, self.config.platformY - 50);
};
return self;
});
var Platform = Container.expand(function () {
var self = Container.call(this);
var platformGraphics = self.attachAsset('platform', {
anchorX: 0.5,
anchorY: 0
});
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87CEEB
});
/****
* Game Code
****/
// Game state variables
var currentLevel = 0;
var levels = [];
var levelConfigs = [{
gapWidth: 300,
startX: 600,
endX: 1100,
platformY: 1800
}, {
gapWidth: 400,
startX: 500,
endX: 1200,
platformY: 1800
}, {
gapWidth: 500,
startX: 400,
endX: 1300,
platformY: 1800
}];
var gameActive = false;
var mouthWasOpen = false;
var levelComplete = false;
var allLevelsComplete = false;
// Initialize UI elements
var titleText = new Text2('Cluck the Gap', {
size: 120,
fill: 0x000000
});
titleText.anchor.set(0.5, 0.5);
titleText.x = 2048 / 2;
titleText.y = 400;
game.addChild(titleText);
var instructionText = new Text2('Open your mouth to extend the bridge\nClose your mouth to place it', {
size: 60,
fill: 0x000000
});
instructionText.anchor.set(0.5, 0.5);
instructionText.x = 2048 / 2;
instructionText.y = 550;
game.addChild(instructionText);
var startButton = LK.getAsset('bridgeBlock', {
width: 300,
height: 100,
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2,
y: 700
});
game.addChild(startButton);
var startText = new Text2('START', {
size: 80,
fill: 0xFFFFFF
});
startText.anchor.set(0.5, 0.5);
startText.x = 2048 / 2;
startText.y = 700;
game.addChild(startText);
var levelText = new Text2('Level 1', {
size: 80,
fill: 0x000000
});
levelText.anchor.set(0.5, 0);
levelText.visible = false;
LK.gui.top.addChild(levelText);
var scoreText = new Text2('Chickens Saved: 0', {
size: 60,
fill: 0x000000
});
scoreText.anchor.set(1, 0);
scoreText.visible = false;
LK.gui.topRight.addChild(scoreText);
// Initialize game levels
function setupLevels() {
// Clear any existing levels
if (levels.length > 0) {
for (var i = 0; i < levels.length; i++) {
if (levels[i].parent) {
levels[i].parent.removeChild(levels[i]);
}
}
levels = [];
}
// Create new levels
for (var i = 0; i < levelConfigs.length; i++) {
var level = new Level(levelConfigs[i]);
level.visible = false;
game.addChild(level);
levels.push(level);
}
}
// Start the game
function startGame() {
// Reset game state
LK.setScore(0);
currentLevel = 0;
levelComplete = false;
allLevelsComplete = false;
gameActive = true;
// Hide menu elements
titleText.visible = false;
instructionText.visible = false;
startButton.visible = false;
startText.visible = false;
// Show game UI
levelText.visible = true;
levelText.setText('Level ' + (currentLevel + 1));
scoreText.visible = true;
scoreText.setText('Chickens Saved: ' + LK.getScore());
// Setup levels
setupLevels();
// Show current level
levels[currentLevel].visible = true;
// Start background music
LK.playMusic('bgMusic');
}
// Move to next level
function nextLevel() {
if (currentLevel >= levelConfigs.length - 1) {
// All levels complete
allLevelsComplete = true;
LK.showYouWin();
return;
}
// Hide current level
levels[currentLevel].visible = false;
// Move to next level
currentLevel++;
// Show new level
levelText.setText('Level ' + (currentLevel + 1));
levels[currentLevel].visible = true;
levelComplete = false;
}
// Event handlers
startButton.down = function () {
startGame();
};
// Main game update loop
game.update = function () {
if (!gameActive) {
return;
}
// Update current level
var level = levels[currentLevel];
if (!level) {
return;
}
// Check for mouth open/close to control bridge
if (facekit.mouthOpen && !mouthWasOpen) {
// Mouth just opened
mouthWasOpen = true;
} else if (facekit.mouthOpen && mouthWasOpen) {
// Mouth staying open - extend bridge
level.bridge.extend();
} else if (!facekit.mouthOpen && mouthWasOpen) {
// Mouth just closed - place bridge
mouthWasOpen = false;
level.bridge.place();
// Start chicken moving
level.chicken.startMoving();
}
// Update chicken movement
level.chicken.update();
// Check for chicken falling
if (level.chicken.moving && !level.chicken.fell && !level.chicken.crossed) {
// Check if chicken has reached the bridge
if (level.chicken.x >= level.bridge.x) {
// Check if bridge is long enough
var requiredLength = level.config.endX - level.bridge.x;
if (!level.bridge.placed || level.bridge.currentLength < requiredLength) {
// Bridge not placed or too short - chicken falls
level.chicken.fall();
// Reset level after delay
LK.setTimeout(function () {
level.reset();
}, 2000);
}
}
// Check if chicken has successfully crossed
if (level.chicken.x >= level.config.endX - 50) {
// Chicken safely crossed
level.chicken.crossComplete();
scoreText.setText('Chickens Saved: ' + LK.getScore());
// Mark level as complete
levelComplete = true;
// Move to next level after delay
LK.setTimeout(function () {
nextLevel();
}, 2000);
}
}
};
// Play background music
LK.playMusic('bgMusic', {
fade: {
start: 0,
end: 0.3,
duration: 1000
}
});