User prompt
The game shouldn't end when you finish 1 level, but when you finish 10 levels, the game should end.
User prompt
Let there be 10 levels, it is good. When you finish 10 levels and win, it says you win, when you finish 1 level, it says you win, when you finish 2 levels, it says 3 levels, etc. when you finish 10 levels, it says you won, when you finish 1 level, it says the game is over.
User prompt
Combo text is not visible, it is in the wrong place, at the top middle of the screen.
User prompt
Combo is off screen
User prompt
Once you pass level 1 the game ends immediately and you have to do as many effects as you can.
User prompt
There should be combos in this game too
User prompt
The game ends when the level is finished. Let it be level 10 and have more effects and fun.
User prompt
Show me with dots where your vomit went
User prompt
Let there be lots of levels and let it be fun and let it be seen where it will go like a game and a toy.
User prompt
Let it not be realistic, let it be like in the game, let it be like in the game on the phone.
Code edit (1 edits merged)
Please save this source code
User prompt
Angry Birds: FX Frenzy
Initial prompt
Can you make me an Angry Birds game, but with very detailed and advanced effects?
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ // Bird class var Bird = Container.expand(function () { var self = Container.call(this); self.type = 'red'; // 'red', 'blue', 'yellow' self.radius = 60; self.launched = false; self.vx = 0; self.vy = 0; self.gravity = 1.2; self.trailTimer = 0; self.trailInterval = 3; // frames self.trail = []; self.powerUsed = false; self.alive = true; // Attach asset based on type self.setType = function (type) { self.type = type; if (self.birdAsset) self.removeChild(self.birdAsset); var assetId = 'birdRed'; if (type === 'blue') assetId = 'birdBlue'; if (type === 'yellow') assetId = 'birdYellow'; self.birdAsset = self.attachAsset(assetId, { anchorX: 0.5, anchorY: 0.5 }); self.radius = self.birdAsset.width / 2; }; self.setType('red'); // Launch bird with velocity self.launch = function (vx, vy) { self.vx = vx; self.vy = vy; self.launched = true; self.trailTimer = 0; self.powerUsed = false; self.alive = true; }; // Bird special power (tap in air) self.usePower = function () { if (self.powerUsed || !self.launched) return; self.powerUsed = true; if (self.type === 'blue') { // Split into 3 birds game.spawnSplitBirds(self); } else if (self.type === 'yellow') { // Speed boost self.vx *= 1.7; self.vy *= 1.1; LK.effects.flashObject(self, 0xffff00, 300); } else if (self.type === 'red') { // Red: screen shake game.cameraShake(20, 300); } }; // Update per frame self.update = function () { if (!self.launched || !self.alive) return; self.vy += self.gravity; self.x += self.vx; self.y += self.vy; // Trail effect self.trailTimer++; if (self.trailTimer >= self.trailInterval) { self.trailTimer = 0; var dot = LK.getAsset('trailDot', { anchorX: 0.5, anchorY: 0.5, x: self.x, y: self.y, alpha: 0.5, scaleX: 0.7, scaleY: 0.7 }); game.addChild(dot); self.trail.push(dot); tween(dot, { alpha: 0, scaleX: 0.2, scaleY: 0.2 }, { duration: 600, easing: tween.linear, onFinish: function onFinish() { dot.destroy(); } }); if (self.trail.length > 12) { var old = self.trail.shift(); if (old) old.destroy(); } } // Out of bounds if (self.x < -200 || self.x > 2248 || self.y > 3000) { self.alive = false; self.destroy(); } }; return self; }); // Block class var Block = Container.expand(function () { var self = Container.call(this); self.type = 'wood'; // 'wood', 'stone', 'glass' self.hp = 3; self.width = 200; self.height = 60; self.blockAsset = null; self.broken = false; self.setType = function (type) { self.type = type; if (self.blockAsset) self.removeChild(self.blockAsset); var assetId = 'blockWood'; if (type === 'stone') assetId = 'blockStone'; if (type === 'glass') assetId = 'blockGlass'; self.blockAsset = self.attachAsset(assetId, { anchorX: 0.5, anchorY: 0.5 }); self.width = self.blockAsset.width; self.height = self.blockAsset.height; if (type === 'glass') self.hp = 1;else if (type === 'wood') self.hp = 2;else if (type === 'stone') self.hp = 4; }; self.setType('wood'); self.hit = function (force) { self.hp -= force; LK.getSound('break').play(); LK.effects.flashObject(self, 0xffffff, 120); if (self.hp <= 0 && !self.broken) { self.broken = true; game.spawnDebris(self.x, self.y, self.type); self.destroy(); } }; return self; }); // Particle (for debris/explosion) var Particle = Container.expand(function () { var self = Container.call(this); self.vx = 0; self.vy = 0; self.life = 30; self.asset = null; self.init = function (type, color) { var assetId = 'debris'; if (type === 'explosion') assetId = 'explosion'; self.asset = self.attachAsset(assetId, { anchorX: 0.5, anchorY: 0.5, tint: color }); }; self.update = function () { self.x += self.vx; self.y += self.vy; self.vy += 0.7; self.life--; self.asset.alpha = self.life / 30; if (self.life <= 0) { self.destroy(); } }; return self; }); // Pig class var Pig = Container.expand(function () { var self = Container.call(this); self.radius = 60; self.alive = true; self.pigAsset = self.attachAsset('pig', { anchorX: 0.5, anchorY: 0.5 }); self.hp = 2; self.hit = function (force) { self.hp -= force; LK.getSound('pigOink').play(); LK.effects.flashObject(self, 0xffffff, 200); if (self.hp <= 0) { self.die(); } }; self.die = function () { self.alive = false; game.spawnExplosion(self.x, self.y, 0x7ed957); self.destroy(); }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x87ceeb // Sky blue }); /**** * Game Code ****/ // Camera shake variables // Bird types // Pig // Block types // Slingshot base // Trail particle // Debris particle // Explosion particle // Sound effects // Music var cameraShakeTime = 0; var cameraShakeStrength = 0; // Game state var birds = []; var pigs = []; var blocks = []; var particles = []; var currentBird = null; var slingshotBase = null; var slingshotPos = { x: 400, y: 2000 }; var slingshotRadius = 180; var dragStart = null; var dragging = false; var launchLine = null; var birdsQueue = []; var levelCleared = false; var score = 0; var scoreTxt = null; var shotsTxt = null; var shots = 0; var slowmo = false; var slowmoTimer = 0; // GUI scoreTxt = new Text2('0', { size: 120, fill: "#fff" }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); shotsTxt = new Text2('Shots: 0', { size: 70, fill: "#fff" }); shotsTxt.anchor.set(0.5, 0); LK.gui.topRight.addChild(shotsTxt); // Add slingshot base slingshotBase = LK.getAsset('slingshotBase', { anchorX: 0.5, anchorY: 1, x: slingshotPos.x, y: slingshotPos.y + 100 }); game.addChild(slingshotBase); // Level setup function setupLevel() { // Clear arrays for (var i = 0; i < birds.length; i++) birds[i].destroy(); for (var i = 0; i < pigs.length; i++) pigs[i].destroy(); for (var i = 0; i < blocks.length; i++) blocks[i].destroy(); for (var i = 0; i < particles.length; i++) particles[i].destroy(); birds = []; pigs = []; blocks = []; particles = []; birdsQueue = []; levelCleared = false; score = 0; shots = 0; scoreTxt.setText('0'); shotsTxt.setText('Shots: 0'); slowmo = false; slowmoTimer = 0; // Birds queue (red, blue, yellow) birdsQueue.push('red'); birdsQueue.push('blue'); birdsQueue.push('yellow'); // Spawn first bird spawnNextBird(); // Pigs var pig1 = new Pig(); pig1.x = 1500; pig1.y = 2100; game.addChild(pig1); pigs.push(pig1); var pig2 = new Pig(); pig2.x = 1700; pig2.y = 1900; game.addChild(pig2); pigs.push(pig2); // Blocks (simple structure) var block1 = new Block(); block1.setType('wood'); block1.x = 1500; block1.y = 2200; game.addChild(block1); blocks.push(block1); var block2 = new Block(); block2.setType('stone'); block2.x = 1700; block2.y = 2000; game.addChild(block2); blocks.push(block2); var block3 = new Block(); block3.setType('glass'); block3.x = 1600; block3.y = 2100; game.addChild(block3); blocks.push(block3); } function spawnNextBird() { if (birdsQueue.length === 0) { // No more birds, check for loss LK.setTimeout(function () { if (!levelCleared) LK.showGameOver(); }, 1200); return; } var type = birdsQueue.shift(); var bird = new Bird(); bird.setType(type); bird.x = slingshotPos.x; bird.y = slingshotPos.y; game.addChild(bird); birds.push(bird); currentBird = bird; dragging = false; dragStart = null; } // Camera shake game.cameraShake = function (strength, duration) { cameraShakeStrength = strength; cameraShakeTime = duration; }; // Debris game.spawnDebris = function (x, y, type) { for (var i = 0; i < 8; i++) { var p = new Particle(); p.init('debris', type === 'wood' ? 0xc2b280 : type === 'stone' ? 0xaaaaaa : 0x99e6ff); p.x = x; p.y = y; var angle = Math.random() * Math.PI * 2; var speed = 8 + Math.random() * 8; p.vx = Math.cos(angle) * speed; p.vy = Math.sin(angle) * speed - 4; game.addChild(p); particles.push(p); } }; // Explosion game.spawnExplosion = function (x, y, color) { LK.getSound('explosionSfx').play(); for (var i = 0; i < 12; i++) { var p = new Particle(); p.init('explosion', color); p.x = x; p.y = y; var angle = Math.random() * Math.PI * 2; var speed = 10 + Math.random() * 10; p.vx = Math.cos(angle) * speed; p.vy = Math.sin(angle) * speed - 6; game.addChild(p); particles.push(p); } LK.effects.flashScreen(0xffff99, 200); game.cameraShake(30, 400); }; // Bird split (blue) game.spawnSplitBirds = function (parentBird) { for (var i = -1; i <= 1; i += 2) { var bird = new Bird(); bird.setType('blue'); bird.x = parentBird.x; bird.y = parentBird.y; bird.launched = true; bird.vx = parentBird.vx + i * 7; bird.vy = parentBird.vy - 2; bird.powerUsed = true; game.addChild(bird); birds.push(bird); } }; // SLOWMO function triggerSlowmo() { slowmo = true; slowmoTimer = 40; } // Touch controls game.down = function (x, y, obj) { if (levelCleared) return; if (!currentBird || currentBird.launched) return; // Only allow drag if touch is near bird var dx = x - currentBird.x, dy = y - currentBird.y; if (dx * dx + dy * dy < 180 * 180) { dragging = true; dragStart = { x: x, y: y }; } }; game.move = function (x, y, obj) { if (dragging && currentBird && !currentBird.launched) { // Limit drag distance var dx = x - slingshotPos.x, dy = y - slingshotPos.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist > slingshotRadius) { dx *= slingshotRadius / dist; dy *= slingshotRadius / dist; } currentBird.x = slingshotPos.x + dx; currentBird.y = slingshotPos.y + dy; } }; game.up = function (x, y, obj) { if (dragging && currentBird && !currentBird.launched) { // Launch var dx = currentBird.x - slingshotPos.x, dy = currentBird.y - slingshotPos.y; currentBird.launch(-dx * 0.25, -dy * 0.25); LK.getSound('launch').play(); shots++; shotsTxt.setText('Shots: ' + shots); dragging = false; dragStart = null; } }; // Tap for bird power game.on('down', function (x, y, obj) { if (currentBird && currentBird.launched && !currentBird.powerUsed) { currentBird.usePower(); } }); // Main update game.update = function () { // Camera shake if (cameraShakeTime > 0) { cameraShakeTime -= 16; var shakeX = (Math.random() - 0.5) * cameraShakeStrength; var shakeY = (Math.random() - 0.5) * cameraShakeStrength; game.x = shakeX; game.y = shakeY; } else { game.x = 0; game.y = 0; } // SLOWMO var slowmoFactor = 1; if (slowmo) { slowmoFactor = 0.3; slowmoTimer--; if (slowmoTimer <= 0) slowmo = false; } // Update birds for (var i = birds.length - 1; i >= 0; i--) { var bird = birds[i]; if (bird.launched && bird.alive) { // Slowmo if (slowmo) { bird.x += bird.vx * slowmoFactor; bird.y += bird.vy * slowmoFactor; bird.vy += bird.gravity * slowmoFactor; } else { bird.update(); } // Collisions with blocks for (var j = blocks.length - 1; j >= 0; j--) { var block = blocks[j]; if (!block.broken && rectCircleCollide(block, bird)) { block.hit(1); LK.getSound('hit').play(); // Cartoonish bounce and squash effect tween(block, { scaleY: 0.7, scaleX: 1.2 }, { duration: 80, easing: tween.easeOut, onFinish: function onFinish() { tween(block, { scaleY: 1, scaleX: 1 }, { duration: 120, easing: tween.easeOut }); } }); LK.effects.flashObject(block, 0xff0000, 100); // Exaggerated camera shake game.cameraShake(18, 320); // Add a burst of debris for extra cartoon effect for (var d = 0; d < 3; d++) { var p = new Particle(); p.init('debris', block.type === 'wood' ? 0xc2b280 : block.type === 'stone' ? 0xaaaaaa : 0x99e6ff); p.x = block.x + (Math.random() - 0.5) * block.width * 0.7; p.y = block.y + (Math.random() - 0.5) * block.height * 0.7; var angle = Math.random() * Math.PI * 2; var speed = 10 + Math.random() * 8; p.vx = Math.cos(angle) * speed; p.vy = Math.sin(angle) * speed - 4; game.addChild(p); particles.push(p); } triggerSlowmo(); bird.vx *= 0.6; bird.vy *= 0.6; } } // Collisions with pigs for (var j = pigs.length - 1; j >= 0; j--) { var pig = pigs[j]; if (pig.alive && circleCircleCollide(bird, pig)) { pig.hit(2); LK.getSound('hit').play(); // Pig bounce and color flash tween(pig, { scaleY: 0.6, scaleX: 1.3 }, { duration: 90, easing: tween.easeOut, onFinish: function onFinish() { tween(pig, { scaleY: 1, scaleX: 1 }, { duration: 140, easing: tween.easeOut }); } }); LK.effects.flashObject(pig, 0x00ff00, 180); // Big camera shake and a burst of confetti-like debris game.cameraShake(28, 400); for (var d = 0; d < 6; d++) { var p = new Particle(); p.init('debris', 0x7ed957); p.x = pig.x + (Math.random() - 0.5) * pig.radius * 1.2; p.y = pig.y + (Math.random() - 0.5) * pig.radius * 1.2; var angle = Math.random() * Math.PI * 2; var speed = 12 + Math.random() * 10; p.vx = Math.cos(angle) * speed; p.vy = Math.sin(angle) * speed - 6; game.addChild(p); particles.push(p); } triggerSlowmo(); bird.vx *= 0.7; bird.vy *= 0.7; score += 500; scoreTxt.setText(score); } } } // Remove dead birds if (!bird.alive) { birds.splice(i, 1); if (bird === currentBird) { LK.setTimeout(function () { spawnNextBird(); }, 700); } } } // Update pigs for (var i = pigs.length - 1; i >= 0; i--) { var pig = pigs[i]; if (!pig.alive) { pigs.splice(i, 1); score += 1000; scoreTxt.setText(score); } } // Update blocks for (var i = blocks.length - 1; i >= 0; i--) { var block = blocks[i]; if (block.broken) { blocks.splice(i, 1); score += 200; scoreTxt.setText(score); } } // Update particles for (var i = particles.length - 1; i >= 0; i--) { var p = particles[i]; p.update(); if (p.life <= 0) { particles.splice(i, 1); } } // Win condition if (!levelCleared && pigs.length === 0) { levelCleared = true; LK.effects.flashScreen(0x00ff00, 800); LK.setTimeout(function () { LK.showYouWin(); }, 1200); } }; // Helper: rectangle-circle collision function rectCircleCollide(rect, circ) { var rx = rect.x, ry = rect.y, rw = rect.width, rh = rect.height; var cx = circ.x, cy = circ.y, cr = circ.radius; var testX = cx, testY = cy; if (cx < rx - rw / 2) testX = rx - rw / 2;else if (cx > rx + rw / 2) testX = rx + rw / 2; if (cy < ry - rh / 2) testY = ry - rh / 2;else if (cy > ry + rh / 2) testY = ry + rh / 2; var distX = cx - testX; var distY = cy - testY; return distX * distX + distY * distY <= cr * cr; } // Helper: circle-circle collision function circleCircleCollide(a, b) { var dx = a.x - b.x, dy = a.y - b.y; var r = a.radius + b.radius; return dx * dx + dy * dy <= r * r; } // Start music LK.playMusic('bgmusic', { fade: { start: 0, end: 1, duration: 1000 } }); // Start level setupLevel();
===================================================================
--- original.js
+++ change.js
@@ -204,18 +204,18 @@
/****
* Game Code
****/
-// Music
-// Sound effects
-// Explosion particle
-// Debris particle
-// Trail particle
-// Slingshot base
-// Block types
-// Pig
-// Bird types
// Camera shake variables
+// Bird types
+// Pig
+// Block types
+// Slingshot base
+// Trail particle
+// Debris particle
+// Explosion particle
+// Sound effects
+// Music
var cameraShakeTime = 0;
var cameraShakeStrength = 0;
// Game state
var birds = [];
@@ -479,10 +479,41 @@
var block = blocks[j];
if (!block.broken && rectCircleCollide(block, bird)) {
block.hit(1);
LK.getSound('hit').play();
+ // Cartoonish bounce and squash effect
+ tween(block, {
+ scaleY: 0.7,
+ scaleX: 1.2
+ }, {
+ duration: 80,
+ easing: tween.easeOut,
+ onFinish: function onFinish() {
+ tween(block, {
+ scaleY: 1,
+ scaleX: 1
+ }, {
+ duration: 120,
+ easing: tween.easeOut
+ });
+ }
+ });
LK.effects.flashObject(block, 0xff0000, 100);
- game.cameraShake(10, 200);
+ // Exaggerated camera shake
+ game.cameraShake(18, 320);
+ // Add a burst of debris for extra cartoon effect
+ for (var d = 0; d < 3; d++) {
+ var p = new Particle();
+ p.init('debris', block.type === 'wood' ? 0xc2b280 : block.type === 'stone' ? 0xaaaaaa : 0x99e6ff);
+ p.x = block.x + (Math.random() - 0.5) * block.width * 0.7;
+ p.y = block.y + (Math.random() - 0.5) * block.height * 0.7;
+ var angle = Math.random() * Math.PI * 2;
+ var speed = 10 + Math.random() * 8;
+ p.vx = Math.cos(angle) * speed;
+ p.vy = Math.sin(angle) * speed - 4;
+ game.addChild(p);
+ particles.push(p);
+ }
triggerSlowmo();
bird.vx *= 0.6;
bird.vy *= 0.6;
}
@@ -492,10 +523,40 @@
var pig = pigs[j];
if (pig.alive && circleCircleCollide(bird, pig)) {
pig.hit(2);
LK.getSound('hit').play();
- LK.effects.flashObject(pig, 0xff00ff, 120);
- game.cameraShake(18, 300);
+ // Pig bounce and color flash
+ tween(pig, {
+ scaleY: 0.6,
+ scaleX: 1.3
+ }, {
+ duration: 90,
+ easing: tween.easeOut,
+ onFinish: function onFinish() {
+ tween(pig, {
+ scaleY: 1,
+ scaleX: 1
+ }, {
+ duration: 140,
+ easing: tween.easeOut
+ });
+ }
+ });
+ LK.effects.flashObject(pig, 0x00ff00, 180);
+ // Big camera shake and a burst of confetti-like debris
+ game.cameraShake(28, 400);
+ for (var d = 0; d < 6; d++) {
+ var p = new Particle();
+ p.init('debris', 0x7ed957);
+ p.x = pig.x + (Math.random() - 0.5) * pig.radius * 1.2;
+ p.y = pig.y + (Math.random() - 0.5) * pig.radius * 1.2;
+ var angle = Math.random() * Math.PI * 2;
+ var speed = 12 + Math.random() * 10;
+ p.vx = Math.cos(angle) * speed;
+ p.vy = Math.sin(angle) * speed - 6;
+ game.addChild(p);
+ particles.push(p);
+ }
triggerSlowmo();
bird.vx *= 0.7;
bird.vy *= 0.7;
score += 500;
Angry Birds red little bird Red. In-Game asset. 2d. High contrast. No shadows
Angry Birds blue little bird. In-Game asset. 2d. High contrast. No shadows
There is a yellow bird named Angry Birds Chuck, do that. In-Game asset. 2d. High contrast. No shadows
flat glass. In-Game asset. 2d. High contrast. No shadows
BloockWood. In-Game asset. 2d. High contrast. No shadows
Pig Angry Bids. In-Game asset. 2d. High contrast. No shadows