From e77de68fb1257a1b76f4fde296c0aa2d0a5c6e62 Mon Sep 17 00:00:00 2001 From: Anton Tarasenko Date: Tue, 28 Jun 2022 04:59:31 +0700 Subject: [PATCH] Change nick command to use announcer --- sources/Commands/ACommandNick.uc | 124 ++++++++++----------- sources/Commands/ACommandNick_Announcer.uc | 96 ++++++++++++++++ 2 files changed, 154 insertions(+), 66 deletions(-) create mode 100644 sources/Commands/ACommandNick_Announcer.uc diff --git a/sources/Commands/ACommandNick.uc b/sources/Commands/ACommandNick.uc index 5a308bf..c286f9c 100644 --- a/sources/Commands/ACommandNick.uc +++ b/sources/Commands/ACommandNick.uc @@ -19,6 +19,19 @@ */ class ACommandNick extends Command; +var private bool foundErrors; +var private MutableText newName; + +var private ACommandNick_Announcer announcer; + +protected function Finalizer() +{ + _.memory.Free(announcer); + _.memory.Free(newName); + newName = none; + super.Finalizer(); +} + protected function BuildData(CommandDataBuilder builder) { builder.Name(P("nick")).Summary(P("Changes nickname.")); @@ -28,7 +41,7 @@ protected function BuildData(CommandDataBuilder builder) builder.Option(P("plain")) .Describe(P("Take nickname exactly as typed, without attempting to" @ "treat it like formatted string.")); - builder.Option(P("fix"), P("F")) + builder.Option(P("fix"), P("f")) .Describe(P("In case of a nickname with erroroneous formatting or" @ "invalid default color (specified with `--color`)," @ "try to fix/ignore it instead of simply rejecting it.")); @@ -36,62 +49,74 @@ protected function BuildData(CommandDataBuilder builder) .Describe(P("Color to use for the nickname. In case nickname is already" @ "colored, this flag will only affects uncolored parts.")) .ParamText(P("default_color")); + announcer = ACommandNick_Announcer( + _.memory.Allocate(class'ACommandNick_Announcer')); } -protected function ExecutedFor( - EPlayer player, +protected function Executed( CallData result, EPlayer callerPlayer) { - local bool foundErrors, selfChange; - local Text givenName, oldName, callerName; - local MutableText newName; - local array errors; - oldName = player.GetName(); - givenName = result.parameters.GetText(P("nick")); - callerName = callerPlayer.GetName(); - selfChange = callerPlayer.SameAs(player); - if (result.options.HasKey(P("plain"))) + local Text givenName; + local array errors; + + givenName = result.parameters.GetText(P("nick")); + // `newName`'s reference persists between different command calls and + // only deallocated when we need this variable for the next execution. + // "Leaking" a single `Text` like that is insignificant. + _.memory.Free(newName); + newName = _.text.Empty(); + if (result.options.HasKey(P("plain"))) { + newName = givenName.MutableCopy(); + } + else { - player.SetName(givenName); - AnnounceNicknameChange(callerName, oldName, givenName, selfChange); - _.memory.Free(oldName); - _.memory.Free(callerName); - return; + errors = class'FormattingStringParser'.static + .ParseFormatted(givenName, newName, true); } - newName = _.text.Empty(); - errors = class'FormattingStringParser'.static - .ParseFormatted(givenName, newName, true); + foundErrors = false; if (result.options.HasKey(P("color"))) { foundErrors = !TryChangeDefaultColor( - newName, result.options.GetTextBy(P("/color/default_color"))); + result.options.GetTextBy(P("/color/default_color"))); } foundErrors = foundErrors || (errors.length > 0); + class'FormattingReportTool'.static.Report(callerConsole, errors); + class'FormattingReportTool'.static.FreeErrors(errors); +} + +protected function ExecutedFor( + EPlayer target, + CallData result, + EPlayer instigator) +{ + local Text alteredVersion; + if (!foundErrors || result.options.HasKey(P("fix"))) { - player.SetName(newName); - AnnounceNicknameChange(callerName, oldName, newName, selfChange); + announcer.Setup(target, instigator, othersConsole); + target.SetName(newName); + alteredVersion = target.GetName(); + if (newName.Compare(alteredVersion, SCASE_SENSITIVE, SFORM_SENSITIVE)) { + announcer.AnnounceChangedNickname(newName); + } + else { + announcer.AnnounceChangedAlteredNickname(newName, alteredVersion); + } + _.memory.Free(alteredVersion); } - class'FormattingReportTool'.static.Report(callerConsole, errors); - class'FormattingReportTool'.static.FreeErrors(errors); - _.memory.Free(newName); - _.memory.Free(oldName); - _.memory.Free(callerName); } -protected function bool TryChangeDefaultColor( - MutableText newName, - BaseText specifiedColor) +protected function bool TryChangeDefaultColor(BaseText specifiedColor) { local Color defaultColor; + if (newName == none) return false; if (specifiedColor == none) return false; if (_.color.Parse(specifiedColor, defaultColor)) { - newName.ChangeDefaultFormatting( - _.text.FormattingFromColor(defaultColor)); + newName.ChangeDefaultColor(defaultColor); return true; } callerConsole @@ -100,39 +125,6 @@ protected function bool TryChangeDefaultColor( return false; } -protected function AnnounceNicknameChange( - BaseText callerName, - BaseText oldName, - BaseText newName, - bool selfChange) -{ - if (selfChange) - { - callerConsole - .Write(F("Your nickname was {$TextPositive changed} to ")) - .WriteLine(newName); - othersConsole - .Write(callerName) - .Write(F(" {$TextEmphasis changed} thier own nickname to ")) - .WriteLine(newName); - return; - } - callerConsole - .Write(P("Nickname for player ")).Write(oldName) - .Write(F(" was {$TextPositive changed} to ")).WriteLine(newName); - targetConsole - .Write(F("Your nickname was {$TextEmphasis changed} to ")) - .Write(newName) - .Write(P(" by ")) - .WriteLine(callerName); - othersConsole - .Write(callerName) - .Write(F(" {$TextEmphasis changed} nickname for player ")) - .Write(oldName) - .Write(P(" to ")) - .WriteLine(newName); -} - defaultproperties { } \ No newline at end of file diff --git a/sources/Commands/ACommandNick_Announcer.uc b/sources/Commands/ACommandNick_Announcer.uc new file mode 100644 index 0000000..64f2092 --- /dev/null +++ b/sources/Commands/ACommandNick_Announcer.uc @@ -0,0 +1,96 @@ +/** + * Announcer for `ACommandNick`. + * Copyright 2022 Anton Tarasenko + *------------------------------------------------------------------------------ + * This file is part of Acedia. + * + * Acedia is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3 of the License, or + * (at your option) any later version. + * + * Acedia is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Acedia. If not, see . + */ +class ACommandNick_Announcer extends CommandAnnouncer; + +var private AnnouncementVariations changedNickname, changedAlteredNickname; + +protected function Finalizer() +{ + FreeVariations(changedNickname); + FreeVariations(changedAlteredNickname); + super.Finalizer(); +} + +public final function AnnounceChangedNickname(BaseText newNickname) +{ + local int i; + local array templates; + + if (!changedNickname.initialized) + { + changedNickname.initialized = true; + changedNickname.toSelfReport = _.text.MakeTemplate_S( + "Your nickname {$TextNeutral changed} to \"%1\""); + changedNickname.toSelfPublic = _.text.MakeTemplate_S( + "%%instigator {$TextNeutral changed} their own nickname to" + @ "\"%1\""); + changedNickname.toOtherReport = _.text.MakeTemplate_S( + "Nickname for %%instigator%% {$TextNeutral changed} to" + @ "\"%1\""); + changedNickname.toOtherPrivate = _.text.MakeTemplate_S( + "%%instigator%% {$TextNeutral changed} your nickname to \"%1\""); + changedNickname.toOtherPublic = _.text.MakeTemplate_S( + "%%instigator%% {$TextNeutral changed} nickname for player" + @ "%%target%% to \"%1\""); + } + templates = MakeArray(changedNickname); + for (i = 0; i < templates.length; i += 1) { + templates[i].Reset().Arg(newNickname); + } + MakeAnnouncement(changedNickname); +} + +public final function AnnounceChangedAlteredNickname( + BaseText newNickname, + BaseText alteredVersion) +{ + local int i; + local array templates; + + if (!changedAlteredNickname.initialized) + { + changedAlteredNickname.initialized = true; + changedAlteredNickname.toSelfReport = _.text.MakeTemplate_S( + "Your nickname was {$TextNeutral changed} to \"%1\", but then" + @ "got altered by the game into \"%2\""); + changedAlteredNickname.toSelfPublic = _.text.MakeTemplate_S( + "%%instigator has {$TextNeutral changed} their own nickname to" + @ "\"%1\", but it was altered by the game into \"%2\""); + changedAlteredNickname.toOtherReport = _.text.MakeTemplate_S( + "Nickname for %%instigator%% was {$TextNeutral changed} to" + @ "\"%1\", but then got altered by the game into \"%2\""); + changedAlteredNickname.toOtherPrivate = _.text.MakeTemplate_S( + "%%instigator%% has {$TextNeutral changed} your nickname to \"%1\"," + @ "but then it got altered by the game into \"%2\""); + changedAlteredNickname.toOtherPublic = _.text.MakeTemplate_S( + "%%instigator%% has {$TextNeutral changed} nickname for player" + @ "%%target%% to \"%1\", but then it got altered by the game" + @ "into \"%2\""); + } + templates = MakeArray(changedAlteredNickname); + for (i = 0; i < templates.length; i += 1) { + templates[i].Reset().Arg(newNickname).Arg(alteredVersion); + } + MakeAnnouncement(changedAlteredNickname); +} + +defaultproperties +{ +} \ No newline at end of file