Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions Mods/DefaultSkins/Skins/badeline.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@
"Model": "badeline",
"HideHair": false,
"Name": "Badeline",
"HairNormal" : 10174389,
"HairNoDash" : 7258367,
"HairTwoDash" : 16421375,
"HairRefillFlash" : 16777215,
"HairFeather" : 15914064
"HairNormal" : "9B3FB5",
"HairNoDash" : "6EC0FF",
"HairTwoDash" : "FA91FF",
"HairRefillFlash" : "FFFFFF",
"HairFeather" : "F2D450"
}
10 changes: 5 additions & 5 deletions Mods/DefaultSkins/Skins/granny.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@
"Model": "granny",
"HideHair": true,
"Name": "Granny",
"HairNormal" : 16777215,
"HairNoDash" : 7258367,
"HairTwoDash" : 16421375,
"HairRefillFlash" : 16777215,
"HairFeather" : 15914064
"HairNormal" : "FFFFFF",
"HairNoDash" : "6EC0FF",
"HairTwoDash" : "FA91FF",
"HairRefillFlash" : "FFFFFF",
"HairFeather" : "F2D450"
}
7 changes: 1 addition & 6 deletions Mods/DefaultSkins/Skins/player-short-hair.json
Original file line number Diff line number Diff line change
@@ -1,10 +1,5 @@
{
"Model": "player",
"HideHair": true,
"Name": "Short Hair",
"HairNormal" : 14363648,
"HairNoDash" : 7258367,
"HairTwoDash" : 16421375,
"HairRefillFlash" : 16777215,
"HairFeather" : 15914064
"Name": "Short Hair"
}
6 changes: 1 addition & 5 deletions Mods/DefaultSkins/Skins/theo.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,5 @@
"Model": "theo",
"HideHair": true,
"Name": "Theo",
"HairNormal" : 4530968,
"HairNoDash" : 7258367,
"HairTwoDash" : 16421375,
"HairRefillFlash" : 16777215,
"HairFeather" : 15914064
"HairNormal" : "452318"
}
50 changes: 45 additions & 5 deletions Source/Mod/Helpers/SkinInfo.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@

using System.Text.Json;
using System.Text.Json.Serialization;

namespace Celeste64;
Expand All @@ -12,11 +13,17 @@ public class SkinInfo
public virtual string Model { get; set; } = "";
public virtual bool HideHair { get; set; } = false;
public virtual string CollectableId { get; set; } = "";
public virtual int HairNormal { get; set; } = 0;
public virtual int HairNoDash { get; set; } = 0;
public virtual int HairTwoDash { get; set; } = 0;
public virtual int HairRefillFlash { get; set; } = 0;
public virtual int HairFeather { get; set; } = 0;

[JsonConverter(typeof(DecimalOrHexConverter))]
public virtual int HairNormal { get; set; } = 0xdb2c00;
[JsonConverter(typeof(DecimalOrHexConverter))]
public virtual int HairNoDash { get; set; } = 0x6ec0ff;
[JsonConverter(typeof(DecimalOrHexConverter))]
public virtual int HairTwoDash { get; set; } = 0xfa91ff;
[JsonConverter(typeof(DecimalOrHexConverter))]
public virtual int HairRefillFlash { get; set; } = 0xffffff;
[JsonConverter(typeof(DecimalOrHexConverter))]
public virtual int HairFeather { get; set; } = 0xf2d450;

public bool IsValid()
{
Expand All @@ -32,6 +39,39 @@ public virtual void OnEquipped(Player player, Model m) { }
public virtual void OnRemoved(Player player, Model m) { }
}

// This allows us to support either decimal integers or hex strings.
public class DecimalOrHexConverter : JsonConverter<int>
{
public override int Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
if (reader.TokenType == JsonTokenType.Number)
{
return reader.TryGetInt32(out var i) ? i : 0;
}
else if (reader.TokenType == JsonTokenType.String)
{
try
{
return Convert.ToInt32(reader.GetString(), 16);
}
catch (Exception ex)
{
Log.Error("Error: Could not parse value in skin file: " + ex.ToString());
return 0;
}
}
else
{
return 0;
}
}

public override void Write(Utf8JsonWriter writer, int value, JsonSerializerOptions options)
{
JsonSerializer.Serialize(writer, value, value.GetType());
}
}

[JsonSourceGenerationOptions(WriteIndented = true)]
[JsonSerializable(typeof(SkinInfo))]
internal partial class SkinInfoContext : JsonSerializerContext { }