|
|
|
Gereon horcht inzwischen an der Matratze, hat aber heute z.B. daran gearbeitet, dass die Einheiten sich ordentlich an einer Frontlinie verteilen, ist dabei aber an Lua verzweifelt und wuenscht sich nichts sehnlicher als echte Pointer. Meine lieben Kollegen aus der Programmierer-Fraktion, Christopher und Julius, vermissen wir schmerzlich. Chris hat diesmal leider keine Zeit und Julius ist krank ausgefallen - wir hoffen, ihn morgen noch hier zu sehen und wuenschen von hier aus gute Besserung! ![]() |
|
|
Das Team gratuliert ganz herzlich und wünscht alles Gute! |
|
|
|
Wie ihr bereits per Twitter gelesen habt haben wir uns zu einem Grossteil den aktuellen Bugs und Problemchen gewidmet. Jochen und Gereon arbeiten an Karten und KI und melden dabei allerlei Wuensche und Fehler an, mit denen wir uns beschaeftigen. Immerhin sind wir auch bei zwei groesseren Themen, naemlich Laden/Speichern und dem Pathfollowing, ein gutes Stueck weitergekommen. Einheiten fahren z.B. nun rueckwaerts aus einem Nadeloehr und auch komplexere Zustaende in der Lua VM lassen sich (de)serialisieren. Das ist gerade bei Gereon's "ntroKI" wichtig, die ihre Aufgaben in verschiedenen States ueber Frames verteilt, um im verfuegbaren Rahmen von wenigen Millisekunden zu bleiben. Da sich DVW Renderlogik und KI einen Thread teilen koennen wir hier nirgends ueber die Straenge schlagen und muessen gerade komplexere Graphenalgorithmen, wie Gereon sie in Lua implementiert hat, kurz und performant halten. Natuerlich planen wir auch ohne Grafiker, noch ein paar Kleinigkeiten als Bilder zu veroeffentlichen, also bleibt dran.
|
|
|
Das gesamte Team gratuliert dir herzlich und wuenscht alles Gute zum Geburtstag! |
|
|
|
|
|
|
|
|
|
|
|
Soviel sei bereits jetzt schon gesagt: ein Meilenstein ist erledigt. Ich habe ja einige Pathfinding- bzw. besser Pathfollowing-Themen lange vor mir her geschoben. Heute habe ich endlich dafuer gesorgt, dass Radfahrzeuge realistische Kurven fahren, bei Bedarf zuruecksetzen und den Kurs korrigieren. Fuer einzelne Fahrzeuge klappt das bereits ganz gut und ich moechte euch das gerne in einem kleinen Video zeigen. Beschleunigung ist noch nicht integriert, aber es sieht auch jetzt schon ganz ansehnlich aus. Im uebernaechsten Schritt kommt dann wieder das Gruppenverhalten an die Reihe - hier ist es wichtig, dass sich mehrere Einheiten nicht in die Quere kommen. Der aktuelle Plan ist, dass sich hier Einheiten einfach lokal (d.h. direkte Nachbarn) abstossen und so den Bewegungsvektor korrigieren. Ausserdem moechte ich so Formationen realisieren: Einheiten bemuehen sich einfach, die Abstaende zu ihren Gruppennachbarn aufrecht zu erhalten, sofern moeglich. Nur wenn es z.B. durch ein Nadeloehr geht muessen alle Einheiten naeher zusammenruecken. Das Verfahren habe ich bereits in einem Prototyp implementiert und gute Erfahrungen damit gemacht - der schwierigere Part ist leider ohnehin meist die Integration in DVW, denn der "historisch gewachsene" Code ist nicht immer fuer solche Erweiterungen geeignet. Bald dann mehr in Form eines neuen YouTube-Videos. Gute Nacht und spaetestens bis zum naechsten Treffen!
|
|
|
|
|
|
|
|
|
Ich habe Raphaels Kartenmarkierungen eingebaut, unten seht ihr die mittlere und große Version: |
||
|
|
Im Grunde war ein Grossteil der Funktionialitaet bereits vorhanden, da unser Missionseditor MissEd natuerlich auch Karten und platzierte Einheiten speichern kann. Da in unserem Editor aber kein vollstaendiges Spiel laeuft (da es einfach nicht gebraucht wird) war es aber noch nicht moeglich z.B. den Status der lua-VMs zu speichern, die wir fuer KI- und Missionsskripte brauchen. Damit bin ich dann auf dem letzten Treffen endlich fertig geworden und konnte Sonntag morgen somit zum ersten Mal einen Spielstand speichern und danach auch erfolgreich laden, inklusive des KI-Standes, der Missionsziele und irgendwelcher Kartenveraenderungen (Krater verursacht durch Einschussloecher o.ae.). Ein paar Fehler gibt es zwar noch, aber das sind meistens nur Animationsfehler der Einheiten nach dem Laden, da manchmal nicht alle verwendeten Statusvariablen serialisiert wurden. Was jetzt noch fehlt ist ein bisschen Code "drumherum", so soll z.B. in Zukunft noch ein Screenshot des aktuellen Spielstandes mit in ein Savegame geschrieben werden. Sobald dann auch noch Integration ins Hauptmenue abgeschlossen ist, sind wir der Fertigstellung wieder mal ein (kleines) Stueck naeher gekommen.
|
|
|
|
|
|
Aktuell versuche ich, die wxWidgets Bibliotheken zu bauen und ins Projekt zu integrieren. Ich generiere dazu kein Framework, sondern erstelle Bibliotheken, die ich statisch linke, wie das hier beschrieben ist. Ausserdem benoetigen wir weitere Extensions, z.B. das wxPropertyGrid und STC. Ich baue gerade zum fuenfundzwanzigsten Mal... Falls jemand mehr Erfahrung mit sowas hat, freue ich mich ueber E-Mail! Zumindest die Intel-Version laeuft, am Universal Binary hapert's noch: hier gibt's Unresolved Externals fuer wxGLCanvas, STC und wxPropertyGrid - wxWidgets an sich scheint also erfolgreich zu linken, waehrend ich fuer die uebrigen Libs irgendwas uebersehen haben muss. Hier ist ein Shot, wie's aktuell aussieht. Wie man sieht, gibt's hier noch einiges zu tun: Umlaute funktionieren nicht ordentlich, die Button- und Fenstergroessen sind anders als unter Windows bzw. GTK,... Ausserdem mussten wir hier heute wieder einmal schmerzhaft feststellen, wie wir dafuer bestraft werden, dass wir kein Design Document gepflegt haben. Von Anfang an waren zwei Dinge vorgesehen: 1. Der Spieler wird mit einer Grundmenge an Ressourcen ausgestattet, die zum Levelstart zur Verfuegung stehen. 2. Schrott kann nur in begrenzter Menge z.B. in der Schmelze gelagert werden, man benoetigt Lager um mehr Kapazitaet zu gewinnen; der Sammler transportiert eine begrenzte Menge Material und muss sich Nachschub an Schmelze oder Lager abholen. Julius implementiert diese Logik und ist dabei auf interessante Fragestellungen gestossen, die wir nicht von Anfang an bedacht hatten: wohin gelangt das Startmaterial, wenn noch gar nichts existiert, was dieses Material beinhalten koennte? Woher erhaelt ein gebauter Sammler oder eine Schmelze dieses Material? Wird es "magisch" beim Bau zugewiesen? Was ist, wenn es in einer Karte schon von Beginn an mehrere Sammler/Schmelzen/Lager gibt? Wird das "Startkapital" dort gleichmaeszig verteilt? Und, wenn Schrott also in Lagern liegt, dieser aber nur zum Gebaeudebau explizit abgeholt werden muss, woher nimmt eigentlich dann eine Einheitenfabrik ihren Schrott? Und, und, und... Die Konsequenz ist: Schrott existiert nur "global" und wird auf alle Lager gleich verteilt. Benoetigt ein Sammler mehr Schrott, als in einem Lager verfuegbar ist, wird er "gebeamt", d.h. er kann an einem Lager bzw. an einer Schmelze das komplette, theoretisch verfuegbare Material abholen. Wird ein Lager zerstoert, reduziert sich der Gesamtbetrag um den Anteil eines Lagers. Schrott fuer Einheiten wird ebenfalls "gebeamt" und direkt vom Gesamtbetrag abgezogen. Damit bleibt die strategische Bedeutung der Lager erhalten, aber wir haben intern nicht so eine wilde Rumrechnerei. Insbesondere wird der Spieler damit nicht genoetigt, Schrott zwischen Lagern manuell zu verteilen. Urspruenglich war uebrigens sogar geplant, dass der Schrott in der Schmelze zu Halbzeugen verarbeitet wird und diese dann in die Lager gebracht werden... den Schritt haben wir uebersprungen, um den Bauprozess nicht voellig zu verkomplizieren. Das war's fuer mich an diesem Abend. Morgen mehr.
|
|
|
Nachdem ELFrun aber nun veröffentlicht ist, werde ich mich wieder DVW widmen. Auf dem Plan stehen u.a. immer noch das Pathfinding, der MissEd OSX Port und eine storylastige Missionskarte.
|
|
|
![]() Auf dem Bild seht ihr das Ergebnis meiner Bemühungen seit mehreren Treffen. Es geht darum, der KI beizubringen sich an Engpässen möglichst geschickt gegen den Feind zu verteidigen. Diese Engpässe auf beliebigen Karten zu erkennen ist nun fertig implementiert. Im Bild seht ihr einen Kartenausschnitt der einen verschlungenen Waldweg darstellt der Unten nach Rechts und Links zum Rest der Karte offen ist. Oben macht er nur einen Bogen. Für den Test habe ich nun im Bogen Stellungen als feindlich markiert (S). Draussen auf der Karte gibt es dafür einige als freundlich markierte Stellungen. Die durch ein X gekennzeichneten Positionen wurden als Engpass ausgerechnet, der Freund von Feind trennt. Dort wird die KI ihre Verteidigung stationieren. Bis das ganze von der KI genutzt werden kann ist jedoch noch viel Arbeit nötig, da die kleinste Engstelle noch längst nicht die Strategisch geschickteste sein muss. Zur Technik sei hier nur kurz der Q-S-Schnitt erwähnt, der mit Hilfe eines Flussalgorithmus berechnet wird. Es sind beliebig viele Quellen und Senken möglich. Der Graph entsteht durch eine Aufteilung der Karte in unterschiedlich große Quadranten, die mit ihren Nachbarn verbunden sind. |
|
|
|
|
|
|
|
|
![]() ![]() |