ソースを参照

Redid how contents are generated. Ensured fill_area always gets something if it fits

tags/v0.7.0
Fen Dweller 7年前
コミット
d4577d7daa
1個のファイルの変更173行の追加75行の削除
  1. +173
    -75
      recursive-macro.js

+ 173
- 75
recursive-macro.js ファイルの表示

@@ -4,6 +4,7 @@ var things =
{
"Container": Container,
"Person": Person,
"Human": Human,
"Cow": Cow,
"Empty Car": EmptyCar,
"Car": Car,
@@ -35,6 +36,7 @@ var areas =
{
"Container": 0,
"Person": 0.33,
"Human": 0.33,
"Cow": 2,
"Car": 4,
"Bus": 12,
@@ -65,6 +67,7 @@ var masses =
{
"Container": 0,
"Person": 80,
"Human": 80,
"Cow": 300,
"Car": 1000,
"Bus": 5000,
@@ -95,6 +98,7 @@ var clusters =
{
"Container": 0,
"Person": 5,
"Human": 5,
"Cow": 15,
"Car": 3,
"Bus": 1,
@@ -121,6 +125,64 @@ var clusters =
"Macro": 0,
};

var contents =
{
"Container": [],
"Person": [],
"Human": [],
"Cow": [],
"Car": [["Person",1,4]],
"Bus": [["Person",2,30]],
"Tram": [["Person",10,50]],
"Train": [["Person",1,4],["Train Car",2,10]],
"Train Car": [["Person",10,40]],
"House": [["Person",0,8],["Empty Car",0,2]],
"Barn": [["Person",0,2],["Cow",30,70]],
"Small Skyscraper": [["Person",150,750],["Empty Car",10,50]],
"Large Skyscraper": [["Person",500,1500],["Empty Car",20,100]],
"Parking Garage": [["Person",10,200],["Empty Car",100,300],["Car",5,30]],
"Town": [["Person",10000,100000],["House",5000,50000],["Empty Car",200,800],["Car",500,80000],["Bus",5,25],["Train",5,25]],
"City": [["Person",100000,1500000],["House",20000,200000],["Empty Car",10000,100000],["Car",7500,125000],["Bus",200,400],["Train",10,50],["Tram",25,100],["Small Skyscraper",50,300],["Large Skyscraper",10,75],["Parking Garage",5,10]],
"Continent": [["Person",1000000,15000000],["House",2500,10000],["Car",25000,375000],["Train",50,500],["Town",500,1000],["City",50,250]],
"Planet": [["Continent",4,9]],
"Star": [],
"Solar System": [["Star",1,1],["Planet",5,15]],
"Galaxy": [["Star",1e9,500e9],["Solar System",1e8,500e8]],
"Soldier": [],
"Tank": [["Soldier",3,5]],
"Artillery": [["Soldier",4,6]],
"Helicopter": [["Soldier",4,16]],
"Micro": [[]],
"Macro": [[]]
};

// replace all instances of from with to
function contents_substitute(from,to) {
for (let key in contents) {
if (contents.hasOwnProperty(key)) {
let type = contents[key];
for (let i=0; i<type.length; i++) {
if (type[i][0] == from) {
type[i][0] = to;
}
}
}
}
}

function initContents(name,count) {
let result = {};
let type = contents[name];

for (let i=0; i<type.length; i++) {
let amount = distribution(type[i][1],type[i][2],count);
if (amount > 0)
result[type[i][0]] = new things[type[i][0]](amount);
}

return result;
}

// general logic: each step fills in a fraction of the remaining space

function fill_area(area, weights, variance=0.15)
@@ -154,7 +216,9 @@ function fill_area(area, weights, variance=0.15)

// the first few ones get a much better shot
while (loopvar > 0) {
if (loopvar <= clusters[candidate.name]) {
if (loopvar <= clusters[candidate.name] && loopvar == 1)
count += 1;
else if (loopvar <= clusters[candidate.name]) {
if (Math.random() < candidate.weight ? 1 : 0 || Math.random() < 0.75) {
count += 1;
}
@@ -356,7 +420,7 @@ function DefaultEntity() {
this.mass = defaultMass;
this.sum_property = defaultSumProperty;
this.merge = defaultMerge;
this.addContent = defaultAddContent;
return this;
}

@@ -405,7 +469,7 @@ function Person(count = 1) {
copy_defaults(this,new DefaultEntity());

this.count = count;
this.contents = {};
this.contents = initContents(this.name,this.count);


this.describeOne = function (verbose=true) {
@@ -435,13 +499,47 @@ function Person(count = 1) {
return this;
}

function Human(count = 1) {
this.name = "Human";

copy_defaults(this,new DefaultEntity());

this.count = count;
this.contents = initContents(this.name,this.count);


this.describeOne = function (verbose=true) {
var body = random_desc(["skinny","fat","tall","short","stocky","spindly"], (verbose ? 0.6 : 0));
var sex = random_desc(["man", "woman"], (verbose ? 1 : 0));
return "a " + merge_desc([body,sex]);
};

this.describe = function(verbose=true) {
if (verbose) {
if (count <= 3) {
var list = [];
for (var i = 0; i < count; i++) {
list.push(this.describeOne(this.count <= 2));
}
return merge_things(list);
} else {
return this.count + " people";
}
} else {
return (this.count > 1 ? this.count + " people" : "a person");
}
};

return this;
}

function Cow(count = 1) {
this.name = "Cow";

copy_defaults(this,new DefaultEntity());

this.count = count;
this.contents = {};
this.contents = initContents(this.name,this.count);


this.describeOne = function (verbose=true) {
@@ -474,7 +572,7 @@ function EmptyCar(count = 1) {

copy_defaults(this,new DefaultEntity());
this.count = count;
this.contents = {};
this.contents = initContents(this.name,this.count);



@@ -509,9 +607,9 @@ function Car(count = 1) {

copy_defaults(this,new DefaultEntity());
this.count = count;
this.contents = {};
this.contents = initContents(this.name,this.count);


this.addContent("Person", 1, 4, count);

this.describeOne = function(verbose=true) {
var color = random_desc(["black","black","gray","gray","blue","red","tan","white","white"], (verbose ? 1 : 0));
@@ -543,9 +641,9 @@ function Bus(count = 1) {

copy_defaults(this,new DefaultEntity());
this.count = count;
this.contents = {};
this.contents = initContents(this.name,this.count);


this.addContent("Person",2,30,count);

this.describeOne = function(verbose=true) {
var adjective = random_desc(["rusty","brand-new"], (verbose ? 0.3 : 0));
@@ -577,9 +675,9 @@ function Tram(count = 1) {

copy_defaults(this,new DefaultEntity());
this.count = count;
this.contents = {};
this.contents = initContents(this.name,this.count);


this.addContent("Person",10,50,count);

this.describeOne = function(verbose=true) {
var adjective = random_desc(["rusty","weathered"], (verbose ? 0.3 : 0));
@@ -615,11 +713,11 @@ function Train(count = 1) {
copy_defaults(this,new DefaultEntity());

this.count = count;
this.contents = {};
this.contents = initContents(this.name,this.count);



this.addContent("Person", 1, 4, count);

this.addContent("Train Car", 2, 10, count);

this.describeOne = function(verbose=true) {
var adjective = random_desc(["rusty","brand-new"], (verbose ? 0.3 : 0));
@@ -656,9 +754,9 @@ function TrainCar(count = 1) {
copy_defaults(this,new DefaultEntity());

this.count = count;
this.contents = {};
this.contents = initContents(this.name,this.count);


this.addContent("Person",10,40,count);

this.describeOne = function(verbose=true) {
var adjective = random_desc(["rusty","brand-new"], (verbose ? 0.3 : 0));
@@ -680,10 +778,10 @@ function House(count = 1) {
this.name = "House";
copy_defaults(this,new DefaultEntity());
this.count = count;
this.contents = {};
this.contents = initContents(this.name,this.count);



this.addContent("Person",0,8,count);
this.addContent("Empty Car",0,2,count);

this.describeOne = function(verbose=true) {
var size = random_desc(["little","two-story","large"], (verbose ? 0.5 : 0));
@@ -713,11 +811,11 @@ function Barn(count = 1) {
this.name = "Barn";
copy_defaults(this,new DefaultEntity());
this.count = count;
this.contents = {};
this.contents = initContents(this.name,this.count);



this.addContent("Person",0,2,count);

this.addContent("Cow",30,70,count);

this.describeOne = function(verbose=true) {
var size = random_desc(["little","big","large"], (verbose ? 0.5 : 0));
@@ -747,11 +845,11 @@ function SmallSkyscraper(count = 1) {
this.name = "Small Skyscraper";
copy_defaults(this,new DefaultEntity());
this.count = count;
this.contents = {};
this.contents = initContents(this.name,this.count);



this.addContent("Person",150,750,count);

this.addContent("Empty Car",10,50,count);

this.describeOne = function(verbose=true) {
var color = random_desc(["blue","white","gray","tan","green"], (verbose ? 0.5 : 0));
@@ -781,11 +879,11 @@ function LargeSkyscraper(count = 1) {
this.name = "Large Skyscraper";
copy_defaults(this,new DefaultEntity());
this.count = count;
this.contents = {};
this.contents = initContents(this.name,this.count);



this.addContent("Person",500,1500,count);

this.addContent("Empty Car",20,100,count);

this.describeOne = function(verbose=true) {
var color = random_desc(["blue","white","gray","tan","green"], (verbose ? 0.5 : 0));
@@ -814,13 +912,13 @@ function ParkingGarage(count = 1) {
this.name = "Parking Garage";
copy_defaults(this,new DefaultEntity());
this.count = count;
this.contents = {};
this.contents = initContents(this.name,this.count);




this.addContent("Person",10,200,count);

this.addContent("Empty Car",100,300,count);

this.addContent("Car",5,30,count);


this.describeOne = function(verbose=true) {
@@ -840,19 +938,19 @@ function Town(count = 1) {

copy_defaults(this,new DefaultEntity());
this.count = count;
this.contents = {};
this.contents = initContents(this.name,this.count);







this.addContent("Person",10000,100000,count);

this.addContent("House",5000,50000,count);

this.addContent("Empty Car",200,800,count);

this.addContent("Car",500,80000,count);

this.addContent("Bus",5,25,count);

this.addContent("Train",5,25,count);

this.describe = function(verbose = true) {
if (verbose) {
@@ -868,27 +966,27 @@ function City(count = 1) {

copy_defaults(this,new DefaultEntity());
this.count = count;
this.contents = {};
this.contents = initContents(this.name,this.count);











this.addContent("Person",100000,1500000,count);

this.addContent("House",20000,200000,count);

this.addContent("Empty Car",10000,100000,count);

this.addContent("Car",7500,125000,count);

this.addContent("Bus",200,400,count);

this.addContent("Train",10,50,count);

this.addContent("Tram",25,100,count);

this.addContent("Small Skyscraper",50,300,count);

this.addContent("Large Skyscraper",10,75,count);

this.addContent("Parking Garage",5,10,count);

this.describe = function(verbose = true) {
if (verbose) {
@@ -904,19 +1002,19 @@ function Continent(count = 1) {

copy_defaults(this,new DefaultEntity());
this.count = count;
this.contents = {};
this.contents = initContents(this.name,this.count);







this.addContent("Person",1000000,15000000,count);

this.addContent("House",2500,10000,count);

this.addContent("Car",25000,375000,count);

this.addContent("Train",50,500,count);

this.addContent("Town",500,1000,count);

this.addContent("City",50,250,count);

this.describe = function(verbose = true) {
if (verbose) {
@@ -932,9 +1030,9 @@ function Planet(count = 1) {

copy_defaults(this,new DefaultEntity());
this.count = count;
this.contents = {};
this.contents = initContents(this.name,this.count);


this.addContent("Continent",4,9,count);

this.describe = function(verbose = true) {
if (verbose) {
@@ -950,7 +1048,7 @@ function Star(count = 1) {

copy_defaults(this,new DefaultEntity());
this.count = count;
this.contents = {};
this.contents = initContents(this.name,this.count);

this.describe = function(verbose = true) {
return (this.count == 1 ? "a star" : this.count + " stars");
@@ -962,11 +1060,11 @@ function SolarSystem(count = 1) {

copy_defaults(this,new DefaultEntity());
this.count = count;
this.contents = {};
this.contents = initContents(this.name,this.count);



this.addContent("Star",1,1,count);

this.addContent("Planet",5,15,count);

this.describe = function(verbose = true) {
if (verbose) {
@@ -982,11 +1080,11 @@ function Galaxy(count = 1) {

copy_defaults(this,new DefaultEntity());
this.count = count;
this.contents = {};
this.contents = initContents(this.name,this.count);



this.addContent("Star",1e9,500e9,count);

this.addContent("Solar System",1e8,500e8,count);

this.describe = function(verbose = true) {
if (verbose) {
@@ -1002,7 +1100,7 @@ function Soldier(count = 1) {

copy_defaults(this,new DefaultEntity());
this.count = count;
this.contents = {};
this.contents = initContents(this.name,this.count);

this.describe = function(verbose = true) {
return (this.count == 1 ? "a soldier" : this.count + " soldiers");
@@ -1014,9 +1112,9 @@ function Tank(count = 1) {

copy_defaults(this,new DefaultEntity());
this.count = count;
this.contents = {};
this.contents = initContents(this.name,this.count);


this.addContent("Soldier",3,5,count);

this.describe = function(verbose = true) {
if (verbose) {
@@ -1032,9 +1130,9 @@ function Artillery(count = 1) {

copy_defaults(this,new DefaultEntity());
this.count = count;
this.contents = {};
this.contents = initContents(this.name,this.count);


this.addContent("Soldier",4,6,count);

this.describe = function(verbose = true) {
if (verbose) {
@@ -1050,9 +1148,9 @@ function Helicopter(count = 1) {

copy_defaults(this,new DefaultEntity());
this.count = count;
this.contents = {};
this.contents = initContents(this.name,this.count);


this.addContent("Soldier",4,16,count);

this.describe = function(verbose = true) {
if (verbose) {
@@ -1068,7 +1166,7 @@ function Micro(count = 1) {

copy_defaults(this,new DefaultEntity());
this.count = count;
this.contents = {};
this.contents = initContents(this.name,this.count);

this.describe = function(verbose = true) {
return (this.count == 1 ? "a micro" : this.count + " micros");
@@ -1080,7 +1178,7 @@ function Macro(count = 1) {

copy_defaults(this,new DefaultEntity());
this.count = count;
this.contents = {};
this.contents = initContents(this.name,this.count);

this.describe = function(verbose = true) {
return (this.count == 1 ? "a smaller macro" : this.count + " smaller macros");


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