Autor Thema: Der C64-Technik-Hilfe-Thread  (Gelesen 16647 mal)

Rocco

  • Administrator
  • alter Tentakel
  • *****
  • Beiträge: 2371
  • Geschlecht: Männlich
    • Profil anzeigen
    • Maniac Mansion Mania
    • E-Mail
Re: Der C64-Technik-Hilfe-Thread
« Antwort #15 am: 11. März 2012, 13:18:40 »

[ags] // --- load font corresponding to language and screen width ---
  string font_info;
  if (system.screen_width == 320)      StrCopy (font_info, GetTranslation ("font_320: 3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3"));
  else if (system.screen_width == 640) StrCopy (font_info, GetTranslation ("font_640: 13 14 14 14 14 14 14 14 14 14 14 14 14 14 13 13 13 13 13 13 14"));
  clearToSpace (font_info);

  SetSpeechFont (getInteger (font_info));         // Speech
  SetLabelFont (0, 0, getInteger (font_info));    // Status-Line[/ags]

Das hat jetzt nichts mit deinem konkreten Problem zu tun, sondern mit einem Bug in deinem Codebeispiel der sich schon wieder von SP zu SP zieht.
Das Ganze ist ein Kampf gegen Windmühlen und ärgert mich ehrlich gesagt schon ein bischen.
Hat jetzt nichts mit dir zu tun, aber ich hab mir grade das Bernard SP 3_2 angesehen und da ist er auch wieder drinnen.
Mit obigen Code funktionieren die Games auf Wide-Screen Monitoren (die mittlerweile fast jeder verwendet, behaupte ich mal) nicht im Vollbildmodus.
Weil bei einem 16:9 oder 16:10 Monitor AGS automatisch die Breite anpasst.
Das heisst aus 320 werden automatisch dann 360, obige Anweisung wird nicht mehr durchgeführt font_info ist nicht definiert und das Game läuft nicht, daher bitte diese 2 Zeilen Code ersetzen:
[ags] 
  font_info = GetTranslation ("font_320: 1  0  0  0  0  0  0  0  0  0  0  0  0  0  0");
  if (System.ViewportWidth >= 640) font_info = GetTranslation ("font_640: 3  4  4  4  4  4  4  4  4  4  4  4  4  4  4");
[/ags]

Es gehört jedenfalls ein Thread her, der alle Bugs die mittlerweile schon x-mal aufgetreten sind, dann vereinzelt gefixt wurden,
nur um in der nächsten Version des SPs wieder aufzutauchen, zusammengefasst werden, damit jeder der ein SP erstellt sich daran halten kann und diese Bugs gleich ausmerzt.

 

KhrisMUC

  • Moderator
  • volljähriger Tentakel
  • *****
  • Beiträge: 989
    • Profil anzeigen
Re: Der C64-Technik-Hilfe-Thread
« Antwort #16 am: 11. März 2012, 15:42:40 »
Ich glaube, dass es diese Unterscheidung sowieso nicht mehr braucht.
Neuere Versionen der Engine lassen eine native Auflösung von 640 für 320er Spiele eh nicht mehr zu.
Man kann ja problemlos mit dem x2 Filter hochskalieren, falls 320 nicht mit Vollbild läuft.
Sprich, die Verwendung von anderen Schriftarten ist nicht mehr notwendig, was den ganzen Mechanismus ebenfalls überflüssig macht.

1mal_volltanken:
Schau Dir mal diesen Bereich an:
[ags]  UsedAction == A_WALK_TO;
  gAction.Text = "Walk to";
  UsedAction = A_WALK_TO;[/ags]

Da wird versucht, die Funktion UsedAction() auf A_WALK_TO zu setzen, und zwar mittels dem Vergleichsoperator "==", dann nochmal mit "=".
Von wem stammt dieser Code...??

Warum muss überhaupt die Verb-Zeile manuell nach jeder Dialog-Zeile zurückgesetzt werden...?

Und ich bin ja mal gespannt, ob (Anzahl Zeichen mal 3) Leerzeichen sagen genauso lang dauert, wie den ursprünglichen Text.

1mal_volltanken

  • Midlife Crisis Tentakel
  • ******
  • Beiträge: 1261
  • Geschlecht: Männlich
  • Traue niemals einem glatzköpfigen Friseur!
    • ICQ Messenger - 327646596
    • Profil anzeigen
Re: Der C64-Technik-Hilfe-Thread
« Antwort #17 am: 12. März 2012, 10:36:28 »
Hallo.

Also das ursprüngliche Script zu dem Speech sah genau so aus:

[ags]function Reset_Line()
{
mouse.Mode = eModeWalkto;
Action_Verb = "Walk to";
LblAction.Text = "Walk to";
Action = aWalkTo;
}

function Black()
    {
    gMainGui.Visible = false;
    mouse.Visible = false;
    LblAction.Visible = false;
    LBL_MESSAGE_TOP.Text = ""; // black will always erase this one.
    }

function Back()
    {
    gMainGui.Visible = true;
    mouse.Visible = true;
    LblAction.Visible = true;
    }
   
function Talk(this Character*, String What)
{
LBL_MESSAGE_TOP.TextColor = this.SpeechColor;
LBL_MESSAGE_TOP.Text = What;
int tempo = this.View;
this.StopMoving(); // just to be sure

int Cmpt =0;
String Empty = "  ";
while (Cmpt < What.Length)
    {
    Empty = String.Format("%s ",Empty);
    Cmpt++;
    } 
this.Say(Empty);
LBL_MESSAGE_TOP.Text = "";
Reset_Line();
}    [/ags]


Ich hatte das nur entsprechend versucht umzuschreiben und das mit = und == ist eher ein Syntax-Fehler von mir gewesen. Aber ich kann ja mal versuchen, es einfach wegzulassen und schauen, ob das jetzt Auswirkungen hat. Wollte das nur eben 1:1 beibehalten nur halt mit den Script-Codes von MMM.


BG
der Volltanker
"Tage sind eigentlich wie Nächte...nur nicht ganz so spät!"...hörte ich einmal einen sehr klugen, alten Mann beim Erdnüsse sortieren in der Kneipe sagen, kurz bevor er vom Hocker rutschte.


"Nicht jeder, der aus dem Rahmen fällt, war vorher im Bilde!"

1mal_volltanken

  • Midlife Crisis Tentakel
  • ******
  • Beiträge: 1261
  • Geschlecht: Männlich
  • Traue niemals einem glatzköpfigen Friseur!
    • ICQ Messenger - 327646596
    • Profil anzeigen
Re: Der C64-Technik-Hilfe-Thread
« Antwort #18 am: 12. März 2012, 14:27:22 »
Jaaaa-haaaa-hiiii Hi-ha-ha-haaaaaaaaa !!!
Es funktioniiiiiieeeeert! Es funtioniiieeeert !!!
Ich habe einfach nur den Inhalt der 'Reset-Line'-function geleert und es funktioniiiieeert!  ;D ;D ;D  INKLUSIVE Speech-Animation!

Nur noch eine kleine Sache, die mich stört. Durch nen Screenshot habe ich die Fontgröße mal nachgemessen und die ist korrekt. Auf 2xFilter ist jeder Großbuchstabe 12x14 px groß, was in der Standart-Auflösung ebenfalls korrekt ist. Also an der Größe lag es nicht.
Das Problem ist nur der Zeilenabstand !!! Siehe Bild:



Gibt es eine Möglichkeit den Zeilenabstand des Fonts zu verändern?
Das wär natürlich klasse, ansonsten muss man für den Speech mit einer Zeile hinkommen. Im Original MM auf C64, war das ja auch so. Da waren die Screens auch 136 px hoch anstatt 128.


@Rocco:

Ich hab Dein Script einmal eingefügt, aber da gabs ne Fehlermeldung. Deswegen hatte ich es wieder zurückgesetzt. Vielleicht das Script lieber noch einmal überprüfen.



Bis dahin erstmal. Ich melde mich wahrscheinlich bald wieder. ;)


BG
der Volltanker



"Tage sind eigentlich wie Nächte...nur nicht ganz so spät!"...hörte ich einmal einen sehr klugen, alten Mann beim Erdnüsse sortieren in der Kneipe sagen, kurz bevor er vom Hocker rutschte.


"Nicht jeder, der aus dem Rahmen fällt, war vorher im Bilde!"

KhrisMUC

  • Moderator
  • volljähriger Tentakel
  • *****
  • Beiträge: 989
    • Profil anzeigen
Re: Der C64-Technik-Hilfe-Thread
« Antwort #19 am: 12. März 2012, 21:44:15 »
Das müsste wiederum per FontEdit gehen. Dort kann man die Höhe der Zeichen einstellen, auch für alle auf einmal, soweit ich weiß.
Die andere Möglichkeit wäre, einfach das schwarze GUI ein paar Pixel höher zu machen...

1mal_volltanken

  • Midlife Crisis Tentakel
  • ******
  • Beiträge: 1261
  • Geschlecht: Männlich
  • Traue niemals einem glatzköpfigen Friseur!
    • ICQ Messenger - 327646596
    • Profil anzeigen
Re: Der C64-Technik-Hilfe-Thread
« Antwort #20 am: 13. März 2012, 07:04:49 »
Ne. Editieren lässt sich das leider nicht. Mir ist da nun ein anderer Einfall gekommen, und zwar 2 Labels zu verwenden (für jede Zeile also ein eigenes).
Das heisst, wenn der Speech über 2 Zeilen geht, laufen dafür dann 2 Speeches zeitgleich. Damit kann ich das 2.Label so anpassen, dass in der Höhe die Buchstaben nur noch einen Abstand von 1 px haben.

Im Einsatz soll das dann in etwa so aussehen (P.S.: Der Befehl heisst jetzt 'Talk'):

[ags]player.Talk("Wir beide haben schon eine Menge Adventures");
player.Talk2("erlebt");
[/ags]

Das wär so ein Beispiel von einem Speech, der über 2 Zeilen geht. Entscheident ist hier natürlich, dass beide Speeches syncron ablaufen und nicht hintereinander.
Das macht man bestimmt auch mit einem 'while'-Befehl oder? Wie es technisch als function programmiert aussieht, kann ich nur erahnen, aber nicht wirklich wiedergeben. Außerdem muss ich, schätz ich mal, die Zeitdauer om Speech, manuell einstellen, wenn ich 2 Zeilen verwende, da diese Zeiteinheit laut Script abhängig von der Länge des Textes  ist und das könnte bedeuten, dass die eine Zeile zeitlich vor der anderen verschwindet.

Wie könnte das Script denn in etwa Aussehen?



BG
der Volltanker

                                                                                                                                                                                                                                                                                                                                                                                                                                                       
"Tage sind eigentlich wie Nächte...nur nicht ganz so spät!"...hörte ich einmal einen sehr klugen, alten Mann beim Erdnüsse sortieren in der Kneipe sagen, kurz bevor er vom Hocker rutschte.


"Nicht jeder, der aus dem Rahmen fällt, war vorher im Bilde!"

Endres

  • Midlife Crisis Tentakel
  • ******
  • Beiträge: 1264
  • Geschlecht: Männlich
  • En|dres, der
    • ICQ Messenger - 230191486
    • MSN Messenger - enni_puschner@hotmail.de
    • Profil anzeigen
    • e7p.de
    • E-Mail
Re: Der C64-Technik-Hilfe-Thread
« Antwort #21 am: 13. März 2012, 12:14:58 »
Ich habe da mal als erstes eine neue Klasse erstellt "C64.asc". Darein dann folgendes:

[ags]void Talk(this Character*, String message) {
  this.StopMoving(); // just to be sure
 
  while(message.Length > 0) {
    int Cmpt = 0;
    String Empty = "  ";
    while (Cmpt < message.Length)
    {
      Empty = Empty.AppendChar(' ');
      Cmpt++;
    }
   
    String message1 = "", message2 = "";
   
    while(message.Length > 0 && !message.StartsWith("\n") && GetTextWidth(message1.Append(message.Substring(0, 1)), lblSpeech1.Font) < lblSpeech1.Width) {
      message1 = message1.Append(message.Substring(0, 1));
      message = message.Substring(1, message.Length - 1);
    }
    if(message.StartsWith("\n")) {
      message = message.Substring(1, message.Length - 1);
    }
    lblSpeech1.TextColor = this.SpeechColor;
    lblSpeech1.Text = message1;
   
    while(message.Length > 0 && !message.StartsWith("\n") && GetTextWidth(message2.Append(message.Substring(0, 1)), lblSpeech1.Font) < lblSpeech2.Width) {
      message2 = message2.Append(message.Substring(0, 1));
      message = message.Substring(1, message.Length - 1);
    }
    if(message.StartsWith("\n")) {
      message = message.Substring(1, message.Length - 1);
    }
    lblSpeech2.TextColor = this.SpeechColor;
    lblSpeech2.Text = message2;
   
    this.Say(Empty);
   
    lblSpeech1.Text = "";
    lblSpeech2.Text = "";
  }
}[/ags]

Dann noch in die C64.ash:

[ags]import void Talk(this Character*, String message);[/ags]

Im GUI Border dann folgende Controls angelegt:

lblSpeech1, Font: 3, Height: 9, Width: 320, Left: 0, Top: -2
lblSpeech2, Font: 3, Height: 9, Width: 320, Left: 0, Top: 6

und zu guter letzt im Raumskript:
[ags]player.Talk("Meine Arbeit für Jugend forscht.\nEs hört einfach nicht auf, sich zu drehen.");[/ags]

Sieht dann so aus:


Diese Version bricht dann natürlich nur nach manuellen Zeilenumbrüchen ("\n") und ansonsten auch mitten im Wort um, mit ein bisschen mehr Aufwand ließe sich das ganze dann noch auf Umbrüche nach einzelnen Worten umrüsten.

Ich frage mich nur wie man das dann am besten in Dialogen macht. An sich sollten in Dialogskripten dann ja die selben Befehle genügen, nur weiß ich nicht ob man das generell nicht noch eleganter lösen könnte.


Domi:"irc hab ich mir viren geholt.. icq hab ich nimmer"

1mal_volltanken

  • Midlife Crisis Tentakel
  • ******
  • Beiträge: 1261
  • Geschlecht: Männlich
  • Traue niemals einem glatzköpfigen Friseur!
    • ICQ Messenger - 327646596
    • Profil anzeigen
Re: Der C64-Technik-Hilfe-Thread
« Antwort #22 am: 13. März 2012, 20:27:29 »
Super.

Klar, wenn man das Functionsscript einmal programmiert hat, denke ich, wird es sicher nicht das größte Problem sein ein /n am Zeilenumbruch einzufügen.
Im Alpha-Test sieht man dann ja, wo der Zeilenumbruch stattfinden muss und kann das entsprechend auch einfügen. ;)

Klasse. Ich versuch das mal. Nur heute schaffe ich das nicht mehr, ansonsten "Daumen hoch". So langsam aber sicher, kommen wir dem Ziel dort immer näher.


BG
der Volltanker

"Tage sind eigentlich wie Nächte...nur nicht ganz so spät!"...hörte ich einmal einen sehr klugen, alten Mann beim Erdnüsse sortieren in der Kneipe sagen, kurz bevor er vom Hocker rutschte.


"Nicht jeder, der aus dem Rahmen fällt, war vorher im Bilde!"

Rocco

  • Administrator
  • alter Tentakel
  • *****
  • Beiträge: 2371
  • Geschlecht: Männlich
    • Profil anzeigen
    • Maniac Mansion Mania
    • E-Mail
Re: Der C64-Technik-Hilfe-Thread
« Antwort #23 am: 14. März 2012, 13:06:01 »
@Rocco:

Ich hab Dein Script einmal eingefügt, aber da gabs ne Fehlermeldung. Deswegen hatte ich es wieder zurückgesetzt. Vielleicht das Script lieber noch einmal überprüfen.

änder einfach diese 2 Zeilen


[ags]
  if (system.screen_width == 320)      StrCopy (font_info, GetTranslation ("font_320: 3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3"));
  else if (system.screen_width == 640) StrCopy (font_info, GetTranslation ("font_640: 13 14 14 14 14 14 14 14 14 14 14 14 14 14 13 13 13 13 13 13 14"));[/ags]
auf diese hier um:
[ags] 
 StrCopy (font_info, GetTranslation ("font_320: 3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3"));
 if (System.ViewportWidth >= 640)  StrCopy (font_info, GetTranslation ("font_640: 13 14 14 14 14 14 14 14 14 14 14 14 14 14 13 13 13 13 13 13 14"));[/ags]



1mal_volltanken

  • Midlife Crisis Tentakel
  • ******
  • Beiträge: 1261
  • Geschlecht: Männlich
  • Traue niemals einem glatzköpfigen Friseur!
    • ICQ Messenger - 327646596
    • Profil anzeigen
Re: Der C64-Technik-Hilfe-Thread
« Antwort #24 am: 22. Mai 2012, 19:52:42 »
Hallo.

Ich wollte mal wissen, wie ich das scripten kann, dass bei der ActionBar beim drüberfahren mit der Maus die Textfarbe in die HighlightColor wechselt und auch wieder in die NormalColor wechselt wenn man den Mauszeiger wieder von der ActionBar entfernt.

Zum anderen möchte ich, dass beim Pausieren wie auf dem C64 der MouseCursor in dem Wait-Modus wechselt.
Ich habe schon im "if (GameIsPaused)"-Script schon den Befehl "SetCursorMode(eModeWait);" eingesetzt, aber der Cursor ging erst in den Wait-Modus, NACHDEM ich das 2.Mal Leertaste gedrückt habe um den Pause-Modus auszuschalten.


Danke schon mal im voraus.


BG
der Volltanker
"Tage sind eigentlich wie Nächte...nur nicht ganz so spät!"...hörte ich einmal einen sehr klugen, alten Mann beim Erdnüsse sortieren in der Kneipe sagen, kurz bevor er vom Hocker rutschte.


"Nicht jeder, der aus dem Rahmen fällt, war vorher im Bilde!"

KhrisMUC

  • Moderator
  • volljähriger Tentakel
  • *****
  • Beiträge: 989
    • Profil anzeigen
Re: Der C64-Technik-Hilfe-Thread
« Antwort #25 am: 23. Mai 2012, 00:28:06 »
Du müsstest in on_key_press diesen Block haben:
[ags]  if (keycode == 32)
  {
    // SPACEBAR
    if (IsGamePaused () == 0)
    {
      GUIOn (PAUSED);
      DisableInterface ();
    }
    else
    {
      GUIOff (PAUSED);
      EnableInterface ();
    }
  }[/ags]
Dort rein muss auch die Zeile zum Verändern des Cursors. Wohin genau solltest Du selber erkennen :)

Zu der anderen Frage:
[ags]// in UpdateActionBar() letzte Zeile ersetzen durch:

  Button*b = gAktiontext;
  GUIControl*gc = GuiControl.GetAtScreenXY(mouse.x, mouse.y);
  if (gc != null && gc.AsButton == b) b.TextColor = ActionLabelColorHighlight;
  else b.TextColor = ActionLabelColorNormal;[/ags]
Eventuell heißen in deinem Pack die Variablen für die Farben anders, und wahrscheinlich hat das Label keinen Skriptnamen.
Falls nicht, öffne das Action-GUI, klick auf das Label und gib ihm den Namen "gAktiontext".
Die Variablen für die Textfarben müssten ganz am Anfang des Global scripts definiert sein (Zeile 40/41).

1mal_volltanken

  • Midlife Crisis Tentakel
  • ******
  • Beiträge: 1261
  • Geschlecht: Männlich
  • Traue niemals einem glatzköpfigen Friseur!
    • ICQ Messenger - 327646596
    • Profil anzeigen
Re: Der C64-Technik-Hilfe-Thread
« Antwort #26 am: 23. Mai 2012, 06:55:10 »
Ich habe den SetCursorMode direkt unter die Zeile DisableInterface (); gesetzt, also innerhalb der ersten Funktionsklammern. Erschien mir dort auch logisch und da passierte ja genau das, was ich beschrieben hatte.
Das andere probiere ich auch mal aus.
Danke schon mal.


BG
der Volltanker
"Tage sind eigentlich wie Nächte...nur nicht ganz so spät!"...hörte ich einmal einen sehr klugen, alten Mann beim Erdnüsse sortieren in der Kneipe sagen, kurz bevor er vom Hocker rutschte.


"Nicht jeder, der aus dem Rahmen fällt, war vorher im Bilde!"

1mal_volltanken

  • Midlife Crisis Tentakel
  • ******
  • Beiträge: 1261
  • Geschlecht: Männlich
  • Traue niemals einem glatzköpfigen Friseur!
    • ICQ Messenger - 327646596
    • Profil anzeigen
Re: Der C64-Technik-Hilfe-Thread
« Antwort #27 am: 23. Mai 2012, 13:16:42 »
Ich habe es mal folgendermaßen eingebaut:

[ags]function UpdateActionBar (){
  // set the text in the action bar
  string madetext;
  int action = global_action;
  string objekt;
  string item;
  StrCopy (objekt, SHOWNlocation);
  StrCopy (item, "");
  if (GlobalCondition (5) == 1)
  {
    // write SWITCH TO CHAR
    action = A_SWITCH_TO;
    if (GetGUIObjectAt (mouse.x, mouse.y) == 12)
    {
      StrCopy (objekt, character [GSotherplayerup].name);
    }
    else
    {
      StrCopy (objekt, character [GSotherplayerdown].name);
    }
  }
  else if (GetCursorMode () == 4)
  {
    // use or give inventory item
    GetInvName (character [GetPlayerCharacter ()].activeinv, item);
    RemoveExtension (item);
  }
  else if (GlobalCondition (1) == 1)
  {
    // if the mouse is in the inventory and modes Walk or pickup are selected
    action = A_USE;
  }
  TranslateAction (madetext, action, objekt, item);
  // show action text
  SetLabelText (ACTION, 0, madetext);
  Button*b = gAction;
  GUIControl*gc = GuiControl.GetAtScreenXY(mouse.x, mouse.y);
  if (gc != null && gc.AsButton == b) b.TextColor = ActionLabelColorHighlight;
  else b.TextColor = ActionLabelColorNormal;[/ags]

Leider kam dort die Fehlermeldung Type mismatch:"cannot convert GUI".


BG
der Volltanker
"Tage sind eigentlich wie Nächte...nur nicht ganz so spät!"...hörte ich einmal einen sehr klugen, alten Mann beim Erdnüsse sortieren in der Kneipe sagen, kurz bevor er vom Hocker rutschte.


"Nicht jeder, der aus dem Rahmen fällt, war vorher im Bilde!"

KhrisMUC

  • Moderator
  • volljähriger Tentakel
  • *****
  • Beiträge: 989
    • Profil anzeigen
Re: Der C64-Technik-Hilfe-Thread
« Antwort #28 am: 23. Mai 2012, 14:20:29 »
Sorry, es muss natürlich Label heißen, nicht Button.
Trotzdem muss auch der Name des Labels nach dem ersten "=" stehen, nicht das GUI.

So sollte es klappen:
[ags]  Label*lbl = gAction.Controls[0].AsLabel;
  GUIControl*gc = GUIControl.GetAtScreenXY(mouse.x, mouse.y);
  if (gc != null && gc.AsLabel == lbl) lbl.TextColor = ActionLabelColorHighlight;
  else lbl.TextColor = ActionLabelColorNormal;[/ags]
« Letzte Änderung: 03. Juni 2012, 14:42:33 von KhrisMUC »

1mal_volltanken

  • Midlife Crisis Tentakel
  • ******
  • Beiträge: 1261
  • Geschlecht: Männlich
  • Traue niemals einem glatzköpfigen Friseur!
    • ICQ Messenger - 327646596
    • Profil anzeigen
Re: Der C64-Technik-Hilfe-Thread
« Antwort #29 am: 02. Juni 2012, 20:13:41 »
Hallo.

Bekomme auf der 2.Zeile Deines Scripts folgende Fehlermeldung:

GlobalScript.asc(480): Error (line 480): undefined symbol 'GuiControl'



BG
der Volltanker
"Tage sind eigentlich wie Nächte...nur nicht ganz so spät!"...hörte ich einmal einen sehr klugen, alten Mann beim Erdnüsse sortieren in der Kneipe sagen, kurz bevor er vom Hocker rutschte.


"Nicht jeder, der aus dem Rahmen fällt, war vorher im Bilde!"