User prompt
Update as needed with: // Instead of completely rebuilding the UI, let's just update the text elements if (category === 'colors') { // Update the cost text directly if (upgrade.currentLevel >= upgrade.maxLevel) { costText.setText("SOLD OUT"); costText.fill = 0x888888; // Gray color } else { costText.setText(getUpgradeCost(upgrade) + " BP"); } // Find and update dependent upgrades Object.keys(UPGRADE_CONFIG.colors).forEach(function(colorKey) { const colorUpgrade = UPGRADE_CONFIG.colors[colorKey]; if (colorUpgrade.requires === key) { // Find the text element for this dependent upgrade const dependentTexts = []; tabContainers.colors.children.forEach(function(child) { // Find the name text if (child.text === colorUpgrade.name) { dependentTexts.push(child); } // Find its associated cost text else if (child.text === "LOCKED" && dependentTexts.length > 0 && Math.abs(child.y - dependentTexts[dependentTexts.length-1].y) < 120) { // Update from LOCKED to actual cost child.setText(getUpgradeCost(colorUpgrade) + " BP"); child.fill = 0xFFFF00; // Yellow for costs } }); } }); }
User prompt
Update as needed with: if (category === 'colors') { // Find all relevant UI elements in the tab const colorContainer = tabContainers.colors; // First update this upgrade's cost to "SOLD OUT" colorContainer.children.forEach(function(child) { if (child.text && child.text.includes("BP")) { // Find the cost text by looking at nearby elements const nameTexts = colorContainer.children.filter(e => e.text === upgrade.name && Math.abs(e.y - child.y) < 150 ); if (nameTexts.length > 0) { // This is the cost text for our upgrade child.setText("SOLD OUT"); child.fill = 0x888888; // Gray color } } }); // Then update any dependent upgrades from "LOCKED" to their cost Object.keys(UPGRADE_CONFIG.colors).forEach(function(colorKey) { const colorUpgrade = UPGRADE_CONFIG.colors[colorKey]; if (colorUpgrade.requires === key) { colorContainer.children.forEach(function(child) { if (child.text === "LOCKED") { // Find the name text near this LOCKED text const nameTexts = colorContainer.children.filter(e => e.text === colorUpgrade.name && Math.abs(e.y - child.y) < 150 ); if (nameTexts.length > 0) { // Update from LOCKED to cost child.setText(getUpgradeCost(colorUpgrade) + " BP"); child.fill = 0xFFFF00; // Yellow for costs } } }); } }); }
User prompt
Update with: // After the line: upgrade.currentLevel++; // Replace the existing color upgrade dependency update code with this: if (category === 'colors') { // Find any upgrades that depend on this one Object.keys(UPGRADE_CONFIG.colors).forEach(function(colorKey) { var colorUpgrade = UPGRADE_CONFIG.colors[colorKey]; if (colorUpgrade.requires === key) { // This upgrade depends on the one we just purchased // Find all cost texts that need updating in the colors tab tabContainers['colors'].children.forEach(function(child) { if (child.text === "LOCKED") { // Find the matching upgrade name text that comes before this locked text var nameTextFound = false; for (var i = 0; i < tabContainers['colors'].children.length; i++) { var textElement = tabContainers['colors'].children[i]; if (textElement.text === colorUpgrade.name) { nameTextFound = true; } // If we found the name and now found the LOCKED text after it if (nameTextFound && textElement === child) { child.setText(getUpgradeCost(colorUpgrade) + " BP"); child.fill = 0xFFFF00; // Change to standard cost color break; } } } }); } }); // Update to show SOLD OUT costText.setText("SOLD OUT"); costText.fill = 0x888888; // Gray color for sold out }
User prompt
Update with: // Replace the existing color upgrade dependency update code with this: if (category === 'colors') { // Set this upgrade to SOLD OUT costText.setText("SOLD OUT"); costText.fill = 0x888888; // Gray color for sold out // Find any upgrades that depend on this one and update them directly Object.keys(UPGRADE_CONFIG.colors).forEach(function(colorKey) { var colorUpgrade = UPGRADE_CONFIG.colors[colorKey]; if (colorUpgrade.requires === key) { // Find the corresponding name and cost text elements for this dependent upgrade var nameText = null; var lockedText = null; tabContainers['colors'].children.forEach(function(child) { // Find the name text first if (child.text === colorUpgrade.name) { nameText = child; } // Then find the LOCKED text that follows it if (nameText && child.text === "LOCKED" && child.y > nameText.y && !lockedText) { lockedText = child; } }); // Update the locked text if found if (lockedText) { lockedText.setText(getUpgradeCost(colorUpgrade) + " BP"); lockedText.fill = 0xFFFF00; // Yellow color for cost } } }); }
User prompt
Update as needed with: // Inside hitContainer.down function after upgrade.currentLevel++ if (category === 'colors') { // Mark this upgrade as SOLD OUT costText.setText("SOLD OUT"); costText.fill = 0x888888; // Gray color // Now loop through all color upgrades to update their locked status tabContainers['colors'].children.forEach(function(child) { // Only look at Text2 objects if (child.text) { // For each upgrade name that we find var matchingColorKey = null; Object.keys(UPGRADE_CONFIG.colors).forEach(function(colorKey) { if (UPGRADE_CONFIG.colors[colorKey].name === child.text) { matchingColorKey = colorKey; } }); // If we found a matching upgrade name if (matchingColorKey) { var colorUpgrade = UPGRADE_CONFIG.colors[matchingColorKey]; // If this upgrade depends on the one we just bought if (colorUpgrade.requires === key) { // Find its cost text (which is the next text element at the same X position) var costX = child.x; var nameY = child.y; tabContainers['colors'].children.forEach(function(costElement) { if (costElement.text === "LOCKED" && costElement.x === costX && costElement.y > nameY && costElement.y < nameY + 150) { // Check reasonable Y range // Update from LOCKED to actual cost costElement.setText(getUpgradeCost(colorUpgrade) + " BP"); costElement.fill = 0xFFFF00; // Yellow cost color } }); } } } }); }
User prompt
Update as needed with: // Add this function near the other utility functions: function refreshUpgradeTab(tabName) { // Clear all children from the tab container while (tabContainers[tabName].children.length > 0) { tabContainers[tabName].children[0].destroy(); } // Recreate all upgrades for the tab if (tabColumns[tabName] && tabColumns[tabName].left) { tabColumns[tabName].left.forEach(function(upgrade, index) { createUpgradeText(upgrade[0], upgrade[1], index, true, tabName); }); } if (tabColumns[tabName] && tabColumns[tabName].right) { tabColumns[tabName].right.forEach(function(upgrade, index) { createUpgradeText(upgrade[0], upgrade[1], index, false, tabName); }); } } // Now modify the hitContainer.down function to call this // Inside hitContainer.down after successful purchase: if (category === 'colors') { upgrade.currentLevel++; game.bp -= cost; bpText.setText(formatBP(game.bp) + " BP"); // Refresh the entire colors tab to update all text elements refreshUpgradeTab('colors'); return true; // Skip the rest of the function }
User prompt
Update as needed with: // Inside hitContainer.down function where it handles color upgrades if (category === 'colors') { // Purchase the upgrade upgrade.currentLevel++; game.bp -= cost; bpText.setText(formatBP(game.bp) + " BP"); // Refresh the entire colors tab to update all text elements refreshUpgradeTab('colors'); return true; // Skip the rest of the function } // Now modify the createUpgradeText function to correctly handle SOLD OUT status for color upgrades // Find the part where it creates the cost text (around line 1100-1150) // Add this condition inside the createUpgradeText function where it creates costText // After checking for requires, add this: if (category === 'colors' && upgrade.currentLevel >= upgrade.maxLevel) { // Create "SOLD OUT" text for maxed out color upgrades costText = new Text2("SOLD OUT", { size: 96, fill: 0x888888, // Gray color stroke: 0x000000, strokeThickness: 2, font: "Impact" }); } else if (category === 'colors' && upgrade.requires) { // The existing code for requires check var required = UPGRADE_CONFIG.colors[upgrade.requires]; if (required && required.currentLevel === 0) { // Create "LOCKED" text for locked upgrades costText = new Text2("LOCKED", { size: 96, fill: 0x888888, stroke: 0x000000, strokeThickness: 2, font: "Impact" }); } else { // Normal cost text costText = new Text2(cost + " BP", { size: 96, fill: 0xFFFF00, stroke: 0x000000, strokeThickness: 2, font: "Impact" }); } } else { // Normal cost text for non-color upgrades costText = new Text2(cost + " BP", { size: 96, fill: 0xFFFF00, stroke: 0x000000, strokeThickness: 2, font: "Impact" }); }
Code edit (1 edits merged)
Please save this source code
User prompt
Update with: // Function to update coral decorations function updateCoralDecorations() { // Clear existing corals while (coralContainer.children.length) { coralContainer.children[0].destroy(); } // Position corals along bottom of screen var coralCount = UPGRADE_CONFIG.decorations.bubbleCoral.amount; if (coralCount <= 0) return; // Available coral types var coralTypes = ['coral1', 'coral2', 'coral3', 'coral4']; // Space corals evenly along bottom var spacing = game.width / (coralCount + 1); for (var i = 0; i < coralCount; i++) { // Choose random coral type var coralType = coralTypes[Math.floor(Math.random() * coralTypes.length)]; // Create coral sprite var coral = LK.getAsset(coralType, { anchorX: 0.5, anchorY: 1, x: spacing * (i + 1), y: game.height - 20, // Slightly above bottom scaleX: 1.5 + Math.random() * 0.5, scaleY: 1.5 + Math.random() * 0.5 }); // Store last bubble spawn time coral.lastBubbleTime = 0; coralContainer.addChild(coral); } } // Add coral bubble spawning to the game update loop function updateCoralBubbles() { if (UPGRADE_CONFIG.decorations.bubbleCoral.amount <= 0) return; coralContainer.children.forEach(function(coral) { // 5% chance per second to spawn bubble (0.083% per frame at 60fps) if (Math.random() < 0.00083 || LK.ticks - coral.lastBubbleTime > 600) { // Force spawn after 10 seconds coral.lastBubbleTime = LK.ticks; // Calculate bubble size based on player's max size var bubbleSize = game.maxBubbleSize * (0.5 + Math.random() * 0.3); // Spawn position slightly above coral var bubbleX = coral.x + (Math.random() * 30 - 15); var bubbleY = coral.y - coral.height * 0.3; var bubble = spawnBubble(bubbleX, bubbleY, bubbleSize, 0, false); if (bubble) { // Set moderate upward velocity bubble.verticalVelocity = -(2 + Math.random() * 3); bubble.driftX = (Math.random() * 2 - 1); } } }); }
Code edit (2 edits merged)
Please save this source code
User prompt
Update with: if (category === 'decorations') { if (key === 'bubbleCoral') { updateCoralDecorations(); } // Future decoration handlers would go here }
Code edit (1 edits merged)
Please save this source code
User prompt
Update with: // Track active treasure zones for bubble value calculation game.treasureZones = []; // Function to update treasure decorations function updateTreasureDecorations() { // Clear existing treasures while (treasureContainer.children.length) { treasureContainer.children[0].destroy(); } // Clear zone tracking game.treasureZones = []; var treasureCount = UPGRADE_CONFIG.decorations.sunkenTreasures.amount; if (treasureCount <= 0) return; // Available treasure types var treasureTypes = ['treasure1', 'treasure2', 'treasure3']; // Space treasures semi-randomly for (var i = 0; i < treasureCount; i++) { // Choose random treasure type var treasureType = treasureTypes[i % treasureTypes.length]; // Set position - avoid edges and very top var x = game.width * (0.2 + Math.random() * 0.6); // 20-80% of width var y = game.height * (0.5 + Math.random() * 0.4); // 50-90% of height // Create treasure sprite var treasure = LK.getAsset(treasureType, { anchorX: 0.5, anchorY: 0.5, x: x, y: y, scaleX: 1.8, scaleY: 1.8, alpha: 0.9 }); // Create and add highlight zone indicator (subtle circle) var zoneRadius = game.width * 0.15; // 15% of screen as specified var zoneIndicator = new Shape(); zoneIndicator.beginFill(0xFFFFFF, 0.15); // Very subtle white zoneIndicator.drawCircle(0, 0, zoneRadius); zoneIndicator.endFill(); // Store zone information for bonus calculations game.treasureZones.push({ x: x, y: y, radius: zoneRadius }); // Add handlers to make treasures draggable treasure.down = function(e) { this.dragging = true; this.dragOffsetX = this.x - e.x; this.dragOffsetY = this.y - e.y; // Move to top of treasures while dragging treasureContainer.setChildIndex(this, treasureContainer.children.length - 1); return true; }; treasure.move = function(e) { if (this.dragging) { this.x = e.x + this.dragOffsetX; this.y = e.y + this.dragOffsetY; // Constrain to screen bounds this.x = Math.max(50, Math.min(game.width - 50, this.x)); this.y = Math.max(100, Math.min(game.height - 50, this.y)); // Update zone indicator position if (this.zoneIndicator) { this.zoneIndicator.x = this.x; this.zoneIndicator.y = this.y; // Update corresponding zone in the tracking array for (var i = 0; i < game.treasureZones.length; i++) { if (game.treasureZones[i].id === this.id) { game.treasureZones[i].x = this.x; game.treasureZones[i].y = this.y; break; } } } return true; } return false; }; treasure.up = function() { this.dragging = false; return true; }; // Store unique id to match with zone treasure.id = 'treasure_' + i; // Link zone indicator to treasure treasure.zoneIndicator = zoneIndicator; zoneIndicator.x = x; zoneIndicator.y = y; // Add zone first (so it's behind treasure) treasureContainer.addChild(zoneIndicator); treasureContainer.addChild(treasure); } } // Function to calculate treasure zone bonus for a bubble function getTreasureBonusMultiplier(x, y) { if (!game.treasureZones || game.treasureZones.length === 0) { return 1.0; // No bonus if no treasures } // Start with no bonus var totalBonus = 0; // Check each treasure zone game.treasureZones.forEach(function(zone) { var dx = x - zone.x; var dy = y - zone.y; var distance = Math.sqrt(dx * dx + dy * dy); // If bubble is in zone, add 50% bonus if (distance <= zone.radius) { totalBonus += 0.5; // +50% per overlapping zone as specified } }); // Return multiplier (1.0 = no bonus, 1.5 = one zone, 2.0 = two zones, etc.) return 1.0 + totalBonus; }
User prompt
Update with: self.getBP = function () { var baseValue = Math.max(1, Math.floor(Math.pow(self.size, 1.4) * 0.02)); // Apply Bubble Refinement upgrade var refinementLevel = UPGRADE_CONFIG.player.bubbleRefinement.currentLevel; if (refinementLevel > 0) { baseValue *= 1 + 0.25 * refinementLevel; // +25% per level } if (self.fromClam && UPGRADE_CONFIG.machine.bubbleQuality.currentLevel > 0) { var qualityLevel = UPGRADE_CONFIG.machine.bubbleQuality.currentLevel; baseValue *= 1 + 0.4 * qualityLevel; // +40% per level } // Apply color multiplier baseValue = Math.floor(baseValue * self.colorMultiplier); // Apply treasure zone bonus if applicable baseValue = Math.floor(baseValue * getTreasureBonusMultiplier(self.x, self.y)); return baseValue; };
User prompt
Update with: if (category === 'decorations') { if (key === 'bubbleCoral') { updateCoralDecorations(); } else if (key === 'sunkenTreasures') { updateTreasureDecorations(); } }
Code edit (1 edits merged)
Please save this source code
User prompt
Update with: game.treasureZones = [];
User prompt
Add: // Function to update treasure decorations function updateTreasureDecorations() { // Clear existing treasures while (treasureContainer.children.length) { treasureContainer.children[0].destroy(); } // Clear zone tracking game.treasureZones = []; var treasureCount = UPGRADE_CONFIG.decorations.sunkenTreasures.amount; if (treasureCount <= 0) return; // Available treasure types var treasureTypes = ['treasure1', 'treasure2', 'treasure3']; // Space treasures semi-randomly for (var i = 0; i < treasureCount; i++) { // Choose random treasure type var treasureType = treasureTypes[i % treasureTypes.length]; // Set position - avoid edges and very top var x = game.width * (0.2 + Math.random() * 0.6); // 20-80% of width var y = game.height * (0.5 + Math.random() * 0.4); // 50-90% of height // Create treasure sprite var treasure = LK.getAsset(treasureType, { anchorX: 0.5, anchorY: 0.5, x: x, y: y, scaleX: 1.8, scaleY: 1.8, alpha: 0.9 }); // Create and add highlight zone indicator (subtle circle) var zoneRadius = game.width * 0.15; // 15% of screen as specified var zoneIndicator = new Shape(); zoneIndicator.beginFill(0xFFFFFF, 0.15); // Very subtle white zoneIndicator.drawCircle(0, 0, zoneRadius); zoneIndicator.endFill(); // Store zone information for bonus calculations game.treasureZones.push({ x: x, y: y, radius: zoneRadius }); // Add handlers to make treasures draggable treasure.down = function(e) { this.dragging = true; this.dragOffsetX = this.x - e.x; this.dragOffsetY = this.y - e.y; // Move to top of treasures while dragging treasureContainer.setChildIndex(this, treasureContainer.children.length - 1); return true; }; treasure.move = function(e) { if (this.dragging) { this.x = e.x + this.dragOffsetX; this.y = e.y + this.dragOffsetY; // Constrain to screen bounds this.x = Math.max(50, Math.min(game.width - 50, this.x)); this.y = Math.max(100, Math.min(game.height - 50, this.y)); // Update zone indicator position if (this.zoneIndicator) { this.zoneIndicator.x = this.x; this.zoneIndicator.y = this.y; // Update corresponding zone in the tracking array for (var i = 0; i < game.treasureZones.length; i++) { if (game.treasureZones[i].id === this.id) { game.treasureZones[i].x = this.x; game.treasureZones[i].y = this.y; break; } } } return true; } return false; }; treasure.up = function() { this.dragging = false; return true; }; // Store unique id to match with zone treasure.id = 'treasure_' + i; // Link zone indicator to treasure treasure.zoneIndicator = zoneIndicator; zoneIndicator.x = x; zoneIndicator.y = y; // Add zone first (so it's behind treasure) treasureContainer.addChild(zoneIndicator); treasureContainer.addChild(treasure); } }
User prompt
Add: function getTreasureBonusMultiplier(x, y) { if (!game.treasureZones || game.treasureZones.length === 0) { return 1.0; // No bonus if no treasures } // Start with no bonus var totalBonus = 0; // Check each treasure zone game.treasureZones.forEach(function(zone) { var dx = x - zone.x; var dy = y - zone.y; var distance = Math.sqrt(dx * dx + dy * dy); // If bubble is in zone, add 50% bonus if (distance <= zone.radius) { totalBonus += 0.5; // +50% per overlapping zone as specified } }); // Return multiplier (1.0 = no bonus, 1.5 = one zone, 2.0 = two zones, etc.) return 1.0 + totalBonus; }
User prompt
Update with: self.getBP = function () { var baseValue = Math.max(1, Math.floor(Math.pow(self.size, 1.4) * 0.02)); // Apply Bubble Refinement upgrade var refinementLevel = UPGRADE_CONFIG.player.bubbleRefinement.currentLevel; if (refinementLevel > 0) { baseValue *= 1 + 0.25 * refinementLevel; // +25% per level } if (self.fromClam && UPGRADE_CONFIG.machine.bubbleQuality.currentLevel > 0) { var qualityLevel = UPGRADE_CONFIG.machine.bubbleQuality.currentLevel; baseValue *= 1 + 0.4 * qualityLevel; // +40% per level } // Apply color multiplier baseValue = Math.floor(baseValue * self.colorMultiplier); // Apply treasure zone bonus if applicable baseValue = Math.floor(baseValue * getTreasureBonusMultiplier(self.x, self.y)); return baseValue; };
User prompt
Update with: if (category === 'decorations') { if (key === 'bubbleCoral') { updateCoralDecorations(); } else if (key === 'sunkenTreasures') { updateTreasureDecorations(); } }
User prompt
Update with: updateClamVisuals(); updateCoralDecorations(); updateTreasureDecorations();
User prompt
Increase the value of all bubbles by 100 times.
User prompt
Please fix the bug: 'Script error.' in or related to this line: 'var zoneIndicator = new Shape();' Line Number: 606
User prompt
Update with: game.down = function (x, y, obj) { var localX = x - menuContainer.x; var localY = y - menuContainer.y; // Tab click handling var tabBounds = { x: -menuTab.width * menuTab.scaleX / 2, y: -menuTab.height * menuTab.scaleY, width: menuTab.width * menuTab.scaleX, height: menuTab.height * menuTab.scaleY }; if (localX >= tabBounds.x && localX <= tabBounds.x + tabBounds.width && localY >= tabBounds.y && localY <= tabBounds.y + tabBounds.height) { menuOpen = !menuOpen; var targetY = menuOpen ? menuTab.height : game.height; if (menuOpen) { game.setChildIndex(menuContainer, game.children.length - 1); } tween(menuContainer, { y: targetY }, { duration: 300, easing: tween.easeOutBack, onFinish: function onFinish() { tabsContainer.visible = menuOpen; if (!menuOpen) { game.setChildIndex(menuContainer, 1); } } }); return true; } if (menuOpen) { return true; // Let containers handle their own clicks } // Check for treasure dragging if (treasureContainer && treasureContainer.children) { for (var i = 0; i < treasureContainer.children.length; i++) { var treasure = treasureContainer.children[i]; // Skip zone indicators (which don't have down handlers) if (!treasure.down) continue; var dx = x - treasure.x; var dy = y - treasure.y; var distance = Math.sqrt(dx * dx + dy * dy); // Check if click is within treasure bounds (approximate with circle) if (distance < 50) { // Adjust size as needed based on treasures if (treasure.down({ x: x, y: y })) { // Store the currently dragged treasure for move and up events game.currentDragObject = treasure; return true; } } } } // Bubble popping logic var popped = false; for (var i = game.activeBubbles.length - 1; i >= 0; i--) { var bubble = game.activeBubbles[i]; var dx = x - bubble.x; var dy = y - bubble.y; var distance = Math.sqrt(dx * dx + dy * dy); if (!popped && distance <= bubble.size / 2 + 30 && bubble.down) { bubble.down(); popped = true; break; } } };
===================================================================
--- original.js
+++ change.js
@@ -1320,37 +1320,35 @@
game.bp -= cost;
bpText.setText(formatBP(game.bp) + " BP");
// If this is a color upgrade, update the UI to reflect dependency status
if (category === 'colors') {
- // Find any upgrades that depend on this one
+ // Set this upgrade to SOLD OUT
+ costText.setText("SOLD OUT");
+ costText.fill = 0x888888; // Gray color for sold out
+ // Find any upgrades that depend on this one and update them directly
Object.keys(UPGRADE_CONFIG.colors).forEach(function (colorKey) {
var colorUpgrade = UPGRADE_CONFIG.colors[colorKey];
if (colorUpgrade.requires === key) {
- // This upgrade depends on the one we just purchased
- // Find all cost texts that need updating in the colors tab
+ // Find the corresponding name and cost text elements for this dependent upgrade
+ var nameText = null;
+ var lockedText = null;
tabContainers['colors'].children.forEach(function (child) {
- if (child.text === "LOCKED") {
- // Find the matching upgrade name text that comes before this locked text
- var nameTextFound = false;
- for (var i = 0; i < tabContainers['colors'].children.length; i++) {
- var textElement = tabContainers['colors'].children[i];
- if (textElement.text === colorUpgrade.name) {
- nameTextFound = true;
- }
- // If we found the name and now found the LOCKED text after it
- if (nameTextFound && textElement === child) {
- child.setText(getUpgradeCost(colorUpgrade) + " BP");
- child.fill = 0xFFFF00; // Change to standard cost color
- break;
- }
- }
+ // Find the name text first
+ if (child.text === colorUpgrade.name) {
+ nameText = child;
}
+ // Then find the LOCKED text that follows it
+ if (nameText && child.text === "LOCKED" && child.y > nameText.y && !lockedText) {
+ lockedText = child;
+ }
});
+ // Update the locked text if found
+ if (lockedText) {
+ lockedText.setText(getUpgradeCost(colorUpgrade) + " BP");
+ lockedText.fill = 0xFFFF00; // Yellow color for cost
+ }
}
});
- // Update to show SOLD OUT
- costText.setText("SOLD OUT");
- costText.fill = 0x888888; // Gray color for sold out
}
// Update cost text
if (upgrade.currentLevel >= upgrade.maxLevel) {
costText.setText("SOLD OUT");
A treasure chest with gold coins. Cartoon.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
A golden skull with diamonds for eyes. Cartoon.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
A golden necklace with a ruby pendant. Cartoon.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
A filled in white circle.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
A yellow star. Cartoon.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
a game logo for a game called 'Bubble Blower Tycoon' about a happy purple pufferfish with yellow fins and spines that builds an underwater empire of bubbles. Cartoon. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
an SVG of the word 'Start'. word should be yellow and the font should look like its made out of bubbles. cartoon. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
bubblelow
Sound effect
backgroundmusic
Music
bubblehigh
Sound effect
bubble1
Sound effect
bubble2
Sound effect
bubble3
Sound effect
bubble4
Sound effect
blowing
Sound effect
bubbleshoot
Sound effect
fishtank
Sound effect
menuopen
Sound effect
upgrade
Sound effect
jellyfish
Sound effect
titlemusic
Music
startbutton
Sound effect