feat: support level-based replacements

This commit is contained in:
Anna 2024-06-17 15:04:13 -04:00
parent 679b07c4bb
commit 2924d52c61
Signed by: anna
GPG Key ID: D0943384CD9F87D1
4 changed files with 150 additions and 2 deletions

View File

@ -29,6 +29,10 @@ public class WhenNodeDeserialiser : INodeDeserializer {
value = nestedObjectDeserializer(reader, typeof(WhenQuest));
break;
}
case "level": {
value = nestedObjectDeserializer(reader, typeof(WhenLevel));
break;
}
default: {
throw new YamlException($"invalid when: unknown type \"{name.Value}\"");
}

125
Model/WhenLevel.cs Normal file
View File

@ -0,0 +1,125 @@
using YamlDotNet.Core;
using YamlDotNet.Core.Events;
using YamlDotNet.Serialization;
namespace TimePasses.Model;
[Serializable]
public class WhenLevel : IWhen {
public uint Level { get; init; }
public int CompareResult { get; init; }
public string Text { get; init; }
public bool Slowly { get; init; }
public bool IsValid(Plugin plugin) {
if (plugin.ClientState.LocalPlayer is not { } player) {
return false;
}
var cmp = player.Level.CompareTo(this.Level);
return this.CompareResult switch {
1 when cmp > 0 => true,
0 when cmp == 0 => true,
-1 when cmp < 0 => true,
_ => false,
};
}
}
public class WhenLevelConverter : IYamlTypeConverter {
public bool Accepts(Type type) {
return type == typeof(WhenLevel);
}
public object? ReadYaml(IParser parser, Type type) {
parser.Consume<MappingStart>();
string? text = null;
int? comparerResult = null;
uint? level = null;
var slowly = false;
while (parser.Current is not MappingEnd) {
var key = parser.Consume<Scalar>();
if (!key.IsKey) {
throw new YamlException("expected key");
}
var value = parser.Consume<Scalar>();
switch (key.Value) {
case "greaterThan": {
if (comparerResult != null) {
throw new YamlException("duplicate operations in whenlevel");
}
comparerResult = 1;
break;
}
case "equalTo": {
if (comparerResult != null) {
throw new YamlException("duplicate operations in whenlevel");
}
comparerResult = 0;
break;
}
case "lessThan": {
if (comparerResult != null) {
throw new YamlException("duplicate operations in whenlevel");
}
comparerResult = -1;
break;
}
case "level": {
if (!uint.TryParse(value.Value, out var lvl)) {
throw new YamlException("invalid whenlevel: level was not numeric");
}
level = lvl;
break;
}
case "text": {
text = value.Value;
break;
}
case "slowly": {
if (!bool.TryParse(value.Value, out slowly)) {
throw new YamlException("invalid whenlevel: slowly was not a boolean");
}
break;
}
default: {
continue;
}
}
}
parser.Consume<MappingEnd>();
if (text == null) {
throw new YamlException("invalid whenlevel: missing text");
}
if (comparerResult == null) {
throw new YamlException("invalid whenlevel: missing operation");
}
if (level == null) {
throw new YamlException("invalid whenlevel: missing level");
}
return new WhenLevel {
CompareResult = comparerResult.Value,
Level = level.Value,
Text = text,
Slowly = slowly,
};
}
public void WriteYaml(IEmitter emitter, object? value, Type type)
{
throw new NotImplementedException();
}
}

View File

@ -14,10 +14,13 @@ namespace TimePasses;
public class Plugin : IDalamudPlugin {
[PluginService]
private IGameInteropProvider GameInterop { get; init; }
internal static IPluginLog Log { get; set; }
[PluginService]
internal static IPluginLog Log { get; set; }
internal IClientState ClientState { get; init; }
[PluginService]
private IGameInteropProvider GameInterop { get; init; }
private HttpClient Client { get; } = new();
@ -27,6 +30,7 @@ public class Plugin : IDalamudPlugin {
private static IDeserializer Deserializer { get; } = new DeserializerBuilder()
.WithNamingConvention(UnderscoredNamingConvention.Instance)
.WithTypeConverter(new WhenLevelConverter())
.WithNodeDeserializer(new WhenNodeDeserialiser())
.IgnoreUnmatchedProperties()
.Build();

View File

@ -12,6 +12,7 @@ replacements:
text: |-
The water here
is so peaceful.
# Original: Start any trouble, and I'll see you rot in the oubliettes for eternity.
- id: 291
when:
@ -21,3 +22,17 @@ replacements:
text: |-
My eyes are peeled
for trouble.
# Original: Don't ever turn your back on a beastie, hear?
- id: 280
when:
- level:
greaterThan: 30
text: |-
Try not to get
swarmed out there.
- level:
greaterThan: 50
text: |-
Bet beasties never
give you any trouble.