Code edit (1 edits merged)
Please save this source code
User prompt
Pango's Wake-Up Call
Initial prompt
Pango the blue raccoon π: skunk π€ has over slept π. Find a way to wake her up. Remember last time you will tap on the gong π©Ά to make the tea time monsters wake her up, or tap on the mr beaky π to wake her up.
/****
* 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);
}
}
};