Code edit (2 edits merged)
Please save this source code
User prompt
Please fix the bug: 'initialSpawn is not defined' in or related to this line: 'initialSpawn();' Line Number: 778
User prompt
Please fix the bug: 'ReferenceError: quantumSelectionActive is not defined' in or related to this line: 'if (quantumSelectionActive) {' Line Number: 746
User prompt
Please fix the bug: 'ReferenceError: upgradeMenu is not defined' in or related to this line: 'if (upgradeMenu.parent) {' Line Number: 733
User prompt
Please fix the bug: 'ReferenceError: droneObjects is not defined' in or related to this line: 'for (var i = 0; i < droneObjects.length; i++) {' Line Number: 715
User prompt
Please fix the bug: 'ReferenceError: clusters is not defined' in or related to this line: 'clusters.forEach(function (c) {' Line Number: 167
User prompt
Please fix the bug: 'updateUI is not defined' in or related to this line: 'updateUI();' Line Number: 783
User prompt
Please fix the bug: 'initialSpawn is not defined' in or related to this line: 'initialSpawn();' Line Number: 778
Code edit (5 edits merged)
Please save this source code
User prompt
Please fix the bug: 'TypeError: Cannot read properties of undefined (reading 'elapsed')' in or related to this line: 'self.y += Math.sin(LK.time.elapsed / 250) * 0.5;' Line Number: 262
User prompt
var Drone = Container.expand(function () { var self = Container.call(this); // Attach the drone sprite self.droneSprite = LK.getAsset('drone_asset', { anchorX: 0.5, anchorY: 0.5 }); self.addChild(self.droneSprite); // Movement self.vx = (Math.random() - 0.5) * 6; // random velocity x self.vy = (Math.random() - 0.5) * 6; // random velocity y self.speed = 3; self.changeDirCounter = 0; // how many frames until we pick new direction // AoE stats self.AOE_RANGE = 100; self.droneDamage = 2; // how much damage each zap deals (tweak as needed) self.cooldown = 0; // frames self.COOLDOWN_MAX = 60; // 1 second if your game is ~60fps self.updateDrone = function () { // 1) Movement if (self.changeDirCounter <= 0) { // pick new random direction occasionally self.vx = (Math.random() - 0.5) * self.speed; self.vy = (Math.random() - 0.5) * self.speed; self.changeDirCounter = 120; // every 2s } else { self.changeDirCounter--; } // update position self.x += self.vx; self.y += self.vy; // bounce off edges (assuming 2048x2732 stage) if (self.x < 50 || self.x > 2000) self.vx *= -1; if (self.y < 50 || self.y > 2682) self.vy *= -1; // 2) AoE Zap if cooldown is ready if (self.cooldown > 0) { self.cooldown--; } else { self.tryZap(); } }; self.tryZap = function () { // Find any ore within AOE_RANGE // We'll gather a list of clusters or single ores within range var anyHit = false; clusters.forEach(function (cluster) { cluster.oreList.forEach(function (ore) { if (ore.health > 0) { var oreGlobalX = cluster.x + ore.x; var oreGlobalY = cluster.y + ore.y; var dx = self.x - oreGlobalX; var dy = self.y - oreGlobalY; var dist = Math.sqrt(dx*dx + dy*dy); if (dist < self.AOE_RANGE) { // deal damage ore.health -= self.droneDamage; anyHit = true; if (ore.health <= 0) { var baseValue = ore.getValue(); gameState.money += baseValue; updateUI(); ore.cluster.notifyOreDestroyed(ore); spawnMiningParticles(ore, 5); } } } }); }); // If we zapped anything, apply cooldown if (anyHit) { self.cooldown = self.COOLDOWN_MAX; } }; return self; }); game.update = function () { // existing miner update if (miner) miner.update(); // your other logic (clusters, etc.) // update each drone for (var i = 0; i < droneObjects.length; i++) { droneObjects[i].updateDrone(); } }; { id: 'drone_level_1', name: 'Buy Drones (Lv +1)', cost: 5000, effect: 'Each level adds another drone that roams & AoE zaps', purchased: false, multi: true, level: 0, action: function () { if (!gameState.droneLevel) gameState.droneLevel = 0; gameState.droneLevel++; this.level++; this.cost = Math.floor(this.cost * 1.5); updateDroneObjects(); } } var droneObjects = []; // A function to create new drones up to gameState.droneLevel function updateDroneObjects() { // If we want exactly gameState.droneLevel drones: while (droneObjects.length < gameState.droneLevel) { var d = new Drone(); // position them randomly d.x = 200 + Math.random() * (2048 - 400); d.y = 200 + Math.random() * (2732 - 400); droneObjects.push(d); game.addChild(d); } }
User prompt
// Make sure to call updateDroneSprites() after you buy or increase drone level: { // inside the 'drone_level_1' upgrade or anywhere you increment droneLevel: action: function () { gameState.droneLevel++; this.level++; this.cost = Math.floor(this.cost * 1.5); updateDroneSprites(); } }
Code edit (1 edits merged)
Please save this source code
User prompt
Please fix the bug: 'TypeError: Cannot read properties of undefined (reading 'elapsed')' in or related to this line: 'if (LK.time.elapsed % 60 === 0) {' Line Number: 1332
Code edit (1 edits merged)
Please save this source code
User prompt
Please fix the bug: 'TypeError: Cannot read properties of undefined (reading 'x')' in or related to this line: 'p.x = ore.parent.x + ore.x;' Line Number: 336
Code edit (1 edits merged)
Please save this source code
User prompt
Please fix the bug: 'TypeError: Cannot read properties of undefined (reading 'x')' in or related to this line: 'p.x = ore.parent.x + ore.x;' Line Number: 294
Code edit (1 edits merged)
Please save this source code
User prompt
Fix it
User prompt
Please fix the bug: 'TypeError: Cannot set properties of undefined (setting 'fill')' in or related to this line: 'ref.textObj.style.fill = 0x666666;' Line Number: 638
User prompt
Please fix the bug: 'TypeError: Cannot set properties of undefined (setting 'fill')' in or related to this line: 'ref.textObj.style.fill = 0x666666;' Line Number: 637
User prompt
Please fix the bug: 'TypeError: setTimeout is not a function' in or related to this line: 'setTimeout(function () {' Line Number: 75
User prompt
Please fix the bug: 'TypeError: Cannot read properties of undefined (reading 'x')' in or related to this line: 'p.lastX = ore.parent.x + ore.x;' Line Number: 317
User prompt
Please fix the bug: 'TypeError: Cannot read properties of undefined (reading 'x')' in or related to this line: 'p.x = ore.parent.x + ore.x;' Line Number: 317
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ /** * A cluster container that spawns several Ore objects of the same type. * We track how many remain. Once all are destroyed, we remove the cluster * container from the game, then after a delay, spawn a new cluster if allowed. */ var Cluster = Container.expand(function (type) { var self = Container.call(this); self.type = type; self.oreList = []; // the Ore objects in this cluster // Random center var centerX = 100 + Math.random() * (2048 - 200); var centerY = 100 + Math.random() * (2732 - 200); self.x = centerX; self.y = centerY; // Decide how many ore are in this cluster, based on the cluster config var clusterConfig = gameState.clusterConfig; var count = randomInt(clusterConfig.min, clusterConfig.max); // Create each ore with random offsets for (var i = 0; i < count; i++) { var ore = new Ore(type, self); ore.x = (Math.random() - 0.5) * 120; ore.y = (Math.random() - 0.5) * 120; self.oreList.push(ore); self.addChild(ore); } // Called when an ore is destroyed self.notifyOreDestroyed = function (ore) { // remove from the container if (self.oreList.indexOf(ore) >= 0) { self.oreList.splice(self.oreList.indexOf(ore), 1); } ore.destroy(); // If all ore gone => cluster is done if (self.oreList.length === 0) { // remove cluster from stage if (self.parent) { self.parent.removeChild(self); } // remove from global array var idx = clusters.indexOf(self); if (idx >= 0) { clusters.splice(idx, 1); } // Decrement cluster count gameState.clusterCount[self.type]--; // Wait for respawnTime, then spawn a new cluster if not exceeding max // If type == 'coal', we slow it further, e.g. 2x var finalDelay = gameState.respawnTime; if (self.type === 'coal') { finalDelay *= 2; // slow rate for coal } LK.setTimeout(function () { maybeSpawnCluster(self.type); }, finalDelay); } }; return self; }); /**** * HELPER / UTILITY FUNCTIONS ****/ // Spawns a new cluster if we haven't reached max for that type /**** * CLASSES ****/ /** * Miner class: Moves to the closest available ore (within currentTier) * and mines it. */ var Miner = Container.expand(function () { var self = Container.call(this); self.attachAsset('miner', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 5; self.currentTarget = null; self.miningRange = 25; self.miningCooldown = 0; self.miningRate = 30; self.miningDamage = 1; // findNewTarget picks from ALL clusters' ore, sorted by distance self.findNewTarget = function () { var validOre = []; clusters.forEach(function (c) { c.oreList.forEach(function (ore) { // only if alive and within tier if (ore.health > 0 && ore.tier <= gameState.currentTier) { validOre.push(ore); } }); }); if (validOre.length === 0) { self.currentTarget = null; return; } // Calculate distance using ore's global coords: ore.parent.x + ore.x self.currentTarget = validOre.sort(function (a, b) { var aX = a.parent.x + a.x; var aY = a.parent.y + a.y; var bX = b.parent.x + b.x; var bY = b.parent.y + b.y; var distA = Math.hypot(aX - self.x, aY - self.y); var distB = Math.hypot(bX - self.x, bY - self.y); return distA - distB; })[0]; }; self.update = function () { self.findNewTarget(); if (self.currentTarget) { // Global coords for the current target var tx = self.currentTarget.parent.x + self.currentTarget.x; var ty = self.currentTarget.parent.y + self.currentTarget.y; var dx = tx - self.x; var dy = ty - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance > self.miningRange) { self.x += dx / distance * self.speed; self.y += dy / distance * self.speed; } else { self.mineOre(self.currentTarget); } } else { // idle "hover" self.y += Math.sin(LK.time.elapsed / 250) * 0.5; } }; self.mineOre = function (ore) { if (self.miningCooldown > 0) { self.miningCooldown--; return; } // apply damage ore.health -= self.miningDamage * gameState.pickaxeLevel; self.miningCooldown = self.miningRate; // if destroyed if (ore.health <= 0) { gameState.money += ore.getValue(); updateUI(); // Remove from its cluster ore.cluster.notifyOreDestroyed(ore); // Particles spawnMiningParticles(ore, 5); } else { // Particles for each hit spawnMiningParticles(ore, 2); } }; return self; }); /** * A single ore object. */ var Ore = Container.expand(function (type, cluster) { var self = Container.call(this); self.type = type; self.cluster = cluster; // Tier determination self.tier = ['coal', 'iron', 'gold', 'diamond'].indexOf(type) + 1; self.maxHealth = 10; // fixed self.health = self.maxHealth; // Base value depends on tier self.baseValue = 5 * self.tier; // Attach sprite self.attachAsset(type + '_ore', { anchorX: 0.5, anchorY: 0.5 }); // Larger health bar, properly centered above the ore (120×20) self.healthBar = LK.getAsset('rectangle', { width: 120, height: 20, fill: 0x00FF00, anchorX: 0.5, anchorY: 0.5 }); // Position above ore self.healthBar.x = 0; self.healthBar.y = -70; self.addChild(self.healthBar); self.getValue = function () { return self.baseValue * gameState.oreMultipliers[self.type]; }; return self; }); /**** * Initialize Game ****/ /**** * THE GAME ****/ var game = new LK.Game({ backgroundColor: 0x1a1a1a }); /**** * Game Code ****/ // We'll store references to cluster containers (one container per cluster). /**** * GLOBAL ARRAYS & STATE ****/ /**** * PLUGINS ****/ /**** * ASSETS ****/ var clusters = []; /**** * GAME STATE ****/ var gameState = { money: 0, pickaxeLevel: 1, currentTier: 1, // Multipliers for each ore type oreMultipliers: { coal: 1, iron: 1, gold: 1, diamond: 1 }, // Respawn timing (in ms) respawnTime: 3000, // Max clusters (per type) at once maxClustersPerType: 3, // Track how many clusters of each type currently exist on screen clusterCount: { coal: 0, iron: 0, gold: 0, diamond: 0 }, // Cluster range configs clusterConfigLevels: [{ min: 2, max: 3 }, // default { min: 2, max: 4 }, { min: 3, max: 5 }, { min: 5, max: 10 }], clusterUpgradeTier: 0, get clusterConfig() { return this.clusterConfigLevels[this.clusterUpgradeTier] || { min: 2, max: 3 }; } }; /**** * HELPER / UTILITY FUNCTIONS ****/ // Spawns a new cluster if we haven't reached max for that type function maybeSpawnCluster(type) { // Tier check: don't spawn if locked var tIndex = ['coal', 'iron', 'gold', 'diamond'].indexOf(type) + 1; if (tIndex > gameState.currentTier) { return; } // Check if we have space for a new cluster if (gameState.clusterCount[type] >= gameState.maxClustersPerType) { // do nothing, we've reached max return; } // spawn a cluster var cluster = new Cluster(type); game.addChild(cluster); clusters.push(cluster); // increment cluster count gameState.clusterCount[type]++; } // Random int between min and max inclusive function randomInt(min, max) { return Math.floor(Math.random() * (max - min + 1)) + min; } // Particle effect for mining function spawnMiningParticles(ore, num) { for (var i = 0; i < num; i++) { var p = LK.getAsset('mining_particle', { anchorX: 0.5, anchorY: 0.5 }); // Because ore is inside a cluster container if (ore.parent) { p.lastX = ore.parent.x + ore.x; p.lastY = ore.parent.y + ore.y; } else { p.lastX = ore.x; // Fallback if parent is undefined p.lastY = ore.y; } p.x = p.lastX; p.y = p.lastY; p.vx = (Math.random() - 0.5) * 10; p.vy = (Math.random() - 0.5) * 10; p.alpha = 1; // tween out tween(p, { alpha: 0, y: p.y - 50 }, { duration: 1000, onFinish: function onFinish() { p.destroy(); } }); game.addChild(p); } } // Color interpolation function interpolateColor(color1, color2, factor) { var r1 = color1 >> 16 & 0xff; var g1 = color1 >> 8 & 0xff; var b1 = color1 & 0xff; var r2 = color2 >> 16 & 0xff; var g2 = color2 >> 8 & 0xff; var b2 = color2 & 0xff; var r = Math.round(r1 + factor * (r2 - r1)); var g = Math.round(g1 + factor * (g2 - g1)); var b = Math.round(b1 + factor * (b2 - b1)); return r << 16 | g << 8 | b; } var miner = game.addChild(new Miner()); miner.x = 2048 / 2; miner.y = 2732 / 2; // Background var background = LK.getAsset('background', { anchorX: 0.5, anchorY: 0.5 }); background.x = 2048 / 2; background.y = 2732 / 2; game.addChildAt(background, 0); // UI var upgradeMenu = new Container(); var tooltip = new Text2('', { size: 40, fill: 0xFFFFFF }); var moneyDisplay = new Text2('$0', { size: 80, fill: 0xFFFFFF, fontWeight: 'bold', stroke: 0x000000, strokeThickness: 5 }); moneyDisplay.x = 2048 / 2 - moneyDisplay.width / 2; moneyDisplay.y = 50; var shopButton = LK.getAsset('buy_button', { anchorX: 0.5, anchorY: 0.5 }); shopButton.x = 2048 - 150; shopButton.y = 2732 - 150; shopButton.down = function () { createUpgradeMenu(); game.addChild(upgradeMenu); }; game.addChild(moneyDisplay); game.addChild(shopButton); game.addChild(tooltip); /**** * MULTI-PURCHASABLE & OTHER UPGRADES ****/ var clusterUpgradeBaseCost = 1000; // We store an object for each upgrade. For multi-purchase upgrades (like coal_expert), // we allow repeated buys that keep doubling the cost, keep increasing effect, etc. var upgrades = [{ id: 'coal_expert', name: "Coal Expertise", cost: 100, multi: true, // can be purchased repeatedly level: 0, // track how many times purchased effect: "Doubles coal value each purchase", tier: 1, requires: null, action: function action() { this.level++; // Each purchase x2 for coal gameState.oreMultipliers.coal *= 2; // Double cost for next time this.cost *= 2; } }, { id: 'unlock_iron', name: "Unlock Iron Mining", cost: 500, effect: "Allows iron ore clusters to spawn", tier: 2, requires: null, purchased: false, action: function action() { gameState.currentTier = 2; } }, { id: 'iron_expert', name: "Iron Expertise", cost: 2000, effect: "Triple iron value (one-time)", tier: 2, requires: 'unlock_iron', action: function action() { gameState.oreMultipliers.iron *= 3; } }, { id: 'unlock_gold', name: "Unlock Gold Mining", cost: 5000, effect: "Allows gold ore clusters to spawn", tier: 3, requires: null, action: function action() { gameState.currentTier = 3; } }, { id: 'gold_expert', name: "Gold Expertise", cost: 10000, effect: "Quadruple gold value (one-time)", tier: 3, requires: 'unlock_gold', action: function action() { gameState.oreMultipliers.gold *= 4; } }, { id: 'unlock_diamond', name: "Unlock Diamond Mining", cost: 20000, effect: "Allows diamond ore clusters to spawn", tier: 4, requires: null, action: function action() { gameState.currentTier = 4; } }, { id: 'faster_respawn', name: "Quicker Respawn", cost: 8000, effect: "Halves respawn time (min 500ms)", tier: 2, requires: null, action: function action() { gameState.respawnTime = Math.max(500, gameState.respawnTime / 2); } }, { id: 'cluster_up', name: "Cluster Growth [Tier 1]", cost: clusterUpgradeBaseCost, effect: "Increases cluster size range", tier: 1, requires: null, action: function action() { if (gameState.clusterUpgradeTier < gameState.clusterConfigLevels.length - 1) { gameState.clusterUpgradeTier++; } // Increase cost for next purchase this.cost += 2000; } }]; var upgradeItemRefs = []; // store references so we can update them each frame function createUpgradeMenu() { upgradeMenu.removeChildren(); upgradeItemRefs = []; // Background var menuBg = LK.getAsset('rectangle', { width: 1600, height: 1800, color: 0x2a2a2a, anchorX: 0.5, anchorY: 0.5 }); menuBg.x = 2048 / 2; menuBg.y = 2732 / 2; upgradeMenu.addChild(menuBg); // Update cluster upgrade display var clusterUpObj = upgrades.find(function (u) { return u.id === 'cluster_up'; }); if (clusterUpObj) { clusterUpObj.name = "Cluster Growth [Tier " + (gameState.clusterUpgradeTier + 1) + "]"; var cfg = gameState.clusterConfig; clusterUpObj.effect = "Spawns " + cfg.min + "-" + cfg.max + " per cluster"; } // Build each upgrade row upgrades.forEach(function (upg, i) { var requirement = null; if (upg.requires) { requirement = upgrades.find(function (u) { return u.id === upg.requires; }); } var yPos = 2732 / 2 - 500 + i * 200; // A container for the button + text var itemContainer = new Container(); itemContainer.x = 0; itemContainer.y = 0; upgradeMenu.addChild(itemContainer); // Button var btn = LK.getAsset('buy_button', { anchorX: 0.5, anchorY: 0.5 }); btn.x = 2048 / 2; btn.y = yPos; itemContainer.addChild(btn); // For multi levels, e.g. coal_expert, show the level in the name var displayName = upg.name; if (upg.id === 'coal_expert' && upg.level > 0) { displayName += " (Lv " + upg.level + ")"; } var txtStr = displayName + "\n" + upg.effect + "\n$" + upg.cost; var txt = new Text2(txtStr, { size: 40, align: 'center', fill: 0x666666 }); txt.anchor.set(0.5); txt.x = btn.x; txt.y = btn.y; itemContainer.addChild(txt); // On click btn.down = function () { var canBuy = checkUpgradeable(upg, requirement); if (canBuy) { gameState.money -= upg.cost; // If single-purchase (no multi) if (!upg.multi) { upg.purchased = true; } // Perform upgrade upg.action(); // Refresh menu + UI createUpgradeMenu(); updateUI(); } }; // Keep references for real-time color update upgradeItemRefs.push({ upgrade: upg, requirement: requirement, textObj: txt }); }); // Close button var closeBtn = LK.getAsset('cancelButton', { anchorX: 0.5, anchorY: 0.5 }); closeBtn.x = 2048 / 2 + 600; closeBtn.y = 2732 / 2 - 700; closeBtn.down = function () { game.removeChild(upgradeMenu); }; upgradeMenu.addChild(closeBtn); } function checkUpgradeable(upg, requirement) { var hasReq = true; if (requirement && !requirement.purchased) { hasReq = false; } // If multi = true, do not block purchase after first time if (!upg.multi && upg.purchased) { return false; } // Must have enough money if (gameState.money < upg.cost) { return false; } return hasReq; } /**** * UPDATE UI ****/ function updateUI() { moneyDisplay.setText("$" + gameState.money.toLocaleString() + "\n" + "Multipliers: C" + gameState.oreMultipliers.coal + "x " + "I" + gameState.oreMultipliers.iron + "x " + "G" + gameState.oreMultipliers.gold + "x " + "D" + gameState.oreMultipliers.diamond + "x"); moneyDisplay.x = 2048 / 2 - moneyDisplay.width / 2; } /**** * MAIN GAME UPDATE ****/ game.update = function () { // 1) Miner logic miner.update(); // 2) For each cluster, update each ore's health bar & alpha clusters.forEach(function (cluster) { cluster.oreList.forEach(function (ore) { if (ore.health > 0) { var fraction = ore.health / ore.maxHealth; ore.healthBar.width = 120 * fraction; ore.healthBar.fill = interpolateColor(0xFF0000, 0x00FF00, fraction); ore.alpha = fraction; // fade } }); }); // 3) If the upgradeMenu is open, check if items became purchasable if (upgradeMenu.parent) { upgradeItemRefs.forEach(function (ref) { var canBuy = checkUpgradeable(ref.upgrade, ref.requirement); // If canBuy => text color = 0xFFFFFF, else 0x666666 if (ref.textObj && ref.textObj.style) { if (canBuy) { ref.textObj.style.fill = 0xFFFFFF; } else { ref.textObj.style.fill = 0x666666; } } }); } }; /**** * SAVE & LOAD ****/ LK.saveGame = function () { return gameState; }; LK.loadGame = function (data) { gameState = data; updateUI(); }; /**** * INITIAL SETUP * Spawn some clusters for each type up to currentTier ****/ function initialSpawn() { var oreTypes = ['coal', 'iron', 'gold', 'diamond']; oreTypes.forEach(function (type, idx) { var tier = idx + 1; if (tier <= gameState.currentTier) { // spawn up to maxClustersPerType immediately for (var i = 0; i < gameState.maxClustersPerType; i++) { maybeSpawnCluster(type); } } }); } initialSpawn(); updateUI();
===================================================================
--- original.js
+++ change.js
@@ -302,9 +302,9 @@
if (ore.parent) {
p.lastX = ore.parent.x + ore.x;
p.lastY = ore.parent.y + ore.y;
} else {
- p.lastX = ore.x; // Fallback if parent is undefined
+ p.lastX = ore.x; // Fallback if parent is undefined
p.lastY = ore.y;
}
p.x = p.lastX;
p.y = p.lastY;
drone_shot
Sound effect
mine_coal
Sound effect
mine_iron
Sound effect
mine_gold
Sound effect
mine_diamond
Sound effect
mine_sapphire
Sound effect
mine_emerald
Sound effect
mine_ruby
Sound effect
mine_chronostone
Sound effect
mine_quantumshard
Sound effect
ore_destroy_coal
Sound effect
ore_destroy_iron
Sound effect
ore_destroy_gold
Sound effect
ore_destroy_diamond
Sound effect
ore_destroy_sapphire
Sound effect
ore_destroy_emerald
Sound effect
ore_destroy_ruby
Sound effect
mine_coal_1
Sound effect
mine_coal_2
Sound effect
mine_coal_3
Sound effect
mine_diamond1
Sound effect
mine_diamond2
Sound effect
mine_diamond3
Sound effect
mine_emerald1
Sound effect
mine_emerald2
Sound effect
mine_emerald3
Sound effect
mine_gold1
Sound effect
mine_gold2
Sound effect
mine_gold3
Sound effect
mine_iron1
Sound effect
mine_iron2
Sound effect
mine_iron3
Sound effect
mine_ruby1
Sound effect
mine_ruby2
Sound effect
mine_ruby3
Sound effect
mine_sapphire1
Sound effect
mine_sapphire2
Sound effect
mine_sapphire3
Sound effect
song1
Music
song2
Music
song3
Music
song4
Music
song5
Music
song6
Music
song7
Music
song8
Music
song9
Music
song10
Music
song11
Music
song12
Music
song1a
Music
song1b
Music
song2a
Music
song2b
Music
song3a
Music
song3b
Music
song4a
Music
song4b
Music
song5a
Music
song5b
Music
song6a
Music
song6b
Music
song7a
Music
song7b
Music
song8a
Music
song8b
Music
song9a
Music
song9b
Music
song10a
Music
song10b
Music
song11a
Music
song11b
Music
song12a
Music
song12b
Music