Ranged Weapons (Savage)
Context: HL Kit … Authoring Examples … Savage Worlds Walk-Through
Overview
Now that hand weapons are in place, we'll continue with ranged weapons.
Ranged Weapons
Ranged weapons in Savage Worlds introduce four new variable ratings that need to be tracked, as well as a handful of special attributes that are either present or not. The variable ratings corresponding to the following characteristics: rate of fire, number of shots, number of actions to reload, and ammunition type. They can be managed via new fields that we'll add to the "WeapRange" component, which is defined in the file "equipment.str". They should look similar to the field definitions provided below.
<field id="wpReload" name="Actions to Reload" type="static"> </field> <field id="wpFireRate" name="Rate of Fire" type="static" defvalue="1" maxlength="10"> </field> <field id="wpShots" name="Number of Shots" type="static"> </field> <field id="wpAmmo" name="Ammunition" type="static" maxlength="10"> </field>
The special attributes represent facets of weapons that are optionally present, such as snap fire, double tap, three-round burst, etc. All of these are either present or not, so they can be best represented as individual tags. The Skeleton files provide a tag group intended just for this purpose, with the id "Weapon". So we can add each of the tags we need to this tag group in the file "tags.1st". Whichever tags apply to a given weapon can simply be assigned to the thing. The revised tag group should look similar to the example shown below.
<group id="Weapon"> <value id="SpecRange" name="Range is special"/> <value id="SnapFire" name="Snap Fire"/> <value id="DoubleTap" name="Double Tap"/> <value id="HvyWeapon" name="Heavy Weapon"/> <value id="HighExplos" name="High Explosive"/> <value id="ThreeRound" name="Three-Round Burst"/> <value id="NoMove" name="May Not Move"/> <value id="Revolver"/> <value id="SemiAuto" name="Semi-Auto"/> <value id="FullAuto" name="Full-Auto"/> <value id="Shotgun"/> <value id="MedBurst" name="Medium Burst Template"/> <value id="SmallBurst" name="Small Burst Template"/> <value id="LargeBurst" name="Large Burst Template"/> <value id="ConeTempl" name="Cone Template"/> <value id="Reload1" name="1 action to reload"/> </group>
Just like we did for hand weapons, the new fields and attributes need to be included within the weapon description details. The description for ranged weapons is handled by the "InfoRange" procedure within the file "procedures.dat". We only add the new information when it applies. This yields code that should look similar to the following.
<procedure id="InfoRange" context="info"><![CDATA[ ~declare variables that are used to communicate with our caller var iteminfo as string ~start with generic details for all weapons call InfoWeapon ~add the range details for the weapon iteminfo &= "Range: " & field[wpRange].text & "{br}" ~report the fire rate of the weapon (if any) iteminfo &= "Rate of Fire: " & field[wpFireRate].text & "{br}" ~report the number of shots for the weapon (if any) if (field[wpShots].value > 0) then iteminfo &= "# Shots: " & field[wpShots].value & "{br}" endif ~report the number of actions to reload the weapon (if any) if (field[wpReload].value > 0) then iteminfo &= "Actions to Reload: " & field[wpReload].value & "{br}" endif ~report the ammunition for the weapon (if any) if (field[wpAmmo].isempty = 0) then iteminfo &= "Ammunition: " & field[wpAmmo].text & "{br}" endif ]]></procedure>
We also need to add the new fields and attributes to the special notes shown for weapons on the Armory tab. This can be done via the Eval script within the "WeapRange" component that performs this function. The exception is the ammunition type, which doesn't belong here and can be accessed via the description text if the user wants to reference that info. The code parallels what we've already done for hand weapons, which results in a revised script that looks like the following.
<eval index="2" phase="Render" priority="2000"><![CDATA[ var special as string ~report the rate of fire for the weapon if (empty(special) = 0) then special &= ", " endif special &= "RoF " & field[wpFireRate].text ~report the number of shots for the weapon (if any) if (field[wpShots].value <> 0) then if (empty(special) = 0) then special &= ", " endif special &= "Shots " & field[wpShots].value endif ~report the reload actions of the weapon (if any) if (field[wpReload].value <> 0) then if (empty(special) = 0) then special &= ", " endif special &= "Reload " & field[wpReload].value & " action(s)" endif ~prepend any existing special details with the notes for this weapon if (empty(special) = 0) then if (field[wpNotes].isempty = 0) then special &= ", " endif field[wpNotes].text = special & field[wpNotes].text endif ]]></eval>
Add Ranged Weapons
We can now begin adding all of the various ranged weapons to the data files. As with hand weapons, they should be added to the file "thing_armory.dat". A few examples are provided below. You can either add the rest or pull them out of the complete Savage Worlds data files that are provided.
<thing id="wpCrossbow" name="Crossbow" compset="Ranged" description="Description goes here"> <fieldval field="wpDamage" value="2d6"/> <fieldval field="wpShort" value="15"/> <fieldval field="wpMedium" value="30"/> <fieldval field="wpLong" value="60"/> <fieldval field="wpStrReq" value="3"/> <fieldval field="wpPiercing" value="2"/> <fieldval field="wpReload" value="1"/> <fieldval field="grCost" value="500"/> <fieldval field="grWeight" value="10"/> <usesource id="TimeMedi"/> <tag group="WeaponType" tag="MedRange"/> <tag group="Equipment" tag="TwoHand"/> </thing> <thing id="wpColt1911" name="Colt 1911" compset="Ranged" description="Description goes here"> <fieldval field="wpDamage" value="2d6+1"/> <fieldval field="wpShort" value="12"/> <fieldval field="wpMedium" value="24"/> <fieldval field="wpLong" value="48"/> <fieldval field="wpPiercing" value="1"/> <fieldval field="wpShots" value="7"/> <fieldval field="wpAmmo" value=".45"/> <fieldval field="grCost" value="200"/> <fieldval field="grWeight" value="4"/> <usesource id="TimeModern"/> <tag group="WeaponType" tag="ModPistol"/> <tag group="Weapon" tag="DoubleTap"/> <tag group="Weapon" tag="SemiAuto"/> </thing> <thing id="wpBarrett" name="Barrett" compset="Ranged" description="Description goes here"> <fieldval field="wpDamage" value="2d10"/> <fieldval field="wpShort" value="50"/> <fieldval field="wpMedium" value="100"/> <fieldval field="wpLong" value="200"/> <fieldval field="wpStrReq" value="4"/> <fieldval field="wpPiercing" value="4"/> <fieldval field="wpShots" value="11"/> <fieldval field="wpAmmo" value=".50"/> <fieldval field="grCost" value="750"/> <fieldval field="grWeight" value="35"/> <usesource id="TimeModern"/> <tag group="WeaponType" tag="ModRifle"/> <tag group="Weapon" tag="SnapFire"/> <tag group="Weapon" tag="HvyWeapon"/> <tag group="Equipment" tag="TwoHand"/> </thing>
Revise Table for Ranged Weapons
With all of the ranged weapons in place, we can now revise how they are managed visually within the table. The table portal for ranged weapons is named "arRange" within the file "tab_armory.dat". After a quick review, there are only two things that we need to change, and those are the same changes we already made to the "arMelee" table portal above. We first need to increase the width of the area for showing weapon descriptions, so we add the "descwidth" attribute to the "table_dynamic" element with a value of either 275 or 300. Then we add the "choosesortset" attribute to the same "table_dynamic" element and assign it the unique id of our custom sort set, which is "Weapon".