{"action":"created","issue":{"url":"https://api.github.com/repos/EmmittJ/PoESkillTree/issues/210","labels_url":"https://api.github.com/repos/EmmittJ/PoESkillTree/issues/210/labels{/name}","comments_url":"https://api.github.com/repos/EmmittJ/PoESkillTree/issues/210/comments","events_url":"https://api.github.com/repos/EmmittJ/PoESkillTree/issues/210/events","html_url":"https://github.com/EmmittJ/PoESkillTree/pull/210","id":109889346,"number":210,"title":"Skill tree generator - first set of features","user":{"login":"brather1ng","id":7596346,"avatar_url":"https://avatars.githubusercontent.com/u/7596346?v=3","gravatar_id":"","url":"https://api.github.com/users/brather1ng","html_url":"https://github.com/brather1ng","followers_url":"https://api.github.com/users/brather1ng/followers","following_url":"https://api.github.com/users/brather1ng/following{/other_user}","gists_url":"https://api.github.com/users/brather1ng/gists{/gist_id}","starred_url":"https://api.github.com/users/brather1ng/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/brather1ng/subscriptions","organizations_url":"https://api.github.com/users/brather1ng/orgs","repos_url":"https://api.github.com/users/brather1ng/repos","events_url":"https://api.github.com/users/brather1ng/events{/privacy}","received_events_url":"https://api.github.com/users/brather1ng/received_events","type":"User","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"milestone":null,"comments":12,"created_at":"2015-10-05T21:24:34Z","updated_at":"2015-10-14T20:34:29Z","closed_at":"2015-10-14T19:54:44Z","pull_request":{"url":"https://api.github.com/repos/EmmittJ/PoESkillTree/pulls/210","html_url":"https://github.com/EmmittJ/PoESkillTree/pull/210","diff_url":"https://github.com/EmmittJ/PoESkillTree/pull/210.diff","patch_url":"https://github.com/EmmittJ/PoESkillTree/pull/210.patch"},"body":"The skill tree generator implementation (see #106) is now at a point where it has enough features to be worth including in the program in my opinion.\r\n\r\n### New features\r\n\r\nThe user can input basic attributes ('#% increased maximum Life', '#% increased Attack Speed with Bows', everything that appears on skill nodes) and pseudo attributes (where the basic attributes are simply added together given settings for weapon class, tags and off hand style, like '#% increased (total) Physical Damage') as constraints with a target value and a weight for which the program tries to find the optimal tree with respect to those constraints and a given number of points available. What is not yet implemented are constraints that include the gear in any shape or form and an automated solver that derives the constraints in some kind of heuristical way.\r\n\r\n### UI overview\r\n\r\nYou can finde the generator under the menu at \"Tools -> Nodes -> Skill Tree Generator\". In the window are some general settings and a tab for every different solver. \"Advanced\" contains the new functionality, \"Automated\" does nothing atm and \"Tagged Nodes\" is exactly the \"Skill Tagged Nodes\" feature (which is multiple times faster now), included there for testing purposes.\r\n\r\nIn the \"Advanced\" tab, \"Attributes\" is for the raw attributes, \"Pseudo Attributes\" is for combined raw attributes, \"Combined Attributes\" will later be for stuff including the gear and \"Settings\" contains settings related to which raw attributes are calculated into pseudo attributes atm. One thing worth pointing out is that keystones will only be included in solutions if they are check-tagged (so if you check Phase Acro but not Acro and click \"Run\", it will give you an error because the tree is disconnected).\r\n\r\nIf you think this is in a pull worthy state, I'll remove the things that don't do anything from the UI for the pull.\r\n\r\n### \"Optimize existing tree\" use case\r\n\r\nYou can optimize an existing tree as follows:\r\n\r\n1. Skill your tree in the general UI.\r\n2. Open the skill tree generator window and make sure total points equals the number of skilled nodes (if you start it after skilling the tree and it is the first start, it should do that automatically, if not, change additional points until total points are correct or click \"Reset\").\r\n4. Switch to \"Advanced\" -> \"Settings\" and select weapon class, off hand and tags fitting your build and main skill.\r\n5. Switch to \"Attributes\", click \"Load from tree\" and then \"Convert to pseudo attributes\".\r\n6. Remove attribute constraints that are unimportant for you.\r\n7. Switch to \"Pseudo Attributes\" and remove constraints that are unimportant for you.\r\n8. Make sure the automatically check-tagged nodes are only nodes you feel must be included in any case (like keystones and important notables).\r\n9. Optionally check the \"current tree as initial solution\" check box. If similar trees are better, this will generally produce better results. If the tree needs to change heavily, it will generally produce worse results. If you keep it unchecked, make sure to reset the skill tree.\r\n10. Click \"Run\" and wait.\r\n\r\nDo note that trees are very specific, so if it is already an acceptable tree, it probably won't get any better outside of pathing between nodes for which \"Skill Tagged Nodes\" is suited much better.\r\n\r\n### Pseudo attributes in the general planner\r\n\r\nSince the support for pseudo attributes was already requested for the general tree planner (see #185) and my implementation would easily support it, I'd work on that before implementing the missing generator features if others find it useful.\r\n\r\nMy implementation loads the definitions of pseudo attributes with contained attributes and their conditions from xml files and evaluates if attributes are calculated into the pseudo attribute based on those conditions. See the [Data/PseudoAttributes](https://github.com/brather1ng/PoESkillTree/tree/treeGen/WPFSKillTree/Data/PseudoAttributes) folder for the xml files and the [TreeGenerator/Model/PseudoAttributes](https://github.com/brather1ng/PoESkillTree/tree/treeGen/WPFSKillTree/TreeGenerator/Model/PseudoAttributes) folder for the implementation.\r\n\r\n### Screenshots\r\n\r\n![Attributes Tab](https://cloud.githubusercontent.com/assets/7596346/10293759/94a4e186-6bb6-11e5-83d3-e1bf4129607a.PNG)\r\n![Pseudo Attributes Tab](https://cloud.githubusercontent.com/assets/7596346/10293767/9bfc917c-6bb6-11e5-894b-c2c79b27f6b5.PNG)\r\n![Settings Tab](https://cloud.githubusercontent.com/assets/7596346/10293774/a8d2d406-6bb6-11e5-87e7-3789d795f826.PNG)\r\n\r\nIf you like to have a download link to the compiled program for trying it out, I'll try to get that up."},"comment":{"url":"https://api.github.com/repos/EmmittJ/PoESkillTree/issues/comments/148188053","html_url":"https://github.com/EmmittJ/PoESkillTree/pull/210#issuecomment-148188053","issue_url":"https://api.github.com/repos/EmmittJ/PoESkillTree/issues/210","id":148188053,"user":{"login":"brather1ng","id":7596346,"avatar_url":"https://avatars.githubusercontent.com/u/7596346?v=3","gravatar_id":"","url":"https://api.github.com/users/brather1ng","html_url":"https://github.com/brather1ng","followers_url":"https://api.github.com/users/brather1ng/followers","following_url":"https://api.github.com/users/brather1ng/following{/other_user}","gists_url":"https://api.github.com/users/brather1ng/gists{/gist_id}","starred_url":"https://api.github.com/users/brather1ng/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/brather1ng/subscriptions","organizations_url":"https://api.github.com/users/brather1ng/orgs","repos_url":"https://api.github.com/users/brather1ng/repos","events_url":"https://api.github.com/users/brather1ng/events{/privacy}","received_events_url":"https://api.github.com/users/brather1ng/received_events","type":"User","site_admin":false},"created_at":"2015-10-14T20:34:29Z","updated_at":"2015-10-14T20:34:29Z","body":"I did run those tests at some point ...\r\nProbably changed something so it gets thrown at a different point. I'll look into it in a few minutes."}}