Modding:Active Parts: Difference between revisions

Jump to navigation Jump to search
18,199 bytes added ,  22:30, 15 September 2022
add missing parens to constructor definition
(correction)
(add missing parens to constructor definition)
 
(36 intermediate revisions by 2 users not shown)
Line 6: Line 6:
==Statuses==
==Statuses==


These are the possible active part statuses. Only the status Operational represents working functionality; other statuses are explications of failure modes.
These are the possible active part statuses. Only the status Operational represents working functionality; other statuses are failure modes.
 
Statuses are evaluated in the order listed. If more than one status potentially applies, the earlier one is used.
{| class="wikitable"
{| class="wikitable"
|-
|-
! Active Part Statuses
! Active Part Statuses
|-
|-
| Operational
| NeedsSubject
|-
|-
| NeedsSubject
| SwitchedOff
|-
|-
| EMP
| EMP
Line 25: Line 27:
| NotHanging
| NotHanging
|-
|-
| SwitchedOff
| LimbIncompatible
|-
|-
| RealityStabilized
| RealityStabilized
|-
|-
| LimbIncompatible
| LocallyDefinedFailure
|-
|-
| PrimarySystemOffline
| PrimarySystemOffline
Line 35: Line 37:
| Unpowered
| Unpowered
|-
|-
| LocallyDefinedFailure
| Operational
|}
|}


==Status determining configuration points==
==Status-determining configuration points==


The following configuration points control the determination of an active part's status. Defaults indicated are at the <code>IActivePart</code> level. Many individual parts set different defaults.
The following configuration points control the determination of an active part's status. Defaults indicated are at the <code>IActivePart</code> level. Many individual parts set different defaults, and in particular see [[#IPoweredPart|IPoweredPart]].


Individual parts can also override the method <code>public virtual bool GetActivePartLocallyDefinedFailure()</code> to implement their own failure modes; if this method returns true, the part's status will be LocallyDefinedFailure. Generally <code>public virtual string GetActivePartLocallyDefinedFailureDescription()</code> should also be overridden; its return value will be used instead of "LocallyDefinedFailure" for status display (see below).
Individual parts can also override the method <code>public virtual bool GetActivePartLocallyDefinedFailure()</code> to implement their own failure modes; if this method returns true, the part's status will be LocallyDefinedFailure. Generally <code>public virtual string GetActivePartLocallyDefinedFailureDescription()</code> should also be overridden; its return value will be used instead of "LocallyDefinedFailure" for status display (see below).
Line 78: Line 80:
| IsEMPSensitive
| IsEMPSensitive
| bool
| bool
| Fails if the parent object is [[ElectromagneticPulsed]].
| Fails if the parent object is [[Pulsed]].
| EMP
| EMP
| false
| false
Line 120: Line 122:
| RequiresBodyPartCategory
| RequiresBodyPartCategory
| string
| string
| Fails if the parent object is not equipped on a body part of the category specified. The body part categories are Animal, Arthropod, Plant, Fungal, Protoplasmic, Cybernetic, Mechanical, Metal, Wooden, Stone, Glass, Leather, Bone, Chitin, Plastic, Cloth, Psionic, and Extradimensional.
| Fails if the parent object is not equipped on a body part of the category specified. The body part categories are "Animal", "Arthropod", "Plant", "Fungal", "Protoplasmic", "Cybernetic", "Mechanical", "Metal", "Wooden", "Stone", "Glass", "Leather", "Bone", "Chitin", "Plastic", "Cloth", "Psionic", and "Extradimensional".
| LimbIncompatible
| LimbIncompatible
| null
| null
|}
|}


==Subject determining configuration points==
==Subject-determining configuration points==


The following boolean configuration points control identification of an active part's subject or subjects. All default to false at the <code>IActivePart</code> level. Many individual parts set different defaults.
The following boolean configuration points control identification of an active part's subject or subjects. All default to false at the <code>IActivePart</code> level. Many individual parts set different defaults.
Line 131: Line 133:
Individual parts can also override the method <code>public virtual bool WorksFor(GameObject obj)</code> in order to implement additional restrictions on what objects are valid subjects.
Individual parts can also override the method <code>public virtual bool WorksFor(GameObject obj)</code> in order to implement additional restrictions on what objects are valid subjects.


If an active part has no valid subjects, its status will be <code>NeedsSubject</code>.
If an active part has no valid subjects, its status will be NeedsSubject.


Where the parent object's current cell is referred to, it only applies to a cell the parent object is directly present in (not a cell its carrier or equipper is in, for example).
Where the parent object's current cell is referred to, it only applies to a cell the parent object is directly present in (not a cell its carrier or equipper is in, for example).
Line 147: Line 149:
|-
|-
| WorksOnCarrier
| WorksOnCarrier
| The parent object's <code>InInventory</code> (i.e. an object containing the parent object as inventory) is a valid subject.
| The parent object's <code>InInventory</code> (i.e. an object containing the parent object as inventory) is a valid subject. An object that has the parent object equipped as a thrown weapon is also a valid subject.
|-
|-
| WorksOnCellContents
| WorksOnCellContents
| Objects in the parent object's current cell are valid subjects.
| Objects in the parent object's current cell, other than the parent object, are valid subjects.
|-
|-
| WorksOnEnclosed
| WorksOnEnclosed
Line 156: Line 158:
|-
|-
| WorksOnEquipper
| WorksOnEquipper
| An object that has the parent object "equipped properly" is a valid subject. For an armor or shield, this means being worn on the appropriate body part. For an implant, this means being implanted. Otherwise, this means being equipped other than as a thrown weapon.
| An object that has the parent object "equipped properly" is a valid subject, which means being bound to a body part or body parts appropriate to the object's design. For an implant, this means being implanted. Other objects can have their body part binding altered, for example by being [[magnetized]], in which case the object is properly equipped when bound in its new fashion (for [[magnetized]] items, this means being in a Floating Nearby slot). Otherwise, specific item categories define proper binding. Armor binds to body parts appopriately to its type. Shields normally bind to hands or arms. Missile weapons normally bind to missile weapon slots. Melee weapons (which anything that doesn't fall into one of these categories is by default) normally bind to hands.
|-
|-
| WorksOnHolder
| WorksOnHolder
| An object that has the parent object equipped in a hand or missile weapon is a valid subject.
| An object that has the parent object equipped in a hand or missile weapon slot is a valid subject.
|-
|-
| WorksOnImplantee
| WorksOnImplantee
Line 192: Line 194:
| IsBioScannable
| IsBioScannable
| bool
| bool
| Sets DescribeStatusForProperty to the property corresponding to [[bioscanning]] and StatusStyle to "bio".
| Sets DescribeStatusForProperty to the property corresponding to [[bioscanning]] ("BioScannerEquipped") and StatusStyle to "bio".
| false
| false
|-
|-
| IsStructureScannable
| IsStructureScannable
| bool
| bool
| Sets DescribeStatusForProperty to the property corresponding to [[structural scanning]] and StatusStyle to "structure".
| Sets DescribeStatusForProperty to the property corresponding to [[structural scanning]] ("StructureScannerEquipped") and StatusStyle to "structure".
| false
| false
|-
|-
| IsTechScannable
| IsTechScannable
| bool
| bool
| Sets DescribeStatusForProperty to the property corresponding to [[techscanning]] and StatusStyle to "tech".
| Sets DescribeStatusForProperty to the property corresponding to [[techscanning]] ("TechScannerEquipped") and StatusStyle to "tech".
| false
| false
|-
|-
Line 212: Line 214:
| StatusStyle
| StatusStyle
| string
| string
| The display style to use for status if it is displayed. The possible styles are angry, bio, leet, ooc, plain, structure, and tech. This field is not normally used directly; usually it is set via IsTechScannable.
| The display style to use for status if it is displayed. The possible styles are "angry", "bio", "leet", "ooc", "plain", "structure", and "tech". This field is not normally used directly; usually it is set via IsTechScannable.
| plain
| "plain"
|}
|}


Line 224: Line 226:
! Behavior if set
! Behavior if set
! Default
! Default
|-
| IsPowerLoadSensitive
| bool
| If true, the parent object becomes eligible to receive the [[Overloaded]] mod if it was not already, charge consumption processed via <code>IActivePart</code> support methods is increased as standard for that part, and the results of [[#MyPowerLoadBonus()|<code>MyPowerLoadBonus()</code>]] and [[#MyPowerLoadLevel()|<code>MyPowerLoadLevel()</code>]] are adjusted appropriately.
| false
|-
|-
| ReadyColorString
| ReadyColorString
Line 248: Line 255:
==IPoweredPart==
==IPoweredPart==


Many active parts inherit <code>IPoweredPart</code>, which is a variant of <code>IActivePart</code> intended for more technical applications. It sets the following defaults:
The majority of active parts inherit <code>IPoweredPart</code>, which is a variant of <code>IActivePart</code> intended for more technical applications. It sets the following defaults:


{| class="wikitable"
{| class="wikitable"
Line 270: Line 277:
| true
| true
|}
|}
==Scripting integration==
{{Modding Topic Prerequisites | Modding:C Sharp Scripting}}
===Introduction===
The most common way for parts to use <code>IActivePart</code> support is the <code>IsReady()</code> method. The example part below heals its parent object every turn:
<syntaxhighlight lang="csharp">
using System;
namespace XRL.World.Parts
{
    [Serializable]
    public class HealSelfEveryTurn : IActivePart
    {
        public HealSelfEveryTurn()
        {
            WorksOnSelf = true;
        }
        public override bool WantEvent(int ID, int cascade)
        {
            return
                base.WantEvent(ID, cascade)
                || ID == EndTurnEvent.ID
            ;
        }
        public override bool HandleEvent(EndTurnEvent E)
        {
            if (IsReady(UseCharge: true))
            {
                ParentObject.Heal(1);
            }
            return true;
        }
    }
}
</syntaxhighlight>
In this very basic integration, the <code>UseCharge: true</code> parameter makes the part consume the amount of charge in its <code>ChargeUse</code> field. Without further configuration, this will have defaulted to 0. We want to call for charge to be used as the appropriate time to enable specific configurations that do use charge to be created.
The part above is directly acting on its parent object, without checking any information about subjects provided by <code>IActivePart</code>. It sets <code>WorksOnSelf</code> because without any identifiable subject, the part will not be operational. Instances could set other subject-determining configuration points, which could change when the part works (since it won't work without a subject), but won't change what object the healing is applied to.  A more flexible integration could look like:
<syntaxhighlight lang="csharp">
using System;
namespace XRL.World.Parts
{
    [Serializable]
    public class HealEveryTurn : IActivePart
    {
        public override bool WantEvent(int ID, int cascade)
        {
            return
                base.WantEvent(ID, cascade)
                || ID == EndTurnEvent.ID
            ;
        }
        public override bool HandleEvent(EndTurnEvent E)
        {
            if (IsReady(UseCharge: true))
            {
                foreach (GameObject obj in GetActivePartSubjects())
                {
                    obj.Heal(1);
                }
            }
            return true;
        }
    }
}
</syntaxhighlight>
This part will need subject-determining configuration before it can operate. It will apply its healing to whatever subject or subjects are identified by that configuration, though, making it more powerful for designers to work with.
===Methods===
====IsReady()====
<syntaxhighlight lang="csharp">
public bool IsReady(
    bool UseCharge = false,
    bool IgnoreCharge = false,
    bool IgnoreBootSequence = false,
    bool IgnoreBreakage = false,
    bool IgnoreRust = false,
    bool IgnoreEMP = false,
    bool IgnoreRealityStabilization = false,
    bool IgnoreSubject = false,
    bool IgnoreLocallyDefinedFailure = false,
    int MultipleCharge = 1,
    int? ChargeUse = null,
    bool UseChargeIfUnpowered = false
)
</syntaxhighlight>
{| class="wikitable"
|-
! Parameter
! Behavior
|-
| UseCharge
| If true, an attempt will be made to consume any charge required by the part if it is not otherwise disabled. If false, charge will be checked for but not consumed.
|-
| IgnoreCharge
| If true, all considerations related to charge will be ignored.
|-
| IgnoreBootSequence
| If true, <code>IsBootSensitive</code> will be ignored.
|-
| IgnoreBreakage
| If true, <code>IsBreakageSensitive</code> will be ignored.
|-
| IgnoreRust
| If true, <code>IsRustSensitive</code> will be ignored.
|-
| IgnoreEMP
| If true, <code>IsEMPSensitive</code> will be ignored.
|-
| IgnoreRealityStabilization
| If true, <code>IsRealityDistortionBased</code> will be ignored.
|-
| IgnoreSubject
| If true, the part will not check for subjects or consider itself to be in SubjectNeeded status.
|-
| IgnoreLocallyDefinedFailure
| If true, <code>GetActivePartLocallyDefinedFailure()</code> will not be checked and the part will not consider itself to be in LocallyDefinedFailure status.
|-
| MultipleCharge
| Multiplies charge use in a fashion intended to represent operation over multiple turns. This means that <code>ChargeMinimum</code> is not multiplied, and that if charge is being consumed and not enough charge is available for the full set of multiples of charge use, charge will be consumed for however many multiples can be accommodated.
|-
| ChargeUse
| Overrides the part's <code>ChargeUse</code> setting for purposes of this call. The default of null means to use the part's <code>ChargeUse</code> setting.
|-
| UseChargeIfUnpowered
| With <code>UseCharge: false</code>, this parameter triggers consuming charge in the event that the part is otherwise operational but does not have enough charge. This is to allow certain process flows to ensure that they'll consume the last charge available in their parent object instead of leaving a tiny bit unused (with liquid-fueled energy cells, leaving a bit behind means leaving 1 dram of liquid, which creates confusing UX).
|}
Returns true if the part's status is Operational. Triggers any appropriate render color changes. Updates the last known status.
====IsDisabled()====
<syntaxhighlight lang="csharp">
public bool IsDisabled(
    bool UseCharge = false,
    bool IgnoreCharge = false,
    bool IgnoreBootSequence = false,
    bool IgnoreBreakage = false,
    bool IgnoreRust = false,
    bool IgnoreEMP = false,
    bool IgnoreRealityStabilization = false,
    bool IgnoreSubject = false,
    bool IgnoreLocallyDefinedFailure = false,
    int MultipleCharge = 1,
    int? ChargeUse = null,
    bool UseChargeIfUnpowered = false
)
</syntaxhighlight>
The same as <code>IsReady()</code>, but with the opposite return value.
====GetActivePartStatus()====
<syntaxhighlight lang="csharp">
public ActivePartStatus GetActivePartStatus(
    bool UseCharge = false,
    bool IgnoreCharge = false,
    bool IgnoreBootSequence = false,
    bool IgnoreBreakage = false,
    bool IgnoreRust = false,
    bool IgnoreEMP = false,
    bool IgnoreRealityStabilization = false,
    bool IgnoreSubject = false,
    bool IgnoreLocallyDefinedFailure = false,
    int MultipleCharge = 1,
    int? ChargeUse = null,
    bool UseChargeIfUnpowered = false
)
</syntaxhighlight>
Like <code>IsReady()</code>, but returns an <code>ActivePartStatus</code> that can be used to determine what failure mode the part is in. Useful for constructing more helpful failure messaging.
Triggers any appropriate render color changes. Updates the last known status.
====WasReady()====
<syntaxhighlight lang="csharp">
public bool WasReady()
</syntaxhighlight>
Returns whether the active part's status was Operational the last time it was evaluated.
====WasDisabled()====
<syntaxhighlight lang="csharp">
public bool WasDisabled()
</syntaxhighlight>
Returns whether the active part's status was other than Operational the last time it was evaluated.
====GetLastActivePartStatus()====
<syntaxhighlight lang="csharp">
public ActivePartStatus GetLastActivePartStatus()
</syntaxhighlight>
Returns what the active part's status was the last time it was evaluated.
====ConsumeCharge()====
<syntaxhighlight lang="csharp">
public bool ConsumeCharge(int? ChargeUse = null)
</syntaxhighlight>
Triggers consumption of charge from the parent object, irrespective of operational status. The <code>ChargeUse</code> parameter can be used to override the part's <code>ChargeUse</code> setting; the default of null means do not override.
<syntaxhighlight lang="csharp">
public bool ConsumeCharge(int MultipleCharge, int? ChargeUse = null)
</syntaxhighlight>
As above, but <code>MultipleCharge</code> has the same behavior as for <code>IsReady()</code>.
====ConsumeChargeIfOperational()====
<syntaxhighlight lang="csharp">
public bool ConsumeChargeIfOperational(
    bool IgnoreBootSequence = false,
    bool IgnoreBreakage = false,
    bool IgnoreRust = false,
    bool IgnoreEMP = false,
    bool IgnoreRealityStabilization = false,
    bool IgnoreSubject = false,
    bool IgnoreLocallyDefinedFailure = false,
    int MultipleCharge = 1,
    int? ChargeUse = null,
    bool UseChargeIfUnpowered = false,
    bool NeedStatusUpdate = false
)
</syntaxhighlight>
Triggers consumption of charge from the parent object if the part is operational. Parameters that are also present in <code>IsReady()</code> behave the same as there.
Normally, status will only be obtained (and therefore color changes triggered and last known status updated) if there is any charge consumption to be performed. <code>NeedStatusUpdate</code> can be set to true to indicate that status should always be obtained.
====GetActivePartSubjects()====
<syntaxhighlight lang="csharp">
public virtual List<GameObject> GetActivePartSubjects()
</syntaxhighlight>
Returns a list of the active part's current subjects.
====GetActivePartFirstSubject()====
<syntaxhighlight lang="csharp">
public virtual GameObject GetActivePartFirstSubject()
</syntaxhighlight>
Returns the active part's first subject, or null if it has none.
<syntaxhighlight lang="csharp">
public virtual GameObject GetActivePartFirstSubject(Predicate<GameObject> Filter)
</syntaxhighlight>
Returns the first of the active part's subjects that matches the filter specified, or null if none do.
====IsObjectActivePartSubject()====
<syntaxhighlight lang="csharp">
public virtual bool IsObjectActivePartSubject(GameObject obj)
</syntaxhighlight>
Returns whether the object specified is one of the active part's subjects.
====ActivePartHasMultipleSubjects====
<syntaxhighlight lang="csharp">
public virtual bool ActivePartHasMultipleSubjects()
</syntaxhighlight>
Returns whether the active part has at least two subjects.
====GetActivePartSubjectCount()====
<syntaxhighlight lang="csharp">
public virtual int GetActivePartSubjectCount()
</syntaxhighlight>
Returns how many subjects the active part has.
====ForeachActivePartSubjectWhile()====
<syntaxhighlight lang="csharp">
public virtual bool ForeachActivePartSubjectWhile(Predicate<GameObject> pProc, bool MayMoveAddOrDestroy = false)
</syntaxhighlight>
Calls <code>pProc</code> on each of the active part's subjects, terminating if <code>pProc</code> returns false.
<code>MayMoveAddOrDestroy</code> should be set to true if the code in <code>pProc</code> might result in any object being moved, created, or destroyed; otherwise, there is a risk of exceptions being thrown due to loop control disruption.
====AnyActivePartSubjectWantsEvent()====
<syntaxhighlight lang="csharp">
public virtual bool AnyActivePartSubjectWantsEvent(int ID, int cascade)
</syntaxhighlight>
For integration with the <code>MinEvent</code> system. Returns true if any of the active part's subjects want to receive the event designated.
====ActivePartSubjectsHandleEvent()====
<syntaxhighlight lang="csharp">
public virtual bool ActivePartSubjectsHandleEvent(MinEvent E)
</syntaxhighlight>
For integration with the <code>MinEvent</code> system. Sends the event to each of the active part's subject, terminating early and returning false if any of the event handlers return false.
====GetActivePartLocallyDefinedFailure()====
<syntaxhighlight lang="csharp">
public virtual bool GetActivePartLocallyDefinedFailure()
</syntaxhighlight>
Intended to be overridden by inheritors to define their own failure conditions. Returns false by default; a locally defined failure will be considered to exist if it returns true.
====GetActivePartLocallyDefinedFailureDescription()====
<syntaxhighlight lang="csharp">
public virtual string GetActivePartLocallyDefinedFailureDescription()
</syntaxhighlight>
Intended to be overridden by inheritors to define the description to provide in status display for their own failure conditions. Returns null by default; a non-null return value will be used in place of "LocallyDefinedFailure" when displaying a LocallyDefinedFailure status.
====IsActivePartEngaged()====
<syntaxhighlight lang="csharp">
public virtual bool IsActivePartEngaged()
</syntaxhighlight>
Intended to be overridden by inheritors to define whether the part is "engaged" for purposes of <code>NeedsOtherActivePartEngaged</code>. Returns <code>IsReady()</code> by default.
====GetStatusSummary()====
<syntaxhighlight lang="csharp">
public virtual string GetStatusSummary(ActivePartStatus Status)
</syntaxhighlight>
For the specified status value, returns a string summary intended for player visibility. Some statuses return null, generally because it makes less sense to present them to the player. The status summaries are:
{| class="wikitable"
|-
! Status
! Summary
|-
| EMP
| <nowiki>"{{W|EMP}}"</nowiki>
|-
| Unpowered
| <nowiki>"{{K|unpowered}}"</nowiki>
|-
| SwitchedOff
| <nowiki>"{{K|switched off}}"</nowiki>
|-
| Booting (only if <code>BootSequence.IsObvious()</code> is true)
| <nowiki>"{{b|warming up}}"</nowiki>
|-
| NeedsSubject
| null
|-
| Operational
| null
|-
| any other status
| <nowiki>"{{r|nonfunctional}}"</nowiki>
|}
Can be overridden by inheritors to provide a status summary for LocallyDefinedFailure status or otherwise alter the default behavior.
<syntaxhighlight lang="csharp">
public string GetStatusSummary()
</syntaxhighlight>
Returns <code>GetStatusSummary(GetActivePartStatus())</code>.
====AddStatusSummary()====
<syntaxhighlight lang="csharp">
public void AddStatusSummary(StringBuilder SB)
</syntaxhighlight>
Retrieves <code>GetStatusSummary()</code> and, if it is not null or empty, appends <code>" ("</code>, the summary, and <code>")"</code> to the StringBuilder passed. This is to support code like this:
<syntaxhighlight lang="csharp">
public override bool HandleEvent(GetShortDescriptionEvent E)
{
    E.Postfix.AppendRules(AppendRulesDescription, AddStatusSummary);
    return true;
}
</syntaxhighlight>
====GetOperationalScopeDescription()====
<syntaxhighlight lang="csharp">
public string GetOperationalScopeDescription()
</syntaxhighlight>
Returns a readable general description of what objects the part operates on, based on its subject-determining configuration points. Example return values might be "its user" or "itself and its vicinity".
====MyPowerLoadBonus()====
<syntaxhighlight lang="csharp">
public override int MyPowerLoadBonus(int Load = int.MinValue, int Baseline = 100, int Divisor = 150)
</syntaxhighlight>
Returns a value intended to be used as a performance bonus based on power load, integrating with IsPowerLoadSensitive and ModOverloaded (and any other future features which may modify power load level). When the Load argument is set to the default int.MinValue, the current power load level will be automatically calculated and used, otherwise the level specified will be used (this is supported so that an already known level may be sent, for efficiency). The return value is ((WorkingLoadValue - Baseline) / Divisor). With IsPowerLoadSensitive set to true and ModOverloaded present, the return value of this method will be 2 (because ModOverloaded increases the power load value from 100 to 400, so ((400 - 100) / 150) = 2). Different Divisor numbers are typically used with different applications depending on what performance characteristics are desired. If IsPowerLoadSensitive is false, this method will return 0.
This method is an overload of the same method present in the base <code>IPart</code>, which normally returns values based on similar logic (without sensitivity to any configuration value like IsPowerLoadSensitive, since <code>IPart</code> has nothing similar).
====MyPowerLoadLevel()====
<syntaxhighlight lang="csharp">
public override int MyPowerLoadLevel()
</syntaxhighlight>
Returns the power load level the part is currently operating under. If IsPowerLoadSensitive is false, it will always be 100. If IsPowerLoadSensitive is true and ModOverloaded is present, it will be 400. Other functionality may potentially result in different power load levels in the future.


==List of active parts==
==List of active parts==
Line 283: Line 726:
|-
|-
| AddsRep
| AddsRep
|-
| AdjustSpecialEffectChances
|-
| AilingQuickness
|-
|-
| AloePorta
| AloePorta
Line 289: Line 736:
|-
|-
| AnimateObject
| AnimateObject
|-
| ArtifactDetection
|-
|-
| ArtificialIntelligence
| ArtificialIntelligence
|-
| AutomatedExternalDefibrillator
|-
|-
| Banner
| Banner
Line 313: Line 764:
|-
|-
| Capacitor
| Capacitor
|-
| CardiacArrestOnHit
|-
|-
| CatacombsExitTeleporter
| CatacombsExitTeleporter
Line 323: Line 776:
|-
|-
| Clockwork
| Clockwork
|-
| CompanionCapacity
|-
|-
| ComputeNode
| ComputeNode
Line 330: Line 785:
| Cursed
| Cursed
|-
|-
| Cybernetics2BiodynamicPowerPlant
| CyberneticsAutomatedInternalDefibrillator
|-
| CyberneticsBiodynamicPowerPlant
|-
| CyberneticsEffectSuppressor
|-
|-
| Cybernetics2MedassistModule
| CyberneticsMedassistModule
|-
|-
| Cybernetics2MicromanipulatorArray
| CyberneticsMicromanipulatorArray
|-
|-
| Cybernetics2OnboardRecoilerImprinting
| CyberneticsOnboardRecoilerImprinting
|-
|-
| Cybernetics2OnboardRecoilerTeleporter
| CyberneticsOnboardRecoilerTeleporter
|-
|-
| Cybernetics2PenetratingRadar
| CyberneticsPenetratingRadar
|-
|-
| CyberneticsTerminal2
| CyberneticsTerminal2
Line 349: Line 808:
|-
|-
| DeploymentMaintainer
| DeploymentMaintainer
|-
| DepositCorpses
|-
|-
| DestroyMe
| DestroyMe
|-
| DiggingTool
|-
|-
| DischargeOnHit
| DischargeOnHit
|-
|-
| DischargeOnStep
| DischargeOnStep
|-
| DismemberAdjacentHostiles
|-
|-
| Displacement
| Displacement
|-
|-
| Displacer
| Displacer
|-
| Drill
|-
| DrinkMagnifier
|-
|-
| ElectricalPowerTransmission
| ElectricalPowerTransmission
|-
|-
| EmergencyTeleporter
| EmergencyTeleporter
|-
| EmitGasOnHit
|-
|-
| Enclosing
| Enclosing
Line 369: Line 840:
|-
|-
| EnergyCell
| EnergyCell
|-
| EnergyCellRack
|-
|-
| EnergyCellSocket
| EnergyCellSocket
Line 383: Line 856:
|-
|-
| Fan
| Fan
|-
| FeelingOnTarget
|-
| FireSuppressionSystem
|-
|-
| FlareCompensation
| FlareCompensation
Line 399: Line 876:
|-
|-
| FugueOnStep
| FugueOnStep
|-
| FungalFortitude
|-
|-
| FusionReactor
| FusionReactor
|-
|-
| Gaslight
| Gaslight
|-
| GasTumbler
|-
|-
| GenericPowerTransmission
| GenericPowerTransmission
Line 413: Line 894:
|-
|-
| GritGateMainframeTerminal
| GritGateMainframeTerminal
|-
| GroundOnHit
|-
| HighBitBonus
|-
|-
| HologramMaterialPrimary
| HologramMaterialPrimary
Line 471: Line 956:
|-
|-
| NavigationBonus
| NavigationBonus
|-
| NightSightInterpolators
|-
|-
| NightVision
| NightVision
Line 480: Line 967:
| PointDefense
| PointDefense
|-
|-
| PowerCord
| Pounder
|-
|-
| PoweredFloating
| PoweredFloating
|-
| PowerOutlet
|-
|-
| PowerSwitch
| PowerSwitch
|-
|-
| ProgrammableRecoiler
| ProgrammableRecoiler
|-
| PsychicMeridian
|-
|-
| RadiusEventSender
| RadiusEventSender
|-
|-
| RealityStabilization
| RealityStabilization
|-
| RealityStabilizeOnHit
|-
|-
| ReclamationCist
| ReclamationCist
Line 515: Line 1,004:
|-
|-
| SaveModifiers
| SaveModifiers
|-
| SlipRing
|-
|-
| SlottedCellCharger
| SlottedCellCharger
Line 523: Line 1,014:
|-
|-
| Stopsvaalinn
| Stopsvaalinn
|-
| StrideMason
|-
|-
| StunOnHit
| StunOnHit
|-
|-
| Suspensor
| Suspensor
|-
| SwapOnHit
|-
|-
| TattooGun
| TattooGun
|-
|-
| Teleporter
| Teleporter
|-
| TeleportGate
|-
|-
| TeleporterPair
| TeleporterPair
Line 537: Line 1,034:
|-
|-
| TemplarPhylactery
| TemplarPhylactery
|-
| ThermalAmp
|-
|-
| Toolbox
| Toolbox
Line 547: Line 1,046:
|-
|-
| VibroWeapon
| VibroWeapon
|-
| Waldopack
|-
| WaterRitualDiscount
|-
|-
| WindTurbine
| WindTurbine
Line 557: Line 1,060:
|}
|}


[[Category:Modding]]
{{Modding Navbox}}
 
[[Category:Modding]][[Category:Script Modding]]

Navigation menu