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 3 von 4 « Erste 1234 Letzte »
Ergebnis 41 bis 60 von 79
  1. Beiträge anzeigen #41 Zitieren
    Local Hero
    Registriert seit
    Feb 2017
    Beiträge
    270
     
    F a w k e s ist offline

    G1 oCItemContainer class def is actually oCNpcInventory ?

    Zitat Zitat von mud-freak Beitrag anzeigen
    Your class definition is a bit off.
    Hi mud-freak,
    actually it seems to be completely off I am calling it incorrectly oCItemContainer, when I looked at class oCNPC from which I have cut it out now ... it actually should be called oCNpcInventory not sure if I should just edit every post in which I have used it now - what would you suggest ?

    Code:
    class oCNpc
    {
    
    ...
    
    //  oCNpcInventory {
    //      oCItemContainer inventory2 {
                var int    inventory2_vtbl;                                              // 0x0550
                var int    inventory2_oCItemContainer_contents;                        // 0x0554 zCListSort<oCItem>*
                var int    inventory2_oCItemContainer_npc;                             // 0x0558 oCNpc*
                var int    inventory2_oCItemContainer_selectedItem;                    // 0x055C int
                var int    inventory2_oCItemContainer_offset;                          // 0x0560 int
                var int    inventory2_oCItemContainer_drawItemMax;                     // 0x0564 int
                var int    inventory2_oCItemContainer_itemListMode;                    // 0x0568 oTItemListMode
                var int    inventory2_oCItemContainer_frame;                           // 0x056C zBOOL
                var int    inventory2_oCItemContainer_right;                           // 0x0570 zBOOL
                var int    inventory2_oCItemContainer_ownList;                         // 0x0574 zBOOL
                var int    inventory2_oCItemContainer_prepared;                        // 0x0578 zBOOL
                var int    inventory2_oCItemContainer_passive;                         // 0x057C zBOOL
                var int    inventory2_oCItemContainer_viewCat;                         // 0x0580 zCView*
                var int    inventory2_oCItemContainer_viewItem;                        // 0x0584 zCView*
                var int    inventory2_oCItemContainer_viewItemActive;                  // 0x0588 zCView*
                var int    inventory2_oCItemContainer_viewItemHightlighted;            // 0x058C zCView*
                var int    inventory2_oCItemContainer_viewItemActiveHighlighted;       // 0x0590 zCView*
                var int    inventory2_oCItemContainer_viewItemFocus;                   // 0x0594 zCView*
                var int    inventory2_oCItemContainer_viewItemActiveFocus;             // 0x0598 zCView*
                var int    inventory2_oCItemContainer_viewItemHightlightedFocus;       // 0x059C zCView*
                var int    inventory2_oCItemContainer_viewItemActiveHighlightedFocus;  // 0x05A0 zCView*
                var int    inventory2_oCItemContainer_viewItemInfo;                    // 0x05A4 zCView*
                var int    inventory2_oCItemContainer_viewItemInfoItem;                // 0x05A8 zCView*
                var int    inventory2_oCItemContainer_textView;                        // 0x05AC zCView*
                var int    inventory2_oCItemContainer_viewArrowAtTop;                  // 0x05B0 zCView*
                var int    inventory2_oCItemContainer_viewArrowAtBottom;               // 0x05B4 zCView*
                var int    inventory2_oCItemContainer_rndWorld;                        // 0x05B8 zCWorld*
                var int    inventory2_oCItemContainer_posx;                            // 0x05BC int
                var int    inventory2_oCItemContainer_posy;                            // 0x05C0 int
                var string inventory2_oCItemContainer_textCategoryStatic;              // 0x05C4 zSTRING
                var int    inventory2_oCItemContainer_m_bManipulateItemsDisabled;      // 0x05D8 zBOOL
                var int    inventory2_oCItemContainer_m_bCanTransferMoreThanOneItem;   // 0x05DC zBOOL
                var int    inventory2_oCItemContainer_image_chroma;                    // 0x05E0 zCOLOR
                var int    inventory2_oCItemContainer_blit_chroma;                     // 0x05E4 zCOLOR
    //      }
            var int        inventory2_owner;                           // 0x05E8 oCNpc*
            var int        inventory2_packAbility;                     // 0x05EC zBOOL
    //      zCListSort<oCItem>[INV_MAX] inventory {
                var int    inventory2_inventory0_Compare;              // 0x05F0 int(_cdecl*)(oCItem*,oCItem*)
                var int    inventory2_inventory0_data;                 // 0x05F4 oCItem*
                var int    inventory2_inventory0_next;                 // 0x05F8 zCListSort<oCItem>*
                var int    inventory2_inventory1_Compare;              // 0x05FC int(_cdecl*)(oCItem*,oCItem*)
                var int    inventory2_inventory1_data;                 // 0x0600 oCItem*
                var int    inventory2_inventory1_next;                 // 0x0604 zCListSort<oCItem>*
                var int    inventory2_inventory2_Compare;              // 0x0608 int(_cdecl*)(oCItem*,oCItem*)
                var int    inventory2_inventory2_data;                 // 0x060C oCItem*
                var int    inventory2_inventory2_next;                 // 0x0610 zCListSort<oCItem>*
                var int    inventory2_inventory3_Compare;              // 0x0614 int(_cdecl*)(oCItem*,oCItem*)
                var int    inventory2_inventory3_data;                 // 0x0618 oCItem*
                var int    inventory2_inventory3_next;                 // 0x061C zCListSort<oCItem>*
                var int    inventory2_inventory4_Compare;              // 0x0620 int(_cdecl*)(oCItem*,oCItem*)
                var int    inventory2_inventory4_data;                 // 0x0624 oCItem*
                var int    inventory2_inventory4_next;                 // 0x0628 zCListSort<oCItem>*
                var int    inventory2_inventory5_Compare;              // 0x062C int(_cdecl*)(oCItem*,oCItem*)
                var int    inventory2_inventory5_data;                 // 0x0630 oCItem*
                var int    inventory2_inventory5_next;                 // 0x0634 zCListSort<oCItem>*
                var int    inventory2_inventory6_Compare;              // 0x0638 int(_cdecl*)(oCItem*,oCItem*)
                var int    inventory2_inventory6_data;                 // 0x063C oCItem*
                var int    inventory2_inventory6_next;                 // 0x0640 zCListSort<oCItem>*
                var int    inventory2_inventory7_Compare;              // 0x0644 int(_cdecl*)(oCItem*,oCItem*)
                var int    inventory2_inventory7_data;                 // 0x0648 oCItem*
                var int    inventory2_inventory7_next;                 // 0x064C zCListSort<oCItem>*
                var int    inventory2_inventory8_Compare;              // 0x0650 int(_cdecl*)(oCItem*,oCItem*)
                var int    inventory2_inventory8_data;                 // 0x0654 oCItem*
                var int    inventory2_inventory8_next;                 // 0x0658 zCListSort<oCItem>*
    //      }
            var string     inventory2_packString;                      // 0x065C zSTRING[INV_MAX]
            var string     inventory2_packString1;
            var string     inventory2_packString2;
            var string     inventory2_packString3;
            var string     inventory2_packString4;
            var string     inventory2_packString5;
            var string     inventory2_packString6;
            var string     inventory2_packString7;
            var string     inventory2_packString8;
            var int        inventory2__offset[9];                      // 0x0710 int[INV_MAX]
            var int        inventory2__itemnr[9];                      // 0x0734 int[INV_MAX]
            var int        inventory2_maxSlots[9];                     // 0x0758 int[INV_MAX]
            var int        inventory2_invnr;                           // 0x077C int
    //  }
    
    ...

  2. Beiträge anzeigen #42 Zitieren
    Knight Avatar von GenerationLost
    Registriert seit
    Apr 2009
    Ort
    Whereabouts Unknown
    Beiträge
    1.774
     
    GenerationLost ist offline
    Hey Leute,

    hat jemand Erfahrung mit G1 Inventory Management? Im vergleich zu G2 ist in G1 ja einiges kaputt oder schlicht nicht vorhanden. Ich würde nämlich gerne das Inventar eines NPCs komplett leeren, wofür es in G2 eine schöne externe Funktion dazu gibt (Npc_ClearInventory). In G2 würde auch sowas funktionieren:

    Code:
    func void RemoveAllInvItems(var c_npc npc)
    {
        if (Npc_GetInvItemBySlot (npc, 0, 0) > 0)
        {
            var int itemid;
            itemid = Hlp_GetInstanceID (item);
            NPC_RemoveInvItems (npc, itemid, NPC_HasItems (npc, itemid));
    			
            RemoveAllInvItems(npc);
       };
    };
    Bei G1 ist da das größte Problem wohl, dass Npc_GetInvItemBySlot nicht wie beschrieben die globale "item" Variable befüllt, damit hat man keine Chance an das jeweilige Item ranzukommen. Bei obiger Funktion passiert also gar nichts.

    Kennt jemand einen Daedalus-Workaround?
    Ansonsten denke ich da nur noch an Ikarus und die Inventarliste direkt zu bearbeiten, genauer gesagt an das hier:
    Code:
    var int    inventory2_oCItemContainer_contents;                        // 0x0554 zCListSort<oCItem>*

  3. Beiträge anzeigen #43 Zitieren
    Local Hero
    Registriert seit
    Feb 2017
    Beiträge
    270
     
    F a w k e s ist offline

    G1 NPC_Remove_Inventory function

    Hi GenerationLost,
    I am sure NPC_GetInvItemBySlot in G1 is filling global variable item - I am using it in several cases.

    Try to use following functions to remove inventory:
    Code:
    FUNC VOID NPC_Remove_Inventory_Category (var C_NPC slf, var int inv_category, var int flagsKeepItems, var int mainFlagsKeepItems)
    {
        var int p;
        var int itm_count;
        var int itm_instance;
        
        var int itm_slot;
        
        itm_slot = 0;
        
        //Loop
        p = MEM_StackPos.position;
    
        //Is there any item in inv_category itm_slot ?
        if (NPC_GetInvItemBySlot (slf, inv_category, itm_slot) > 0)
        {
            itm_instance = Hlp_GetInstanceID (item);
    
            //Don't remove armor if equipped
            if (inv_category == INV_ARMOR)
            {
                //NPC_GetArmor from LeGo 2.5.0
                if (NPC_GetArmor (slf) == itm_instance)
                {
                    itm_slot = itm_slot + 1;
                    MEM_StackPos.position = p;
                };
            };
            
            //Do we want to keep these items ?
            if (item.Flags & flagsKeepItems)
            || (item.MainFlag & mainFlagsKeepItems)
            {
                itm_slot = itm_slot + 1;
                MEM_StackPos.position = p;
            };
    
            //Remove items
            
            //Weapons and written docs can be removed with NPC_RemoveInvItem and not with NPC_RemoveInvItems ?!! whyyy
            if ((inv_category == INV_WEAPON) && (item.MainFlag != ITEM_KAT_MUN))
            || (inv_category == INV_DOC)
            || !(item.Flags & ITEM_MULTI)
            {
                NPC_RemoveInvItem (slf, itm_instance);    
            } else
            {
                itm_count = NPC_HasItems (slf, itm_instance);
                NPC_RemoveInvItems (slf, itm_instance, itm_count);
            };
            
            MEM_StackPos.position = p;
        };    
    };
    
    
    FUNC VOID NPC_Remove_Inventory (var C_NPC slf, var int flagsKeepItems, var int mainFlagsKeepItems)
    {
        NPC_Remove_Inventory_Category (slf, INV_WEAPON, flagsKeepItems, mainFlagsKeepItems);
        NPC_Remove_Inventory_Category (slf, INV_ARMOR, flagsKeepItems, mainFlagsKeepItems);
        NPC_Remove_Inventory_Category (slf, INV_RUNE, flagsKeepItems, mainFlagsKeepItems);
        NPC_Remove_Inventory_Category (slf, INV_MAGIC, flagsKeepItems, mainFlagsKeepItems);
        NPC_Remove_Inventory_Category (slf, INV_FOOD, flagsKeepItems, mainFlagsKeepItems);
        NPC_Remove_Inventory_Category (slf, INV_POTION, flagsKeepItems, mainFlagsKeepItems);
        NPC_Remove_Inventory_Category (slf, INV_DOC, flagsKeepItems, mainFlagsKeepItems);
        NPC_Remove_Inventory_Category (slf, INV_MISC, flagsKeepItems, mainFlagsKeepItems);
    };
    For example NPC_Remove_Inventory (hero, ITEM_MISSION, 0); will remove all items which do not have ITEM_MISSION flag.

  4. Beiträge anzeigen #44 Zitieren
    Knight Avatar von GenerationLost
    Registriert seit
    Apr 2009
    Ort
    Whereabouts Unknown
    Beiträge
    1.774
     
    GenerationLost ist offline
    I can't believe it, must've missed something...
    Your solution just works like a charm, as usual. Man, you saved my day once again, thank you so much!

  5. Homepage besuchen Beiträge anzeigen #45 Zitieren
    Ritter Avatar von MaGoth
    Registriert seit
    May 2007
    Ort
    Russland (Samara)
    Beiträge
    1.407
     
    MaGoth ist offline
    Zitat Zitat von GenerationLost Beitrag anzeigen
    .. G1 Inventory Management?
    Kennt jemand einen Daedalus-Workaround?
    Hi,
    Add new file Npc_ClearInventory.d in scripts ::

    Code:
    /*
    by Gratt
    
    func INT Npc_GetInvItemBySlot (VAR C_NPC self, VAR INT category, VAR INT slotNr);
    // Mit diesem Befehl läßt sich nachsehen, ob in einem bestimmten Slot einer bestimmten Kategorie
    // ein item vorhanden ist das der Fall, wird dieses Item in die globale Variable item geschrieben
    // gibt jetzt die Anzahl zurueck, wenn das Item stackable ist.
    // Den Transfer machst Du dann per Npc_RemoveInvItems() und Npc_CreateInvItems().
    */
    
    
    func void Npc_ClearCategory(var C_NPC npc, var int category) {
    	if (Npc_GetInvItemBySlot(npc, category, 0) > 0) {
    		Npc_RemoveInvItem(npc, Hlp_GetInstanceID(item));
    		Npc_ClearCategory(npc, category);
    	};
    };
    
    func void Npc_ClearInventory(var C_NPC npc) {
    	Npc_ClearCategory(npc, INV_WEAPON);
    	Npc_ClearCategory(npc, INV_ARMOR);
    	Npc_ClearCategory(npc, INV_RUNE);
    	Npc_ClearCategory(npc, INV_MAGIC);
    	Npc_ClearCategory(npc, INV_FOOD);
    	Npc_ClearCategory(npc, INV_POTION);
    	Npc_ClearCategory(npc, INV_DOC);
    	Npc_ClearCategory(npc, INV_MISC);
    };
    Done, and tests..


    MfG MaGoth,
    |: WOG.de :|: WOG.en :|: WOG.ru :|: WOG.ro :|||: MAGIC-Team :|
    [Bild: 106462_941c3dcc88ff9e9b5597d9f24d9aea88.jpg]
    |: WOR.de :|: WOR.en :|: WOR.ru :|: WOR.ro :|||: Piranha-Bytes :|
    -=GOTHIC UND DIE FREUNDSCHAFT FÜR ALLE ZEITEN!=-
    Geändert von MaGoth (06.01.2019 um 18:02 Uhr)

  6. Beiträge anzeigen #46 Zitieren
    Knight Avatar von GenerationLost
    Registriert seit
    Apr 2009
    Ort
    Whereabouts Unknown
    Beiträge
    1.774
     
    GenerationLost ist offline
    Ich betreibe mal etwas Grabschändung und buddle diesen uralt-Thread mal aus mit einer Frage und, je nach Antwort, einer Bitte (oder zwei):

    Ich hatte im Eingangspost mal eine Liste mit Engine-Addressen für Gothic 1 von F a w k e s verlinkt. Leider ist der Link tot. Weiß jemand ob es entweder eine andere Liste zu finden gibt, oder ob F a w k e s Liste irgendwo anders aufzutreiben ist?

    So, @F a w k e s: Could you re-upload this list of engine adresses for G1 somewhere more permanent? If you still have it, it's been a long time...

    Und @Lehona: Wär es möglich die Liste, sobald sie auftaucht, im Eingangspost vom LeGo-Thread neben der für G2 von Zerxes der Vollständigkeit halber auch zu verlinken?

  7. Beiträge anzeigen #47 Zitieren
    Local Hero
    Registriert seit
    Feb 2017
    Beiträge
    270
     
    F a w k e s ist offline
    Hello GenerationLost,
    For a while now, I have been using files from Union available on GitHub to research both engine functions and classes, for example from Gratt's repository:
    G1:
    https://github.com/Gratt-5r2/zParser...c/Names_G1.hpp

    G2A:
    https://github.com/Gratt-5r2/zParser.../Names_G2A.hpp

  8. Beiträge anzeigen #48 Zitieren
    Provinzheld Avatar von TopLayer
    Registriert seit
    Nov 2020
    Beiträge
    285
     
    TopLayer ist offline
    Zitat Zitat von F a w k e s Beitrag anzeigen
    For a while now, I have been using files from Union available on GitHub to research both engine functions and classes, for example from Gratt's repository:
    You may find it useful that the new version of the ZenGin API also contains class field offsets:
    https://github.com/Franisz/zUtilitie...ilities/ZenGin

  9. Beiträge anzeigen #49 Zitieren
    Local Hero
    Registriert seit
    Feb 2017
    Beiträge
    270
     
    F a w k e s ist offline
    @TopLayer, cheers! I will check it out

  10. Beiträge anzeigen #50 Zitieren
    Knight Avatar von GenerationLost
    Registriert seit
    Apr 2009
    Ort
    Whereabouts Unknown
    Beiträge
    1.774
     
    GenerationLost ist offline
    So Leude, alle Jahre wieder oder so...

    Grabe mal wieder alte Projekte aus, wühle durch, schüttele mehrmals den Kopf und werfe Dateien und Ordner um mich her...
    Habe auch wieder alte Posts ausgegraben, speziell den hier von Lehona. Bin da wieder an dem Punkt, an dem ich doch gerne die bestehenden Klassen mit Feldern erweitern möchte, sprich Punkt 3 aus dem Post.

    Wie es praktisch gemacht wird, wird daraus bereits klar. Habe sonst nie darüber nachgedacht, aber... wie genau funktioniert das denn unter der Haube? Wir definieren uns eine neue Klasse mit, angenommen erstmal beliebig vielen Feldern, dazu eine Instanz für LeGo und dann... sagen wir Gothic "schreibe mal ein Objekt mit beliebig vielen Bytes an diese eine Stelle, wo normalerweise nur Integer drin stehen". Wenn ich da zurück ein mein Cpp-Trauma denke sehe ich nur noch überschriebenen Speicher und alles geht kaputt.

    Rafft die VM da einfach, wie viel Byte die neue Klasse mit sich bringt und gibt entsprechend Speicher dafür her, oder ist das alles LeGo/Ikarus-Magie? Hält der Int, also hier die AI-Variable einfach die Adresse auf den beliebig großen Speicher? Sollte ich da andere Typen mit verwurschteln wollen (z.B. ein Array von C_NPCs), kriegt das PermMem auf die Reihe oder muss man dafür extra Logik basteln?

    So möge mich Lehona bitte, wie so oft, mal wieder erleuchten

    EDIT:
    Dazu ist mir gerade auch noch etwas Bescheuertes eingefallen. LeGo Talents machen ja im Prinzip schon genau das: Beliebige (integer-)Werte für jeden NPC speichern. Jetzt will ich aber ein Konstrukt mit mehreren zugehörigen Werten speichern. Dafür könnte ich pro Wert ja ein Talent anlegen. Jetzt hätte ich das aber lieber in einer Klasse ordentlich zusammengefasst. Spricht da also etwas gegen, wenn ich eine neue Instanz einer neuen Klasse in den Wert für ein angeletes Talent stecke? Damit ich dann am Ende soetwas habe wie:

    Code:
    class cRP_Skill
    {
    	var int level;		
    	var int exp;		
    	var int exp_next;	
    	var int attribute;	
    	var int type;		
    	var int mastered;	
    };
    
    instance RP_SKILL(cRP_Skill) {};
    
    func void init()
    {
    	var int TAL_Skill_Test; 
    	TAL_Skill_Test = TAL_CreateTalent();
    	TAL_SetValue(hero, TAL_Skill_Test, new(RP_SKILL));
    }
    
    func void levelUpSkill()
    {
    	var cRP_Skill skill;
    	skill = get(TAL_GetValue(hero, TAL_Skill_Test));
    	skill.level += 1;
    }
    Btw wie macht ihr eigentlich immer euer Highlighting in den Code-Blöcken hier? Habt ihr dafür irgendwo nen Generator?
    Geändert von GenerationLost (29.12.2023 um 12:44 Uhr)

  11. Beiträge anzeigen #51 Zitieren
    Dea
    Registriert seit
    Jul 2007
    Beiträge
    10.447
     
    Lehona ist offline
    Einfärbung geht via Farbeimer. Bin ich aber zu faul für :P

    Mit new bekommst du wirklich nur einen Integer (Handle) der einfach hochzählt, darin sind nicht irgendwie die Felder dieser Klasse kodiert oder so. Aber im Hintergrund führt LeGo eine große Tabelle, um einen Pointer zu diesem Handle zu assoziieren. Die Magie besteht nur darin, den "Inhalt" dieses Pointers zu speichern, wenn der Spieler speichert und die entsprechenden Daten zu laden, wenn der Spieler lädt. Die Information dazu, wie man den Inhalt des Pointers speichert zieht LeGo sich aus der Klassendefinition falls nicht weiter angegeben, kennt aber auch ein paar andere Möglichkeiten das zu konfigurieren (String-Konstante oder eigene Serialisierungsfunktion mit der PM API) falls die Klassendefinition nicht genug Informationen enthält.


    Dein Beispiel ist definitiv eine der Möglichkeiten, 'Talents' und PM zu kombinieren. Aber bei deinem Beispiel wirkt es auf mich, als müsstest du diese Informationen nur für den Helden/Spieler speichern, dafür braucht es dann natürlich sowas komplexes nicht.

  12. Beiträge anzeigen #52 Zitieren
    Knight Avatar von GenerationLost
    Registriert seit
    Apr 2009
    Ort
    Whereabouts Unknown
    Beiträge
    1.774
     
    GenerationLost ist offline
    Zitat Zitat von Lehona Beitrag anzeigen
    Einfärbung geht via Farbeimer. Bin ich aber zu faul für :P
    Cooles Tool, nie vorher gesehn, danke!

    Zitat Zitat von Lehona Beitrag anzeigen
    Mit new bekommst du wirklich nur einen Integer (Handle) der einfach hochzählt, darin sind nicht irgendwie die Felder dieser Klasse kodiert oder so. Aber im Hintergrund führt LeGo eine große Tabelle, um einen Pointer zu diesem Handle zu assoziieren. Die Magie besteht nur darin, den "Inhalt" dieses Pointers zu speichern, wenn der Spieler speichert und die entsprechenden Daten zu laden, wenn der Spieler lädt. Die Information dazu, wie man den Inhalt des Pointers speichert zieht LeGo sich aus der Klassendefinition falls nicht weiter angegeben, kennt aber auch ein paar andere Möglichkeiten das zu konfigurieren (String-Konstante oder eigene Serialisierungsfunktion mit der PM API) falls die Klassendefinition nicht genug Informationen enthält.
    Interessant, vielleicht schaue ich da irgendwann mal genauer rein (wenn ich viel Zeit habe ). Also sollte PM dann auch in der Lage sein geschachtelte Klassen zu speichern? In dem von mir verlinkten Post schreibst du ja:
    Zitat Zitat von Lehona
    Solange deine Klasse nur aus einfachen Integern und Strings besteht, musst du dir ums Speichern jetzt keine Gedanken mehr machen.
    Heißt solange die Klasse am Ende der Kette nur Daedalus-"Primitive" hat passt das? Was ist mit Instanz-Feldern, z.B. C_NPC oder C_Item? So gesehen sind diese Klassen ja auch über Daedalus definiert.

    Zitat Zitat von Lehona Beitrag anzeigen
    Dein Beispiel ist definitiv eine der Möglichkeiten, 'Talents' und PM zu kombinieren. Aber bei deinem Beispiel wirkt es auf mich, als müsstest du diese Informationen nur für den Helden/Spieler speichern, dafür braucht es dann natürlich sowas komplexes nicht.
    Ja, blödes Beispiel dafür an der Stelle, aber ging mir nur darum, ob sowas in der Art überhaupt geht, danke für die Bestätigung.

  13. Beiträge anzeigen #53 Zitieren
    Dea
    Registriert seit
    Jul 2007
    Beiträge
    10.447
     
    Lehona ist offline
    Zitat Zitat von GenerationLost Beitrag anzeigen
    Cooles Tool, nie vorher gesehn, danke!
    Ich habe gerade auch noch ein Tool von Kirides gesehen: Daedalus2BBCode.

    Zitat Zitat von GenerationLost Beitrag anzeigen
    Interessant, vielleicht schaue ich da irgendwann mal genauer rein (wenn ich viel Zeit habe ). Also sollte PM dann auch in der Lage sein geschachtelte Klassen zu speichern? In dem von mir verlinkten Post schreibst du ja:

    Heißt solange die Klasse am Ende der Kette nur Daedalus-"Primitive" hat passt das? Was ist mit Instanz-Feldern, z.B. C_NPC oder C_Item? So gesehen sind diese Klassen ja auch über Daedalus definiert.
    Ich glaube ehrlich gesagt nicht, dass man solche Klassen in Gothic überhaupt definieren kann. Bzw. die (z.B.) C_NPC-Felder würden dann nur eine Referenz enthalten und nicht wirklich einen ganzen NPC speichern. Grundsätzlich gilt: Solange es für dich okay ist, wenn vor und nach dem Speichern der selbe Integer an dieser Stelle steht, passiert alles automatisch. Üblicherweise ist das nur ein Problem mit Pointern, die nach Save/Load eben nicht mehr gültig sind.

    Wenn du ein konkretes Beispiel hast kann ich dir vermutlich mehr sagen, ich bin etwas zu eingerostet um die generellen Regeln zu beschreiben.

  14. Beiträge anzeigen #54 Zitieren
    Ehrengarde Avatar von neocromicon
    Registriert seit
    Jan 2019
    Beiträge
    2.548
     
    neocromicon ist gerade online
    Funfact: Wenn man vscode zum Scripten benutzt, braucht man gar kein Tool mehr, er kopiert alle Farben mit ins Forum beim ganz normalen kopieren. ^^

  15. Beiträge anzeigen #55 Zitieren
    Knight Avatar von GenerationLost
    Registriert seit
    Apr 2009
    Ort
    Whereabouts Unknown
    Beiträge
    1.774
     
    GenerationLost ist offline
    Zitat Zitat von Lehona Beitrag anzeigen
    Ich glaube ehrlich gesagt nicht, dass man solche Klassen in Gothic überhaupt definieren kann. Bzw. die (z.B.) C_NPC-Felder würden dann nur eine Referenz enthalten und nicht wirklich einen ganzen NPC speichern. Grundsätzlich gilt: Solange es für dich okay ist, wenn vor und nach dem Speichern der selbe Integer an dieser Stelle steht, passiert alles automatisch. Üblicherweise ist das nur ein Problem mit Pointern, die nach Save/Load eben nicht mehr gültig sind.

    Wenn du ein konkretes Beispiel hast kann ich dir vermutlich mehr sagen, ich bin etwas zu eingerostet um die generellen Regeln zu beschreiben.
    Nee, hab gerade selbst kein Beispiel, frag mich gerade selbst wie ich damals darauf gekommen. Weil im Grunde hast du ja recht, wird eh die Referenz gespeichert, das kann Daedalus ja eh schon, also keine Ahnung woher das kam. Egal, danke dir bis hierhin

    Zitat Zitat von neocromicon Beitrag anzeigen
    Funfact: Wenn man vscode zum Scripten benutzt, braucht man gar kein Tool mehr, er kopiert alle Farben mit ins Forum beim ganz normalen kopieren. ^^
    Code:
    func void SeeIfItWorks()
    {
    	PrintScreen ("Nee, tut er nicht. Da hat necronomicon wohl ein Spezialplugin!", -1, 35, _STR_FONT_ONSCREEN, 2);
    };

  16. Beiträge anzeigen #56 Zitieren
    Ehrengarde Avatar von neocromicon
    Registriert seit
    Jan 2019
    Beiträge
    2.548
     
    neocromicon ist gerade online
    Zitat Zitat von GenerationLost Beitrag anzeigen
    Nee, hab gerade selbst kein Beispiel, frag mich gerade selbst wie ich damals darauf gekommen. Weil im Grunde hast du ja recht, wird eh die Referenz gespeichert, das kann Daedalus ja eh schon, also keine Ahnung woher das kam. Egal, danke dir bis hierhin



    Code:
    func void SeeIfItWorks()
    {
        PrintScreen ("Nee, tut er nicht. Da hat necronomicon wohl ein Spezialplugin!", -1, 35, _STR_FONT_ONSCREEN, 2);
    };
    Code:
    func void SeeIfItWorks()
    {
        PrintScreen ("Doch tut es :P!", -1, 35, _STR_FONT_ONSCREEN, 2);
    };
    
    Wenn man auch das Plugin von Kirides nutzt und keinen Opera Browser.

  17. Beiträge anzeigen #57 Zitieren
    Knight Avatar von GenerationLost
    Registriert seit
    Apr 2009
    Ort
    Whereabouts Unknown
    Beiträge
    1.774
     
    GenerationLost ist offline
    Zitat Zitat von neocromicon Beitrag anzeigen
    Code:
    func void SeeIfItWorks()
    {
        PrintScreen ("Doch tut es :P!", -1, 35, _STR_FONT_ONSCREEN, 2);
    };
    
    Wenn man auch das Plugin von Kirides nutzt und keinen Opera Browser.
    Jap, das Plugin von Kirides und nen Feuerfuchs:
    [Bild: tutEsNichtDoppelpunktP.png]

    "Normales" Kopieren, Strg-C + Strg-V hier ins Nachrichtenfeld. Da passiert bei mir nichts, scheint ja noch irgendwas zu fehlen.

  18. Beiträge anzeigen #58 Zitieren
    Ehrengarde Avatar von neocromicon
    Registriert seit
    Jan 2019
    Beiträge
    2.548
     
    neocromicon ist gerade online
    Zitat Zitat von GenerationLost Beitrag anzeigen
    Jap, das Plugin von Kirides und nen Feuerfuchs:
    [Bild: tutEsNichtDoppelpunktP.png]

    "Normales" Kopieren, Strg-C + Strg-V hier ins Nachrichtenfeld. Da passiert bei mir nichts, scheint ja noch irgendwas zu fehlen.
    Was für einen Browser benutzt du?

  19. Beiträge anzeigen #59 Zitieren
    Knight Avatar von GenerationLost
    Registriert seit
    Apr 2009
    Ort
    Whereabouts Unknown
    Beiträge
    1.774
     
    GenerationLost ist offline
    Zitat Zitat von GenerationLost Beitrag anzeigen
    … und nen Feuerfuchs
    Sorry, dachte nicht dass Firefox einzudeutschen evtl. verwirrt Hab zumindest gehofft das Symbol in der Taskleiste auf dem Screenshot gibt noch Aufschluss

  20. Beiträge anzeigen #60 Zitieren
    Knight Avatar von GenerationLost
    Registriert seit
    Apr 2009
    Ort
    Whereabouts Unknown
    Beiträge
    1.774
     
    GenerationLost ist offline
    Sorry für den Doppelpost, aber hier mal nochmal eine etwas relevantere Frage zum Modding:

    Es gibt ja schon seit langer Zeit Infos zum Anlegen neuer Optionen im Menü.
    Dazu gibt es durch Ikarus auch schon lange die Möglichkeit Tasteneingaben abzufragen:
    Code:
    if(MEM_KeyState(SOME_KEY_CONSTANT) == KEY_PRESSED)
    {
        DoCoolStuff();
    };
    Ich ahne schon, dass es wohl nicht so einfach gehen wird, aber kann man die beiden verheiraten?
    Ich würde gerne in einem Untermenü ein paar Hotkeys frei belegbar machen, allerdings scheint Daedalus da keine einfache Möglichkeit zu bieten, da Tastenzuweisungen wohl durch hardcoded Funktionen gehandled werden:
    Code:
    INSTANCE MENU_ITEM_KEY_UP(C_MENU_ITEM_DEF)
    {
        text[0]	= "Vorwärts";
        text[1]	=  "Taste ENTF zum Löschen und RETURN zum definieren"; // Kommentar
        // ...
        onSelAction[0] = SEL_ACTION_EXECCOMMANDS; // = 7; // -> dynamic build in func.
        onSelAction_S[0] = "RUN MENU_ITEM_INP_UP";
        // ...
    };
    "EXECCOMMANDS" mit "RUN some_identifier" sieht mir nach irgend einer Engine-Funktion aus, vom Naming her korrespondiert auch nichts direkt mit den .ini-Einträgen in der Keys-Sektion.

    Hat sowas schon jemand gemacht oder ist die Konvention bisher einfach immer gewesen, dass einfach Hard-scripted Tasten genutz werden müssen?

    EDIT:
    Ist mal wieder typisch... Eine Minute nach Posten hab ich die Lösung gefunden
    Code:
    INSTANCE MENU_ITEM_INP_UP(C_MENU_ITEM_DEF) // der Identifier für das RUN command
    {
        backPic = MENU_KBDINPUT_BACK_PIC;
        text[1] 	=  "Gewünschte Taste betätigen.";
    	
        type = 	MENU_ITEM_INPUT;
        // ...
        onChgSetOption = "keyUp"; // entspricht den .ini-Einträgen
        onChgSetOptionSection = "KEYS";
        // ...
    };
    Hab den Identifier erst nicht gefunden und dachte, der wäre irgendwo hardcoded. Naja, so hab ich es zumindest hier nochmal dokumentiert.

    EDIT 2:
    Hm, scheint doch nicht so einfach zu funktionieren. Dabei habe ich eine Einstellung einfach Kopiert und die Identifier angepasst. Es wird zwar angezeigt, aber es kann kein Wert zugewiesen werden, es passiert einfach nichts mit dem Eintrag beim Drücken auf Enter, also kein Eingabeprompt wie bei den normalen Keybindings. Auch die Vorbelegung durch manuelles Anlegen des .ini-Eintrags (in eigener Sektion, nicht in [KEYS], evtl. liegt da schon das Problem) funktioniert zwar insofern, dass ein Wert angezeigt wird, allerdings der Hex-Wert, wird also nicht in eine Taste umgewandelt.

    EDIT 3:
    Die Suche ging weiter, es funktioniert wohl nur, wenn man neue Tastenzuweisungen im dazugehörigen Menü-Unterpunkt (menu_opt_controls.d) hinzufügt. Hierbei wird die Sektion für den .ini-Eintrag ignoriert und IMMER nach KEYS geschrieben.

    Jetzt aber einen Schritt weiter, wenn ich die Option auslesen wollen würde, müsste ich MEM_GetGothOpt benutzen, was mir einen String zurückgibt. Damit kann aber MEM_KeyState nichts anfangen, da es einen Integer erwartet. Die Ikarus-Konstanten für Tasten sind auch keine Hex-Werte, wie sie in der .ini vorkommen wie es scheint. Zudem kenne ich keine Funktion zum Parsen von Strings nach Int, was aber eh hinfällig wäre, wenn ich einen Hex-Wert einlese, mit dem MEM_KeyState auch wieder nichts anfangen kann, wenn es eine andere Key-Konstante erwartet.
    Geändert von GenerationLost (03.01.2024 um 11:49 Uhr)

Seite 3 von 4 « Erste 1234 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