modified: index.html
modified: js/game.js modified: js/ui.js modified: style.css
This commit is contained in:
+41
@@ -125,6 +125,47 @@ var Game = (function() {
|
||||
e.preventDefault();
|
||||
}
|
||||
});
|
||||
|
||||
// Global tooltip
|
||||
var globalTooltip = document.getElementById('global-tooltip');
|
||||
|
||||
document.addEventListener('mouseover', function(e) {
|
||||
var trigger = e.target.closest('[data-tooltip]');
|
||||
if (trigger) {
|
||||
globalTooltip.innerHTML = trigger.getAttribute('data-tooltip');
|
||||
globalTooltip.style.display = 'block';
|
||||
}
|
||||
});
|
||||
document.addEventListener('mouseout', function(e) {
|
||||
if (e.target.closest('[data-tooltip]')) {
|
||||
globalTooltip.style.display = 'none';
|
||||
}
|
||||
});
|
||||
document.addEventListener('mousemove', function(e) {
|
||||
if (globalTooltip.style.display === 'block') {
|
||||
var x = e.clientX + 18;
|
||||
var y = e.clientY + 20;
|
||||
|
||||
var tipW = globalTooltip.offsetWidth;
|
||||
var tipH = globalTooltip.offsetHeight;
|
||||
|
||||
// Flip left if overflowing right edge
|
||||
if (x + tipW > window.innerWidth) {
|
||||
x = e.clientX - tipW - 10;
|
||||
}
|
||||
// Flip above if overflowing bottom edge
|
||||
if (y + tipH > window.innerHeight) {
|
||||
y = e.clientY - tipH - 10;
|
||||
}
|
||||
|
||||
// Clamp to left/top edges as a fallback
|
||||
if (x < 0) x = 0;
|
||||
if (y < 0) y = 0;
|
||||
|
||||
globalTooltip.style.left = x + 'px';
|
||||
globalTooltip.style.top = y + 'px';
|
||||
}
|
||||
});
|
||||
|
||||
animate(currentTime);
|
||||
UI.update(state, CONFIG);
|
||||
|
||||
@@ -227,16 +227,7 @@ var UI = {
|
||||
const bhMassText = this.formatMass(state.blackHoleTotalMass, { forceSolarMass: true });
|
||||
const consumedText = this.formatMass(state.totalMassConsumedEver);
|
||||
|
||||
this.elements.totalMass.innerHTML = `
|
||||
<span class="tooltip-trigger">
|
||||
Black Hole Mass: ${bhMassText}
|
||||
<span class="tooltip">
|
||||
The mass of your black hole in solar masses.<br>
|
||||
1 Solar Mass (M☉) ≈ 1.989 × 10³⁰ kg.<br><br>
|
||||
Total mass absorbed:<br>
|
||||
${consumedText}
|
||||
</span>
|
||||
`;
|
||||
this.elements.totalMass.innerHTML = '<span class="tooltip-trigger" data-tooltip="The mass of your black hole in solar masses.<br>1 Solar Mass (M☉) ≈ 1.989 × 10³⁰ kg.<br><br>Total mass absorbed:<br>' + consumedText + '">' + 'Black Hole Mass: ' + bhMassText + '</span>';
|
||||
},
|
||||
|
||||
updateRateDisplay: function(state, config) {
|
||||
@@ -348,13 +339,7 @@ var UI = {
|
||||
gameState.ktypeUpgradeLevel +
|
||||
gameState.gtypeUpgradeLevel;
|
||||
|
||||
el.innerHTML =
|
||||
'<span class="tooltip-trigger">' +
|
||||
'Total Level: ' + totalLevel +
|
||||
'<span class="tooltip">' +
|
||||
'Sum of all upgrades.<br>' +
|
||||
'</span>' +
|
||||
'</span>';
|
||||
el.innerHTML = '<span class="tooltip-trigger" data-tooltip="Sum of all upgrades.">' + 'Total Level: ' + totalLevel + '</span>';
|
||||
|
||||
var starBonusEl = document.getElementById('star-bonus');
|
||||
if (!starBonusEl) return;
|
||||
@@ -379,11 +364,7 @@ var UI = {
|
||||
starTooltip += 'G-Type: +' + gBonus.toFixed(0) + '%';
|
||||
}
|
||||
|
||||
starBonusEl.innerHTML =
|
||||
'<span class="tooltip-trigger">' +
|
||||
'<br><span style="color:#FC6;">Star Bonus: +' + totalStarBonus + '%</span>' +
|
||||
'<span class="tooltip">' + starTooltip + '</span>' +
|
||||
'</span>';
|
||||
starBonusEl.innerHTML = '<span class="tooltip-trigger" data-tooltip="' + starTooltip.replace(/"/g, '"') + '">' + '<br><span style="color:#FC6;">Star Bonus: +' + totalStarBonus + '%</span>' + '</span>';
|
||||
},
|
||||
|
||||
updateActiveObjects: function() {
|
||||
@@ -423,15 +404,9 @@ var UI = {
|
||||
var tooltipText = 'Asteroids are rocky, airless bodies that range in size from tiny pebbles to hundreds of kilometers across. Some asteroids have moons or even binary companions.<br><br>Rate: ' + rate + '/sec<br>Bonus: ' + bonusPercent + '%';
|
||||
if (!gameState.cometUnlocked) tooltipText += '<br><span style="color:#0FF;">Unlocks Comets at level 20</span>';
|
||||
|
||||
this.elements.asteroidLevel.innerHTML = '<span class="tooltip-trigger">Asteroids: Level ' +
|
||||
gameState.asteroidUpgradeLevel +
|
||||
'<span class="tooltip">' + tooltipText + '</span></span>';
|
||||
|
||||
this.elements.asteroidUpgradeBtn.textContent =
|
||||
'Upgrade (Cost: ' + this.formatMass(gameState.asteroidUpgradeCost) + ')';
|
||||
|
||||
this.elements.asteroidUpgradeBtn.disabled =
|
||||
gameState.totalMassConsumed < gameState.asteroidUpgradeCost;
|
||||
this.elements.asteroidLevel.innerHTML = '<span class="tooltip-trigger" data-tooltip="' + tooltipText.replace(/"/g, '"') + '">Asteroids: Level ' + gameState.asteroidUpgradeLevel + '</span>';
|
||||
this.elements.asteroidUpgradeBtn.textContent = 'Upgrade (Cost: ' + this.formatMass(gameState.asteroidUpgradeCost) + ')';
|
||||
this.elements.asteroidUpgradeBtn.disabled = gameState.totalMassConsumed < gameState.asteroidUpgradeCost;
|
||||
},
|
||||
|
||||
updateCometUpgrade: function(gameState) {
|
||||
@@ -440,15 +415,9 @@ var UI = {
|
||||
var tooltipText = 'Comets are small icy bodies that typically release gas and dust, forming a glowing coma and often a tail. They are composed mainly of ice, rock, and organic compounds.<br><br>Rate: ' + rate + '/min<br>Bonus: ' + bonusPercent + '%';
|
||||
if (!gameState.planetUnlocked) tooltipText += '<br><span style="color:#0FF;">Unlocks Planets at level 15</span>';
|
||||
|
||||
this.elements.cometLevel.innerHTML = '<span class="tooltip-trigger">Comets: Level ' +
|
||||
gameState.cometUpgradeLevel +
|
||||
'<span class="tooltip">' + tooltipText + '</span></span>';
|
||||
|
||||
this.elements.cometUpgradeBtn.textContent =
|
||||
'Upgrade (Cost: ' + this.formatMass(gameState.cometUpgradeCost) + ')';
|
||||
|
||||
this.elements.cometUpgradeBtn.disabled =
|
||||
gameState.totalMassConsumed < gameState.cometUpgradeCost;
|
||||
this.elements.cometLevel.innerHTML = '<span class="tooltip-trigger" data-tooltip="' + tooltipText.replace(/"/g, '"') + '">Comets: Level ' + gameState.cometUpgradeLevel + '</span>';
|
||||
this.elements.cometUpgradeBtn.textContent = 'Upgrade (Cost: ' + this.formatMass(gameState.cometUpgradeCost) + ')';
|
||||
this.elements.cometUpgradeBtn.disabled = gameState.totalMassConsumed < gameState.cometUpgradeCost;
|
||||
},
|
||||
|
||||
updatePlanetUpgrade: function(gameState) {
|
||||
@@ -457,15 +426,9 @@ var UI = {
|
||||
var tooltipText = 'Planets are roughly spherical accumulations of rock and metal, with solid surfaces and relatively thin atmospheres. Local examples include Mercury, Earth, and Pluto. They may vary greatly in size.<br><br>Rate: ' + rate + '/hour<br>Bonus: ' + bonusPercent + '%';
|
||||
if (!gameState.giantUnlocked) tooltipText += '<br><span style="color:#0FF;">Unlocks Giants at level 10</span>';
|
||||
|
||||
this.elements.planetLevel.innerHTML = '<span class="tooltip-trigger">Planets: Level ' +
|
||||
gameState.planetUpgradeLevel +
|
||||
'<span class="tooltip">' + tooltipText + '</span></span>';
|
||||
|
||||
this.elements.planetUpgradeBtn.textContent =
|
||||
'Upgrade (Cost: ' + this.formatMass(gameState.planetUpgradeCost) + ')';
|
||||
|
||||
this.elements.planetUpgradeBtn.disabled =
|
||||
gameState.totalMassConsumed < gameState.planetUpgradeCost;
|
||||
this.elements.planetLevel.innerHTML = '<span class="tooltip-trigger" data-tooltip="' + tooltipText.replace(/"/g, '"') + '">Planets: Level ' + gameState.planetUpgradeLevel + '</span>';
|
||||
this.elements.planetUpgradeBtn.textContent = 'Upgrade (Cost: ' + this.formatMass(gameState.planetUpgradeCost) + ')';
|
||||
this.elements.planetUpgradeBtn.disabled = gameState.totalMassConsumed < gameState.planetUpgradeCost;
|
||||
},
|
||||
|
||||
updateGiantUpgrade: function(gameState) {
|
||||
@@ -474,15 +437,9 @@ var UI = {
|
||||
var tooltipText = 'Gas giants are large planets made mostly of hydrogen and helium, with thick atmospheres and no solid surface.<br>Ice giants are similar but contain higher amounts of frozen materials like water, ammonia, and methane in their atmospheres.<br>Local examples include Jupiter and Neptune.<br><br>Rate: ' + rate + '/6hours<br>Bonus: ' + bonusPercent + '%';
|
||||
if (!gameState.mtypeUnlocked) tooltipText += '<br><span style="color:#0FF;">Unlocks M-Type at level 5</span>';
|
||||
|
||||
this.elements.giantLevel.innerHTML = '<span class="tooltip-trigger">Giants: Level ' +
|
||||
gameState.giantUpgradeLevel +
|
||||
'<span class="tooltip">' + tooltipText + '</span></span>';
|
||||
|
||||
this.elements.giantUpgradeBtn.textContent =
|
||||
'Upgrade (Cost: ' + this.formatMass(gameState.giantUpgradeCost) + ')';
|
||||
|
||||
this.elements.giantUpgradeBtn.disabled =
|
||||
gameState.totalMassConsumed < gameState.giantUpgradeCost;
|
||||
this.elements.giantLevel.innerHTML = '<span class="tooltip-trigger" data-tooltip="' + tooltipText.replace(/"/g, '"') + '">Giants: Level ' + gameState.giantUpgradeLevel + '</span>';
|
||||
this.elements.giantUpgradeBtn.textContent = 'Upgrade (Cost: ' + this.formatMass(gameState.giantUpgradeCost) + ')';
|
||||
this.elements.giantUpgradeBtn.disabled = gameState.totalMassConsumed < gameState.giantUpgradeCost;
|
||||
},
|
||||
|
||||
updateMtypeUpgrade: function(gameState) {
|
||||
@@ -491,13 +448,9 @@ var UI = {
|
||||
var tooltipText = 'M-types, also known as red dwarfs, are the smallest and coolest stars with masses ranging from about 0.08 to 0.45 M☉.<br>They are the most common star in the universe, making up roughly three quarters of all main-sequence stars, but are not easily visible due to their low luminosity.<br><br>Rate: ' + rate + '/day<br>Bonus: ' + bonusPercent + '%';
|
||||
if (!gameState.ktypeUnlocked) tooltipText += '<br><span style="color:#0FF;">Unlocks K-Type at level 5</span>';
|
||||
|
||||
this.elements.mtypeLevel.innerHTML = '<span class="tooltip-trigger">M-Type: Level ' +
|
||||
gameState.mtypeUpgradeLevel +
|
||||
'<span class="tooltip">' + tooltipText + '</span></span>';
|
||||
this.elements.mtypeUpgradeBtn.textContent =
|
||||
'Upgrade (Cost: ' + this.formatMass(gameState.mtypeUpgradeCost) + ')';
|
||||
this.elements.mtypeUpgradeBtn.disabled =
|
||||
gameState.totalMassConsumed < gameState.mtypeUpgradeCost;
|
||||
this.elements.mtypeLevel.innerHTML = '<span class="tooltip-trigger" data-tooltip="' + tooltipText.replace(/"/g, '"') + '">M-Type: Level ' + gameState.mtypeUpgradeLevel + '</span>';
|
||||
this.elements.mtypeUpgradeBtn.textContent = 'Upgrade (Cost: ' + this.formatMass(gameState.mtypeUpgradeCost) + ')';
|
||||
this.elements.mtypeUpgradeBtn.disabled = gameState.totalMassConsumed < gameState.mtypeUpgradeCost;
|
||||
},
|
||||
|
||||
updateKtypeUpgrade: function(gameState) {
|
||||
@@ -506,27 +459,19 @@ var UI = {
|
||||
var tooltipText = 'K-types, also known as orange dwarfs, are medium-sized stars that are cooler than the Sun, with masses ranging from about 0.45 to 0.8 M☉. They are known for their stability and long lifespans (20 to 70 billion years), making them potential candidates for supporting inhabited planets.<br><br>Rate: ' + rate + '/2days<br>Bonus: ' + bonusPercent + '%';
|
||||
if (!gameState.gtypeUnlocked) tooltipText += '<br><span style="color:#0FF;">Unlocks G-Type at level 5</span>';
|
||||
|
||||
this.elements.ktypeLevel.innerHTML = '<span class="tooltip-trigger">K-Type: Level ' +
|
||||
gameState.ktypeUpgradeLevel +
|
||||
'<span class="tooltip">' + tooltipText + '</span></span>';
|
||||
this.elements.ktypeUpgradeBtn.textContent =
|
||||
'Upgrade (Cost: ' + this.formatMass(gameState.ktypeUpgradeCost) + ')';
|
||||
this.elements.ktypeUpgradeBtn.disabled =
|
||||
gameState.totalMassConsumed < gameState.ktypeUpgradeCost;
|
||||
this.elements.ktypeLevel.innerHTML = '<span class="tooltip-trigger" data-tooltip="' + tooltipText.replace(/"/g, '"') + '">K-Type: Level ' + gameState.ktypeUpgradeLevel + '</span>';
|
||||
this.elements.ktypeUpgradeBtn.textContent = 'Upgrade (Cost: ' + this.formatMass(gameState.ktypeUpgradeCost) + ')';
|
||||
this.elements.ktypeUpgradeBtn.disabled = gameState.totalMassConsumed < gameState.ktypeUpgradeCost;
|
||||
},
|
||||
|
||||
updateGtypeUpgrade: function(gameState) {
|
||||
var rate = (CONFIG.BASE_GTYPE_SPAWN_INTERVAL / gameState.currentGtypeSpawnInterval).toFixed(2);
|
||||
var bonusPercent = (gameState.gtypeUpgradeLevel * CONFIG.UPGRADE_BONUS_PER_LEVEL_GTYPE * 100).toFixed(0);
|
||||
var tooltipText = 'G-Types, also known as yellow dwarfs, are medium-sized stars that are about the size of our Sun (~1 M☉). The term yellow dwarf is a misnomer, as most G-Types (including the Sun) are in fact white. These stars are stable and long-lived, making them strong candidates for hosting habitable planets.<br><br>Rate: ' + rate + '/3days<br>Bonus: ' + bonusPercent + '%';
|
||||
|
||||
this.elements.gtypeLevel.innerHTML = '<span class="tooltip-trigger">G-Type: Level ' +
|
||||
gameState.gtypeUpgradeLevel +
|
||||
'<span class="tooltip">' + tooltipText + '</span></span>';
|
||||
this.elements.gtypeUpgradeBtn.textContent =
|
||||
'Upgrade (Cost: ' + this.formatMass(gameState.gtypeUpgradeCost) + ')';
|
||||
this.elements.gtypeUpgradeBtn.disabled =
|
||||
gameState.totalMassConsumed < gameState.gtypeUpgradeCost;
|
||||
|
||||
this.elements.gtypeLevel.innerHTML = '<span class="tooltip-trigger" data-tooltip="' + tooltipText.replace(/"/g, '"') + '">G-Type: Level ' + gameState.gtypeUpgradeLevel + '</span>';
|
||||
this.elements.gtypeUpgradeBtn.textContent = 'Upgrade (Cost: ' + this.formatMass(gameState.gtypeUpgradeCost) + ')';
|
||||
this.elements.gtypeUpgradeBtn.disabled = gameState.totalMassConsumed < gameState.gtypeUpgradeCost;
|
||||
},
|
||||
|
||||
formatMass: function(massKg, options = {}) {
|
||||
|
||||
Reference in New Issue
Block a user