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

 

Ergebnis 1 bis 11 von 11
  1. Beiträge anzeigen #1 Zitieren
    Waldläufer
    Registriert seit
    May 2022
    Beiträge
    121
     
    Jackydima ist offline

    Gothic 3 Debuggen

    Hallo liebe Community,

    hat sich jemand zufällig schon etwas mit der inneren Struktur von dem Spiel beschäftigt.
    Ich wollte zum Spaß etwas am der Schadensmodelierung, hauptsächlich der NPCs arbeiten.

    Es gibt ja schon ein Thread der beschreibt wie die detaillierte Schadenberechnung zu Stande kommt. Ich wollte ein paar Modifikationen/Patches einbringen die diese Berechnung etwas ändert. An welcher Stelle im G3 Code kann ich hier suchen. Bislang habe ich im G3.exe und in der Script_Game.dll gesucht, aber der Code von der Engine ist mega kompliziert aufgebaut.

    Kann einer der schon daran was gemacht hat, zum Beispiel die Leute, die am Community Patch daran gearbeitet haben, mir hierbei helfen, an den richtigen Stellen zu suchen.

    Schon mal Danke im Vorraus!

  2. Beiträge anzeigen #2 Zitieren
    Moderator Avatar von MadFaTal
    Registriert seit
    May 2010
    Beiträge
    3.631
     
    MadFaTal ist offline
    Schaue dir das Gothic 3 SDK an, das wird dir vermutlich am meisten helfen.
    Ich verschiebe das Thema in den Bereich Gothic 3 - Editing und Modifikationen. Dort ist es besser aufgehoben.

  3. Beiträge anzeigen #3 Zitieren
    Moderator Avatar von George
    Registriert seit
    Sep 2010
    Beiträge
    684
     
    George ist offline
    Zitat Zitat von Jackydima Beitrag anzeigen
    Bislang habe ich im G3.exe und in der Script_Game.dll gesucht, aber der Code von der Engine ist mega kompliziert aufgebaut.
    Script_Game.dll ist hier definitiv der richtige Ort für derartige Änderungen. Die beiden zentralen Skript-Funktionen für die Schadensberechnung dürften DoLogicalDamage und AssessHit (wird von DoLogicalDamage aufgerufen) sein.
    DoLogicalDamage findest du an RVA 0xB4F50, AssessHit an RVA 0x2B580

    Ich habe AssessHit als reverse engineerten C++ Code rumliegen, kann ich heute Abend zur Verfügung stellen.

  4. Beiträge anzeigen #4 Zitieren
    Waldläufer
    Registriert seit
    May 2022
    Beiträge
    121
     
    Jackydima ist offline
    Jo, danke erstmals für die schnellen Antworten


    Ich schau mir später noch mal das Gothic 3 SDK an.

    An George:
    Danke nochmals für die Rückmeldung. Bislang habe ich nur über Ghidra den Code der dll reverseengeneered, wobei ich sagen muss, dass ich auch da noch nicht so richtig viel Erfahrung habe, oder zumindest an falschen Stellen suchte.
    Ansonsten habe ich als Debugger Cheat Engine oder x32 benutzt, bin aber an den vielen externen dll-Verlinkungen der Funktionen etwas verwirrt worden. Im Debugger bin ich durch sehr viel anderen Code durchgegangen, habe aber auch vermutlich nicht komplett die richtige Stelle gefunden. Zumindest die AssessHit Funktion habe ich entdeckt als ich nach Damage reverse behandelten Funktionen gesucht habe.

    Habe bislang zumindest nicht die Stellen gefunden, an denen Entschieden wird wo die Schadensmultiplikatoren für NPC vs NPC sind oder wo an sich die Berechnung im Thread über die Schadensmodelierung steht.

    PS:
    Hab noch nicht Rausgefunden, wie man Zitate einbaut

  5. Beiträge anzeigen #5 Zitieren
    Moderator Avatar von George
    Registriert seit
    Sep 2010
    Beiträge
    684
     
    George ist offline
    Wie versprochen, hier die reverse engineerte AssessHit-Funktion, wurde größtenteils von meinem CSP-Kollegen Feyn reversed.
    Angehängte Dateien

  6. Beiträge anzeigen #6 Zitieren
    Waldläufer
    Registriert seit
    May 2022
    Beiträge
    121
     
    Jackydima ist offline
    Zitat Zitat von George Beitrag anzeigen
    Wie versprochen, hier die reverse engineerte AssessHit-Funktion, wurde größtenteils von meinem CSP-Kollegen Feyn reversed.
    Vielen Dank, ist auch sehr schön dokumentiert und kann es auch mit dem C code vom Ghidra gut abgleichen

  7. Beiträge anzeigen #7 Zitieren
    Just arrived
    Registriert seit
    Dec 2022
    Beiträge
    1
     
    wqnnqwqn ist offline

    Post About Compiling

    Thank you very much for the information!

    I am very new to the community. Recently, When I tried to compile it with G3 SDK, it tried to throw me this error that IsSpellContainer(and other functions) is not found. Could you give me a hint about how to compile it?

    ---------------------------------------------


    Ich bin sehr neu in der Gemeinschaft. Kürzlich, Als ich versuchte, es mit G3 SDK zu kompilieren, versuchte es, mich diesen Fehler zu werfen, dass IsSpellContainer (und andere Funktionen) nicht gefunden wird. Könnten Sie mir einen Tipp geben, wie ich es kompilieren kann?

  8. Beiträge anzeigen #8 Zitieren
    Moderator Avatar von George
    Registriert seit
    Sep 2010
    Beiträge
    684
     
    George ist offline
    Zitat Zitat von wqnnqwqn Beitrag anzeigen
    Thank you very much for the information!

    I am very new to the community. Recently, When I tried to compile it with G3 SDK, it tried to throw me this error that IsSpellContainer(and other functions) is not found. Could you give me a hint about how to compile it?

    ---------------------------------------------


    Ich bin sehr neu in der Gemeinschaft. Kürzlich, Als ich versuchte, es mit G3 SDK zu kompilieren, versuchte es, mich diesen Fehler zu werfen, dass IsSpellContainer (und andere Funktionen) nicht gefunden wird. Könnten Sie mir einen Tipp geben, wie ich es kompilieren kann?

    Ah sorry, I forgot to mention the functions bindings that were added to ScriptUtil.

    ScriptUtil.h
    Code:
    GEBool              IsNormalProjectile( Entity a_Entity );
    GEBool              IsSpellContainer( Entity a_Entity );
    // GetWeaponPerkBonus
    //  NPC
    //     Level >= 45: 3
    //     Level >= 30: 2
    //     Level >= 15: 1
    //     Sonst: 0
    //
    // Player
    //     Perk_*_3: 2
    //     Perk_*_2: 1
    //     Sonst: 0
    
    // Grundwert + GetWeaponPerkBonus(Fighter)
    //     QuickAttack: 0
    //     Attack, SimpleWhirl, WhirlAttack, PierceAttack, GetUpAttack: 2
    //     PowerAttack, SprintAttack: 3 - (PropertyStatePosition < 2)
    //     HackAttack: 4
    GEInt               GetActionWeaponLevel(Entity a_DamageOwner, gEAction a_DamagerOwnerAction);
    
    // - GetUpParade: 2
    // - Hat Shield (und kann Perk_Shield_2, wenn Victim == Player): WeaponPerkBonus(Victim) + 1
    // - Sonst: WeaponPerkBonus(Victim)
    GEInt               GetShieldLevelBonus(Entity a_Victim);
    GEInt               DamageTypeEntityTest(Entity a_Victim, Entity a_Damager);
    GEBool              IsMagicProjectile(Entity a_Entity);
    GEBool              CheckHandUseTypes(gEUseType a_LeftUseType, gEUseType a_RightUseType, Entity a_Fighter);
    gEWeaponCategory    GetHeldWeaponCategory(Entity a_Entity);



    ScriptUtil.cpp
    Code:
    GEBool IsNormalProjectile(Entity a_Entity)
    {
        typedef GEBool(GE_STDCALL *mFIsNormalProjectile)(Entity);
        static mFIsNormalProjectile s_fIsNormalProjectile = force_cast<mFIsNormalProjectile>(RVA_ScriptGame(0x2AF70));
    
        return s_fIsNormalProjectile(a_Entity);
    }
    
    GEBool IsSpellContainer(Entity a_Entity)
    {
        typedef GEBool(GE_STDCALL *mFIsSpellContainer)(Entity);
        static mFIsSpellContainer s_fIsSpellContainer = force_cast<mFIsSpellContainer>(RVA_ScriptGame(0x2AEB0));
    
        return s_fIsSpellContainer(a_Entity);
    }
    
    GEInt GetActionWeaponLevel(Entity a_DamageOwner, gEAction a_DamagerOwnerAction)
    {
        typedef GEInt(GE_STDCALL *mFGetActionWeaponLevel)(Entity);
        static mCCaller CallGetActionWeaponLevel(mCCaller::GetCallerParams(RVA_ScriptGame(0x2B3A0), mCRegisterBase::mERegisterType_Eax));
    
        CallGetActionWeaponLevel.SetImmEax(a_DamagerOwnerAction);
        return CallGetActionWeaponLevel.GetFunction<mFGetActionWeaponLevel>()(a_DamageOwner);
    }
    
    GEInt GetShieldLevelBonus(Entity a_Victim)
    {
        typedef GEInt(GE_STDCALL *mFGetShieldLevelBonus)(Entity);
        static mFGetShieldLevelBonus s_fGetShieldLevelBonus = force_cast<mFGetShieldLevelBonus>(RVA_ScriptGame(0x2B470));
    
        return s_fGetShieldLevelBonus(a_Victim);
    }
    
    GEInt DamageTypeEntityTest(Entity a_Victim, Entity a_Damager)
    {
        typedef GEInt(GE_STDCALL *mFDamageTypeEntityTest)(Entity, Entity);
        static mFDamageTypeEntityTest s_fDamageTypeEntityTest = force_cast<mFDamageTypeEntityTest>(RVA_ScriptGame(0x7250));
    
        return s_fDamageTypeEntityTest(a_Victim, a_Damager);
    }
    
    GEBool IsMagicProjectile(Entity a_Entity)
    {
        typedef GEBool(GE_STDCALL *mFIsMagicProjectile)(Entity);
        static mFIsMagicProjectile s_fIsMagicProjectile = force_cast<mFIsMagicProjectile>(RVA_ScriptGame(0x2AF20));
    
        return s_fIsMagicProjectile(a_Entity);
    }
    
    GEBool CheckHandUseTypes(gEUseType a_LeftUseType, gEUseType a_RightUseType, Entity a_Fighter)
    {
        typedef GEBool(GE_STDCALL *mFCheckHandUseTypes)(gEUseType, gEUseType, Entity);
        static mFCheckHandUseTypes s_fCheckHandUseTypes = force_cast<mFCheckHandUseTypes>(RVA_ScriptGame(0x40F0));
    
        return s_fCheckHandUseTypes(a_LeftUseType, a_RightUseType, a_Fighter);
    }

  9. Beiträge anzeigen #9 Zitieren
    Waldläufer
    Registriert seit
    May 2022
    Beiträge
    121
     
    Jackydima ist offline
    Cool, danke nochmals George

    Hat mir sehr geholfen, habe aber bislang noch nichts mit dem SDK gemacht.

    Ich wollte nur nochmals mit ein paar Balancing Dingen rumprobieren und habe erstmals mit Cheat Engine einen Prototypen Spiel-Baukasten gebaut, mit denen ich einzelne Modifikationen (im Rahmen von Multiplikatoren gerade) zur Schadensberechnung und Abwehrberechnung dynamisch verwalten kann, ohne das Spiel zu schließen oder halt sonst das Spiel zu recompilen.


    Was ich noch sehr gerne machen und einfügen würde, wäre eine Modifikation einzubauen, die den Attributs-Bonusschaden von denjenigen Waffen die Geschicklichkeit, bzw. Intelligenz benötigen ändert.

    Der grobe Gedanke hierbei ist, dass zum Beispiel reine Geschicklichkeitsbuilds im Nahkampf mit einer Waffe, welche (hohe) Geschicklichkeitswerte benötigt, wie ein Katana, Mondklinge usw., den Bonus nicht in Rahmen der normalen STR / 2 bekommen, sondern beispielsweiße so aussehen soll: STR/4 + DEX/4. Und bei Magierstäbe (oder Magischen Schwertern) wäre es dementsprechend genauso ähnlich mit INT.

    Hierbei wäre es am einfachsten vermutlich die Waffen-Templates zu untersuchen, und die Attributsanforderungen von Waffen zu analysieren. => Wenn eine Nahkampfs-Waffe Geschicklichkeit, oder Intelligenz benötigt wird dementsprechend die neue Bonuskalkulation genommen.

    Woran ich auch gearbeitet habe, waren die meisten Templates von NPC und Monstern anzupassen (levelmäßig) (vor allem von Elite NPCs) und ein paar neue Beschwörungszauber einzubauen (Golemarten+Untote) + die Schadendebuffs von Monstern gegen Humanoide NPCs (weil ich Chaos liebe und eh schon alles in Gothic 3 gesehen habe).

  10. Beiträge anzeigen #10 Zitieren
    Waldläufer
    Registriert seit
    May 2022
    Beiträge
    121
     
    Jackydima ist offline
    Ich schaffe es leider nicht selber über die Debugger und Live Patching in der AssessHit die Waffen Item Werte (Attributen Vorrausetzungen) über die Schadensquelle vom Player herauszufinden.

    Kann mir hierbei jemand helfen?

    Habe auch mal im G3-SDK geschaut, aber nicht so viel gefunden was ich in der AssessHit nutzen könnte.


    EDIT:

    Anders gesagt, wo kann ich die Attribute finden die Vorausgesetzt werden für die gerade ausgerüsteten Waffen des Helden?
    Geändert von Jackydima (02.01.2023 um 18:53 Uhr)

  11. Beiträge anzeigen #11 Zitieren
    Waldläufer
    Registriert seit
    May 2022
    Beiträge
    121
     
    Jackydima ist offline
    Ich wollte nur mal mitteilen, dass ich das Problem selber geschafft habe die letzten Tage. Hatte nur einen blöden Denkfehler beim betrachten Generischer Funktionen.

    Habe auch meinen Bauspielkasten fertig gebaut und schon ein paar Tests gemacht. Läuft supi

    Möglich ist nun das Ändern von Skalierungen von jedem Schadens/Schutz Parameter, der mir wichtig ist, plus das ändern von Bonus schaden eines Attributs, entsprechen der genutzten Waffen (Doppel 1H, Stab und Waffen die andere Attributs-Anforderungen als STR nutzen.


    Danke!

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