Ergebnis 1 bis 5 von 5
  1. #1 Zitieren
    General Avatar von tombom81
    Registriert seit
    Jun 2015
    Beiträge
    3.127
    Wie der Name schon sagt, wollte ich die GameEvents eines ELEX SaveData-Savegamefiles loggen. Die Gameevents in der w_info.hdr(doc) sind boolsche Flags (0= false, 1= true), die den Ablauf der Story steuern (dadurch, dass eine bestimmte Dialogoption z.B. erst verfügbar ist oder eine Aktion erst ausgelöst wird, wenn der entsprechende Gameevent auf "true" gesetzt wurde). Leider hat PB in ELEX viele Gameevents mit "Name_Choice(Nummer)" benannt, so dass es dann ziemlich umständlich ist, ihre Auswirkung festzustellen (anders als bei "Ragnar_WasOnceTalkedTo = false" z.B.).

    Erstes Resultat:
    Spoiler:(zum lesen bitte Text markieren)
    fnd: 0x9F0975
    Weaponsmith_Angrim_BSK_GotTradeStuff_Rank_0 1
    Ulbricht_LeaderOfHisBattle_PermNews 1
    Tutorial_UseYourQuestlog 1
    Sinda_Introduction 0
    Sinda_HasProblems 0
    Sinda_GotTradeStuff_Rank_0 1
    Sinda_Choice4 0
    Ragnar_WasOnceTalkedTo 0
    Ragnar_LawAndOrder 0
    Ragnar_Choice1b 0
    Ragnar_Choice1a 0
    Ragnar_Choice1 0
    Player_FirstRuin 1
    Player_FirstOldTechnology 1
    Player_FirstExitOfObservationStation 1
    Player_FirstEmotions 1
    Player_FirstBerserkerTerritory 1
    PlayerTriggered_Elevator_Evacuationvoice 1
    PlayerTriggered_CSMeetFirstFighter 1
    PlayerTriggered_CSFirstLookOnEdan 1
    Ornir_ToldFromQuest 0
    Ornir_PlayerDonstKnowsLaw 0
    Ornir_KnowsPlayer 0
    Ornir_HisDuties 0
    Ornir_HasProblem 0
    Ornir_Choice2b 0
    Ornir_Choice2a 0
    Ornir_Choice1 0
    Orik_HisDuties 0
    Orik_Choice1 0
    NONE 1
    Loyalty_Duras 114
    Lennart_NeedsBowBack 0
    Lennart_LostHisBow 0
    Lennart_Choice2 0
    Lennart_Choice1 0
    Jora_NeedsMechanicalStuff 0
    Jora_GoToConverter 0
    Jora_Choice3a 0
    Jora_Choice3 0
    Jora_Choice2 0
    Jora_Choice1a 0
    Jora_Choice1 0
    Irdor_NeedsFood 0
    Irdor_CollectSomeFood 0
    Irdor_Choice4 0
    Irdor_Choice3 0
    Irdor_Choice1 0
    InteractCombatMode 0
    Hakon_Choice1 0
    Goliet_CrimeReport 0
    Geron_HisDuties 0
    Geron_GotTradeStuff_Rank_0 1
    Geron_Choice1 0
    Duras_WhoWasMurdered 0
    Duras_TwoWaysNow 0
    Duras_ReadyToTalkAboutSeparatists 0
    Duras_OffersMurderQuest 0
    Duras_OffersGuide4 0
    Duras_OffersGuide3 0
    Duras_OffersGuide1 0
    Duras_HisDuties 0
    Duras_Choice6 0
    Duras_Choice4a 0
    Duras_Choice4 0
    Duras_Choice3a 0
    Duras_Choice3 0
    Duras_Choice2a 0
    Duras_Choice2 0
    Duras_Choice1 0
    Duras_Candidates 0
    DurasReadyForTutorial 0
    Drog_ToldFromRagnar 0
    Drog_ThoraldThere 0
    Drog_GolietWorkingMarket 0
    Drog_Choice2 0
    CrewComment_PlayerActionGood1 1
    CrewComment_PlayerActionBad1 1
    CrewComment_LocationOld1 1
    CrewComment_LocationGood1 1
    CrewComment_LocationBad1 1
    Caldrim_ToldAboutElexConversion 0
    Caldrim_FeelsMana 0
    Caldrim_Choice2b 0
    Caldrim_Choice2a 0
    CSMeetFirstFighter 1
    CSFirstLookOnEdan 1
    Born_NoMoreMutants 0
    Born_NeedsHealingRoots 0
    Born_HisDuties 0
    Born_GavePlayerOrders 0
    Born_Choice5 0
    Born_Choice3 0
    Born_Choice1 0
    Bertram_Choice5 0
    Barin_ThoraldThere 0
    Barin_ThoraldPilgerNow 0
    Barin_ThoraldElexManaStuff 0
    BSK_PositivePoints 1
    IKENI7_01795 18

    btw: "Loyalty_Duras 114" z.B. ist natürlich eher kein Gameevent, sondern eine normale Variable mit dem Wert 114. Wenn Duras einen verlassen sollte, falls dieser Wert zu gering wird, kann man ihn natürlich wieder als "Flag" (mit Grenzwertcharakter) ansehen.
    "in der Erkundung dieser weiten und wunderbaren Welt" (post #70, höre link unten)
    TAS for Elex 2 at ELEX II Nexus - Mods and Community (nexusmods.com)
    Umsturz bei den Morkons: best PB quest ever!
    "Hört mir bloß auf mit "Stormson".
    "In Toussaint wird schon für kleinere Schmähungen als diese Satisfaktion verlangt."
    Genug der "Blumensträuße". Ich WILL MadBob! Beugt die Realität!
    tombom81 ist offline

  2. #2 Zitieren
    General Avatar von tombom81
    Registriert seit
    Jun 2015
    Beiträge
    3.127
    So, hat tatsächlich 2 Wochen gedauert, bis ich endlich mal wieder etwas Zeit gefunden habe für das Projekt. Aus dem thread um die "Spieldauer" habe ich die Idee mitgebracht, den Questverlauf aus den savegames rauszuholen. Ist leider schwieriger als erst gedacht wegen der binären Daten, siehe Bild.
    ASCII-mäßig geht's ganz gut, vielleicht kann ich den Binärkrams ja erstmal ignorieren:
    Spoiler:(zum lesen bitte Text markieren)
    Quest count= 749
    0. Player_ReportGarbageWar 2
    Substrings: 0


    1. Detlef_KillHim 2
    Substrings: 1
    Detlef, gEQuestActor_Target


    2. Hakon_Berserker_ReportSuddenDeathOfNezol 2
    Substrings: 1
    Hakon, gEQuestActor_Target


    3. Connor_BringHimMeat 2
    Substrings: 0


    4. Player_CollectElisStuff 2
    Substrings: 0
    2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    5. Richard_PayDebts 2
    Substrings: 1
    Richard, gEQuestActor_Client 0000


    6. Ike_ReadyForArenaFight 2
    Substrings: 1
    Ike, gEQuestActor_Target


    7. Player_CollectPBFoto20 2
    Substrings: 0


    8. Ragnar_Endgame 2
    Substrings: 1
    Ragnar, gEQuestActor_Target


    9. Logan_KillKonrad 2
    Substrings: 1
    Konrad, gEQuestActor_Target


    10. Player_FindGoodStuff 2
    Substrings: 3
    Ragnar, gEQuestActor_Target
    William, gEQuestActor_Target
    Reinhold, gEQuestActor_Target


    11. Player_CollectGaurudium 2
    Substrings: 1
    It_Misc_Gaurudium_Falk, gEQuestActor_Target


    12. Player_KillMainBanditForKLETrader 2
    Substrings: 0
    1 0 0 0 1 0 0 0 0 0 0 0
    13. Alrik_BringHimSword 2
    Substrings: 2
    Alrik, gEQuestActor_Client 0000
    It_Swd_1h_BSK_Sword_Ragnar, gEQuestActor_Target


    14. Player_FindBarinsCasket 2
    Substrings: 1



    [Bild: ELEX_savegame_analyse_1.jpg]

    Die whatever-structs konnte ich überspringen; so sieht schon ganz gut aus:
    Spoiler:(zum lesen bitte Text markieren)
    14. Player_FindBarinsCasket [2] 0E10: 2
    Substrings: 1
    structs: 22
    It_Con_Casket_Barin, gEQuestActor_Target


    15. Ragnar_ReportBanditAmbush [2]
    Substrings: 2
    Ragnar, gEQuestActor_Client 0000
    Thorgal, gEQuestActor_Target


    16. Ray_ForAHandFullOfShards [2]
    0E10: 1
    Substrings: 2
    structs: 46
    Ray, gEQuestActor_Client 0000
    Wyatt, gEQuestActor_Target


    17. Smoke_DuelHim [2]
    Substrings: 1
    Smoke, gEQuestActor_Client 0000
    "in der Erkundung dieser weiten und wunderbaren Welt" (post #70, höre link unten)
    TAS for Elex 2 at ELEX II Nexus - Mods and Community (nexusmods.com)
    Umsturz bei den Morkons: best PB quest ever!
    "Hört mir bloß auf mit "Stormson".
    "In Toussaint wird schon für kleinere Schmähungen als diese Satisfaktion verlangt."
    Genug der "Blumensträuße". Ich WILL MadBob! Beugt die Realität!
    tombom81 ist offline Geändert von tombom81 (02.10.2018 um 00:04 Uhr)

  3. #3 Zitieren
    General Avatar von tombom81
    Registriert seit
    Jun 2015
    Beiträge
    3.127
    Der Ansatz, den Savegame Gameevent Logger zu einem Questlogger zu erweitern, ist erstmal versandet beim Versuch, die Completed Quests zu finden.

    Daher wandte ich mich wieder den Dialogen (in der w_info.hdrdoc) zu, und zwar denen, die gewissen Einschränkungen unterliegen, aber nicht über InfoConditions konditioniert sind.

    146 (von 7679) infos erfordern nämlich einen Skill/Perk, ohne den die entsprechende Dialogoption nicht aktiviert werden kann.

    Code:
                    class bTObjArray<class gCRequiredPerk> RequiredPerks = [
                        class gCRequiredPerk {
                            Version = 1;
                            Properties {
                                enum gESkill Perk = gESkill_Perk_Suggestion;
                                int Value = 1;
                                bool InvertTest = False;
                            }
                            ClassData {
                            }
                        }
    26 x Skill_Personality
    22 x Skill_Survival
    21 x Skill_Combat
    19 x Skill_Crafting

    24 x Skill_Soul

    28 x Perk_Suggestion
    Summe: 140, 6 noch nicht gefunden

    Weitere 3 Perk_Suggestion als InfoCondition realisiert (hier aber enum gESkill Skill!):
    ------------------------------------------------------------

    Code:
    class gCSkillValue SkillValue = class gCSkillValue {
        Version = 1;
        Properties {
            int Amount = 1;
            enum gESkill Skill = gESkill_Perk_Suggestion;
            bool InvertTest = False;
        }
    
    }
    Bei Gelegenheit suche ich noch die zugehörigen Dialoge raus, so dass man einen Überblick gewinnt, welche Perks (und amount) man für bestimmte NPC-Dialogoptionen benötigt.

    edit: wenigstens für Skill_Soul wollte ich es mal gemacht haben:

    Kältewert maximal 49:

    Spoiler:(zum lesen bitte Text markieren)
    215 "PANKRATZI7_00730" { "Thorald";
    enum gESkill Perk = gESkill_Soul;
    int Value = 49;
    bool InvertTest = True;
    "Den Hybriden zu vernichten scheint mir der einzige Weg zu sein, um diese Welt zu retten."

    774 "PANKRATZI7_00742" { "Wardek";
    enum gESkill Perk = gESkill_Soul;
    int Value = 49;
    bool InvertTest = True;
    "SO nennst du das? Du Schwein hast unser LEBEN zerstört... ALB!"

    811 "PANKRATZI7_00770" { "Harley";
    enum gESkill Perk = gESkill_Soul;
    int Value = 49;
    bool InvertTest = True;
    "Der Gleiter ist die einzige Chance, die freien Menschen vor dem bevorstehenden Angriff der Albs zu retten."

    1769 "PANKRATZI7_00678" { "Ulbricht";
    enum gESkill Perk = gESkill_Soul;
    int Value = 49;
    bool InvertTest = True;
    "Das Risiko, dass der oberste Judikator fällt, ist zu groß. Bleib hier und kämpfe mit uns zusammen."

    2016 "PANKRATZI7_01260" { "Zardom";
    enum gESkill Perk = gESkill_Soul;
    int Value = 49;
    bool InvertTest = True;
    "Du wirst jetzt bezahlen für deinen Verrat."

    2967 "PANKRATZI7_00819" { "Hybrid";
    enum gESkill Perk = gESkill_Soul;
    int Value = 49;
    bool InvertTest = True;
    "DEINE Art ist gnadenlos und schlachtet Menschen ab."

    2981 "PANKRATZI7_00232" { "Sestak";
    enum gESkill Perk = gESkill_Soul;
    int Value = 49;
    bool InvertTest = True;
    "Ich gehöre nicht mehr zum Volk der Albs."

    3304 "PANKRATZI7_00762" { "Kallax";
    enum gESkill Perk = gESkill_Soul;
    int Value = 49;
    bool InvertTest = True;
    "Du bist mein BRUDER. Auch wenn es nur eine Lüge ist, haben wir doch ein ganzes Leben zusammen verbracht."

    3643 "PANKRATZI7_00332" { "Zardom";
    enum gESkill Perk = gESkill_Soul;
    int Value = 49;
    bool InvertTest = True;
    "Das Risiko würde ich eingehen."

    5333 "PANKRATZI7_00771" { "Harley";
    enum gESkill Perk = gESkill_Soul;
    int Value = 49;
    bool InvertTest = True;
    "Du tust, was ich dir sage oder ich schnalle dich beim Start vor meinen Antrieb."

    5390 "PANKRATZI7_00830" { "Hybrid";
    enum gESkill Perk = gESkill_Soul;
    int Value = 49;
    bool InvertTest = True;
    "Ich glaube dir kein Wort."

    7190 "PANKRATZI7_00370" { "Sestak";
    enum gESkill Perk = gESkill_Soul;
    int Value = 49;
    bool InvertTest = True;
    "Der Hybrid muss weg. Eine andere Möglichkeit sehe ich nicht."

    7456 "PANKRATZI7_01164" { "Tarek";
    enum gESkill Perk = gESkill_Soul;
    int Value = 49;
    bool InvertTest = True;
    "Du bist verblendet. Der Hybrid hat deinen Geist vernebelt."





    Kältewert mindestens 50

    Spoiler:(zum lesen bitte Text markieren)
    326 "PANKRATZI7_00763" { "Kallax";
    enum gESkill Perk = gESkill_Soul;
    int Value = 50;
    bool InvertTest = False;
    "Irgendetwas stimmt nicht mit dem Hybriden. Das ist SO offensichtlich, dass selbst DU das einsehen musst."

    1460 "PANKRATZI7_01166" { "Tarek";
    enum gESkill Perk = gESkill_Soul;
    int Value = 50;
    bool InvertTest = False;
    "Richtig. Doch müssen wir einige Modifizierungen vornehmen."

    1902 "PANKRATZI7_00824" { "Hybrid";
    enum gESkill Perk = gESkill_Soul;
    int Value = 50;
    bool InvertTest = False;
    "Wenn das so ist, wann werde ich die nächste Evolutionsstufe erreichen?"

    2311 "PANKRATZI7_00744" { "Wardek";
    enum gESkill Perk = gESkill_Soul;
    int Value = 50;
    bool InvertTest = False;
    "Die Vergangenheit ist irrelevant. Wenn wir erfolgreich sein wollen, müssen wir WEITERMACHEN."

    2336 "PANKRATZI7_00772" { "Harley";
    enum gESkill Perk = gESkill_Soul;
    int Value = 50;
    bool InvertTest = False;
    "Nenn mir deinen Preis."

    2394 "PANKRATZI7_00831" { "Hybrid";
    enum gESkill Perk = gESkill_Soul;
    int Value = 50;
    bool InvertTest = False;
    "Du bist wahrlich ein perfektes Wesen, wenn du all das vorausgesehen hast."

    2940 "PANKRATZI7_00788" { "Sestak";
    enum gESkill Perk = gESkill_Soul;
    int Value = 50;
    bool InvertTest = False;
    "Nichts, was ich bisher hier draußen fand, hat je meine Loyalität zum Hybriden verändert."

    3554 "PANKRATZI7_01262" { "Zardom";
    enum gESkill Perk = gESkill_Soul;
    int Value = 50;
    bool InvertTest = False;
    "Ich werde nicht gegen dich kämpfen.."

    4765 "PANKRATZI7_00677" { "Ulbricht";
    enum gESkill Perk = gESkill_Soul;
    int Value = 50;
    bool InvertTest = False;
    "Effektivität muss unser Handeln bestimmen. Geh mit Reinhold und beschäftige das Hauptheer, bis wir da sind."

    7334 "PANKRATZI7_00728" { "Thorald";
    enum gESkill Perk = gESkill_Soul;
    int Value = 50;
    bool InvertTest = False;
    "Für mich ist der Hybrid IMMER noch die Krone der Schöpfung."

    7515 "PANKRATZI7_00233" { "Sestak";
    enum gESkill Perk = gESkill_Soul;
    int Value = 50;
    bool InvertTest = False;
    "Der Stärkere wird gewinnen."
    "in der Erkundung dieser weiten und wunderbaren Welt" (post #70, höre link unten)
    TAS for Elex 2 at ELEX II Nexus - Mods and Community (nexusmods.com)
    Umsturz bei den Morkons: best PB quest ever!
    "Hört mir bloß auf mit "Stormson".
    "In Toussaint wird schon für kleinere Schmähungen als diese Satisfaktion verlangt."
    Genug der "Blumensträuße". Ich WILL MadBob! Beugt die Realität!
    tombom81 ist offline Geändert von tombom81 (03.12.2018 um 19:35 Uhr)

  4. #4 Zitieren
    Abenteurer Avatar von Feyn
    Registriert seit
    Dec 2016
    Beiträge
    68
    Zitat Zitat von tombom81 Beitrag anzeigen
    Wie der Name schon sagt, wollte ich die GameEvents eines ELEX SaveData-Savegamefiles loggen. Die Gameevents in der w_info.hdr(doc) sind boolsche Flags (0= false, 1= true), die den Ablauf der Story steuern (dadurch, dass eine bestimmte Dialogoption z.B. erst verfügbar ist oder eine Aktion erst ausgelöst wird, wenn der entsprechende Gameevent auf "true" gesetzt wurde). Leider hat PB in ELEX viele Gameevents mit "Name_Choice(Nummer)" benannt, so dass es dann ziemlich umständlich ist, ihre Auswirkung festzustellen (anders als bei "Ragnar_WasOnceTalkedTo = false" z.B.).
    Schönes Projekt!
    Die nichtssagenden GameEvent-Namen sind mir auch schon aufgefallen - ich habe mich in letzter Zeit mit einem verwandten Projekt beschäftigt (ein Info und Quest Editor).
    Hast du in der Richtung auch schon etwas unternommen?
    Feyn ist offline

  5. #5 Zitieren
    General Avatar von tombom81
    Registriert seit
    Jun 2015
    Beiträge
    3.127
    Zitat Zitat von Feyn Beitrag anzeigen
    - ich habe mich in letzter Zeit mit einem verwandten Projekt beschäftigt (ein Info und Quest Editor).
    Hast du in der Richtung auch schon etwas unternommen?
    Ich habe einen Quest-/Info-Checker für Gothic 3, den ich für ELEX umstricken will, früher oder später. Da geht es aber darum, vorhandene infos in ihren Abhängigkeiten darzustellen.
    Ein Editor wäre natürlich cool; ich persönlich bearbeite die w_info.hdrdoc allerdings mit Notepad; habe nur einen kleinen "{}"-Checker erstellt, um zukünftig verschiedene mod_dialog.hdrdoc an die w_info anhängen zu können.

    Nachtrag: (2 Jahre, 9 Monate später, wow):

    Hier ist der Anhängskram umgesetzt (ELEX scripting "mod"):
    https://www.nexusmods.com/elex/mods/...scription&BH=0
    "in der Erkundung dieser weiten und wunderbaren Welt" (post #70, höre link unten)
    TAS for Elex 2 at ELEX II Nexus - Mods and Community (nexusmods.com)
    Umsturz bei den Morkons: best PB quest ever!
    "Hört mir bloß auf mit "Stormson".
    "In Toussaint wird schon für kleinere Schmähungen als diese Satisfaktion verlangt."
    Genug der "Blumensträuße". Ich WILL MadBob! Beugt die Realität!
    tombom81 ist offline Geändert von tombom81 (25.09.2021 um 22:04 Uhr)

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •