ソースを参照

Added support for approximate units.

tags/v0.7.0
Fen Dweller 7年前
コミット
6fff45274c
2個のファイルの変更134行の追加13行の削除
  1. +13
    -9
      game.js
  2. +121
    -4
      units.js

+ 13
- 9
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


+ 121
- 4
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");
}
}

読み込み中…
キャンセル
保存