add seperate color mode toggle for body colors
This commit is contained in:
parent
8643ea14af
commit
ef2dce6872
|
@ -1,16 +1,22 @@
|
||||||
AVALI_SKIN_TITLE= Avali Skin
|
AVALI_SKIN_TITLE= Avali Skin
|
||||||
|
|
||||||
modoptions_avaliskin_colormodeopt=Dash color mode
|
modoptions_avaliskin_dashcolormodeopt=Dash color mode
|
||||||
|
modoptions_avaliskin_bodycolormodeopt=Body color mode
|
||||||
|
|
||||||
modoptions_avaliskin_colormodeopt_ExternalDash=Use hair color
|
modoptions_avaliskin_colormodeopt_ExternalDash=Use hair color
|
||||||
modoptions_avaliskin_colormodeopt_ManualPreset=Select color preset
|
modoptions_avaliskin_dashcolormodeopt_ExternalDash_note=Uses hair color from vanilla
|
||||||
modoptions_avaliskin_colormodeopt_ManualPreset_note=Selects hair color from color presets
|
|
||||||
Make sure to disable other hair color mods.
|
|
||||||
modoptions_avaliskin_colormodeopt_ManualRGB=Select RGB color
|
|
||||||
modoptions_avaliskin_colormodeopt_ManualRGB_note=Selects hair color from RGB values.
|
|
||||||
Make sure to disable other hair color mods.
|
|
||||||
modoptions_avaliskin_colormodeopt_ExternalDash_note=Uses hair color from vanilla
|
|
||||||
or from other mods (e.g., Hyperline, Prideline)
|
or from other mods (e.g., Hyperline, Prideline)
|
||||||
|
|
||||||
|
modoptions_avaliskin_colormodeopt_ManualPreset=Select color preset
|
||||||
|
modoptions_avaliskin_dashcolormodeopt_ManualPreset_note=Selects hair color from color presets
|
||||||
|
Make sure to disable other hair color mods.
|
||||||
|
modoptions_avaliskin_bodycolormodeopt_ManualPreset_note=Selects body color from color presets
|
||||||
|
|
||||||
|
modoptions_avaliskin_colormodeopt_ManualRGB=Select RGB color
|
||||||
|
modoptions_avaliskin_dashcolormodeopt_ManualRGB_note=Selects hair color from RGB values.
|
||||||
|
Make sure to disable other hair color mods.
|
||||||
|
modoptions_avaliskin_bodycolormodeopt_ManualRGB_note=Selects body color from RGB values.
|
||||||
|
|
||||||
AVALI_SKIN_COLORS=Dash colors
|
AVALI_SKIN_COLORS=Dash colors
|
||||||
AVALI_SKIN_DASH0=Zero Dashes
|
AVALI_SKIN_DASH0=Zero Dashes
|
||||||
AVALI_SKIN_DASH1=One Dash
|
AVALI_SKIN_DASH1=One Dash
|
||||||
|
|
|
@ -14,6 +14,7 @@ using Celeste.Mod.CelesteNet.Client.Entities;
|
||||||
using Celeste.Mod.CelesteNet.DataTypes;
|
using Celeste.Mod.CelesteNet.DataTypes;
|
||||||
|
|
||||||
using ColorChoice = Celeste.Mod.AvaliSkin.AvaliSkinSettings.ColorChoice;
|
using ColorChoice = Celeste.Mod.AvaliSkin.AvaliSkinSettings.ColorChoice;
|
||||||
|
using DashColorMode = Celeste.Mod.AvaliSkin.AvaliSkinSettings.DashColorMode;
|
||||||
using ColorMode = Celeste.Mod.AvaliSkin.AvaliSkinSettings.ColorMode;
|
using ColorMode = Celeste.Mod.AvaliSkin.AvaliSkinSettings.ColorMode;
|
||||||
|
|
||||||
|
|
||||||
|
@ -28,19 +29,19 @@ namespace Celeste.Mod.AvaliSkin {
|
||||||
public static AvaliConfig PlayerConfig {
|
public static AvaliConfig PlayerConfig {
|
||||||
get => new AvaliConfig {
|
get => new AvaliConfig {
|
||||||
Enabled = Settings.Enabled,
|
Enabled = Settings.Enabled,
|
||||||
ColorMode = Settings.ColorModeOpt,
|
DashColorMode = Settings.DashColorModeOpt,
|
||||||
DashColors =
|
DashColors =
|
||||||
Settings.ColorModeOpt == ColorMode.ManualPreset
|
Settings.DashColorModeOpt == DashColorMode.ManualPreset
|
||||||
? Settings.DashPreset.Select(preset => ColorUtil.SettingToColor(preset)).ToList()
|
? Settings.DashPreset.Select(preset => ColorUtil.SettingToColor(preset)).ToList()
|
||||||
: Settings.DashRGBColor,
|
: Settings.DashRGBColor,
|
||||||
LightBody = Settings.ColorModeOpt == ColorMode.ManualPreset ? ColorUtil.SettingToColor(Settings.LightBodyPreset) : Settings.LightBodyRGBColor,
|
LightBody = Settings.BodyColorModeOpt == ColorMode.ManualPreset ? ColorUtil.SettingToColor(Settings.LightBodyPreset) : Settings.LightBodyRGBColor,
|
||||||
DarkBody = Settings.ColorModeOpt == ColorMode.ManualPreset ? ColorUtil.SettingToColor(Settings.DarkBodyPreset) : Settings.DarkBodyRGBColor,
|
DarkBody = Settings.BodyColorModeOpt == ColorMode.ManualPreset ? ColorUtil.SettingToColor(Settings.DarkBodyPreset) : Settings.DarkBodyRGBColor,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
public static AvaliConfig EveryoneHasSkinConfig {
|
public static AvaliConfig EveryoneHasSkinConfig {
|
||||||
get => new AvaliConfig {
|
get => new AvaliConfig {
|
||||||
Enabled = true,
|
Enabled = true,
|
||||||
ColorMode = ColorMode.ExternalDash,
|
DashColorMode = DashColorMode.ExternalDash,
|
||||||
LightBody = PlayerConfig.LightBody,
|
LightBody = PlayerConfig.LightBody,
|
||||||
DarkBody = PlayerConfig.DarkBody,
|
DarkBody = PlayerConfig.DarkBody,
|
||||||
};
|
};
|
||||||
|
@ -445,7 +446,7 @@ namespace Celeste.Mod.AvaliSkin {
|
||||||
// The hair mod should do be doing that instead of us.
|
// The hair mod should do be doing that instead of us.
|
||||||
// Furthermore: naively doing this will look strange because the white
|
// Furthermore: naively doing this will look strange because the white
|
||||||
// hair flash right after dashing will be copied to the trail.
|
// hair flash right after dashing will be copied to the trail.
|
||||||
if (PlayerConfig.ColorMode != ColorMode.ExternalDash) {
|
if (PlayerConfig.DashColorMode != DashColorMode.ExternalDash) {
|
||||||
// replace trail colors with marking colors
|
// replace trail colors with marking colors
|
||||||
return PlayerConfig.GetColor(self);
|
return PlayerConfig.GetColor(self);
|
||||||
}
|
}
|
||||||
|
@ -460,7 +461,7 @@ namespace Celeste.Mod.AvaliSkin {
|
||||||
orig(self, applyGravity);
|
orig(self, applyGravity);
|
||||||
|
|
||||||
// Don't change the hair color if another mod is in control of it!
|
// Don't change the hair color if another mod is in control of it!
|
||||||
if (PlayerConfig.IsEnabled(self) && PlayerConfig.ColorMode != ColorMode.ExternalDash) {
|
if (PlayerConfig.IsEnabled(self) && PlayerConfig.DashColorMode != DashColorMode.ExternalDash) {
|
||||||
// change player hair color to match dash colors.
|
// change player hair color to match dash colors.
|
||||||
// (hair is invisible, but that influences other things like the orbs when the Avali dies and respawns)
|
// (hair is invisible, but that influences other things like the orbs when the Avali dies and respawns)
|
||||||
self.Hair.Color = PlayerConfig.GetColor(self);
|
self.Hair.Color = PlayerConfig.GetColor(self);
|
||||||
|
@ -474,7 +475,7 @@ namespace Celeste.Mod.AvaliSkin {
|
||||||
// We can't exfiltrate a dash color in this mode because we can't extract that
|
// We can't exfiltrate a dash color in this mode because we can't extract that
|
||||||
// without integrating with the dash color mod, and besides, whatever mod that
|
// without integrating with the dash color mod, and besides, whatever mod that
|
||||||
// changed the dash color should have also changed these particles regardless.
|
// changed the dash color should have also changed these particles regardless.
|
||||||
&& PlayerConfig.ColorMode != ColorMode.ExternalDash
|
&& PlayerConfig.DashColorMode != DashColorMode.ExternalDash
|
||||||
)) {
|
)) {
|
||||||
// disabled, just run vanilla code
|
// disabled, just run vanilla code
|
||||||
return orig(self);
|
return orig(self);
|
||||||
|
|
|
@ -17,40 +17,52 @@ namespace Celeste.Mod.AvaliSkin {
|
||||||
if (loadedCelestenet) { updateSkinCelestenet(); }
|
if (loadedCelestenet) { updateSkinCelestenet(); }
|
||||||
|
|
||||||
// menu is not loaded; don't bother
|
// menu is not loaded; don't bother
|
||||||
if (ColorModeOptItem == null) { return; }
|
if (DashColorModeOptItem == null) { return; }
|
||||||
|
|
||||||
// disable all the normal options if the main toggle is disabled
|
// disable all the normal options if the main toggle is disabled
|
||||||
ColorModeOptItem.Disabled = !Enabled;
|
DashColorModeOptItem.Disabled = !Enabled;
|
||||||
ColorSubmenuItem.Disabled = !Enabled;
|
DashColorSubmenuItem.Disabled = !Enabled;
|
||||||
|
BodyColorModeOptItem.Disabled = !Enabled;
|
||||||
|
BodyColorSubmenuItem.Disabled = !Enabled;
|
||||||
|
|
||||||
// change up the colormode note based on the selection
|
// change up the colormode note based on the selection
|
||||||
string colorModeNote = "";
|
string colorModeNote = "";
|
||||||
switch (ColorModeOpt) {
|
switch (DashColorModeOpt) {
|
||||||
case ColorMode.ExternalDash: colorModeNote = "modoptions_avaliskin_colormodeopt_ExternalDash_note"; break;
|
case DashColorMode.ExternalDash: colorModeNote = "modoptions_avaliskin_dashcolormodeopt_ExternalDash_note"; break;
|
||||||
case ColorMode.ManualPreset: colorModeNote = "modoptions_avaliskin_colormodeopt_ManualPreset_note"; break;
|
case DashColorMode.ManualPreset: colorModeNote = "modoptions_avaliskin_dashcolormodeopt_ManualPreset_note"; break;
|
||||||
case ColorMode.ManualRGB: colorModeNote = "modoptions_avaliskin_colormodeopt_ManualRGB_note"; break;
|
case DashColorMode.ManualRGB: colorModeNote = "modoptions_avaliskin_dashcolormodeopt_ManualRGB_note"; break;
|
||||||
}
|
}
|
||||||
ColorModeOptNote.Title = colorModeNote.DialogOrKey();
|
DashColorModeOptNote.Title = colorModeNote.DialogOrKey();
|
||||||
|
|
||||||
|
switch (BodyColorModeOpt) {
|
||||||
|
case ColorMode.ManualPreset: colorModeNote = "modoptions_avaliskin_bodycolormodeopt_ManualPreset_note"; break;
|
||||||
|
case ColorMode.ManualRGB: colorModeNote = "modoptions_avaliskin_bodycolormodeopt_ManualRGB_note"; break;
|
||||||
|
}
|
||||||
|
BodyColorModeOptNote.Title = colorModeNote.DialogOrKey();
|
||||||
|
|
||||||
// no point in showing the submenu at all for externaldash; there's
|
// no point in showing the submenu at all for externaldash; there's
|
||||||
// nothing to configure!
|
// nothing to configure!
|
||||||
ColorSubmenuItem.Visible = ColorModeOpt != ColorMode.ExternalDash;
|
DashColorSubmenuItem.Visible = DashColorModeOpt != DashColorMode.ExternalDash;
|
||||||
|
|
||||||
// disable and change item visibility based on main toggle or colormode
|
// disable and change item visibility based on main toggle or colormode
|
||||||
foreach (var item in RGBItems) {
|
foreach (var item in RGBDashColorItems) {
|
||||||
item.Disabled = !Enabled;
|
item.Disabled = !Enabled;
|
||||||
item.Visible = ColorModeOpt == ColorMode.ManualRGB
|
item.Visible = DashColorModeOpt == DashColorMode.ManualRGB;
|
||||||
|| ColorModeOpt == ColorMode.ExternalDash;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (var item in PresetItems) {
|
foreach (var item in PresetDashColorItems) {
|
||||||
item.Disabled = !Enabled;
|
item.Disabled = !Enabled;
|
||||||
item.Visible = ColorModeOpt == ColorMode.ManualPreset
|
item.Visible = DashColorModeOpt == DashColorMode.ManualPreset;
|
||||||
|| ColorModeOpt == ColorMode.ExternalDash;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (var item in DashColorItems) {
|
foreach (var item in RGBBodyColorItems) {
|
||||||
item.Visible = ColorModeOpt != ColorMode.ExternalDash;
|
item.Disabled = !Enabled;
|
||||||
|
item.Visible = BodyColorModeOpt == ColorMode.ManualRGB;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var item in PresetBodyColorItems) {
|
||||||
|
item.Disabled = !Enabled;
|
||||||
|
item.Visible = BodyColorModeOpt == ColorMode.ManualPreset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -99,18 +111,110 @@ namespace Celeste.Mod.AvaliSkin {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public enum ColorMode {
|
public enum DashColorMode {
|
||||||
ExternalDash,
|
ExternalDash,
|
||||||
ManualPreset,
|
ManualPreset,
|
||||||
ManualRGB
|
ManualRGB
|
||||||
}
|
}
|
||||||
|
|
||||||
public ColorMode ColorModeOpt { get; set; } = ColorMode.ExternalDash;
|
public DashColorMode DashColorModeOpt { get; set; } = DashColorMode.ExternalDash;
|
||||||
private TextMenu.Item ColorModeOptItem;
|
private TextMenu.Item DashColorModeOptItem;
|
||||||
private TextMenu.SubHeader ColorModeOptNote;
|
private TextMenu.SubHeader DashColorModeOptNote;
|
||||||
public void CreateColorModeOptEntry(TextMenu menu, bool inGame) {
|
public void CreateDashColorModeOptEntry(TextMenu menu, bool inGame) {
|
||||||
ColorModeOptItem = new TextMenuExt.EnumerableSlider<ColorMode>(
|
DashColorModeOptItem = new TextMenuExt.EnumerableSlider<DashColorMode>(
|
||||||
"modoptions_avaliskin_colormodeopt".DialogOrKey(),
|
"modoptions_avaliskin_dashcolormodeopt".DialogOrKey(),
|
||||||
|
// Enum.GetValues returns an Array, which is not enumerable.
|
||||||
|
// However, normal object vectors are. So...
|
||||||
|
((DashColorMode[]) Enum.GetValues(typeof(DashColorMode))).Select(
|
||||||
|
variant => new KeyValuePair<DashColorMode, string>(
|
||||||
|
variant,
|
||||||
|
$"modoptions_avaliskin_colormodeopt_{variant.ToString()}".DialogOrKey()
|
||||||
|
)
|
||||||
|
),
|
||||||
|
DashColorModeOpt
|
||||||
|
).Change(opt => {
|
||||||
|
DashColorModeOpt = opt;
|
||||||
|
updateOptions();
|
||||||
|
});
|
||||||
|
menu.Add(DashColorModeOptItem);
|
||||||
|
DashColorModeOptItem.AddDescription(menu, "modoptions_avaliskin_dashcolormodeopt_note".DialogOrKey());
|
||||||
|
|
||||||
|
List<TextMenu.Item> items = menu.GetItems();
|
||||||
|
DashColorModeOptNote = (TextMenu.SubHeader) items[items.IndexOf(DashColorModeOptItem) + 1];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// DashColorSubmenu is a dummy setting that is only used to position the
|
||||||
|
// Submenu. This setting is never used, hence why it is Void!
|
||||||
|
[YamlIgnore]
|
||||||
|
public Void DashColorSubmenu { get; set; }
|
||||||
|
private TextMenuExt.OptionSubMenu DashColorSubmenuItem;
|
||||||
|
public void CreateDashColorSubmenuEntry(TextMenu menu, bool inGame) {
|
||||||
|
RGBDashColorItems.Clear();
|
||||||
|
PresetDashColorItems.Clear();
|
||||||
|
|
||||||
|
DashColorSubmenuItem = new TextMenuExt.OptionSubMenu(
|
||||||
|
"AVALI_SKIN_COLORS".DialogOrKey()
|
||||||
|
);
|
||||||
|
|
||||||
|
// This generates n submenus, one for each dash
|
||||||
|
for (int i = 0; i < DashRGBColor.Count; i++) {
|
||||||
|
TextMenuExt.IntSlider RItem, GItem, BItem;
|
||||||
|
TextMenu.Option<ColorChoice> ColorItem;
|
||||||
|
|
||||||
|
int j = i; // C# lambda are wierd: capturing i directly mutates the captured variable
|
||||||
|
|
||||||
|
DashColorSubmenuItem.Add(
|
||||||
|
$"AVALI_SKIN_DASH{i}".DialogOrKey(),
|
||||||
|
new List<TextMenu.Item> {
|
||||||
|
(RItem = new TextMenuExt.IntSlider(
|
||||||
|
"AVALI_SKIN_RED".DialogOrKey(),
|
||||||
|
0, 255, DashRGBColor[j].R
|
||||||
|
).Change(
|
||||||
|
// C# is stupidly pendatic and doesn't support property assignment in List elements
|
||||||
|
// so we have to do this ugly shit to avoid breaking up this expression into two
|
||||||
|
c => DashRGBColor[j] = new Color((byte) c, DashRGBColor[j].G, DashRGBColor[j].B)
|
||||||
|
)),
|
||||||
|
(GItem = new TextMenuExt.IntSlider(
|
||||||
|
"AVALI_SKIN_GREEN".DialogOrKey(),
|
||||||
|
0, 255, DashRGBColor[j].G
|
||||||
|
).Change(
|
||||||
|
c => DashRGBColor[j] = new Color(DashRGBColor[j].R, (byte) c, DashRGBColor[j].B)
|
||||||
|
)),
|
||||||
|
(BItem = new TextMenuExt.IntSlider(
|
||||||
|
"AVALI_SKIN_BLUE".DialogOrKey(),
|
||||||
|
0, 255, DashRGBColor[j].B
|
||||||
|
).Change(
|
||||||
|
c => DashRGBColor[j] = new Color(DashRGBColor[j].R, DashRGBColor[j].G, (byte) c)
|
||||||
|
)),
|
||||||
|
(ColorItem = new TextMenuExt.EnumSlider<ColorChoice>(
|
||||||
|
"AVALI_SKIN_COLOR".DialogOrKey(),
|
||||||
|
DashPreset[j]
|
||||||
|
).Change(c => DashPreset[j] = c)),
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
RGBDashColorItems.Add(RItem);
|
||||||
|
RGBDashColorItems.Add(GItem);
|
||||||
|
RGBDashColorItems.Add(BItem);
|
||||||
|
PresetDashColorItems.Add(ColorItem);
|
||||||
|
}
|
||||||
|
|
||||||
|
menu.Add(DashColorSubmenuItem);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public enum ColorMode {
|
||||||
|
ManualPreset,
|
||||||
|
ManualRGB
|
||||||
|
}
|
||||||
|
|
||||||
|
public ColorMode BodyColorModeOpt { get; set; } = ColorMode.ManualPreset;
|
||||||
|
private TextMenu.Item BodyColorModeOptItem;
|
||||||
|
private TextMenu.SubHeader BodyColorModeOptNote;
|
||||||
|
public void CreateBodyColorModeOptEntry(TextMenu menu, bool inGame) {
|
||||||
|
BodyColorModeOptItem = new TextMenuExt.EnumerableSlider<ColorMode>(
|
||||||
|
"modoptions_avaliskin_bodycolormodeopt".DialogOrKey(),
|
||||||
// Enum.GetValues returns an Array, which is not enumerable.
|
// Enum.GetValues returns an Array, which is not enumerable.
|
||||||
// However, normal object vectors are. So...
|
// However, normal object vectors are. So...
|
||||||
((ColorMode[]) Enum.GetValues(typeof(ColorMode))).Select(
|
((ColorMode[]) Enum.GetValues(typeof(ColorMode))).Select(
|
||||||
|
@ -119,149 +223,96 @@ namespace Celeste.Mod.AvaliSkin {
|
||||||
$"modoptions_avaliskin_colormodeopt_{variant.ToString()}".DialogOrKey()
|
$"modoptions_avaliskin_colormodeopt_{variant.ToString()}".DialogOrKey()
|
||||||
)
|
)
|
||||||
),
|
),
|
||||||
ColorModeOpt
|
BodyColorModeOpt
|
||||||
).Change(opt => {
|
).Change(opt => {
|
||||||
ColorModeOpt = opt;
|
BodyColorModeOpt = opt;
|
||||||
updateOptions();
|
updateOptions();
|
||||||
});
|
});
|
||||||
menu.Add(ColorModeOptItem);
|
menu.Add(BodyColorModeOptItem);
|
||||||
ColorModeOptItem.AddDescription(menu, "modoptions_avaliskin_colormodeopt_note".DialogOrKey());
|
BodyColorModeOptItem.AddDescription(menu, "modoptions_avaliskin_bodycolormodeopt_note".DialogOrKey());
|
||||||
|
|
||||||
List<TextMenu.Item> items = menu.GetItems();
|
List<TextMenu.Item> items = menu.GetItems();
|
||||||
ColorModeOptNote = (TextMenu.SubHeader) items[items.IndexOf(ColorModeOptItem) + 1];
|
BodyColorModeOptNote = (TextMenu.SubHeader) items[items.IndexOf(BodyColorModeOptItem) + 1];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// ColorSubmenu is a dummy setting that is only used to position the
|
|
||||||
// Submenu. This setting is never used, hence why it is Void!
|
|
||||||
[YamlIgnore]
|
[YamlIgnore]
|
||||||
public Void ColorSubmenu { get; set; }
|
public Void BodyColorSubmenu { get; set; }
|
||||||
private TextMenuExt.OptionSubMenu ColorSubmenuItem, BodyColorSubmenuItem;
|
private TextMenuExt.OptionSubMenu BodyColorSubmenuItem;
|
||||||
public void CreateColorSubmenuEntry(TextMenu menu, bool inGame) {
|
public void CreateBodyColorSubmenuEntry(TextMenu menu, bool inGame) {
|
||||||
RGBItems.Clear();
|
RGBBodyColorItems.Clear();
|
||||||
PresetItems.Clear();
|
PresetBodyColorItems.Clear();
|
||||||
DashColorItems.Clear();
|
|
||||||
|
|
||||||
ColorSubmenuItem = new TextMenuExt.OptionSubMenu(
|
|
||||||
"AVALI_SKIN_COLORS".DialogOrKey()
|
|
||||||
);
|
|
||||||
|
|
||||||
// This generates n submenus, one for each dash
|
|
||||||
TextMenuExt.IntSlider DashRItem, DashGItem, DashBItem;
|
|
||||||
TextMenu.Option<ColorChoice> DashColorItem;
|
|
||||||
for (int i = 0; i < DashRGBColor.Count; i++) {
|
|
||||||
|
|
||||||
int j = i; // C# lambda are wierd: capturing i directly mutates the captured variable
|
|
||||||
|
|
||||||
ColorSubmenuItem.Add(
|
|
||||||
$"AVALI_SKIN_DASH{i}".DialogOrKey(),
|
|
||||||
new List<TextMenu.Item> {
|
|
||||||
(DashRItem = new TextMenuExt.IntSlider(
|
|
||||||
"AVALI_SKIN_RED".DialogOrKey(),
|
|
||||||
0, 255, DashRGBColor[j].R
|
|
||||||
).Change(
|
|
||||||
// C# is stupidly pendatic and doesn't support property assignment in List elements
|
|
||||||
// so we have to do this ugly shit to avoid breaking up this expression into two
|
|
||||||
c => DashRGBColor[j] = new Color((byte) c, DashRGBColor[j].G, DashRGBColor[j].B)
|
|
||||||
)),
|
|
||||||
(DashGItem = new TextMenuExt.IntSlider(
|
|
||||||
"AVALI_SKIN_GREEN".DialogOrKey(),
|
|
||||||
0, 255, DashRGBColor[j].G
|
|
||||||
).Change(
|
|
||||||
c => DashRGBColor[j] = new Color(DashRGBColor[j].R, (byte) c, DashRGBColor[j].B)
|
|
||||||
)),
|
|
||||||
(DashBItem = new TextMenuExt.IntSlider(
|
|
||||||
"AVALI_SKIN_BLUE".DialogOrKey(),
|
|
||||||
0, 255, DashRGBColor[j].B
|
|
||||||
).Change(
|
|
||||||
c => DashRGBColor[j] = new Color(DashRGBColor[j].R, DashRGBColor[j].G, (byte) c)
|
|
||||||
)),
|
|
||||||
(DashColorItem = new TextMenuExt.EnumSlider<ColorChoice>(
|
|
||||||
"AVALI_SKIN_COLOR".DialogOrKey(),
|
|
||||||
DashPreset[j]
|
|
||||||
).Change(c => DashPreset[j] = c)),
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
RGBItems.Add(DashRItem);
|
|
||||||
RGBItems.Add(DashGItem);
|
|
||||||
RGBItems.Add(DashBItem);
|
|
||||||
PresetItems.Add(DashColorItem);
|
|
||||||
}
|
|
||||||
|
|
||||||
DashColorItems.AddRange(RGBItems);
|
|
||||||
DashColorItems.AddRange(PresetItems);
|
|
||||||
|
|
||||||
menu.Add(ColorSubmenuItem);
|
|
||||||
|
|
||||||
|
|
||||||
BodyColorSubmenuItem = new TextMenuExt.OptionSubMenu(
|
BodyColorSubmenuItem = new TextMenuExt.OptionSubMenu(
|
||||||
"AVALI_SKIN_BODY".DialogOrKey()
|
"AVALI_SKIN_BODY".DialogOrKey()
|
||||||
);
|
);
|
||||||
|
|
||||||
|
TextMenuExt.IntSlider RItem, GItem, BItem;
|
||||||
|
TextMenu.Option<ColorChoice> ColorItem;
|
||||||
BodyColorSubmenuItem.Add(
|
BodyColorSubmenuItem.Add(
|
||||||
"AVALI_SKIN_LIGHTBODY".DialogOrKey(),
|
"AVALI_SKIN_LIGHTBODY".DialogOrKey(),
|
||||||
new List<TextMenu.Item> {
|
new List<TextMenu.Item> {
|
||||||
(DashRItem = new TextMenuExt.IntSlider(
|
(RItem = new TextMenuExt.IntSlider(
|
||||||
"AVALI_SKIN_RED".DialogOrKey(),
|
"AVALI_SKIN_RED".DialogOrKey(),
|
||||||
0, 255, LightBodyRGBColor.R
|
0, 255, LightBodyRGBColor.R
|
||||||
).Change(
|
).Change(
|
||||||
c => LightBodyRGBColor = new Color((byte) c, LightBodyRGBColor.G, LightBodyRGBColor.B)
|
c => LightBodyRGBColor = new Color((byte) c, LightBodyRGBColor.G, LightBodyRGBColor.B)
|
||||||
)),
|
)),
|
||||||
(DashGItem = new TextMenuExt.IntSlider(
|
(GItem = new TextMenuExt.IntSlider(
|
||||||
"AVALI_SKIN_GREEN".DialogOrKey(),
|
"AVALI_SKIN_GREEN".DialogOrKey(),
|
||||||
0, 255, LightBodyRGBColor.G
|
0, 255, LightBodyRGBColor.G
|
||||||
).Change(
|
).Change(
|
||||||
c => LightBodyRGBColor = new Color(LightBodyRGBColor.R, (byte) c, LightBodyRGBColor.B)
|
c => LightBodyRGBColor = new Color(LightBodyRGBColor.R, (byte) c, LightBodyRGBColor.B)
|
||||||
)),
|
)),
|
||||||
(DashBItem = new TextMenuExt.IntSlider(
|
(BItem = new TextMenuExt.IntSlider(
|
||||||
"AVALI_SKIN_BLUE".DialogOrKey(),
|
"AVALI_SKIN_BLUE".DialogOrKey(),
|
||||||
0, 255, LightBodyRGBColor.B
|
0, 255, LightBodyRGBColor.B
|
||||||
).Change(
|
).Change(
|
||||||
c => LightBodyRGBColor = new Color(LightBodyRGBColor.R, LightBodyRGBColor.G, (byte) c)
|
c => LightBodyRGBColor = new Color(LightBodyRGBColor.R, LightBodyRGBColor.G, (byte) c)
|
||||||
)),
|
)),
|
||||||
(DashColorItem = new TextMenuExt.EnumSlider<ColorChoice>(
|
(ColorItem = new TextMenuExt.EnumSlider<ColorChoice>(
|
||||||
"AVALI_SKIN_COLOR".DialogOrKey(),
|
"AVALI_SKIN_COLOR".DialogOrKey(),
|
||||||
LightBodyPreset
|
LightBodyPreset
|
||||||
).Change(c => LightBodyPreset = c)),
|
).Change(c => LightBodyPreset = c)),
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
RGBItems.Add(DashRItem);
|
RGBBodyColorItems.Add(RItem);
|
||||||
RGBItems.Add(DashGItem);
|
RGBBodyColorItems.Add(GItem);
|
||||||
RGBItems.Add(DashBItem);
|
RGBBodyColorItems.Add(BItem);
|
||||||
PresetItems.Add(DashColorItem);
|
PresetBodyColorItems.Add(ColorItem);
|
||||||
|
|
||||||
BodyColorSubmenuItem.Add(
|
BodyColorSubmenuItem.Add(
|
||||||
"AVALI_SKIN_DARKBODY".DialogOrKey(),
|
"AVALI_SKIN_DARKBODY".DialogOrKey(),
|
||||||
new List<TextMenu.Item> {
|
new List<TextMenu.Item> {
|
||||||
(DashRItem = new TextMenuExt.IntSlider(
|
(RItem = new TextMenuExt.IntSlider(
|
||||||
"AVALI_SKIN_RED".DialogOrKey(),
|
"AVALI_SKIN_RED".DialogOrKey(),
|
||||||
0, 255, DarkBodyRGBColor.R
|
0, 255, DarkBodyRGBColor.R
|
||||||
).Change(
|
).Change(
|
||||||
c => DarkBodyRGBColor = new Color((byte) c, DarkBodyRGBColor.G, DarkBodyRGBColor.B)
|
c => DarkBodyRGBColor = new Color((byte) c, DarkBodyRGBColor.G, DarkBodyRGBColor.B)
|
||||||
)),
|
)),
|
||||||
(DashGItem = new TextMenuExt.IntSlider(
|
(GItem = new TextMenuExt.IntSlider(
|
||||||
"AVALI_SKIN_GREEN".DialogOrKey(),
|
"AVALI_SKIN_GREEN".DialogOrKey(),
|
||||||
0, 255, DarkBodyRGBColor.G
|
0, 255, DarkBodyRGBColor.G
|
||||||
).Change(
|
).Change(
|
||||||
c => DarkBodyRGBColor = new Color(DarkBodyRGBColor.R, (byte) c, DarkBodyRGBColor.B)
|
c => DarkBodyRGBColor = new Color(DarkBodyRGBColor.R, (byte) c, DarkBodyRGBColor.B)
|
||||||
)),
|
)),
|
||||||
(DashBItem = new TextMenuExt.IntSlider(
|
(BItem = new TextMenuExt.IntSlider(
|
||||||
"AVALI_SKIN_BLUE".DialogOrKey(),
|
"AVALI_SKIN_BLUE".DialogOrKey(),
|
||||||
0, 255, DarkBodyRGBColor.B
|
0, 255, DarkBodyRGBColor.B
|
||||||
).Change(
|
).Change(
|
||||||
c => DarkBodyRGBColor = new Color(DarkBodyRGBColor.R, DarkBodyRGBColor.G, (byte) c)
|
c => DarkBodyRGBColor = new Color(DarkBodyRGBColor.R, DarkBodyRGBColor.G, (byte) c)
|
||||||
)),
|
)),
|
||||||
(DashColorItem = new TextMenuExt.EnumSlider<ColorChoice>(
|
(ColorItem = new TextMenuExt.EnumSlider<ColorChoice>(
|
||||||
"AVALI_SKIN_COLOR".DialogOrKey(),
|
"AVALI_SKIN_COLOR".DialogOrKey(),
|
||||||
DarkBodyPreset
|
DarkBodyPreset
|
||||||
).Change(c => DarkBodyPreset = c)),
|
).Change(c => DarkBodyPreset = c)),
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
RGBItems.Add(DashRItem);
|
RGBBodyColorItems.Add(RItem);
|
||||||
RGBItems.Add(DashGItem);
|
RGBBodyColorItems.Add(GItem);
|
||||||
RGBItems.Add(DashBItem);
|
RGBBodyColorItems.Add(BItem);
|
||||||
PresetItems.Add(DashColorItem);
|
PresetBodyColorItems.Add(ColorItem);
|
||||||
|
|
||||||
menu.Add(BodyColorSubmenuItem);
|
menu.Add(BodyColorSubmenuItem);
|
||||||
}
|
}
|
||||||
|
@ -326,12 +377,15 @@ namespace Celeste.Mod.AvaliSkin {
|
||||||
[SettingIgnore]
|
[SettingIgnore]
|
||||||
public ColorChoice DarkBodyPreset { get; set; } = ColorChoice.GreyDark;
|
public ColorChoice DarkBodyPreset { get; set; } = ColorChoice.GreyDark;
|
||||||
|
|
||||||
// Stores submenu items that are enabled/disabled when colormode is RGB
|
// Stores submenu dash items that are enabled/disabled when dashcolormode is RGB
|
||||||
private List<TextMenuExt.IntSlider> RGBItems = new List<TextMenuExt.IntSlider>();
|
private List<TextMenuExt.IntSlider> RGBDashColorItems = new List<TextMenuExt.IntSlider>();
|
||||||
// Stores submenu items that are enabled/disabled when colormode is preset
|
// Stores submenu dash items that are enabled/disabled when dashcolormode is preset
|
||||||
private List<TextMenu.Option<ColorChoice>> PresetItems = new List<TextMenu.Option<ColorChoice>>();
|
private List<TextMenu.Option<ColorChoice>> PresetDashColorItems = new List<TextMenu.Option<ColorChoice>>();
|
||||||
// Stores submenu items that are hidden when colormode is external
|
|
||||||
private List<TextMenu.Item> DashColorItems = new List<TextMenu.Item>();
|
// Stores submenu body items that are enabled/disabled when bodycolormode is RGB
|
||||||
|
private List<TextMenuExt.IntSlider> RGBBodyColorItems = new List<TextMenuExt.IntSlider>();
|
||||||
|
// Stores submenu body items that are enabled/disabled when bodycolormode is preset
|
||||||
|
private List<TextMenu.Option<ColorChoice>> PresetBodyColorItems = new List<TextMenu.Option<ColorChoice>>();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -5,8 +5,7 @@ using Celeste.Mod.CelesteNet.Client;
|
||||||
using Celeste.Mod.CelesteNet.Client.Entities;
|
using Celeste.Mod.CelesteNet.Client.Entities;
|
||||||
using Celeste.Mod.CelesteNet.DataTypes;
|
using Celeste.Mod.CelesteNet.DataTypes;
|
||||||
|
|
||||||
using ColorChoice = Celeste.Mod.AvaliSkin.AvaliSkinSettings.ColorChoice;
|
using DashColorMode = Celeste.Mod.AvaliSkin.AvaliSkinSettings.DashColorMode;
|
||||||
using ColorMode = Celeste.Mod.AvaliSkin.AvaliSkinSettings.ColorMode;
|
|
||||||
using SendReceive = Celeste.Mod.AvaliSkin.AvaliSkinSettings.SendReceive;
|
using SendReceive = Celeste.Mod.AvaliSkin.AvaliSkinSettings.SendReceive;
|
||||||
|
|
||||||
|
|
||||||
|
@ -65,7 +64,7 @@ namespace Celeste.Mod.AvaliSkin {
|
||||||
protected override void Read(CelesteNetBinaryReader reader) {
|
protected override void Read(CelesteNetBinaryReader reader) {
|
||||||
Config = new AvaliConfig {
|
Config = new AvaliConfig {
|
||||||
Enabled = reader.ReadBoolean(),
|
Enabled = reader.ReadBoolean(),
|
||||||
ColorMode = ColorMode.ExternalDash,
|
DashColorMode = DashColorMode.ExternalDash,
|
||||||
LightBody = reader.ReadColorNoA(),
|
LightBody = reader.ReadColorNoA(),
|
||||||
DarkBody = reader.ReadColorNoA(),
|
DarkBody = reader.ReadColorNoA(),
|
||||||
};
|
};
|
||||||
|
|
|
@ -7,7 +7,7 @@ using Celeste.Mod.CelesteNet.Client.Entities;
|
||||||
using Celeste.Mod.CelesteNet.DataTypes;
|
using Celeste.Mod.CelesteNet.DataTypes;
|
||||||
|
|
||||||
using ColorChoice = Celeste.Mod.AvaliSkin.AvaliSkinSettings.ColorChoice;
|
using ColorChoice = Celeste.Mod.AvaliSkin.AvaliSkinSettings.ColorChoice;
|
||||||
using ColorMode = Celeste.Mod.AvaliSkin.AvaliSkinSettings.ColorMode;
|
using DashColorMode = Celeste.Mod.AvaliSkin.AvaliSkinSettings.DashColorMode;
|
||||||
using SendReceive = Celeste.Mod.AvaliSkin.AvaliSkinSettings.SendReceive;
|
using SendReceive = Celeste.Mod.AvaliSkin.AvaliSkinSettings.SendReceive;
|
||||||
|
|
||||||
|
|
||||||
|
@ -16,7 +16,7 @@ namespace Celeste.Mod.AvaliSkin {
|
||||||
private static AvaliSkinSettings Settings => AvaliSkinModule.Settings;
|
private static AvaliSkinSettings Settings => AvaliSkinModule.Settings;
|
||||||
|
|
||||||
public bool Enabled;
|
public bool Enabled;
|
||||||
public ColorMode ColorMode;
|
public DashColorMode DashColorMode;
|
||||||
public List<Color> DashColors = new List<Color>();
|
public List<Color> DashColors = new List<Color>();
|
||||||
public Color LightBody;
|
public Color LightBody;
|
||||||
public Color DarkBody;
|
public Color DarkBody;
|
||||||
|
@ -41,8 +41,8 @@ namespace Celeste.Mod.AvaliSkin {
|
||||||
// before calling this
|
// before calling this
|
||||||
public Color GetColor(Player player) {
|
public Color GetColor(Player player) {
|
||||||
int dashes = player.Dashes;
|
int dashes = player.Dashes;
|
||||||
switch (this.ColorMode) {
|
switch (this.DashColorMode) {
|
||||||
case ColorMode.ExternalDash:
|
case DashColorMode.ExternalDash:
|
||||||
// Infrequently, it's possible for the player to momentarily have no hair.
|
// Infrequently, it's possible for the player to momentarily have no hair.
|
||||||
if (player.Hair != null && player.Sprite.HairCount > 0) {
|
if (player.Hair != null && player.Sprite.HairCount > 0) {
|
||||||
return player.Hair.GetHairColor(0);
|
return player.Hair.GetHairColor(0);
|
||||||
|
@ -54,7 +54,7 @@ namespace Celeste.Mod.AvaliSkin {
|
||||||
return this.DashColors[Math.Min(dashes, this.DashColors.Count - 1)];
|
return this.DashColors[Math.Min(dashes, this.DashColors.Count - 1)];
|
||||||
}
|
}
|
||||||
|
|
||||||
case ColorMode.ManualRGB: default:
|
case DashColorMode.ManualRGB: default:
|
||||||
return this.DashColors[Math.Min(dashes, this.DashColors.Count - 1)];
|
return this.DashColors[Math.Min(dashes, this.DashColors.Count - 1)];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue