diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..3030c1a --- /dev/null +++ b/.gitattributes @@ -0,0 +1,30 @@ +# Line endings: LF everywhere, on every OS, whatever core.autocrlf says. +* text=auto eol=lf + +# cmd.exe misreads labels and goto in LF batch files, so they stay CRLF. +*.bat text eol=crlf +*.cmd text eol=crlf + +# Binaries: never converted, never diffed as text. +*.png binary +*.jpg binary +*.jpeg binary +*.webp binary +*.svg text +*.ogg binary +*.wav binary +*.mp3 binary +*.ttf binary +*.otf binary +*.woff binary +*.woff2 binary +*.dll binary +*.so binary +*.dylib binary +*.pdb binary +*.exe binary +*.zip binary +*.pck binary +*.moc3 binary +*.res binary +*.scn binary diff --git a/.gitignore b/.gitignore index bb88804..c301ca8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,37 +1,37 @@ -# Godot 4.x -.godot/ -.idea/ -sdk/ -bin/ -obj/ - -#ai -.omo/ -.opencode/ - -gen/ -obj/ -bin/ - -*.tres~ -*.tscn~ - -# GDScript LSP -.godot/ - -# Export -*.exe -*.dmg -*.apk -*.aab -*.pck -*.zip -*.log - -# OS -.DS_Store -Thumbs.db - -# Editor -*.import -*.godot.uid +# Godot 4.x +.godot/ +.idea/ +sdk/ +bin/ +obj/ + +#ai +.omo/ +.opencode/ + +gen/ +obj/ +bin/ + +*.tres~ +*.tscn~ + +# GDScript LSP +.godot/ + +# Export +*.exe +*.dmg +*.apk +*.aab +*.pck +*.zip +*.log + +# OS +.DS_Store +Thumbs.db + +# Editor +*.import +*.godot.uid diff --git a/src/RareType.cs b/src/RareType.cs index 6dba333..d40f060 100644 --- a/src/RareType.cs +++ b/src/RareType.cs @@ -1,21 +1,21 @@ -namespace Cthangover.Mods.Skills -{ - /// - /// Represents the rarity tier of a skill card, determining its drop probability, - /// visual frame treatment, and relative power budget. Higher tiers correspond to - /// more potent effects and rarer acquisition chances. - /// - public enum RareType - { - /// Standard skill with the highest drop rate and baseline power. - Common, - /// Slightly improved stats and a lower drop rate than Common. - Uncommon, - /// Notably stronger, appearing infrequently in loot pools. - Rare, - /// Powerful skill with significant gameplay impact; very low drop chance. - Epic, - /// The highest tier — game-changing abilities with extremely rare availability. - Legendary - } -} +namespace Cthangover.Mods.Skills +{ + /// + /// Represents the rarity tier of a skill card, determining its drop probability, + /// visual frame treatment, and relative power budget. Higher tiers correspond to + /// more potent effects and rarer acquisition chances. + /// + public enum RareType + { + /// Standard skill with the highest drop rate and baseline power. + Common, + /// Slightly improved stats and a lower drop rate than Common. + Uncommon, + /// Notably stronger, appearing infrequently in loot pools. + Rare, + /// Powerful skill with significant gameplay impact; very low drop chance. + Epic, + /// The highest tier — game-changing abilities with extremely rare availability. + Legendary + } +} diff --git a/src/SkillInfo.cs b/src/SkillInfo.cs index 6cc2da7..a69f3ad 100644 --- a/src/SkillInfo.cs +++ b/src/SkillInfo.cs @@ -1,112 +1,112 @@ -using System; -using System.Collections.Generic; -using System.Text.Json.Serialization; -using Cthangover.Core.Factories; -using Cthangover.Core.Utils; -using Godot; - -namespace Cthangover.Mods.Skills -{ - - /// - /// Immutable data model for a single skill definition, populated by - /// from JSON assets. Each instance carries the - /// metadata required to render a skill card in the UI (, - /// , ) and to resolve its gameplay - /// behaviour through and . - /// Instances are shared across the runtime and should not be mutated after - /// construction. - /// - [Serializable] - [EntityKind("skill")] - public class SkillInfo : IIdentifiable - { - /// - /// The unique string key of this skill, used as the primary lookup in - /// and as the identity token in - /// . - /// - [JsonPropertyName("Id")] - public string ID { get; set; } - - /// - /// The display name shown on the skill card. This value is passed through - /// before rendering, allowing - /// localisation via Godot's translation system. - /// - public string Name { get; set; } - - /// - /// A longer textual description explaining what the skill does in gameplay - /// terms. Displayed in tooltip and detail views alongside the card artwork. - /// - public string Description { get; set; } - - /// - /// The relative path to the skill's artwork texture, resolved inside the - /// mod-group "characters/skills" by - /// when the property is first accessed. - /// - public string Image { get; set; } - - /// - /// Optional ID of the action card this skill gifts to the player when - /// acquired (e.g. an active skill that hands over a battle card). - /// Resolved against - /// when the skills panel renders the detail view, and pushed into - /// by - /// so the card becomes assignable to a - /// character. Empty for skills that only act as passive gates and - /// never produce a card. - /// - public string GrantsAction { get; set; } - - /// - /// Numeric bonuses this skill grants while owned. They are the card's - /// actual payload: the skills panel shows the first effect on the grid - /// card, lists all of them in the study plate, and sums every owned - /// skill's effects into the global "collection effect" plate via - /// . Empty for skills that only gate - /// content (e.g. unlock an action) without touching stats. - /// - [JsonPropertyName("Effects")] - public List Effects { get; set; } - - /// - /// The gameplay classification of this skill (Active, Passive, - /// or ForCharacter), serialised as a string in JSON and converted - /// via . - /// - [JsonConverter(typeof(JsonStringEnumConverter))] - [JsonPropertyName("Type")] - public SkillType SkillType { get; set; } - - /// - /// The rarity tier of this skill, serialised as a string in JSON and - /// converted via . Drives the colour - /// of the card frame, study plate and rarity badge through - /// . - /// - [JsonConverter(typeof(JsonStringEnumConverter))] - [JsonPropertyName("Rare")] - public RareType RareType { get; set; } - - private Texture2D cacheSprite; - - /// - /// Lazily loads and caches the for this skill's - /// card artwork. On first access the texture is resolved from the mod-group - /// "characters/skills" using the path; subsequent - /// accesses return the cached reference. - /// - public Texture2D Sprite - { - get - { - if (cacheSprite == null) - cacheSprite = TextureUtils.LoadFromModGroup("characters/skills", Image); - return cacheSprite; - } - } - } -} +using System; +using System.Collections.Generic; +using System.Text.Json.Serialization; +using Cthangover.Core.Factories; +using Cthangover.Core.Utils; +using Godot; + +namespace Cthangover.Mods.Skills +{ + + /// + /// Immutable data model for a single skill definition, populated by + /// from JSON assets. Each instance carries the + /// metadata required to render a skill card in the UI (, + /// , ) and to resolve its gameplay + /// behaviour through and . + /// Instances are shared across the runtime and should not be mutated after + /// construction. + /// + [Serializable] + [EntityKind("skill")] + public class SkillInfo : IIdentifiable + { + /// + /// The unique string key of this skill, used as the primary lookup in + /// and as the identity token in + /// . + /// + [JsonPropertyName("Id")] + public string ID { get; set; } + + /// + /// The display name shown on the skill card. This value is passed through + /// before rendering, allowing + /// localisation via Godot's translation system. + /// + public string Name { get; set; } + + /// + /// A longer textual description explaining what the skill does in gameplay + /// terms. Displayed in tooltip and detail views alongside the card artwork. + /// + public string Description { get; set; } + + /// + /// The relative path to the skill's artwork texture, resolved inside the + /// mod-group "characters/skills" by + /// when the property is first accessed. + /// + public string Image { get; set; } + + /// + /// Optional ID of the action card this skill gifts to the player when + /// acquired (e.g. an active skill that hands over a battle card). + /// Resolved against + /// when the skills panel renders the detail view, and pushed into + /// by + /// so the card becomes assignable to a + /// character. Empty for skills that only act as passive gates and + /// never produce a card. + /// + public string GrantsAction { get; set; } + + /// + /// Numeric bonuses this skill grants while owned. They are the card's + /// actual payload: the skills panel shows the first effect on the grid + /// card, lists all of them in the study plate, and sums every owned + /// skill's effects into the global "collection effect" plate via + /// . Empty for skills that only gate + /// content (e.g. unlock an action) without touching stats. + /// + [JsonPropertyName("Effects")] + public List Effects { get; set; } + + /// + /// The gameplay classification of this skill (Active, Passive, + /// or ForCharacter), serialised as a string in JSON and converted + /// via . + /// + [JsonConverter(typeof(JsonStringEnumConverter))] + [JsonPropertyName("Type")] + public SkillType SkillType { get; set; } + + /// + /// The rarity tier of this skill, serialised as a string in JSON and + /// converted via . Drives the colour + /// of the card frame, study plate and rarity badge through + /// . + /// + [JsonConverter(typeof(JsonStringEnumConverter))] + [JsonPropertyName("Rare")] + public RareType RareType { get; set; } + + private Texture2D cacheSprite; + + /// + /// Lazily loads and caches the for this skill's + /// card artwork. On first access the texture is resolved from the mod-group + /// "characters/skills" using the path; subsequent + /// accesses return the cached reference. + /// + public Texture2D Sprite + { + get + { + if (cacheSprite == null) + cacheSprite = TextureUtils.LoadFromModGroup("characters/skills", Image); + return cacheSprite; + } + } + } +} diff --git a/src/SkillName.cs b/src/SkillName.cs index 26909b1..ef74142 100644 --- a/src/SkillName.cs +++ b/src/SkillName.cs @@ -1,38 +1,38 @@ -namespace Cthangover.Mods.Skills -{ - /// - /// Enumerates every skill available in the game by its canonical identifier. - /// Each member corresponds to a JSON-definition entry loaded by - /// and used to construct instances. - /// The underlying int values are not manually assigned; the enum serves - /// purely as a compile-time-safe skill reference. - /// - public enum SkillName : int - { - /// - /// A domination-type skill that allows the player to command enslaved units, - /// overriding enemy AI and redirecting attacks under the player's control. - /// - SLAVE_MASTER - } - - /// - /// Provides conversion helpers for values, used when - /// bridging the enum-based API with string-based lookups in - /// and factory registries. - /// - public static class SkillNameExtensions - { - /// - /// Converts a enum value to its lowercase string - /// identifier, matching the format expected by - /// and serialization layers. - /// - /// The skill enum value to convert. - /// The lowercase name of the enum constant (e.g. "slave_master"). - public static string ID(this SkillName skill) - { - return skill.ToString().ToLower(); - } - } -} +namespace Cthangover.Mods.Skills +{ + /// + /// Enumerates every skill available in the game by its canonical identifier. + /// Each member corresponds to a JSON-definition entry loaded by + /// and used to construct instances. + /// The underlying int values are not manually assigned; the enum serves + /// purely as a compile-time-safe skill reference. + /// + public enum SkillName : int + { + /// + /// A domination-type skill that allows the player to command enslaved units, + /// overriding enemy AI and redirecting attacks under the player's control. + /// + SLAVE_MASTER + } + + /// + /// Provides conversion helpers for values, used when + /// bridging the enum-based API with string-based lookups in + /// and factory registries. + /// + public static class SkillNameExtensions + { + /// + /// Converts a enum value to its lowercase string + /// identifier, matching the format expected by + /// and serialization layers. + /// + /// The skill enum value to convert. + /// The lowercase name of the enum constant (e.g. "slave_master"). + public static string ID(this SkillName skill) + { + return skill.ToString().ToLower(); + } + } +} diff --git a/src/SkillType.cs b/src/SkillType.cs index 8fd8520..ee1eaef 100644 --- a/src/SkillType.cs +++ b/src/SkillType.cs @@ -1,26 +1,26 @@ -namespace Cthangover.Mods.Skills -{ - /// - /// Classifies how a skill behaves during gameplay. This distinction drives - /// which battle-phase the skill can be used in and how its effects are resolved - /// by the combat engine. - /// - public enum SkillType - { - /// - /// Must be intentionally triggered during the player's turn, consuming an action - /// resource and targeting a specific ally or enemy. - /// - Active, - /// - /// Remains in effect continuously once acquired, providing a persistent buff - /// or aura without requiring any player input. - /// - Passive, - /// - /// Applies directly to the owning character as a stat modifier or intrinsic trait, - /// rather than being a card the player selects each turn. - /// - ForCharacter, - } -} +namespace Cthangover.Mods.Skills +{ + /// + /// Classifies how a skill behaves during gameplay. This distinction drives + /// which battle-phase the skill can be used in and how its effects are resolved + /// by the combat engine. + /// + public enum SkillType + { + /// + /// Must be intentionally triggered during the player's turn, consuming an action + /// resource and targeting a specific ally or enemy. + /// + Active, + /// + /// Remains in effect continuously once acquired, providing a persistent buff + /// or aura without requiring any player input. + /// + Passive, + /// + /// Applies directly to the owning character as a stat modifier or intrinsic trait, + /// rather than being a card the player selects each turn. + /// + ForCharacter, + } +} diff --git a/src/SkillWidget.cs b/src/SkillWidget.cs index 58a96e5..f0b6b2d 100644 --- a/src/SkillWidget.cs +++ b/src/SkillWidget.cs @@ -1,38 +1,38 @@ -using System.Collections.Generic; -using System.Linq; -using Cthangover.Core.Factories.Impls; -using Cthangover.Core.Settings; -using Cthangover.Mods.Interface.Base.Lists.Impls; - -namespace Cthangover.Mods.Skills -{ - /// - /// UI widget that displays all skills currently owned by the player in a - /// column-based card grid. Extends - /// to reuse the generic - /// list-rendering pipeline. When the widget is populated it reads the set - /// of owned skill IDs from in the current - /// runtime, resolves each ID to a - /// via , and - /// hands the resulting models to the list for rendering as - /// items. - /// - public partial class SkillWidget : ColumnCellListWidget - { - /// - /// Produces the collection of models that the - /// list widget will render. Each ownedskill ID from - /// is resolved through - /// and collected into a - /// . - /// - /// - /// A snapshot of all currently owned skills, each as a fully-populated - /// instance. - /// - public override ICollection CreateModels() - { - return GameData.Instance.Runtime.SkillData.Skills.Select(x => SkillFactory.Instance.Get(x)).ToList(); - } - } -} +using System.Collections.Generic; +using System.Linq; +using Cthangover.Core.Factories.Impls; +using Cthangover.Core.Settings; +using Cthangover.Mods.Interface.Base.Lists.Impls; + +namespace Cthangover.Mods.Skills +{ + /// + /// UI widget that displays all skills currently owned by the player in a + /// column-based card grid. Extends + /// to reuse the generic + /// list-rendering pipeline. When the widget is populated it reads the set + /// of owned skill IDs from in the current + /// runtime, resolves each ID to a + /// via , and + /// hands the resulting models to the list for rendering as + /// items. + /// + public partial class SkillWidget : ColumnCellListWidget + { + /// + /// Produces the collection of models that the + /// list widget will render. Each ownedskill ID from + /// is resolved through + /// and collected into a + /// . + /// + /// + /// A snapshot of all currently owned skills, each as a fully-populated + /// instance. + /// + public override ICollection CreateModels() + { + return GameData.Instance.Runtime.SkillData.Skills.Select(x => SkillFactory.Instance.Get(x)).ToList(); + } + } +}