Another Character Generator

By OggDude, in Star Wars: Edge of the Empire RPG

Hey OggDude -

Please wrap the contents of SetNameTip() (SpecTree.cs, line 362) in a try/catch. I found that on a few of my machines, there was a problem with custom talents, and it was throwing an exception. I decompiled the .exe and fixed the problem by wrapping the code in that method in try/catch, so I would be thrilled to have that fixed in your next release.

Sneaky, sneaky :) Do you know what the exception was? Also, what version are you using? The line numbers are going to be different on my side since mine has all of my comments and extra line spacings. Just looking at the the method, you could get an exception if the reference to the talent is null. But that can't happen :) If a bad talent, or missing custom talent, is in a specialization, it'll crash before it even gets there. If you can tell me what the exception is, and if you can send me the actual decompiled line of code it's occurring on, I can see about fixing any issue.

It wasn't my intent to be sneaky :) I and the group that I run *love* this tool so don't take my poking the wrong way. I should mention that I reflected the code rather than decompiled it. I just happen to do a lot of .NET reflection in my current (lv 3 Support) job, so I decided to take matters into my own hands.

The talent isn't bad or malformed. It's valid XML, and loads correctly when I use my fix.

Repro steps:

1: Use the data editor to create a new custom talent. The created talent just needs a name and a key, no other options necessary.

2: Either customize an existing specialization or create a new one.

3: Open the char generator and load a character with the edited specialization or purchase it with a new or existing character.

4: You should get the exception as it tries to display the talents.

5: If not, create a couple of other new custom talents and put them into the same specialization - it should blow up.

At one point, I was able to successfully create a custom talent, but I was unable to create a second. Playing around in the XML, I copy/pasted the one that worked, changed its key and then tried again, but it still would not work.

I suspected that it was possibly a race condition, or something similar, where the xml wasn't being loaded or parsed fast enough to be displayed - since it's complaining about a null name tip, but the xml is populated and valid. Wrapping that method in try/catch was my attempt to get a better idea of what was going on, but it ended up resolving the issue on my end.

Here's the function with my change. Otherwise, the exception was being thrown on one of the first few lines (I forget which, it's been a week or two since I was playing in the code).

private void SetNameTip(SpecTreeNode node)
{
    try
    {
        node.NameTip.ToolTipTitle = node.refTalent.Name;
        string text = "Activation: " + ((node.refTalent.Activation == "Passive") ? "Passive" : ("Active (" + node.refTalent.Activation + ")")) + "\n";
        text = text + "Ranked: " + (node.refTalent.Ranked ? "Yes" : "No");
        CharTalent charTalent = this.mChar.Specializations.FindByKey(this.CurrentSpec.Key).Talents.Find((CharTalent tt) => tt.Key == node.refTalent.Key);
        if (charTalent.BonusChars.Count > 0)
        {
            object obj = text;
            text = string.Concat(new object[]
            {
                obj,
                "\nAdds +",
                charTalent.BonusChars[0].Bonus,
                " to ",
                this.mData.Characteristics.FindByKey(charTalent.BonusChars[0].CharKey).Name
            });
        }
        node.NameTip.SetToolTip(node.Name, text);
    }
    catch (Exception e)
    {
    }
}

Version info:

Release 1.0.0.12

Full Exception Text (and screenshot ):

See the end of this message for details on invoking

just-in-time (JIT) debugging instead of this dialog box.

************** Exception Text **************

System.NullReferenceException: Object reference not set to an instance of an object.

at SWCharGen.SpecTree.SetNameTip(SpecTreeNode node)

at SWCharGen.SpecTree.CreateTalentNode(Talent tal, Int32 Row, Int32 Col)

at SWCharGen.SpecTree.GenerateTalentTree(Specialization spec)

at SWCharGen.Form1.cmbSpec_SelectedIndexChanged(Object sender, EventArgs e)

at System.Windows.Forms.ComboBox.OnSelectedIndexChanged(EventArgs e)

at System.Windows.Forms.ComboBox.WmReflectCommand(Message& m)

at System.Windows.Forms.ComboBox.WndProc(Message& m)

at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)

at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)

at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

************** Loaded Assemblies **************

mscorlib

Assembly Version: 4.0.0.0

Win32 Version: 4.0.30319.18052 built by: FX45RTMGDR

CodeBase: file:///C:/Windows/Microsoft.NET/Framework/v4.0.30319/mscorlib.dll

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

SWCharGen

Assembly Version: 1.0.0.12

Win32 Version: 1.0.0.12

CodeBase: file:///C:/Users/[user]/Dropbox/Star%20Wars/EotE%20Char%20Builder/_SWCharGen.exe

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

System.Windows.Forms

Assembly Version: 4.0.0.0

Win32 Version: 4.0.30319.18036 built by: FX45RTMGDR

CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms/v4.0_4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll

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

System.Drawing

Assembly Version: 4.0.0.0

Win32 Version: 4.0.30319.18021 built by: FX45RTMGDR

CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Drawing/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll

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

System

Assembly Version: 4.0.0.0

Win32 Version: 4.0.30319.18034 built by: FX45RTMGDR

CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System/v4.0_4.0.0.0__b77a5c561934e089/System.dll

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

SWCharGenLib

Assembly Version: 1.0.0.12

Win32 Version: 1.0.0.12

CodeBase: file:///C:/Users/mattd/Dropbox/Star%20Wars/EotE%20Char%20Builder/SWCharGenLib.DLL

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

System.Core

Assembly Version: 4.0.0.0

Win32 Version: 4.0.30319.17929 built by: FX45RTMREL

CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Core/v4.0_4.0.0.0__b77a5c561934e089/System.Core.dll

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

Microsoft.mshtml

Assembly Version: 7.0.3300.0

Win32 Version: 7.0.3300.0

CodeBase: file:///C:/Windows/assembly/GAC/Microsoft.mshtml/7.0.3300.0__b03f5f7f11d50a3a/Microsoft.mshtml.dll

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

System.Xml

Assembly Version: 4.0.0.0

Win32 Version: 4.0.30319.18060 built by: FX45RTMGDR

CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll

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

System.Configuration

Assembly Version: 4.0.0.0

Win32 Version: 4.0.30319.18060 built by: FX45RTMGDR

CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Configuration/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll

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

Microsoft.GeneratedCode

Assembly Version: 1.0.0.0

Win32 Version: 4.0.30319.18060 built by: FX45RTMGDR

CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll

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

Microsoft.GeneratedCode

Assembly Version: 1.0.0.0

Win32 Version: 4.0.30319.18060 built by: FX45RTMGDR

CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll

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

Microsoft.GeneratedCode

Assembly Version: 1.0.0.0

Win32 Version: 4.0.30319.18060 built by: FX45RTMGDR

CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll

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

Microsoft.GeneratedCode

Assembly Version: 1.0.0.0

Win32 Version: 4.0.30319.18060 built by: FX45RTMGDR

CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll

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

Microsoft.GeneratedCode

Assembly Version: 1.0.0.0

Win32 Version: 4.0.30319.18060 built by: FX45RTMGDR

CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll

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

Microsoft.GeneratedCode

Assembly Version: 1.0.0.0

Win32 Version: 4.0.30319.18060 built by: FX45RTMGDR

CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll

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

Microsoft.GeneratedCode

Assembly Version: 1.0.0.0

Win32 Version: 4.0.30319.18060 built by: FX45RTMGDR

CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll

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

Microsoft.GeneratedCode

Assembly Version: 1.0.0.0

Win32 Version: 4.0.30319.18060 built by: FX45RTMGDR

CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll

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

Microsoft.GeneratedCode

Assembly Version: 1.0.0.0

Win32 Version: 4.0.30319.18060 built by: FX45RTMGDR

CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll

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

Microsoft.GeneratedCode

Assembly Version: 1.0.0.0

Win32 Version: 4.0.30319.18060 built by: FX45RTMGDR

CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll

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

Microsoft.GeneratedCode

Assembly Version: 1.0.0.0

Win32 Version: 4.0.30319.18060 built by: FX45RTMGDR

CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll

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

Microsoft.GeneratedCode

Assembly Version: 1.0.0.0

Win32 Version: 4.0.30319.18060 built by: FX45RTMGDR

CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll

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

Microsoft.GeneratedCode

Assembly Version: 1.0.0.0

Win32 Version: 4.0.30319.18060 built by: FX45RTMGDR

CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll

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

Microsoft.GeneratedCode

Assembly Version: 1.0.0.0

Win32 Version: 4.0.30319.18060 built by: FX45RTMGDR

CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll

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

Microsoft.GeneratedCode

Assembly Version: 1.0.0.0

Win32 Version: 4.0.30319.18060 built by: FX45RTMGDR

CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll

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

Microsoft.GeneratedCode

Assembly Version: 1.0.0.0

Win32 Version: 4.0.30319.18060 built by: FX45RTMGDR

CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll

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

Microsoft.GeneratedCode

Assembly Version: 1.0.0.0

Win32 Version: 4.0.30319.18060 built by: FX45RTMGDR

CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll

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

Microsoft.GeneratedCode

Assembly Version: 1.0.0.0

Win32 Version: 4.0.30319.18060 built by: FX45RTMGDR

CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll

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

Microsoft.GeneratedCode

Assembly Version: 1.0.0.0

Win32 Version: 4.0.30319.18060 built by: FX45RTMGDR

CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll

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

Microsoft.GeneratedCode

Assembly Version: 1.0.0.0

Win32 Version: 4.0.30319.18060 built by: FX45RTMGDR

CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll

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

Microsoft.GeneratedCode

Assembly Version: 1.0.0.0

Win32 Version: 4.0.30319.18060 built by: FX45RTMGDR

CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll

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

Microsoft.GeneratedCode

Assembly Version: 1.0.0.0

Win32 Version: 4.0.30319.18060 built by: FX45RTMGDR

CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll

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

Microsoft.GeneratedCode

Assembly Version: 1.0.0.0

Win32 Version: 4.0.30319.18060 built by: FX45RTMGDR

CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll

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

Microsoft.GeneratedCode

Assembly Version: 1.0.0.0

Win32 Version: 4.0.30319.18060 built by: FX45RTMGDR

CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll

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

Microsoft.GeneratedCode

Assembly Version: 1.0.0.0

Win32 Version: 4.0.30319.18060 built by: FX45RTMGDR

CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll

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

Microsoft.GeneratedCode

Assembly Version: 1.0.0.0

Win32 Version: 4.0.30319.18060 built by: FX45RTMGDR

CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll

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

Microsoft.GeneratedCode

Assembly Version: 1.0.0.0

Win32 Version: 4.0.30319.18060 built by: FX45RTMGDR

CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll

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

Microsoft.GeneratedCode

Assembly Version: 1.0.0.0

Win32 Version: 4.0.30319.18060 built by: FX45RTMGDR

CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll

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

Microsoft.GeneratedCode

Assembly Version: 1.0.0.0

Win32 Version: 4.0.30319.18060 built by: FX45RTMGDR

CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll

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

Microsoft.GeneratedCode

Assembly Version: 1.0.0.0

Win32 Version: 4.0.30319.18060 built by: FX45RTMGDR

CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll

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

Microsoft.GeneratedCode

Assembly Version: 1.0.0.0

Win32 Version: 4.0.30319.18060 built by: FX45RTMGDR

CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll

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

Microsoft.GeneratedCode

Assembly Version: 1.0.0.0

Win32 Version: 4.0.30319.18060 built by: FX45RTMGDR

CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll

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

Microsoft.GeneratedCode

Assembly Version: 1.0.0.0

Win32 Version: 4.0.30319.18060 built by: FX45RTMGDR

CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll

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

Microsoft.GeneratedCode

Assembly Version: 1.0.0.0

Win32 Version: 4.0.30319.18060 built by: FX45RTMGDR

CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll

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

Microsoft.GeneratedCode

Assembly Version: 1.0.0.0

Win32 Version: 4.0.30319.18060 built by: FX45RTMGDR

CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll

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

Microsoft.GeneratedCode

Assembly Version: 1.0.0.0

Win32 Version: 4.0.30319.18060 built by: FX45RTMGDR

CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll

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

Microsoft.GeneratedCode

Assembly Version: 1.0.0.0

Win32 Version: 4.0.30319.18060 built by: FX45RTMGDR

CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll

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

Microsoft.GeneratedCode

Assembly Version: 1.0.0.0

Win32 Version: 4.0.30319.18060 built by: FX45RTMGDR

CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll

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

Microsoft.GeneratedCode

Assembly Version: 1.0.0.0

Win32 Version: 4.0.30319.18060 built by: FX45RTMGDR

CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll

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

************** JIT Debugging **************

To enable just-in-time (JIT) debugging, the .config file for this

application or computer (machine.config) must have the

jitDebugging value set in the system.windows.forms section.

The application must also be compiled with debugging

enabled.

For example:

<configuration>

<system.windows.forms jitDebugging="true" />

</configuration>

When JIT debugging is enabled, any unhandled exception

will be sent to the JIT debugger registered on the computer

rather than be handled by this dialog box.

Edited by Mercurion

As a mostly PbP gamer, I'd love to see a way to export a character as a plain text format. No real formatting, but simple so that I could pull the information into whatever format I need. :)

To be fair, I was doing a bunch of species updates today, and noticed that the names of some of the special qualities didn't show as being updated (particularly name changes) until after I'd clicked to Update the species entry.

Ya I got after messing with for a bit.

Certain controls, like numeric up/down controls, or most controls in grids, don't actually update until after you click on something else, or tab to another control. It's just how they work.

By the way, I figured out an easy way to have the grid immediately update cells after changing a cell's control without tabbing out or clicking on another cell. For all of you .NET geeks out there:

grid.CurrentCellDirtyStateChanged += new EventHandler(grid_CurrentCellDirtyStateChanged);


void grid_CurrentCellDirtyStateChanged(object sender, EventArgs e)
{
    DataGridView grid= sender as DataGridView;
    grid.CommitEdit(DataGridViewDataErrorContexts.Commit);
}
Edited by OggDude

Hey OggDude -

Please wrap the contents of SetNameTip() (SpecTree.cs, line 362) in a try/catch. I found that on a few of my machines, there was a problem with custom talents, and it was throwing an exception. I decompiled the .exe and fixed the problem by wrapping the code in that method in try/catch, so I would be thrilled to have that fixed in your next release.

Sneaky, sneaky :) Do you know what the exception was? Also, what version are you using? The line numbers are going to be different on my side since mine has all of my comments and extra line spacings. Just looking at the the method, you could get an exception if the reference to the talent is null. But that can't happen :) If a bad talent, or missing custom talent, is in a specialization, it'll crash before it even gets there. If you can tell me what the exception is, and if you can send me the actual decompiled line of code it's occurring on, I can see about fixing any issue.

It wasn't my intent to be sneaky :) I and the group that I run *love* this tool so don't take my poking the wrong way. I should mention that I reflected the code rather than decompiled it. I just happen to do a lot of .NET reflection in my current (lv 3 Support) job, so I decided to take matters into my own hands.

The talent isn't bad or malformed. It's valid XML, and loads correctly when I use my fix.

Repro steps:

1: Use the data editor to create a new custom talent. The created talent just needs a name and a key, no other options necessary.

2: Either customize an existing specialization or create a new one.

3: Open the char generator and load a character with the edited specialization or purchase it with a new or existing character.

4: You should get the exception as it tries to display the talents.

5: If not, create a couple of other new custom talents and put them into the same specialization - it should blow up.

At one point, I was able to successfully create a custom talent, but I was unable to create a second. Playing around in the XML, I copy/pasted the one that worked, changed its key and then tried again, but it still would not work.

I suspected that it was possibly a race condition, or something similar, where the xml wasn't being loaded or parsed fast enough to be displayed - since it's complaining about a null name tip, but the xml is populated and valid. Wrapping that method in try/catch was my attempt to get a better idea of what was going on, but it ended up resolving the issue on my end.

Here's the function with my change. Otherwise, the exception was being thrown on one of the first few lines (I forget which, it's been a week or two since I was playing in the code).

I was only joking :) .NET is .NET and all code is bared for the world to see, whether we like it or not.

I tried what you said and I couldn't get the error to occur. I added 3 custom talents, then replaced 3 talents in the Assassin tree with them. I was able to create an assassin without the specialization panel throwing an error. All tool tips for those talents showed up just fine.

Maybe if you send me your DataCustom directory and let me know which specializations and talents are giving you issue, I can figure it out.

Edit: I did come across this issue if a talent could not be found in your character's talent collection. This shouldn't happen, as the recalc routine will automatically add all required talents to the collection. The only way I got it to do this was by removing the talent from the collection and not recalculating :) But... if this is the issue, and there's some weird circumstance in which a needed talent may not be present in the character, I now check to see if the talent is found before I add more info to the tool tip. So, this could fix your problem.

Edited by OggDude

Howdy!

I have to say that I am very impressed with this piece of software. It's pretty well taking over as my character tool of choice.

I'm seeing one bug though and I hope I'm bringing this up in time to get it in the next version :)

I have a Bounty Hunter with the Survivalist Spec as well as the Force Sensitive Exile Spec. Forager, a non-ranked talent appears on both trees. It's my understanding that, as a non-ranked talent taking it on one tree should carry over to the other tree. So, if I take it on the FSE tree, it should show as taken on the Survivalist tree (without charging the extra 5XP as the Survivalist) and allow taking the 10XP rank of the Outdoorsman talent.

Right now, I'm having to simulate this by adding the appropriate amount of XP above my normal starting amount, but it seems like a problem doing it that way because if I show the sheet to someone, I show more XP than I should have. :)

Looking forward to all things SW :)

TC

The generator does take care of duplicate unranked talents. However, it didn't check for those talents on the first row because of the way you have to deselect such talents.

Basically, once you have duplicate unranked talents, there's no way to deselect them. This is because once you deselect the talent, it'll see that you still have the talent somewhere else and automatically select it again. The way around this is to deselect the talent that allowed you to choose the unranked talent to begin with. You can then go to the other spec and deselect or select it at will. I did this because 1) you probably don't want to deselect all of those talents just because you deselect one of them, and 2) if all were deselected, it would affect other talents that rely on it to be present, and generally mess up your carefully-selected spec.

This works fine unless both talents are on the first row. Then there's no way to deselect the talent :) That's why I didn't check talents on the first row.

So... the only way to fix this is to do what I was trying to avoid, but only do it on the first row. What it'll now do is deselect this talent everywhere, AND deselect any talents that rely on it (potentially messing up your spec). But it'll warn you first before you do it. It won't deselect the talent if it finds it on another row, however.

I've already added this and tested it and it works as advertised. It'll be in the next release, which should be soon.

As a mostly PbP gamer, I'd love to see a way to export a character as a plain text format. No real formatting, but simple so that I could pull the information into whatever format I need. :)

This could be done using an XSL transform on the XML character data. If there's any programmers out there that know XPath and want to give it a shot, it might be fun to try to create a plain text version of a character, or even an HTML page. You will need to include the external XML files found in Data in order to perform the proper look-ups, however.

I was only joking :) .NET is .NET and all code is bared for the world to see, whether we like it or not.

I tried what you said and I couldn't get the error to occur. I added 3 custom talents, then replaced 3 talents in the Assassin tree with them. I was able to create an assassin without the specialization panel throwing an error. All tool tips for those talents showed up just fine.

Maybe if you send me your DataCustom directory and let me know which specializations and talents are giving you issue, I can figure it out.

Edit: I did come across this issue if a talent could not be found in your character's talent collection. This shouldn't happen, as the recalc routine will automatically add all required talents to the collection. The only way I got it to do this was by removing the talent from the collection and not recalculating :) But... if this is the issue, and there's some weird circumstance in which a needed talent may not be present in the character, I now check to see if the talent is found before I add more info to the tool tip. So, this could fix your problem.

I've PM'ed you a dropbox link.

Thanks Ogg :)

So the next version, if I select Forager on the FSE spec it would automatically select it on the Survivalist as well? Or would I need to go ahead and manually select it on the Survivalist? And I'd only be charged for the Talent once?

Thanks for all you're doing on this! :)

TC

Thanks Ogg :)

So the next version, if I select Forager on the FSE spec it would automatically select it on the Survivalist as well? Or would I need to go ahead and manually select it on the Survivalist? And I'd only be charged for the Talent once?

Thanks for all you're doing on this! :)

TC

No, it'll automatically select it. You can see how it's supposed to work by creating a character with both the Assassin and Doctor trees. Then, go down and choose Anatomy Lessons in one of them. In the other spec, choose up to where Anatomy Lessons is available and it'll automatically select. As I said, the only reason it didn't work for Forager is because it was on the first line of the tree and I had purposely blocked that out from checking.

And yes, it knows that there's a duplicate and will only charge you once.

Edited by OggDude

I've created an Arkanian Offshoot character and taken on an extra +10 obligation (15 total), which should give me a total of 120 xp to spend as long as I am understanding the character creation rules correctly. However, instead it says that my total xp is 110 and so I'm at -10xp Unused xp.
@OggDude. Thanks for the amazing work on this program! Definitely wouldn't be playing Eote without it.

@Khaldun: I had that issue too. :) then I saw mention that the extra obligation needed to be manually added as it doesn't automatically increase the values. Same if you'd taken the extra credits, you'd have to add the actual credits yourself.

That help?

I've created an Arkanian Offshoot character and taken on an extra +10 obligation (15 total), which should give me a total of 120 xp to spend as long as I am understanding the character creation rules correctly. However, instead it says that my total xp is 110 and so I'm at -10xp Unused xp.

@OggDude. Thanks for the amazing work on this program! Definitely wouldn't be playing Eote without it.

See TCArknight's post above. You have to manually add the extra XP and/or credits from taking additional Obligation. Which makes sense, as the program also tracks the character's progression, and a PC's Obligation can rise or fall depending on the campaign. So it's probably easiest on OggDude if his program tracks those values separately.

I've created an Arkanian Offshoot character and taken on an extra +10 obligation (15 total), which should give me a total of 120 xp to spend as long as I am understanding the character creation rules correctly. However, instead it says that my total xp is 110 and so I'm at -10xp Unused xp.

@OggDude. Thanks for the amazing work on this program! Definitely wouldn't be playing Eote without it.

See TCArknight's post above. You have to manually add the extra XP and/or credits from taking additional Obligation. Which makes sense, as the program also tracks the character's progression, and a PC's Obligation can rise or fall depending on the campaign. So it's probably easiest on OggDude if his program tracks those values separately.

I've had so many requests for this, that I may as well put something in for it. The thing is there's no hard and fast rule for how much obligation is over your "starting value", since "starting value" can fluctuate. Also, if you add credits, then spend them, you don't have them anymore :)

There's a couple of benefit to actually having a generator feature for this, though: 1) the feature will be there so users won't think that they missed something important, and 2) the extra XP can be kept track of separately so it won't show up in "earned XP", but rather as part of "starting XP". So... what i'll probably do is have all four options available as check boxes, and just enable them for obligation that you give yourself over, say, 5. It won't verify anything, or keep track of what obligation puts you over starting (it could be multiple obligations, anyway), but it will ask you if you want to add the credits when you check it and remove them when you uncheck it, or if credits have already been added and dealt with. Credits are easy to change later, in any case.

I found out that I'm getting EtU as part of my Christmas :) so what I'm going to do is wait until after Christmas to release the new version in order to verify the new data. I'm in the middle of regression testing now, since so many changes were made to almost all parts of the apps, so this'll give me some time extra time to make sure the new code is as bug-free as possible.

Well, I got EtU in my stocking. Thumbed through it a bit and noticed that nobody had mentioned the new Signature Abilities feature! I felt like Al Pacino in Godfather III: "Just when I thought I was out, they pull me back in" :) Luckily, it's enough like force powers in design that I can reuse a lot of code for it, but the new release will be delayed somewhat so I can implement and test this new feature. I'm even keeping the ability to have oversized nodes and individual XP costs, just in case they thrown me a curve ball with future SA's. And, of course, I'll add editors for both SA's and nodes so you can create your own.

Oh, and XP/credits for obligations and duties are now part of the generator. You can set your starting size in both to 5, 10, 15, or 20, and it'll then figure out which options are available. Once an option is checked, it'll remain checked even if you no longer qualify for it so you can modify obligation and duty in the future without losing your option setting. Also, if you uncheck a credits option and you don't have the credits anymore to give back, it'll tell you this fact and instruct you to manually set the credits the next time you get them. Not much else I can do in that situation.

Well, I got EtU in my stocking. Thumbed through it a bit and noticed that nobody had mentioned the new Signature Abilities feature! I felt like Al Pacino in Godfather III: "Just when I thought I was out, they pull me back in" :) Luckily, it's enough like force powers in design that I can reuse a lot of code for it, but the new release will be delayed somewhat so I can implement and test this new feature. I'm even keeping the ability to have oversized nodes and individual XP costs, just in case they thrown me a curve ball with future SA's. And, of course, I'll add editors for both SA's and nodes so you can create your own.

Oh, and XP/credits for obligations and duties are now part of the generator. You can set your starting size in both to 5, 10, 15, or 20, and it'll then figure out which options are available. Once an option is checked, it'll remain checked even if you no longer qualify for it so you can modify obligation and duty in the future without losing your option setting. Also, if you uncheck a credits option and you don't have the credits anymore to give back, it'll tell you this fact and instruct you to manually set the credits the next time you get them. Not much else I can do in that situation.

You are a machine! I really appreciate this program, and moreso than that, I appreciate all the work you've put in to making it user-editable. I've seen too many utility programs like this for various systems that the creator loses interest in maintaining and thus become outdated and near-impossible to use once a few supplements come out. With your program, that's not a problem at all! One of the players in my game is playing an Explorer, so as soon as I got my copy of Enter the Unknown, I just added in all 3 of the new specialization trees myself for his benefit.

Thanks much for all the work you've put into the program!

Well, I got EtU in my stocking. Thumbed through it a bit and noticed that nobody had mentioned the new Signature Abilities feature! I felt like Al Pacino in Godfather III: "Just when I thought I was out, they pull me back in" :) Luckily, it's enough like force powers in design that I can reuse a lot of code for it, but the new release will be delayed somewhat so I can implement and test this new feature. I'm even keeping the ability to have oversized nodes and individual XP costs, just in case they thrown me a curve ball with future SA's. And, of course, I'll add editors for both SA's and nodes so you can create your own.

Oh, and XP/credits for obligations and duties are now part of the generator. You can set your starting size in both to 5, 10, 15, or 20, and it'll then figure out which options are available. Once an option is checked, it'll remain checked even if you no longer qualify for it so you can modify obligation and duty in the future without losing your option setting. Also, if you uncheck a credits option and you don't have the credits anymore to give back, it'll tell you this fact and instruct you to manually set the credits the next time you get them. Not much else I can do in that situation.

You are a machine! I really appreciate this program, and moreso than that, I appreciate all the work you've put in to making it user-editable. I've seen too many utility programs like this for various systems that the creator loses interest in maintaining and thus become outdated and near-impossible to use once a few supplements come out. With your program, that's not a problem at all! One of the players in my game is playing an Explorer, so as soon as I got my copy of Enter the Unknown, I just added in all 3 of the new specialization trees myself for his benefit.

Thanks much for all the work you've put into the program!

Thanks! I'll be including the new EtU specs, as well as the new specs and careers for AoR, in the upcoming release.

Well, I got EtU in my stocking. Thumbed through it a bit and noticed that nobody had mentioned the new Signature Abilities feature! I felt like Al Pacino in Godfather III: "Just when I thought I was out, they pull me back in" :) Luckily, it's enough like force powers in design that I can reuse a lot of code for it, but the new release will be delayed somewhat so I can implement and test this new feature. I'm even keeping the ability to have oversized nodes and individual XP costs, just in case they thrown me a curve ball with future SA's. And, of course, I'll add editors for both SA's and nodes so you can create your own.

Oh, and XP/credits for obligations and duties are now part of the generator. You can set your starting size in both to 5, 10, 15, or 20, and it'll then figure out which options are available. Once an option is checked, it'll remain checked even if you no longer qualify for it so you can modify obligation and duty in the future without losing your option setting. Also, if you uncheck a credits option and you don't have the credits anymore to give back, it'll tell you this fact and instruct you to manually set the credits the next time you get them. Not much else I can do in that situation.

You are a machine! I really appreciate this program, and moreso than that, I appreciate all the work you've put in to making it user-editable. I've seen too many utility programs like this for various systems that the creator loses interest in maintaining and thus become outdated and near-impossible to use once a few supplements come out. With your program, that's not a problem at all! One of the players in my game is playing an Explorer, so as soon as I got my copy of Enter the Unknown, I just added in all 3 of the new specialization trees myself for his benefit.

Thanks much for all the work you've put into the program!

Thanks! I'll be including the new EtU specs, as well as the new specs and careers for AoR, in the upcoming release.

As a small feature request, can you have some sort of in-program option to exclude the Unofficial Species options? I prefer to keep my games official books only (mostly out of convenience, partly out of a desire for FFG-approved balance), and having a bunch of line items in the species selection dropdown that aren't "official" is a bit off-putting.

Well, I got EtU in my stocking. Thumbed through it a bit and noticed that nobody had mentioned the new Signature Abilities feature! I felt like Al Pacino in Godfather III: "Just when I thought I was out, they pull me back in" :) Luckily, it's enough like force powers in design that I can reuse a lot of code for it, but the new release will be delayed somewhat so I can implement and test this new feature. I'm even keeping the ability to have oversized nodes and individual XP costs, just in case they thrown me a curve ball with future SA's. And, of course, I'll add editors for both SA's and nodes so you can create your own.

Oh, and XP/credits for obligations and duties are now part of the generator. You can set your starting size in both to 5, 10, 15, or 20, and it'll then figure out which options are available. Once an option is checked, it'll remain checked even if you no longer qualify for it so you can modify obligation and duty in the future without losing your option setting. Also, if you uncheck a credits option and you don't have the credits anymore to give back, it'll tell you this fact and instruct you to manually set the credits the next time you get them. Not much else I can do in that situation.

You are a machine! I really appreciate this program, and moreso than that, I appreciate all the work you've put in to making it user-editable. I've seen too many utility programs like this for various systems that the creator loses interest in maintaining and thus become outdated and near-impossible to use once a few supplements come out. With your program, that's not a problem at all! One of the players in my game is playing an Explorer, so as soon as I got my copy of Enter the Unknown, I just added in all 3 of the new specialization trees myself for his benefit.

Thanks much for all the work you've put into the program!

Thanks! I'll be including the new EtU specs, as well as the new specs and careers for AoR, in the upcoming release.

As a small feature request, can you have some sort of in-program option to exclude the Unofficial Species options? I prefer to keep my games official books only (mostly out of convenience, partly out of a desire for FFG-approved balance), and having a bunch of line items in the species selection dropdown that aren't "official" is a bit off-putting.

There's a new "Options" button at the top that allows you to select the source for your data. The core is always present, but all other sources can be excluded. It'll save the settings between launches.

There's a new "Options" button at the top that allows you to select the source for your data. The core is always present, but all other sources can be excluded. It'll save the settings between launches.

Once again, you are a machine! Thanks so much!!

Ogg, this is absolutely cool.

I have been a pen and paper GM for too many years to admit. I recently started doing more PDFs and online tools with SWFFG, but your program is phenomenal. Wonderful work.

edit - I couldn't help but notice the GM tools have an import/export feature. Is there a thread or a location to submit new critters and challenge files?

second edit - Would you mind if I used the graphic files generated by your program (with my own creations) on my blog? They would make them look a lot nicer with far less effort than my current method.

third edit - In the GM tools, when building an adversary... why are the base WT and ST higher than 10? Is there a race option I am missing?

Edited by FangGrip

Ogg, this is absolutely cool.

I have been a pen and paper GM for too many years to admit. I recently started doing more PDFs and online tools with SWFFG, but your program is phenomenal. Wonderful work.

edit - I couldn't help but notice the GM tools have an import/export feature. Is there a thread or a location to submit new critters and challenge files?

second edit - Would you mind if I used the graphic files generated by your program (with my own creations) on my blog? They would make them look a lot nicer with far less effort than my current method.

third edit - In the GM tools, when building an adversary... why are the base WT and ST higher than 10? Is there a race option I am missing?

Thanks Fang. There's no specific place for trading adversaries and the like, but if you put them up on something like drop box and include the link, you can share them here.

You can use any of the graphics that you like. Also, for adversaries, there's a "stat block" feature that generates a graphic file for adversary stats. I made this as a simple way to include adversary stat blocks in your own publications without having to do them by hand. That might also help with your blog, or your adventures.

As for starting wound and strain, I suppose a bit of an explanation is in order since I sort of did my own thing here :) Starting values depend on what type of adversary they are. This is because I was noticing a pattern between minions, rivals, and nemeses when it came to their most common starting values. With these starting values in place, it requires less editing because the final values are probably what you wanted to begin with. If they're not, you can adjust them up and down. Anyway, the starting value for wound is 2 for minions, 10 for rivals, and 12 for nemeses. Nemeses start with 10 strain. This is in addition to values from other sources, such as characteristics, talents, or item attachments.

just noticed:

when adding mods to attachments, the cost is 100 per mod, but the roles state it costs 100 more per mod already installed.

This is brilliant! Wish I had known about this before... Any idea when the next update will be so that I can remember to check on this thread?

I too am looking forward to the update, and also the possibility of someone setting up a place for sharing data files for the generator. :-)

Not that this would be used for the sharing of talent/equipment/skill descriptions instead of page numbers. Wink wink,nudge nudge....

Good job OggDude.

just noticed:

when adding mods to attachments, the cost is 100 per mod, but the roles state it costs 100 more per mod already installed.

If I'm reading this right (pg 187), each mod beyond the first costs "an additional 100 credits beyond the base cost". That seems to indicate that the first mod costs 100 credits, and all others cost 200 credits. Is this how everyone else sees it?