User prompt
sonic ölünce oyun bitsin
User prompt
sonic ölünce yok olsun
User prompt
silah sonice zarar versin
User prompt
mario ölünce yok olsun ve mario öldükden sonra sonic bize saldırsın
User prompt
dracon ölürse yok olsun
User prompt
sonicede can barı ekle ve bu 3 karakterde ölmeden oyun bitmesin
User prompt
dragonu ödürsek bile sonic yok olmasın ve marioya saldırmasın
User prompt
eyer dragonun ve marioyu öldürdüdükten sonra puanımız 700 olmasa kaybederiz
User prompt
sonic altını oyun başına sadece 3 tane spam olur
User prompt
eyer 30 saniye içinde 3 sonic altını toplamasak bize saldırır
User prompt
sonic altını oluştur
User prompt
sonic için sonic altını toplamalıyız
User prompt
eyer sonice 50 saniye içinde 3 altın toplamasak bize saldırır
User prompt
mario ölürse yok olur
User prompt
marioya silahla saldıra biliriz
User prompt
sonic dragonu öldürürdükden sonra yok olur
User prompt
eyer mario ve dragonu öldürdükten sonra 500 puanı geçemezsek luigi yok olur
User prompt
drogon ölünce kazanmak için marioyu öldürmemiz gerek
User prompt
dragon ölünce yok olsun
User prompt
drogon ölmeli ve ölüdüyünde mario bize saldırsın
User prompt
luigi bize dragonu yemek için bi silah versin
User prompt
dragonun can barı olsun
User prompt
marioya can barı ekle
User prompt
marionun spagathhetisini alınga bize saldırsın
User prompt
SHONİG DE OLSUN VE MARİO İLE KAVGA ETSİN
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1"); /**** * Classes ****/ var Achievement = Container.expand(function (id, title, description, icon) { var self = Container.call(this); self.id = id; self.title = title; self.description = description; self.icon = icon; self.unlocked = false; self.displayTime = 0; // Create achievement notification display var bg = LK.getAsset('achievement_bg', { width: 600, height: 120, color: 0x2C3E50, shape: 'box', anchorX: 0.5, anchorY: 0.5 }); self.addChild(bg); var titleText = new Text2(title, { size: 40, fill: 0xFFD700 }); titleText.anchor.set(0.5, 0); titleText.x = 0; titleText.y = -30; self.addChild(titleText); var descText = new Text2(description, { size: 30, fill: 0xFFFFFF }); descText.anchor.set(0.5, 1); descText.x = 0; descText.y = 30; self.addChild(descText); self.unlock = function () { if (!self.unlocked) { self.unlocked = true; self.show(); // Save to storage storage['achievement_' + self.id] = true; } }; self.show = function () { self.x = 1024; self.y = 200; self.alpha = 0; self.scaleX = 0.5; self.scaleY = 0.5; self.displayTime = 180; // 3 seconds // Animate in tween(self, { alpha: 1, scaleX: 1, scaleY: 1 }, { duration: 500 }); }; self.update = function () { if (self.displayTime > 0) { self.displayTime--; if (self.displayTime <= 0) { // Animate out tween(self, { alpha: 0, scaleX: 0.5, scaleY: 0.5 }, { duration: 500 }); } } }; return self; }); var Dragon = Container.expand(function () { var self = Container.call(this); var dragonGraphics = self.attachAsset('dragon', { anchorX: 0.5, anchorY: 0.5 }); self.baseSpeed = 1.5; self.currentSpeed = self.baseSpeed; self.fireTimer = 0; self.fireInterval = 120; // 2 seconds initially self.health = 150; self.maxHealth = 150; // Create health bar var dragonHealthBarBg = self.attachAsset('dragon_health_bar_bg', { anchorX: 0.5, anchorY: 0.5 }); dragonHealthBarBg.y = -180; var dragonHealthBarFill = self.attachAsset('dragon_health_bar_fill', { anchorX: 0, anchorY: 0.5 }); dragonHealthBarFill.x = -60; dragonHealthBarFill.y = -180; self.update = function () { // Follow player var dx = player.x - self.x; var dy = player.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance > 5) { self.x += dx / distance * self.currentSpeed; self.y += dy / distance * self.currentSpeed; } // Fire breathing timer self.fireTimer++; if (self.fireTimer >= self.fireInterval) { self.breatheFire(); self.fireTimer = 0; } // Adjust difficulty based on score var difficulty = Math.floor(score / 10); self.currentSpeed = self.baseSpeed + difficulty * 0.5; self.fireInterval = Math.max(60, 120 - difficulty * 10); // Update health bar var healthPercent = self.health / self.maxHealth; dragonHealthBarFill.width = 120 * healthPercent; if (healthPercent > 0.6) { dragonHealthBarFill.tint = 0xFF0000; // Red } else if (healthPercent > 0.3) { dragonHealthBarFill.tint = 0xFF4444; // Light Red } else { dragonHealthBarFill.tint = 0xFF8888; // Very Light Red } }; self.breatheFire = function () { var fireball = new Fireball(); fireball.x = self.x; fireball.y = self.y; // Aim towards player var dx = player.x - self.x; var dy = player.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); fireball.directionX = dx / distance; fireball.directionY = dy / distance; fireballs.push(fireball); game.addChild(fireball); LK.getSound('fire').play(); }; self.takeDamage = function (damage) { self.health = Math.max(0, self.health - damage); LK.effects.flashObject(self, 0xFF0000, 300); if (self.health <= 0) { // Dragon is defeated but doesn't die LK.effects.flashObject(self, 0x000000, 1000); self.baseSpeed = 0.5; // Reduced speed but still moves self.currentSpeed = 0.5; self.fireInterval = 999999; // Stop firing } }; return self; }); var Fireball = Container.expand(function () { var self = Container.call(this); var fireballGraphics = self.attachAsset('fireball', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 6; self.directionX = 0; self.directionY = 0; self.lifetime = 300; // 5 seconds self.update = function () { self.x += self.directionX * self.speed; self.y += self.directionY * self.speed; fireballGraphics.rotation += 0.2; fireballGraphics.alpha = Math.sin(LK.ticks * 0.5) * 0.3 + 0.7; self.lifetime--; if (self.lifetime <= 0) { self.shouldDestroy = true; } // Check bounds if (self.x < -100 || self.x > 2148 || self.y < -100 || self.y > 2832) { self.shouldDestroy = true; } }; return self; }); var Gem = Container.expand(function () { var self = Container.call(this); var gemGraphics = self.attachAsset('gem', { anchorX: 0.5, anchorY: 0.5 }); self.points = 25; self.floatOffset = Math.random() * Math.PI * 2; self.update = function () { gemGraphics.y = Math.sin(LK.ticks * 0.15 + self.floatOffset) * 3; gemGraphics.rotation += 0.05; gemGraphics.scaleX = Math.sin(LK.ticks * 0.1 + self.floatOffset) * 0.2 + 1; gemGraphics.scaleY = Math.sin(LK.ticks * 0.1 + self.floatOffset) * 0.2 + 1; }; return self; }); var Luigi = Container.expand(function () { var self = Container.call(this); var luigiGraphics = self.attachAsset('luigi', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 2; self.jumpTimer = 0; self.jumpInterval = 120; // 2 seconds self.isJumping = false; self.jumpHeight = 0; self.maxJumpHeight = 100; self.jumpSpeed = 8; self.direction = 1; // 1 for right, -1 for left self.update = function () { // Move horizontally self.x += self.speed * self.direction; // Bounce off screen edges if (self.x <= 100 || self.x >= 1948) { self.direction *= -1; luigiGraphics.scaleX = self.direction; } // Jump behavior self.jumpTimer++; if (self.jumpTimer >= self.jumpInterval && !self.isJumping) { self.isJumping = true; self.jumpHeight = 0; self.jumpTimer = 0; } if (self.isJumping) { self.jumpHeight += self.jumpSpeed; if (self.jumpHeight >= self.maxJumpHeight) { self.jumpSpeed = -8; } if (self.jumpHeight <= 0 && self.jumpSpeed < 0) { self.jumpHeight = 0; self.jumpSpeed = 8; self.isJumping = false; } luigiGraphics.y = -self.jumpHeight; } // Check if player is close and doesn't have weapon if (!playerWeapon) { var dx = player.x - self.x; var dy = player.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance <= 100) { // Give weapon to player playerWeapon = new Weapon(); playerWeapon.x = player.x; playerWeapon.y = player.y - 50; game.addChild(playerWeapon); LK.effects.flashObject(self, 0x00FF00, 500); updateScore(100); // Bonus for getting weapon } } // Animate Luigi luigiGraphics.rotation = Math.sin(LK.ticks * 0.1) * 0.1; }; return self; }); var Mario = Container.expand(function () { var self = Container.call(this); var marioGraphics = self.attachAsset('mario', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 3; self.targetSpaghetti = null; self.searchTimer = 0; self.searchInterval = 60; // 1 second self.isAngry = false; self.angerTimer = 0; self.angerDuration = 300; // 5 seconds of anger self.attackSpeed = 6; self.health = 100; self.maxHealth = 100; // Create health bar var healthBarBg = self.attachAsset('health_bar_bg', { anchorX: 0.5, anchorY: 0.5 }); healthBarBg.y = -120; var healthBarFill = self.attachAsset('health_bar_fill', { anchorX: 0, anchorY: 0.5 }); healthBarFill.x = -40; healthBarFill.y = -120; self.update = function () { // Search for nearest spaghetti self.searchTimer++; if (self.searchTimer >= self.searchInterval) { self.findNearestSpaghetti(); self.searchTimer = 0; } // Handle anger state if (self.isAngry) { self.angerTimer--; if (self.angerTimer <= 0) { self.isAngry = false; marioGraphics.tint = 0xFFFFFF; // Return to normal color } else { // Attack player when angry var dx = player.x - self.x; var dy = player.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance > 5) { self.x += dx / distance * self.attackSpeed; self.y += dy / distance * self.attackSpeed; // Face the direction of movement marioGraphics.scaleX = dx > 0 ? 1 : -1; } } } else { // Move towards target spaghetti if (self.targetSpaghetti && spaghettis.indexOf(self.targetSpaghetti) !== -1) { var dx = self.targetSpaghetti.x - self.x; var dy = self.targetSpaghetti.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance > 5) { self.x += dx / distance * self.speed; self.y += dy / distance * self.speed; // Face the direction of movement marioGraphics.scaleX = dx > 0 ? 1 : -1; } } else { // Random movement when no spaghetti found self.x += (Math.random() - 0.5) * 2; self.y += (Math.random() - 0.5) * 2; } } // Keep Mario in bounds self.x = Math.max(100, Math.min(1948, self.x)); self.y = Math.max(100, Math.min(2632, self.y)); // Update health bar var healthPercent = self.health / self.maxHealth; healthBarFill.width = 80 * healthPercent; if (healthPercent > 0.6) { healthBarFill.tint = 0x00FF00; // Green } else if (healthPercent > 0.3) { healthBarFill.tint = 0xFFFF00; // Yellow } else { healthBarFill.tint = 0xFF0000; // Red } // Animate Mario marioGraphics.rotation = Math.sin(LK.ticks * 0.1) * 0.05; }; self.findNearestSpaghetti = function () { var nearestDistance = Infinity; var nearestSpaghetti = null; for (var i = 0; i < spaghettis.length; i++) { var spaghetti = spaghettis[i]; var dx = spaghetti.x - self.x; var dy = spaghetti.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance < nearestDistance) { nearestDistance = distance; nearestSpaghetti = spaghetti; } } self.targetSpaghetti = nearestSpaghetti; }; self.becomeAngry = function () { self.isAngry = true; self.angerTimer = self.angerDuration; marioGraphics.tint = 0xFF0000; // Turn red when angry LK.effects.flashObject(self, 0xFF0000, 500); }; self.takeDamage = function (damage) { self.health = Math.max(0, self.health - damage); LK.effects.flashObject(self, 0xFF0000, 300); if (self.health <= 0) { // Mario is defeated and disappears LK.effects.flashObject(self, 0x000000, 1000); self.shouldDestroy = true; // Mark Mario for destruction } }; return self; }); var Player = Container.expand(function () { var self = Container.call(this); var playerGraphics = self.attachAsset('player', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 8; self.invulnerable = false; self.invulnerabilityTime = 0; self.speedBoost = false; self.speedBoostTime = 0; self.update = function () { if (self.invulnerabilityTime > 0) { self.invulnerabilityTime--; playerGraphics.alpha = Math.sin(LK.ticks * 0.3) * 0.5 + 0.5; if (self.invulnerabilityTime <= 0) { self.invulnerable = false; playerGraphics.alpha = 1; } } if (self.speedBoostTime > 0) { self.speedBoostTime--; if (self.speedBoostTime <= 0) { self.speedBoost = false; playerGraphics.tint = 0xFFFFFF; } } }; self.activateInvulnerability = function () { self.invulnerable = true; self.invulnerabilityTime = 120; // 2 seconds at 60fps }; self.activateSpeedBoost = function () { self.speedBoost = true; self.speedBoostTime = 300; // 5 seconds at 60fps playerGraphics.tint = 0x00FFFF; }; return self; }); var PowerUp = Container.expand(function () { var self = Container.call(this); var powerupGraphics = self.attachAsset('powerup', { anchorX: 0.5, anchorY: 0.5 }); self.type = Math.random() < 0.5 ? 'speed' : 'invulnerable'; self.floatOffset = Math.random() * Math.PI * 2; if (self.type === 'invulnerable') { powerupGraphics.tint = 0xFFD700; } self.update = function () { powerupGraphics.y = Math.sin(LK.ticks * 0.2 + self.floatOffset) * 8; powerupGraphics.rotation += 0.1; powerupGraphics.alpha = Math.sin(LK.ticks * 0.3) * 0.3 + 0.7; }; return self; }); var Sonic = Container.expand(function () { var self = Container.call(this); var sonicGraphics = self.attachAsset('sonic', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 4; self.targetMario = null; self.searchTimer = 0; self.searchInterval = 30; // 0.5 seconds self.attackTimer = 0; self.attackInterval = 120; // 2 seconds self.spindashTimer = 0; self.isSpinning = false; self.direction = 1; self.goldTimer = 30 * 60; // 30 seconds at 60fps self.goldCollected = 0; self.goldTarget = 3; self.isAttackingPlayer = false; self.targetPlayer = null; self.health = 80; self.maxHealth = 80; // Create health bar var healthBarBg = self.attachAsset('health_bar_bg', { anchorX: 0.5, anchorY: 0.5 }); healthBarBg.y = -120; var healthBarFill = self.attachAsset('health_bar_fill', { anchorX: 0, anchorY: 0.5 }); healthBarFill.x = -40; healthBarFill.y = -120; self.update = function () { // Update gold collection timer self.goldTimer--; if (self.goldTimer <= 0 && self.goldCollected < self.goldTarget) { self.isAttackingPlayer = true; self.targetPlayer = player; sonicGraphics.tint = 0xFF0000; // Turn red when attacking player } // Behavior based on current state if (self.isAttackingPlayer && self.targetPlayer) { // Attack player mode var dx = self.targetPlayer.x - self.x; var dy = self.targetPlayer.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance > 5) { self.x += dx / distance * (self.speed * 1.5); // Faster when attacking player self.y += dy / distance * (self.speed * 1.5); sonicGraphics.scaleX = dx > 0 ? 1 : -1; self.direction = dx > 0 ? 1 : -1; } } else if (self.goldCollected < self.goldTarget) { // Gold collection mode - search for gems (gold) self.searchTimer++; if (self.searchTimer >= self.searchInterval) { self.findNearestGem(); self.searchTimer = 0; } // Move towards nearest gem if (self.targetGem && gems.indexOf(self.targetGem) !== -1) { var dx = self.targetGem.x - self.x; var dy = self.targetGem.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance > 5) { self.x += dx / distance * self.speed; self.y += dy / distance * self.speed; sonicGraphics.scaleX = dx > 0 ? 1 : -1; self.direction = dx > 0 ? 1 : -1; } } else { // Search pattern movement self.x += Math.sin(LK.ticks * 0.02) * 3; self.y += Math.cos(LK.ticks * 0.015) * 2; } } else { // Normal mode (after collecting enough gold) - but only attack Mario if dragon is alive if (!dragon.isDead) { self.searchTimer++; if (self.searchTimer >= self.searchInterval) { self.findMario(); self.searchTimer = 0; } // Move towards Mario for combat if (self.targetMario && marios.indexOf(self.targetMario) !== -1) { var dx = self.targetMario.x - self.x; var dy = self.targetMario.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance > 80) { // Move towards Mario self.x += dx / distance * self.speed; self.y += dy / distance * self.speed; sonicGraphics.scaleX = dx > 0 ? 1 : -1; self.direction = dx > 0 ? 1 : -1; } else { // Close enough to attack - start spindash self.attackTimer++; if (self.attackTimer >= self.attackInterval && !self.isSpinning) { self.startSpindash(); self.attackTimer = 0; } } } else { // Search pattern movement self.x += Math.sin(LK.ticks * 0.02) * 3; self.y += Math.cos(LK.ticks * 0.015) * 2; } } else { // Dragon is dead - peaceful mode, just wander around self.x += Math.sin(LK.ticks * 0.01) * 2; self.y += Math.cos(LK.ticks * 0.008) * 1.5; } } // Handle spindash attack if (self.isSpinning) { self.spindashTimer++; sonicGraphics.rotation += 0.5; sonicGraphics.scaleX = Math.sin(LK.ticks * 0.3) * 0.2 + 0.8; sonicGraphics.scaleY = Math.sin(LK.ticks * 0.3) * 0.2 + 0.8; if (self.spindashTimer >= 60) { self.isSpinning = false; self.spindashTimer = 0; sonicGraphics.rotation = 0; sonicGraphics.scaleX = self.direction; sonicGraphics.scaleY = 1; } } // Keep Sonic in bounds self.x = Math.max(100, Math.min(1948, self.x)); self.y = Math.max(100, Math.min(2632, self.y)); // Update health bar var healthPercent = self.health / self.maxHealth; healthBarFill.width = 80 * healthPercent; if (healthPercent > 0.6) { healthBarFill.tint = 0x00FF00; // Green } else if (healthPercent > 0.3) { healthBarFill.tint = 0xFFFF00; // Yellow } else { healthBarFill.tint = 0xFF0000; // Red } // Idle animation when not spinning if (!self.isSpinning) { sonicGraphics.y = Math.sin(LK.ticks * 0.15) * 2; } }; self.findMario = function () { var nearestDistance = Infinity; var nearestMario = null; for (var i = 0; i < marios.length; i++) { var mario = marios[i]; var dx = mario.x - self.x; var dy = mario.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance < nearestDistance) { nearestDistance = distance; nearestMario = mario; } } self.targetMario = nearestMario; }; self.findNearestGem = function () { var nearestDistance = Infinity; var nearestGem = null; // First check for sonic gold (priority) for (var i = 0; i < sonicGolds.length; i++) { var sonicGold = sonicGolds[i]; var dx = sonicGold.x - self.x; var dy = sonicGold.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance < nearestDistance) { nearestDistance = distance; nearestGem = sonicGold; } } // Then check regular gems if no sonic gold found if (!nearestGem) { for (var i = 0; i < gems.length; i++) { var gem = gems[i]; var dx = gem.x - self.x; var dy = gem.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance < nearestDistance) { nearestDistance = distance; nearestGem = gem; } } } self.targetGem = nearestGem; }; self.startSpindash = function () { self.isSpinning = true; self.spindashTimer = 0; // Flash blue to indicate attack LK.effects.flashObject(self, 0x0066FF, 200); }; self.takeDamage = function (damage) { self.health = Math.max(0, self.health - damage); LK.effects.flashObject(self, 0xFF0000, 300); if (self.health <= 0) { // Sonic is defeated and disappears LK.effects.flashObject(self, 0x000000, 1000); self.shouldDestroy = true; // Mark Sonic for destruction } }; return self; }); var SonicGold = Container.expand(function () { var self = Container.call(this); var sonicGoldGraphics = self.attachAsset('sonic_gold', { anchorX: 0.5, anchorY: 0.5 }); self.points = 30; self.floatOffset = Math.random() * Math.PI * 2; // Give it a special blue tint to distinguish from regular gems sonicGoldGraphics.tint = 0x0066FF; self.update = function () { sonicGoldGraphics.y = Math.sin(LK.ticks * 0.18 + self.floatOffset) * 4; sonicGoldGraphics.rotation += 0.08; sonicGoldGraphics.scaleX = Math.sin(LK.ticks * 0.12 + self.floatOffset) * 0.25 + 1; sonicGoldGraphics.scaleY = Math.sin(LK.ticks * 0.12 + self.floatOffset) * 0.25 + 1; // Special pulsing effect sonicGoldGraphics.alpha = Math.sin(LK.ticks * 0.2) * 0.3 + 0.7; }; return self; }); var Spaghetti = Container.expand(function () { var self = Container.call(this); var spaghettiGraphics = self.attachAsset('spaghetti', { anchorX: 0.5, anchorY: 0.5 }); self.points = 15; self.floatOffset = Math.random() * Math.PI * 2; self.update = function () { spaghettiGraphics.y = Math.sin(LK.ticks * 0.12 + self.floatOffset) * 4; spaghettiGraphics.rotation += 0.03; spaghettiGraphics.scaleX = Math.sin(LK.ticks * 0.08 + self.floatOffset) * 0.1 + 1; spaghettiGraphics.scaleY = Math.sin(LK.ticks * 0.08 + self.floatOffset) * 0.1 + 1; }; return self; }); var Treasure = Container.expand(function () { var self = Container.call(this); var treasureGraphics = self.attachAsset('treasure', { anchorX: 0.5, anchorY: 0.5 }); self.points = 10; self.floatOffset = Math.random() * Math.PI * 2; self.update = function () { treasureGraphics.y = Math.sin(LK.ticks * 0.1 + self.floatOffset) * 5; treasureGraphics.rotation += 0.02; }; return self; }); var Weapon = Container.expand(function () { var self = Container.call(this); var weaponGraphics = self.attachAsset('weapon', { anchorX: 0.5, anchorY: 0.5 }); self.damage = 25; self.cooldown = 0; self.maxCooldown = 30; // 0.5 seconds self.range = 150; self.isActive = false; self.update = function () { if (self.cooldown > 0) { self.cooldown--; } // Rotate weapon around player weaponGraphics.rotation += 0.2; // Pulse effect when ready to use if (self.cooldown <= 0) { weaponGraphics.alpha = Math.sin(LK.ticks * 0.3) * 0.3 + 0.7; weaponGraphics.scaleX = Math.sin(LK.ticks * 0.2) * 0.2 + 1; weaponGraphics.scaleY = Math.sin(LK.ticks * 0.2) * 0.2 + 1; } else { weaponGraphics.alpha = 0.5; weaponGraphics.scaleX = 0.8; weaponGraphics.scaleY = 0.8; } }; self.attack = function (target) { if (self.cooldown <= 0) { var dx = target.x - self.x; var dy = target.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance <= self.range) { target.takeDamage(self.damage); self.cooldown = self.maxCooldown; LK.effects.flashObject(self, 0xFFFFFF, 300); LK.getSound('weapon_hit').play(); return true; } } return false; }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x8B4513 }); /**** * Game Code ****/ game.setBackgroundColor(0xDEB887); // Game variables var score = 0; var health = 250; var maxHealth = 250; var gameTimer = 80 * 60; // 1 minute 20 seconds (80 seconds) at 60fps var treasures = []; var gems = []; var powerups = []; var fireballs = []; var luigis = []; var marios = []; var spaghettis = []; var sonics = []; var sonicGolds = []; var treasureSpawnTimer = 0; var gemSpawnTimer = 0; var powerupSpawnTimer = 0; var luigiSpawnTimer = 0; var spaghettiSpawnTimer = 0; var sonicGoldSpawnTimer = 0; var sonicGoldSpawnCount = 0; var maxSonicGoldSpawns = 3; var playerWeapon = null; // Achievement system var achievements = []; var activeAchievements = []; var achievementStats = { treasuresCollected: 0, gemsCollected: 0, powerupsCollected: 0, dragonHits: 0, fireballsAvoided: 0, survivalTime: 0, maxScore: 0 }; // Initialize achievements function initializeAchievements() { achievements = [new Achievement('first_treasure', 'First Treasure!', 'Collect your first treasure', '💰'), new Achievement('treasure_hunter', 'Treasure Hunter', 'Collect 10 treasures', '🏆'), new Achievement('gem_collector', 'Gem Collector', 'Collect 5 gems', '💎'), new Achievement('survivor', 'Survivor', 'Survive for 30 seconds', '⏰'), new Achievement('speed_demon', 'Speed Demon', 'Use 3 speed power-ups', '⚡'), new Achievement('invincible', 'Invincible', 'Use 3 invulnerability power-ups', '🛡️'), new Achievement('score_master', 'Score Master', 'Reach 200 points', '🎯'), new Achievement('dragon_dancer', 'Dragon Dancer', 'Get hit by dragon 5 times and survive', '🐉'), new Achievement('high_scorer', 'High Scorer', 'Reach 300 points', '🌟'), new Achievement('ultimate_survivor', 'Ultimate Survivor', 'Survive for 60 seconds', '👑')]; // Load unlocked achievements from storage for (var i = 0; i < achievements.length; i++) { var achievement = achievements[i]; if (storage['achievement_' + achievement.id]) { achievement.unlocked = true; } } } function checkAchievements() { for (var i = 0; i < achievements.length; i++) { var achievement = achievements[i]; if (!achievement.unlocked) { var shouldUnlock = false; switch (achievement.id) { case 'first_treasure': shouldUnlock = achievementStats.treasuresCollected >= 1; break; case 'treasure_hunter': shouldUnlock = achievementStats.treasuresCollected >= 10; break; case 'gem_collector': shouldUnlock = achievementStats.gemsCollected >= 5; break; case 'survivor': shouldUnlock = achievementStats.survivalTime >= 30 * 60; break; case 'speed_demon': shouldUnlock = achievementStats.powerupsCollected >= 3; break; case 'invincible': shouldUnlock = achievementStats.powerupsCollected >= 3; break; case 'score_master': shouldUnlock = score >= 200; break; case 'dragon_dancer': shouldUnlock = achievementStats.dragonHits >= 5; break; case 'high_scorer': shouldUnlock = score >= 300; break; case 'ultimate_survivor': shouldUnlock = achievementStats.survivalTime >= 60 * 60; break; } if (shouldUnlock) { achievement.unlock(); activeAchievements.push(achievement); game.addChild(achievement); } } } } // Initialize achievements initializeAchievements(); // Create player var player = game.addChild(new Player()); player.x = 1024; player.y = 1366; // Create dragon var dragon = game.addChild(new Dragon()); dragon.x = 200; dragon.y = 200; // Create Luigi monster var luigi = game.addChild(new Luigi()); luigi.x = 1500; luigi.y = 1000; luigis.push(luigi); // Create Mario character var mario = game.addChild(new Mario()); mario.x = 300; mario.y = 800; marios.push(mario); // Create Sonic character var sonic = game.addChild(new Sonic()); sonic.x = 1700; sonic.y = 600; sonics.push(sonic); // UI Elements var scoreTxt = new Text2('Score: 0', { size: 80, fill: 0xFFFFFF }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); var healthTxt = new Text2('Health: 250/250', { size: 60, fill: 0x00FF00 }); healthTxt.anchor.set(0, 0); healthTxt.x = 120; healthTxt.y = 20; LK.gui.addChild(healthTxt); var timerTxt = new Text2('Time: 1:20', { size: 70, fill: 0xFFFFFF }); timerTxt.anchor.set(1, 0); timerTxt.x = 2048 - 20; timerTxt.y = 20; LK.gui.addChild(timerTxt); var instructionTxt = new Text2('Tap to move! Get close to Luigi for weapon to defeat dragon!', { size: 50, fill: 0xFFFFFF }); instructionTxt.anchor.set(0.5, 1); LK.gui.bottom.addChild(instructionTxt); // Game logic functions function spawnTreasure() { var treasure = new Treasure(); treasure.x = Math.random() * 1800 + 124; treasure.y = Math.random() * 2400 + 166; treasures.push(treasure); game.addChild(treasure); } function spawnGem() { var gem = new Gem(); gem.x = Math.random() * 1800 + 124; gem.y = Math.random() * 2400 + 166; gems.push(gem); game.addChild(gem); } function spawnPowerUp() { var powerup = new PowerUp(); powerup.x = Math.random() * 1800 + 124; powerup.y = Math.random() * 2400 + 166; powerups.push(powerup); game.addChild(powerup); } function spawnSpaghetti() { var spaghetti = new Spaghetti(); spaghetti.x = Math.random() * 1800 + 124; spaghetti.y = Math.random() * 2400 + 166; spaghettis.push(spaghetti); game.addChild(spaghetti); } function spawnSonicGold() { if (sonicGoldSpawnCount < maxSonicGoldSpawns) { var sonicGold = new SonicGold(); sonicGold.x = Math.random() * 1800 + 124; sonicGold.y = Math.random() * 2400 + 166; sonicGolds.push(sonicGold); game.addChild(sonicGold); } } function updateScore(points) { score += points; scoreTxt.setText('Score: ' + score); LK.setScore(score); } function updateHealth(damage) { health = Math.max(0, health - damage); healthTxt.setText('Health: ' + health + '/' + maxHealth); // Change color based on health percentage var healthPercent = health / maxHealth; if (healthPercent > 0.6) { healthTxt.fill = 0x00FF00; // Green } else if (healthPercent > 0.3) { healthTxt.fill = 0xFFFF00; // Yellow } else { healthTxt.fill = 0xFF0000; // Red } if (health <= 0) { LK.effects.flashScreen(0xFF0000, 1000); LK.showGameOver(); } } function updateTimer() { gameTimer = Math.max(0, gameTimer - 1); var totalSeconds = Math.floor(gameTimer / 60); var minutes = Math.floor(totalSeconds / 60); var seconds = totalSeconds % 60; var timeText = minutes + ':' + (seconds < 10 ? '0' : '') + seconds; timerTxt.setText('Time: ' + timeText); // Change color based on remaining time if (gameTimer <= 10 * 60) { // Last 10 seconds timerTxt.fill = 0xFF0000; // Red } else if (gameTimer <= 30 * 60) { // Last 30 seconds timerTxt.fill = 0xFFFF00; // Yellow } else { timerTxt.fill = 0xFFFFFF; // White } if (gameTimer <= 0) { LK.effects.flashScreen(0xFF0000, 1000); LK.showGameOver(); } } // Touch controls var targetX = player.x; var targetY = player.y; game.down = function (x, y, obj) { targetX = x; targetY = y; // Attack dragon with weapon if player has one if (playerWeapon) { playerWeapon.attack(dragon); // Also attack any Mario in range for (var i = 0; i < marios.length; i++) { var mario = marios[i]; if (mario.health > 0) { playerWeapon.attack(mario); } } // Also attack any Sonic in range for (var i = 0; i < sonics.length; i++) { var sonic = sonics[i]; playerWeapon.attack(sonic); } } }; game.move = function (x, y, obj) { targetX = x; targetY = y; }; // Game update loop game.update = function () { // Update timer updateTimer(); // Move player towards target var dx = targetX - player.x; var dy = targetY - player.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance > 5) { var speed = player.speedBoost ? player.speed * 1.5 : player.speed; player.x += dx / distance * speed; player.y += dy / distance * speed; } // Keep player in bounds player.x = Math.max(40, Math.min(2008, player.x)); player.y = Math.max(40, Math.min(2692, player.y)); // Update weapon position if player has one if (playerWeapon) { playerWeapon.x = player.x; playerWeapon.y = player.y - 50; // Auto-attack dragon when in range var dx = dragon.x - playerWeapon.x; var dy = dragon.y - playerWeapon.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance <= playerWeapon.range) { playerWeapon.attack(dragon); } // Auto-attack Mario when in range for (var i = 0; i < marios.length; i++) { var mario = marios[i]; if (mario.health > 0) { var dx = mario.x - playerWeapon.x; var dy = mario.y - playerWeapon.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance <= playerWeapon.range) { playerWeapon.attack(mario); } } } // Auto-attack Sonic when in range for (var i = 0; i < sonics.length; i++) { var sonic = sonics[i]; var dx = sonic.x - playerWeapon.x; var dy = sonic.y - playerWeapon.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance <= playerWeapon.range) { playerWeapon.attack(sonic); } } } // Spawn treasures treasureSpawnTimer++; if (treasureSpawnTimer >= 90) { // Every 1.5 seconds spawnTreasure(); treasureSpawnTimer = 0; } // Spawn gems gemSpawnTimer++; if (gemSpawnTimer >= 180) { // Every 3 seconds spawnGem(); gemSpawnTimer = 0; } // Spawn power-ups powerupSpawnTimer++; if (powerupSpawnTimer >= 600) { // Every 10 seconds spawnPowerUp(); powerupSpawnTimer = 0; } // Spawn spaghetti spaghettiSpawnTimer++; if (spaghettiSpawnTimer >= 120) { // Every 2 seconds spawnSpaghetti(); spaghettiSpawnTimer = 0; } // Spawn sonic gold sonicGoldSpawnTimer++; if (sonicGoldSpawnTimer >= 240 && sonicGoldSpawnCount < maxSonicGoldSpawns) { // Every 4 seconds, but only up to maximum allowed spawnSonicGold(); sonicGoldSpawnTimer = 0; sonicGoldSpawnCount++; } // Check treasure collection for (var i = treasures.length - 1; i >= 0; i--) { var treasure = treasures[i]; if (player.intersects(treasure)) { updateScore(treasure.points); achievementStats.treasuresCollected++; LK.effects.flashObject(treasure, 0xFFFFFF, 300); treasure.destroy(); treasures.splice(i, 1); LK.getSound('collect').play(); } } // Check gem collection for (var i = gems.length - 1; i >= 0; i--) { var gem = gems[i]; if (player.intersects(gem)) { updateScore(gem.points); achievementStats.gemsCollected++; LK.effects.flashObject(gem, 0xFFFFFF, 300); gem.destroy(); gems.splice(i, 1); LK.getSound('collect').play(); } } // Check power-up collection for (var i = powerups.length - 1; i >= 0; i--) { var powerup = powerups[i]; if (player.intersects(powerup)) { if (powerup.type === 'speed') { player.activateSpeedBoost(); } else if (powerup.type === 'invulnerable') { player.activateInvulnerability(); } achievementStats.powerupsCollected++; LK.effects.flashObject(powerup, 0xFFFFFF, 300); powerup.destroy(); powerups.splice(i, 1); LK.getSound('powerup').play(); } } // Check Mario spaghetti collection for (var i = marios.length - 1; i >= 0; i--) { var mario = marios[i]; for (var j = spaghettis.length - 1; j >= 0; j--) { var spaghetti = spaghettis[j]; if (mario.intersects(spaghetti)) { updateScore(spaghetti.points); LK.effects.flashObject(spaghetti, 0xFFD700, 300); spaghetti.destroy(); spaghettis.splice(j, 1); LK.getSound('collect').play(); break; } } } // Check player spaghetti collection for (var i = spaghettis.length - 1; i >= 0; i--) { var spaghetti = spaghettis[i]; if (player.intersects(spaghetti)) { updateScore(spaghetti.points); LK.effects.flashObject(spaghetti, 0xFFD700, 300); // Make all Marios angry when player steals spaghetti for (var j = 0; j < marios.length; j++) { var mario = marios[j]; if (!mario.isAngry) { mario.becomeAngry(); } } spaghetti.destroy(); spaghettis.splice(i, 1); LK.getSound('collect').play(); } } // Check if dragon is defeated and should disappear if (dragon.health <= 0 && !dragon.isDead) { dragon.isDead = true; // Make all Marios angry when dragon is defeated for (var j = 0; j < marios.length; j++) { var mario = marios[j]; if (!mario.isAngry) { mario.becomeAngry(); } } // Sonics remain in the game when dragon is defeated - they will no longer attack Mario for (var k = 0; k < sonics.length; k++) { var sonic = sonics[k]; sonic.isAttackingPlayer = false; // Stop attacking player sonic.targetMario = null; // Clear Mario target sonic.targetPlayer = null; // Clear player target sonicGraphics = sonic.children[0]; // Get sonic graphics if (sonicGraphics) { sonicGraphics.tint = 0xFFFFFF; // Return to normal color } } LK.effects.flashScreen(0x00FF00, 1000); // Green flash for dragon defeat updateScore(200); // Bonus points for defeating dragon // Dragon disappears from the game dragon.destroy(); } // Check if any Mario has died and make Sonics attack player for (var i = marios.length - 1; i >= 0; i--) { var mario = marios[i]; if (mario.shouldDestroy) { // Mario is dead, make all Sonics attack player for (var j = 0; j < sonics.length; j++) { var sonic = sonics[j]; sonic.isAttackingPlayer = true; sonic.targetPlayer = player; var sonicGraphics = sonic.children[0]; if (sonicGraphics) { sonicGraphics.tint = 0xFF0000; // Turn red when attacking player } } // Remove Mario from game mario.destroy(); marios.splice(i, 1); } } // Check if any Sonic has died and remove them for (var i = sonics.length - 1; i >= 0; i--) { var sonic = sonics[i]; if (sonic.shouldDestroy) { // Sonic died - game over LK.effects.flashScreen(0xFF0000, 1000); LK.showGameOver(); // Remove Sonic from game sonic.destroy(); sonics.splice(i, 1); } } // Game continues until timer runs out or player dies // Check dragon collision if (!player.invulnerable && player.intersects(dragon)) { if (!player.lastDragonHit) { updateHealth(50); achievementStats.dragonHits++; player.activateInvulnerability(); LK.effects.flashScreen(0xFF0000, 500); player.lastDragonHit = true; } } else { player.lastDragonHit = false; } // Check fireball collisions for (var i = fireballs.length - 1; i >= 0; i--) { var fireball = fireballs[i]; if (fireball.shouldDestroy) { fireball.destroy(); fireballs.splice(i, 1); continue; } if (!player.invulnerable && player.intersects(fireball)) { if (!fireball.hasHit) { updateHealth(25); player.activateInvulnerability(); LK.effects.flashScreen(0xFF0000, 300); fireball.hasHit = true; fireball.shouldDestroy = true; } } } // Check Luigi collisions for (var i = luigis.length - 1; i >= 0; i--) { var luigi = luigis[i]; if (!player.invulnerable && player.intersects(luigi)) { if (!luigi.lastHit) { updateHealth(30); player.activateInvulnerability(); LK.effects.flashScreen(0x00FF00, 400); luigi.lastHit = true; } } else { luigi.lastHit = false; } } // Check angry Mario attacking player for (var i = marios.length - 1; i >= 0; i--) { var mario = marios[i]; if (mario.isAngry && !player.invulnerable && player.intersects(mario)) { if (!mario.lastPlayerHit) { updateHealth(40); player.activateInvulnerability(); LK.effects.flashScreen(0xFF0000, 400); mario.lastPlayerHit = true; } } else { mario.lastPlayerHit = false; } } // Check sonic gold collection (special gold for Sonic) for (var i = sonicGolds.length - 1; i >= 0; i--) { var sonicGold = sonicGolds[i]; if (player.intersects(sonicGold)) { // Check if any Sonic needs gold var goldGivenToSonic = false; for (var j = 0; j < sonics.length; j++) { var sonic = sonics[j]; if (sonic.goldCollected < sonic.goldTarget) { sonic.goldCollected++; goldGivenToSonic = true; LK.effects.flashObject(sonic, 0x0066FF, 500); // Flash Sonic to show he received gold break; } } if (goldGivenToSonic) { updateScore(sonicGold.points); achievementStats.gemsCollected++; LK.effects.flashObject(sonicGold, 0x0066FF, 300); // Blue flash for Sonic gold sonicGold.destroy(); sonicGolds.splice(i, 1); LK.getSound('collect').play(); } else { // Normal collection if no Sonic needs gold updateScore(sonicGold.points); achievementStats.gemsCollected++; LK.effects.flashObject(sonicGold, 0xFFD700, 300); sonicGold.destroy(); sonicGolds.splice(i, 1); LK.getSound('collect').play(); } } } // Check if player collects gems for Sonic for (var i = gems.length - 1; i >= 0; i--) { var gem = gems[i]; if (player.intersects(gem)) { // Check if any Sonic needs gold var goldGivenToSonic = false; for (var j = 0; j < sonics.length; j++) { var sonic = sonics[j]; if (sonic.goldCollected < sonic.goldTarget) { sonic.goldCollected++; goldGivenToSonic = true; LK.effects.flashObject(sonic, 0x0066FF, 300); // Flash Sonic to show he received gold break; } } if (goldGivenToSonic) { updateScore(gem.points); achievementStats.gemsCollected++; LK.effects.flashObject(gem, 0xFFD700, 300); // Gold flash for Sonic collection gem.destroy(); gems.splice(i, 1); LK.getSound('collect').play(); } else { // Normal gem collection if no Sonic needs gold updateScore(gem.points); achievementStats.gemsCollected++; LK.effects.flashObject(gem, 0xFFFFFF, 300); gem.destroy(); gems.splice(i, 1); LK.getSound('collect').play(); } } } // Check Sonic attacking player for (var i = sonics.length - 1; i >= 0; i--) { var sonic = sonics[i]; if (sonic.isAttackingPlayer && !player.invulnerable && player.intersects(sonic)) { if (!sonic.lastPlayerHit) { updateHealth(35); player.activateInvulnerability(); LK.effects.flashScreen(0x0066FF, 400); sonic.lastPlayerHit = true; } } else { sonic.lastPlayerHit = false; } } // Check Sonic vs Mario combat for (var i = sonics.length - 1; i >= 0; i--) { var sonic = sonics[i]; for (var j = marios.length - 1; j >= 0; j--) { var mario = marios[j]; if (sonic.intersects(mario)) { if (!sonic.lastMarioHit && sonic.isSpinning) { // Sonic hits Mario during spindash mario.takeDamage(20); LK.effects.flashObject(mario, 0xFF0000, 500); LK.effects.flashObject(sonic, 0x0066FF, 300); updateScore(50); // Bonus points for combat sonic.lastMarioHit = true; } else if (!mario.lastSonicHit && !sonic.isSpinning) { // Mario hits Sonic when not spinning LK.effects.flashObject(sonic, 0xFF0000, 500); LK.effects.flashObject(mario, 0x00FF00, 300); updateScore(30); // Bonus points for combat mario.lastSonicHit = true; } } else { sonic.lastMarioHit = false; mario.lastSonicHit = false; } } } // Spawn additional Luigis based on score luigiSpawnTimer++; if (luigiSpawnTimer >= 1800 && score >= 100) { // Every 30 seconds after score 100 var newLuigi = new Luigi(); newLuigi.x = Math.random() * 1800 + 124; newLuigi.y = Math.random() * 2000 + 500; luigis.push(newLuigi); game.addChild(newLuigi); luigiSpawnTimer = 0; } // Update achievement stats achievementStats.survivalTime++; if (score > achievementStats.maxScore) { achievementStats.maxScore = score; } // Check for new achievements checkAchievements(); // Update active achievement displays for (var i = activeAchievements.length - 1; i >= 0; i--) { var achievement = activeAchievements[i]; if (achievement.displayTime <= 0 && achievement.alpha <= 0) { achievement.destroy(); activeAchievements.splice(i, 1); } } // Win condition if (score >= 500) { LK.showYouWin(); } }; // Start background music LK.playMusic('desert'); // Initial treasures for (var i = 0; i < 3; i++) { spawnTreasure(); } // Initial spaghetti for (var i = 0; i < 2; i++) { spawnSpaghetti(); } // Initial sonic gold - removed to respect 3 total limit ;
===================================================================
--- original.js
+++ change.js
@@ -1218,8 +1218,11 @@
// Check if any Sonic has died and remove them
for (var i = sonics.length - 1; i >= 0; i--) {
var sonic = sonics[i];
if (sonic.shouldDestroy) {
+ // Sonic died - game over
+ LK.effects.flashScreen(0xFF0000, 1000);
+ LK.showGameOver();
// Remove Sonic from game
sonic.destroy();
sonics.splice(i, 1);
}
CREATE THIS IMAGE. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
MAKE THIS PICTURE LIKE A FIREBALL. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
DESIGN THIS PICTURE AS AN ENERGY DRINK. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
LUİGİ KARAKTERİNİ OLUŞTUR. In-Game asset. 2d. High contrast. No shadows
KORKAK BİR ADAM. In-Game asset. 2d. High contrast. No shadows
BÜYÜK BİR EJDER. In-Game asset. 2d. High contrast. No shadows
MARİO. In-Game asset. 2d. High contrast. No shadows
SPAGHETTİ. In-Game asset. 2d. High contrast. No shadows
sonic. In-Game asset. 2d. High contrast. No shadows
silah. In-Game asset. 2d. High contrast. No shadows
sonic altını. In-Game asset. 2d. High contrast. No shadows