Hmmm...
Code:
if( clusters ) {
uint32 my_clusters = desc->get_clusters();
if( my_clusters & clusters ) {
chance *= stadt_t::get_cluster_factor();
}
else {
chance /= stadt_t::get_cluster_factor();
}
}
Wow, ich glaube, ich verstehe das sogar.
Wenn man Cluster sparsam einsetzt, werden dort, wo zufällig ein Gebäude mit Cluster spawnt, auch Gebäude des gleichen Typs nachfolgen - und zwar mit einer Wahrscheinlichkeit von cluster_factor².
Wenn ein Gebäude zwei Cluster-Werte hat, kann es in einer Nachbarschaft spawnen, welche bisher nur einen der beiden Cluster-Werte hat, und diese "umpolen", weil jedes weitere Gebäude, das in der Nachbarschaft spawnt, beide Werte gleichermaßen sieht.
Wenn alle Gebäude Cluster-Werte haben, aber keine überschneidenden Werte, werden Nachbarschaften den gleichen Cluster beibehalten. Nachbarschaften mit anderen Clustern können sich also allenfalls in Außengebieten formen.
Gibt es in C eine kosteneffiziente Methode, die Anzahl an Einser in einem Bitfield zu bestimmen?
Code:
if( my_clusters & clusters ) {
chance *= stadt_t::get_cluster_factor()*AnzahlEinser(my_cluster&cluster);
würde kumulative Cluster ermöglichen. Man könnte "stärkere" und "schwächere" Merkmale formen. Man könnte sagen, 1,2 und 3 stehen alle für Blockbauten und sind in allen aktiv, während 4,5 und 6 für verschiedene Farben steht und jeweils nur eines gesetzt wird. Dass es ein Blockbau wird, ist also sehr wahrscheinlich, die Farbe aber noch offen. Oder bei verschiedenen Merkmalen eben "je ähnlicher, desto wahrscheinlicher". Der Cluster_Factor muss dann natürlich entsprechend niedrig sein.