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

 

Seite 15 von 21 « Erste ... 48111213141516171819 ... Letzte »
Ergebnis 281 bis 300 von 410
  1. Beiträge anzeigen #281
    Dea
    Registriert seit
    Jul 2007
    Beiträge
    10.447
     
    Lehona ist offline
    Zitat Zitat von redleha Beitrag anzeigen
    Edit:
    Right so:

    Code:
    var int param; param = MEM_ReadInt(ESP-4);
    This shouldn't be working if you hook right at the beginning of the function. If it does that just means they've been left on the stack but aren't purposefully there (yet).
    Anyways, my code didn't work because I didn't see that those are __fastcalls. The way __fastcall works is that I think up to two parameters can be passed via registers (EDX and I assume EAX but I don't know for sure right now. Look it up if you need it). In both cases the parameter is passed in EDX, so you can just use EDX for whatever you need, although as long as ESP-4 works for you that's fine, too.
    Zitat Zitat von redleha Beitrag anzeigen
    Thanks, Lehona.
    And could you somehow a way to explain the mechanism of passing parameters to a function and retrieve them?
    Or is it not so easy to explain?
    Maybe if you brought a couple of examples, and work with these ESP, EAX, ECX...
    Sure can. As explained above, _fastcall passes two of its parameters via registers, but __fastcall isn't really a common calling convention (more common are __stdcall/__thiscall and _cdecl).
    Usually parameters are passed using the Stack. In your memory (RAM) you have the Heap and the Stack. The Heap is where you get your allocated memory from, e.g. when you're using MEM_Alloc(int), it's not really sorted so there can be unallocated blocks inbetween etc. It starts at 0 and "grows" towards bigger addresses.
    The Stack is sorted, more or less. It starts at FFFFFFFFh (or whatever is the biggest address in your system) and "grows" towards smaller addresses. That means if the current top of the Stack is at 680B34h and I push an integer onto the stack, the integer will be at 680B30h. Because there is no such thing as allocated memory in the Stack, you have to somehow remember where the top of the Stack is, which is done by the ESP register. All the ESP does is pointing at the top of the Stack. So when the caller pushes a parameter onto the Stack, the ESP will be incremented by 4 (usually, I guess you can push QWORDs and BYTEs etc. as well). When the callee now wants to retrieve the parameter he can either pop it from the Stack, or just access it via [ESP+4] (last parameter pushed) or [ESP+8] (second to last parameter pushed). If the function itself has used the Stack already (local variables are using the Stack), another value has to be added to accommodate for that fact, e.g. [ESP+20h+8]. You can have IDA display the current Stack displacement via Options->General->Disassembly->[x]Stack Pointer.

    Also to be noted: If you call a __cdecl functions and pass parameters on the Stack, you'll have to clean the Stack by yourself. __stdcall functions clean the Stack (ie pop the parameters from the Stack) themselves.

    I started rambling somewhere in there because I can't seem to easily explain it without explaining Stack/Heap etc., if you have more questions just go ahead, I will try to be more precise

  2. Beiträge anzeigen #282
    Abenteurer Avatar von redleha
    Registriert seit
    Dec 2010
    Ort
    Новокуйбышевск, Россия
    Beiträge
    68
     
    redleha ist offline
    Could you help me with a solution of one problem?
    I can not understand how to manage a dialog window as the object of zCView.
    That is, movement, resizing, etc.

    I thought to control the pointer - (MEM_InformationMan.dlgChoice //zCViewDialogChoice*) as a pointer to an object of type zCView.
    zCView::SetPos(int,int), zCView::SetSize(int,int) - leads to a crash.
    Geändert von redleha (03.07.2013 um 15:08 Uhr)

  3. Beiträge anzeigen #283
    Dea
    Registriert seit
    Jul 2007
    Beiträge
    10.447
     
    Lehona ist offline
    Do the View-functions from LeGo work? With
    Code:
    int wrap(int inst, int ptr)
    you can have your pointer wrapped into a handle to be used with most of the LeGo-functions.

    Also I'm not quite sure zCViewDialog is a zCView, because it goes like this (unless I'm mistaken, not 100% sure):

    zCViewDialogChoice -> zCViewDialog -> zCViewPrint -> zCViewFX -> zCViewDraw -> zCViewObject -> zCViewBase with zCViewBase being the most basic one, while zCView directly inherits from zCViewBase and no further.


    What exactly are you trying to do? Seems like someone will have to try understand the machine code to figure out how to perform basic operations on these objects (ie at least figure out what offsets the most important attributes have).

  4. Beiträge anzeigen #284
    Moderator Avatar von ukur
    Registriert seit
    Jan 2009
    Ort
    Ukraine
    Beiträge
    281
     
    ukur ist offline
    Lehona
    Recently I wrote that after the update to revision 61 LeGo stopped working buttons.
    http://forum.worldofplayers.de/forum...1#post21142962

    The solution found by accident trying different options
    If make this LeGo_Init (LeGo_All); - Buttons work in 61 revision, but i dont need initialize all.

    With this string Buttons in 61 revision NOT work, but work in older revisions!
    LeGo_Init(LeGo_Focusnames | LeGo_Cursor | LeGo_Bars | LeGo_Buttons | LeGo_Hotkey); what flag i need add to use Buttons without LeGo_All?
    Geändert von ukur (11.07.2013 um 22:48 Uhr)

  5. Beiträge anzeigen #285
    Dea
    Registriert seit
    Jul 2007
    Beiträge
    10.447
     
    Lehona ist offline
    That helps a lot, thank you. I've been able to identify a few problems, but since I'm gonna go on vacation in less than 7 hours I probably won't be able to fix them (To be honest I won't even attempt it ). When I get back, which is in about 23 days, I'll track them down fore sure!

  6. Beiträge anzeigen #286
    Kämpfer Avatar von mobpapst
    Registriert seit
    Jun 2005
    Beiträge
    364
     
    mobpapst ist offline
    Hallo, ich wollte jetzt gerade kurz die Trialogfunktion testen, bekomme aber diverse Fehlermeldungen. Ich hab es erst mit der aktuellsten Version probiert, dann noch mal mit der vorletzten Version. Die Fehler, bleiben aber immer die Selben:

    1.Hier das Dialogscript: (Ist von eurer Seite, habe es nur für 2 Npc's angepasst)

    Code:
    instance TRIA_Test (C_INFO)
    {
    npc = MIL_608_TORWACHE;
    nr = 10;
    condition = TRIA_Test_condition;
    information = TRIA_Test_info;
    important = FALSE;
    permanent = 1;
    description = "TRIALOGTEST";
    };
    
    func int TRIA_Test_condition()
    {
    return TRUE;
    };
    
    func void TRIA_Test_info()
    {
    var c_npc Torwache1; Torwache1 = Hlp_GetNpc(MIL_608_TORWACHE); // Ihm gehört der Dialog
    var c_npc Torwache2; Torwache2 = Hlp_GetNpc(MIL_609_TORWACHE);
    
    TRIA_Invite(Torwache2); // Lade Torwache2 in diesen Dialog ein
    TRIA_Start(); // Starte das Gespräch
    // Der Held und Torwache1 müssen/dürfen nicht eingeladen werden. Sie sind sowieso im Dialog.
    
    // Held redet nun mit Torwache1 (self = Torwache1, other = Hero)
    TRIA_Next(Torwache1);
    
    DIAG_Reset();
    
    AI_Output (self, other, "TRIA_TEST_00"); //Tut mir leid Held, aber hier darfst du nicht passieren
    
    // Held redet nun mit Torwache2 (self = Torwache2, other = Hero)
    TRIA_Next(Torwache2);
    
    AI_Output (other, self, "TRIA_TEST_01"); //Warum nicht?
    
    AI_GotoNpc(self, other);
    AI_TurnToNpc(other, self);
    
    AI_Output (self, other, "TRIA_TEST_02"); //Die Stadt wurde verriegelt
    
    // Held soll sich während des nächsten Satzes verschwörerisch umsehen
    DIAG("Nervous", 1, 2);
    
    AI_Output (other, self, "TRIA_TEST_03"); //Ich habe ein wenig Gold dabei, kommen wir damit ins Geschäft?
    
    // Held soll sich jetzt wieder normal bewegen
    DIAG_Reset();
    
    // Starte Kamerafahrt
    TRIA_Cam("CAMERASTART");
    
    // Held redet nun mit Squelto (self = Squelto, other = Hero)
    TRIA_Next(Torwache1);
    
    AI_TurnToNpc(other, self);
    
    DIAG("No", 0, 1);
    AI_Output (self, other, "TRIA_TEST_04"); //Nein. Wir sind nicht bestechlich.
    
    // Held redet nun wieder mit Torwache1 (self = Torwache1, other = Hero)
    TRIA_Next(Torwache2);
    
    // Held soll sich jetzt fragend Artikulieren
    DIAG("NotSure", 0, 1);
    
    AI_Output (other, self, "TRIA_TEST_05"); //Sicher?
    
    AI_TurnToNpc(other, self);
    
    // Kamerafahrt Ende
    TRIA_Cam("");
    
    // Torwache1 soll zornig reagieren
    DIAG("Angry", 0, 4);
    
    AI_Output (self, other, "TRIA_TEST_06"); //Ich muss dich nun bitten zu gehen
    
    // Held soll sich jetzt wieder normal bewegen
    DIAG_Reset();
    
    AI_Output (other, self, "TRIA_TEST_07"); //Nun gut...
    
    TRIA_Finish(); // und Ende
    };
    Wenn ich ins Spiel gehe (Scripte sind geparsed und Outputs aktualisiert) und den Dialog mit dem Npc starten will, kommt direkt folgender Fehler:

    Code:
    X: Ref-Counter!=0 after vertexbuffer release
    Danach kommen direkt diese Fehlermeldungen:

    Code:
    1.
    
    X: XD3D_InitPerDX: Can't initialize with 32 bit depth buffer, trying 24 bit
    
    2.
    
    X: XD3D_InitPerDX: Can't initialize with 24 bit depth buffer, trying default ...
    Zwischendurch startet dann der Trialog, es werden einige Sätze gesprochen und die Npc's gehen auch auf den Helden zu. Dann kommt aber

    Code:
    Q: DIAG_SetAni; Length of AniName has to be betweeen 0 and 16
    Am Ende wird dann noch die Kamerafahrt ausgeführt und der Held ist stuck im Dialog.

    Mfg

    mobpapst

  7. Homepage besuchen Beiträge anzeigen #287
    Clockwork Origins Avatar von Bonne6
    Registriert seit
    Jun 2004
    Ort
    Erlangen
    Beiträge
    11.826
     
    Bonne6 ist offline
    Hab grad ein Problem mit den Trialogen gefunden: Während des Gespräch sollen die Charaktere ihre Waffen ziehen. Zuerst zieht Attila sein Schwert, beim Charakterwechsel hat dann der Möchtegern das Schwert in der Hand und lässt es bei Ziehen der eigenen Waffe fallen ... außerdem hat der Möchtegern nach dem Gespräch ziemlich absurde Rüstungswerte ... hab's nicht nachgerechnet, könnte aber die Differenz zwischen Attila und Möchtegern sein, sind auf jeden Fall negative Rüstungswerte.

    Hier der Dialog, der das Problem verursacht:

    Code:
    FUNC VOID Info_Mod_Attila_Moechtegern_Info()
    {
    	var c_npc Attila; Attila = Hlp_GetNpc(Mod_760_NONE_Attila_NW);
    	var c_npc Moechtegern; Moechtegern = Hlp_GetNpc(Mod_7702_OUT_Moechtegern_NW);
    
    	TRIA_Invite(Moechtegern);
    	TRIA_Start();
    
    	TRIA_Next(Attila);
    
    	AI_GotoNpc	(Attila, Moechtegern);
    
    	AI_TurnToNpc	(Attila, Moechtegern);
    	AI_TurnToNpc	(Moechtegern, Attila);
    
    	AI_Output(self, hero, "Info_Mod_Attila_Moechtegern_09_00"); //Ohh, Sohn des grünen Dunstes ... woher stammt das viele Kraut?
    	AI_Output(self, hero, "Info_Mod_Attila_Moechtegern_09_01"); //Du scheinst mir eigentlich nicht mit dem nötigen Reichtum gesegnet, es auf "ehrlichem" Wege zu erstehen.
    
    	TRIA_Next(Moechtegern);
    
    	AI_Output(self, hero, "Info_Mod_Attila_Moechtegern_04_02"); //Was zum Teufel laberst du da? Mein Kraut geht dich einen Scheiß an.
    	AI_Output(self, hero, "Info_Mod_Attila_Moechtegern_04_03"); //Mach also, dass du wegkommst, bevor ich meinen Schuh dort versenke, wo keine Sonne scheint.
    
    	TRIA_Next(Attila);
    
    	AI_Output(self, hero, "Info_Mod_Attila_Moechtegern_09_04"); //In dem Fall darf ich zu erkennen geben, dass ich gekommen bin das Sumpfkraut und deinen Kopf zu holen.
    
    	AI_ReadyMeleeWeapon	(self);
    
    	TRIA_Next(Moechtegern);
    
    	AI_Output(self, hero, "Info_Mod_Attila_Moechtegern_04_05"); //Besser du kriechst wieder unter deinen Stein oder du wirst mit deinem Freund den nächsten Tag nicht mehr erleben.
    
    	AI_ReadyMeleeWeapon	(self);
    
    	Moechtegern.guild = GIL_STRF;
    	Npc_SetTrueGuild	(Moechtegern, GIL_STRF);
    
    	TRIA_Next(Attila);
    
    	AI_Output(self, hero, "Info_Mod_Attila_Moechtegern_09_06"); //Richte der ewigen Finsternis meinen Gruß aus. Beliar erwartet dich.
    
    	TRIA_Finish();
    
    	AI_StopProcessInfos	(self);
    };

  8. Beiträge anzeigen #288
    Dea
    Registriert seit
    Jul 2007
    Beiträge
    10.447
     
    Lehona ist offline
    Zitat Zitat von ukur Beitrag anzeigen
    Lehona
    Recently I wrote that after the update to revision 61 LeGo stopped working buttons.
    http://forum.worldofplayers.de/forum...1#post21142962

    The solution found by accident trying different options
    If make this LeGo_Init (LeGo_All); - Buttons work in 61 revision, but i dont need initialize all.

    With this string Buttons in 61 revision NOT work, but work in older revisions!
    LeGo_Init(LeGo_Focusnames | LeGo_Cursor | LeGo_Bars | LeGo_Buttons | LeGo_Hotkey); what flag i need add to use Buttons without LeGo_All?
    I have uploaded a new version to the SVN that seems to be working. Pull the new files and tell me whether everything's working fine
    It (hopefully) won't be long till I can finally release 2.3, at least in working hours. On a more global timescale there might be a few more weeks so I can ensure I haven't mysteriously killed something

  9. Beiträge anzeigen #289
    Deus Avatar von Oparilames
    Registriert seit
    May 2004
    Ort
    ex contrariis
    Beiträge
    11.015
     
    Oparilames ist offline

    Tagebuchtitel verkürzen

    Hallo Forum.


    Ich möchte euch hier einen Code präsentieren, der nicht ganz ausgetüfftelt ist
    und der nicht das tut was er soll, aber im Prinzip schon funktioniert.
    Er soll Zeilenumbrüche bei zu langen Tagebuchtiteln garantieren.
    Ja, steinigt mich, dass ist kein gloreiches Gameplay-Feature, aber meiner
    Meinung nach ist es nützlicher, als seine Tagebuchtitel zu kastrieren
    (oder seinen Bezeichner-Findungsalgorithmus im Gehirn zu patchen)

    Code:
    //######################################################
    //
    //  Tagebucheintragsmanipulation
    //      Autor      : Oparilames
    //      Co-Autor   : Lehona, WoG-Editing
    //      ToDo       : – Nur für neue Tagebuchtopics aufrufen
    //                   – String-Teilung wirksam machen
    //                     (Über Inner-Windows etc.)
    //                     Und somit den SubStr-Bug zu begeben.
    //                     Zur Fehlerbeschreibung:
    //                     Tagebuch öffnen/schließen bis Meldung
    //                   – Mit Token und Lexer arbeiten um
    //                     sinnvollere Zeilenumbrüche zu
    //                     garantieren 
    //
    //######################################################
    
    //========================================
    // Hilfsfunktionen und -variablen
    // aus der WoG
    //========================================
    // Integerwerte von Chars in Strings umwandeln
    // Von Gottfried
    // http://forum.worldofplayers.de/forum/threads/790720-Scriptpaket-Zugriff-auf-ZenGine-Objekte?p=13390891&viewfull=1#post13390891
    //========================================
    
    // Hier werden alle wichtigen Chars abgespeichert
    var string CHRTBL[256]; // ursprünglich 256
    
    // Und hier werden die Werte gesetzt
    // Diese Funktion muss vor dem Gebrauch der
    // Hilfsfunktionen einmal aufgerufen werden
    // (es sind nicht alle 256 Chars drin.. Nur die wichtigsten ;)
    func void CHRTBL_S() {
        CHRTBL[  9] = "  ";   CHRTBL[ 32] = " ";    CHRTBL[ 33] = "!";    CHRTBL[ 34] = "'"; // auch \"?
        CHRTBL[ 35] = "#";    CHRTBL[ 36] = "$";    CHRTBL[ 37] = "%";    CHRTBL[ 38] = "&";
        CHRTBL[ 39] = "'";    CHRTBL[ 40] = "(";    CHRTBL[ 41] = ")";    CHRTBL[ 42] = "*";
        CHRTBL[ 43] = "+";    CHRTBL[ 44] = "´";    CHRTBL[ 45] = "-";    CHRTBL[ 46] = ".";
        CHRTBL[ 47] = "/";    CHRTBL[ 48] = "0";    CHRTBL[ 49] = "1";    CHRTBL[ 50] = "2";
        CHRTBL[ 51] = "3";    CHRTBL[ 52] = "4";    CHRTBL[ 53] = "5";    CHRTBL[ 54] = "6";
        CHRTBL[ 55] = "7";    CHRTBL[ 56] = "8";    CHRTBL[ 57] = "9";    CHRTBL[ 58] = ":";
        CHRTBL[ 59] = ";";    CHRTBL[ 60] = "<";    CHRTBL[ 61] = "=";    CHRTBL[ 62] = ">";
        CHRTBL[ 63] = "?";    CHRTBL[ 64] = "@";    CHRTBL[ 65] = "A";    CHRTBL[ 66] = "B";
        CHRTBL[ 67] = "C";    CHRTBL[ 68] = "D";    CHRTBL[ 69] = "E";    CHRTBL[ 70] = "F";
        CHRTBL[ 71] = "G";    CHRTBL[ 72] = "H";    CHRTBL[ 73] = "I";    CHRTBL[ 74] = "J";
        CHRTBL[ 75] = "K";    CHRTBL[ 76] = "L";    CHRTBL[ 77] = "M";    CHRTBL[ 78] = "N";
        CHRTBL[ 79] = "O";    CHRTBL[ 80] = "P";    CHRTBL[ 81] = "Q";    CHRTBL[ 82] = "R";
        CHRTBL[ 83] = "S";    CHRTBL[ 84] = "T";    CHRTBL[ 85] = "U";    CHRTBL[ 86] = "V";
        CHRTBL[ 87] = "W";    CHRTBL[ 88] = "X";    CHRTBL[ 89] = "Y";    CHRTBL[ 90] = "Z";
        CHRTBL[ 91] = "[";    CHRTBL[ 92] = "\\";    CHRTBL[ 93] = "]";    CHRTBL[ 94] = "^";
        CHRTBL[ 95] = "_";    CHRTBL[ 96] = "`";    CHRTBL[ 97] = "a";    CHRTBL[ 98] = "b";
        CHRTBL[ 99] = "c";    CHRTBL[100] = "d";    CHRTBL[101] = "e";    CHRTBL[102] = "f";
        CHRTBL[103] = "g";    CHRTBL[104] = "h";    CHRTBL[105] = "i";    CHRTBL[106] = "j";
        CHRTBL[107] = "k";    CHRTBL[108] = "l";    CHRTBL[109] = "m";    CHRTBL[110] = "n";
        CHRTBL[111] = "o";    CHRTBL[112] = "p";    CHRTBL[113] = "q";    CHRTBL[114] = "r";
        CHRTBL[115] = "s";    CHRTBL[116] = "t";    CHRTBL[117] = "u";    CHRTBL[118] = "v";
        CHRTBL[119] = "w";    CHRTBL[120] = "x";    CHRTBL[121] = "y";    CHRTBL[122] = "z";
        CHRTBL[123] = "{";    CHRTBL[124] = "|";    CHRTBL[125] = "}";    CHRTBL[126] = "~";
        CHRTBL[128] = "Ç";    CHRTBL[129] = "ü";    CHRTBL[130] = "é";    CHRTBL[131] = "â";
        CHRTBL[132] = "ä";    CHRTBL[133] = "à";    CHRTBL[134] = "å";    CHRTBL[135] = "ç";
        CHRTBL[136] = "ê";    CHRTBL[137] = "ë";    CHRTBL[138] = "è";    CHRTBL[139] = "ï";
        CHRTBL[140] = "î";    CHRTBL[141] = "ì";    CHRTBL[142] = "Ä";    CHRTBL[143] = "Å";
        CHRTBL[144] = "É";    CHRTBL[145] = "æ";    CHRTBL[146] = "Æ";    CHRTBL[147] = "ô";
        CHRTBL[148] = "ö";    CHRTBL[149] = "ò";    CHRTBL[150] = "û";    CHRTBL[151] = "ù";
        CHRTBL[152] = "_";    CHRTBL[153] = "Ö";    CHRTBL[154] = "Ü";    CHRTBL[156] = "£";
        CHRTBL[157] = "¥";    CHRTBL[158] = "_";    CHRTBL[160] = "á";    CHRTBL[161] = "í";
        CHRTBL[162] = "ó";    CHRTBL[163] = "ú";    CHRTBL[164] = "ñ";    CHRTBL[165] = "Ñ";
        CHRTBL[166] = "ª";    CHRTBL[167] = "°";    CHRTBL[168] = "¿";    CHRTBL[225] = "ß";
        CHRTBL[255] = ""; // das "
        
    };
    
    // Hilfsfunktion 1:
    // Wandelt einen Int-Char in einen String-Char 
    // um und gibt diesen zurück
    func string PushCharTable() { return CHRTBL; };
    func string IntToChar(var int chr) {
        chr = chr&255;
        CHRTBL_S(); 
        PushCharTable();
        MEMINT_StackPopInst();
        MEMINT_StackPushInst(zPAR_TOK_PUSHINT);
        var int adr; adr = MEMINT_StackPopInt();
        adr += 20*chr;
        return MEM_ReadString(adr);
    };
    
    // Hilfsfunktion 2:
    // Wandelt einen Int-Char in ein Int
    // und gibt dieses zurück
    func int CharToDec(var int chr) {
        if(chr > 47&&chr < 58) {
            return chr - 48;
        };
        return -1;
    };
    
    //========================================
    // Konstanten und Variablen
    //========================================
    instance logMenu (zCMenu);
    instance logSubMenu (zCMenuItem);
    instance oCLogManager@ (oCLogManager);
    const int oCLogManager_Ptr = 11191608; // Speicheradresse des LogManagerobjekt der Engine: 0xAAC538
    const int hnldLogManager   = 0;        // Handle auf LogManagerobjekt der Engine
    const int bLogmenudetected = 0;        // um zu verhindern, dass der Block in der 
                                           // Startup zweimal aufgerufen wird.
    
    
    //========================================
    // GetParserCost
    // --------------
    // Funktion um Werte von Variablen und 
    // Konstanten außerhalb der Content-Scripte
    // zurückzuliefern.
    //========================================
    /*
    func int GetParserCost(var string varName)
    {
        var int symPtr;
        symPtr = MEM_GetParserSymbol (varName);
        
        if (symPtr) { //!= 0 
            var zCPar_Symbol sym;
            sym = MEM_PtrToInst (symPtr);
            
            if ((sym.bitfield & zCPar_Symbol_bitfield_type)
                                          == zPAR_TYPE_INT) {
                return sym.content;
            };
        };
        return 0;
    };
    */
    
    //========================================
    // StringCutter
    // --------------
    // Überschreibt zu lange Strings.
    // Derzeit noch ohne Tokenizer-/
    // Lexer-Einsatz um vernünftig zu trennen.
    //========================================
    func void StringCutter(var int s, var int maxlen, var string fntname)
    {
        var oCLogTopic tpc;     // Der aktuell behandelte Tagebucheintrag
        tpc = _^(s);
        var string str;
        str = tpc.m_strDescription;
        if(Print_GetStringWidth(str,fntName)<maxlen)
        {
            return;
        };
        MEM_SendToSpy(zERR_TYPE_WARN,ConcatStrings("StringCutter: ",str));
        var int i;  var int iMax;
        i = 0;
        iMax = STR_Len(str);
    
        var int LenPix[2]; // 0 = Länge des aktuellen Zeichens; 1 = Länge des bisherigen Strings;
        var int PosLSpace; // Position des letzten Leerzeichens
        var int charB4;    // vorheriges Zeichen
        var int char;      // aktuelles Zeichen
        var string tmp;    // temporärer String
        var string rewrite; // überschreibungsstring
        var int PosLCutchar; // Position des letzten Trennzeichens
        var int rewriteneeded; // Wenn es unnötig ist, dass überschrieben wird.
        rewriteneeded=0;
        
        while(i<iMax);
            char = STR_GetCharAt(str,i);                     // Aktuelles Zeichen -> int
            tmp  = MEM_ReadStatStringArr(CHRTBL,char);      // Aktuelles Zeichen -> string
            LenPix[0] = Print_GetStringWidth(tmp,fntName);
            LenPix[1] = LenPix[1]+LenPix[0];
            
            if(rewriteneeded==1)
            {
                rewrite=ConcatStrings(rewrite,tmp);
            };
            
            if(LenPix[1]>=maxlen)
            {
                rewriteneeded=1;
                if(PosLSpace>0)
                {
                    tmp=STR_SubStr(str,0,PosLSpace);
                    tmp=ConcatStrings(tmp,"\0");
                    rewrite = STR_SubStr(str,PosLSpace+1,i-(PosLSpace));
                    tmp=ConcatStrings(tmp,rewrite);
                    LenPix[1]=Print_GetStringWidth(rewrite,fntName);
                    rewrite=tmp;
                }else
                {
                    if(PosLCutchar>0)
                    {
                        tmp=STR_SubStr(str,0,PosLCutchar);
                        tmp=ConcatStrings(tmp,"\0");
                        rewrite = STR_SubStr(str,PosLCutchar+1,i-(PosLCutchar));
                        tmp=ConcatStrings(tmp,rewrite);
                        LenPix[1]=Print_GetStringWidth(rewrite,fntName);
                        rewrite=tmp;
                    }else
                    {
                        char = i/2;
                        tmp=STR_SubStr(str,0,char);
                        tmp=ConcatStrings(tmp,"\0");
                        rewrite=STR_SubStr(str,char+1,i-(char));
                        tmp=ConcatStrings(tmp,rewrite);
                        LenPix[1]=Print_GetStringWidth(rewrite,fntName);
                        rewrite=tmp;
                    };
                };
            };
            
            if(char<=32) // Leerzeichen
            {
                PosLSpace=i;
            };
            if(char==charB4)
            {
                PosLCutchar=i;
            };
            charB4 = char;
            i+=1;
        end;
        if(rewriteneeded==1)
        {
            MEM_SendToSpy(zERR_TYPE_WARN,tpc.m_strDescription);
            MEM_SendToSpy(zERR_TYPE_WARN,"+Korrektur->");
            tpc.m_strDescription=rewrite;
            MEM_SendToSpy(zERR_TYPE_WARN,tpc.m_strDescription);
        };
        return;
    };
    
    //========================================
    // LogEntryCutter
    // --------------
    // Funktion um Tagebuchtopicnamen zu
    // kürzen, falls sie über den anzeigbaren
    // Bereich hinausragen würden.
    //========================================
    func void LogEntryCutter()
    {
        var int s;              // Stringmanager
        var int i;              // Schleifenzähler
        var int j;
        var int iMax;           // Schleifenzählermaximalwerte
        var int jMax;
        var int strAdrArr;      /* Array mit Adressen der zu überschreibenden Strings
                                   Zu Beginn dieses Vorhabens habe ich noch gedacht,
                                   Gothic würde die Tagebucheintrags-Strings
                                   ständig kopieren, an tausend Unterklassen Übergeben,
                                   und all solche Späße treiben, daher wollte ich dieses
                                   Array nutzen, um alle zu überschreibenden String-Adressen
                                   zu speichern. Vor Kurzem fand ich heraus, dass sich
                                   die Titel der Tagebücher einfach überschreiben lassen.
                                   Leider wird dann kein Zeilenumbruch schreibbar. Wir
                                   müssen also doch auf die views und Unterklassen zugreifen.
                                   Seufz.
                                   */
        var string fntName;     // Name verwendeter Schriftart für Menüeinträge
                                // Hier vereinfache ich, indem ich als x-beliebige
                                // Font, die der oCLogTopic-Klasse nehme.
        var int logMenuPtr;     // Pointer auf zCMenu- und zCMenuItem-Objekte
        var zCList TopicList;   // Liste mit Topics
        var int pos[3];         // Speichert diverse Positions und Größenwerte
        var string txt; // temporärer Stringspeicher
        TopicList = get(hnldLogManager);
        // Listenkopf ignorieren
        TopicList = _^(TopicList.next);
        
        // Wir setzen logMenu auf das Menü mit dem Instancenamen "MENU_LOG"
        // Und erzeugen unser Array, da wir es gleich brauchen.
        logMenuPtr = MEM_GetMenuByString ("MENU_LOG");
        if(!logMenuPtr){
            MEM_SendToSpy(zERR_TYPE_WARN,"Log-Menü nicht gefunden!");return;
        };
        logMenu = _^(logMenuPtr);
        /* theoretische Verwedung von strAdr:
            strAdrArr = MEM_ArrayCreate();
            MEM_ArrayInsert(strAdrArr, adr); // Die Adresse zu diesem String speichern.
            
            // Hier brachliegende Ideen, wie's weiter gehen könnte:
            //// zCView die geprüft werden müssen
            //
            ////-||- zCView*     .
            //zCMenu.m_pViewInfo. //zCView*
            //
            ////-||-zCViewWindow
            //zCMenu.m_pWindow.
            //
            ////-||-zCViewWindow
            //zCMenu.m_pInnerWindow
            //
            ////-||- zCMenuItem*
            //zCMenu.m_listItems.
        //
        */
        
        
        
        // Wir speichern uns den Namen der verwendeten Schriftart ab.
        // Dann iterieren wir durch alle zCMenuItem-Elemente des Menüs
        // und durch deren m_parTexte und lassen uns diese ausgeben.
        // Da keine verschachtelten while-Schleifen möglich sind
        // müssen wir selbst etwas Hand anlegen.
        logMenuPtr = MEM_GetMenuItemByString (MEM_ReadStatStringArr (LogMenu.itemID,0));
        MEM_AssignInst (logSubMenu,logMenuPtr);
        fntName=logSubMenu.m_parFontName;
        if(Hlp_StrCmp(fntName,"")){return;};
        fntName=logSubMenu.m_parFontName;
        MEM_SendToSpy(zERR_TYPE_WARN,Concatstrings("Schriftart: ",fntName));
        
        
        
        
        
        
        // Im InnerWindow vermute ich die pixelgenauen
        // Angaben unserer Tagebuch-Auftragsnamensliste
        // und somit wichtige Werte um die maximale
        // Textlänge zu ermitteln.
        var zCView V;
        V = _^(logMenu.m_pInnerWindow);
        pos[0] = V.pposx;       // [0] Beginn der Zeile
        pos[1] = V.psizex;      // [1] zu addierende Länge bis zum Rand
                                // [2] Tagebucheintragstitellänge in Pixel
        if(pos[0]>=pos[1])
        {
            pos[2] = pos[0]-pos[1];
        }else{
            pos[2] = pos[1]-pos[0];
        };
        
        while(TopicList.next);
            StringCutter(TopicList.data,pos[2],fntName);
            TopicList = _^(TopicList.next);
        end;
    };
    
    //========================================
    // Konstanten und Variablen für Beispiel-
    // demonstration
    //========================================
    const string TOPIC_CutExampleA = "Gothic";
    const string TOPIC_CutExampleB = "Modding";
    const string TOPIC_CutExampleC = "LeGo";
    const string TOPIC_CutExampleD = "Ein langer Tagebuchtitel ohne praktischen Nutzen";
    
    const string LOGENTRY_CutExampleA = "Ist eine wunderbare Spielreihe. Meiner Meinung nach endet die lobbare Reihe irgendwo zwischen 'Die Nacht des Raben' und 'Gothic 3'.";
    const string LOGENTRY_CutExampleB = "Eine Vorstufe des Informatikerwerdegangs beidem man den Umgang mit einer Scriptsprache, 3D-Programmen und 2D-Programmen lernt.";
    const string LOGENTRY_CutExampleC = "Hat die Verlockung des Verbotenen. Man verändert Dinge, von denen man weiß, dass es so nicht von den Künsterln/Entwicklern geplant war. Aber es bietet einem die Möglichkeiten, das Spiel in ungeahntem Ausmaß den eigenen Vorstellungen anzugleichen.";
    const string LOGENTRY_CutExampleD = "Außer zu demonstrieren, dass der Tagebuchtitel jetzt umgebrochen wird.";
    
    //========================================
    // LogEntryCTest
    // --------------
    // Funktion um die Funktion LogEntryCutter
    // zu Spielstart zu testen.
    // Am besten in der Startup hooken?
    // HookEngine(oCNpc__OpenScreen_Log, 7 ,"LogEntryCTest");
    //========================================
    func void LogEntryCTest()
    {
       if(bLogmenudetected==0)
       {
        var int s; // Stringmanager
        var zCList TopicList;
    
        Log_CreateTopic (TOPIC_CutExampleA, LOG_MISSION);
        Log_SetTopicStatus(TOPIC_CutExampleA, LOG_RUNNING);
        B_LogEntry (TOPIC_CutExampleA,LOGENTRY_CutExampleA); 
            
        Log_CreateTopic (TOPIC_CutExampleB, LOG_MISSION);
        Log_SetTopicStatus(TOPIC_CutExampleB, LOG_RUNNING);
        B_LogEntry (TOPIC_CutExampleB,LOGENTRY_CutExampleB); 
            
        Log_CreateTopic (TOPIC_CutExampleC, LOG_MISSION);
        Log_SetTopicStatus(TOPIC_CutExampleC, LOG_RUNNING);
        B_LogEntry (TOPIC_CutExampleC,LOGENTRY_CutExampleC); 
        
        Log_CreateTopic (TOPIC_CutExampleD, LOG_MISSION);
        Log_SetTopicStatus(TOPIC_CutExampleD, LOG_RUNNING);
        B_LogEntry (TOPIC_CutExampleD,LOGENTRY_CutExampleD); 
        
        s = 0;
        hnldLogManager = wrap(oCLogManager@,oCLogManager_Ptr);
        var int tmp[2]; tmp[0] = hnldLogManager;
        
        if(getInst(hnldLogManager)!=false)
        {
            tmp[1] = getInst(hnldLogManager);
            MEM_SendToSpy(zERR_TYPE_WARN,ConcatStrings("Instanz des Handles :",IntToString(tmp[1])));
        }else{
            MEM_SendToSpy(zERR_TYPE_WARN,"Instanz des Handles (hnldLogManager) ungültig!");ExitGame();
        }; s = SB_New();SB("Wrap OK (");SBi(hnldLogManager);SB(")");
        MEM_SendToSpy(zERR_TYPE_WARN,SB_ToString());
        SB_Destroy();
    
        s = SB_New();SB("Klassendefinition OK (");SB (_PM_InstName(tmp[1]));SB(")");
        MEM_SendToSpy(zERR_TYPE_WARN,SB_ToString());
        SB_Destroy();
        
        MEM_SendToSpy(zERR_TYPE_WARN,IntToString(tmp[0]));
        MEM_SendToSpy(zERR_TYPE_WARN,IntToString(tmp[1]));
    
        TopicList = get(hnldLogManager);MEM_SendToSpy(zERR_TYPE_WARN,"Zugewiesen: TopicList");
        
        
        if(!TopicList.next)
        {
            MEM_SendToSpy(zERR_TYPE_WARN,"Liste leer!");
            ExitGame();
        };
        // Listenkopf ignorieren
        TopicList = _^(TopicList.next);
        
        var int i; var int whilepos; var int whilereturn;
        var oCLogTopic tpc;
        var int MaxStrWidth;
        
        while(TopicList.next);
            whilepos = MEM_StackPos.position;   // Wir müssen nach der whileschleife noch einen Durchlauf starten,
                                                // um auch das letzte Element zu fassen zu kriegen
            tpc = _^(TopicList.data);
            ///tpc.m_strDescription = "Leer";
            MEM_SendToSpy(zERR_TYPE_WARN,ConcatStrings("Tagebucheintragstitel: ",tpc.m_strDescription));
            if(whilereturn!=1){
                TopicList = _^(TopicList.next);
            };
            i += 1;
        end;
        if(whilereturn==0){
            whilereturn=1;
            MEM_StackPos.position = whilepos;
        };
        
        MEM_SendToSpy(zERR_TYPE_WARN,"Topiczuweisungen OK");
        //if(!bLogmenudetected)
        //{
            CHRTBL_S();
            FF_ApplyExt(LogEntryCutter, 50, 1);
            bLogmenudetected+=1;
        //};
        }else{
            FF_ApplyExt(LogEntryCutter, 50, 1);
        };
        // Wir nehmen den hook wieder raus, damit mehrfach-Cuts vermieden werden.
        // ToDo: PermMEM-Klasse zur verwaltung, von bereits gecutteten Tagebuchtiteln.
        HookEngine(oCNpc__OpenScreen_Log, 7 ,"");
    };
    Um den Code zu testen ist ein Hook sinnvoll. Vorschlag:
    Code:
    HookEngine(oCNpc__OpenScreen_Log, 7 ,"LogEntryCTest");
    Viel Spaß.
    Ich arbeite (hin und wieder) daran.


    Freundliche Grüße von Oparilames
    Oparilames nachdem er seinen Gesellenbrief erhalten hat:
    »Das war's mit dir, du Mistvieh!«
    Geändert von Oparilames (02.11.2013 um 19:59 Uhr)

  10. Beiträge anzeigen #290
    now also in your universe  Avatar von Milky-Way
    Registriert seit
    Jun 2007
    Beiträge
    15.244
     
    Milky-Way ist offline
    Bist du auf Gothic 2 umgestiegen?

    Bzw. meine eigentliche Frage: das ist für Gothic 2 gedacht?

    Und inwiefern tut der Code nicht das, was er soll?

  11. Beiträge anzeigen #291
    Deus Avatar von Oparilames
    Registriert seit
    May 2004
    Ort
    ex contrariis
    Beiträge
    11.015
     
    Oparilames ist offline
    Ja bin ich, ja es ist für G2 gedacht.
    Probier es aus. Nagut okay, das Problem ist es, einen Zeilenumbruch
    zu erzwingen, da die Escapesequenzen (\n \0) nicht wirken. Auch das
    das Menüinterne ~ funktioniert nicht. So wie es aussieht, muss
    ich erst an das InnerWindow-Objekt mit den
    Tagebucheintragsnamens-Strings- ran kommen.

    Ich zitiere mal aus der cZMenu.d von Sektis Ikarus:
    /* zCViews kapseln zweidimensionale Objekte auf dem Bildschirm.
    * Dazu zählen zum Beispiel Texte oder Menüelemente.
    *
    * Bei Menüelemente verhält es sich so:
    * -Ein Menüelement wird generiert, wenn es das erste mal gebraucht wird. Es lebt dann bis zum beenden von Gothic.
    * -Ein Menüelement speichert den Text, der zu ihm gehört in zCMenuItem.m_listLines.
    * -Sobald ein Menüelement etwas anzeigen muss, erzeugt es ein "InnerWindow" um speichert sich eine Referenz
    * auf dieses InnerWindow in zCMenuItem.m_pInnerWindow.
    * -Das InnerWindow ist ein zCView und bekommt eine Kopie des anzuzeigenden Textes vom Menüelement.
    * -Das InnerWindow speichert sich alle Textzeilen (meistens eine) in zCView.textLines. Das "nullte" Element von solchen Liste bleibt stets leer.
    * -Der Text wird vom InnerWindow dann in jedem Frame gezeichnet. Sobald das Menüitem entscheidet, dass es nichts mehr anzeigen muss wird das InnerWindow zerstört.
    */
    Edit:-->
    Und falls jemand nicht testen will/kann hier 2 Screens für vor dem zweiten Tagebuchöffnen und danach.
    Oparilames nachdem er seinen Gesellenbrief erhalten hat:
    »Das war's mit dir, du Mistvieh!«
    Geändert von Oparilames (02.11.2013 um 22:30 Uhr)

  12. Beiträge anzeigen #292
    Lehrling Avatar von qiaky
    Registriert seit
    Nov 2013
    Beiträge
    11
     
    qiaky ist offline

    Question LeGo initialisieren, Probleme beim Laden von Handles

    Hallo, ich habe ein Problem mit LeGo. Genauer: Beim Laden von Handles aus der SCRPTSAVE.SAV
    Verwendet werden Bars, FrameFunctions und PermMem.

    Ausgangslage:

    Bars macht keine Probleme (wird für Ausdauerbar verwendet).
    FrameFunctions werden zwei Stück erzeugt, ein 250ms Dauertrigger, der überprüft ob die Sprinttaste gedrückt ist und ein 1s Dauertrigger, der die Ausdauerbar verwaltet/updatet/versteckt usw.
    Dann habe ein noch Skript, mit dem man die angelegte Nahkampfwaffe am Schleifstein schärfen kann. (Damage +5, Value +100)
    Da Waffen beim Spielstandladen über ihre instance neu erzeugt / ausgelesen werden, lege ich für jede geschärfte Waffe ein Handle anlegen, welches die InstanceID als integer enthält.

    Somit haben wir
    ...über Framefunctions:
    Update der Ausdauerbar
    Abfrage nach Sprinttaste => ab jetzt bezeichnet als FFHandles

    ...über PermMem Handles:
    Initialisieren der Waffenschärfe => ab jetzt bezeichnet als SharpHandles

    Ich kriege beide Handles zum laufen, ABER nicht gleichzeitig. Welches funktioniert, hängt von der Initialisierungsmethode ab.

    Methode 1:
    Aufrufreihenfolge: Global_Init() -> Custom_Init()

    Methode 2:
    Aufrufreihenfolge: instance PC_hero() -> Custom_Init()

    die Custom_Init() sieht dabei so aus:
    Spoiler:(zum lesen bitte Text markieren)

    Code:
    func void Custom_Init()
    {
    // LeGo
        LeGo_Init(LeGo_Bars | LeGo_FrameFunctions);
    // make weapons sharp    
        SharpWeapon_Init();
    // 250 ms Trigger for sprint    
        FF_ApplyOnceExt(SKTOGGLE, 250, -1);
    // 1 s Trigger for bar updates    
        FF_ApplyOnceExt(TRIGGERONE, 1000, -1);
    // CLOCK
        if(MEM_Game.game_showtime != 1){MEM_Game.game_showtime = 1;};
    // PARSE LATE    
        FF_ApplyOnceExt(Init_ParseLate, 10, 1);
    };

    Verwaltung der Waffenschärfe:
    Spoiler:(zum lesen bitte Text markieren)

    Code:
    const int SHARP_FLAG = 1<<2;
    
    // KLASSE mit leerer Instanz
    
    class C_SHARPOBJ
        {var int inst;};
        
    instance C_SHARPOBJ@(C_SHARPOBJ);
    
    // Initialisieren nach Laden/Neustart von G2    
    func void SharpWeapon_Init()
    {
    //    Lego_Init(LeGo_Bars | LeGo_FrameFunctions);
        if(!HasHndl(C_SHARPOBJ@)){Print("Kein Handle!");};
        foreachHndl(C_SHARPOBJ@, _SharpWeapon_Init);
    };
    
    // Setzen von "Sharp"-Eigenschaften für als Handle gespeicherte scharfe Waffen
    func int _SharpWeapon_Init(var int hndl)
    {
        var C_SHARPOBJ oSharp; oSharp = get(hndl);
        if(oSharp.inst == -1)
        {
            delete(hndl);
            return rcontinue;
        };
        Npc_GetInvItem(hero, oSharp.inst);
    //    var C_ITEM wp; wp = item;    
        if(!Hlp_IsValidItem(item))
            {return rcontinue;};
            
        if(item.damage[DAM_INDEX_EDGE] != 0)
        {
            item.damage[DAM_INDEX_EDGE] += SharpBonusDamage;
            item.count[1] = item.damage[DAM_INDEX_EDGE];
        }
        else if(item.damageTotal != 0)
        {
            item.damageTotal += SharpBonusDamage;
            item.count[1] = item.damageTotal;
        };
        item.description = ConcatStrings(item.description, " (geschärft)");
        item.weight = item | SHARP_FLAG;
        item.value += SharpBonusValue;
        
        return rContinue;
    };
    
    // Funktion um Handle zu erzeugen
    
    func void MakeSharp(var c_ITEM slf)
    {
        var int hndl; hndl = new(C_SHARPOBJ@);
        var C_SHARPOBJ oSharp; oSharp = get(hndl);
        oSharp.inst = Hlp_GetInstanceID(slf);
        _SharpWeapon_Init(hndl);
    };

    Methode 1, also die normale Methode, funktioniert für die SharpHandels, gibt jedoch für die FFHandles im Z-Spy folgende Fehler aus:
    Z-Spy Log:
    Spoiler:(zum lesen bitte Text markieren)

    Code:
    00:17 Warn:  0 D:         zModel(zCModelAni::ResolveReferences): Could not find nextAni: 1, this:T_FISTRUN_2_FISTRUNL .... <zModelProto.cpp,#3352>
    00:17 Warn:  0 D:         zModel(zCModelAni::ResolveReferences): Could not find nextAni: 1, this:T_MAGRUN_2_MAGRUNL .... <zModelProto.cpp,#3352>
    00:17 Warn:  0 D:         zModel(zCModelAni::ResolveReferences): Could not find nextAni: 1, this:T_RUN_2_RUNL .... <zModelProto.cpp,#3352>
    00:18 Warn:  0 OH    : zCArchiverBinSafe::SkipChunk - expected entry not found: symValue5764 .... <zArchiver2.cpp,#1762>
    00:19 Fault: 0 Q:     [start of stacktrace]
    00:19 Fault: 0 Q:             MEMINT_HANDLEERROR(2, 'STR_SubStr: The end of the desired substring exceeds the end of the string.') +   62 bytes
    00:19 Fault: 0 Q:             MEM_WARN('STR_SubStr: The end of the desired substring exceeds the end of the string.') +   21 bytes
    00:19 Fault: 0 Q:             STR_SUBSTR('                                                                                                    ', 0, 8) +  227 bytes
    00:19 Fault: 0 Q:             _BIN_GETSAVEFILEPATH(1)                                        +   69 bytes
    00:19 Fault: 0 Q:             _BR_LOADGAME()                                                 +   65 bytes
    00:19 Fault: 0 Q:             LEGO_INITALWAYS(122250)                                        +  101 bytes
    00:19 Fault: 0 Q:             LEGO_INIT(4104)                                                +  115 bytes
    00:19 Fault: 0 Q:             CUSTOM_INIT()                                                  +   16 bytes
    00:19 Fault: 0 Q:             INIT_GLOBAL()                                                  +   25 bytes
    00:19 Fault: 0 Q:     [end of stacktrace]
    00:19 Warn:  0 Q:     STR_SubStr: The end of the desired substring exceeds the end of the string.
    00:19 Fault: 0 Q:     [start of stacktrace]
    00:19 Fault: 0 Q:             MEMINT_HANDLEERROR(2, 'MEM_Free: ptr is 0. Ignoring request.') +   62 bytes
    00:19 Fault: 0 Q:             MEM_WARN('MEM_Free: ptr is 0. Ignoring request.')              +   21 bytes
    00:19 Fault: 0 Q:             MEM_FREE_(0)                                                   +   27 bytes
    00:19 Fault: 0 Q:             BR_OPENFILE('saves_RETURNING_DE/savegame1/SCRPTSAVE.SAV')      +  219 bytes
    00:19 Fault: 0 Q:             _BR_LOADGAME()                                                 +   70 bytes
    00:19 Fault: 0 Q:             LEGO_INITALWAYS(122250)                                        +  101 bytes
    00:19 Fault: 0 Q:             LEGO_INIT(4104)                                                +  115 bytes
    00:19 Fault: 0 Q:             CUSTOM_INIT()                                                  +   16 bytes
    00:19 Fault: 0 Q:             INIT_GLOBAL()                                                  +   25 bytes
    00:19 Fault: 0 Q:     [end of stacktrace]
    00:19 Warn:  0 Q:     MEM_Free: ptr is 0. Ignoring request.
    00:19 Warn:  0 C:       SCRIPT: Npc_SetAttitude(): illegal param: "B_SETATTITUDE.SLF" is NULL. .... <oGameExternal.cpp,#252>
    00:19 Warn:  0 C:       SCRIPT: last parser func-name: INIT_NEWWORLD .... <oGameExternal.cpp,#262>
    00:19 Warn:  0 C:       SCRIPT: Npc_SetTempAttitude(): illegal param: "B_SETATTITUDE.SLF" is NULL. .... <oGameExternal.cpp,#252>


    Methode 2 mag ein wenig seltsam erscheinen, sorgt aber interessanterweise dafür, dass die FFHandles initalisiert werden und problemlos funktionieren.
    Dafür werden die Sharphandles nicht mehr gelesen. (Wer im Skript nachguckt, es wird nun "Kein Handle!" ausgegeben). Das es sich hierbei um einen dreckigen Trick handelt, ist mir klar. Ich weiß ja nicht einmal, inwiefern die PC_HERO Instanz beim Laden eines Savegames aufgerufen wird. Fakt ist, es bringt die FrameFunctions zum laufen, was ich anders im Moment nicht schaffe.

    Laut Z-Spy gibt es also Probleme mit dem korrekten Erkennen des geladenen Savegames?
    Ich verwende eine *.ini namens XPERSONAL_KK saves sind demnach im Ordner saves_XPERSONAL_KK

    Gibt es jemand der mir Lösungsvorschläge geben kann?

    Gruß
    qiaky

    PS:
    hier noch die SCRPTSAVE.SAV mit den Handles die geladen werden sollen:
    Spoiler:(zum lesen bitte Text markieren)
    Code:
    PermMem::v2
    
    HNDL:1
    ZCARRAY:LCEVENT
    {
    }
    
    HNDL:2
    _BAR:_BAR@
    {
        VALMAX=i100
        BARW=i995
        V0=i7
        V1=i8
    }
    
    HNDL:3
    ZCARRAY:LCEVENT
    {
    }
    
    HNDL:4
    FFITEM:FFITEM@
    {
        LOOP=sSKTOGGLE
        NEXT=i71291
        DELAY=i250
    }
    
    HNDL:5
    FFITEM:FFITEM@
    {
        LOOP=sTRIGGERONE
        NEXT=i71791
        DELAY=i1000
    }
    
    HNDL:6
    C_SHARPOBJ:C_SHARPOBJ@
    {
        INST=i16822
    }
    
    HNDL:7
    ZCVIEW:ZCVIEW@
    {
        _VTBL=i8643340
        _ZCINPUTCALLBACK_VTBL=i8643332
        M_BFILLZ=i0
        NEXT=i20378164
        VIEWID=i2
        FLAGS=i512
        INTFLAGS=i1
        ONDESK=i0
        ALPHAFUNC=i1
        COLOR=i-1
        ALPHA=i255
        CHILDS_COMPARE=i0
        CHILDS_COUNT=i0
        CHILDS_LAST=i0
        CHILDS_WURZEL=i0
        OWNER=i0
        BACKTEX=sBAR_BACK.TGA
        VPOSX=i59
        VPOSY=i7605
        VSIZEX=i1081
        VSIZEY=i214
        PPOSX=i10
        PPOSY=i713
        PSIZEX=i180
        PSIZEY=i20
        FONT=sFONT_DEFAULT.TGA
        FONTCOLOR=i-1
        PX1=i50
        PY1=i50
        PX2=i8142
        PY2=i8142
        WINX=i50
        WINY=i50
        TEXTLINES=pNULL
        SCROLLMAXTIME=i0
        SCROLLTIMER=i0
        FXOPEN=i0
        FXCLOSE=i0
        TIMEDIALOG=i0
        TIMEOPEN=i0
        TIMECLOSE=i0
        SPEEDOPEN=i994352038
        SPEEDCLOSE=i994352038
        ISOPEN=i0
        ISCLOSED=i1
        CONTINUEOPEN=i0
        CONTINUECLOSE=i0
        REMOVEONCLOSE=i0
        RESIZEONOPEN=i0
        MAXTEXTLENGTH=i0
        TEXTMAXLENGTH=s
        POSCURRENT_0=aINT:2
        [
            0=i1092616192
            1=i1144143872
        ]
        POSCURRENT_1=aINT:2
        [
            0=i1128071168
            1=i1144455168
        ]
        POSOPENCLOSE_0=aINT:2
        [
            0=i0
            1=i0
        ]
        POSOPENCLOSE_1=aINT:2
        [
            0=i0
            1=i0
        ]
    }
    
    HNDL:8
    ZCVIEW:ZCVIEW@
    {
        _VTBL=i8643340
        _ZCINPUTCALLBACK_VTBL=i8643332
        M_BFILLZ=i0
        NEXT=i20377908
        VIEWID=i2
        FLAGS=i512
        INTFLAGS=i1
        ONDESK=i0
        ALPHAFUNC=i1
        COLOR=i-1
        ALPHA=i255
        CHILDS_COMPARE=i0
        CHILDS_COUNT=i0
        CHILDS_LAST=i0
        CHILDS_WURZEL=i0
        OWNER=i0
        BACKTEX=sBAR_MISC.TGA
        VPOSX=i101
        VPOSY=i7637
        VSIZEX=i995
        VSIZEY=i150
        PPOSX=i17
        PPOSY=i716
        PSIZEX=i166
        PSIZEY=i14
        FONT=sFONT_DEFAULT.TGA
        FONTCOLOR=i-1
        PX1=i50
        PY1=i50
        PX2=i8142
        PY2=i8142
        WINX=i50
        WINY=i50
        TEXTLINES=pNULL
        SCROLLMAXTIME=i0
        SCROLLTIMER=i0
        FXOPEN=i0
        FXCLOSE=i0
        TIMEDIALOG=i0
        TIMEOPEN=i0
        TIMECLOSE=i0
        SPEEDOPEN=i994352038
        SPEEDCLOSE=i994352038
        ISOPEN=i0
        ISCLOSED=i1
        CONTINUEOPEN=i0
        CONTINUECLOSE=i0
        REMOVEONCLOSE=i0
        RESIZEONOPEN=i0
        MAXTEXTLENGTH=i0
        TEXTMAXLENGTH=s
        POSCURRENT_0=aINT:2
        [
            0=i1099431936
            1=i1144193024
        ]
        POSCURRENT_1=aINT:2
        [
            0=i1127612416
            1=i1144406016
        ]
        POSOPENCLOSE_0=aINT:2
        [
            0=i0
            1=i0
        ]
        POSOPENCLOSE_1=aINT:2
        [
            0=i0
            1=i0
        ]
    }
    
    PermMem::End
    G2 Version: Gothic 2 - NDR (Deutsch), 2.6fix, Reportversion

  13. Beiträge anzeigen #293
    Dea
    Registriert seit
    Jul 2007
    Beiträge
    10.447
     
    Lehona ist offline
    LeGo sucht in saves_RETURNING_DE/savegame1/ nach der SCRPTSAVE.SAV, du hast dein Gothic also entweder nicht über deine XPERSONAL_KK.ini gestartet, oder eine komische Installation von Returning. In jedem Fall solltest du deine Installation zum Modden nicht zum spielen von Mods verwenden! Versuch also einmal, eine frische Installation von Gothic zu verwenden.

    Initialisiere LeGo bitte in der Global_Init(), es gibt keinen Grund, davon abzuweichen. Wenn dabei Fehler entstehen, müssen die an anderer Stelle gesucht werden.

    Außerdem hat die LeGo.d im aktuellen Release noch einen kleinen Fehler: Nicht alle Pakete initialisieren ihre Abhängigkeiten korrekt. Im Zweifelsfall macht es Sinn, ein Script mit LeGo_Init(LeGo_All) zu testen. Die FrameFunctions haben da das Problem, dass sie dann beim Laden erst verzögert starten (kumuliert sich mit jedem Mal speichern/laden), da fliegt aber im Forum auch eine korrigierte Version rum... Es ist wohl auch nicht mehr so lange bis zu einem neuen Release, der dann endlich alle Bugfixes enthält.

    LeGo_PermMem initialisierst du übrigens auch nicht, obwohl du sogar direkt davon gebrauch machst.


    Startest du immer ein neues Spiel?

  14. Beiträge anzeigen #294
    Lehrling Avatar von qiaky
    Registriert seit
    Nov 2013
    Beiträge
    11
     
    qiaky ist offline
    Erstmal: Danke für die schnelle Antwort

    @XPERSONAL_KK vs. Returning:
    Ich habe eine saubere Installation XPERSONAL_KK zum testen von neuen Features und Skripten und eine Returning Installation, wo ich funktionierende Skripte einbinde. Da hab ich also Mist geredet, das Spiel wurde bei dem gezeigten Z-Spy log natürlich über die RETURNING_DE.ini gestartet. Ändert aber an den Skripten in dem Fall nichts.

    @Initialisierung von LeGo:
    Hab einfach sämtliche neuen Initialisierungen in eine Funktion namens Custom_Init() gepackt, die auch nur einmalig aus Init_Global() (bzw. PC_HERO, s.o.) aufgerufen wird. Du hast aber natürlich Recht, dass das eine weitere Fehlerquelle ist.

    @Flags: Da LeGo_FrameFunctions die LeGo_PermMem flag automatisch mitsetzt, hab ich das für nicht wichtig erachtet, hab es dann aber geändert.

    ALLGEMEIN:
    Ich hab den Inhalt der Custom_Init() in die Init_Global() zurückverschoben, und LeGo_PermMem als flag bei LeGo_Init() hinzugefügt.Also:
    Code:
    func void INIT_GLOBAL()
    {
        // wird fuer jede Welt aufgerufen (vor INIT_<LevelName>)
        Game_InitGerman();
        
    // CUSTOM MARKER //
        
    // LeGo
        LeGo_Init(LeGo_Bars | LeGo_FrameFunctions | LeGo_PermMem);
        SharpWeapon_Init();
    // 250 ms Trigger for sprint    
        FF_ApplyOnceExt(SKTOGGLE, 250, -1);
    // 1 s Trigger for bar updates    
        FF_ApplyOnceExt(TRIGGERONE, 1000, -1);
    // CLOCK
        if(MEM_Game.game_showtime != 1){MEM_Game.game_showtime = 1;};
    // PARSE LATE    
        FF_ApplyOnceExt(Init_ParseLate, 10, 1);
    };
    Hat nichts gebracht.
    Mit LeGo(LeGo_All); jedoch scheint alles zu funktionieren. Muss also ein Fehler in der LeGo.d bei den Abhängigkeiten sein. Vielleicht wurde die LeGo_Saves flag nicht gesetzt (?). Ich werde mal weiter rumprobieren mit verschiedenen flag-Kombinationen.

    Achso und ein neues Spiel wird natürlich nicht gestartet, da es ja darum geht, die Handles aus einem Savegame auszulesen. Falls du meintest ob ich nach neu-parsen der Gothic.dat ein neues Spiel starte, abspeichere, lade und die features Teste, ist die Antwort: Nein.
    G2 Version: Gothic 2 - NDR (Deutsch), 2.6fix, Reportversion

  15. Beiträge anzeigen #295
    Dea
    Registriert seit
    Jul 2007
    Beiträge
    10.447
     
    Lehona ist offline
    Solange dir bekannt war, dass du da eine andere .ini benutzt hast und das kein obskurer Fehler war, ist das ja nicht so schlimm.

    Ob du die jetzt direkt in der Init_Global() hast oder in der Custom_Init() ausgelagert hast, ist natürlich egal. Mir ging es bloß darum, dass du dann LeGo nicht aus PC_Hero aus initialisierst.

    Wenn du die Flags überprüft hast, ist das natürlich nicht das Problem. Die sich verzögernden FFs treten leider trotzdem auf Ich werde neue Scripte, die ich noch für LeGo geplant habe, nachreichen, um ein schnelleres Release zu gewährleisten.

    Generell sollte man ein neues Spiel starten, wenn man die Scripte verändert hat, sonst kann es zu Fehlern kommen. Dieses Mal schien es nicht daran zu liegen, aber das solltest du immer als erstes überprüfen, wenn irgendetwas nicht funktioniert.



    Es schadet übrigens nicht, jeden Frame auf das Drücken der Sprinttaste zu drücken, das hält Gothic locker aus

  16. Beiträge anzeigen #296
    Lehrling Avatar von qiaky
    Registriert seit
    Nov 2013
    Beiträge
    11
     
    qiaky ist offline

    FF-Handles laden

    Ok, hat irgendwie doch nicht funktioniert.

    Ich hab jetzt nochmal eine komplett saubere Gothic.dat genommen und folgende Änderungen eingefügt:
    - Ikarus und LeGo in Gothic.src integriert
    - Die Important Flag von Xardas 1.Dialog für schnelleren Spielstart entfernt
    Init_Global():
    Code:
    func void init_global()
    {
        Game_InitGerman();
        LeGo_Init(LeGo_All);
        FF_ApplyOnce(Sprint_Key_Toggle);
    };
    Datei x1_Sprint.d zu Gothic.src hinzugefügt:
    Code:
    var int PC_SPRINTSTATE;
    
    func void Sprint_State()
    {
        // IF ON: TOGGLE OFF
        if(PC_SPRINTSTATE)
        {
            Mdl_RemoveOverlayMDS(hero, "Humans_Sprint.mds");
            PC_SPRINTSTATE = FALSE;
        }
        // IF OFF: TOGGLE ON
        else
        {
            Mdl_ApplyOverlayMds(hero, "Humans_Sprint.mds");
            PC_SPRINTSTATE = TRUE;
        };
    };
    
    // Sprinttaste: ALT-Links
    const int KEY_SPRINT = KEY_LMENU;
    
    // wird jeden Frame überprüft:
    func void Sprint_Key_Toggle()
    {
        var int keyState;
        keyState = MEM_KeyState (KEY_SPRINT);
    
        if (keyState == KEY_PRESSED) 
        {
            Sprint_State();
        };
    };
    Ergebnis:
    Bei einem neuen Spiel funktioniert der Sprinttoggle einwandfrei. Beim abspeichern gibt zSpy mir jedoch folgenden Fehler mit Stacktrace:
    Code:
    01:07 Fault: 0 Q:     [start of stacktrace]
    01:07 Fault: 0 Q:             MEMINT_HANDLEERROR(2, 'STR_SubStr: The end of the desired substring exceeds the end of the string.') +   62 bytes
    01:07 Fault: 0 Q:             MEM_WARN('STR_SubStr: The end of the desired substring exceeds the end of the string.') +   21 bytes
    01:07 Fault: 0 Q:             STR_SUBSTR('                                                                                                    ', 0, 8) +  227 bytes
    01:07 Fault: 0 Q:             _BIN_GETSAVEFILEPATH(1)                                        +   69 bytes
    01:07 Fault: 0 Q:             _BW_SAVEGAME()                                                 +   21 bytes
    01:07 Fault: 0 Q:     [end of stacktrace]
    01:07 Warn:  0 Q:     STR_SubStr: The end of the desired substring exceeds the end of the string.
    Wenn ich das Spiel während der gleichen Session (kein Neustart der Gothic2.exe) lade, funktioniert der Sprinttoggle noch.
    Nach einem Neustart der Gothic2.exe schlägt das Laden des FF-Handles fehl. Der von zSpy ausgegebene Stacktrace entspricht dem vom abspeichern und einem zusätzlichen wegen MEM_Free(ptr) mit ptr = 0 und findet sich in meinem ersten Post.

    Ist das ein bekanntes Problem von FF_ApplyOnce Handles?
    G2 Version: Gothic 2 - NDR (Deutsch), 2.6fix, Reportversion

  17. Beiträge anzeigen #297
    Dea
    Registriert seit
    Jul 2007
    Beiträge
    10.447
     
    Lehona ist offline
    Ein Absturz beim Speichern ist mir so nicht bekannt. Du startest über den GothicStarter, ja?
    Eigentlich wird dort nur die CommandLine (Parameter beim Aufruf der Gothic2.exe) ausgelesen und nach dem Namen der .ini durchsucht - bei dir scheint die Commandline nur nur leer, sondern auch so kaputt zu sein?


    Benutzt du vielleicht Windows 8 und da geht dann irgendetwas schief?

  18. Beiträge anzeigen #298
    Lehrling Avatar von qiaky
    Registriert seit
    Nov 2013
    Beiträge
    11
     
    qiaky ist offline
    System ist Windows 7 Prof 64 bit
    ausgeführt wird als Administrator.
    Meine Gothic 2 Version ist die Goldversion, mit Patches, siehe Signatur.
    Ich hatte durch den WidescreenPatch (Coded by Jackseller 2012) eine veränderte Gothic2.exe, habe die alte mal wieder hergestellt, aber das ändert auch nichts.

    Ich habe es sowohl über GothicStarter.exe als auch GothicStarter_mod.exe probiert.
    G2 Version: Gothic 2 - NDR (Deutsch), 2.6fix, Reportversion

  19. Beiträge anzeigen #299
    Dea
    Registriert seit
    Jul 2007
    Beiträge
    10.447
     
    Lehona ist offline
    Komisch. Kannst du in der LeGo\Saves.d mal in Zeile 19 (quasi direkt nach MEM_GetCommandLine()) folgendes einfügen: MEM_InfoBox(IntToString(cmd));? Dann sollte beim Speichern ein Fenster aufploppen, dass die Kommandozeile der Gothic2.exe ausgibt. Ich würde dich dann bitten, die eben zu posten.

    Außerdem: Lege mal eine Verknüpfung zur Gothic2.exe an (z.B. auf dem Desktop) und füge in den Eigenschaften den Parameter -game:modname.ini an (natürlich ersetzt du modname.ini mit dem Namen deiner .ini).

    Ansonsten bin ich ein wenig ratlos, weil ich den Fehler nicht wirklich reproduzieren kann.

  20. Beiträge anzeigen #300
    Lehrling Avatar von qiaky
    Registriert seit
    Nov 2013
    Beiträge
    11
     
    qiaky ist offline
    Hi

    hab grad nicht viel Zeit und bin am Wochenende unterwegs. Nur soviel:
    Verknüpfung mit Parameter funktioniert.
    Und die Infobox (ich hab das IntToString mal weggelassen, weil cmd ja ein string ist) gibt, ich nehme an wie erwartet,
    -GAME:XPERSONAL_KK.INI
    aus bzw. wenn ich über GothicStarter_mod.exe starte noch die anderen Optionen:
    -GAME:XPERSONAL_KK.INI -ZWINDOW -ZNOMUSIC -ZNOSOUND -ZLOG:4,S
    aber mach dir mal nicht zuviel Aufwand, ich werde das Montag abend nochmal anständig debuggen.
    G2 Version: Gothic 2 - NDR (Deutsch), 2.6fix, Reportversion

Seite 15 von 21 « Erste ... 48111213141516171819 ... Letzte »

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