Portal-Zone Gothic-Zone Gothic II-Zone Gothic 3-Zone Gothic 4-Zone Modifikationen-Zone Download-Zone Foren-Zone RPG-Zone Almanach-Zone Spirit of Gothic

 

Ergebnis 1 bis 9 von 9
  1. Beiträge anzeigen #1 Zitieren
    Ehrengarde Avatar von neocromicon
    Registriert seit
    Jan 2019
    Beiträge
    2.548
     
    neocromicon ist offline

    Probleme anderen Patch zu erkennen!

    Hi!

    Ich habe probleme den Patch "ShowGameTime" immer korrekt zu erkennen um dann den Text den ich ausgeben will anders zu Positionieren.
    Da kuriose ist, das es z.b bei Dirty Swamp und L'Hiver 2.0.4 funktioniert wie gewünscht, bei z.b Velaya und Original Gothic 2 DnDr wieder nicht.

    Hier der relevante Code:

    Code:
            //Prüft welche Schriftgröße ausgewählt ist, in Gothic.ini
        var string STR_Font; STR_Font = MEM_GetGothOpt("NINJA_SHOWALWAYSIMPORTANTSTATS", "Ninja_ShowAlwaysImportantStats_Font");
        //Konvertiert den String "STR_Font" zum Integer
        var int Font; Font = STR_ToInt(STR_Font);
        //Holt sich den Patch Namen    
        var string PatchName; PatchName = "SHOWGAMETIME";
    
    
        /*Prüft ob der Patch "ShowGameTime" oder Mod "Velen 2.0" aktiv sind und welche Schriftgröße gewählt würde und schreibt diesen auf den Bildschirm
          Font 0 = Kleine Schriftgröße
          Font 1 = Große Schriftgröße */
        if (Hlp_StrCmp(NINJA_MODNAME, "Velen_2-0")) {
            if (Font == 0){
                Print_Ext(50, 500, gold, "FONT_OLD_10_WHITE.tga", COL_White, 300);//Velen Font 0
                Print_Ext(50, 700, lvl, "FONT_OLD_10_WHITE.tga", COL_White, 300);
                Print_Ext(50, 900, lp, "FONT_OLD_10_WHITE.tga", COL_White, 300);
                Print_Ext(50, 1100, xp, "FONT_OLD_10_WHITE.tga", COL_White, 300);
                print("Velen 0");
            }else if (Font == 1){
                Print_Ext(50, 450, gold, "FONT_OLD_20_WHITE.tga", COL_White, 300);//Velen Font 1
                Print_Ext(50, 700, lvl, "FONT_OLD_20_WHITE.tga", COL_White, 300);
                Print_Ext(50, 950, lp, "FONT_OLD_20_WHITE.tga", COL_White, 300);
                Print_Ext(50, 1200, xp, "FONT_OLD_20_WHITE.tga", COL_White, 300);
                print("Velen 1");
            };
        }else{
            repeat(i, Ninja_GetPatchNum()); var int i;
            if (Hlp_StrCmp(Ninja_GetPatchName(i), PatchName) && Font == 0) {//ShowGameTime Font 0
                Print_Ext(50, 500, gold, "FONT_OLD_10_WHITE.tga", COL_White, 300);
                Print_Ext(50, 700, lvl, "FONT_OLD_10_WHITE.tga", COL_White, 300);
                Print_Ext(50, 900, lp, "FONT_OLD_10_WHITE.tga", COL_White, 300);
                Print_Ext(50, 1100, xp, "FONT_OLD_10_WHITE.tga", COL_White, 300);
                print("SGT 0");
                break;
            }else if (Hlp_StrCmp(Ninja_GetPatchName(i), PatchName) && Font == 1){//ShowGameTime Font 1
                Print_Ext(50, 450, gold, "FONT_OLD_20_WHITE.tga", COL_White, 300);
                Print_Ext(50, 700, lvl, "FONT_OLD_20_WHITE.tga", COL_White, 300);
                Print_Ext(50, 950, lp, "FONT_OLD_20_WHITE.tga", COL_White, 300);
                Print_Ext(50, 1200, xp, "FONT_OLD_20_WHITE.tga", COL_White, 300);
                print("SGT 1");
                break;
            }else if (!Hlp_StrCmp(Ninja_GetPatchName(i), PatchName) && Font == 0){//Keine/Alle anderen Patches Font 0
                Print_Ext(50, 200, gold, "FONT_OLD_10_WHITE.tga", COL_White, 300);
                Print_Ext(50, 400, lvl, "FONT_OLD_10_WHITE.tga", COL_White, 300);
                Print_Ext(50, 600, lp, "FONT_OLD_10_WHITE.tga", COL_White, 300);
                Print_Ext(50, 800, xp, "FONT_OLD_10_WHITE.tga", COL_White, 300);
                print("NO 0");
                break;
            }else if (!Hlp_StrCmp(Ninja_GetPatchName(i), PatchName) && Font == 1) {//Keine/Alle anderen Patches Font 1
                Print_Ext(50, 200, gold, "FONT_OLD_20_WHITE.tga", COL_White, 300);
                Print_Ext(50, 450, lvl, "FONT_OLD_20_WHITE.tga", COL_White, 300);
                Print_Ext(50, 700, lp, "FONT_OLD_20_WHITE.tga", COL_White, 300);
                Print_Ext(50, 950, xp, "FONT_OLD_20_WHITE.tga", COL_White, 300);
                print("NO 1");
                break;
            };
        };
        end;
    Danke und mit Mfg

  2. Beiträge anzeigen #2 Zitieren
    Ehrengarde Avatar von mud-freak
    Registriert seit
    Dec 2005
    Beiträge
    2.199
     
    mud-freak ist offline
    Der Grund warum es nicht funktioniert ist, dass die repeat-Schleife immer nach dem ersten Durchlauf abgebrochen wird, weil break in allen If-Blöcken aufgerufen wird.

    Vereinfacht passiert folgendes:
    Code:
    loop {
        break
    }

    In der Schleife sollte also erst einmal nur ermittelt werden, ob der gefragte Patch aktiv ist. Und erst im Nachhinein solltest du eine entsprechende Print-Ausgabe erstellen.
    Code:
    var int patchActive; patchActive = FALSE;
    
    repeat(i, Ninja_GetPatchNum()); var int i;
        if (Hlp_StrCmp(Ninja_GetPatchName(i), "SHOWGAMETIME")) {
            patchActive = TRUE;
            break;
        };
    end;
    
    if (patchActive) {
        // Print
    };

    Insgesamt lässt sich der Code um einiges verkürzen. Folgendes wäre mein Vorschlag (ungetestet).

    Code:
    // Prüfe welche Schriftgröße ausgewählt ist, in Gothic.ini
    var string fontName; var int height;
    if (STR_ToInt(MEM_GetGothOpt("NINJA_SHOWALWAYSIMPORTANTSTATS", "font")) == 0) {
        fontName = "FONT_OLD_10_WHITE.tga";
        height = 200;
    } else {
        fontName = "FONT_OLD_20_WHITE.tga";
        height = 250;
    }
    
    // Prüfe, ob der Patch "ShowGameTime" oder die Mod "Velen 2.0" aktiv ist
    var int shift; shift = Hlp_StrCmp(STR_Prefix(NINJA_MODNAME, 5), "Velen");
    repeat(i, Ninja_GetPatchNum()); var int i;
        shift += Hlp_StrCmp(Ninja_GetPatchName(i), "SHOWGAMETIME");
    end;
    var int start;
    if (shift == 0) {
        start = 200;
    } else {
        start = 500 - (font * 50);
    };
    
    // Schreibe Statistiken mit ermittelter Schrift und Position
    PrintScreen(gold, 50, start + 0*height, fontName, 300);
    PrintScreen(lvl,  50, start + 1*height, fontName, 300);
    PrintScreen(lp,   50, start + 2*height, fontName, 300);
    PrintScreen(xp,   50, start + 3*height, fontName, 300);

    Dazu noch ein paar andere Anmerkungen:
    • Ich habe hier den Ini-Eintrag "Ninja_ShowAlwaysImportantStats_Font" in "font" geändert, denn dieser Ini-Eintrag befindet sich in in der Sektion NINJA_SHOWALWAYSIMPORTANTSTATS. Der Untereintrag braucht also nicht noch einmal den Namensprefix.
    • Anstatt Print_Ext habe ich hier PrintScreen verwendet. Das ist um einiges performanter, vor allem wenn es häufig aufgerufen wird.
    • Gegen "Velen_2-0" abzugleichen ist ein bisschen ungeschickt, denn jedes mal, falls es eine neue Version von Velen gibt, müsstest du die Abfrage im Patch anpassen. Deshalb habe ich die Abfrage geändert, um die ersten fünf Buchstaben der Mod mit "Velen" zu vergleichen.
    Geändert von mud-freak (06.10.2020 um 11:37 Uhr)

  3. Beiträge anzeigen #3 Zitieren
    Ehrengarde Avatar von neocromicon
    Registriert seit
    Jan 2019
    Beiträge
    2.548
     
    neocromicon ist offline
    Erstmal vielen dank für diese wirklich gute und ausführliche Erklärung!

    Eine frage noch, ist es möglich bei PrintScreen auch einen Farbwert mitzugeben?

  4. Beiträge anzeigen #4 Zitieren
    Ehrengarde Avatar von mud-freak
    Registriert seit
    Dec 2005
    Beiträge
    2.199
     
    mud-freak ist offline
    Zitat Zitat von neocromicon Beitrag anzeigen
    Erstmal vielen dank für diese wirklich gute und ausführliche Erklärung!

    Eine frage noch, ist es möglich bei PrintScreen auch einen Farbwert mitzugeben?
    Nein, da wäre dann Print_Ext besser.

  5. Beiträge anzeigen #5 Zitieren
    Ehrengarde Avatar von neocromicon
    Registriert seit
    Jan 2019
    Beiträge
    2.548
     
    neocromicon ist offline
    Zitat Zitat von mud-freak Beitrag anzeigen
    Nein, da wäre dann Print_Ext besser.
    Alles klar, danke!

    Aber noch eine Thema fremde frage.

    Du hast ja beim Sprint Patch mir einiges an "Hausaufgaben" mitgegeben, diese habe ich alle jetzt auch umgesetzt, ausser die Sache mit den MENU Konstanten, woher beziehst du da die Zahlenwerte?

    Edit: Wäre das z.b eine legitime Lösung?
    Code:
    //------Deutsch------1
    INSTANCE MENUITEM_DE_NINJA_SPRINT_INST(C_MENU_ITEM_DEF)
    {
        text[0]        =    "Rennen Stärke";
        text[1]        =     "Benötigte Stärke um Rennen zu können"; // Kommentar
        // Position und Dimension    
        posx        =    1000;    posy        =    2400 + 550*3;
        dimx        =    4000;    dimy        =    750;
        // Aktionen
        onSelAction[0]    = 0;
        // Weitere Eigenschaften
        flags            = flags | 128;
    };
    
    
    instance MENUITEM_DE_NINJA_SPRINT_CHOICE(C_MENU_ITEM_DEF)
    {
        backPic               = "menu_choice_back.tga";
        type                  = 5;
        text[0]               = "0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31|32|33|34|35|36|37|38|39|40|41|42|43|44|45|46|47|48|49|50|51|52|53|54|55|56|57|58|59|60|61|62|63|64|65|66|67|68|69|70|71|72|73|74|75|76|77|78|79|80|81|82|83|84|85|86|87|88|89|90|91|92|93|94|95|96|97|98|99|100";
        fontName              = "font_old_10_white.tga";
        posx                  = 5000; posy = 2400 + 550*7 + 120;
        dimx                  = 2000; dimy = 350;
        
        onChgSetOption        = "Ninja_Sprint_Strength";
        onChgSetOptionSection = "NINJA_SPRINT";
        
        flags                 = flags & ~4;
        flags                 = flags | 16;
    };
    Edit²: Ich habe jetzt deinen oben geposteten Code, nach ein paar kleineren Änderungen, eingefügt. Leider kommt egal wie ich es anstelle bei PrintScreen keinerlei Ausgabe, mit Print_Ext funktioniert es einwandfrei, woran kann das liegen?
    Geändert von neocromicon (06.10.2020 um 21:07 Uhr)

  6. Beiträge anzeigen #6 Zitieren
    Dea
    Registriert seit
    Jul 2007
    Beiträge
    10.447
     
    Lehona ist offline
    Die Angaben bei PrintScreen sind doch in Prozent, oder? Da die Höhe immer mindestens 200 beträgt, schiebst du die damit aus dem Bildschirm. Da sind die Angaben leider nicht konsistent mit Print_Ext.

  7. Beiträge anzeigen #7 Zitieren
    Ehrengarde Avatar von mud-freak
    Registriert seit
    Dec 2005
    Beiträge
    2.199
     
    mud-freak ist offline
    Das war mein Fehler. Ich habe in dem Code-Beispiel einfach Print_Ext durch PrintScreen ersetzt ohne die Koordinaten zu berücksichtigen.

    Solltest du bei Print_Ext bleiben, sollte alles passen (wie vorher). Die Performance hatte ich nur erwähnt, da mir das mal mit > 30 Prints pro Frame aufgefallen ist. In deine Fall sollte das natürlich kein Problem sein.


    Bzgl. der Menü-Konstanten: Ja, du kannst einfach schauen wo diese Konstanten jeweils definiert sind und direkt deren Inhalt ausschreiben. Das verhindert Parserfehler, falls eine Mod diese Konstanten nicht definiert hat. Damit diese Zahlen für dich (und andere) nachvollziehbar bleiben, kannst du den Namen der Konstante in einem Kommentar daneben erwähnen, z.B.
    Code:
    posx = /*KONSTANTE_X*/ 7;
    oder aber eigene Konstanten definieren (mit eindeutigem Namen um Kollisionen zu vermeiden).

  8. Beiträge anzeigen #8 Zitieren
    Veteran Avatar von N1kX
    Registriert seit
    Aug 2018
    Ort
    Serov
    Beiträge
    643
     
    N1kX ist offline
    Zitat Zitat von neocromicon Beitrag anzeigen
    Erstmal vielen dank für diese wirklich gute und ausführliche Erklärung!

    Eine frage noch, ist es möglich bei PrintScreen auch einen Farbwert mitzugeben?
    You can make the font itself a different color and use it, then the PrintScreen function will output it in a different color.
    Here is an example:
    Code:
    var int Ninja_Log;const int Ninja_YPOS_MESSAGE = 53;
    
    
    const string Ninja_FONT_ORANGE = "NINJA_FONT_ORANGE.TGA";
    const string Ninja_FONT_RED = "NINJA_FONT_RED.TGA";
    
    
    func void Ninja_LogUpTime()
    {
    	if(Ninja_Log == 1)
    	{
    		Ninja_Log += 1;
    		Ninja_YPOS_MESSAGE -= 2;
    	}
    	else if(Ninja_Log == 2)
    	{
    		Ninja_Log += 1;
    		Ninja_YPOS_MESSAGE -= 2;
    	}
    	else if(Ninja_Log == 3)
    	{
    		Ninja_Log += 1;
    		Ninja_YPOS_MESSAGE -= 2;
    	}
    	else if(Ninja_Log == 4)
    	{
    		Ninja_Log += 1;
    		Ninja_YPOS_MESSAGE -= 2;
    	}
    	else
    	{
    		Ninja_Log = 1;
    		Ninja_YPOS_MESSAGE = 53;
    	};
    };
    
    
    func void Ninja_ShowTextDamage_Hero(var int Ninja_DamageOcNPC)
    {
    	PrintScreen(ConcatStrings("Ваш урон (Hero dmg): ", IntToString(Ninja_DamageOcNPC)),1,Ninja_YPOS_MESSAGE,Ninja_FONT_ORANGE,1);
    	Ninja_LogUpTime();
    };
    
    
    func void Ninja_ShowTextDamage_Enemy(var int Ninja_DamageOcNPC)
    {
    	PrintScreen(ConcatStrings("Урон по вам (Dmg by Hero): ", IntToString(Ninja_DamageOcNPC)),1,Ninja_YPOS_MESSAGE,Ninja_FONT_RED,1);
    	Ninja_LogUpTime();
    };

    https://imgur.com/UdVNWyJ

  9. Beiträge anzeigen #9 Zitieren
    Ehrengarde Avatar von mud-freak
    Registriert seit
    Dec 2005
    Beiträge
    2.199
     
    mud-freak ist offline
    Zitat Zitat von N1kX Beitrag anzeigen
    You can make the font itself a different color and use it, then the PrintScreen function will output it in a different color.
    That is actually a very bad idea, because the mod might use a different font and the colored font would not fit in well (especially when the mod is using things like high resolution/enlarged fonts). Furthermore, the patch will no longer be language independent and it will be a lot more complicated to do so. Aside from that, it is much more work to create fonts for all colors needed, than simply changing one line of code. Using Print_Ext to achieve colored text is better in all ways I can think of.


    On a side note, in your example, the naming convention is not followed. Attaching Ninja_ to each global symbol is not sufficient. The patch name itself is needed as well to make the names truly unique and prevent compatibility issues with other patches.
    • Ninja_PatchName_Log
    • Ninja_PatchName_YPOS_MESSAGE
    • Ninja_PatchName_FONT_ORANGE
    • Ninja_PatchName_FONT_RED
    • Ninja_PatchName_LogUpTime

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
Impressum | Link Us | intern
World of Gothic © by World of Gothic Team
Gothic, Gothic 2 & Gothic 3 are © by Piranha Bytes & Egmont Interactive & JoWooD Productions AG, all rights reserved worldwide