diff --git a/admin.html b/admin.html
index 1cbd341..8c80f05 100644
--- a/admin.html
+++ b/admin.html
@@ -6,6 +6,7 @@
hoel - Admin
+
diff --git a/js/entities.js b/js/entities.js
index a0c8033..1ba34f5 100644
--- a/js/entities.js
+++ b/js/entities.js
@@ -106,7 +106,7 @@ Asteroid.prototype.initializeTypeSpecificProperties = function() {
this.planetColors = CONFIG.GIANT_COLORS[Math.floor(Math.random() * CONFIG.GIANT_COLORS.length)];
// Initialize rings
this.rings = [];
- var ringCount = Math.floor(Math.random() * 4); // 0-3 rings
+ var ringCount = Math.floor(Math.random() * 4) + 1; // 1–4 rings
for (var i = 0; i < ringCount; i++) {
this.rings.push({
color: CONFIG.GIANT_RING_COLORS[Math.floor(Math.random() * CONFIG.GIANT_RING_COLORS.length)],
@@ -432,40 +432,23 @@ function BlackHole(x, y, radius) {
};
BlackHole.prototype.draw = function(ctx, consumptionRate) {
- // Calculate jet intensity based on consumption rate
- var jetMin = 1e7; // Start triggering at 10 Mt/s (Comets)
- var jetMax = 1e22; // max intensity
- var minVisible = 0.1; // 10% intensity floor
-
- var targetIntensity = 0;
-
- if (consumptionRate && consumptionRate > jetMin) {
- var logMin = 10; // log10(1e10)
- var logMax = 22; // log10(1e22)
- var logRate = Math.log10(consumptionRate);
-
- // Log-scaled 0..1
- targetIntensity = Math.max(0, Math.min(
- (logRate - logMin) / (logMax - logMin),
- 1
- ));
-
- // Perceptual tweaks
- targetIntensity = Math.pow(targetIntensity, 0.35); // boost low end
- targetIntensity = minVisible + (1 - minVisible) * targetIntensity;
- }
-
// Smooth transition for jet intensity
if (!this.jetIntensity) this.jetIntensity = 0;
-
- var transitionSpeed = 0.05; // Lower = slower fade (0.01 = very slow, 0.05 = fast)
-
- if (targetIntensity > this.jetIntensity) {
+ if (!this.targetJetIntensity) this.targetJetIntensity = 0;
+
+ var transitionSpeed = 0.05; // Fade speed
+
+ if (this.targetJetIntensity > this.jetIntensity) {
// Fade in
- this.jetIntensity = Math.min(this.jetIntensity + transitionSpeed, targetIntensity);
- } else if (targetIntensity < this.jetIntensity) {
+ this.jetIntensity = Math.min(this.jetIntensity + transitionSpeed, this.targetJetIntensity);
+ } else if (this.targetJetIntensity < this.jetIntensity) {
// Fade out
- this.jetIntensity = Math.max(this.jetIntensity - transitionSpeed, targetIntensity);
+ this.jetIntensity = Math.max(this.jetIntensity - transitionSpeed, this.targetJetIntensity);
+ }
+
+ // Decay target intensity over time (jets fade after consumption)
+ if (this.targetJetIntensity > 0) {
+ this.targetJetIntensity = Math.max(0, this.targetJetIntensity - 0.01);
}
// Draw jets first (behind the black hole)
@@ -544,6 +527,28 @@ BlackHole.prototype.consumeAsteroid = function(asteroid) {
// Blend with existing pulseColor instead of replacing
if (!this.pulseColor) this.pulseColor = newColor;
else this.pulseColor = this.blendColors(this.pulseColor, newColor, 0.3);
+ var jetMin = 1e7; // Start triggering at 10 Mt (Comets)
+ var jetMax = 1e29; // Max intensity (M-Type range)
+
+ if (asteroid.massKg >= jetMin) {
+ var logMin = Math.log10(jetMin);
+ var logMax = Math.log10(jetMax);
+ var logMass = Math.log10(asteroid.massKg);
+
+ // Log-scaled 0..1
+ var targetIntensity = Math.max(0, Math.min(
+ (logMass - logMin) / (logMax - logMin),
+ 1
+ ));
+
+ // Perceptual tweaks
+ targetIntensity = Math.pow(targetIntensity, 0.35); // boost low end
+ targetIntensity = 0.1 + 0.9 * targetIntensity; // 10%-100% range
+
+ // Set jet properties
+ this.targetJetIntensity = targetIntensity;
+ this.jetColor = newColor; // Match the object's color
+ }
};
// Helper function to blend two hex colors by weight (0–1)
@@ -563,10 +568,23 @@ BlackHole.prototype.blendColors = function(c1, c2, weight) {
};
BlackHole.prototype.drawJets = function(ctx, intensity) {
+ // Get jet color from consumed object (default to blue if not set)
+ var baseColor = this.jetColor || '#6496ff';
+
+ // Convert hex to RGB
+ var r = parseInt(baseColor.substr(1, 2), 16);
+ var g = parseInt(baseColor.substr(3, 2), 16);
+ var b = parseInt(baseColor.substr(5, 2), 16);
+
+ // Lighten the color for the core
+ var coreR = Math.min(255, r + 50);
+ var coreG = Math.min(255, g + 50);
+ var coreB = Math.min(255, b + 50);
+
// Jet configuration (easily adjustable)
var config = {
- color: 'rgba(100, 150, 255, 0.8)', // Blue-white jet color
- coreColor: 'rgba(200, 220, 255, 0.9)', // Bright core
+ color: 'rgba(' + r + ', ' + g + ', ' + b + ', 0.8)',
+ coreColor: 'rgba(' + coreR + ', ' + coreG + ', ' + coreB + ', 0.9)',
length: this.radius * 8, // Jet length (8x black hole radius)
width: this.radius * 0.2, // Jet width at base
coreWidth: this.radius * 0.05, // Bright core width
@@ -595,7 +613,7 @@ BlackHole.prototype.drawJets = function(ctx, intensity) {
var jetColor = config.color.replace(/[\d.]+\)/, (alpha * 0.6) + ')');
jetGradient.addColorStop(0, jetColor);
jetGradient.addColorStop(0.3, jetColor.replace(/[\d.]+\)/, (alpha * 0.4) + ')'));
- jetGradient.addColorStop(1, 'rgba(100, 150, 255, 0)');
+ jetGradient.addColorStop(1, 'rgba(' + r + ', ' + g + ', ' + b + ', 0)');
ctx.fillStyle = jetGradient;
ctx.beginPath();
@@ -614,7 +632,7 @@ BlackHole.prototype.drawJets = function(ctx, intensity) {
var coreColor = config.coreColor.replace(/[\d.]+\)/, alpha + ')');
coreGradient.addColorStop(0, coreColor);
coreGradient.addColorStop(0.5, coreColor.replace(/[\d.]+\)/, (alpha * 0.5) + ')'));
- coreGradient.addColorStop(1, 'rgba(200, 220, 255, 0)');
+ coreGradient.addColorStop(1, 'rgba(' + coreR + ', ' + coreG + ', ' + coreB + ', 0)');
ctx.fillStyle = coreGradient;
ctx.beginPath();
diff --git a/style.css b/style.css
index 638302b..c803501 100644
--- a/style.css
+++ b/style.css
@@ -108,14 +108,17 @@ canvas {
right: 80px;
width: 26px;
height: 26px;
+ opacity: 0.36;
}
#hole-icon.pulse {
animation: holepulse 3s ease-in-out infinite;
+ transition: none;
}
@keyframes holepulse {
0%, 100% {
+ opacity: 0.36;
}
50% {
opacity: 0.8;