25
edits
(some light edits to the xml side) |
|||
(4 intermediate revisions by 2 users not shown) | |||
Line 40: | Line 40: | ||
By default most mutations use gold/yellow for background and brown for foreground but this can be customized for any color of your choice, see [[Modding:Tiles]] and [[Modding:Colors_%26_Object_Rendering]] for further info on this. | By default most mutations use gold/yellow for background and brown for foreground but this can be customized for any color of your choice, see [[Modding:Tiles]] and [[Modding:Colors_%26_Object_Rendering]] for further info on this. | ||
=== Exclusions === | === Exclusions === | ||
Line 69: | Line 46: | ||
=== BearerDescription === | === BearerDescription === | ||
It appears that this description is used in some of the random generation algorithms for villages and history in the game. For example, if a village reveres mutants with the Multiple Arms mutation, they might use the string defined in Mutations.xml ("the many-armed") to describe them in their praises or monuments. | It appears that this description is used in some of the random generation algorithms for villages and history in the game. For example, if a village reveres mutants with the Multiple Arms mutation, they might use the string defined in Mutations.xml ("the many-armed") to describe them in their praises or monuments. | ||
=== Constructor === | |||
This is used by very few mutations, and its use case is as a string argument (or a comma-delimited string of arguments, if there are more than one) to pass to the mutation's class constructor. All such arguments are received as string parameters in the mutation class constructor. | |||
It should be noted that this parameter is both advance and old, and it shouldn't be necessary and potentially avoided. | |||
== C# Scripting, and Making The Mutation == | == C# Scripting, and Making The Mutation == | ||
Line 88: | Line 71: | ||
[Serializable] | [Serializable] | ||
// This defines the class that you will call in Mutations.XML | // This defines the class that you will call in Mutations.XML | ||
class | class QudWiki_Udders : BaseMutation | ||
{ | { | ||
Line 119: | Line 102: | ||
public override bool Mutate(GameObject MUTANT, int Level) | public override bool Mutate(GameObject MUTANT, int Level) | ||
{ | { | ||
return | return base.Mutate(MUTANT, Level); | ||
} | } | ||
public override bool Unmutate(GameObject MUTANT) | public override bool Unmutate(GameObject MUTANT) | ||
{ | { | ||
return | return Base.Unmutate(MUTANT); | ||
} | } | ||
Line 174: | Line 157: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
== Bigger Example == | |||
TODO: Re-work the huge file of flaminghands.cs to be have comments and explain it , possibly with Gnarf's help if they are okay/free to do so | TODO: Re-work the huge file of flaminghands.cs to be have comments and explain it , possibly with Gnarf's help if they are okay/free to do so | ||
Line 187: | Line 173: | ||
{ | { | ||
/// <summary> | |||
/// FlamingHands powers the "Flaming Ray" mutation. You can now choose a variant from hands, feet or face. | |||
/// </summary> | |||
[Serializable] | [Serializable] | ||
public class FlamingHands : BaseDefaultEquipmentMutation | public class FlamingHands : BaseDefaultEquipmentMutation | ||
{ | { | ||
public FlamingHands() | |||
{ | |||
DisplayName = "Flaming Ray"; | |||
} | |||
/// <summary>The <see cref="BodyPart.Type" /> we replace (chosen by variant selection.)</summary> | |||
public string BodyPartType = "Hands"; | public string BodyPartType = "Hands"; | ||
/// <summary>Do we still need to create the object? Setup as a public for serialization purposes.</summary> | |||
public bool CreateObject = true; | public bool CreateObject = true; | ||
/// <summary>Sound file to play when attacking.</summary> | |||
public string Sound = "Abilities/sfx_ability_mutation_flamingRay_attack"; | public string Sound = "Abilities/sfx_ability_mutation_flamingRay_attack"; | ||
[NonSerialized] private static GameObject _Projectile; | |||
/// <summary>Create or retrive the already created Projectile game object.</summary> | |||
private static GameObject Projectile | private static GameObject Projectile | ||
{ | { | ||
Line 209: | Line 205: | ||
} | } | ||
} | } | ||
/// <summary>We are request to be re-mutated automatically when our body is rebuilt. Thanks slog.</summary> | |||
public override bool GeneratesEquipment() | public override bool GeneratesEquipment() | ||
{ | { | ||
return true; | return true; | ||
} | } | ||
Line 228: | Line 219: | ||
} | } | ||
/// <summary>Show selected variant in character creation.</summary> | |||
public override string GetCreateCharacterDisplayName() | public override string GetCreateCharacterDisplayName() | ||
{ | { | ||
Line 246: | Line 238: | ||
} | } | ||
public override string GetLevelText(int | public override string GetLevelText(int level) | ||
{ | { | ||
string Ret = "Emits a 9-square ray of flame in the direction of your choice.\n"; | string Ret = "Emits a 9-square ray of flame in the direction of your choice.\n"; | ||
Ret += "Damage: {{rules|" + ComputeDamage( | Ret += "Damage: {{rules|" + ComputeDamage(level) + "}}\n"; | ||
Ret += "Cooldown: 10 rounds\n"; | Ret += "Cooldown: 10 rounds\n"; | ||
Ret += "Melee attacks heat opponents by {{rules|" + GetHeatOnHitAmount( | Ret += "Melee attacks heat opponents by {{rules|" + GetHeatOnHitAmount(level) + "}} degrees"; | ||
return Ret; | return Ret; | ||
} | } | ||
public string GetHeatOnHitAmount(int | public string GetHeatOnHitAmount(int level) | ||
{ | { | ||
return ( | return (level * 2) + "d8"; | ||
} | } | ||
public string ComputeDamage(int | public string ComputeDamage(int level) | ||
{ | { | ||
string Result = | string Result = level + "d4"; | ||
if (ParentObject != null) | if (ParentObject != null) | ||
{ | { | ||
Line 278: | Line 270: | ||
} | } | ||
public string ComputeDamage() | public string ComputeDamage() => ComputeDamage(Level); | ||
public void Flame(Cell C, ScreenBuffer Buffer, bool doEffect = true) | public void Flame(Cell C, ScreenBuffer Buffer, bool doEffect = true) | ||
Line 368: | Line 357: | ||
} | } | ||
} | } | ||
mutation.CooldownMyActivatedAbility(mutation. | mutation.CooldownMyActivatedAbility(mutation.ActivatedAbilityID, Turns: 10); | ||
mutation.UseEnergy(1000, "Physical Mutation Flaming Hands"); | mutation.UseEnergy(1000, "Physical Mutation Flaming Hands"); | ||
mutation.PlayWorldSound(mutation.Sound, combat: true); | mutation.PlayWorldSound(mutation.Sound, combat: true); | ||
Line 391: | Line 380: | ||
{ | { | ||
if( !CreateObject) return true; | if( !CreateObject) return true; | ||
return HasRegisteredSlot(BodyPartType) && GetRegisteredSlot(BodyPartType,false) != null; | return HasRegisteredSlot(BodyPartType) && GetRegisteredSlot(BodyPartType, false) != null; | ||
} | } | ||
Line 421: | Line 410: | ||
CheckObjectProperlyEquipped() | CheckObjectProperlyEquipped() | ||
&& E.GetIntParameter("Distance") <= 9 | && E.GetIntParameter("Distance") <= 9 | ||
&& IsMyActivatedAbilityAIUsable( | && IsMyActivatedAbilityAIUsable(ActivatedAbilityID) | ||
&& ParentObject.HasLOSTo(E.GetGameObjectParameter("Target"), UseTargetability: true) | && ParentObject.HasLOSTo(E.GetGameObjectParameter("Target"), UseTargetability: true) | ||
) | ) | ||
Line 445: | Line 434: | ||
} | } | ||
return base.FireEvent(E); | return base.FireEvent(E); | ||
} | } | ||
private void AddAbility() | private void AddAbility() | ||
{ | { | ||
ActivatedAbilityID = AddMyActivatedAbility( | |||
Name: "Flaming Ray", | Name: "Flaming Ray", | ||
Command: "CommandFlamingHands", | Command: "CommandFlamingHands", | ||
Class: "Physical Mutation", | Class: "Physical Mutation", | ||
Icon: "" + (char) 168 | Icon: "" + (char) 168, | ||
Description: GetLevelText(Level) | |||
); | ); | ||
} | |||
public override bool ChangeLevel(int NewLevel) | |||
{ | |||
var result = base.ChangeLevel(NewLevel); | |||
// Update the ability description | |||
if (MyActivatedAbility(ActivatedAbilityID) is ActivatedAbilityEntry ability) ability.Description = GetLevelText(Level); | |||
return result; | |||
} | } | ||
Line 468: | Line 461: | ||
return variants; | return variants; | ||
} | } | ||
public override void SetVariant(int n) | public override void SetVariant(int n) | ||
Line 481: | Line 473: | ||
} | } | ||
base.SetVariant(n); | base.SetVariant(n); | ||
} | } | ||
Line 557: | Line 544: | ||
public override bool Unmutate(GameObject GO) | public override bool Unmutate(GameObject GO) | ||
{ | { | ||
RemoveMyActivatedAbility(ref | RemoveMyActivatedAbility(ref ActivatedAbilityID); | ||
return base.Unmutate(GO); | return base.Unmutate(GO); | ||
} | } | ||
Line 564: | Line 551: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
{{Modding Navbox}} | {{Modding Navbox}} |