Modding:Missile Weapons

From Caves of Qud Wiki
Revision as of 16:51, 21 May 2019 by imported>CaptainTechnicality54384 (Created page with "Category: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...")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

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>

   <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="&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="&y"></part>


   <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);
       }
   } 
}