Themabewertung:
  • 0 Bewertung(en) - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Stadtwachstum Release vs Nightly R8788
#1
Ich habe eine Stadt  gebaut mit nur Level 1 Häuser.
Wenn ich nun die Einwohnerzahl erhöhe, also die Stadt wachsen lasse werden neue Häuser gebaut oder die bestehenden renoviert.

Im Release 120.4.1
werden die Häuser gegen Level 2 oder 3 getauscht.

Im Nightly R8788
werden Häuser in den höchsten Levelstufen gebaut, in unserem Fall Level 45-58

Dieser Effekt tritt besonders ohne Epoche auf.
Zitieren
#2
Genau das, was ich schon mal angesprochen hatte. Meine nightly ist aber eine andere. Glaub 8765 (im Büro kann ich gerade nicht zu Hause nachsehen Smile). Nach kurzer Zeit gibt´s dann fast nur noch Hochhäuser und die vielen Einwohner konzentrieren sich auf kleinster Fläche.
Zitieren
#3
Deine Reklamation war Anlass für meinen Versuch das Problem einzukreisen. Wink
Zitieren
#4
Ich habe sowas auch schon beobachtet, auch mit Epochen.
Zitieren
#5
Das kann ich für pak64 nicht bestätgen. Gibt es vielleicht zuviel RES und zwenig COM oder vice versa, so dass der einzige Weg hohe COM oder RES leel sind?
Zitieren
#6
Nein, es gibt reichlich aus allen Levelstufen und com, res und ind

Das Verhalten der Programmversionen ist auch definitiv unterschiedlich.

Aber möglicherweise muss mindestens ein Mehrkachelhaus vorhanden sein.

Nein an den Mehrkachelhaus hängt es nicht.

Im Pak64 das gleiche Verhalten, warum stehen in dem kleinen Dorf zwei res und ein com vom höchsten Level?
[Bild: pak64.png]
Zitieren
#7
Wäre auch unlogisch - in der Vergangenheit gab es, mit weniger Stadtgebäuden in unserem Set, das Problem nicht.
Zitieren
#8
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?
Zitieren
#9
wenn man die ganze Routine so schreibt dann geht es

Zitat:static const building_desc_t* get_city_building_from_list(const vector_tpl<const building_desc_t*>& list, int level, uint16 time, climate cl, uint32 clusters, koord minsize, koord maxsize )
{
    weighted_vector_tpl<const building_desc_t *> selections(16);

//    DBG_MESSAGE("hausbauer_t::get_aus_liste()","target level %i", level );
    const building_desc_t *desc_at_least=NULL;
    FOR(vector_tpl<building_desc_t const*>, const desc, list) {
        if( (desc->is_allowed_climate(cl)   || cl==MAX_CLIMATES  )  &&
             desc->get_distribution_weight() > 0  &&
             desc->is_available(time)  &&
             // size check
             desc->get_x() <= maxsize.x  &&  desc->get_y() <= maxsize.y  &&
             desc->get_x() >= minsize.x  &&  desc->get_y() >= minsize.y  ) {
            desc_at_least = desc;
            const int thislevel = desc->get_level();
            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;
                }
            }
            if( thislevel == level ) {
//                DBG_MESSAGE("hausbauer_t::get_city_building_from_list()","appended %s at %i", desc->get_name(), thislevel );
                /* Level, time period, and climate are all OK.
                 * Now modify the chance rating by a factor based on the clusters.
                */
                // FIXME: the factor should be configurable by the pakset/
                int chance = desc->get_distribution_weight();
                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();
                    }
                }
                selections.append(desc, chance);
            }

        }
    }

    if(selections.get_sum_weight()==0) {
        // this is some level below, but at least it is something
        return desc_at_least;
    }
    if(selections.get_count()==1) {
        return selections.front();
    }
    // now there is something to choose
    return pick_any_weighted(selections);
}

[Bild: 3k_city.png]

aber ich bekomme schon wieder meine Allergie Sick
Zitieren
#10
Das mit den Leveln sieht tatsächlich nach einem Fehler aus, der aber in den mesiten Paksets versteckt ist, weil dort die meisten Gebäude für alle Klimazonen sind, und daher immer was passendes gefunden wird.

Der komische Test auf Größe liegt daher, dass es aszmmetrische Gebäude gibt, die nicht alle Rotationen haben, und asymmetrische Gebäude, die die falsche Rotation also Ausrichtung 0 haben, aber rotieren können.
Zitieren


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste