Vor ein paar Tagen habe ich angefangen die Grundlagen fuer die individuellen Gebaeudeausbauten DB-seitig zu legen.
Was sind diese Gebaeudeausbauten eigentlich? Nun, in Insulae kann ein Gebaede ueber mehrere “AddOns” verfuegen. Diese AddOns haben Einfluss auf die maximale Produktionsmenge innerhalb eines definierten Zeitraumes. Je hoeher die Stufen eines “AddOns”, umso staerker die Produktion.
Waehrend bei allen produzierenden Gebaeuden die Fertigkeiten der Insassen, ein von der Gebaeudeart abhaengiger Koeffizient und die Landguete eine Rolle spielt, fliesst grundsaetzlich noch die Stufe der fuer jeden Gebaeudetyp unterschiedlichen Ausbauten hinzu. Bei den reinen Veredelungsgebaeuden spielt die Landguete allerdings keine Rolle.
Dabei besitzt jedes Gebaeude sein eigenes Set an Ausbauten. In einem Bauernhof ist es zum Beispiel moeglich die Felder und Staelle aufzuwerten um die Produktion von Getreide und Kuehen anzukurbeln. Felder und Staelle machen jedoch bei einer Goldmine keinen Sinn, dafuer gibt es dort Stollen welche die Goldfoerderung antreiben. Auch die zum Steigern dieser Ausbaustufe noetigen Waren sind dabei unterschiedlich und sind von dem Ausbau, nicht vom Gebaeude abhaengig.
Dies umzusetzen ist auf verschiedene Arten moeglich. Zum einen haette ich von vornerein sagen koennen das es nur n Ausbauten geben darf. Und im folgenden dann lediglich hart codieren das Ausbau 1 bei dem Bauernhof eben “Felder” heisst und bei der Goldmine “Stollen”, die benötigten Waren ebenfalls hart codiert in den Skripten hinterlegen. Das empfinde ich aber als eine unfeine Einschraenkung der Moeglichkeiten. Also blieb mir nur die Variante sowohl die einzelnen Ausbauten, aber auch deren kosten flexibel in der Datenbank zu hinterlegen. Aus folgendem Grunde. Ich moechte mir die Moeglichkeit offen halten schnell Aenderungen am System zu ermoeglichen. Aenderungen welche ggf. auch von reinen Moderatoren vorgenommen werden koennen anhand einer Onlinemaske und nicht eine Aenderung im Programmcode erfordern. Die Konsequenz, Performanceeinbußen, sind mir durchaus bewusst. Aber bei Insulae geht es ja nicht allein um Performance, sondern um eine technische Spielwiese.
Ich habe also um ein Gebaeude zu verwalten 5 Relationen in meine Datenbank. In der Relation archetyp.haus sind die Grundlegen Daten der Gebaeude abgelegt. Die Individuelle ID, der Name, Beschreibung etc. Zu einem Gebaeude sind dann in der Relation archetyp.haus_ausbau die fuer ein Gebaeude zutreffenden AddOns abgelegt, ebenfalls mit Name, Beschreibung und so weiter. Ein Gebaeude kann keines, eines oder mehrere AddOns besitzen. Dazu referenzierend gibt es noch eine Relation archetyp.haus_ausbau_ware in welcher abgelegt ist welche Waren fuer eine Steigerung der Stufe notwendig sind. Dabei wird von einer Berechnung von

Wobei
- S die aktuelle Stufe des Ausbau ist
- G die Grundwarenmenge
- und P der Phasenkoeffizient.
ausgegangen. Diese Berechnung wird fuer jeden Warentyp vorgenommen. Wie leicht zu erkennen ist, wird ein Ausbau mit jeder weiteren Stufe teurer. Der Phasenkoeffizient kann genutzt werden um die Kosten pro Phase unterschiedlich zu gestalten. In meiner primaeren Phase nutze ich hier den Wert 1.0. In einer “Speed-Runde” ist denkbar den Wert hierfuer niedriger zu halten um schneller an hoeher Ausgebaute Gebaeude zu gelangen. Aber, steuerbar ohne noch nachtraeglich in den Programmcode einzugreiffen.
Wird nun ein neues Gebaeude gebaut, wird ein neuer Eintrag in der Relation welt.haus erzeugt. Aus dieser geht eindeutig hervor wem das Gebaeude gehoert, welcher Gebaeudetyp es ist, wo es steht, zusaetzlich zu ein paar weiteren Werten. Die Insert-Query aktiviert dabei gleich einen Trigger welcher in der Relation welt.haus_ausbau die Eintraege ueber die fuer das Gebaeude vorliegenden Ausbauten vornimmt. An dieser Stelle ist bewusst ein Trigger verwendet worden um diese Logik nicht zusaetzlich im Programm abzulegen. Gleichzeitig sind in welt.haus_ausbau auch die Stufen der Ausbauten hinterlegt.
Warum nun der ganze Aufwand? Ganz einfach:
- eine Onlinemaske um ein neues Gebaeude samt Kosten, Bauland etc. zu hinterlegen anzulegen
- eine Onlinemaske um fuer einen Gebaeudearchetyp ein neues AddOn zu erstellen und mit Baukosten zu hinterlegen
- eine weitere Maske um einen Gebaeudearchetyp im Spiel zu aktivieren bzw. zu deaktiviereb.
- weiterin eine Maske um die Daten eines Ausbaus zu veraendern. Kann ja sein das ich die Kosten nachtraeglich nochmal veraendern will.
Und schon habe ich eine Verwaltung welche kaum noch Eingriffe in den Programmcode erfordert, eine Verwaltung welche auch von nicht technischem Personal erfolgen kann. Ebenso ist es ueber die Daten eines Ausbaues auch moeglich seine Produktionsformel grundlegend zu veraendern. Die Gewichtung der einzelnen Parameter welcher ueber die Produktionshoehe entscheiden ist so ebenfalls ohne Codeseitige Arbeiten moeglich. Komplex in der Realisierung und auch fuer die Produktionsauswertungen nicht das schnellste, aber was ist heutzutage schon nach viel begrenzte Rechenkapazitaet im Vergleich zu vor fuenf Jahren? :) Ganz davon abgesehen das ich hier auf einer technischen Spielwiese unterwegs bin, nicht im realen Leben.
Klar, in den Relationen stecken noch ein paar Elemente mehr, welche ich hier jedoch nicht weiter erlaeutern will. Aber wer Insulae oder Scherbenwelten kennt, der weiss das noch irgendwo die Information sein muss was in einem Gebaeude produziert wird. Generell gilt jedoch:

Wobei
- S die Fertigkeitsstufen der Insassen,
- A die Stufe des Ausbaus,
- F die Feldstaerke,
- H der fuer dieses Gebaeude spezielle Koeffizient,
- W die Modifikation gemaes des aktuellen Wetters,
- G ein Globaler Produktionsmodifikator ist und
- P ein fuer die Phase gueltiger Koeffizient ist.
Der Skill wird wahrscheinlich von mir irgendwann noch einmal differenziert in Gesamtskill, hoechster Einzelskill, geringester Einzelskill etc. Fuer den ersten Betrieb langt mir aber dieses Berechnungsmodell. Klingt erstmal kompliziert, ist es aber in keinster Weise. Und durch ein paar Filternde Tricks wird auch die Auswertungsrunde, also die Berechnungs wenn alle Gebaeude in Insulae produzieren, auch nicht umstaendlich in die Laenge gezogen.
Einen weitere Moeglichkeit hat dieses System: Ich bin in der Lage einem Gebaeude einen Ausbau zuzuordnen den dieser Gebaeudetyp fuer gewoehnlich nicht besitzt. Eine Holzhuette die auch gleich Fleisch produziert? Einfach den Ausbau dem spezifischen Gebaeude eines Spielers zuweisen und fertig. Keine statischen Gebaeude mehr, sondern eine flexible Grundlage. Lediglich an zwei Stelle habe ich begrenzend die Strukturen gebildet:
- es kann nur eine Fertigkeit fuer die Produktion eines Ausbaus herangezogen werden
- ein Ausbau kann nur eine Ware produzieren
Dieses auch noch weiter zu unterteilen wuerde dann, sogar fuer meine Verhaeltnisse, unnoetige Einbussen auf die Betriebsgeschwindigkeit besitzen.
Das sind die Grundzuege meiner Gebaeudestruktur. Datenbankseitig steht alles, Grundzuege sind auch bereits in den den Spielern zur Verfuegung stehenden Skripten enthalten. Lediglich die Onlinemasken fuer die Verwaltung stehen noch nicht. Aber die kommen noch. Und wer weiss, eventuell faellt mir ja noch bei der Implementierung der anderen Dinge etwas ein was dort beruecksichtigt werden muss.