Lone Wolf Development Forums

Lone Wolf Development Forums (http://forums.wolflair.com/index.php)
-   HL - Savage Worlds (http://forums.wolflair.com/forumdisplay.php?f=59)
-   -   Speaking of Broken Earth... (http://forums.wolflair.com/showthread.php?t=57670)

Paragon February 11th, 2017 02:58 PM

Speaking of Broken Earth...
 
Now that I'm going to actually be using it, I notice two of the "community" edges (these are particular traits of a community, not something attached to a chracter) allow the PCs to learn two skills with an advance rather than one, one only Knowledges, one general. I'm pretty sure the easiest way to do this is to have a couple of false "edges" that refund their own cost or pieces of "equipment" that do what I need; however, I'm not entirely clear on how to produce that result. Anyone care to enlighten me?

CapedCrusader February 11th, 2017 04:08 PM

You can set the number of Advancement slots that an Edge takes up. Just set it to 0 for those.

Paragon February 11th, 2017 06:35 PM

Yes, but how do I tell it to give the character an extra skill--and only skill--Advance?

SeeleyOne February 12th, 2017 10:33 AM

You are too vague in what you are asking. Do you mean that the Edge gives a one-time benefit, or do you mean that it occurs every single time that someone wants to "learn a new skill" or "increase lesser skill" as an Advance? There is a distinction between character creation and Advances, even though it is rather clumsy at times within Hero Lab. Edges can be "creation only" but otherwise an object has no idea if it was taken at creation or as an Advance, which is a bug in my opinion -- it is most evident when you want an Edge to bootstrap a new skill.

Since I have no idea what you want, I will guess and give some options:

1) have it give a half an Advance when the Edge is taken. This is only valid if the Edge can be taken as an Advance.

2) have it give half a skill point when the Edge is taken if this is a Creation-Only Edge. This limits it to skills, too.

3) have it give back half an Advance afterwards. I did this with my "Free Attributes per Rank" mod. The player adds the additional skill and a mechanic counts the "lesser skills" or "new skills" and refunds a point.

Based on what you are saying, probably both 1 and 2, since, again, Hero Lab is clueless about when you take an Edge.

Paragon February 12th, 2017 09:08 PM

Let me quote the two community "edges" (they're really things you get when you do certain improvements to the PC's community, since community building is part of the game) so what I'm looking at is clear.

"Computerized Library
This represents a wealth of digital information that
characters can access through a computer interface.
Community Benefit: Economy and Morale both
increase by one die type.
PC Benefit: When PCs Advance, they can take two
new Knowledge skills for a single Advance. "

and (I'd actually misremembered this one, as its more specific than I thought):

"Public School
Requires: Books or Computerized Library, 12 Build, 12
weeks
This is a public space for learning. All in the community
are welcome, though there is a particular emphasis on
educating young people.
Community Benefit: Once each year the community
can add one new Citizen Edge without needing to recruit
anybody.
PC Benefit: When they take an Advance, PCs may
choose to learn two new skills at d4 instead of the normal
one."

SeeleyOne February 13th, 2017 05:20 PM

A non-working option is to make up an Advance that requires the Edge. But that does not work because Advances cannot have requirements. Too bad for us since that would be ideal for this situation.

You could make an Edge for Public School with an eval script that looks for the New Skill Advance. If it finds at least one then it gives another half of an Advance to the character. If this Edge can exist more than once on the same character (it does not look like it can) then it would be better with a mechanic that counts both the number of times this edge is taken and the number of "new skill" Advances.

The Computerized Library could look for two New Skills that are Knowledge skill, at which point it can give the 0.5 Advance refund. This way they only get the benefit if it is two Knowledge skills and you do not have to mess with bootstrapping.

zarlor February 13th, 2017 06:33 PM

I think the important thing to note here is that these are not Edges at all. More like benefits for a Group or Faction, so they wouldn't need to do what an Edge does, in that sense, or cost an Edge or Advance or the like. So it's probably better not to call these Edges at all because that can imply a certain mechanic/methodology within Hero Lab. Although you may still be able to use a Group or Faction to handle these it seems to me this is another situation where we could use another class of "Abilities" for things that just aren't Edges or Hindrances but could potentially use the available coding sections of those things to just do whatever other stuff we a particular setting might need.

SeeleyOne February 13th, 2017 06:50 PM

Edges are the easiest way to add something to a character. They are not REAL edges. Since you can only have one Group and one Faction I would recommend against using those, especially for a one-time addition.

Edges really are the best way within the framework of Hero Lab. A reward would also work, but then you have to jump into Creation Mode and that is against the point of an Advance.

SeeleyOne February 13th, 2017 06:52 PM

What I do in the case of 0-cost and 0.5 cost edges is that I make it obvious in its name. "0 - Public School" and "0 - Computerized Library" would do it. This way people know that it is not REALLY an Edge. If you put 0 in the cost it really is free.

CapedCrusader February 13th, 2017 08:48 PM

Ouch.
Well, I'd create a new type of Advance for each of these. Take the standard advance that adds a new Skill and make it cost half an advance like raising a lesser Skill. You'll want to add a source tag so it only shows up in your Setting.

Code:

  <thing
    id="advSkillPS"
    name="Gain a New Skill from PS"
    compset="Advance"
    description="Select a new skill at a d4 rating.">
    <fieldval field="advAction" value="New Skill"/>
    <fieldval field="advDynamic" value="component.Skill &amp; !Hide.Skill"/>
    <fieldval field="advCost" value=".5"/>
    <tag group="Advance" tag="AddNew"/>
    <tag group="DomainTerm" tag="Focus"/>
    <!-- Modify tagexpr to deny skills that have already been added to the character -->
    <eval index="1" phase="Render" priority="1000">
      <before name="Assign Dynamic Tagexpr"/><![CDATA[
      ~get the list of all unique skills on the hero and assemble it as a list of precluded tags
      var tagexpr as string
      foreach pick in hero from Skill where "!Hide.Skill"
        if (eachpick.isunique <> 0) then
          tagexpr &= " & !Skill." & eachpick.idstring
          endif
        nexteach

      ~if there are any tags to exclude, append them to the tagexpr appropriately
      if (empty(tagexpr) = 0) then
        field[advDynamic].text &= tagexpr
        endif
      ]]></eval>

    <!-- Attach the child entity for tracking the advance -->
    <child entity="Advance">
      <tag group="Advance" tag="MustChoose"/>
      </child>
    </thing>


Paragon February 14th, 2017 08:06 AM

Yeah, its not the first time I've had things that were outside the normal advancement schemata come up; I usually ended up faking them with virtual "equipment" which I was considering doing here. I just wasn't sure how.

This is just another one of the places where the fact that SW considers advancement in a way more than a little different that it does character building is not helpful; were it a pure build system I suspect this would be a lot easier.

I'll give your approach a try when I get a little time, CC. Thanks for the help from all three of you, as always.

CapedCrusader February 14th, 2017 12:12 PM

Well, we have to deal with the fact that the advancement system works completely differently than the character creation system. It's the way Savage Worlds is designed.

SeeleyOne February 14th, 2017 04:35 PM

The above works if they can be taken multiple times. If they can only be taken once, add this into the thing id part, before the >

Code:

uniqueness="unique"

Paragon February 15th, 2017 07:03 AM

Yeah, its not the only place where SW's set-up here creates artifacts in some cases. I bet whoever did the HL file I've heard is out there for Accursed had just piles of fun...

Paragon April 9th, 2017 06:22 PM

I was finally getting around to doing this, and realized I don't know where the extent Advance mechanics are stored; they don't seem to have an Editor tab of their own. Could someone point me in the right direction?

CapedCrusader April 11th, 2017 09:08 AM

What do you need on this?

Paragon April 11th, 2017 11:01 AM

Where do I actually go to add a custom Advance? Even if I do it directly in the XML I need an example to work from, and I can't seem to find a place the extent ones are stored. There's an entry for Advances in the Simple tab, but that seems to be about how Advance points are counted, not how they're actually structured. There's a tab for Rewards, but not one for Advances.

SeeleyOne April 12th, 2017 04:56 PM

What I did was make a user file, and then edit it outside of the editor as this one contains nothing that the editor can read. I ended mine with "Data" in its name to remind me that it is just a data file, not really a "user" file as we normally use them.

This is mine:
Code:

<?xml version="1.0" encoding="ISO-8859-1"?>



<document signature="Hero Lab Data">
  <!-- ADVANCES -->
  <!-- Attribute Increases -->
  <thing id="advAttriN" name="Boost Attribute (Novice)" description="Increase an attribute by one die type." compset="Advance" replaces="advAttrib" uniqueness="unique">
    <fieldval field="advAction" value="Novice Boost Attribute"/>
    <fieldval field="advDynamic" value="component.Attribute &amp; !Helper.Maximum &amp; !Hide.Attribute"/>
    <fieldval field="advCost" value="1"/>
    <tag group="Advance" tag="Increase"/>
    <child entity="Advance"></child>
  </thing>
  <thing id="advAttriS" name="Boost Attribute (Seasoned)" description="Increase an attribute by one die type." compset="Advance" uniqueness="unique">
    <fieldval field="advAction" value="Seasoned Boost Attribute"/>
    <fieldval field="advDynamic" value="component.Attribute &amp; !Helper.Maximum &amp; !Hide.Attribute"/>
    <fieldval field="advCost" value="1"/>
    <tag group="Advance" tag="Increase"/>
    <child entity="Advance"></child>
  </thing>
  <thing id="advAttriV" name="Boost Attribute (Veteran)" description="Increase an attribute by one die type." compset="Advance" uniqueness="unique">
    <fieldval field="advAction" value="Veteran Boost Attribute"/>
    <fieldval field="advDynamic" value="component.Attribute &amp; !Helper.Maximum &amp; !Hide.Attribute"/>
    <fieldval field="advCost" value="1"/>
    <tag group="Advance" tag="Increase"/>
    <child entity="Advance"></child>
  </thing>
  <thing id="advAttriH" name="Boost Attribute (Heroic)" description="Increase an attribute by one die type." compset="Advance" uniqueness="unique">
    <fieldval field="advAction" value="Heroic Boost Attribute"/>
    <fieldval field="advDynamic" value="component.Attribute &amp; !Helper.Maximum &amp; !Hide.Attribute"/>
    <fieldval field="advCost" value="1"/>
    <tag group="Advance" tag="Increase"/>
    <child entity="Advance"></child>
  </thing>
  <thing id="advAttriL" name="Boost Attribute (First Legendary)" description="Increase an attribute by one die type." compset="Advance" uniqueness="unique">
    <fieldval field="advAction" value="Legendary Boost Attribute"/>
    <fieldval field="advDynamic" value="component.Attribute &amp; !Helper.Maximum &amp; !Hide.Attribute"/>
    <fieldval field="advCost" value="1"/>
    <tag group="Advance" tag="Increase"/>
    <child entity="Advance"></child>
  </thing>
  <thing id="advAttriZ" name="Boost Attribute (Legendary)" description="Increase an attribute by one die type." compset="Advance">
    <fieldval field="advAction" value="Legendary Boost Attribute"/>
    <fieldval field="advDynamic" value="component.Attribute &amp; !Helper.Maximum &amp; !Hide.Attribute"/>
    <fieldval field="advCost" value="1"/>
    <tag group="Advance" tag="Increase"/>
    <child entity="Advance"></child>
  </thing>

  <!-- New Skill -->
  <thing id="advSkiLL" name="Gain a New Skill" description="Select a new skill at a d4 rating." compset="Advance" replaces="advSkill">
    <fieldval field="advAction" value="New Skill"/>
    <fieldval field="advDynamic" value="component.Skill &amp; !Hide.Skill"/>
    <fieldval field="advCost" value=".5"/>
    <tag group="Advance" tag="AddNew"/>
    <tag group="DomainTerm" tag="Focus"/>
    <eval phase="Render" priority="1000">
      <![CDATA[
      ~get the list of all unique skills on the hero and assemble it as a list of precluded tags
      var tagexpr as string
      foreach pick in hero from Skill where "!Hide.Skill"
        if (eachpick.isunique <> 0) then
          tagexpr &= " & !Skill." & eachpick.idstring
          endif
        nexteach

      ~if there are any tags to exclude, append them to the tagexpr appropriately
      if (empty(tagexpr) = 0) then
        field[advDynamic].text &= tagexpr
        endif]]>
      <before name="Assign Dynamic Tagexpr"/>
    </eval>
    <child entity="Advance">
      <tag group="Advance" tag="MustChoose"/>
    </child>
  </thing>

  <!-- Power points tracker so the user can manage the expenditure of power points -->
  <thing
    id="trkPowNoHi"
    name="Power Points"
    compset="Tracker">

    <fieldval field="trkMin" value="0"/>
    <fieldval field="trkMax" value="0"/>

    <!-- Resetting the tracker sets the value to the maximum -->
    <tag group="Helper" tag="ResetMax"/>
  </thing>
 
  <!-- Shootist Power points tracker -->
  <thing
    id="trkPowSh"
    name="Shootist Pool"
    compset="Tracker">

    <fieldval field="trkMin" value="0"/>
    <fieldval field="trkMax" value="0"/>

    <!-- Resetting the tracker sets the value to the maximum -->
    <tag group="Helper" tag="ResetMax"/>
  </thing>
 
  <!-- Free Soaks tracker so the user can manage the expenditure soaks -->
  <thing
    id="trkSoak"
    name="Soak Pool"
    compset="Tracker">

    <fieldval field="trkMin" value="0"/>
    <fieldval field="trkMax" value="0"/>

    <!-- Resetting the tracker sets the value to the maximum -->
    <tag group="Helper" tag="ResetMax"/>
  </thing>

  <!-- Adaptable Warrior tracker so the user can manage the expenditure soaks -->
  <thing
    id="trkAdWar"
    name="Adaptable Warrior"
    compset="Tracker">

    <fieldval field="trkMin" value="0"/>
    <fieldval field="trkMax" value="0"/>

    <!-- Resetting the tracker sets the value to the maximum -->
    <tag group="Helper" tag="ResetMax"/>
  </thing>

  <!-- Versatile Caster tracker so the user can manage the expenditure soaks -->
  <thing
    id="trkVCast"
    name="Versatile Caster"
    compset="Tracker">

    <fieldval field="trkMin" value="0"/>
    <fieldval field="trkMax" value="0"/>

    <!-- Resetting the tracker sets the value to the maximum -->
    <tag group="Helper" tag="ResetMax"/>
  </thing>
</document>

For the Soak Pool above, I have the players get one free Soak roll per session per Rank. It is the initial roll, and may not be used for a re-roll.

For Adaptable Warrior, that is the number of uses per session to use a Combat Edge that the character does not normally have.

SeeleyOne April 12th, 2017 04:57 PM

I hate that the Attribute advances do not tell you that you cannot use them until after you get one "naughty, you selected one too many!". So I made different versions for each Rank.

Paragon April 12th, 2017 06:04 PM

So its still done with the typical <thing></thing> pattern, the editor just doesn't really interact with it? In other words, if I just get in and insert the two special advances in the .user file it should, theoretically, work? CC's post seemed to suggest going about it by copy and edit, which is what's throwing me off here.

Also, there are two other things:
1. The half advances should only be takeable two times each; once for the two associated with the Computerized Library, and once for the two associated with the Public School. You mentioned that I need to mark the uniqueness flag; won't that, in practice, only let people take one of these each, rather than two? If so, is there a syntax that can let it be taken a second time, but only a second?
2. How would I construct the one that only lets you take Knowledge skills differently (the Computerized Library)?

SeeleyOne April 13th, 2017 03:53 PM

You could probably put it inside the normal one. I have it separate because I wondered if perhaps the editor, not seeing, might mess with it.

For limiting the 1) to two, I would make two versions, each being unique like I did with the attribute advances. Hero Lab does not interact with Advances like it does the other things so it would not see if you tried to specify how many times. Also, you cannot preclude an Advance (like if you have a setting that wants to turn one off).

An idea for 2) is to see if you can make one that has the Knowledge skill bootstrapped twice. I do not know if an Advance can bootstrap anything, but if it can, you can bootstrap something to the same object more than once.

Paragon April 13th, 2017 05:18 PM

Worth a try. Thanks.

Paragon April 13th, 2017 05:39 PM

Well at least the first part works--I'd initially had an error, but it turned out to be a cut and paste artifact.

Paragon April 13th, 2017 06:11 PM

Well, the Knowledge bootstrapping worked, but I'm getting a couple of issues:

1. Its giving an error message:

Attempt to access non-existent containing entity from script
Location: 'eval' script for Component 'Advance' (Eval Script 'Accrue Advances') near line 3
- - -
Attempt to access non-existent containing entity from script
Location: 'eval' script for Component 'Advance' (Eval Script '#6') near line 11
- - -
Attempt to access non-existent containing entity from script
Location: 'eval' script for Component 'Advance' (Eval Script '#6') near line 16

2. Its counting me as having used two more skill points from initial construction. I'm guessing I could fix that by adjusting the skill points with a script, unless there's a better way to do it.

SeeleyOne April 13th, 2017 09:01 PM

I would have to see the first one to comment.

As for the second, I would have a mechanic that looks for the Advances and then credits the skill points.

This starts the search
Code:

  ~ Check for spent Advances
  foreach pick in hero from Advance sortas _CompSeq_

This searches for one of the Advances, in this case my Novice Attribute
Code:

if (eachpick.tagis[AdvanceId.advAttriN] <> 0) then
Then inside that if statement, with your new advance as advAttriN, you would have it add the skill points.

SeeleyOne April 13th, 2017 09:05 PM

Oh, I do not think that an Advance can have an eval script. That is probably what you are doing based on that comment. Make a mechanic that then evaluates it. Give it the source for your data file.

Actually, I don't put sources on my mechanics, I enclose them in something like
Code:

if (hero.tagis[source.CivSav] = 1) then
I do not recall why I started to do this, only that some mechanics work better that way. I think that it had to do with NPCs and creatures, as they often do not apply sources correctly.

Paragon April 14th, 2017 06:58 AM

I probably tried to do it too quick and dirty, since all the advance I've got written really does is the bootstrap. I probably should have tried adapting more of CC's code (since that worked with the first part) but its extensive and I frankly don't understand some of it, so I was trying to keep it simple. It probably means there's things missing I need there.

Paragon April 14th, 2017 06:41 PM

Okay, did a bit more work with it, and it turns out you can do an eval script in an Advance. So I managed to fix the second part of the issue with the two bootstrapped Knowledge skills, but apparently I'm still missing things I need to put in the Advance, because though its working I'm getting an error message. First, let me show the code I'm using for the Advance (its very simple, which is probably the problem; I probably need some of the components from the code CC gave me, but I don't know which parts, and if I try to use it all it doesn't work):

Code:

<thing id="advBEKnCL" name="Computerized Library Knowledges" compset="Advance" description="Acquire two new Knowledges at a d4 rating." uniqueness="unique">
    <bootstrap thing="skKnow"></bootstrap>
    <bootstrap thing="skKnow"></bootstrap>
    <eval phase="PreTraits" priority="5000"><![CDATA[perform #resspent[resSkill,-,2,"Computerized Library Knowledges"]]]></eval>
    </thing>

This shows and is selectable as an advance, and properly bootstraps two Knowledges, and properly offsets the skill point cost. However when I do it I get the following errors:

"Attempt to access non-existent containing entity from script
Location: 'eval' script for Component 'Advance' (Eval Script 'Accrue Advances') near line 3
- - -
Attempt to access non-existent containing entity from script
Location: 'eval' script for Component 'Advance' (Eval Script '#6') near line 11
- - -
Attempt to access non-existent containing entity from script
Location: 'eval' script for Component 'Advance' (Eval Script '#6') near line 16"

Now I could probably just go put the damn thing in as an Edge and let the rest of the process do its magic, but if I can do it directly as an Advance, since I'm doing the other one that way I'd rather do this one like that, too.

Anyone's help is much appreciated here.

SeeleyOne April 14th, 2017 09:00 PM

I am curious if having the Advance bootstrap an Edge instead might work better. Sometimes Edges work more easily than skills.

Paragon April 15th, 2017 06:57 AM

Well, if I'm going to use an edge, I can just use the normal Advance process; not like I couldn't have an Edge bootstrap the skills and offset the cost. I'd prefer to do it directly with the Advance, though.

SeeleyOne April 15th, 2017 08:03 AM

I had initially recommended the Edge. The Edge and Advancement is the same cost. The only difference is that there is no way to have an "Advancement-only" Edge. Too bad, because there is a "creation-only", but that is really a relic from earlier editions as it used to be that Background Edges could only be taken at creation.

You could go the way of the other Edges and Advancements that are taken when they should not be and make a Validation warning if it is not taken with an Advance. But I personally hate the "after-the-fact" warnings.

However, if you cannot get the Advance to work the way that you want, as they are much simpler objects within Hero Lab than Edges, you might have to or else there will always be those warnings. And they will continue while using that character.

Paragon April 15th, 2017 01:22 PM

Well, these have to be paid attention to anyway since its dependent on an outside function the program can't check for anyway (the community "edge"), so that part doesn't bother me. But I'd have preferred to either do both of them as Edges or both as Advances.

Paragon April 18th, 2017 06:44 AM

It occurs to me that those errors probably are referring to something in the Advance mechanic; I should probably pull that up and look at it.

Paragon April 18th, 2017 06:57 AM

Hey, SeelyOne, since at least you're looking at this, when you were setting up the file you indicated on page 2 of this thread, how did you even know how to format the Advance? Obviously what CC showed me is a variation of the standard skill advance, and you have examples that seem to be modified attribute and skill advances in yours, but how did you even know what they looked like? Part of the thing frustrating with this problem has been I don't even have the originals to model off of (though I suppose I could just look at what you and CC did and try clipping out parts that seem unnecessary and see what happens...)

SeeleyOne April 18th, 2017 03:37 PM

I looked at the stuff in the "C:\ProgramData\Hero Lab\data\savage". There is a folder called "source" that has much of the data that Savage Worlds looks at.

Paragon April 19th, 2017 06:14 AM

Ah, I see--"thing.advances.dat". I'm not sure it will help, but it at least gives me something to look for. Unfortunately, doing things in there with a bootstrap is unprecedented, so I'll have to experiment anyway.

Paragon April 19th, 2017 06:17 AM

I suspect it'd be better if I could just use something like what CC suggested for the other one, but instead of <fieldval field="advDynamic" value="component.Skill &amp; !Hide.Skill"/> do something that specifically pulled Knowledges. Unfortunately I don't have a clue how to do the syntax for that. Maybe looking at the syntax on the Knowledges themselves will give me a hint.

zarlor April 19th, 2017 06:32 AM

Looking at the source folder is useful to see how things were built, but it's not active code so if you tried to make changes in there it wouldn't do anything. It can be useful for seeing the code used, however, and potentially for ways to use such things in your own .user files.

Paragon April 19th, 2017 08:45 AM

That was all I was doing was seeing what the native Advances look like. I'm probably going to fiddle with bits of code extracted today to see if I can use them to make the error messages go away. I'll probably start by just copying the whole code for the New Skill and start stripping off things.

Paragon April 19th, 2017 10:59 AM

Well, none of that worked. Any attempt to combine my bootstrap-using Advance with something like the normal new skill Advance threw error messages of one stripe or another, usually indicating it didn't recognize one of the tag assigns, or didn't recognize what a bootstrap was.

I think I'll leave this here for a while just on the off-chance someone can make sense out of those error messages I listed back in post #28, and if no one does in the next week I'll just have to go do it with the Edge method, though that makes my brain itch.


All times are GMT -8. The time now is 12:40 PM.

Powered by vBulletin® - Copyright ©2000 - 2024, vBulletin Solutions, Inc.
wolflair.com copyright ©1998-2016 Lone Wolf Development, Inc. View our Privacy Policy here.