Maniac Mansion Mania Forum

MMM-Werkzeugkiste => Technik => Thema gestartet von: fireorange am 07. Mai 2010, 12:13:46

Titel: FaceCharacter-Bug behoben, aber trotzdem noch drin
Beitrag von: fireorange am 07. Mai 2010, 12:13:46
Komische Situation, ich habe sowohl den FaceCharacter-Bug als auch den SetActiveInventory-Bug nach Anleitung aus dem AT behoben, wie ich es immer gemacht habe. Doch diesmal tritt folgender Fehler weiterhin auf :( :

Übrigens kommt dort auch folgende Meldung, ich weiß nicht, obs an mir (evtl. schnelles Mausklicken??) lag....

---------------------------
Adventure Game Studio
---------------------------
An error has occured. Please contact the game author for support, as this
is likely to be a scripting error and not a bug in AGS.
(ACI version 2.72.920)

in Global script (line 926)
from Global script (line 945)
from Global script (line 1497)

Error: FaceCharacter: characters are in different rooms

---------------------------
OK   
---------------------------


Hab ich was übersehen? :-\ Ich verstehs gerade net.
Titel: Re: FaceCharacter-Bug behoben, aber trotzdem noch drin
Beitrag von: Bòógieman am 07. Mai 2010, 12:41:39
möglicherweise machst du ja wirklich ein FaceCharacter auf einen char der nicht im selben raum ist?
Titel: Re: FaceCharacter-Bug behoben, aber trotzdem noch drin
Beitrag von: fireorange am 07. Mai 2010, 13:30:33
Das bezweifle ich irgendwie, sonst würde das wahrscheinlich bei jedem Durchspielen passieren.

Na ja, nochmal zum Gesamtüberblick, ich habe folgende zwei Bugs behoben:

Zitat von: Bissiger Witzbold
--------
// if the mode is useinv and the mouse is over the active inv (like "use knife on knife")
    }
    else
    {
      used_action = global_action;
      if (GetCursorMode () == 2)
      {
        if (isAction (A_USE) && IsInventoryInteractionAvailable (GSlocid, MODE_USE) == 1)
        {
          SetLabelColor (ACTION, 0, ActionLabelColorHighlighted);
          RunInventoryInteraction (GSlocid, MODE_USE);
          SetAction (A_DEFAULT);
        }
       else if (GetInvAt (mouse.x, mouse.y) >= 0) SetActiveInventory (GSlocid);
      }
      else
      {
        GSagsusedmode = GetCursorMode ();
        SetLabelColor (ACTION, 0, ActionLabelColorHighlighted);
        if (GetInvAt (mouse.x, mouse.y) >= 0) RunInventoryInteraction (GSlocid, GetCursorMode ());
        SetAction (A_DEFAULT);
      }
    }
  }
  else if (button == RIGHTINV)
--------


Zitat von: Rocco
und zwar gibts in der Funktion unhandled_event nach dem grünen auskommentierten code so rund um zeile 2000 eine Zeile da steht:
if (type == 2 || type == 6) FaceCharacter (GetPlayerCharacter (), GetCharacterAt (mouse.x, mouse.y));
diese ersetzen durch:

if (type == 2 || type == 6)
    {
    if(GetLocationType(mouse.x,mouse.y)==2)
FaceCharacter (GetPlayerCharacter (), GetCharacterAt (mouse.x, mouse.y));
    }

dann sollte der bug nicht mehr auftreten
Titel: Re: FaceCharacter-Bug behoben, aber trotzdem noch drin
Beitrag von: 1mal_volltanken am 07. Mai 2010, 14:25:43
Was häufig passieren kann, ist, dass evtl. auch die Charakter-ID vom Charakter-Editor und im Script nicht übereinstimmen. Ganz besonders häufig hatte ich das bei Bernard, weil er offiziell ohne H geschrieben wird, aber in den Starterpacks beim Script-Namen MIT H geschrieben wurde.


BG
der Volltanker
Titel: Re: FaceCharacter-Bug behoben, aber trotzdem noch drin
Beitrag von: Rayman am 08. Mai 2010, 15:24:30
Waren die Script-Names der Chars und auch die RoomNumbers stimmig?

Notfalls am Besten den Script durch einen Ähnlichen ersetzen, dann müsste auch der Bug nicht
mehr vorkommen.
Titel: Re: FaceCharacter-Bug behoben, aber trotzdem noch drin
Beitrag von: fireorange am 08. Mai 2010, 15:29:44
Rayman, ich weiß leider net, an welcher Stelle das passiert ist und kann auch net sagen, ob es ein spezielles Skript war. Helli konnte es ja auch nicht haargenau rekonstruieren.
Titel: Re: FaceCharacter-Bug behoben, aber trotzdem noch drin
Beitrag von: Tribble am 08. Mai 2010, 15:44:51
Was häufig passieren kann, ist, dass evtl. auch die Charakter-ID vom Charakter-Editor und im Script nicht übereinstimmen.
Dass dürfte eigentlich nicht der Grund sein. Denn wenn eine fehlerhafte (sprich im Spiel nicht vorhandene) Char-ID benutzt wird meckert AGS schon beim erstellen des Skriptes.

Ganz besonders häufig hatte ich das bei Bernard, weil er offiziell ohne H geschrieben wird, aber in den Starterpacks beim Script-Namen MIT H geschrieben wurde.
*seufz* Wie oft haben wir diesen Fehler jetzt schon beseitigit?
Titel: Re: FaceCharacter-Bug behoben, aber trotzdem noch drin
Beitrag von: rulaman am 09. Mai 2010, 20:11:01
Bau doch mal folgendes in die FaceCharacter-Funktion ein:

if ( player.Room != character.Room )
{
   player.Say("Fehler* Spieler nicht im selben Raum");
}
Du kannst auch (AGS3 vorrausgesetzt) einen Breakpoint dorthin setzen.

---

Poste doch mal die Zeilen um
in Global script (line 926)
Titel: Re: FaceCharacter-Bug behoben, aber trotzdem noch drin
Beitrag von: fireorange am 14. Mai 2010, 03:38:24
Sorry für die späte Antwort, hatte noch andere Sachen zu korrigieren. ;) In den entsprechenden Zeilen steht:

    // characters only face each other after the moving character arrived at the target point
    if (NPCfacesplayer == 1)  FaceCharacter (charid, playerchar);
    FaceCharacter (playerchar, charid);
  }
  return arrived;
}

AGS 3 verwende ich für MMM nach wie vor noch net. ;)
Titel: Re: FaceCharacter-Bug behoben, aber trotzdem noch drin
Beitrag von: fireorange am 29. August 2010, 13:43:21
Bau doch mal folgendes in die FaceCharacter-Funktion ein:

if ( player.Room != character.Room )
{
   player.Say("Fehler* Spieler nicht im selben Raum");
}

Da ich den Fehler net beheben konnte, werde ich das wohl tun müssen. Aber wo genau muss ich das jetzt einfügen oder welche Skriptstelle muss ich ersetzen? Beim Global Script bin ich immer sehr vorsichtig.
Titel: Re: FaceCharacter-Bug behoben, aber trotzdem noch drin
Beitrag von: rulaman am 29. August 2010, 20:45:20
Wie du bereits weiter oben gepostet hattest.

if (type == 2 || type == 6) FaceCharacter (GetPlayerCharacter (), GetCharacterAt (mouse.x, mouse.y));


ersetze es mal durch

if (type == 2 || type == 6)
{
  if ( player.Room != GetCharacterAt (mouse.x, mouse.y).Room )
  {
    player.Say("Character nicht im selben Raum %d %d\n", GetCharacterAt (mouse.x, mouse.y).Room, GetCharacterAt (mouse.x, mouse.y).ID);
  }
  else
  {
    FaceCharacter (GetPlayerCharacter (), GetCharacterAt (mouse.x, mouse.y));
  }
}

So weist du den Raum des Characters den dein Spieler anschauen soll und auch die ID.

PS: Ich habe es nicht getestet.
Titel: Re: FaceCharacter-Bug behoben, aber trotzdem noch drin
Beitrag von: fireorange am 29. August 2010, 21:33:32
Testen wird eh schwer, da der Fehler sehr selten auftritt bzw. erst zweimal gemeldet wurde und bei mir selbst höchstens dreimal aufgetreten ist. Ich werde es mal versuchen, danke.
Titel: Re: FaceCharacter-Bug behoben, aber trotzdem noch drin
Beitrag von: rulaman am 30. August 2010, 08:29:44
Versuch doch mal, nach dem Ausführen der Aktion die Maus schnell in diue Inventargui zu schieben, wenn das Skript dann an die Stelle kommt und die Maus ist woanders, dann kann es durchaus zu diesem fehler kommen.
Titel: Re: FaceCharacter-Bug behoben, aber trotzdem noch drin
Beitrag von: Bòógieman am 30. August 2010, 08:39:31
Versuch doch mal, nach dem Ausführen der Aktion die Maus schnell in diue Inventargui zu schieben, wenn das Skript dann an die Stelle kommt und die Maus ist woanders, dann kann es durchaus zu diesem fehler kommen.
das ist doch exakt der bug von dem er im ersten post gesagt hat, dass er ihn schon gefixt hat

Komische Situation, ich habe sowohl den FaceCharacter-Bug als auch den SetActiveInventory-Bug nach Anleitung aus dem AT behoben, wie ich es immer gemacht habe. Doch diesmal tritt folgender Fehler weiterhin auf :( :

aber möglicherweise ist es ja dieser bug hier:
http://www.maniac-mansion-mania.de/forum/index.php?topic=1000.msg19322#msg19322 (http://www.maniac-mansion-mania.de/forum/index.php?topic=1000.msg19322#msg19322)
Titel: Re: FaceCharacter-Bug behoben, aber trotzdem noch drin
Beitrag von: fireorange am 30. August 2010, 14:52:53
Ich wollte es gerade einfügen, aber die folgende Zeile akzeptiert AGS net:

  if ( player.Room != GetCharacterAt (mouse.x, mouse.y).Room )

Das fehlende Semikolon habe ich ergänzt, danach ging es aber trotzdem net speichern.
Titel: Re: FaceCharacter-Bug behoben, aber trotzdem noch drin
Beitrag von: Bòógieman am 30. August 2010, 17:20:38
sowas in der art ist mir bei AGS3.1SP1 auch schon mal untergekommen
da hat AGS einfach ein vollkommen gültiges skript als fehlerhaft angesehen
hab da dann code gelöscht und neu geschrieben (aber 1:1 so wie es vorher da stand) bis es irgendwann wieder ging
Titel: Re: FaceCharacter-Bug behoben, aber trotzdem noch drin
Beitrag von: fireorange am 30. August 2010, 17:31:42
Dann versuch ich es nochmal, danke.
Titel: Re: FaceCharacter-Bug behoben, aber trotzdem noch drin
Beitrag von: fireorange am 30. August 2010, 19:16:38
Hab alles versucht, der beschwert sich nach wie vor...

(http://dl.dropbox.com/u/1883128/error.PNG)
Titel: Re: FaceCharacter-Bug behoben, aber trotzdem noch drin
Beitrag von: Bòógieman am 30. August 2010, 21:00:09
jep, genau denn selben fehler hatte ich auch
ich wollte zwei integer eigenschaften vergleichen und AGS hat gestreikt

aber nach ein paar mal ändern, speichern, ... hat AGS aufgegeben  ;)
Titel: Re: FaceCharacter-Bug behoben, aber trotzdem noch drin
Beitrag von: fireorange am 30. August 2010, 21:50:34
AGS ist hartnäckig... :P Und da gabs keinen Geheimtipp zur Lösung?

Edit: Ich muss wohl aufgeben... der Bug lässt sich net beheben. :-\
Titel: Re: FaceCharacter-Bug behoben, aber trotzdem noch drin
Beitrag von: Rocco am 30. August 2010, 22:18:03
hast du das schon probiert? -> http://www.adventure-treff.de/forum/viewtopic.php?p=185068#p185068
Titel: Re: FaceCharacter-Bug behoben, aber trotzdem noch drin
Beitrag von: fireorange am 30. August 2010, 22:32:20
Wie das Eingangsposting verrät, habe ich den Thread hier nur geöffnet, weil eben dieser Skript dieses Mal offenbar keine Wirkung zeigt...
Titel: Re: FaceCharacter-Bug behoben, aber trotzdem noch drin
Beitrag von: Bòógieman am 30. August 2010, 22:33:32
bzgl. speichern-bug:
hast du schon probiert die zeile die ihm nicht passt zu entfernen, speichern, fenster schliessen, evtl. sogar ags schliessen, alles neu aufmachen und den code neu reintippen?
Titel: Re: FaceCharacter-Bug behoben, aber trotzdem noch drin
Beitrag von: fireorange am 30. August 2010, 22:39:34
Ja, hab ich alles versucht... Leider sind es mindestens drei Zeilen, die ihm net passen. Wenn ich eine ausklammere, beschwert er sich über die nächste. Der Greif meinte, es müsste statt GetCharacterAt "Character.GetAtScreenXY" heißen, aber das ändert auch nichts, außer dass dann ne andere Meldung kommt (structure required on left of '.').
Titel: Re: FaceCharacter-Bug behoben, aber trotzdem noch drin
Beitrag von: Rocco am 30. August 2010, 22:54:27
das semikolon ist da am Ende der if-anweisung auf jeden Fall fehl am Platz, damit beendest du die if-Anweisung und mehrere Fehlermeldungen sind die Folge.
Semikolon am Ende von 3097 also einmal auf jeden Fall weg.

dann versuch mal den Teil rauslöschen
if (type == 2 || type == 6)
{
  if ( player.Room != GetCharacterAt (mouse.x, mouse.y).Room )
  {
    player.Say("Character nicht im selben Raum %d %d\n", GetCharacterAt (mouse.x, mouse.y).Room, GetCharacterAt (mouse.x, mouse.y).ID);
  }
  else
  {
    FaceCharacter (GetPlayerCharacter (), GetCharacterAt (mouse.x, mouse.y));
  }
}


und schau ob ohne diesen Abschnitt alles ordnungsgemäss kompiliert wird,
damit du dir sicher sein kannst, dass das Problem auch von diesem Bereich herrührt und nicht von wo anders kommt.

edit: wenn ich mir das so anschaue, dann bezweifle ich dass dieser code je funktioniert haben könnte.
GetCharacterAt (mouse.x, mouse.y) .Room <- das ist mir neu
um es mit bernards worten auszudrücken - "Das klappt so nicht."
Titel: Re: FaceCharacter-Bug behoben, aber trotzdem noch drin
Beitrag von: fireorange am 30. August 2010, 23:01:31
Das hab ich schon versucht. Wenn ich den ganzen Part rauslösche, dann speichert es.

Dass das Semikolon an der Stelle falsch ist, hab ich inzwischen gepeilt, aber es ging so und so net speichern.

Zitat
GetCharacterAt (mouse.x, mouse.y) .Room <- das ist mir neu

Der Skript ist ja auch neu, der stammt von rulaman (vielleicht würdest du besser durchblicken, wenn du den Thread ganz durchliest ;) ). Und er lässt sich eben zumindest bei mir net abspeichern.

Edit: Bòógiemans Theorie vom Speicherfehler kann auch net ganz stimmen. Ich hab versucht den Skript bei einer alten Episode einzufügen und die Meldungen bleiben gleich. Bin mal im Bett, vielleicht findet morgen oder so ja noch jemand nen Fehler in besagtem Skript...
Titel: Re: FaceCharacter-Bug behoben, aber trotzdem noch drin
Beitrag von: Rocco am 30. August 2010, 23:17:53
edit: ich blick schon durch keine Angst,  ;) aber es hat wohl vor mir noch keiner das Konstrukt von Rulaman an sich in Frage gestellt und da hakts meiner Meinung nach, weil so einen Befehl
GetCharacterAt (mouse.x, mouse.y).Room gibts in AGS nicht, führt deswegen zu deiner Fehlermeldung und kann nicht kompiliert werden.


versuchs mal damit.

 if (type == 2 || type == 6)
{
  Character *whichchar = Character.GetAtScreenXY(mouse.x,mouse.y);
  if ( player.Room != whichchar.Room)
    player.Say("Character nicht im selben Raum \n");
  else
    FaceCharacter (GetPlayerCharacter (), GetCharacterAt (mouse.x, mouse.y));
}
Titel: Re: FaceCharacter-Bug behoben, aber trotzdem noch drin
Beitrag von: Bòógieman am 31. August 2010, 09:18:22
GetCharacterAt gibt es sehr wohl!

Zitat von: AGS Hilfe
GetAtScreenXY (character)
(Formerly known as global function GetCharacterAt, which is now obsolete)

dieser liefert einen Character* zurück, somit geht GetCharacterAt(...).Room auch


probiere mal, die werte die du im if vergleichen willst als variable zwischenzuspeichern

int iRoom1 = player.Room;
int iRoom2 = Character.GetAtScreenXY(mouse.x,mouse.y).Room;
if ( iRoom1 != iRoom2)
...
Titel: Re: FaceCharacter-Bug behoben, aber trotzdem noch drin
Beitrag von: Rocco am 31. August 2010, 10:28:38
Natürlich gibts GetCharacterAT auch, aber AGS lässt diese Syntax mit .Room am Schluss nicht gelten.
Vielleicht würde es so funktionieren Character[GetCharacterAT(mouse.x,mouse.y)].room keine Ahnung,
könnte ich mir eher vorstellen, müsste man probieren.
Titel: Re: FaceCharacter-Bug behoben, aber trotzdem noch drin
Beitrag von: Bòógieman am 31. August 2010, 12:06:18
das kann jetzt nicht funktionieren

GetCharacterAt liefert den Character zurück (also wenn es zB auf Dave verweisst, bekommt man da das selbe wie wenn man cDave verwendet)
dein code geht aber davon aus, dass GetCharacterAt einen index zurück liefert, mit dem man in der Character-liste zugreifen kann

es sei denn, die AGS-hilfe ist falsch, dann nehme ich alles zurück ;)
Titel: Re: FaceCharacter-Bug behoben, aber trotzdem noch drin
Beitrag von: Rocco am 31. August 2010, 15:17:26
ich dachte es ist umgekehrt, nämlich das GetCharacterAt ein int zurückliefert,
aber room eine Memberfunktion von Character ist und deswegen einen Character erwartet und mit einem int nichts anfangen kann.
müsste man austesten, das hier scheint aber zu funktionieren (zumindest gibts keinen Error):


if (type == 2 || type == 6)
{
  Character *whichchar = Character.GetAtScreenXY(mouse.x,mouse.y);
  if ( player.Room != whichchar.Room)
    player.Say("Character nicht im selben Raum \n");
  else
    FaceCharacter (GetPlayerCharacter (), GetCharacterAt (mouse.x, mouse.y));
}
Titel: Re: FaceCharacter-Bug behoben, aber trotzdem noch drin
Beitrag von: fireorange am 31. August 2010, 19:01:13
Kann es denn sein, dass rulamans Skript nur unter AGS 3 funktioniert? Dann kanns bei mir nämlich net klappen (und ich weiß net, bei welcher Version Rocco ist...). Danke für das Skript, Rocco, ich werde es nachher ausprobieren. :)
Titel: Re: FaceCharacter-Bug behoben, aber trotzdem noch drin
Beitrag von: Rocco am 31. August 2010, 19:21:54
Glaub ich nicht, weil GetCharacterAt eigentlich schon in AGS 272 veraltet war und durch GetAtScreenXY (character) ersetzt wurde.
Das du und die meisten anderen hier noch mit AGS 272 arbeiten ist allgemein bekannt.  ;)

@Bòógieman:
In der Hilfe steht nichts davon was GetCharacterAt zurückgibt, sondern nur das GetAtScreenXY einen Character zurückgibt.

Zitat
GetAtScreenXY (character)
(Formerly known as global function GetCharacterAt, which is now obsolete)

static Character* Character.GetAtScreenXY(int x, int y)
Titel: Re: FaceCharacter-Bug behoben, aber trotzdem noch drin
Beitrag von: Bòógieman am 31. August 2010, 21:20:00
gut, du hast recht
ich hab mich von der hilfe in die irre leiten lassen
dachte echt, dass wenn eine funktion die andere ersetzt, dass zumindest der rückgabetyp gleich bleibt, aber naja
im skript selbst sieht man den rückgabetyp int, also index  :-[
Titel: Re: FaceCharacter-Bug behoben, aber trotzdem noch drin
Beitrag von: rulaman am 31. August 2010, 21:40:17
Sorry für die übereilte Antwort. Aber Roccos Lösung sollte funktionieren.
Bin die letzten Tage nicht zum Lesen oder testen gekommen.
Wie schon gesagt es war ungetestet. Da hätte ich sorgfältiger sein sollen.
Titel: Re: FaceCharacter-Bug behoben, aber trotzdem noch drin
Beitrag von: fireorange am 01. September 2010, 03:41:18
Kein Problem, rulaman, kommt vor. ;) Roccos Skript funktioniert. :)