diff --git a/HellionChat/Branding/HellionForgeAscii.cs b/HellionChat/Branding/HellionForgeAscii.cs new file mode 100644 index 0000000..da98572 --- /dev/null +++ b/HellionChat/Branding/HellionForgeAscii.cs @@ -0,0 +1,36 @@ +namespace HellionChat.Branding; + +// Lazy-loaded provenance art that ships embedded with the DLL. Two +// variants: +// +// - FoxBanner: the full-size silhouette with "Hellion Forge" inside +// the body — rendered in the first-run wizard and the Information +// tab as a small "about the makers" anchor. +// - FoxMini: the four-line fox-head + curly-tail that gets stitched +// into the DI-logger bootstrap line so an xllog reader sees the +// same signature on every plugin load. +// +// Both files live as embedded resources under HellionChat.Branding.* so +// the plugin DLL is self-contained — no on-disk asset lookup that could +// silently miss after a partial deploy. +internal static class HellionForgeAscii +{ + private static string? _foxBanner; + private static string? _foxMini; + + public static string FoxBanner => _foxBanner ??= Load("HellionChat.Branding.fox-banner.txt"); + + public static string FoxMini => _foxMini ??= Load("HellionChat.Branding.fox-mini.txt"); + + private static string Load(string resourceName) + { + using var stream = typeof(HellionForgeAscii).Assembly.GetManifestResourceStream( + resourceName + ); + if (stream is null) + return string.Empty; + + using var reader = new StreamReader(stream); + return reader.ReadToEnd(); + } +} diff --git a/HellionChat/HellionChat.csproj b/HellionChat/HellionChat.csproj index b8a1cc3..25b514a 100644 --- a/HellionChat/HellionChat.csproj +++ b/HellionChat/HellionChat.csproj @@ -58,6 +58,12 @@ HellionFont-OFL.txt + + HellionChat.Branding.fox-banner.txt + + + HellionChat.Branding.fox-mini.txt + HellionChat.Themes.Builtin.example-theme.json diff --git a/HellionChat/Resources/Branding/fox-banner.txt b/HellionChat/Resources/Branding/fox-banner.txt new file mode 100644 index 0000000..8351a91 --- /dev/null +++ b/HellionChat/Resources/Branding/fox-banner.txt @@ -0,0 +1,68 @@ + .:;+xXXX$$$$$$$$XXx+;: +.X$+ .;+X$$$$$$$$$$$$$$$$$$$$$$$$$$$x: +;$xx$$X+:... .....::+X$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$;. +X$; .:+xXXX$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$X: +$$; :++xX$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$X; +$$x. .+$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$X. +x$$; ;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$X+;::::::;x$$$$$: +:$$$; .+$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$X+:. .+$$$$$$$$$X+;;: + ;$$$+. :X$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$X;: :$$$$$$$$$$$$$$$$X;. + .+$$$X: ..;X$$$$$$$$$$$$$$$$$$$$$$$$$$X;.. :$$$$$$$$$$$$$$$$$$$$X: + ;$$$$$X+::::+X$$$$$$$$$$$$$$$$$$$$$X;. .$$$$$$$$$$$$$$$$$$$$$$$X; + +$$$$$$$$$$$$$$$$$$$$$$$$$$$$X+: Hellion Forge x$$$$$$$$$$$$$$$$$$$$$$$$$X: + .;x$$$$$$$$$$$$$$$$$$$$$x;: .X$$$$$$$$$$$$$$$$$$$$$$$$$$$+ + .;+$$$$$$$$$$X+;:.. .X$$$$$$$$$$$$$$$$$$$$$$$$$$$$+ + .X$$$$$$$$$$$$$$$$$$$$$$$$$$$$$; + .X$$$$$$$$$$$$$$$$$$$$$$$$$$$$$X + x$$$$$$$$$$$$$$$$$$$$$$$$$$$$$X + ;$$$$$$xx$$$$$$$$$$$$$$$$$$$$$x + .$$$$$$x+$$$$$$$$$$$$$$$$$$$$$x + :+X$$$$$$X;$$$$$$$$$$$$$$$$$$$$$$: + ;$$$$$$$$$$;$$$$$$$$$$$$$$$$$$$$$$X. + +$$$$$$$$$$;x$$$$$$$$$$$$$$$$$$$$$$+ + x$$$$$$$$$$:$$$$$$$$$$$$$$$$$$$$$$X: + .X$$$$$$$$$.:$$$$$$$$$$$$$$$$$$$$$$; + :X$$X;;;;: .$$$$$$$$$$$$$$$$$$$$$$X. + .$$$$X .$$$$$$$$$$$$$$$$$$$$$$$: + .$$$$+ .X$$$$$$$$$$$$$$$$$$$$$$; + ;$$$$: .X$$$$$$$$$$$$$$$$$$$$$$x + :X$$$+ .$$$$$$$$$$$$$$$$$$$$$$$X + +$$$x :$$$$$$$$$$$$$$$$$$$$$$$X + ;$$X: $$$$$$$$$$$$$$$$$$$$$$$$X + x$$$$$$$$$$$$$$$$$$$$$$$$X + +$$$$$$$$$$$$$$$$$$$$$$$$$+ + .+$$$$$$$$$$$$$$$$$$$$$$$$$$; + . ;$$$$$$$$$$$$$$$$$$$$$$$$$$$$: + :X$x$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ + .XX$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$+ + ;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$+$; + .. ++X$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$:+$: + :$$+. ;$$$$$$$$$$$$$$X$$$$$$$$$$$$$$$$$$$$$;:$$+ + .x+X$X: X$$$$$$$$$$x::;:;$$$$$$$$$$$$$$$$$$X: ;$X. + :X.x$$$:.::::::;x+:X$$$$;$$$$$$$$$$$$$$$$$$: :X; + :x.x$$$$$$$$$$$$$$$$$;;$:$$$$$$$$$$$$$$$$$: :$+ + :Xx$$$$$$$$$$$$$$$$$: ;X;$$$$$$$$$$$$$$$$: .+$$; + ;$$$$$$$$$$$$$$$$$$; .X+X$$$$$$$$$$$$$$$+ .+$+. + +$$$$$$$$$$$$$$$$$$$$$$$;+$$$$$$$$$$$$$$X: .+X: + +$$$$$$$$$$$$$$$$$$$$$$$$$+:$$$$$$$$$$$$$+.+$+. + ;$$$$$$$$$$$$$$$$$$$$$$$$$$$X;$$$$$$$$$$$$$$X: + +X: .:X$$$$$$$$x+++x$$$$$$$$;:X$$$$$$$$$$$X: + :x.;$;+$$$$$:. :X$$$$X :$$$$$$$$$$X: + ;x :X$$$; .x$$x X$$; .:+.$$$$$$$$$$x + xx.X$$X: X$;.:$X:.X$$$$$$$$$: + +$$$$X. ;$;::: .$$$$$$$$$: + ;$$$; :+X$$$$XX$; X$$$$$$$$: + ;$$X: .:x$x$$$$$X. x$$$$$$$$: + :X$X: :+x; :$$$$$: +$$$$$$$X: + :++$X+xXX;. +$$$$. +$$$$$$$+. + ... .X$$$X. +$$$$$$$: + ;$$$$; .X$$$$$$x. + ;$$X; :X$$$$$$; + ;$$$$$$x. + .X$$$$$$; + ;$$$$$$+ + +$$$$$; + :X$$$$;. + ;$$$$+. + .x$$$X: + .+$$X; diff --git a/HellionChat/Resources/Branding/fox-mini.txt b/HellionChat/Resources/Branding/fox-mini.txt new file mode 100644 index 0000000..eeabd1e --- /dev/null +++ b/HellionChat/Resources/Branding/fox-mini.txt @@ -0,0 +1,4 @@ +|\_/|,,_____,~~` +(.".)~~ )`~}} + \o/\ /---~\\ ~}} + _// _// ~} diff --git a/HellionChat/Ui/FirstRunWizard.cs b/HellionChat/Ui/FirstRunWizard.cs index d09687d..f54b4af 100644 --- a/HellionChat/Ui/FirstRunWizard.cs +++ b/HellionChat/Ui/FirstRunWizard.cs @@ -2,6 +2,7 @@ using System.Numerics; using Dalamud.Bindings.ImGui; using Dalamud.Interface.Utility.Raii; using Dalamud.Interface.Windowing; +using HellionChat.Branding; using HellionChat.Code; using HellionChat.Privacy; using HellionChat.Resources; @@ -38,6 +39,11 @@ public sealed class FirstRunWizard : Window public override void Draw() { + DrawHellionForgeAnchor(); + ImGui.Spacing(); + ImGui.Separator(); + ImGui.Spacing(); + ImGui.TextWrapped(HellionStrings.Wizard_Intro); ImGui.Spacing(); ImGui.Separator(); @@ -147,6 +153,19 @@ public sealed class FirstRunWizard : Window } } + // Collapsible because the full silhouette is taller than the wizard + // window — folded by default so the privacy cards stay the primary + // focus, expandable for whoever wants the "about the makers" anchor. + private void DrawHellionForgeAnchor() + { + using var tree = ImRaii.TreeNode("Hellion Forge"); + if (!tree.Success) + return; + + using (Plugin.Interface.UiBuilder.MonoFontHandle.Push()) + ImGui.TextUnformatted(HellionForgeAscii.FoxBanner); + } + private void ApplyPrivacyFirst() { Plugin.Config.PrivacyFilterEnabled = true; diff --git a/HellionChat/Ui/SettingsTabs/Information.cs b/HellionChat/Ui/SettingsTabs/Information.cs index 09428d1..9a2ba87 100644 --- a/HellionChat/Ui/SettingsTabs/Information.cs +++ b/HellionChat/Ui/SettingsTabs/Information.cs @@ -3,6 +3,7 @@ using Dalamud.Interface; using Dalamud.Interface.Colors; using Dalamud.Interface.Utility; using Dalamud.Interface.Utility.Raii; +using HellionChat.Branding; using HellionChat.Resources; using HellionChat.Util; @@ -58,6 +59,8 @@ internal sealed class Information : ISettingsTab { using var wrap = ImRaii.TextWrapPos(0.0f); + DrawHellionForgeSection(); + ImGui.Spacing(); DrawVersionInfoSection(); ImGui.Spacing(); DrawAboutSection(); @@ -65,6 +68,20 @@ internal sealed class Information : ISettingsTab DrawChangelogSection(); } + // Provenance anchor — folded by default so the tab opens to the + // version-info section as before. Expands to show the full Hellion + // Forge silhouette in monospace. + private void DrawHellionForgeSection() + { + using var tree = ImRaii.TreeNode("Hellion Forge"); + if (!tree.Success) + return; + + using (ImRaii.PushIndent(ImGui.GetStyle().IndentSpacing, false)) + using (Plugin.Interface.UiBuilder.MonoFontHandle.Push()) + ImGui.TextUnformatted(HellionForgeAscii.FoxBanner); + } + private void DrawVersionInfoSection() { using var tree = ImRaii.TreeNode(HellionStrings.Settings_Information_VersionInfo_Heading);