/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ // Brotato (player) class var Brotato = Container.expand(function () { var self = Container.call(this); var body = self.attachAsset('brotato', { anchorX: 0.5, anchorY: 0.5 }); self.radius = body.width * 0.5; self.speed = 18; // Movement speed self.fireCooldown = 0; // Ticks until next shot self.fireRate = 30; // Ticks between shots (lower = faster) self.bulletSpeed = 32; self.bulletCount = 1; self.bulletSpread = 0.2; // radians self.damage = 1; self.xp = 0; self.level = 1; self.hp = 5; self.maxHp = 5; // For touch drag self.isDragging = false; // For upgrades self.applyUpgrade = function (upgrade) { if (upgrade === 'firerate') { self.fireRate = Math.max(8, self.fireRate - 4); } else if (upgrade === 'speed') { self.speed += 3; } else if (upgrade === 'damage') { self.damage += 1; } else if (upgrade === 'bullets') { self.bulletCount = Math.min(6, self.bulletCount + 1); } else if (upgrade === 'hp') { self.maxHp += 2; self.hp = self.maxHp; } }; return self; }); // Bullet class var Bullet = Container.expand(function () { var self = Container.call(this); var body = self.attachAsset('bullet', { anchorX: 0.5, anchorY: 0.5 }); self.radius = Math.max(body.width, body.height) * 0.5; self.speed = 32; self.dx = 0; self.dy = 0; self.damage = 1; self.update = function () { self.x += self.dx * self.speed; self.y += self.dy * self.speed; }; return self; }); // Enemy class var Enemy = Container.expand(function () { var self = Container.call(this); var body = self.attachAsset('enemy', { anchorX: 0.5, anchorY: 0.5 }); self.radius = body.width * 0.5; self.speed = 6 + Math.random() * 4; self.hp = 2; self.damage = 1; self.xpValue = 1; // Target to chase (brotato) self.target = null; self.update = function () { if (!self.target) return; var dx = self.target.x - self.x; var dy = self.target.y - self.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist > 0) { self.x += dx / dist * self.speed; self.y += dy / dist * self.speed; } }; return self; }); // Upgrade Button class var UpgradeButton = Container.expand(function () { var self = Container.call(this); var btn = self.attachAsset('upgradeBtn', { anchorX: 0.5, anchorY: 0.5 }); self.text = new Text2('', { size: 60, fill: 0xFFFFFF }); self.text.anchor.set(0.5, 0.5); self.addChild(self.text); self.upgradeType = ''; self.onSelect = null; self.down = function (x, y, obj) { if (typeof self.onSelect === 'function') { self.onSelect(self.upgradeType); } }; return self; }); // XP orb class var XPOrb = Container.expand(function () { var self = Container.call(this); var body = self.attachAsset('xp', { anchorX: 0.5, anchorY: 0.5 }); self.radius = body.width * 0.5; self.value = 1; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x222222 }); /**** * Game Code ****/ // Upgrade button (box, blue) // XP orb (ellipse, green) // Bullet (box, yellow) // Enemy (ellipse, red) // Potato hero (ellipse, brown) // Game state var brotato; var enemies = []; var bullets = []; var xporbs = []; var wave = 1; var waveTimer = 0; var waveDuration = 900; // 15 seconds per wave (60*15) var inUpgrade = false; var upgradeButtons = []; var score = 0; // UI var scoreTxt = new Text2('Score: 0', { size: 100, fill: "#fff" }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); var hpTxt = new Text2('HP: 5/5', { size: 80, fill: "#fff" }); hpTxt.anchor.set(0.5, 0); LK.gui.top.addChild(hpTxt); hpTxt.y = 120; // Level up text var levelTxt = new Text2('', { size: 100, fill: 0xFFE066 }); levelTxt.anchor.set(0.5, 0.5); LK.gui.center.addChild(levelTxt); // Helper: spawn brotato in center function spawnBrotato() { brotato = new Brotato(); brotato.x = 2048 / 2; brotato.y = 2732 / 2; game.addChild(brotato); } // Helper: spawn enemy at random edge function spawnEnemy() { var enemy = new Enemy(); var edge = Math.floor(Math.random() * 4); var margin = 100; if (edge === 0) { // Top enemy.x = margin + Math.random() * (2048 - 2 * margin); enemy.y = -margin; } else if (edge === 1) { // Bottom enemy.x = margin + Math.random() * (2048 - 2 * margin); enemy.y = 2732 + margin; } else if (edge === 2) { // Left enemy.x = -margin; enemy.y = margin + Math.random() * (2732 - 2 * margin); } else { // Right enemy.x = 2048 + margin; enemy.y = margin + Math.random() * (2732 - 2 * margin); } enemy.target = brotato; enemies.push(enemy); game.addChild(enemy); } // Helper: spawn XP orb at (x, y) function spawnXP(x, y, value) { var orb = new XPOrb(); orb.x = x; orb.y = y; orb.value = value || 1; xporbs.push(orb); game.addChild(orb); } // Helper: fire bullets from brotato function fireBullets() { var angleBase = 0; for (var i = 0; i < brotato.bulletCount; i++) { var spread = brotato.bulletCount > 1 ? (i - (brotato.bulletCount - 1) / 2) * brotato.bulletSpread : 0; var angle = angleBase + spread; var bullet = new Bullet(); bullet.x = brotato.x; bullet.y = brotato.y; bullet.dx = Math.cos(angle); bullet.dy = Math.sin(angle); bullet.damage = brotato.damage; bullets.push(bullet); game.addChild(bullet); } } // Helper: show upgrade selection function showUpgradeSelection() { inUpgrade = true; // Remove all enemies and bullets for (var i = 0; i < enemies.length; i++) enemies[i].destroy(); for (var i = 0; i < bullets.length; i++) bullets[i].destroy(); enemies = []; bullets = []; // Show 3 random upgrades var upgrades = [{ type: 'firerate', label: 'Faster Fire Rate' }, { type: 'speed', label: 'Move Speed Up' }, { type: 'damage', label: 'Bullet Damage Up' }, { type: 'bullets', label: 'More Bullets' }, { type: 'hp', label: 'Max HP Up' }]; // Shuffle upgrades for (var i = upgrades.length - 1; i > 0; i--) { var j = Math.floor(Math.random() * (i + 1)); var temp = upgrades[i]; upgrades[i] = upgrades[j]; upgrades[j] = temp; } // Show 3 for (var k = 0; k < 3; k++) { var btn = new UpgradeButton(); btn.x = 2048 / 2; btn.y = 900 + k * 350; btn.text.setText(upgrades[k].label); btn.upgradeType = upgrades[k].type; btn.onSelect = function (type) { // Remove buttons for (var b = 0; b < upgradeButtons.length; b++) { upgradeButtons[b].destroy(); } upgradeButtons = []; brotato.applyUpgrade(type); inUpgrade = false; levelTxt.setText(''); // Start next wave startWave(); }; upgradeButtons.push(btn); game.addChild(btn); } levelTxt.setText('Choose an Upgrade!'); } // Helper: start a wave function startWave() { waveTimer = 0; wave += 1; } // Helper: update UI function updateUI() { scoreTxt.setText('Score: ' + score); hpTxt.setText('HP: ' + brotato.hp + '/' + brotato.maxHp); } // Helper: handle brotato damage function brotatoHit(dmg) { brotato.hp -= dmg; LK.effects.flashObject(brotato, 0xff0000, 400); updateUI(); if (brotato.hp <= 0) { LK.effects.flashScreen(0xff0000, 1000); LK.showGameOver(); } } // Helper: handle brotato level up function brotatoLevelUp() { brotato.level += 1; brotato.xp = 0; levelTxt.setText('Level Up!'); showUpgradeSelection(); } // Helper: get XP needed for next level function xpForLevel(level) { return 5 + Math.floor(level * 2.5); } // Initialize game spawnBrotato(); updateUI(); startWave(); // Touch drag logic var dragNode = null; function handleMove(x, y, obj) { if (inUpgrade) return; if (dragNode) { // Clamp to arena var r = brotato.radius; dragNode.x = Math.max(r, Math.min(2048 - r, x)); dragNode.y = Math.max(r, Math.min(2732 - r, y)); } } game.move = handleMove; game.down = function (x, y, obj) { if (inUpgrade) return; dragNode = brotato; handleMove(x, y, obj); }; game.up = function (x, y, obj) { dragNode = null; }; // Main game loop game.update = function () { if (inUpgrade) return; // Wave timer waveTimer++; if (waveTimer >= waveDuration) { // End of wave: show upgrade showUpgradeSelection(); return; } // Spawn enemies if (LK.ticks % Math.max(20, 60 - wave * 2) === 0) { // More enemies per wave for (var i = 0; i < Math.min(1 + Math.floor(wave / 2), 5); i++) { spawnEnemy(); } } // Brotato auto-fire if (brotato.fireCooldown > 0) { brotato.fireCooldown--; } else { fireBullets(); brotato.fireCooldown = brotato.fireRate; } // Update enemies for (var i = enemies.length - 1; i >= 0; i--) { var enemy = enemies[i]; enemy.update(); // Check collision with brotato var dx = enemy.x - brotato.x; var dy = enemy.y - brotato.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist < enemy.radius + brotato.radius - 10) { brotatoHit(enemy.damage); // Destroy enemy spawnXP(enemy.x, enemy.y, enemy.xpValue); enemy.destroy(); enemies.splice(i, 1); continue; } // Remove if off screen (failsafe) if (enemy.x < -200 || enemy.x > 2248 || enemy.y < -200 || enemy.y > 2932) { enemy.destroy(); enemies.splice(i, 1); } } // Update bullets for (var j = bullets.length - 1; j >= 0; j--) { var bullet = bullets[j]; bullet.update(); // Remove if off screen if (bullet.x < -100 || bullet.x > 2148 || bullet.y < -100 || bullet.y > 2832) { bullet.destroy(); bullets.splice(j, 1); continue; } // Check collision with enemies var hit = false; for (var k = enemies.length - 1; k >= 0; k--) { var enemy = enemies[k]; var dx = bullet.x - enemy.x; var dy = bullet.y - enemy.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist < bullet.radius + enemy.radius - 10) { enemy.hp -= bullet.damage; hit = true; if (enemy.hp <= 0) { spawnXP(enemy.x, enemy.y, enemy.xpValue); enemy.destroy(); enemies.splice(k, 1); score += 1; updateUI(); } break; } } if (hit) { bullet.destroy(); bullets.splice(j, 1); } } // Update XP orbs for (var m = xporbs.length - 1; m >= 0; m--) { var orb = xporbs[m]; // Attract to brotato if close var dx = orb.x - brotato.x; var dy = orb.y - brotato.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist < 300) { var pull = 18; orb.x -= dx / dist * pull; orb.y -= dy / dist * pull; } // Collect if (dist < orb.radius + brotato.radius) { brotato.xp += orb.value; orb.destroy(); xporbs.splice(m, 1); // Level up? if (brotato.xp >= xpForLevel(brotato.level)) { brotatoLevelUp(); return; } } } }; // Play music (if you have a music asset, e.g. 'bgmusic') // LK.playMusic('bgmusic');
===================================================================
--- original.js
+++ change.js
gray bullet. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
Lazy bad kid. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
yellow shining star. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
Brown box with golden corners. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
gray and light gray squares . No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
2d pickle like brotato character with no legs and no arms. In-Game asset. 2d. High contrast. brotato