namespace AcDream.Core.Ui; /// /// Verbatim ports of retail UI message strings. Centralised here so /// future retail-faithful refinements only need to touch one file — /// and so the call sites stay readable at the interaction layer. /// /// /// String text is byte-identical with retail. Each helper cites the /// retail DAT data address + the runtime use site in the named decomp /// at docs/research/named-retail/acclient_2013_pseudo_c.txt. /// /// /// /// Pattern mirrors — typed port of a /// retail-UI primitive (gmRadarUI::GetBlipColor at /// 0x004d76f0). Add new strings here as we encounter them. /// /// /// /// Members may be added BEFORE their first call site exists — retail /// strings are a fixed inventory we know we'll need as we port more /// features. Each member's doc-comment cites its retail anchor + /// describes the scenario that'll consume it. Removing dead members /// without a port is fine; we re-grep the decomp. /// /// public static class RetailMessages { /// /// Retail: "The %s cannot be used". /// Data: 0x007e2a70 (line 1033115). Runtime sprintf at /// 0x00588ea4 (line 403095) inside ItemHolder::UseObject's /// IsUseable==0 fallthrough branch. Shown when the player triggers /// Use on an entity whose useability is USEABLE_UNDEF/USEABLE_NO. /// public static string CannotBeUsed(string entityName) => $"The {entityName} cannot be used"; /// /// Retail: "The %s can't be picked up!". /// Runtime sprintf at 0x00587353 (line 401589) inside the /// pickup-flow handler. Shown when the player triggers a pickup on /// an entity that lacks USEABLE_REMOTE / isn't a small-item type. /// public static string CantBePickedUp(string entityName) => $"The {entityName} can't be picked up!"; /// /// Retail: "You cannot pick up creatures!". /// Data: 0x007e22b4 (line 1033034). Runtime use at /// 0x005871f4 (line 401642) inside the same pickup-flow /// handler. Shown when the player triggers a pickup on a Creature /// ItemType (NPCs, monsters, other players). /// public const string CannotPickUpCreatures = "You cannot pick up creatures!"; /// /// Retail: "Cannot be used with %s". /// Data: 0x007cc834 (line 1024669). Runtime sprintf at /// 0x0055ee0e (line 363413). Shown when the player tries /// a two-target Use (e.g., key on lock, lockpick on chest) and /// the combination is invalid for the source item. The %s /// is the TARGET entity name. No call site yet — wired in when /// the two-target Use flow ships. /// public static string CannotBeUsedWith(string targetName) => $"Cannot be used with {targetName}"; /// /// Retail: "The %s cannot be picked up!". FORMAL variant. /// Data: 0x007e227c (line 1033033). Runtime sprintf at /// 0x00587264 (line 401623). Distinct from /// — retail has TWO pickup- /// reject strings (formal "cannot" + informal "can't"); they /// fire from different code paths inside the pickup handler. /// Use whichever the corresponding caller's retail path uses. /// No call site yet — wired in when the formal-pickup-reject /// path ships (probably a server-side rejection message). /// public static string CannotBePickedUp(string entityName) => $"The {entityName} cannot be picked up!"; /// /// Retail: "The %s cannot be used while on a hook, use the /// '@house hooks on' command to make the hook openable.\n". /// Data: 0x007d1f68 (line 1029591). Shown when the player /// tries to Use a hooked-up item with the house's "hooks off" /// preference set. Trailing newline matches retail. No call /// site yet — wired in when the housing system ships. /// public static string CannotBeUsedWhileOnHook_HooksOff(string entityName) => $"The {entityName} cannot be used while on a hook, use the '@house hooks on' command to make the hook openable.\n"; /// /// Retail: "The %s cannot be used while on a hook and only /// the owner may open the hook.\n". /// Data: 0x007d5f30 (line 1030063). Shown when a non-owner /// tries to Use a hooked-up item in someone else's house. /// Trailing newline matches retail. No call site yet — wired in /// when the housing system ships. /// public static string CannotBeUsedWhileOnHook_NotOwner(string entityName) => $"The {entityName} cannot be used while on a hook and only the owner may open the hook.\n"; }