Ich hab da etwas gefunden in bauer/hausbauer.cc
Funktion get_city_building_from_list
Zitat: if(thislevel>level) {
if (selections.empty()) {
// Nothing of the correct level. Continue with search on a higher level.
level = thislevel;
}
else {
// We already found something of the correct level; stop.
break;
}
}
Aus meiner Sicht ist das daneben. Weil die Abfrage findet in der FOR Schleife statt. Die Schleife sollte sich eigentlich durch alle Gebäude lesen und ein passendes suchen. Der If bricht die Schleife ab wenn etwas gefunden wurde oder erhöht den gesuchte Level wenn ein höherer gefunden wird. Das kann so nur funktionieren wenn die Gebäudeliste strikt nach Level sortiert ist.
Die Routine ist alt und hat mit dem 3x3 Patch nichts zu tun. Die Frage ist warum das bisher einigermaßen funktioniert hat und jetzt entgleist.
ok die Liste ist sortiert.
trotzdem die Wahrscheinlichkeit ist groß das er nichts passendes findet und dann im Level hoch klettert.
Eine Begrenzung auf maximal 6 Level Sprünge kann ich hier nicht sehen.
Wenn er garnichts findet dann schlägt
Zitat: if( desc->is_allowed_climate(cl) && desc->get_distribution_weight()>0 && desc->is_available(time) && desc->get_x()*desc->get_y()<=area && desc->get_x()*desc->get_y()>=minarea ) {
// size check
if( (desc->get_x() <= maxsize.x || desc->get_y() <= maxsize.x) && (desc->get_x() >= minsize.x || desc->get_y() >= minsize.x) ) {
desc_at_least = desc;
}
}
zu. Das ist dann das letzte Gebäude in der Liste und damit weil sortiert immer das Level höchste.
-------------------
Für was eigentlich die doppelt gemoppelte Abfrage
also zuerst auf x*y prüfen und dann x und y einzeln?
Zitat: if( desc->get_x()*desc->get_y()<=area && ( desc->get_x() <= maxsize.x || desc->get_y() <= maxsize.x ) ) {
// or too small
if( desc->get_x()*desc->get_y()>=area && ( desc->get_x() >= minsize.x || desc->get_y() >= minsize.x ) ) {
sollte das nicht if( desc->get_x()*desc->get_y()>=minarea heißen?
-------
sollte das nicht
Zitat:desc->get_y() <= maxsize.x
nicht desc->get_y() <= maxsize.y heißen?