Official RPG Codex Discord Server

  1. Welcome to rpgcodex.net, a site dedicated to discussing computer based role-playing games in a free and open fashion. We're less strict than other forums, but please refer to the rules.

    "This message is awaiting moderator approval": All new users must pass through our moderation queue before they will be able to post normally. Until your account has "passed" your posts will only be visible to yourself (and moderators) until they are approved. Give us a week to get around to approving / deleting / ignoring your mundane opinion on crap before hassling us about it. Once you have passed the moderation period (think of it as a test), you will be able to post normally, just like all the other retards.
    Dismiss Notice

Pillars of Eternity Coding/Hacking Thread

Discussion in 'Obsidian Entertainment' started by Sensuki, Sep 16, 2014.

  1. J_C One Bit Studio Patron Developer Sad Loser

    J_C
    Joined:
    Dec 28, 2010
    Messages:
    16,485
    Location:
    Pannonia
    Project: Eternity Wasteland 2 Shadorwun: Hong Kong
    You have a pretty cool wife. :)
     
    ^ Top  
  2. Bester ⚰️☠️⚱️ Patron Vatnik

    Bester
    Joined:
    Sep 28, 2014
    Messages:
    7,793
    Location:
    USSR
    Ok, gonna give it a try. I'm not sure that'll look good though - they're much thicker than in IE.
     
    • Brofist Brofist x 1
    ^ Top  
  3. Sensuki Arcane Cuck

    Sensuki
    Joined:
    Oct 26, 2012
    Messages:
    9,608
    Location:
    Australia
    Codex 2014 Serpent in the Staglands Shadorwun: Hong Kong A Beautifully Desolate Campaign
    I'm probably going to make a post on the OE about Selection Circle uniformity or something. Comparing how they worked in the IE games and PE.

    Probably something that hardly anyone cares about but me, but whatever.

    In the new patch I think the lighter blue will be fine with the thinner circles.
     
    ^ Top  
  4. Sensuki Arcane Cuck

    Sensuki
    Joined:
    Oct 26, 2012
    Messages:
    9,608
    Location:
    Australia
    Codex 2014 Serpent in the Staglands Shadorwun: Hong Kong A Beautifully Desolate Campaign
    Bester

    For the Unit Highlighting Option, code would need to be added to the GameOption class

    Show Spoiler
    Code:
    // Decompiled with JetBrains decompiler
    // Type: GameOption
    // Assembly: Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
    // MVID: DF4C6C3A-AD7F-49DB-A385-AF294186A2A2
    // Assembly location: D:\20-10-14\Desktop\PE LOGS\333bb.dll
    
    using System;
    using UnityEngine;
    
    [Serializable]
    public class GameOption
    {
      private bool[] BoolOptions = new bool[23];
      public float MasterVolume = 1f;
      public float MusicVolume = 1f;
      public float SoundVolume = 1f;
      public float TooltipDelay = 1f;
      public string LanguageName = string.Empty;
      public float ScrollSpeed = 1f;
      private float m_FontScale = 1f;
      public float MinZoom = 1f;
      public float MaxZoom = 1.5f;
      private AutoPauseOptions m_autopause = new AutoPauseOptions();
      public UIDropdownResolution.MyResolution Resolution;
      public GameOption.FontScaleChangedDelegate OnFontScaleChanged;
    
      public bool DeveloperCommentary
      {
        get
        {
          return this.GetOption(GameOption.BoolOption.DEVELOPER_COMMENTARY);
        }
        set
        {
          this.SetOption(GameOption.BoolOption.DEVELOPER_COMMENTARY, value);
        }
      }
    
      public bool DeathIsPermanent
      {
        get
        {
          return this.GetOption(GameOption.BoolOption.DEATH_IS_PERMANENT);
        }
        set
        {
          this.SetOption(GameOption.BoolOption.DEATH_IS_PERMANENT, value);
        }
      }
    
      public bool AoeHighlighting
      {
        get
        {
          return this.GetOption(GameOption.BoolOption.AOE_HIGHLIGHTING);
        }
        set
        {
          this.SetOption(GameOption.BoolOption.AOE_HIGHLIGHTING, value);
        }
      }
    
      public bool DisplayUnqualifiedInteractions
      {
        get
        {
          return this.GetOption(GameOption.BoolOption.DISPLAY_UNQUALIFIED_INTERACTIONS);
        }
        set
        {
          this.SetOption(GameOption.BoolOption.DISPLAY_UNQUALIFIED_INTERACTIONS, value);
        }
      }
    
      public bool DisplayInteractionQualifier
      {
        get
        {
          return this.GetOption(GameOption.BoolOption.DISPLAY_INTERACTION_QUALIFIER);
        }
        set
        {
          this.SetOption(GameOption.BoolOption.DISPLAY_INTERACTION_QUALIFIER, value);
        }
      }
    
      public bool DisplayPersonalityReputationIndicators
      {
        get
        {
          return this.GetOption(GameOption.BoolOption.DISPLAY_PERSONALITY_REPUTATION_INDICATORS);
        }
        set
        {
          this.SetOption(GameOption.BoolOption.DISPLAY_PERSONALITY_REPUTATION_INDICATORS, value);
        }
      }
    
      public bool DisplayRelativeDefenses
      {
        get
        {
          return this.GetOption(GameOption.BoolOption.DISPLAY_RELATIVE_DEFENSES);
        }
        set
        {
          this.SetOption(GameOption.BoolOption.DISPLAY_RELATIVE_DEFENSES, value);
        }
      }
    
      public bool DisplayQuestObjectiveTitles
      {
        get
        {
          return this.GetOption(GameOption.BoolOption.DISPLAY_QUEST_OBJECTIVE_TITLES);
        }
        set
        {
          this.SetOption(GameOption.BoolOption.DISPLAY_QUEST_OBJECTIVE_TITLES, value);
        }
      }
    
      public float FontScale
      {
        get
        {
          return this.m_FontScale;
        }
        set
        {
          if ((double) this.m_FontScale == (double) value)
            return;
          this.m_FontScale = value;
          if (this.OnFontScaleChanged == null)
            return;
          this.OnFontScaleChanged(value);
        }
      }
    
      public AutoPauseOptions AutoPause
      {
        get
        {
          return this.m_autopause;
        }
        set
        {
          this.m_autopause = value;
        }
      }
    
      public bool GetOption(GameOption.BoolOption option)
      {
        return this.BoolOptions[(int) option];
      }
    
      public void SetOption(GameOption.BoolOption option, bool setting)
      {
        this.BoolOptions[(int) option] = setting;
      }
    
      public void CopyFrom(GameOption other)
      {
        other.BoolOptions.CopyTo((Array) this.BoolOptions, 0);
        this.MasterVolume = other.MasterVolume;
        this.MusicVolume = other.MusicVolume;
        this.SoundVolume = other.SoundVolume;
        this.TooltipDelay = other.TooltipDelay;
        this.FontScale = other.FontScale;
        this.ScrollSpeed = other.ScrollSpeed;
        this.LanguageName = other.LanguageName;
        this.MinZoom = other.MinZoom;
        this.MaxZoom = other.MaxZoom;
        this.Resolution = new UIDropdownResolution.MyResolution(other.Resolution);
        this.AutoPause.CopyFrom(other.AutoPause);
      }
    
      public bool Matches(GameOption other)
      {
        for (int index = 0; index < this.BoolOptions.Length; ++index)
        {
          if (this.BoolOptions[index] != other.BoolOptions[index])
            return false;
        }
        if ((double) other.MasterVolume == (double) this.MasterVolume && (double) other.MusicVolume == (double) this.MusicVolume && ((double) other.SoundVolume == (double) this.SoundVolume && (double) other.TooltipDelay == (double) this.TooltipDelay) && ((double) other.FontScale == (double) this.FontScale && (double) other.ScrollSpeed == (double) this.ScrollSpeed && (other.LanguageName.Equals(this.LanguageName) && (double) other.MinZoom == (double) this.MinZoom)) && ((double) other.MaxZoom == (double) this.MaxZoom && other.Resolution.Equals((object) this.Resolution)))
          return this.AutoPause.Matches(other.AutoPause);
        else
          return false;
      }
    
      public static bool BoolOptionDefault(GameOption.BoolOption c)
      {
        if (c != GameOption.BoolOption.COMBAT_TOOLTIPS_UI && c != GameOption.BoolOption.QUEST_UPDATES_UI && (c != GameOption.BoolOption.COLORBLIND_MODE && c != GameOption.BoolOption.GIBS) && (c != GameOption.BoolOption.SCREEN_EDGE_SCROLLING && c != GameOption.BoolOption.VSYNC && (c < GameOption.BoolOption.AOE_HIGHLIGHTING || c > GameOption.BoolOption.DISPLAY_QUEST_OBJECTIVE_TITLES)))
          return c == GameOption.BoolOption.DONT_RESTRICT_STASH;
        else
          return true;
      }
    
      public void LoadFromPrefs()
      {
        for (int index = 0; index < 23; ++index)
        {
          bool flag = GameOption.BoolOptionDefault((GameOption.BoolOption) index);
          bool setting = PlayerPrefs.GetInt(((GameOption.BoolOption) index).ToString(), !flag ? 0 : 1) > 0;
          this.SetOption((GameOption.BoolOption) index, setting);
        }
        this.MasterVolume = PlayerPrefs.GetFloat("MasterVolume", 1f);
        this.MusicVolume = PlayerPrefs.GetFloat("MusicVolume", 1f);
        this.SoundVolume = PlayerPrefs.GetFloat("SoundVolume", 1f);
        this.TooltipDelay = PlayerPrefs.GetFloat("TooltipDelay", 1f);
        this.ScrollSpeed = PlayerPrefs.GetFloat("ScrollSpeed", 1f);
        this.FontScale = PlayerPrefs.GetFloat("FontScale", 1f);
        this.MinZoom = PlayerPrefs.GetFloat("MinZoom", 1f);
        this.MaxZoom = PlayerPrefs.GetFloat("MaxZoom", 1.5f);
        this.LanguageName = PlayerPrefs.GetString("LanguageName", StringTableManager.CurrentLanguage.Name);
        string str1 = "Resolution";
        int width1 = Screen.get_width();
        int height1 = Screen.get_height();
        Resolution currentResolution1 = Screen.get_currentResolution();
        // ISSUE: explicit reference operation
        int refreshRate1 = ((Resolution) @currentResolution1).get_refreshRate();
        string str2 = new UIDropdownResolution.MyResolution(width1, height1, refreshRate1).SerialString();
        this.Resolution = new UIDropdownResolution.MyResolution(PlayerPrefs.GetString(str1, str2));
        this.AutoPause.Initialize();
        BigHeads.Enabled = GameState.Option.GetOption(GameOption.BoolOption.BIG_HEADS);
        int num1 = GameState.Option.Resolution.width;
        Resolution currentResolution2 = Screen.get_currentResolution();
        // ISSUE: explicit reference operation
        int width2 = ((Resolution) @currentResolution2).get_width();
        if (num1 == width2)
        {
          int num2 = GameState.Option.Resolution.height;
          Resolution currentResolution3 = Screen.get_currentResolution();
          // ISSUE: explicit reference operation
          int height2 = ((Resolution) @currentResolution3).get_height();
          if (num2 == height2)
          {
            int num3 = GameState.Option.Resolution.refreshRate;
            Resolution currentResolution4 = Screen.get_currentResolution();
            // ISSUE: explicit reference operation
            int refreshRate2 = ((Resolution) @currentResolution4).get_refreshRate();
            if (num3 == refreshRate2)
              goto label_7;
          }
        }
        Screen.SetResolution(GameState.Option.Resolution.width, GameState.Option.Resolution.height, Screen.get_fullScreen(), GameState.Option.Resolution.refreshRate);
    label_7:
        if (StringTableManager.CurrentLanguage.Name != GameState.Option.LanguageName)
          StringTableManager.SetCurrentLanguageByName(GameState.Option.LanguageName);
        if (GameState.OnDifficultyChanged != null)
          GameState.OnDifficultyChanged(GameState.Mode.Difficulty);
        QualitySettings.set_vSyncCount(!this.GetOption(GameOption.BoolOption.VSYNC) ? 0 : 1);
        UICamera.tooltipDelay = this.TooltipDelay;
        WinCursor.Clip(true);
      }
    
      public void SaveToPrefs()
      {
        for (int index = 0; index < 23; ++index)
          PlayerPrefs.SetInt(((GameOption.BoolOption) index).ToString(), !this.GetOption((GameOption.BoolOption) index) ? 0 : 1);
        PlayerPrefs.SetFloat("MasterVolume", this.MasterVolume);
        PlayerPrefs.SetFloat("MusicVolume", this.MusicVolume);
        PlayerPrefs.SetFloat("SoundVolume", this.SoundVolume);
        PlayerPrefs.SetFloat("TooltipDelay", this.TooltipDelay);
        PlayerPrefs.SetFloat("FontScale", this.FontScale);
        PlayerPrefs.SetFloat("MinZoom", this.MinZoom);
        PlayerPrefs.SetFloat("MaxZoom", this.MaxZoom);
        PlayerPrefs.SetFloat("ScrollSpeed", this.ScrollSpeed);
        PlayerPrefs.SetString("LanguageName", this.LanguageName);
        PlayerPrefs.SetString("Resolution", this.Resolution.SerialString());
        this.AutoPause.SaveOptions();
        PlayerPrefs.Save();
      }
    
      public enum BoolOption
      {
        DEATH_IS_PERMANENT,
        AOE_HIGHLIGHTING,
        DISPLAY_UNQUALIFIED_INTERACTIONS,
        DISPLAY_INTERACTION_QUALIFIER,
        DISPLAY_PERSONALITY_REPUTATION_INDICATORS,
        DISPLAY_RELATIVE_DEFENSES,
        DISPLAY_QUEST_OBJECTIVE_TITLES,
        BIG_HEADS,
        HIDE_CIRCLES,
        HIDE_OFFSCREEN_POINTERS,
        ALWAYS_SAVE_OPTIONS,
        LIGATURES,
        DEVELOPER_COMMENTARY,
        COMBAT_TOOLTIPS_UI,
        QUEST_UPDATES_UI,
        COLORBLIND_MODE,
        SOLID_HUD,
        GIBS,
        SCREEN_EDGE_SCROLLING,
        DONT_WARN_STORE_TOO_POOR,
        VSYNC,
        CLIP_CURSOR,
        DONT_RESTRICT_STASH,
        COUNT,
      }
    
      public delegate void FontScaleChangedDelegate(float newscale);
    }


    A new enum, what the default value is, and probably something else (getter, setter, maybe persistence stuff?). Then in the CharacterHighlight or whatever class, a check would need to be made for the option, such as

    Code:
    !GameState.Mode.Option.GetOption(GameOption.BoolOption.HIGHLIGHT)
    in the line where the Alpha value for the Highlighting is, for values of 1 and 0

    That should speed you up a bit there, I gotta go to bed
     
    Last edited: Oct 30, 2014
    ^ Top  
  5. set Cipher

    set
    Joined:
    Oct 21, 2013
    Messages:
    940
    Does C# have the same reflection vulnerability as Java? I know in Java you can make any private member public via reflection.
     
    ^ Top  
  6. Bester ⚰️☠️⚱️ Patron Vatnik

    Bester
    Joined:
    Sep 28, 2014
    Messages:
    7,793
    Location:
    USSR
    Sensuki maybe you can ask your c# guy something, cause I've run into a dead end while trying to modify PoE's Options UI window for that highlight checkbox thing. Whenever I need to recompile a method that references enums outside of the method itself, there's a problem. Those enums don't appear in the code that you see when you hit "replace all with code", so it's like they don't exist in that class at all. And if I manually add them in outside the scope of the method I'm modifying, then it recompiles ok, but probably with bad references, cause I can't reopen that method after saving. And POE can't deal with that dll either.

    To be more precise, can't recompile UIOptionsManager's constructor because this._mValidOptionPages is an enum and Reflector doesn't provide a definition for it in the "replace all with code" window.

    Also, can you ask him if there is a way to hook up a custom .dll to PoE in order to override/extend classes from the original assembly and force the game to use them instead of the original ones? If yes, how?
    Cause I don't know exactly what c#'s reflection can do, but everyone keeps talking about...
     
    Last edited: Oct 31, 2014
    • Brofist Brofist x 1
    ^ Top  
  7. Sensuki Arcane Cuck

    Sensuki
    Joined:
    Oct 26, 2012
    Messages:
    9,608
    Location:
    Australia
    Codex 2014 Serpent in the Staglands Shadorwun: Hong Kong A Beautifully Desolate Campaign
    Yeah I will once I get back from Melbourne, going to a Halloween party tonight
     
    ^ Top  
  8. Bester ⚰️☠️⚱️ Patron Vatnik

    Bester
    Joined:
    Sep 28, 2014
    Messages:
    7,793
    Location:
    USSR
    Finished writing a Unity Editor extension which allows Unity to work with .unity3d and .assetbundle files. Can't extract things out yet (but you can do that with Disunity). You can import stuff in though, so you're all set.

    I didn't test it thoroughly, but I tested it on 1 item, 1 spell and 1 creature, and it worked every time, so I'm releasing it. (yeah, Obsidian style)
    It's supposed to allow you to edit/replace values, meshes, sounds, textures, particles, shaders, animations, and maybe something else, but I only edited values and replaced a texture once. Should work fine, though.

    To use it, you need Unity 4.5.1 and it has to be Pro in order to save your changes. You can get a 30 days trial if you're a moralfag, and you can renew it by simply creating a new account every time (no credit card required I've been told). If you can't get a Pro, you should still be able to view stuff (if the compiler complains about a certain line - comment it out, cause you're a moralfag with no pro).

    Here's a fancy screenshot:

    [​IMG]

    And here it is in form of Unity project: https://dl.dropboxusercontent.com/u/62420848/Test2.zip

    Oh, and there is some weird memory leak, so if you load giant files a lot, you're gonna have to restart Unity from time to time. Ah, who am I kidding, you're gonna have to restart it every other 3-4 giant files (the ones that are 50-80 MB).
     
    • Brofist Brofist x 1
    ^ Top  
  9. Immortal Arcane

    Immortal
    Joined:
    Sep 13, 2014
    Messages:
    3,825
    Reflection is being thrown around here a lot without anyone actually understanding what it means.

    Here you Go:
    http://www.mono-project.com/docs/tools+libraries/libraries/Mono.Cecil/

    If your having trouble, ask your wife for help. :smug:
     
    ^ Top  
  10. agris Arcane Patron

    agris
    Joined:
    Apr 16, 2004
    Messages:
    4,330
     
    ^ Top  
  11. Bester ⚰️☠️⚱️ Patron Vatnik

    Bester
    Joined:
    Sep 28, 2014
    Messages:
    7,793
    Location:
    USSR

    Well what about them? It's possible to remove them from the doors, yeah, but what about the outdoor area transitions? If the outdoor area transitions have no icons, then at least the clickable area should be large enough for you to notice it by hovering your mouse over it. Right now, the outdoor clickable area for transition is so tiny, you wouldn't find it without the icon, at least unless you know it's there. And it's not possible to change the size of it without editing every scene, which we can't even do at this point. (well it's possible to just stretch it programmatically, but that would give unexpected behavior in lots of cases, so that's not even an option)

    So removing it would force people to pixel hunt for outdoor area transitions.

    Thanks.
     
    Last edited: Nov 2, 2014
    • Brofist Brofist x 1
    ^ Top  
  12. SymbolicFrank Magister

    SymbolicFrank
    Joined:
    Mar 24, 2010
    Messages:
    1,667
    Depends on where you live. In the USA you face serious jail time, if enforced.
     
    ^ Top  
  13. Ninjerk Arcane

    Ninjerk
    Joined:
    Jul 10, 2013
    Messages:
    13,267
    I meant specifically with regards to PoE EULA. Doesn't the license typically just get revoked as long as you haven't been profiting by it?
     
    ^ Top  
  14. set Cipher

    set
    Joined:
    Oct 21, 2013
    Messages:
    940
    The "if enforced" is the big one. I'm pretty sure Obsidian wants us to mod the heck out of their game - it tends to correlate with higher sales.
     
    ^ Top  
  15. agris Arcane Patron

    agris
    Joined:
    Apr 16, 2004
    Messages:
    4,330
    Ok, so remove it from everything but scene transitions. That would still be a large aesthetic improvement.
     
    • Brofist Brofist x 1
    ^ Top  
  16. Immortal Arcane

    Immortal
    Joined:
    Sep 13, 2014
    Messages:
    3,825
    I'm calling bullshit.. even in the most extreme cases the worst has been large fines for perceived damages. We aren't talking about corporate espionage. We are talking about binary modification. I can't think of anything more prolific or ground setting then Blizzard chasing after pirate WoW servers or Glider / Inner Space and Ceiling Fan Software ..

    Blizzard only attacks these bot makers and spammers because it's more effective to take them to court then to invest money in software that stops them. Blizzard can't run Warden on WoW servers indefinitely any more, it causes too many latency issues. Their Blowfish encryption has largely been RE'd and keeping up with bot makers is hard because they are fighting a losing battle. The more packet transforming and monitoring they do, the more server load they create.

    I seriously can't think of a single court ruling or case that involved modding or modifying binary files or reverse engineering them that didn't end up exclusively with a monetary fine.

    Prove me wrong if you have evidence of jail time.. I am not a US Citizen so I am ready to be surprised by how even more disappointing your law system is. :lol:
     
    ^ Top  
  17. SymbolicFrank Magister

    SymbolicFrank
    Joined:
    Mar 24, 2010
    Messages:
    1,667
    There are two different problems: unlicensed copying of Intellectual Property / copyrighted works, and circumventing copy protection. For both of those offenses people have been sent to jail for 10+ years in the USA. Like the housewife who downloaded some MP3s.

    As set said: it's the "if enforced" that is the important part. If they want to fuck you, they can. It's not hard.
     
    ^ Top  
  18. Immortal Arcane

    Immortal
    Joined:
    Sep 13, 2014
    Messages:
    3,825
    It's pretty hard actually..
     
    ^ Top  
  19. Bester ⚰️☠️⚱️ Patron Vatnik

    Bester
    Joined:
    Sep 28, 2014
    Messages:
    7,793
    Location:
    USSR
    A little update on the modding situation. I figured out Cecil to some degree and built a somewhat stable modding framework, which I'm hoping to release soon and hopefully people will mod using that from then on. Good things about it:
    - You can now code stuff easily in a familiar IDE and inject normal c# code directly into the assembly. What used to take 10 minutes to do with Reflexil before, only takes 1 click now (rebuild & run).
    - Standardization. If everyone builds their mods using this framework, there aren't gonna be any conflicts between mods and you're not limited to just one guy's mod. Although, I'm not extremely worried about it, since there are no other tools, and using Reflexil is inadequate.
    - User will be able to choose which mods they want to install, like with Weidu.

    Now that the framework reached some level of stability, I'm trying to familiarize myself with PoE's UI system (mostly what seems to be NGUI 2.5).
    So far I'm only capable of creating buttons and dynamically dragging certain elements of existing UI around (dragged portraits). When I'm capable of doing more, I'll write a starting guide, so people don't have to waste days trying to climb out of pitfalls I encountered myself.

    While digging around, I found what appears to be some old code that apparently used to serve as an in-game model viewer. I adapted it into a mod. It allows you to iterate through all models of armor and helmets. The good thing about it is that you're not limited to the items that can be found in assetbundles - it gets you access to all models that aren't even necessarily attached to in-game items. There's not many of them (a few dozen), but if you want to see some new stuff, give it a try.
    The console command to activate it is "ModelViewer". Zoom in on your main character, cause this is where the changes are going to happen.

    Here's a screenshot:

    [​IMG]
    (oh, modifying hands and feet doesn't work, forgot to cut it out)

    I'm not going to release the mod in form of a patcher, yet, cause it's not ready. I'm gonna have to add some basic functionality (like backups) and user interface, so maybe next time. This time, the mod comes in form of a dll that contains the following changes and you can't choose what to install. It's all installed:
    - Level cap moved to 12
    - Intro movie skippable by hitting: LMB, RMB, Enter, Escape, Space
    - Blue circles for neutral NPCs
    - Cheat console commands unlocked
    - ModelViewer added

    Here it is: https://dl.dropboxusercontent.com/u/62420848/mod_0.2.zip
    Installation: put the .dll into Pillars of Eternity - Public Beta\PillarsOfEternity_Data\Managed

    If you want to contribute, know old NGUI, Cecil, general C# or anything that might help - contact me, this shit is really hard.
     
    • Brofist Brofist x 5
    ^ Top  
  20. Immortal Arcane

    Immortal
    Joined:
    Sep 13, 2014
    Messages:
    3,825
    Nice man.
    Can you post this onto a git repository so we can modify / extend the framework?
     
    ^ Top  
  21. Bester ⚰️☠️⚱️ Patron Vatnik

    Bester
    Joined:
    Sep 28, 2014
    Messages:
    7,793
    Location:
    USSR
    Yeah, I'll do that in a few days.
     
    • Brofist Brofist x 1
    ^ Top  
  22. Abu Antar Prestigious Gentleman Tweet, tweet Patron

    Abu Antar
    Joined:
    Jan 19, 2014
    Messages:
    8,732
    Shadorwun: Hong Kong Divinity: Original Sin 2 Pillars of Eternity 2: Deadfire Pathfinder: Kingmaker
    Adam posts.

    I like what you guys are doing, but I can understand why he wishes that no screenshots get posted. (Spoilers and all that.)
     
    ^ Top  
  23. Athelas Arcane

    Athelas
    Joined:
    Jun 24, 2013
    Messages:
    4,502
    There is only one solution: move this thread to GD. :troll:
     
    ^ Top  
  24. Seari Cipher Patron

    Seari
    Joined:
    Nov 25, 2014
    Messages:
    775
    Pathfinder: Kingmaker
    Wow, amazing work! :bro:
     
    ^ Top  
  25. Sensuki Arcane Cuck

    Sensuki
    Joined:
    Oct 26, 2012
    Messages:
    9,608
    Location:
    Australia
    Codex 2014 Serpent in the Staglands Shadorwun: Hong Kong A Beautifully Desolate Campaign
    Thought that was the reason they removed cheats from the game. It was the build after I posted some of their unique armors on the forums.
     
    ^ Top  

As an Amazon Associate, rpgcodex.net earns from qualifying purchases.