/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ var Gong = Container.expand(function () { var self = Container.call(this); var gongGraphics = self.attachAsset('gong', { anchorX: 0.5, anchorY: 0.5 }); self.ring = function () { LK.getSound('gongSound').play(); // Visual ring effect tween(gongGraphics, { scaleX: 1.1, scaleY: 1.1 }, { duration: 100 }); tween(gongGraphics, { scaleX: 1.0, scaleY: 1.0 }, { duration: 300 }); // Spawn tea monsters for (var i = 0; i < 3; i++) { var monster = new TeaMonster(); var spawnX = self.x + (Math.random() - 0.5) * 300; var spawnY = self.y + (Math.random() - 0.5) * 300; monster.initialize(spawnX, spawnY); game.addChild(monster); teaMonsters.push(monster); // Play monster noise with delay LK.setTimeout(function () { LK.getSound('monsterNoise').play(); }, i * 200); } }; self.down = function (x, y, obj) { self.ring(); noiseLevel += 15; pango.cheer(); sleepingSkunk.stir(15); }; return self; }); var MrBeaky = Container.expand(function () { var self = Container.call(this); var beakyGraphics = self.attachAsset('mrBeaky', { anchorX: 0.5, anchorY: 0.5 }); self.chirp = function () { LK.getSound('birdChirp').play(); // Flapping animation tween(beakyGraphics, { scaleY: 1.3 }, { duration: 100 }); tween(beakyGraphics, { scaleY: 1.0 }, { duration: 200 }); // Wing flap effect tween(self, { rotation: 0.2 }, { duration: 100 }); tween(self, { rotation: -0.2 }, { duration: 100 }); tween(self, { rotation: 0 }, { duration: 100 }); }; self.down = function (x, y, obj) { self.chirp(); noiseLevel += 10; pango.cheer(); sleepingSkunk.stir(10); }; return self; }); var Pango = Container.expand(function () { var self = Container.call(this); var pangoGraphics = self.attachAsset('pango', { anchorX: 0.5, anchorY: 0.5 }); self.cheer = function () { // Pango cheers when noise is made tween(self, { y: self.y - 20 }, { duration: 150 }); tween(self, { y: self.y }, { duration: 150 }); }; return self; }); var SleepingSkunk = Container.expand(function () { var self = Container.call(this); var skunkGraphics = self.attachAsset('sleepingSkunk', { anchorX: 0.5, anchorY: 0.5 }); self.awakeLevel = 0; self.isAwake = false; self.stir = function (amount) { if (self.isAwake) return; self.awakeLevel += amount; // Visual stirring effect var stirAmount = Math.min(self.awakeLevel / 100, 1) * 10; tween(self, { rotation: stirAmount * 0.1 }, { duration: 200 }); tween(self, { rotation: -stirAmount * 0.1 }, { duration: 200 }); if (self.awakeLevel >= 100 && !self.isAwake) { self.wakeUp(); } }; self.wakeUp = function () { self.isAwake = true; LK.getSound('wakeUpSound').play(); // Wake up animation tween(skunkGraphics, { scaleX: 1.2, scaleY: 1.2 }, { duration: 500 }); tween(skunkGraphics, { tint: 0xFFFFFF }, { duration: 1000 }); // Show success after delay LK.setTimeout(function () { LK.showYouWin(); }, 1500); }; return self; }); var TeaMonster = Container.expand(function () { var self = Container.call(this); var monsterGraphics = self.attachAsset('teaMonster', { anchorX: 0.5, anchorY: 0.5 }); self.startX = 0; self.startY = 0; self.lifespan = 0; self.maxLifespan = 120; // 2 seconds at 60fps self.initialize = function (startX, startY) { self.startX = startX; self.startY = startY; self.x = startX; self.y = startY; self.lifespan = 0; // Animate the monster appearing monsterGraphics.scaleX = 0; monsterGraphics.scaleY = 0; tween(monsterGraphics, { scaleX: 1, scaleY: 1 }, { duration: 200 }); // Make it bounce around self.animateMovement(); }; self.animateMovement = function () { var targetX = self.startX + (Math.random() - 0.5) * 200; var targetY = self.startY + (Math.random() - 0.5) * 200; tween(self, { x: targetX, y: targetY }, { duration: 800, easing: tween.easeInOut, onFinish: function onFinish() { if (self.lifespan < self.maxLifespan) { self.animateMovement(); } } }); }; self.update = function () { self.lifespan++; if (self.lifespan >= self.maxLifespan) { // Fade out tween(monsterGraphics, { alpha: 0 }, { duration: 300 }); } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x87CEEB }); /**** * Game Code ****/ // Game variables var noiseLevel = 0; var maxNoiseLevel = 100; var teaMonsters = []; // Create background var background = game.attachAsset('background', { x: 0, y: 0 }); // Create sleeping skunk in center var sleepingSkunk = game.addChild(new SleepingSkunk()); sleepingSkunk.x = 1024; sleepingSkunk.y = 1366; // Create Pango nearby var pango = game.addChild(new Pango()); pango.x = 700; pango.y = 1200; // Create gong var gong = game.addChild(new Gong()); gong.x = 400; gong.y = 1500; // Create Mr. Beaky var mrBeaky = game.addChild(new MrBeaky()); mrBeaky.x = 1600; mrBeaky.y = 1000; // Create noise meter var noiseMeterBg = LK.getAsset('noiseMeterBg', { anchorX: 0.5, anchorY: 0.5 }); var noiseMeterFill = LK.getAsset('noiseMeterFill', { anchorX: 0, anchorY: 0.5 }); // Add noise meter to GUI LK.gui.top.addChild(noiseMeterBg); noiseMeterBg.x = LK.gui.top.width / 2; noiseMeterBg.y = 100; noiseMeterBg.addChild(noiseMeterFill); noiseMeterFill.x = -145; noiseMeterFill.y = 0; // Title text var titleText = new Text2('Help Pango Wake Up His Friend!', { size: 80, fill: 0xFFFFFF }); titleText.anchor.set(0.5, 0); LK.gui.top.addChild(titleText); titleText.x = LK.gui.top.width / 2; titleText.y = 20; // Instruction text var instructionText = new Text2('Tap the gong or Mr. Beaky to make noise!', { size: 60, fill: 0xFFFF00 }); instructionText.anchor.set(0.5, 1); LK.gui.bottom.addChild(instructionText); instructionText.x = LK.gui.bottom.width / 2; instructionText.y = -50; // Game update loop game.update = function () { // Update noise meter visual var fillWidth = Math.max(10, noiseLevel / maxNoiseLevel * 290); noiseMeterFill.width = fillWidth; // Update noise meter color based on level if (noiseLevel < 30) { noiseMeterFill.tint = 0x00FF00; // Green } else if (noiseLevel < 70) { noiseMeterFill.tint = 0xFFFF00; // Yellow } else { noiseMeterFill.tint = 0xFF0000; // Red } // Gradually decrease noise level over time if (noiseLevel > 0 && LK.ticks % 30 == 0) { noiseLevel = Math.max(0, noiseLevel - 2); } // Clean up expired tea monsters for (var i = teaMonsters.length - 1; i >= 0; i--) { var monster = teaMonsters[i]; if (monster.lifespan >= monster.maxLifespan + 20) { // Extra time for fade out monster.destroy(); teaMonsters.splice(i, 1); } } };
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Gong = Container.expand(function () {
var self = Container.call(this);
var gongGraphics = self.attachAsset('gong', {
anchorX: 0.5,
anchorY: 0.5
});
self.ring = function () {
LK.getSound('gongSound').play();
// Visual ring effect
tween(gongGraphics, {
scaleX: 1.1,
scaleY: 1.1
}, {
duration: 100
});
tween(gongGraphics, {
scaleX: 1.0,
scaleY: 1.0
}, {
duration: 300
});
// Spawn tea monsters
for (var i = 0; i < 3; i++) {
var monster = new TeaMonster();
var spawnX = self.x + (Math.random() - 0.5) * 300;
var spawnY = self.y + (Math.random() - 0.5) * 300;
monster.initialize(spawnX, spawnY);
game.addChild(monster);
teaMonsters.push(monster);
// Play monster noise with delay
LK.setTimeout(function () {
LK.getSound('monsterNoise').play();
}, i * 200);
}
};
self.down = function (x, y, obj) {
self.ring();
noiseLevel += 15;
pango.cheer();
sleepingSkunk.stir(15);
};
return self;
});
var MrBeaky = Container.expand(function () {
var self = Container.call(this);
var beakyGraphics = self.attachAsset('mrBeaky', {
anchorX: 0.5,
anchorY: 0.5
});
self.chirp = function () {
LK.getSound('birdChirp').play();
// Flapping animation
tween(beakyGraphics, {
scaleY: 1.3
}, {
duration: 100
});
tween(beakyGraphics, {
scaleY: 1.0
}, {
duration: 200
});
// Wing flap effect
tween(self, {
rotation: 0.2
}, {
duration: 100
});
tween(self, {
rotation: -0.2
}, {
duration: 100
});
tween(self, {
rotation: 0
}, {
duration: 100
});
};
self.down = function (x, y, obj) {
self.chirp();
noiseLevel += 10;
pango.cheer();
sleepingSkunk.stir(10);
};
return self;
});
var Pango = Container.expand(function () {
var self = Container.call(this);
var pangoGraphics = self.attachAsset('pango', {
anchorX: 0.5,
anchorY: 0.5
});
self.cheer = function () {
// Pango cheers when noise is made
tween(self, {
y: self.y - 20
}, {
duration: 150
});
tween(self, {
y: self.y
}, {
duration: 150
});
};
return self;
});
var SleepingSkunk = Container.expand(function () {
var self = Container.call(this);
var skunkGraphics = self.attachAsset('sleepingSkunk', {
anchorX: 0.5,
anchorY: 0.5
});
self.awakeLevel = 0;
self.isAwake = false;
self.stir = function (amount) {
if (self.isAwake) return;
self.awakeLevel += amount;
// Visual stirring effect
var stirAmount = Math.min(self.awakeLevel / 100, 1) * 10;
tween(self, {
rotation: stirAmount * 0.1
}, {
duration: 200
});
tween(self, {
rotation: -stirAmount * 0.1
}, {
duration: 200
});
if (self.awakeLevel >= 100 && !self.isAwake) {
self.wakeUp();
}
};
self.wakeUp = function () {
self.isAwake = true;
LK.getSound('wakeUpSound').play();
// Wake up animation
tween(skunkGraphics, {
scaleX: 1.2,
scaleY: 1.2
}, {
duration: 500
});
tween(skunkGraphics, {
tint: 0xFFFFFF
}, {
duration: 1000
});
// Show success after delay
LK.setTimeout(function () {
LK.showYouWin();
}, 1500);
};
return self;
});
var TeaMonster = Container.expand(function () {
var self = Container.call(this);
var monsterGraphics = self.attachAsset('teaMonster', {
anchorX: 0.5,
anchorY: 0.5
});
self.startX = 0;
self.startY = 0;
self.lifespan = 0;
self.maxLifespan = 120; // 2 seconds at 60fps
self.initialize = function (startX, startY) {
self.startX = startX;
self.startY = startY;
self.x = startX;
self.y = startY;
self.lifespan = 0;
// Animate the monster appearing
monsterGraphics.scaleX = 0;
monsterGraphics.scaleY = 0;
tween(monsterGraphics, {
scaleX: 1,
scaleY: 1
}, {
duration: 200
});
// Make it bounce around
self.animateMovement();
};
self.animateMovement = function () {
var targetX = self.startX + (Math.random() - 0.5) * 200;
var targetY = self.startY + (Math.random() - 0.5) * 200;
tween(self, {
x: targetX,
y: targetY
}, {
duration: 800,
easing: tween.easeInOut,
onFinish: function onFinish() {
if (self.lifespan < self.maxLifespan) {
self.animateMovement();
}
}
});
};
self.update = function () {
self.lifespan++;
if (self.lifespan >= self.maxLifespan) {
// Fade out
tween(monsterGraphics, {
alpha: 0
}, {
duration: 300
});
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87CEEB
});
/****
* Game Code
****/
// Game variables
var noiseLevel = 0;
var maxNoiseLevel = 100;
var teaMonsters = [];
// Create background
var background = game.attachAsset('background', {
x: 0,
y: 0
});
// Create sleeping skunk in center
var sleepingSkunk = game.addChild(new SleepingSkunk());
sleepingSkunk.x = 1024;
sleepingSkunk.y = 1366;
// Create Pango nearby
var pango = game.addChild(new Pango());
pango.x = 700;
pango.y = 1200;
// Create gong
var gong = game.addChild(new Gong());
gong.x = 400;
gong.y = 1500;
// Create Mr. Beaky
var mrBeaky = game.addChild(new MrBeaky());
mrBeaky.x = 1600;
mrBeaky.y = 1000;
// Create noise meter
var noiseMeterBg = LK.getAsset('noiseMeterBg', {
anchorX: 0.5,
anchorY: 0.5
});
var noiseMeterFill = LK.getAsset('noiseMeterFill', {
anchorX: 0,
anchorY: 0.5
});
// Add noise meter to GUI
LK.gui.top.addChild(noiseMeterBg);
noiseMeterBg.x = LK.gui.top.width / 2;
noiseMeterBg.y = 100;
noiseMeterBg.addChild(noiseMeterFill);
noiseMeterFill.x = -145;
noiseMeterFill.y = 0;
// Title text
var titleText = new Text2('Help Pango Wake Up His Friend!', {
size: 80,
fill: 0xFFFFFF
});
titleText.anchor.set(0.5, 0);
LK.gui.top.addChild(titleText);
titleText.x = LK.gui.top.width / 2;
titleText.y = 20;
// Instruction text
var instructionText = new Text2('Tap the gong or Mr. Beaky to make noise!', {
size: 60,
fill: 0xFFFF00
});
instructionText.anchor.set(0.5, 1);
LK.gui.bottom.addChild(instructionText);
instructionText.x = LK.gui.bottom.width / 2;
instructionText.y = -50;
// Game update loop
game.update = function () {
// Update noise meter visual
var fillWidth = Math.max(10, noiseLevel / maxNoiseLevel * 290);
noiseMeterFill.width = fillWidth;
// Update noise meter color based on level
if (noiseLevel < 30) {
noiseMeterFill.tint = 0x00FF00; // Green
} else if (noiseLevel < 70) {
noiseMeterFill.tint = 0xFFFF00; // Yellow
} else {
noiseMeterFill.tint = 0xFF0000; // Red
}
// Gradually decrease noise level over time
if (noiseLevel > 0 && LK.ticks % 30 == 0) {
noiseLevel = Math.max(0, noiseLevel - 2);
}
// Clean up expired tea monsters
for (var i = teaMonsters.length - 1; i >= 0; i--) {
var monster = teaMonsters[i];
if (monster.lifespan >= monster.maxLifespan + 20) {
// Extra time for fade out
monster.destroy();
teaMonsters.splice(i, 1);
}
}
};