• Please note: In an effort to ensure that all of our users feel welcome on our forums, we’ve updated our forum rules. You can review the updated rules here: http://forums.wolflair.com/showthread.php?t=5528.

    If a fellow Community member is not following the forum rules, please report the post by clicking the Report button (the red yield sign on the left) located on every post. This will notify the moderators directly. If you have any questions about these new rules, please contact support@wolflair.com.

    - The Lone Wolf Development Team

Bootstrapping a Minion

zarlor

Well-known member
So does anyone know how the Minion mechanic works? I'd like to have the "Behold A Pale Horse..." Edge from Deadlands add a full on NPC creature I've created for that purpose. I can add the UniqueID of the creature I created to the Minion box, and that does seem add an NPC to the character, and it gives it the name of the Edge (which is fine, as you can change it) but the NPC itself is just base, un-leveled Human character, none of the state from the creature nor does it set itself to even be a creature. Anyone have some ideas on how it's supposed to work?
 
Check out Familiar...

Specifically, edgFamilar under Edges and the thing it bootastraps, mscFamilar under Ally. Here's an example that would add a horse...

Code:
  <thing id="edgGetHors" name="Gimme a Horse"
    description="Gimme a Horse!"
    compset="Edge"
    uniqueness="unique">
    <tag group="MinRank" tag="0"/>
    <tag group="EdgeType" tag="Background"/>
    <bootstrap thing="mscHorse">
      <containerreq phase="Initialize" priority="1000">!hero#thingid.mscHorse</containerreq>
      </bootstrap>
    </thing>

  <thing
    id="mscHorse"
    name="Horse"
    compset="Ally">

    <!-- Attach a minion through this pick that represents an familiar -->
    <minion
      id="familiar"
      isinherit="no">

      <!-- Allies cannot themselves have allies, so we hide the corresponding tab -->
      <tag group="HideTab" tag="allies"/>
      <tag group="MinionType" tag="Creature"/>
      </minion>
    </thing>

The only catch is, you have to click over to the Ally and choose it's Creature Type. This is a user-level selection and I'd have to look into how to force it.
 
Yeah, that's the problem I was running into, since it wouldn't set itself to being a creature our of the gate. If you find a way to force it I'd love to hear about it!
 
BTW, I'm not really sure why that Familiar edge Bootstrapped, well, whatever an "msc" object is supposed to be (Miscellaneous?) but it seems to work fine if I just add it directly as a Minion. Setting a Tag for MinionType Creature was what it needed to at least set it to being a creature. So, if I can't get it to select the Creature Type in the program at least I can set up a text note in the Edge telling the player how to do that, which should work fine.

I have tried setting a Tag for Creature.creDLPalHo (the creature type for Pale Horse) but that doesn't seem to do anything that I can tell, if that makes any difference.
 
I'd request fixed-race minions as an enhancement you'd like to see.

Fixed-race minions are something that Hero Lab can handle (see the Vehicles tab in Shadowrun or the Other tab in Pathfinder), but it looks like the Savage Worlds files haven't been set up to support them.

What that will allow is that you can add a bootstrap of the race to the <minion> entry - currently, you can add that bootstrap, but it will generate lots of errors, and it'll still offer you a choice of races along the top (which allows you to get to the unexpected state of having two races on the same character, which could have all sorts of unforseen consequences).
 
The mscFamilar item that the familiar edge bootstrapped is what shows up on the Ally tab. if you just add the minion directly to the edge (or whatever else is granting this minion), it will work properly, but you won't have that link between the two on the Allies tab.

Looks like as part of this request, you should request that an "Ally Helper" tab (compset="Ally") be added to the editor, so that you have a place to create new items like that mscFamiliar.
 
We're troublemakers like that. Always asking for stuff we apparently don't have yet. ;) Thanks for the advice! Good to know we're not fully set to do this automatically yet.
 
CapedCrusader, do you have access to the Shadowrun files, so you can see how Shadowrun's fixed-race minions are built, or do you need me to copy some of the relevant code, so that you don't need to re-invent the wheel?
 
I apologize for not checking the Savage Worlds folder for a while. I'll get that information copied now.

If I miss something like this again, and you want to bring it to my attention, my email adress is my user name here, @wolflair.com
 
Here's a vehicle from Shadowrun, so you can see what the <minion> entry looks like in use:

Code:
 <thing
  id="vhDodgScoo"
  name="Dodge Scoot"
  compset="Vehicle"
  description="This electric-powered scooter is perfect for whizzing down city streets. Compact and affordable, the Scoot is available in a wide variety of colors, and the plastic chassis can be shop-modified to customer specs.">
  <fieldval field="vehType" value="Scooter"/>
  <fieldval field="vehHandle" value="1"/>
  <fieldval field="vehAccWalk" value="10"/>
  <fieldval field="vehAccRun" value="15"/>
  <fieldval field="vehSpeed" value="60"/>
  <fieldval field="vehPilot" value="1"/>
  <fieldval field="vehBody" value="4"/>
  <fieldval field="vehArmor" value="2"/>
  <fieldval field="vehSensor" value="1"/>
  <fieldval field="grCost" value="3000"/>
  <tag group="VehicleCat" tag="Bike"/>
  <minion id="Vehicle" livefield="minEnabled" ownmode="no" isinherit="yes">
    <tag group="MinionSet" tag="Vehicle"/>
    <bootstrap thing="rvDodgScoo"/>
    </minion>
  </thing>

The relevant parts of the editor tab for that:
Code:
<editthing
  compset="Vehicle"
  name="Vehicle Helper"
  prefix="veh"
  defminion="Vehicle"
  defownmode="no"
  deflivefield="minEnabled"
  description="Weapons, armor, and vehicles all have their own tabs for creating objects of those types."
  summary="To create a vehicle, first, create an entry on the Vehicle tab - that's the vehicle attributes. Then, create this to set up the vehicle's cost and availability.">
<inputthing
  name="Vehicle Statline"
  helptext="Select the statline to use for this Vehicle">
  <it_bootcustom compset="RaceVeh" target="minion">
    </it_bootcustom>
  </inputthing>
<inputthing
  name="Leave Checked"
  helptext="Leave this checked">
  <it_tagcheck group="MinionSet" tag="Vehicle" default="yes" target="minion"/>
  </inputthing>

The defminion, defownmode and deflivefield parts are what's critical there - the rest you probably recognize.

The minEnabled field is simply a field on a component that's shared by all the compsets that add a minion. Having a livefield="" lets you have a checkbox on the main character - if it's not checked, the minion isn't live, and won't clutter up the dashboard. That way, you can leave your vehicle at home, and not have to remove it from all the combats that happen while you're out on an adventure, and away from your vehicle.

Code:
<field
  id="minEnabled"
  name="Minion Enabled"
  defvalue="1"
  minvalue="0"
  maxvalue="1"
  type="user">
  </field>

ownmode="no" means that these minions always share the same creation/advancement choice that the master is in.

isinherit="yes" means that you can't set this minion's sources independantly of the master's - it just inherits everything set for the master.

Note that isinherit="yes" is the default (ownmode="yes" is the default in that case), so that doesn't actually need to be written out. Since Shadowrun's vehicles do use that default, they don't bother adding defisinherit="yes" to the <editthing>
 
Since there are a number of tags that need to go on each minion, the MinionSet.? tags are processed by a script in actor.str, so that adding one tag means that lots of tags actually get set - in an easier way than adding 3-5 tags to every <minion> entry.

Code:
<!-- Timing: before the existence expression on the baRace table in
       tab_basics.dat, which is currently at Initialize/10. That existence
       expression needs to come before the containerreq on rHuman, which is
       at Initialize/500 -->
<eval index="1" phase="Initialize" priority="0" name="Process MinionSet.?"><![CDATA[
  if (hero.tagis[MinionSet.Summoned] + hero.tagis[MinionSet.Compiled] <> 0) then
    perform hero.assign[Hero.Transitory]
    perform hero.assign[Hero.FixedRace]
    perform hero.assign[Hero.Minion]
    perform hero.assign[CharType.typNPCSumm]
  elseif (hero.tagis[MinionSet.Program] <> 0) then
    perform hero.assign[Hero.FixedRace]
    perform hero.assign[Hero.Minion]
    perform hero.assign[CharType.typNPCProg]
  elseif (hero.tagis[MinionSet.Vehicle] <> 0) then
    perform hero.assign[Hero.FixedRace]
    perform hero.assign[Hero.Minion]
    perform hero.assign[CharType.typNPCVeh]
  elseif (hero.tagis[MinionSet.Critter] <> 0) then
    perform hero.assign[Hero.FixedRace]
    perform hero.assign[Hero.Minion]
    perform hero.assign[CharType.typNPCCrit]
  endif
  ]]></eval>

In tab_basics, you can see how the Hero.FixedRace tags are used to control whether there's a race chooser displayed, or a label (with the position script controlling which of these is actually shown):
Code:
<portal
  id="baLblRace"
  style="lblNormal">
  <label>
    <labeltext><![CDATA[
      @text = "Heritage:"
 
      if (hero.tagis[Hero.FixedRace] <> 0) then
        foreach pick in hero from Race
        @text = eachpick.field[name].text
          nexteach
        endif
      ]]></labeltext>
    </label>
  </portal>
 
<portal
  id="baRace"
  style="chsNormal"
  width="175">
  <chooser_table
    component="Race"
    choosetemplate="baRacThing"
    choosesortset="Race"
    descwidth="350"
    showupdate="yes">
    <candidate><![CDATA[
      !Helper.Helper
      ]]></candidate>
    <needtag container="RaceCat" thing="RaceCat"/>
    <!-- Timing: after the "Process MinionSet.?" script in actor.str, which is
currently at Initialize/0.
           After the "Activate Character Type" script in actor.str, which is
currently at Initialize/5
           Before the containerreq on rHuman, which is at Initialize/500 -->
    <existence phase="Initialize" priority="10"><![CDATA[
      !Hero.FixedRace & !Hero.FixedHerit
      ]]></existence>
    <chosen><![CDATA[
      ~if the chosen race is non-live, we always want the "Select Race" text
      ~to show up, to prompt the user that they need to pick something else
      ~NOTE: We need to specify showupdate="yes" to make sure the text
      ~ updates appropriately at events like "chosen pick becoming live"
      if (@ispick = 0) then
        @text = "{text clrwarning}Select " & herofield[acRacCatNm].text
      elseif (@islive = 0) then
        @text = "{text clrwarning}Select " & herofield[acRacCatNm].text
      else
        @text = "Race: " & field[name].text
        endif
      ]]></chosen>
    <titlebar><![CDATA[
      @text = "Choose the " & lowercase(herofield[acRacCatNm].text) & " for your character"
      ]]></titlebar>
    </chooser_table>
  </portal>

The <existence> element in that is probably something you haven't seen before - Shadowrun, like Savage Worlds, has a default setting - Human - for its race chooser. So, if you're a fixed race, that default selection needs to pretend it doesn't exist.

Similarly, on form_config, various tags are used to control what actually needs to show up for a minion - they're always NPCs, so there's no need for a PC/NPC selector, for example.
 
Back
Top