Das Erbe
Unterschiedliche Wege.
Wieder einen kleinen Schritt weiter.
Leider brauchte das A*Star Pfadfinding viel zu lange um einen Pfad zu finden ca 160 Millisecs.
Wegen dem ganzem sortieren usw.
Ich habe ihn soweit optimiert damit er jetzt nur noch 5-20 Millisecs benötigt.
Den Pfad glätten bzw anschließend abzurunden war deutlich schwieriger als gedacht.
Vorallem wenn alle Ideen die man so hat für das glätten nicht zu dem erwünschten Ergebnis führen.
Nach einer ganzen Woche rum probieren habe ich es letztendlich doch noch geschafft.
Wie schon geschrieben ist es mir wichtig das unterschiedliche Wege zum Ziel gefunden werden.
Damit sich die Schiffe auf der Map etwas verteilen und nicht wie bei Pirates Empire immer ein und die selbe Route fahren.
Auch wenn es hin und wieder noch ein paar Ecken im Pfad gibt, ist das garnicht so schlimm.
Die Schiffe werden prüfen können ob es eine Abkürzung gibt, und diese bei bedarf nutzen.
Nun geht darum das die Schiffe auch den gefundenen Pfad abfahren,
damit endlich mal etwas Bewegung rein kommt.
Die grauen Blöcke sind die benutzten Netzpunkte.
A*Star Pfadfinding
Das Pfadfinding ist wohl einer der wichtigsten Teile des Spiels,
und die Grundlage für die weiteren Schritte.
Ganz anders wie bei Pirates Empire damals habe ich es diesesmal nicht unterschätzt.
Wichtig ist ein Pfad der möglichst geringe Richtungänderungen hat,
und nicht immer gerade so am Land vorbei führt.
Dazu habe ich ersteinmal ein Netz erstellt.
Am Land viele Wegpunkte und auf offener See wenig.
Zwischen den Wegpunkten gibt es bis zu 10 Verbindungen.
Sie werden im Uhrzeigersinn erstellt damit auch jeder Wegpunkt in allen vier Richtungen verbunden ist.
Die Grundlage für das Pfadfinding stellt ein A*Star Algorithmus dar.
Die Richtung zum Ziel wird geschätzt.
Es werden die längsten Verbindungen bevorzugt, und die sind nun mal auf offener See.
Weil dort weniger Wegpunkte sind.
Die Länge der Verbindung wird umso kürzer je größer der Winkelunterschied zwischen den Wegpunkten ist.
Wenn dann noch der Wegpunkt nahe am Land ist dann wird die Länge sogar negativ und der Wegpunkt
bzw. die Verbindung sehr unattraktiv.
Schon mit sehr geringen Gewichtunggen der einzelnen Variablen entstehten ganz
unterschiedlicher Wege.
Es sind viele Variablen die da einfließen. Und dennoch ist der Pfad nicht Perfekt.
Ein wenig mus ich noch dem Pfad arbeiten und ihn glätten, nur um ihn letztendlich mit einem
Bezier Algorithmus wieder abzurunden.
Das Pfadfindig-Netz ist vorallem wichtig für das erstellen von Häfen.
Denn diese sollen mit möglichst vielen Wegpunkten Verbunden sein.
Text.
Hay.
Es ist mal wieder Zeit für einen Worklogeintrag.
In den letzten Wochen habe ich hauptsächlich an dem Menü System gewerkelt.
Wie auf dem Bild zu erkennen ist.
Es war Sau schwer das so hin zu bekommen das die Schrift nicht über dem Rand hinaus geht.
Bzw beim Zoomen der Map auch die Position verändert.
Da es später besonders viel Text geben wird, habe ich extra eine Text Klasse entwickelt.
Code: [AUSKLAPPEN]
TText.LoadFont("Times20BK","timesbi.ttf",20) 'Läd eine Schriftart
Local TextArea:TText=TText.Create(512,300) 'erstellt einen Textbereich
TextArea.SetWaitTime(1000) Der Text wird jede 1000 Millisekunden Aktualisiert
TextArea.Text("[Times20BK,C999900,M]<<Ware>>[C999999]<<Schiff>>#")
In den eckigen Klammern sind dann die Anweisungen für den nachfolgenden Text enthalten.
Times20BK ist klar die Schriftart.
C Steht für Color. Rot 0-99,Grün 0-99,Blau 0-99
Und M für Text mittig anordnen. (L=Linksbündig,R=Rechtsbündig)
# Ist der Zeilenumbruch wie return.
Die Reinfolge bzw. die Menge der Anweisungen sind egal.
TextArea.Text("[R,X480,C777777]Preis1 Gulden#")
Hier wird der graue Text Rechtsbündig ab der Position X480px angeordnet.
TextArea.RepText("Preis1",M) M=M+1
Dieser Befehl ersetzt im gesamten Text das Wort Preis1 mit einem neuen Wort.
In diesen Fall einen Zahlenwert.
Wurde dieses Wort schoneinmal ersetzt so wird der Text zuerst in dem
alten Zustand versetzt, damit das Wort Preis1 auch gefunden und ersetzt werden kann.
Noch ein Beispiel.
Code: [AUSKLAPPEN]
TextArea.Text("[M,Farbe1] Stadtname#") (M=Mittig)
IF MeineStadt=0 Then TextArea.RepText("Farbe1","C505050") Grau
IF MeineStadt=1 Then TextArea.RepText("Farbe1","C909000") Gelb
Aber jetzt mal zu was anderem das gerade heute fertig geworden ist.
Das Speichern bzw laden von Daten.
Der ganze Aufwand nur damit ich egal wo und ohne Reinfolge Datenpakete
Laden und Speichern kann.
Das kommt gleich mal ins Setup. Zwei Streams werden geöffnet.
Code: [AUSKLAPPEN]
TFile.Create("MyWorld","Save")
TFile.Load("MyWorld","Load")
Wenn ich nun was speichern will dann suche ich mir ersteinmal den Stream.
Code: [AUSKLAPPEN]
Local F:TFile=TFile.FindTyp("Save")
F.SetKey("DatenPaketA") Key ist die Sprungmarke in der Datei.
F.WString("Daten") F.WInt(5677) Daten schreiben.
F.SetKey("DatenPaketB") Noch eine Sprungmarke.
F.WShort(60000) F.WByte(5) Daten schreiben.
Erst wenn der näste Key gesetz wird, wird der letzte gespeichert.
(Ist eine Bank die dann wieder Leer ist)
Das Laden ist dann natürlich genauso einfach.
Code: [AUSKLAPPEN]
Local F:TFile=TFile.FindTyp("Load")
F.FindKey("DatenPaketA") Erst jetzt werden die Daten für den Abschnitt geladen.
Local Text:String=F.RString() usw.
Mit dem Befehl F.EndKey() kann man prüfen ob der Abschnitt zu ende ist.
TFile.Close() (Am ende) Speichert die Restdaten und schließt die Streams.
Der Inselweltgenerator ist einfach Perfekt.
Wire Frame vom LOD System.
Alles Neu.
Schon wieder zwei Monate vergangen, und keinen Eintrag.
Das liegt daran das es nichts zu berichten gibt.
Es gibt keinen sichtbaren Fortschritt weil es mehr als Schleppend voran geht.
Wie ich schon im Kommentar geschrieben habe konnte ich 4 Wochen lang nicht weiter arbeiten.
Aber seit einen Monat mache ich weiter. Was heißt weiter. Eigentlich ganz Neu.
In der ersten Version ging es mir darum, möglichst schnell was auf die Beine zu stellen.
Mann sieht zwar was aber nicht das was ich mir vorgestellt habe.
zB. die Kanäle zwischen den Inseln. Keine Inselwelt ist so Strukturiert.
Auch gibt es schon ein einfaches Level of Detail System, damit ich möglichst weit raus zoomen kann.
Ich will den totallen Überblick.
Allerdings läuft der CPU bei ca 30-60% Zoom auf hochtouren. Das nervt!!!
Theoretisch dürfte das garnicht sein aber Praktisch ist es so.
Auch mit den Code war ich nicht zufrieden.
Weil es schnell gehen sollte habe ich habe ich auf SuperStrick verzichtet,
und wollte auch nicht extra ein Entity bzw Mesh System entwickeln nur um ein paar Terrain Tiles darzustellen.
Letztendlich war der Code viel zu unstrukturiert und komplex.
Nun habe ich wie schon geschrieben neu angefangen,
Mit SuperStrick was eine heiden Arbeit bedeutet.
Und habe auch extra ein Entity-Mesh System entwickelt.
Auch habe ich den Inselwelt Generator neu geschrieben. Es werden vorgefertigte Inseln zufällig angeordnet.
Jetzt sind zwar die Kanäle weg, aber es ist doof das mehrere Inseln gleich aussehen.
Dazu wollte ich in Blitz3D einen ganz simplen Terrain-Editor programmieren.
Er war dann doch nicht so simpel und ich kam von meinem eigentlichen Ziel ab.
Nun gut. Der Code sollte nicht umsonst sein deshalb habe ich ihn frei gegeben.
Also zurück an das Erbe. Ich habe ersteinmal weiter gemacht obwohl ich nicht zufrieden war.
Plötzlich gab es Blockbildung Fragmente beim OpenGL eigenden MipMap System.
Egal ich habe ersteinmal weiter gemacht.
Wollte mich ersteinmal um das wichtigste kümmern. Mesh-Entity System, Filesystem, Menüsystem.
Nun war es soweit fertig. Und ich habe eine Woche lang nach dem MipMap Fehler gesucht.
Kein Erfolg. Ich bin bald verzweifelt. Alles umsonst.
Letztendlich habe ich mich entschieden die erste Version als Basis zu nehmen, wo das OpengGL MipMap System noch funktioniert hat
und Stück für Stück die neuen Funktionen einzuarbeiten.
Und nach dreiviertel kam ich endlich an die Fehlerstelle.
Ich habe an den Terrainshader die Terraintilekoordinaten übergeben.
Solange sie sehr niedrig waren wurden die Texturen gekachelt. Aber sobald sie zu hoch waren kam es abend zu diesen seltsamen Effekt.
Es hat mich gewurmt das das mit dem Inselweltgenerator nicht so funktioniert hat wie ich mir erhofft hatte.
Ich habe dann nocheinmal zum Tausendsten mal einen Inselweltgenerator entwickelt.
Diesmal sollte er nicht möglichst schnell sein (Optimierungswahn
) ,sondern das machen wie ich es mir vorgestellt habe,
mit Buchten und keine Kanäle, egal wie hoch die Rechenzeit ist.
Das Ergebnis ist Super, ich bin zufrieden.
Nun muß ich nur noch Gebirgszüge Programmieren ohne das sie aussehen wie Schlangen.
Zu guter letzt.
Anders wie bei Blitz3D wo der Anfang immer schnell gemacht war, ist es bei BlitzMax+OpenGL genau umgedreht.
Man braucht erst die ganzen Systeme und kann dann darauf aufbauen.
Ich stelle es mir vor wie ein Baum.
Der Stamm und die Äste symbolisieren die Grundstruktur die man nicht sieht.
Die Grafik sind wie Blätter die man dann nur noch aufhängen braucht.
ToDo Liste.
Hay.
Mir ist schon klar das meine Vision mal wieder Maßlos überzogen ist.
Aber wenn ich nur die Hälfte von dem schaffe was ich mir vorgenommen habe dann habe ich schon
eine Standart Wirtschaftsimulation. Und das Spiel ist fertig.
Ganz so planlos wie es scheint ist es nun doch nicht.
Es gibt eine ToDo Liste nach der ich vor gehe.
1. Wasserwellen, Berge ordentlich anordnen, Diffus auf das Terrain aufbringen.
2. Hafen Modellieren. Hafen zufällig anordnen.
3. Schiff Modellieren. Pfadfindingnetz erstellen.
4. Schiff(e) zwischen zwei zufällig ausgewählte Hafen pendeln lassen.
5. Warensystem. Produktion Verbrauch pro Stadt. Ohne sichtbare Betriebe/Farmen
6. Preiskalkulation. Defizite/Überproduktion des Letzten Monats beeinflusst den Zukunft Warenpreis.
7. Handelssystem. Billige Ware in Schiff einladen/kaufen zur rentabelsten Stadt fahren und wieder ausladen/verkaufen.
9. Rohstoff Map. Generieren.
8. Baumenü für Dorf. (Gui-System)
Getreidefarm, Mühle, Bäcker.
Schweinestall, Fleischer.
Erzmine, Kohlemine, Eisenschmelze, Waffenschmiede.
10. Städte/Dörfer (mit Gebäude) generieren abhängig der vorhandenen Rohstoffe.
11. Arbeiter einstellen. Ausbildungen, Investitionen in Betrieben (Upgrade)
Arbeitsstunden, Sonntagsarbeit.
12. Stadt/Dorf Zufriedenheit. (Wirtshaus, Kirche, Lazarett) Geburtenrate, Lebensdauer.
13. Schiffswerft. Schiffe produzieren. Mit Kapitän ausstatten. Automatisches Handeln.
--------------------------------Fertig------------------------------------------
Zusatz.
14. Abenteuermodus. Schiffssteuerung (Segeln). Schätze, Pirateninseln, Diplomatie.
15. Strategiemodus. Kanonen, Burgen, Burgmauern. Söldnerarmeen. Kriegsschiffsflotten.
16. Feuer, Rauch (Partikelsystem)
Konzeptänderung.
Lang ist es her seit dem letzten Eintrag.
Das lag auch daran das ich nicht genau wusste was ich wollte.
Irgendwie schon ein Wirtschaftspiel mit emotionalen Charakter.
Doch wiederum ein Strategiespiel ala SupremCommander.
Oder doch lieber ein Abenteuerspiel wie PiratesEmpire.
(Einige können sich noch erinnern.)
Soll es 2D sein Isometrisch, damit ich auch Unmengen Gebäude setzen kann
oder doch lieber 3D was besser aussieht.
Nun habe ich mich dazu durchgerungen und entschieden ein Spiel zu programmieren das von allen etwas hat.
Egal wie lange es auch dauern mag.
Dazu gibt es auch eine neue Geschichte. (Bitte unten lesen)
Wie aus SupremCommander gewöhnt gibt es keine Minimap sondern zoomt komplett rein oder raus.
Die Gebäude werden in 5 Detailstufen dargestellt wobei die fünfte Detailstufe ein Bild sein wird.
Das Terrain besteht aus 8 Texturen die mit Hilfe eines Shader vermischt werden.
Außerdem verfügt es über ein Lod of Detail System um die Triangles zu reduzieren.
Es gibt einen Mapgenerator der sehr schöne verschlungene Inselwelten extrem schnell
(2 Sekunden) generiert.
Die Inselmenge sowie dessen Größe kann eingestellt werden. Später sogar über ein Bedienelement
Mann beginnt als Farmer, Handwerker auf einer kleinen Pirateninsel und mus sich nicht nur um seinen Betrieb kümmern sondern auch um seine Arbeiter und der Dorfgemeinschaft.
Sollte durch Misswirtschaft doch mal Ebbe in der Kasse herrschen, so nimmt man sein Schiff und überfällt andere böse Engländer oder Spanier.
Wenn man Glück hat entdeckt man andere kleine Pirateninseln und kann mit diese Handeln.
Dort investieren, bauen oder die Piraten zu einem Gemeinschaftsbegriff überreden.
Früher oder Später ist man gezwungen sich gegen die bösen Kapitalisten zu wehren und kommt um den Bau einer Burg nicht herum.
Auch soll es möglich sein neue Schiffe zu kaufen und diese mit einem Kapitän auszustatten
der selbstständig Handel treibt.
Sein Dorf ist abgesichert. Piratenschiffe beherrschen das Meer und die Kasse platzt aus allen nähten.
Nun ist die Zeit der Rache endlich gekommen.
Mit gigantischen Söldnerarmeen rückt man gegen die Kapitalisten vor und legt dessen Städte in Schutt und Asche.
Globalzoom. Sind noch etwas wenig Berge. Aber ich arbeite daran.
Detailzoom.
Vision.
Das Erbe ist eine Wirtschaftsimulation mit emotionaler Komponente.
Geschichte. Anno 1534.
Deine Mutter und dein Vater werden zu Unrecht beschuldigt mit dem Teufel in Bund zu sein.
Weil sie beklagt haben das die Reichen immer reicher werden und die Armen immer ärmer.
Sie wurden zu 25 Jahre Arbeitslager in den neuen Kolonien verurteilt.
Auf dem Weg dort hin lief das Gefangenenschiff auf einem Riff auf und deine Eltern
und ein paar andere Überlebende retteten sich auf eine kleine abgelegene Insel.
Dort lebten sie viele Jahre glücklich und zufrieden.
Bis plötzlich die Insel von Engländer entdeckt wurde.
Sie überfielen aus Habgier die Insel und schändeten deine Mutter und ermordeten deinen Vater.
Du erbst nun die Farm von deinem Vater und erhältst von deinem vermissten Onkel ein kleines Piratenschiff.
Es liegt nun an dir deine Familie zu versorgen, und die Familienehre wieder herzustellen.



