Comments

EntryAuthorCommentsDate
Serpens66 PackLieutenantSven2Gibts auch ein Melee? Kann das Pack leider nicht laden weil komischer Filehost.17.10.2015 17:59
Caedes OCLieutenantSven2Keine Screenshots? :(14.04.2015 23:57
RPG LibraryLieutenantSven2Ich habe das RPG-Pack nun mal ausprobiert und im Weihnachtsszenario hier benutzt: https://ccan.de/cgi-bin/ccan/ccan-view.pl?a=view&i=6226 (Feeback
basiert jetzt noch auf v0.1; vielleicht sind schon einige Dinge geaendert.)

Einige der Hilfsfunktionen waren sehr praktisch. Wobei mir die komplexeren Teile der AP gar nicht gefallen haben: Die Methode, alle Scripte auf Dialogen, Quests und Cutscenes in Arrays zu haben, klingt vielleicht erstmal cool. Es wird aber unpraktisch, sobald man komplexere Dinge bauen will, die von Laufzeitvariablen abhaengen.

Zum Beispiel: Ich will im Text eine persoenliche Begruessung haben. Oder Laufzeitvariablen ("Es fehlen noch X Christbaumkugeln"). Geht nicht, weil der Text ja schon vorher festgelegt wird. Das gilt in vielen Texten; auch zum Beispiel in gefragten Optionen. Selbst, das, was dynamisch geht, muss immer kompliziert mit Format() zusammen gebaut werden. Variablen sind auch ziemlich umstaendlich. Oder ich wollte eine versteckte Option haben, die erst nach einer Weile erscheint. Das ging ueberhaupt nicht.

Selbst wenn das System jetzt erweitert wird mit allen moeglichen Optionen, wird im Endeffekt ja nur alles nachgebaut, was es in einer ganz einfachen Scriptengine schon gibt! Man muss dann eine komplett neue Sprache lernen nur um etwas zu tun, was man einfach schon kann. Fuer ein Dialogsystem reichen doch Hilfsfunktionen wie MessageBox/AddOption/etc.

Was mir in solchen Funktionen fehlte sind stattdessen z.B. einfache Moeglichkeiten, dass eine Option nur einmal erscheint - wahlweise nur einmal pro Dialogsession, einmal pro Spieler oder einmal im ganzen Spiel. Zum Beispiel, indem man einen Stirng uebergibt. Ein Beispiel wie es aussehen kann:

Code:
func DlgHannesA()
{
  DlgMsg("Was willst du?", npc);DlgHannesOptions();
}

func DlgHannesOptions()
{
  DlgOption("Wie geht es dir?", "HowIsItGoing", DLG_OncePerSession); // kommt wieder, wenn man neu anspricht
  DlgOption("Ich brauche eine Flagge", "Flag", DLG_OncePerPlayer); // fuer jeden Spieler einmal auswaehlbar
  DlgOption("Gib mir all dein Geld!", "Money", DLG_OncePerGame); // nur einmal insgesamt auswaehlbar
  DlgOptionAbort();
}

func DlgHannesHowIsItGoing()
{
  DlgMsg("Mir gehts gut!", npc);
  DlgHannesOptions();
}


func DlgHannesHowIsItFlag()
{
  DlgMsg("Hier ist dieine persoenliche Flagge", npc);
  player->CreateContents(FLAG);
  DlgHannesOptions();
}


func DlgHannesMoney()
{
  DlgMsg("Hier hast du all mein Geld.", npc);
  DoWealth(GetController(player), 1000);
  player->Sound("Cash");
  DlgHannesOptions();
}


Das ist zwar etwas mehr Schreibarbeit, wenn man einen Dialog ohne viel dynamisches Zeug hat. Aber sobald es dynamisch wird, wird das jetzige System einfach grauenhaft. Alles ist voll Format/riesigen Scriptstrings. In den Strings geht kein Syntax Highlighting und Scriptfehler sieht man erst zur Laufzeit. Man muss andauernd Conditions doppelt, dreifach und fuenffach schreiben, weil mehrere Optionen davon abhaengen. Man kann es auch nicht in Eclipse mit Remote Debugger debuggen, Breakpoints setzen, etc. Davon abgesehen ist eval() natuerlich viel, viel langsamer als direkt Ausfuehrung, was besonders relevant wird, wenn man viele Quests mit Bedingungen hat.

Wenn du das Arraysystem unbedingt behalten willst, sollte es zumindest fuer Profis auch die manuelle Dialog- und Questdefinition als Satz von Funktionen geben. Siehe z.B. Dialoge aus OpenClonk (https://git.openclonk.org/openclonk.git/blob/HEAD:/planet/Missions.ocf/Raid.ocs/System.ocg/DlgPyrit.c).

Bei Cutscenes habe ich es gleich aufgegeben, sie ueber Quests zu realisieren. Ich habe es nicht geschafft, eine Cutscene erst dann fortzusetzen, wenn der Spieler einen Dialog mit Weiter bestaetigt hat. Da ist das System mit einer Funktion pro Etappe der Szene einfach viel praktischer. Quests habe ich fuer das einfache Szenario nicht gebraucht. Aber ich denke auch, dass man dort eine Methode nit Etappen in Funktionen besser gebrauchen koennte als Etappen als Arrayelemente.

Etwas anderes: Das Speicher/Ladesystem aus Harkon, das FogOfWar-System, automatischer Relaunch, etc., sind praktische Funktionen. Aber sie sollten optional und z.B. per Spielregel aktivierbar sein. In meinem Szenario wollte ich einfach Respawn an einem Ort ohne Nachladen haben (weil das Laden im Multiplayer nicht so toll ist). Der FogOfWar-Range wurde ueberall im verstreut gesetzt ohne weitere Abfragen. Ich wuerde mir wuenschen, dass das ueber eine Regel eingestellt wird und dass ich als Scripter Einfluss auf die Sichtweite habe.

Ich finde, wenn man ein Pack einfach nur aktiviert, sollte sich erst einmal nichts im Szenario aendern. Genau wie bei anderen Packs (Ritter, Fantasy, etc.) auch. Vielleicht will ich einfach nur paar Dekoobjekte benutzen. Wenn ich dann mehr will - Respawn, Speichern, Dialoge, Quests, KI-Gegner, etc. - dann sollte das einzeln ueber Regeln oder entsprechende Aufrufe benutzbar sein, und nicht immer gleich alles auf einmal kommen.

Die groesste Hilfe durch das Pack waren im Grunde die Hilfsfunktionen wie StartFilm, Talker, Unverwundbarkeit, etc. Die haben die Entwicklung schon etwas beschleunigt. Der komplexere Kram hat mich in der jetzigen Version dagegen eher behindert; das muesste noch etwas ausgereift werden.
30.12.2014 16:50
RPG LibraryLieutenantSven2Okay sieht gut aus. Mal schauen, ob ich bis Weihnachten eine Kleinigkeit gebaut kriege :-)

Fuer KI-Gegner ist leider nichts dabei?
18.12.2014 22:55
RPG LibraryLieutenantSven2Okay, ich habe es geloest: War der Zone Identifier, der die heruntergeladene Datei vor dem Ausfuehren geschuetzt hat.18.12.2014 22:40
RPG LibraryLieutenantSven2Ich kann die Doku nicht oeffnen (Inhaltsverziechnis ist da. Aber alle Seiten sind leer). Und ich finde auch kein Demoszenario; weder im git-Repos noch in den Downloads.

Fehlen da vielleicht ein paar Dateien?
18.12.2014 18:19
Clonk RevolutionLieutenantSven2<Sven2> Bogen kaputt: Liegt daran, dass der ueberladen wird
<Sven2> Misc.c4d/Clonktypen.c4d/Archer.c4d/Bow.c4d
<Sven2> Da am Script ganz oben die Departure-Funktion verhindert, dass man ihn richtig einsammeln kann
31.07.2014 00:16
Die Geschichte von HarkonLieutenantSven2
> Wenn alles glatt läuft wird Harkon also pünktlich angeliefert.

Und wenn nicht, dann moechte ich aber nicht in Wipfjaegers Haut stecken :P
23.12.2013 19:44
Die Geschichte von HarkonLieutenantSven2InExantros kommt einfach ungetestet in die Liga?16.12.2013 18:46
Die Geschichte von HarkonLieutenantSven2Die Betatester finden am 23.12. noch ein paar richtig fiese Bugs, die das ganze um ein weiteres Jahr verschieben ;P16.12.2013 13:29
Showing 0-10 entries out of 99