INI-Datei soll Aktionen für den GM vorhersagen

  • GM 6

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • INI-Datei soll Aktionen für den GM vorhersagen

    Hallo,
    zurzeit arbeite ich an einem etwas größeren Spiel, was aus Ordnungs- und Anpassungsgründen sehr auf eine .ini-Datei zurückgreift.
    Eigentlich sollte nur das Dialogsystem dadrüber laufen, die Section und Key sind dabei Zahlenstrings (Damit man leicht weiterblättern kann). Eine Beispielzeile könnte also so aussehen:

    Quellcode

    1. [4]
    2. 1 =Räuber: Hey, ihr!

    So wurde der Text direkt als String übernommen.
    Lief soweit so gut, aber jetzt soll die .ini der gm6 auch mal Funktionen ansagen. Eine Funktion, bei der es hakt, ist die Bezahlfunktion SPEND, Beispiel hier :

    Quellcode

    1. 30=SPEND:2

    SPEND sagt dem Programm "Hey, GM6 ich will was ausgeben.", die Zahl sagt, wie viel. Die Abfrage, ob SPEND vorkommt funktioniert einwandfrei

    GML-Quellcode

    1. if global.Geld < real(string_digits(i)) //Wenn man zuwenig Geld hat...
    2. dialog[global.dialog_laeuft] += 5 //...wird im Dialogsystem fünf Zeilen weitergesprungen. (Im Beispiel geht es zur Zeile 35)
    3. else
    4. {
    5. global.C -= real(string_digits(i)) //Sonst wird die Menge bezahlt,
    6. dialog[global.dialog_laeuft] += 1 //und es geht 1 weiter.
    7. }

    Allerdings führt der GM hier beide Situationen durch. Wahrscheinlich liegt der Fehler nicht im hier beschriebenen Code, muss ich mir also selber noch mal ansehen.

    Hauptproblem: Die Funktion "SET: Beispiel:

    Quellcode

    1. 31=SET:obj_schranke.richtung 1

    SET wird im großen "Was passiert bis zum ":" switch abgefragt, klappt wohl.
    Jetzt soll Set die Variable, die bis zur Leerstelle beschrieben ist, auf die Zahl im Script setzen.
    So sieht das aus:

    GML-Quellcode

    1. i = string_delete(i,0,string_pos(":",i)); //Erst mal das "SET:" entfernen, stört nur
    2. temp = real(string_digits(i)) //Die gute alte Temp-Variable merkt sich die Zahl
    3. i = string_copy(i,0,string_pos(" ",i)-1) //Die ausgediente String-Variable merkt sich die Variable
    4. variable_local_set(i,temp); //Die Variable (i) wird auf den Wert temp gesetzt
    5. dialog[global.dialog_laeuft] += 1 ; //Dialog läuft eins weiter, soll ja nur einmal gesetzt werden.
    6. break;//UND CUT

    Problem: Die Variable bleibt nicht gesetzt. Was tun?
    Gibt es im vorliegenden Code keine Fehler und ich muss mir das Gesamtgefüge nochmal anschauen? Konnte da nichts finden, deshalb frag ich euch.
    Danke im Vorraus,
    woku

  • Ich hab den Code mal kurz überflogen, und mir ist aufgefallen, dass du variable_local_set verwendest, um "obj_schranke.richtung" zu setzen. Das geht so nicht, weil die Variable ja keine lokale Variable ist, sondern zu obj_schranke gehört. (lokal heißt, sie gehört zu dem Objekt, welches variable_local_set ausführt).

    Um das zu beheben, kannst du entweder, wenn alle Variablen zum gleichen Objekt gehören ein with(obj_schranke) einsetzen, dann muss die Variable aber direkt als "richtung" angesprochen werden.
    Alternativ könntest du auch versuchen das irgendwie zu parsen, sodass du dann sowas wie

    GML-Quellcode

    1. with(variable_local_get("obj_schranke")) variable_local_set("richtung")
    machen kannst. (Ich glaube aber nicht, dass der erste Teil funktioniert, da müsstest du mal schauen ob man das irgendwie hinbekommt.

    Ich hoffe du hast das soweit verstanden...
    “Computers are good at following instructions, but not at reading your mind.” (Donald Knuth)

    Ich schreibe mit Neo.
  • Ich würde eher sowas vorschlagen, ich setze das mal in dem Gesamtkontext (ohne Garantie auf 100% Funktionsfähigkeit)

    GML-Quellcode

    1. var setarray;
    2. i = string_delete(i,1,string_pos(":",i)); //Erst mal das "SET:" entfernen, stört nur
    3. setarray[2] = real(string_digits(i)); //Zahl in Arrayposition 2 speichern
    4. i = string_copy(i,0,string_pos(" ",i)-1); //Zahl aus i entfernen
    5. setarray[0] = string_copy(i,0,string_pos(".",i)-1); //Objektnamen in Arrayposition 0 speichern
    6. setarray[1] = string_copy(i,string_pos(".",i)+1,string_length(i)-string_pos(".",i)); //Variablennamen in Arrayposition 1 speichern
    7. with (instance_find(other.setarray[0],0)) variable_local_set(other.setarray[1],other.setarray[2]);
    8. dialog[global.dialog_laeuft] += 1 ; //Dialog läuft eins weiter, soll ja nur einmal gesetzt werden.
    9. break;//UND CUT


    Das kopiert alle nötigen Parameter in ein temporäres Array, da hat man meiner Meinung nach nen besseren Durchblick über den Zusammenhang. Dann wird einfach das angegebene Objekt gesucht und dessen lokale Variable dann geändert.

    Bei den String Funktionen musst du noch mal gesondert aufpassen, denn bei manchen ist die erste Stelle 0 (string_copy, string_char_at, ...?) und bei manchen ist die erste Stelle 1 (string_delete, string_pos, ...). Ist nicht konsistent, warum auch immer. Wenn man da nicht am Anfang höllisch aufpasst wundert man sich dann über Fehler an einer Stelle, die eigentlich funzt. Dein Code hat beispielsweise das SET: am Anfang eben nicht entfernt ;)
    "Die Erde ist ein Irrenhaus. Dabei könnte das bis heute erreichte Wissen der Menschheit aus ihr ein Paradies machen. Dafür müsste die weltweite Gesellschaft allerdings zur Vernunft kommen."
    - Joseph Weizenbaum