Maniac Mansion Mania Forum
MMM-Werkzeugkiste => Technik => Thema gestartet von: Mulle The Maniac am 24. Oktober 2006, 23:23:36
-
Ich hab da eine Frage (die ich schonmal BlueGryphon gestellt, aber wieder vergessen habe!):
Bei meinem und Bernards Starterpack gibt es den Fehler, dass Inventargegenstände einfach so verschwinden, wenn man sie an die MM-Charaktere weitergibt.
Wie lautet der Befehl dazu? Den würde ich gerne löschen, wenn es möglich ist.
-
Ich kann zwar jetzt nicht nachsehen, aber ich denke mal, dass du das bei den "interact with inventory"-Scripts der einzelnen Charakteren finden wirst.
Und wenn da nix ist, wird es wohl im Unhandled() sein.
Wird irgendwas in die Richtung LoseInventoryItem und AddInventoryItem sein.
-
Such mal im Globalscript nach der Zeile:
GiveInv (ItemGiven, GSlocid);
und entferne sie.
-
Der Fehler tritt übrigens nicht im Bernard-Starterpack auf (zumindest nicht in aktuellen Versionen)
Der Fehler beruht auf Skript-Überresten aus MMD, wo der Gib-Befehl dazu führte das ein Gegenstand ins Inventar der anderen Figur wechselte (worauf man aber bei nur einer Spielbaren Figur keinen Zugriff mehr hat.)
Erstmals bekannt wurde er nach der Veröffentlichung von Episode 4.
Seit längeren gibt es auch schon einen guten Lösungsansatz: http://www.adventure-treff.de/forum/viewtopic.php?p=104107&highlight=giveinv#104107
Ich hab den betreffenden Teil im global script gefunden: else if ((GSagsusedmode == 4) && (GetLocationType (mouse.x, mouse.y) == 2) && isAction (A_GIVE_TO) && (GetCharacterAt (mouse.x, mouse.y) < 7))
{
SetLabelColor (ACTION, 0, ActionLabelColorHighlighted);
if (GoToCharacter (GSlocid, 0, 1, 2))
{
ItemGiven = character [GetPlayerCharacter ()].activeinv;
if (IsInteractionAvailable (mrx - GetViewportX (), mry - GetViewportY (), MODE_USEINV) == 1)
{
RunCharacterInteraction (GSlocid, MODE_USEINV);
}
GiveInv (ItemGiven, GSlocid);
character [GetPlayerCharacter ()].activeinv = -1;
}
SetAction (A_DEFAULT);
}
1. Man kann nur den Charakteren 1-6 etwas geben (klar), muss man also ändern (1. if-Abfrage)
2. Man muss die Character-Interaction Use inventory on character benutzen, nicht AnyClick.
3. Durch Abfrage einer GlobalInt muss man gegebenenfalls verhindern, dass das Item den Besitzer wechselt.
Man könnte das script auch pauschal so ändern: if (IsInteractionAvailable (mrx - GetViewportX (), mry - GetViewportY (), MODE_USEINV) == 1)
{
RunCharacterInteraction (GSlocid, MODE_USEINV);
}
else
{
GiveInv (ItemGiven, GSlocid);
character [GetPlayerCharacter ()].activeinv = -1;
}
}
Wenn der NPC das Item tatsächlich erhalten soll, entweder keine Interaction einbauen, oder es ihm in dieser übergeben.
Man sollte halt keine veralteten Versionen als Basis für sein Starterpack benutzen.
-
Danke!
-
Ich habe die Zeie aus khrismucs script:
RunCharacterInteraction (GSlocid, MODE_USEINV);
durch
RunCharacterInteraction (GSlocid, eModeUsermode1);,
ersetzt.
Damit kann man unterschiedliche Aktionen für Benutzen (use inv on char) und Geben (usermode 1) einstellen was mit dem original Script von khrismuc anscheinend nicht möglich ist.
edit: ich habe schwachsinn geschrieben, es ist doch mit khrismucs script mölich, unterschiediche aktionen für geben und benutzen einzustellen. überlest diesen Post einfach.
-
Kann mir mal jemand erklären, wie ich das Problem (Gib Gegenstand an Person -> verliere Gegenstand für immer) im aktuellen Starterpack löse? Es müsste die neueste Version des Bernard-Starterpacks sein, wenn ich mich nicht irre. Im Skript finde ich aber kein GSlocid, die Skriptsprache hat sich wohl verändert.
Edit: Ich vermute, dass es sich hierbei um die entsprechende Stelle im GS handelt (ich weiß nicht, ob es der vollständige benötigte Ausschnitt ist)? Muss ich "null" irgendwie ersetzen?
if (GoToCharacter (charAt, 0, 1, 2))
{
if ( null != invItem )
ItemGiven = invItem.ID;
if (IsInteractionAvailable (mrx - GetViewportX (), mry - GetViewportY (), eModeUseinv) == 1)
{
charAt.RunInteraction(eModeUseinv);
}
GiveInv (ItemGiven, charAt);
invItem = null;
}
SetAction (eActDefault);
-
Ja, die Starterpacks sind furchtbar geschrieben, ich blicke da auch nie durch.
Ich habe die betroffene Stelle auskommentiert und benutze das Gib-Verb wie die anderen auch.
-
Hm, wenn ich es auskommentiere, behalte ich zwar das Item, dafür jedoch noch immer keine Reaktion. Die Reaktion, die ich bei "Benutze mit" erhalte, bleibt bei "Gib" aus.
Bei Meteorhead (ab TNS 1 bzw. 13) habe ich den Gib-Button im GS dazu veranlasst, dass er den Befehl "Benutze" ausführt. Keine Ahnung, wie ich das damals gemacht habe. Aber es ist vermutlich auch nicht die eleganteste Lösung... hoffe ich!
-
Entferne einmal in der Methode unhandled_event die Abfrage hinter dem letzten else, dann sollte auch bei Gib ein "Besser nicht." kommen. Ansonsten ist noch irgendwo was krumm.
-
Lol, genau dieses dämliche Standardverhalten hatte bei Berthold den einzigen Game Breaker ausgelöst (das mit dem Abspann zähle ich nicht).
Wie Cmdr bereits gesagt hat, kommentier die beiden Zeilen aus:
GiveInv (ItemGiven, charAt);
invItem = null;
Danach kannst die Gib-Aktionen ganz normal bei eActGiveTo schreiben. Hast du vielleicht zuviel auskommentiert, das es jetzt trotzdem nicht funktioniert?
EDIT:
Es müsste die neueste Version des Bernard-Starterpacks sein
Definitiv nicht. Es muss eine ältere Version sein, als dass das Standardverhalten das der Spieler sich automatisch an der Figur ausrichtet mit der er interagiert, vor einiger Zeit rausgeworfen wurde.
Ich bin übrigens dafür dass wir das Standardverhalten "Spieler verliert Gegenstand, wenn er ihn einer Person gibt" aus den SPs rauswerfen.
EDIT Nummer 2:
Hast du das SP von der MMM-Website gezogen, statt von GitHub? Dann hast du tatsächlich das aktuellste Release, nicht aber die aktuellste Version.
-
Ich bin übrigens dafür dass wir das Standardverhalten "Spieler verliert Gegenstand, wenn er ihn einer Person gibt" aus den SPs rauswerfen.
Absolut! Das Verhalten nützt nur bei Mehrspieler-Episoden und selbst da ist es besser, das nochmal explizit zu definieren.
Bei der Interaktion mit NPCs macht das überhaupt gar keinen Sinn.
-
Yay, Erfolg! Offenbar hatte ich den Gib-Befehl bisher (oder zumindest bei meinen letzten Spielen) gar nicht richtig definiert, weil nur "eActUseInventory" mit der entsprechenden Reaktion verknüpft war. Wenn ich eActGiveTo nochmal einzeln aufführe funktioniert es aber. Auch wenn es etwas umständlich ist... aber bei einer Mini-Episode wenigstens eine überschaubare Arbeit.
Danach kannst die Gib-Aktionen ganz normal bei eActGiveTo schreiben. Hast du vielleicht zuviel auskommentiert, das es jetzt trotzdem nicht funktioniert?
Doch, genau diese beiden Zeilen hatte ich auskommentiert. Das hilft auch gegen das Item-Sterben. Aber ein Problem bleibt: Die Charaktere ändern ihre "Face-Direction". Genau wie die Jugendlichen bei MMM, wenn ein Item-Tausch stattfindet. Und Marcy dreht zudem eine kleine Runde, läuft erst am Charakter vorbei und dann wieder zurück. Das Problem war mir auch schon beim Skripten der Meteorhead-Episoden aufgefallen.
Hast du das SP von der MMM-Website gezogen, statt von GitHub? Dann hast du tatsächlich das aktuellste Release, nicht aber die aktuellste Version.
Vermutlich habe ich tatsächlich die entsprechende Version von der Webseite heruntergeladen. Ich weiß es aber nicht mehr sicher, da ich ebenso GitHub geöffnet hatte.
-
Yay, Erfolg! Offenbar hatte ich den Gib-Befehl bisher (oder zumindest bei meinen letzten Spielen) gar nicht richtig definiert, weil nur "eActUseInventory" mit der entsprechenden Reaktion verknüpft war. Wenn ich eActGiveTo nochmal einzeln aufführe funktioniert es aber. Auch wenn es etwas umständlich ist... aber bei einer Mini-Episode wenigstens eine überschaubare Arbeit.
So ist es ja auch gedacht. Ein Block für GiveTo und ein Block für UseInv. Wenn du beides gleich behandeln willst, brauchst auch nicht alles doppelt zu machen. (Sollst du eh nicht. Code-Redundanz ist die Wurzel allen Übels.) Ändere einfach die Bedingung für den Block:
if (UsedAction(eActGiveTo) || UsedAction(eActUseInv))
Aber ein Problem bleibt: Die Charaktere ändern ihre "Face-Direction". Genau wie die Jugendlichen bei MMM, wenn ein Item-Tausch stattfindet. Und Marcy dreht zudem eine kleine Runde, läuft erst am Charakter vorbei und dann wieder zurück. Das Problem war mir auch schon beim Skripten der Meteorhead-Episoden aufgefallen.
Dann hast du definitiv eine alte Version. Das Standardverhalten habe ich schon Oktober 2017 (https://github.com/ManiacMansionMania/Bernard-SP/commit/c01586639efc6a3114884cb134f0db137991243b) rausgeworfen. Du musst an zwei Stellen die Abfrage nach if (GoToCharacter (charAt, 0, 1, 2)) entfernen.
-
Ach ja, so habe ich das früher auch schon mal gemacht. Ich wollte "if (UsedAction(eActGiveTo)" und "UsedAction(eActUseInv))" mit einem && verknüpfen. Wie schnell "man" doch Dinge verlernt... ::) ;D
Und die Global-Script-Anpassung hat ebenfalls funktioniert. Damit dürfte sich das Problem erledigt haben. Danke!
Dann hast du definitiv eine alte Version. Das Standardverhalten habe ich schon Oktober 2017 (https://github.com/ManiacMansionMania/Bernard-SP/commit/c01586639efc6a3114884cb134f0db137991243b) rausgeworfen. Du musst an zwei Stellen die Abfrage nach if (GoToCharacter (charAt, 0, 1, 2)) entfernen.
Das versteht sich vermutlich von selbst, wenn die aktuellste Version auf der Website aus dem Jahr 2012 stammt. ;)
"Bernard Starterpack - Bernards Haus jetzt auch für die momentan aktuelle AGS-Version 3.21"
Das müsste die Version sein, die ich heruntergeladen habe.
-
Das versteht sich vermutlich von selbst, wenn die aktuellste Version auf der Website aus dem Jahr 2012 stammt. ;)
"Bernard Starterpack - Bernards Haus jetzt auch für die momentan aktuelle AGS-Version 3.21"
Die Angaben auf der Homepage beziehen sich auf die allererste Version für AGS 3. Download und Links werden automatisch mit von GitHub gespeisten Daten geändert, der Fließtext dagegen nicht. Die Version die man aktuell dort bekommt, ist entsprechend die von heute.
Ich nehme mal stark an, dass du Version 1.2 vom 17. Januar 2017 hast. Das war bis vor 13 Stunden das neueste Release und die Version, die auf der Homepage verlinkt war.
-
OK, das wusste ich nicht.
Leider fallen mir noch weitere Probleme im Zusammenhang mit den Verb-Buttons auf.
1. Rede mit: Wähle ich "Rede" vorher mit Klick auf den Button aus, dreht Marcy ebenfalls eine kleine Runde, bevor sie den Charakter anspricht. Das passiert nicht, wenn ich bloß mit der rechten Maustaste auf die Figur klicke. (Das ist jetzt aber nicht so dramatisch, da es wahrscheinlich kaum auffallen wird.)
2. Ein Item wurde mit >u gekennzeichnet, soll also direkt benutzt werden, kein "Benutze mit" soll angewählt werden. Es funktioniert aber nur, wenn ich nicht vorher auf das Verb "Benutze" klicke. Wähle ich vorher "Benutze" an, wird ein "Benutze mit" daraus und die geskriptete Reaktion bleibt aus. Bei AGS 2.72 war das nie ein Problem, hier stimmt aber scheinbar etwas nicht oder ich mache was falsch.
-
1. Rede mit: Wähle ich "Rede" vorher mit Klick auf den Button aus, dreht Marcy ebenfalls eine kleine Runde, bevor sie den Charakter anspricht. Das passiert nicht, wenn ich bloß mit der rechten Maustaste auf die Figur klicke. (Das ist jetzt aber nicht so dramatisch, da es wahrscheinlich kaum auffallen wird.)
Ja, da sind wieder GoToCharacter()-Aufrufe, die dort nicht sein sollten. Such im GlobalScript mittels Volltextsuche nach "eModeTalkTo" und entferne an zwei Stellen die GoToCharacter()-Aufrufe. That should do the trick. Kommt auch auf meine To-do-Liste "Müll, der aus SPs entsorgt werden muss".
2. Ein Item wurde mit >u gekennzeichnet, soll also direkt benutzt werden, kein "Benutze mit" soll angewählt werden. Es funktioniert aber nur, wenn ich nicht vorher auf das Verb "Benutze" klicke. Wähle ich vorher "Benutze" an, wird ein "Benutze mit" daraus und die geskriptete Reaktion bleibt aus. Bei AGS 2.72 war das nie ein Problem, hier stimmt aber scheinbar etwas nicht oder ich mache was falsch.
Das ist in der Tat ein Problem. Einen schmutzigen Fix hätte ich parat: Suche im GlobalScript nach invAt.RunInteraction(eModeUseinv); dann solltest du zu folgendem Abschnitt kommen (ist der erste der zwei Treffer):
if ( Mouse.Mode == 2 )
{
if (isAction (eActUse) && invAt != null && invAt.IsInteractionAvailable(eModeUseinv) == 1)
{
gAktionText.TextColor = ActionLabelColorHighlighted;
if ( invAt )
invAt.RunInteraction(eModeUseinv);
SetAction (eActDefault);
}
else player.ActiveInventory = invAt;
}
Ersetze es durch:
if ( Mouse.Mode == 2 )
{
if (isAction (eActUse) && (GSinvloc.Extension() == 'u') && invAt.IsInteractionAvailable(eModeInteract) == 1)
{
gAktionText.TextColor = ActionLabelColorHighlighted;
if ( invAt )
invAt.RunInteraction(eModeInteract);
SetAction (eActDefault);
}
else player.ActiveInventory = invAt;
}
Ich muss ausdrücklich dazu sagen, dass es ein schmutziger Fix ist. Es ist nicht getestet, daher Verwendung auf Gefahr hin.
Alternativ kannst du auch einfach nur die Zeile
invAt.RunInteraction(eModeUseinv);
durch
invAt.RunInteraction(eModeInteract);
ersetzen. Das bringt aber das Problem mit sich, dass bei Items IMMER der Befehl Benutze Item ausgeführt wird und nur noch mittels Linksklick verwendet werden können.
-
So, damit dürfte meine Episode wohl endgültig gerettet sein. ;)
Alle genannten Bugs sind behoben. Der schmutzige Fix funktioniert super, notfalls desinfiziere ich ihn nochmal vor dem Release (gute Hygiene ist ja momentan besonders wichtig!). ;)
Vielen Dank!
-
Der schmutzige Fix funktioniert super, notfalls desinfiziere ich ihn nochmal vor dem Release (gute Hygiene ist ja momentan besonders wichtig!). ;)
Ich werde bis noch bis nach dem Release deiner Episode abwarten. Wenn bis dahin nicht noch Bugs auftauchen, committe ich den Code in die Starterpacks.
-
Ich weiß nicht, ob hier noch ein Zusammenhang besteht, aber dieser Bug tritt auf, wenn ich einer Person einen Gegenstand gebe und daraufhin das GUI ausschalte.
-
Ein Zusammenhang damit besteht nicht. Das ein Fehler der Auftritt, wenn das GUI ausgeschaltet wird und das Inventory gescrollt wurde. Ich habe noch keine Ahnung woran an das liegt. Ich meine aber, den Fehler damals bei Rescue Mission korrigiert zu haben. Muss mal den Quelltext durchgehen.
Du hast jetzt übrigens beide Game Breaker von der Berthold Beta ebenfalls durch.
EDIT:
Ich habe mal kurz nachgesehen. Bei Rescue Mission lautet die Zeile
if (invItem == null)
Ich habe es jetzt selbst nicht noch mal überprüft, daher: Verwendung auf eigene Gefahr!
-
OK, nur bei gescrolltem Inventar? Dann tritt der Fehler nur auf, weil ich im Debug-Modus getestet habe. Das Inventar meiner Minisode ist zu leer, um gescrollt werden zu können. Ich probiere das gleich nochmal ohne Debug aus.
-
Dann tritt der Fehler nur auf, weil ich im Debug-Modus getestet habe. Das Inventar meiner Minisode ist zu leer, um gescrollt werden zu können.
Und aus genau dem gleichen Grund habe ich mir das bei Berthold nicht genauer angesehen. :P