diff --git a/game.js b/game.js index 135d556..176b131 100644 --- a/game.js +++ b/game.js @@ -3,7 +3,7 @@ var strolling = false; var maxStomachDigest = 10; var maxBowelsDigest = 10; -var metric = true; +var unit = "metric"; var verbose = true; @@ -41,7 +41,7 @@ var macro = function look() { - var line1 = "You are a " + length(macro.height, metric, true) + " tall " + macro.species + ". You weigh " + mass(macro.mass, metric) + "."; + var line1 = "You are a " + length(macro.height, unit, true) + " tall " + macro.species + ". You weigh " + mass(macro.mass, unit) + "."; var line2 = "" @@ -90,9 +90,13 @@ function change_location() function toggle_units() { - metric = !metric; + switch(unit) { + case "metric": unit = "customary"; break; + case "customary": unit = "approx"; break; + case "approx": unit = "metric"; break; + } - document.getElementById("button-units").innerHTML = "Units: " + (metric ? "Metric" : "Customary"); + document.getElementById("button-units").innerHTML = "Units: " + unit.charAt(0).toUpperCase() + unit.slice(1); update(); } @@ -361,8 +365,8 @@ function update(lines = []) log.scrollTop = log.scrollHeight; - document.getElementById("height").innerHTML = "Height: " + (metric ? metricLength(macro.height) : customaryLength(macro.height)); - document.getElementById("mass").innerHTML = "Mass: " + (metric ? metricMass(macro.mass) : customaryMass(macro.mass)); + document.getElementById("height").innerHTML = "Height: " + length(macro.height, unit); + document.getElementById("mass").innerHTML = "Mass: " + mass(macro.mass, unit); for (var type in victims) { if (victims.hasOwnProperty(type)) { @@ -414,10 +418,10 @@ function grow() var heightDelta = newHeight - oldHeight; var massDelta = newMass - oldMass; - var heightStr = metric ? metricLength(heightDelta) : customaryLength(heightDelta); - var massStr = metric ? metricMass(massDelta) : customaryMass(massDelta); + var heightStr = length(heightDelta, unit); + var massStr = mass(massDelta, unit); - update(["Power surges through you as you grow " + heightStr + " and gain " + massStr,newline]); + update(["Power surges through you as you grow " + heightStr + " taller and gain " + massStr + " of mass",newline]); } // pop the list and digest that object diff --git a/units.js b/units.js index ba7ae67..5f431e8 100644 --- a/units.js +++ b/units.js @@ -2,14 +2,29 @@ function round(number,precision=3) { return Math.round(number*Math.pow(10,precision)) / Math.pow(10,precision); } -function mass(kg, metric=true, singular=false) { - return metric ? metricMass(kg, singular) : customaryMass(kg, singular); +function mass(kg, type="metric", singular=false) { + switch(type) { + case "metric": return metricMass(kg, singular); break; + case "customary": return customaryMass(kg, singular); break; + case "approx": return approxMass(kg, singular); break; + } } -function length(m, metric=true, singular=false) { - return metric ? metricLength(m, singular) : customaryLength(m, singular); +function length(m, type="metric", singular=false) { + switch(type) { + case "metric": return metricLength(m, singular); break; + case "customary": return customaryLength(m, singular); break; + case "approx": return approxLength(m, singular); break; + } } +function volume(m3, type="metric", singular=false) { + switch(type) { + case "metric": return metricVolume(m3, singular); break; + case "customary": return customaryVolume(m3, singular); break; + case "approx": return approxVolume(m3, singular); break; + } +} function metricMass(kg, singular=false) { if (kg < 1) { var mass = round(kg * 1000,0); @@ -47,6 +62,25 @@ function customaryMass(kg, singular=false) { } } +function approxMass(kg, singular=false) { + if (kg < 10000) { + var mass = round(kg/1000,2); + return (singular || mass == 1 ? "a car" : mass + " cars"); + } else if (kg < 100000) { + var mass = round(kg/6000,2); + return (singular || mass == 1 ? "an elephant" : mass + " elephants"); + } else if (kg < 1000000000) { + var mass = round(kg/54431.1,2); + return (singular || mass == 1 ? "a tank" : mass + " tanks"); + } else if (kg < 1e21) { + var mass = round(kg/1.01605e8,2); + return (singular || mass == 1 ? "an aircraft carrier" : mass + " aircraft carriers"); + } else { + var mass = round(kg/5.972e24,4); + return (singular || mass == 1 ? "the Earth" : mass + " Earths"); + } +} + function metricLength(m, singular=false) { if (m < 1) { var length = round(m * 100,0); @@ -75,3 +109,86 @@ function customaryLength(m, singular=false) { return length + (singular || length == 1 ? " mile" : " miles"); } } + +function approxLength(m, singular=false) { + if (m < 1000) { + var length = round(m/49,1); + return length + (singular || length == 1 ? " football field" : " football fields"); + } else if (m < 5000000) { + var length = round(m/449,1); + return length + (singular || length == 1 ? " Empire State Building" : " Empire State Buildings"); + } else if (m < 3474574*2) { + var length = round(m/3474574,1); + return length + (singular || length == 1 ? " moon" : " moons"); + } else if (m < 12.742e6*100) { + var length = round(m/12.742e6,1); + return length + (singular || length == 1 ? " earth" : " earths"); + } else if (m < 149.6e12) { + var length = round(m/149.6e9,1); + return length + (singular || length == 1 ? " AU" : " AUs"); + } else { + var length = round(m/9.4607e15,4); + return length + (singular || length == 1 ? " light year" : " light years"); + } +} + +function metricVolume(m3, singular=false) { + if (m3 < 1) { + var volume = round(m3/1000, 1); + return volume + (singular || volume == 1 ? " liter" : " liters"); + } else if (m3 < 1000000) { + var volume = round(m3, 0); + return volume + (singular || volume == 1 ? " cubic meter" : " cubic meters"); + } else if (m3 < 1e12){ + var volume = round(m3/1e9, 6); + return volume + (singular || volume == 1 ? " cubic kilometer" : " cubic kilometers"); + } else { + var volume = round(m3/1e9, 0); + return volume + (singular || volume == 1 ? " cubic kilometer" : " cubic kilometers"); + } +} + +function customaryVolume(m3, singular=false) { + var gallons = m3 * 264.172; + if (gallons < 1/16) { + var volume = round(gallons*128,0); + return volume + (singular || volume == 1 ? " fluid ounce" : " fluid ounces"); + } else if (gallons < 1/4) { + var volume = round(gallons*16,1); + return volume + (singular || volume == 1 ? " cup" : " cups"); + } else if (gallons < 1/2) { + var volume = round(gallons*8,1); + return volume + (singular || volume == 1 ? " pint" : " pints"); + } else if (gallons < 1) { + var volume = round(gallons*4,1); + return volume + (singular || volume == 1 ? " quart" : " quarts"); + } else if (gallons < 100) { + var volume = round(gallons,1); + return volume + (singular || volume == 1 ? " gallon" : " gallons"); + } else { + var volume = round(gallons,0); + return volume + (singular || volume == 1 ? " gallon" : " gallons"); + } +} + +function approxVolume(m3, singular=false) { + if (m3 < 1/10000) { + var volume = round(m3*1e6,0); + return (singular || volume == 1 ? "a shot" : volume + " shots"); + } else if (m3 < 1) { + var volume = round(m3*2000,0); + return (singular || volume == 1 ? "a glass" : volume + " glasses"); + } else if (m3 < 10) { + var volume = round(m3*2.64,1); + return(singular || volume == 1 ? "a bathtub" : volume + " bathtubs"); + } else if (m3 < 1e9) { + var volume = round(m3/1000,2); + return (singular || volume == 1 ? "an Olympic swimming pool" : volume + " Olympic swimming pools"); + } else if (m3 < 1e15) { + var volume = round(m3/1.8919e10,3); + return (singular || volume == 1 ? "a Great Salt Lake" : volume + " Great Salt Lakes"); + } else { + var volume = round(m3/3.547e17, 3); + return (singular || volume == 1 ? "an ocean" : volume + " oceans"); + } +}