diff --git a/src/AcDream.App/UI/UiChannelMenu.cs b/src/AcDream.App/UI/UiChannelMenu.cs
index 0d7445c8..0403527c 100644
--- a/src/AcDream.App/UI/UiChannelMenu.cs
+++ b/src/AcDream.App/UI/UiChannelMenu.cs
@@ -53,7 +53,7 @@ public sealed class UiChannelMenu : UiElement
public uint PressedSprite { get; set; }
public Vector4 TextColor { get; set; } = new(1f, 0.92f, 0.72f, 1f);
/// Popup panel fill — the retail talk-focus menu is a warm tan/orange.
- public Vector4 PopupColor { get; set; } = new(0.56f, 0.40f, 0.18f, 0.97f);
+ public Vector4 PopupColor { get; set; } = new(0.56f, 0.40f, 0.18f, 1f);
private bool _open;
private static float PopupW => 2 * ColW;
@@ -61,26 +61,51 @@ public sealed class UiChannelMenu : UiElement
public UiChannelMenu() { CapturesPointerDrag = true; }
+ /// The button face label = the active talk target (retail updates the
+ /// "Chat" button to whichever target you pick). "Chat" = Chat-to-All (Say).
+ private string ButtonText => Selected switch
+ {
+ ChatChannelKind.Say => "Chat",
+ ChatChannelKind.General => "General",
+ ChatChannelKind.Trade => "Trade",
+ ChatChannelKind.Lfg => "LFG",
+ ChatChannelKind.Fellowship => "Fellow",
+ ChatChannelKind.Allegiance => "Alleg",
+ ChatChannelKind.Patron => "Patron",
+ ChatChannelKind.Vassals => "Vassals",
+ ChatChannelKind.Monarch => "Monarch",
+ ChatChannelKind.Roleplay => "Roleplay",
+ ChatChannelKind.Society => "Society",
+ ChatChannelKind.Olthoi => "Olthoi",
+ _ => "Chat",
+ };
+
protected override void OnDraw(UiRenderContext ctx)
{
- // Button face + the "Chat" label (retail labels the talk-focus button "Chat").
+ // Button face + the active-target label (retail updates this to the chosen target).
if (SpriteResolve is { } resolve)
{
var (tex, _, _) = resolve(_open ? PressedSprite : NormalSprite);
if (tex != 0) ctx.DrawSprite(tex, 0, 0, Width, Height, 0f, 0f, 1f, 1f, Vector4.One);
}
- DrawLabel(ctx, "Chat", 4f, (Height - LineH()) * 0.5f);
+ DrawLabel(ctx, ButtonText, 4f, (Height - LineH()) * 0.5f);
if (!_open) return;
// Two-column popup opening UPWARD from the button (chat sits at screen bottom).
- float top = -PopupH;
- ctx.DrawRect(0, top, PopupW, PopupH, PopupColor);
- for (int i = 0; i < Items.Length; i++)
+ // Force OPAQUE: the menu must read solid even though the chat window is translucent.
+ ctx.PushAlphaAbsolute(1f);
+ try
{
- int col = i / Rows, row = i % Rows;
- DrawLabel(ctx, Items[i].Label, 4f + col * ColW, top + row * ItemH);
+ float top = -PopupH;
+ ctx.DrawRect(0, top, PopupW, PopupH, PopupColor);
+ for (int i = 0; i < Items.Length; i++)
+ {
+ int col = i / Rows, row = i % Rows;
+ DrawLabel(ctx, Items[i].Label, 4f + col * ColW, top + row * ItemH);
+ }
}
+ finally { ctx.PopAlpha(); }
}
private float LineH() => DatFont?.LineHeight ?? Font?.LineHeight ?? 14f;
diff --git a/src/AcDream.App/UI/UiRenderContext.cs b/src/AcDream.App/UI/UiRenderContext.cs
index ecda1c1c..5b97492e 100644
--- a/src/AcDream.App/UI/UiRenderContext.cs
+++ b/src/AcDream.App/UI/UiRenderContext.cs
@@ -34,6 +34,10 @@ public sealed class UiRenderContext
/// Multiply into the running opacity. Pair with .
public void PushAlpha(float a) { _alphaStack.Add(_alpha); _alpha *= a; }
+ /// Push an ABSOLUTE opacity (replaces, not multiplies) — for popups/overlays
+ /// that must stay opaque even inside a translucent window. Pair with .
+ public void PushAlphaAbsolute(float a) { _alphaStack.Add(_alpha); _alpha = a; }
+
public void PopAlpha()
{
if (_alphaStack.Count == 0) return;