feat: start adding more evaluators

This commit is contained in:
Anna 2024-07-28 01:16:47 -04:00
parent 4b2f88850e
commit d3eb675e49
Signed by: anna
GPG Key ID: D0943384CD9F87D1
5 changed files with 192 additions and 42 deletions

View File

@ -39,8 +39,10 @@ public class Configuration : IPluginConfiguration {
public int EvaluationMinSameRole; public int EvaluationMinSameRole;
public Dictionary<Guid, bool> EvaluatorsRandomEnabled = Evaluator.Evaluators.ToDictionary( public Dictionary<Guid, bool> EvaluatorsRandomEnabled = Evaluator.Evaluators.ToDictionary(
e => e.Id, e => e.Id,
_ => true e => e.Default
); );
public float EvaluationLength = 5f;
public bool BlendEvaluations;
} }
public enum MeterMode { public enum MeterMode {

View File

@ -7,41 +7,68 @@ namespace PartyDamage;
public class Evaluator { public class Evaluator {
public required Guid Id { get; init; } public required Guid Id { get; init; }
public required string Name { get; init; } public required string Name { get; init; }
public string? ConfigName { get; init; }
public required uint BattleTalkImage { get; init; } public required uint BattleTalkImage { get; init; }
public required bool Default { get; init; }
public required Dictionary<Evaluation, SeString[]> Lines { get; init; } public required Dictionary<Evaluation, SeString[]> Lines { get; init; }
public bool IsMammet { get; init; } public bool IsMammet { get; init; }
public SeString? GetLineFor(Evaluation evaluation) { public SeString? GetLineFor(Evaluation evaluation, bool blend, int rank) {
if (!this.Lines.TryGetValue(evaluation, out var lines)) { var lines = new List<SeString>();
if (blend) {
if (evaluation.Next() is { } next && this.Lines.TryGetValue(next, out var nextLines)) {
lines.AddRange(nextLines);
}
if (evaluation.Previous() is { } prev && this.Lines.TryGetValue(prev, out var prevLines)) {
lines.AddRange(prevLines);
}
}
if (!this.Lines.TryGetValue(evaluation, out var currentLines)) {
return null; return null;
} }
var line = Random.Shared.GetItems(lines, 1)[0]; lines.AddRange(currentLines);
if (!this.IsMammet) {
return line;
}
foreach (var payload in line.Payloads) { var template = Random.Shared.GetItems(lines.ToArray(), 1)[0];
var line = new SeStringBuilder();
foreach (var payload in template.Payloads) {
if (payload is not TextPayload text) { if (payload is not TextPayload text) {
line.Add(payload);
continue; continue;
} }
var newText = new StringBuilder(); var newText = this.IsMammet
var upper = true; ? Mammetise(text.Text!)
foreach (var ch in text.Text!) { : text.Text!;
if (!char.IsLetter(ch)) { newText = string.Format(
newText.Append(ch); newText,
continue; rank
} );
newText.Append(upper ? char.ToUpperInvariant(ch) : char.ToLowerInvariant(ch));
upper = !upper;
}
text.Text = newText.ToString(); line.AddText(newText.ToString());
} }
return line; return line.Build();
}
private static string Mammetise(string input) {
var newText = new StringBuilder();
var upper = true;
foreach (var ch in input) {
if (!char.IsLetter(ch)) {
newText.Append(ch);
continue;
}
newText.Append(upper ? char.ToUpperInvariant(ch) : char.ToLowerInvariant(ch));
upper = !upper;
}
return newText.ToString();
} }
public static readonly Guid RandomId = new("00000000-0000-0000-0000-000000000001"); public static readonly Guid RandomId = new("00000000-0000-0000-0000-000000000001");
@ -51,6 +78,7 @@ public class Evaluator {
Id = new Guid("ebbccc44-13b5-4843-a635-3b693fe47840"), Id = new Guid("ebbccc44-13b5-4843-a635-3b693fe47840"),
Name = "Parser Mammet", Name = "Parser Mammet",
BattleTalkImage = 73160, BattleTalkImage = 73160,
Default = true,
Lines = new Dictionary<Evaluation, SeString[]> { Lines = new Dictionary<Evaluation, SeString[]> {
[Evaluation.Best] = [ [Evaluation.Best] = [
"Parse result: greatly exceeds expectations!", "Parse result: greatly exceeds expectations!",
@ -85,10 +113,35 @@ public class Evaluator {
}, },
IsMammet = true, IsMammet = true,
}, },
new Evaluator {
Id = new("3e833290-bc1f-4318-9461-391dcc66c739"),
Name = "Ranking Mammet",
ConfigName = "Ranking Mammet (displays rank explicitly)",
BattleTalkImage = 73160,
Default = false,
Lines = new Dictionary<Evaluation, SeString[]> {
[Evaluation.Best] = [
"You ranked #{0}.",
],
[Evaluation.Good] = [
"You ranked #{0}.",
],
[Evaluation.Fair] = [
"You ranked #{0}.",
],
[Evaluation.Poor] = [
"You ranked #{0}.",
],
[Evaluation.Awful] = [
"You ranked #{0}.",
],
}
},
new Evaluator { new Evaluator {
Id = new Guid("5053c386-192a-416f-b025-223af8d592bf"), Id = new Guid("5053c386-192a-416f-b025-223af8d592bf"),
Name = "G'raha Tia", Name = "G'raha Tia",
BattleTalkImage = 73012, BattleTalkImage = 73012,
Default = true,
Lines = new Dictionary<Evaluation, SeString[]> { Lines = new Dictionary<Evaluation, SeString[]> {
[Evaluation.Best] = [ [Evaluation.Best] = [
"Impressive! No surprise coming from someone as skilled as you.", "Impressive! No surprise coming from someone as skilled as you.",
@ -116,11 +169,12 @@ public class Evaluator {
Id = new Guid("1dd9addb-f0d3-4a8d-b087-62ae10cb5423"), Id = new Guid("1dd9addb-f0d3-4a8d-b087-62ae10cb5423"),
Name = "Wuk Lamat", Name = "Wuk Lamat",
BattleTalkImage = 73265, BattleTalkImage = 73265,
Default = true,
Lines = new Dictionary<Evaluation, SeString[]> { Lines = new Dictionary<Evaluation, SeString[]> {
[Evaluation.Best] = [ [Evaluation.Best] = [
new SeStringBuilder() new SeStringBuilder()
.AddText("Incredible! You have ") .AddText("Incredible! You ")
.AddItalics("got") .AddItalics("have")
.AddText(" to show me how to do that sometime!") .AddText(" to show me how to do that sometime!")
.Build(), .Build(),
"Amazing! You truly are the best there is!", "Amazing! You truly are the best there is!",
@ -135,7 +189,7 @@ public class Evaluator {
], ],
[Evaluation.Poor] = [ [Evaluation.Poor] = [
new SeStringBuilder() new SeStringBuilder()
.AddText("Whoa! Is Eorzea's champion ") .AddText("Hey... Is Eorzea's champion ")
.AddItalics("slacking") .AddItalics("slacking")
.AddText("? Huh. What will everyone say when I tell them?") .AddText("? Huh. What will everyone say when I tell them?")
.Build(), .Build(),
@ -154,7 +208,43 @@ public class Evaluator {
"It's okay. I won't tell anyone about that.", "It's okay. I won't tell anyone about that.",
], ],
}, },
} },
new Evaluator {
Id = new("3f862fca-cb18-4f48-b067-71b116070fa8"),
Name = "Estinien",
BattleTalkImage = 73007,
Default = true,
Lines = new Dictionary<Evaluation, SeString[]> {
[Evaluation.Best] = [
"Ha! Well fought, friend! If only I had been there to join you. It looked like fun.",
"Now there's a fight that will make a good story. Expertly fought.",
],
}
},
new Evaluator {
Id = new("37ac5883-c008-4dc2-8c6b-a605a4698c04"),
Name = "Thancred",
ConfigName = "Thancred (\"This is Thancred\" meme)",
BattleTalkImage = 73013,
Default = false,
Lines = new Dictionary<Evaluation, SeString[]> {
[Evaluation.Best] = [
"This is Thancred.",
],
[Evaluation.Good] = [
"This is Thancred.",
],
[Evaluation.Fair] = [
"This is Thancred.",
],
[Evaluation.Poor] = [
"This is Thancred.",
],
[Evaluation.Awful] = [
"This is Thancred.",
],
},
},
]; ];
} }
@ -166,6 +256,24 @@ public enum Evaluation {
Awful, Awful,
} }
public static class EvaluationExt {
public static Evaluation? Next(this Evaluation evaluation) {
if (evaluation == 0) {
return null;
}
return evaluation - 1;
}
public static Evaluation? Previous(this Evaluation evaluation) {
if (evaluation == Evaluation.Awful) {
return null;
}
return evaluation + 1;
}
}
// 001 Venat // 001 Venat
// 002 Zenos // 002 Zenos
// 003 Evil? Zenos // 003 Evil? Zenos

View File

@ -15,4 +15,15 @@ public static class ImGuiHelper {
public static OnDispose? DisabledUnless(bool unless) { public static OnDispose? DisabledUnless(bool unless) {
return DisabledIf(!unless); return DisabledIf(!unless);
} }
}
public static bool BeginComboVertical(
string label,
string id,
string preview,
float width = -1
) {
ImGui.TextUnformatted(label);
ImGui.SetNextItemWidth(width);
return ImGui.BeginCombo($"##{id}", preview);
}
}

View File

@ -212,7 +212,7 @@ public class Plugin : IDalamudPlugin {
return; return;
} }
var evaluator = GetEvaluator(); var evaluator = this.GetEvaluator();
if (evaluator == null) { if (evaluator == null) {
return; return;
} }
@ -247,13 +247,13 @@ public class Plugin : IDalamudPlugin {
continue; continue;
} }
var msg = evaluator.GetLineFor(threshold.Key); var msg = evaluator.GetLineFor(threshold.Key, this.Config.BlendEvaluations, youIndex + 1);
if (msg != null) { if (msg != null) {
var bytes = msg.EncodeWithNullTerminator(); var bytes = msg.EncodeWithNullTerminator();
UIModule.Instance()->ShowBattleTalkImage( UIModule.Instance()->ShowBattleTalkImage(
Encoding.UTF8.GetBytes(evaluator.Name), Encoding.UTF8.GetBytes(evaluator.Name),
bytes, bytes,
5f, this.Config.EvaluationLength,
evaluator.BattleTalkImage, evaluator.BattleTalkImage,
6 6
); );
@ -263,19 +263,19 @@ public class Plugin : IDalamudPlugin {
} }
return; return;
}
Evaluator? GetEvaluator() { internal Evaluator? GetEvaluator() {
if (this.Config.EvaluatorId != Evaluator.RandomId) { if (this.Config.EvaluatorId != Evaluator.RandomId) {
return Evaluator.Evaluators.FirstOrDefault(e => e.Id == this.Config.EvaluatorId); return Evaluator.Evaluators.FirstOrDefault(e => e.Id == this.Config.EvaluatorId);
}
var pool = Evaluator.Evaluators
.Where(e => this.Config.EvaluatorsRandomEnabled.GetValueOrDefault(e.Id))
.ToArray();
return pool.Length == 0
? null
: Random.Shared.GetItems(pool, 1).GetIndexOrDefault(0);
} }
var pool = Evaluator.Evaluators
.Where(e => this.Config.EvaluatorsRandomEnabled.GetValueOrDefault(e.Id))
.ToArray();
return pool.Length == 0
? null
: Random.Shared.GetItems(pool, 1).GetIndexOrDefault(0);
} }
/// <summary> /// <summary>

View File

@ -1,4 +1,7 @@
using System.Numerics; using System.Numerics;
using System.Text;
using Dalamud.Interface.Utility;
using FFXIVClientStructs.FFXIV.Client.UI;
using ImGuiNET; using ImGuiNET;
namespace PartyDamage; namespace PartyDamage;
@ -118,13 +121,19 @@ public class PluginUi : IDisposable {
anyChanged |= ImGui.Checkbox("Show an NPC text bubble rating your performance after an encounter", ref this.Plugin.Config.UseEvaluatorNpc); anyChanged |= ImGui.Checkbox("Show an NPC text bubble rating your performance after an encounter", ref this.Plugin.Config.UseEvaluatorNpc);
using (ImGuiHelper.DisabledUnless(this.Plugin.Config.UseEvaluatorNpc)) { using (ImGuiHelper.DisabledUnless(this.Plugin.Config.UseEvaluatorNpc)) {
const string previewLabel = "Preview";
var previewButtonSize = ImGuiHelpers.GetButtonSize(previewLabel);
var comboSize = ImGui.GetContentRegionAvail().X
- ImGui.GetStyle().ItemSpacing.X
- previewButtonSize.X;
var current = Evaluator.Evaluators.FirstOrDefault(e => e.Id == this.Plugin.Config.EvaluatorId); var current = Evaluator.Evaluators.FirstOrDefault(e => e.Id == this.Plugin.Config.EvaluatorId);
var preview = current == null var preview = current == null
? this.Plugin.Config.EvaluatorId == Evaluator.RandomId ? this.Plugin.Config.EvaluatorId == Evaluator.RandomId
? "Random" ? "Random"
: "None" : "None"
: current.Name; : current.Name;
if (ImGui.BeginCombo("Evaluator", preview)) { if (ImGuiHelper.BeginComboVertical("Evaluator", "evaluator", preview, comboSize)) {
using var endCombo = new OnDispose(ImGui.EndCombo); using var endCombo = new OnDispose(ImGui.EndCombo);
if (ImGui.Selectable("None", this.Plugin.Config.EvaluatorId == Guid.Empty)) { if (ImGui.Selectable("None", this.Plugin.Config.EvaluatorId == Guid.Empty)) {
@ -138,13 +147,31 @@ public class PluginUi : IDisposable {
} }
foreach (var evaluator in Evaluator.Evaluators) { foreach (var evaluator in Evaluator.Evaluators) {
if (ImGui.Selectable(evaluator.Name, this.Plugin.Config.EvaluatorId == evaluator.Id)) { if (ImGui.Selectable(evaluator.ConfigName ?? evaluator.Name, this.Plugin.Config.EvaluatorId == evaluator.Id)) {
anyChanged = true; anyChanged = true;
this.Plugin.Config.EvaluatorId = evaluator.Id; this.Plugin.Config.EvaluatorId = evaluator.Id;
} }
} }
} }
ImGui.SameLine();
if (ImGui.Button(previewLabel)) {
if (this.Plugin.GetEvaluator() is { } evaluator) {
var evaluation = Random.Shared.GetItems(Enum.GetValues<Evaluation>(), 1)[0];
var msg = evaluator.GetLineFor(evaluation, this.Plugin.Config.BlendEvaluations, Random.Shared.Next(1, 8));
if (msg != null) {
unsafe {
UIModule.Instance()->ShowBattleTalk(
Encoding.UTF8.GetBytes(evaluator.Name),
msg.EncodeWithNullTerminator(),
this.Plugin.Config.EvaluationLength,
6
);
}
}
}
}
if (ImGui.TreeNodeEx("Evaluation thresholds")) { if (ImGui.TreeNodeEx("Evaluation thresholds")) {
using var treePop = new OnDispose(ImGui.TreePop); using var treePop = new OnDispose(ImGui.TreePop);
ImGui.TextUnformatted("If your rank is equal to or above the thresholds defined below, you will get the ranking specified. For example, if best is set to 85% and good is set to 65% and you were 3/4 (75%), you would be evaluated as good."); ImGui.TextUnformatted("If your rank is equal to or above the thresholds defined below, you will get the ranking specified. For example, if best is set to 85% and good is set to 65% and you were 3/4 (75%), you would be evaluated as good.");
@ -168,13 +195,15 @@ public class PluginUi : IDisposable {
foreach (var evaluator in Evaluator.Evaluators) { foreach (var evaluator in Evaluator.Evaluators) {
var enabled = this.Plugin.Config.EvaluatorsRandomEnabled.GetValueOrDefault(evaluator.Id, false); var enabled = this.Plugin.Config.EvaluatorsRandomEnabled.GetValueOrDefault(evaluator.Id, false);
if (ImGui.Checkbox(evaluator.Name, ref enabled)) { if (ImGui.Checkbox(evaluator.ConfigName ?? evaluator.Name, ref enabled)) {
anyChanged = true; anyChanged = true;
this.Plugin.Config.EvaluatorsRandomEnabled[evaluator.Id] = enabled; this.Plugin.Config.EvaluatorsRandomEnabled[evaluator.Id] = enabled;
} }
} }
} }
anyChanged |= ImGui.Checkbox("Mix in lines from the next and previous evaluation levels", ref this.Plugin.Config.BlendEvaluations);
anyChanged |= ImGui.SliderFloat("Seconds to display evaluation", ref this.Plugin.Config.EvaluationLength, 0.5f, 30);
anyChanged |= ImGui.SliderInt("Minimum players to show evaluation", ref this.Plugin.Config.EvaluationMinCombatants, 0, 24); anyChanged |= ImGui.SliderInt("Minimum players to show evaluation", ref this.Plugin.Config.EvaluationMinCombatants, 0, 24);
anyChanged |= ImGui.SliderInt("Minimum players on the same role to show evaluation", ref this.Plugin.Config.EvaluationMinSameRole, 0, 8); anyChanged |= ImGui.SliderInt("Minimum players on the same role to show evaluation", ref this.Plugin.Config.EvaluationMinSameRole, 0, 8);
} }