Scripte funktionieren nicht

  • Hallöchen!


    bin seit längerer Zeit schon fleißiger Leser dieses Forums, da ich aber wahrscheinlich keine große Hilfe bin und auch ohne Anmeldung immer eine Antwort auf meine Fragen zu HoMM V inkl. Add-Ons gefunden hab, hab ichs bis heute aufgeschoben. Jetzt ist es allerdings doch soweit, dass ich mich persönlich an euch wenden möchte.


    Und zwar möchte ich ein eigenes Szenario erstellen, nachdem ich mir einige User-Szenarios runtergeladen und mit viel Spaß gespielt habe. An die Widrigkeiten beim Erstellen und Gestalten der Map hab ich mich mittlerweile gewöhnt und komme damit zurecht. Beim erstellen von Scripts stoße ich jetzt allerdings auch mit dem Versuch, logisch zu Denken, an meine Grenzen. Begeistert hab ich die Scriptliste hier gefunden und auch gleich ausprobiert, aber kein einziges Script (außer das, mit dem man die Startressourcen festlegt) klappt. ich habe mal Screenshots gemacht, um die Situation ein wenig besser einsehen zu können.


    Vorweg: Der Pfad des Ordners, in dem sich Karte und Textdateien befinden, ist

    Zitat

    C:\Games\Heroes of Might and Magic V - Tribes of the East\Heroes of Might and Magic V - Tribes of the East\Maps\Savarith3

    .


    Screenshot der Karte (inkl. beschrifteter Regionen)
    Screenshot der Scripts (in der zweiten Antwort auch nochmal in Textform)


    Was ich wollte:


    1. Wenn der Held die Kneipe bzw das Feld vor der Kneipe berührt, soll ein Text kommen. (Zeile 5-12 im Script)


    2. Wnn der Held die Seherhütte bzw das Feld davor berührt, soll ein zweiter Text kommen. (Zeile 14-21 im Script)


    Beides hat nicht funktioniert. Wenn ich das Script teste, sagt er mir jedes Mal, die "function" sei "undefined". Als ich dann aber mal ein heruntergeladenes Szenario geladen hab, bei dem es offensichtlich funktioniert hat und da mal ins Script geguckt hab, war mir das zu kompliziert um es zu übernehmen. Jedoch kam auch da beim Testen bei JEDER Function, die im Spiel geklappt hat, diese Meldung. Also dachte ich, daran kann es nicht liegen. Bei dem Szenario war die Triggerzeile auch VOR der Function (anders als hier im Script-Thread gezeigt), aber auch dieser Test hat bei mir nichts bewirkt.


    Demnach hab ich dann zwei weitere Regionen angelegt (beginn und beginn2), bei deren Passieren der Held eine Nachricht bekommen soll. (Zeile 24-29 und 32-37) Auch das hat nicht funktioniert.


    Schließlich wollte ich noch etwas ausprobieren. Ich habe ein Script eingefügt, dass der Held nach 3 Tagen 10000 Goldstücke gutgeschrieben bekommt, rein zu Testzwecken (Zeile 39-50). Ergebnis: Das Script mit den Startressourcen wird außer Kraft gesetzt (Standardwerte wurden wieder eingesetzt) und an Tag 3 passierte nichts.



    Ich weiß, es ist viel Text, aber ich hoffe, dass die Lösung vielleicht nur an einer Kleinigkeit hakt und jemand den entscheidenden Tipp geben kann.


    Vielen Dank schonmal für die Mühe! Liebe Grüße, Sascha

  • 1. Pack doch mal die Texte als normalen Text in deinen Post - das ist besser zu lesen und besser zu beantworten
    2. Sobald das Programm an der ersten fehlerhaften Zeile ankommt, werden danach keinerlei Scripte mehr abgearbeitet; fehlerhaft (wenn sowas kommt wie function undefined) ist es schon, wenn du eine Funktion mit bestimmten Parametern einem Trigger zuordnen sollst, aber die Funktion mit weniger/mehr/anderen Parametern definiert hast

    lest Terry Pratchett(RIP) ... und Stephen King, John Katzenbach, Hohlbein, Frank Schätzing, Anne Rice, Andrzej Sapkowski, Anne Bishop, Bernhard Hennen, George R.R. Martin, Markus Heitz, ... (wurde ja langsam Zeit, dass was dazu kommt)

  • Alles klar, schonmal danke für die schnelle Antwort! Leider ist Punkt2 ab dem Strichpunkt für mich als Scriptneuling schon nicht mehr wirklich verständlich.


    Start-Ressourcen

    Zitat

    SetPlayerStartResources( PLAYER_1, 50, 50, 25, 25, 25, 25, 50000);
    SetPlayerStartResources( PLAYER_2, 10, 10, 10, 10, 10, 10, 10000);
    SetPlayerStartResources( PLAYER_3, 10, 10, 10, 10, 10, 10, 10000);


    Kneipe


    Seher


    Beginn

    Zitat

    Trigger( REGION_ENTER_AND_STOP_TRIGGER, "beginn", "fbeginn" );
    function fbeginn
    MessageBox("Maps/Savanith3/beginn.txt" );
    Trigger( REGION_ENTER_AND_STOP_TRIGGER, "beginn", nil);
    end;
    end;


    Beginn2

    Zitat

    Trigger( REGION_ENTER_AND_STOP_TRIGGER, "beginn2", "fbeginn2" );
    function fbeginn2
    MessageBox("Maps/Savanith3/beginn2.txt" );
    Trigger( REGION_ENTER_AND_STOP_TRIGGER, "beginn2", nil);
    end;
    end;


    Ressourcen am dritten Tag

  • Der Fehler liegt beim Pfad der Ressourcen.
    Die Ressourcen liegen in
    /...Heroes V - Tribes of the East/Editor/H5MMods/Kartenname/Maps/SingleMissions/


    Da müssen dementsprechend auch Textdateien rein. Diese musst du übrigens auch mit Unicode-Codierung speichern (einfach ne Textdatei erstellen und bei "Speichern unter" die Codierung "Unicode" auswählen).
    Dann musst du bei MessageBox auch den entsprechenden Pfad angeben, ausgegangen wird vom Ordner "Kartenname", d.h. der Pfad wäre:
    "Maps/SingleMissions/Dateiname.txt"
    Für Multiplayermaps wäre's natürlich anstelle von "SingleMissions" "Multiplayer"


    Das sind so die großen Probleme für MessageBoxes.


    Das mit "Function undefined" ist nicht weiter wild - das kommt auch bei mir immer und im Tutorial von CelestialHeavens steht sogar, dass das nicht weiter relevant ist ;)


    Das Skript an sich ist richtig, daran liegt's also nicht.
    Wie gesagt, die Nachrichten werden nicht angezeigt, weil die Textdateien am falschen Ort sind und wahrscheinlich auch nicht Unicode-Codierung haben.


    Nur beim letzten Problem mit dem Gold kann ich dir nicht helfen, habe noch nie ein Script benötigt, dass dem Spieler Ressourcen gibt - ich manage das immer über Kreaturen, die nach ihrem Ableben Ressourcen hinterlassen (einstellbar direkt in den Object Properties der Kreatur).


    : Schau dir vlt mal meinen 1. Thread hier an, ist auch noch nicht solange her, da habe ich ähnliche Probleme gehabt, die darin ganz gut gelöst wurden ;) Klick hier!

  • okay, nach intensiver rumtüftelei und unter hilfe von makrises tutorial hab ich es jetzt immerhin mal geschafft, dass direkt zu missionsbeginn ein "Hallo Welt!" auf dem Screen erscheint. Dann bedanke ich mich bis hierhin schonmal und mach mich mal ran, da jetzt noch ne Verknüpfung mit irgendwelchen Triggern reinzuwurschteln ;)


    EDIT:


    Ich beiß gleich in die Tischkante, das darf doch echt nicht wahr sein, dass man sich an so einer simplen Funktion die Zähne ausbeißt...



    Teil 1 klappt, also zu Spielbeginn kommt sofort die Textbox mit dem Intro.


    Teil 2 habe ich 1 zu 1 aus dem Tutorial übernommen. "sichtkontakt.txt" ist ebenso wie "intro.txt" in unicode im jeweiligen verzeichnis gespeichert, der pfad kann also auch nicht falsch sein. die region heißt "rsichtkontakt".


    wo liegt der fehler? :wall:

  • Trigger(REGION_ENTER_WITHOUT_STOP_TRIGGER,"rsichtkontakt","sichtkontakt()")


    Hier ham wir ihn!
    Probier's mal mit "sichtkontakt" anstelle von "sichtkontakt()", so mache ich's immer, das müsste funktionieren.
    Die Triggerfunktion fragt ja nach dem NAMEN der Funktion, die sie verlinkt (in dem Fall die Funktion "sichtkontakt"), nicht nach den Variablen oder Parametern in der Funktion, die in der Klammer stehen würden.


    Kurz: einfach die Klammer in der Trigger-Zeile weglassen, dann klappts ;)
    Und ein Tipp:
    Im Ordner "Editor Documentation" findest du unter anderem eine Datei names "IDs_for_Scripts", in der u.a. steht, dass du anstelle von "REGION_ENTER_WITHOUT_STOP_TRIGGER auch einfach die Zahl 7 nehmen kannst, einfach mal in der Datei unter "TriggerIDs" gucken ;)

  • REGION_ENTER_WITHOUT_STOP_TRIGGER übergibt den Namen des Helden, der die Region entert - deine Funktion hat den aber nicht als Parameter


    mit


    function sichtkontakt(heroname)
    MessageBox("/Maps/SingleMissions/Savarith3/sichtkontakt.txt");
    Trigger(REGION_ENTER_WITHOUT_STOP_TRIGGER,"rsichtkontakt",nil);
    end;
    Trigger(REGION_ENTER_WITHOUT_STOP_TRIGGER,"rsichtkontakt","sichtkontakt")


    könnte es klappen...

    lest Terry Pratchett(RIP) ... und Stephen King, John Katzenbach, Hohlbein, Frank Schätzing, Anne Rice, Andrzej Sapkowski, Anne Bishop, Bernhard Hennen, George R.R. Martin, Markus Heitz, ... (wurde ja langsam Zeit, dass was dazu kommt)

  • Verwende mal den REGION_ENTER_AND_STOP_TRIGGER und teste ob der Held stehen bleibt, wenn er die Region betritt. Wenn er weiterläuft liegt der Fehler bei der Region oder beim Trigger, ansonsten in der messagebox

    Die kausale Unabhängigkeit der Quarks von unserer Rede ist kein Merkmal der Realität (im Sinne des Gegenteils der Welt des Scheins), sondern sie ist einfach ein unbezweifelter Bestandteil unseres Redens über Quarks.
    Richard Rorty

  • Also ohne die Message-Box habe ich das Script gerade getestet und es gab keine Probleme:


    function sichtkontakt(heroname)
    AddHeroCreatures( heroname, CREATURE_ARCHANGEL, 1 );
    Trigger(REGION_ENTER_WITHOUT_STOP_TRIGGER,"rsichtkontakt",nil);
    end;
    Trigger(REGION_ENTER_WITHOUT_STOP_TRIGGER,"rsichtkontakt","sichtkontakt");


    An den restlichen Zeilen kann es also nicht liegen; vielleicht ein Tippfehler bei der Benennung der Region?? Ansonsten kannst du evtl. noch ausprobieren, ob zumindest das obige Script bei dir funktioniert.

    Die kausale Unabhängigkeit der Quarks von unserer Rede ist kein Merkmal der Realität (im Sinne des Gegenteils der Welt des Scheins), sondern sie ist einfach ein unbezweifelter Bestandteil unseres Redens über Quarks.
    Richard Rorty

  • Könnte ich mal machen, ich hätte noch folgende Idee:
    Versuch mal, bei der Textbox den Pfad "Maps/SingleMissions/..." zu nehmen, also kein / vor "Maps", so mache ich es immer und es klappt... (Nehme alles zurück, wenn bei der Intro-Textbox auch ein / ist) ;)


    Noch was:
    Versuch mal Folgendes:


    Code
    function sichtkontakt(heroname)
    if heroname == "Narxes" then
    AddHeroCreatures( heroname, CREATURE_ARCHANGEL, 1 );
    Trigger(REGION_ENTER_WITHOUT_STOP_TRIGGER,"rsichtkontakt",nil);
    end;
    end;
    Trigger(REGION_ENTER_WITHOUT_STOP_TRIGGER,"rsichtkontakt","sichtkontakt");


    So hat's bei mir auf jeden Fall geklappt...

  • Die Karte an sich gefällt mir schon gut, auch schön mit dem "Mask"-Tool was gemacht.


    Das 1., was mir beim Script auffiel, war, dass du "heroname == Narxes" getippt hast.
    Helden haben aber einen "Skriptnamen", den du in den Heldeneigenschaften unter "Settings" ansehen kannst.
    Dein Held heißt "Razzak", deswegen musst du auch diesen Namen verwenden.


    Das Problem bei deinem Script war jetzt, dass du dich zwar auf die Region "rsichtkontakt" bezogen hast - aber blöderweise hieß deine Region gar nicht so, sondern nur "sichtkontakt". Ein Ändern des Namens im Regions-Reiter schafft hier Abhilfe [Jaja, die einfachsten Sachen... ich war auch schon ratlos, bis meine Freundin mich dann gefragt hat, ob das "rsichtkontakt" n Tippfehler ist... :lol: ] ;) Ansonsten ist das Script nämlich richtig. Ich persönlich ziehe allerdings wie schon gesagt anstelle des ewig lange Terms "CREATURE_SoUndSo" eine Nummer vor, die du aus dem "Script_IDs".pdf kriegst ;)


    Danach war ein Test bei mir auch erfolgreich, in meinem Script hat der Held einen Greifen bekommen. Du kannst dann auch das "if heroname..." und ein "end;" weglassen, einen Unterschied macht das aber nicht, weil der Spieler ja eh nur den einen Helden hat ;)

  • ach, du bist ein schatz! danke! jetzt klappt es auch bei mir. auch wenn ich mir sicher bin, dass ich das "sichtkontakt" schonmal auf "rsichtkontakt" abgeändert hatte. aber okay.


    knackpunkt war wohl wirklich der Scriptname vom Helden. Ich dachte, das sei der Originalname des ausgewählten Helden. Gut, wieder was gelernt.


    In der Wartezeit auf die Lösung des Scriptproblems hab ich die Map vom Design her ja fertig gemacht, jetzt kann ich mich endlich dranwagen, der Map auch die Story zu geben, die ich ihr angedacht hatte und die Monster einzusetzen.


    Vielen Dank nochmal! :daumen:


    PS: Ja, auf die "Abkürzungen" bzw Script_IDs haste ja schonmal hingewiesen. Ich bleib aber lieber bei den Standardbefehlen, da seh ich direkt, was passiert und muss nicht erst wieder nachschlagen. Eine Zeile geht dafür so oder so drauf ;)

  • Forum

    Hat das Thema geschlossen.