Modding:Missile Weapons

From Caves of Qud Wiki
Jump to navigation Jump to search
This page is about modding. See the modding overview for an abstract on modding.
This page is about modding. See the modding overview for an abstract on modding.

Custom Ammo Types

Custom moddable ammo types are supported without adding a new Ammo class to the game via AmmoGeneric, check out the "12 Gauge Shotgun" for an example of use.

  <object Name="12 Gauge Shotgun" Inherits="BaseMagazineRifle">
    <part Name="Render" DisplayName="12 gauge shotgun" RenderString=")"></part>
    <part Name="Physics" bUsesTwoSlots="true" Weight="16"></part>
    <part Name="Commerce" Value="100"></part>
    <part Name="MissileWeapon" Skill="Rifle" NoWildfire="true" NoAmmoProjectile="Ammo12Gauge" ShotsPerAction="8" AmmoPerAction="1" ShotsPerAnimation="8" WeaponAccuracy="35" RangeIncrement="6"></part>
 
<!-- heres the important bit that links the loader to AmmoPart="Ammo12Gauge", but we're going to use "AmmoGeneric" instead of an actual in game class part called "Ammo12Gauge"-->
    <part Name="MagazineAmmoLoader" ProjectileObject="" AmmoPart="Ammo12Gauge" MaxAmmo="6"></part>
<!-- -->
    <part Name="Description" Short="A stockless, pump-action shotgun of jet black."></part>
    <part Name="Metal"></part>
    <tag Name="Tier" Value="3"></tag>
    <part Name="Examiner" AlternateDisplayName="rifle" Complexity="3" Difficulty="0"></part>
  </object>
   
  <object Name="Projectile12Gauge" Inherits="TemporaryProjectile">
    <part Name="Projectile" BasePenetration="4" BaseDamage="1d10" ColorString="&amp;y"></part>
    <part Name="Physics" IsReal="false"></part>
  </object>
     
  <object Name="12 Gauge Shell" Inherits="TemporaryProjectile">
    <part Name="Render" DisplayName="12 gauge 00 buckshot" ColorString="&amp;y"></part>
 
 
<!-- heres the important bit that links it to AmmoPart="Ammo12Gauge" in the 12 Gauge Shotgun definition, give it an AmmoGeneric component and two tags, AmmoPartType with the value set to Ammo12Gauge, and a tag with just the name of the ammo part name itself -->
    <part Name="AmmoGeneric" ProjectileObject="Projectile12Gauge"></part>
    <tag Name="AmmoPartType" Value="Ammo12Gauge"></tag>
    <tag Name="Ammo12Gauge"></tag>
<!-- -->
 
    <part Name="Physics" Category="Ammo"></part>
    <part Name="Description" Short="A brass-cased cartridge of round lead balls."></part>
    <part Name="TinkerItem" Bits="C" CanBuild="true" CanRepair="false" CanDisassemble="false" NumberMade="4"></part>
    <part Name="Commerce" Value="0.04"></part>
  </object>

AmmoSlug's code, if you want a template to create a new Ammo part: https://pastebin.com/gcYJpAh3

Ammo Generic With Multiple Specialized Ammo Types

<object Name="Explosive 12 Gauge Shell" Inherits="TemporaryProjectile">
  <part Name="AmmoGeneric" ProjectileObject="Projectile12Gauge" SpecializedProjectileObject="Explosive_Projectile12Gauge"></part>
</object>
 
<object Name="AP 12 Gauge Shell" Inherits="TemporaryProjectile">
  <part Name="AmmoGeneric" ProjectileObject="Projectile12Gauge" SpecializedProjectileObject="AP_Projectile12Gauge"></part>
</object>
 
 
<object Name="Explosive_Projectile12Gauge" Inherits="TemporaryProjectile">
...
</object>
 
 
<object Name="AP_Projectile12Gauge" Inherits="TemporaryProjectile">
...
</object>

Scripting Impact Ammo Effects

Here's an example ammo part you can put on the projectile object that poisons on hit.

using System;
  
namespace XRL.World.Parts
{
    [Serializable]
    public class Example_MissilePoisonOnHit : IPart
    {
        public int Chance = 0;
        int Strength = 15;
        string DamageIncrement = "3d3";
        string  Duration = "6-9";
        public Example_MissilePoisonOnHit()
        {
            Name = "Example_MissilePoisonOnHit";
        }
  
        public override void Register(GameObject Object)
        {
            Object.RegisterPartEvent(this, "ProjectileHit");           
        }
  
        public override bool FireEvent(Event E)
        {
            if (E.ID == "ProjectileHit")
            {
                if (Rules.Stat.Random(1, 100) <= Chance)
                {
                    GameObject Defender = E.GetParameter("Defender") as GameObject;
                    if (Defender == null) return true;
                    if( !Defender.Statistics.ContainsKey("Toughness") || Rules.Stat.Roll("1d20")+Defender.Statistics["Toughness"].Modifier <= 10+Strength )
                    {
                        Defender.ApplyEffect( new Effects.Poisoned( Rules.Stat.Roll(Duration), DamageIncrement, Strength, ParentObject.pPhysics.Equipped ) );
                    }
                }
            }
  
            return base.FireEvent(E);
        }
    } 
}