[Modding] Wohl und Wehe des Modding

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
14.174
BeamDog hat in SoD ja auch versucht, das zu optimieren. Die Dialoge mit NPCs werden über Areatrigger ausgelöst, damit man ungefähr weiß, in welcher Situation sich die Gruppe gerade befindet. Für die NPC Banter gibt es Timer, die Verhindern, dass in der Zeit ein Banter läuft, und Timer, während dessen ein Banter triggern muss. Damit haben sie sichergestellt, dass die NPCs nicht anfangen zu reden, wenn sich z.B. das Lager gerade in einem Angriff befindet etc.
Wenn man ein ganzes Spiel designt hat man da natürlich beliebig viele Möglichkeiten. Sie durchzudenken wäre nur auch gut, und nicht alles was sinnvoll aussieht ist es dann auch. Die Areatrigger haben den großen Nachteil, dass man eben mit diesem NPC diese Area zusammen über diesen Areatrigger latschen muss. Tut man eines davon nicht, dann findet nicht nur dieser Dialog in diesem Moment nicht statt - sondern auch im Rest des Spiels nicht mehr, weil von den Areatriggern immer nur bestimmte Dialoge ausgelöst werden.
Also nochmal zusammengefasst: SoD gibt uns ein Lager, in dem wir alle NPCs parken können und sie jederzeit auswechseln können. Und hat ein Triggersystem für die Lovetalks, die voraussetzen, dass man ganz bestimmte Areas mit bestimmten NPCs zusammen abläuft, weil sonst die Romanzen nicht starten. Ich hätte da spontan Verbesserungsvorschläge.
 

Acifer

Senior Member
Registriert
27.04.2019
Beiträge
2.457
Zusätzlich zu Obigem wird der HC nach meiner Beobachtung auch gerade am Anfang teils derart bombardiert mit Gesprächen, dass sie die Ereignisse und/oder Dialoge der Haupthandlung stören können (oder umgekehrt), wohingegen die letzten Etappen des Spiels meist aus Schweigen bestehen.
Genau so ergeht es mir auch immer - bei jedem NPC, unabhängig vom Autor. Es scheint sehr schwierig zu sein, da das richtige Timing hinzubekommen.
Also nochmal zusammengefasst: SoD gibt uns ein Lager, in dem wir alle NPCs parken können und sie jederzeit auswechseln können. Und hat ein Triggersystem für die Lovetalks, die voraussetzen, dass man ganz bestimmte Areas mit bestimmten NPCs zusammen abläuft, weil sonst die Romanzen nicht starten. Ich hätte da spontan Verbesserungsvorschläge.
Ich auch! ;)
Ich denke einfach, dass das Hauptproblem ist, dass die Spiel-Engine gar nicht für komplizierte Interaktionen designt war und man in dieser Hinsicht viele Kompromisse eingehen muss.
 

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
14.174
Das sind so die Momente, die man nur begrenzt per Screenshot festhalten kann: ein Blitz kracht vom BG-Spielehimmel und trifft Grey, der mal wieder hinterhertrödelt, und während sein Fell noch blitzelt, sagt Ajantis: "We follow the righteous path, the path of Helm." :D
 

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
14.174
"Grey? GREY? Wo ist er denn wieder - Grey?"

Stellt sich raus - Hunde und Knochen. Ein unzertrennliches Paar!
Grey_bones.jpg
 

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
14.174
Genau mein früher Morgen: gemerkt, dass ein Dialog nicht triggert, gefixt, um dann einen Loop mit diesem Dialog zu haben, weil die Triggervariable nicht geschlossen wird. :rolleyes: Das ruft nach einem weiteren Kaffee!
 

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
14.174
IE Situationskomik at work: Ajantis, da müssen wir nochmal drüber reden!
Ajantis_weary.jpg
 

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
14.174
Ich glaube ich werde nicht müde ob der unfreiwilligen Situationskomik, die man so beim Spielen hat. Ich teste gerade und spiele daher mit einem Spielstand, der mit einem sehr viel intensiver gemoddeten Spiel erstellt wurde. Wollte eine lange Strecke reisen um viel Zeit zu verbringen, habe dabei aber auf der (nicht aktualisierten) Weltkarte auf eine (nun) nicht vorhandene Modarea geklickt. Das Spiel sprang also zurück zu der, auf der ich gerade stand. Brage ist Anführer der Truppe und hätte normalerweise meine Aktion verbal bestätigt. Aufgrund des durch das Nutzen des alten Saves hervorgerufenen Textsalats sagte er aber stattdessen als zufälligen String ausgerechnet:
ähm_hilfe.jpg
 

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
14.174
NI ist mit einer KI ausgestattet!!1 - Oder es war doch nur Zufall...
NI_sprachlos.jpg
 

Acifer

Senior Member
Registriert
27.04.2019
Beiträge
2.457
Ich krieg' die Krise. Ich habe eine Grauer-Werwolf-Animation erstellt, die in NI auch so aussieht wie sie sein soll:
Werewolf_gray.jpg
...leider wird der Werwolf ingame als Kaninchen dargestellt:
Werewolf_Kanickel.jpg
und ich habe keine Ahnung, woran das liegt... :hae:
 

Belryll

Senior Member
Registriert
05.01.2009
Beiträge
788
Das gefürchtete Werkaninchen, tödlichstes der Wertiere. :D

Ich bin im Modding überhaupt nicht beschlagen, daher meine naive Spekulation: Ist das Kaninchen eventuell Platzhalter oder Ersatz für den eigentlichen Werwolf, weil das Spiel etwas für die Darstellung Relevantes nicht finden, auslesen oder abbilden kann?
 

Argent

Senior Member
Registriert
13.07.2010
Beiträge
371
Hast Du einen gültigen Animationsslot für die Kreatur ausgewählt? Typ 7000 Animationen sind etwas speziell, da sie in neue und alte Untervarianten aufgeteilt sind (mit sehr speziellen Slotbereichen).
 

Acifer

Senior Member
Registriert
27.04.2019
Beiträge
2.457
Typ 7000 Animationen sind etwas speziell
Oh, daran könnte es liegen.
Ich habe folgenden Code erstellt:
Code:
 LAF FIND_FREE_ANIM_SLOT INT_VAR slotMin = 0x7000 slotMax = slotMin + 0xff RET slot END
  ACTION_IF (slot <= 0) BEGIN
    FAIL ~No free creature animation slot found.~
  END

  LAF TO_HEX_NUMBER INT_VAR value = slot minDigits = 4 RET hexNumber END
  APPEND ~animate.ids~ ~0x%hexNumber% AC#WEREWOLF_GRAY~ UNLESS ~AC#WEREWOLF_GRAY~
  CLEAR_IDS_MAP

  COPY ~%MOD_FOLDER%/animations/BG2_EE_animations/Werewolf_gray/exxx.ini~ ~override/%hexNumber%.ini~

  ACTION_BASH_FOR ~%MOD_FOLDER%/animations/BG2_EE_animations/Werewolf_gray~ ~^.+\.bam$~ BEGIN
    COPY ~%BASH_FOR_FILESPEC%~ ~override~
  END
Ist der so nicht richtig? :shine:
 

Argent

Senior Member
Registriert
13.07.2010
Beiträge
371
Diese Funktion ist etwas "dumm" und liefert nur den nächsten freien Slot im angegebenen Bereich zurück. Ich vermute mal, die neue Werwolf-Animation nutzt die "monster_old" Untervariante, so wie die originalen Werwolf-Animationen? In dem Fall ist es am sichersten, den Animationsbereich 0x7d00 - 0x7dff auszuwählen, da er vollständig für die alte Untervariante reserviert ist.

Edit: Der Code würde dann so aussehen:
Code:
LAF FIND_FREE_ANIM_SLOT INT_VAR slotMin = 0x7d00 slotMax = 0x7dff RET slot END
 

Acifer

Senior Member
Registriert
27.04.2019
Beiträge
2.457

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
14.174
1..2...3...4...5...6... ... 7?
Falls Du die Anzahl an Gruppen-NPCs auf der Karte meinst: meine NPC Mods Brandock, Grey, Husam und Solaufein können als "7. Gruppenmitglieder" mitgenommen werden.*

*Die Hinweise in der Readme beachten, da in diesem Modus nicht alles so funktioniert wie wenn sie richtige Gruppenmitglieder sind.
 

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
14.174
...leider wird der Werwolf ingame als Kaninchen dargestellt:
Ohmeingott ist das niedlich! Ich meine, ich möchte Deinen Frust darüber mit keinem Wort kleinreden. Aber ... so süß!
 

Jarl

Senior Member
Registriert
28.04.2006
Beiträge
999
Dann gebe ich hier auch mal etwas zum Besten:

Für eine Quest wollte ich Irrlichter (Willo-O-Wisps) über einer nicht betretbaren Wasseroberfläche tanzen lassen, nicht als Kreaturen, mit denen man kämpfen/interagieren kann, sondern rein für die Optik, um für etwas Stimmung zu sorgen. Sie sollten für eine gewisse Zeit erscheinen und dann wieder verschwinden.

1. Idee: Ich habe die Willo-O-Wisp-Animation als Area-Hintergrund-Animation ins Spiel gepatcht, um sie dann mittels AmbientActivate() zu aktivieren und zu deaktivieren. Das Resultat war alles andere als ansehnlich, da Area-Animationen offenbar anders als Kreaturen-Animationen nicht auf die neue Alpha-Blending-Funktion der EE zurückgreifen. :c:

Um Alpha-Blending zu nutzen, brauchte ich also Dummy-Kreaturen ohne Selection-Circle.

2. Idee: Ich habe die CREs erstellt und mit dem Effekt #184 Graphics: Passwall (Don't Jump) (No Collision Detection) ausgestattet, damit sie auf der nicht betretbaren Fläche platziert werden können. Es stellte sich aber heraus, dass der Befehl CreateCreature() eine eigene Kollisionsabfrage auf der Searchmap durchführt, ohne die Effekte der CRE zu checken. Resultat: Die Irrlichter wurden nicht auf dem Wasser, sondern am nächstgelegenen Ufer platziert. :wunder:

3. Idee: Ich habe die CREs als Actors in die ARE-Datei gepatcht. Hurra! Dies funktionierte! Jetzt musste ich nur noch dafür sorgen, dass sie, wie geplant, zu einem bestimmten Zeitpunkt der Quest erscheinen und später wieder verschwinden. Ich scriptete dies mit den Befehlen Activate() und Deactivate() über das Area-Script. Deactivate() klappte prima, Activate() jedoch nicht - offenbar checkt auch Activate() die Searchmap und weigerte sich, die CRE an unpassierbarer Stelle wieder zu aktivieren...:grmpf:

4. Idee: Ich gab den CREs ein Item mit dem Effekt #271 Graphics: Avatar Removal, das die Irrlichter für den Spieler unsichtbar machte. Über das Area-Script sollte zum gewünschten Zeitpunkt per ActionOverride(...DestroyItem()) der Effekt gelöscht werden, sodass die Irrlichter erscheinen, per DestroySelf() sollten sie dann später wieder verschwinden. Diese Herangehensweise funktionierte aus irgendeinem Grund von Test zu Test sehr unzuverlässig, mal wie gewünscht, mal gar nicht, mal nur bei einigen der Irrlichter. Ich habe den Verdacht, dass hier ein Bug vorliegt, der dafür sorgt, dass eine CRE, die mit dem Effekt #271 belegt wird, von ActionOverride() nicht zu 100% sauber angesteuert wird. :confused:

5. Idee: Notlösung - ich ließ die Irrlichter auf betretbarem Grund am Ufer spawnen und wollte sie dann per MoveToPoint() an die Stelle bringen, an der sie für den Spieler sichtbar werden sollen. Totaler Reinfall: Der Effekt #184 Graphics: Passwall (Don't Jump) (No Collision Detection) ermöglicht nur die Platzierung auf unbetretbarem Terrain, nicht aber die Bewegung. :mad:

6. Idee: Ich ersetzte MoveToPoint() durch JumpToPoint() und endlich lief es :cool:


Schönen Sonntag!
 

Argent

Senior Member
Registriert
13.07.2010
Beiträge
371
Es gibt auch noch die Befehle
Code:
228 CreateCreatureImpassable(S:NewObject*,P:Location*,I:Face*DIR)
323 CreateCreatureImpassableAllowOverlap(S:NewObject*,P:Location*,I:Face*DIR)
mit denen man eine Kreatur an einer blockierten Position erstellen kann. Das ändert aber nichts daran, dass diese Kreatur in ihrer Bewegungsfreiheit eingeschränkt ist.

Vielleicht klappt es mit einer Kreatur, die eine Animation im D000-Bereich nutzt, der für fliegende Kreaturen reserviert ist. Aber ob da mehr als der RandomFly() Befehl funktioniert, kann ich nicht sagen.
 
Oben