From 886cdee0c6097863ea492fe38149bef63d6c16ea Mon Sep 17 00:00:00 2001 From: GlitchyPSI Date: Tue, 20 Dec 2022 11:49:24 -0400 Subject: [PATCH] [demon] Initial version of Lightset + Level Lighting --- M64MM.Utils/Appearance/ColorPart.cs | 81 +++- M64MM.Utils/Appearance/ColorStandardNaming.cs | 6 +- M64MM.Utils/Appearance/DefaultLightsets.cs | 391 ++++++++++++++++++ M64MM.Utils/Appearance/Lightset.cs | 19 +- M64MM.Utils/Appearance/Looks.cs | 227 ---------- M64MM.Utils/Core.cs | 19 +- M64MM.Utils/M64MM.Utils.csproj | 1 + M64MM2/AppearanceForm.Designer.cs | 5 +- M64MM2/AppearanceForm.cs | 252 +++++++---- M64MM2/AppearanceForm.resx | 3 + M64MM2/Properties/Resources.Designer.cs | 9 + M64MM2/Properties/Resources.resx | 3 + 12 files changed, 670 insertions(+), 346 deletions(-) create mode 100644 M64MM.Utils/Appearance/DefaultLightsets.cs diff --git a/M64MM.Utils/Appearance/ColorPart.cs b/M64MM.Utils/Appearance/ColorPart.cs index a8e24b3..2aeed30 100644 --- a/M64MM.Utils/Appearance/ColorPart.cs +++ b/M64MM.Utils/Appearance/ColorPart.cs @@ -19,34 +19,85 @@ public class ColorPart public Color DefaultLightColor { get; set; } public Color DefaultDarkColor { get; set; } - public void CommitColorsToRam() { - CommitColorsToRam(SegmentedToVirtual(0x04000000)); + public bool IsAddressSegmented { get; set; } = false; + + public void CommitColorsToRam() + { + + CommitColorsToRam((IsAddressSegmented ? 0 : SegmentedToVirtual(0x04000000))); + } + + public void PullColorsFromRam() + { + + PullColorsFromRam((IsAddressSegmented ? 0 : SegmentedToVirtual(0x04000000))); } - public void CommitColorsToRam(long baseOffset) { - byte[] colors_L = {LightColor.R, LightColor.G, LightColor.B, 0x0}; - byte[] colors_D = {DarkColor.R, DarkColor.G, DarkColor.B, 0x0}; + public void CommitColorsToRam(long baseOffset) + { + byte[] colors_L = { LightColor.R, LightColor.G, LightColor.B, 0x0 }; + byte[] colors_D = { DarkColor.R, DarkColor.G, DarkColor.B, 0x0 }; if (colors_L.Sum(x => (int)x) == 0) colors_L[3] = 0xFF; if (colors_D.Sum(x => (int)x) == 0) colors_D[3] = 0xFF; - - WriteBytes(baseOffset + Offset86, SwapEndian(colors_L, 4)); - WriteBytes(baseOffset + Offset88, SwapEndian(colors_D, 4)); + if (baseOffset == 0 && IsAddressSegmented) + { + WriteBytes(SegmentedToVirtual(Offset86), SwapEndian(colors_L, 4)); + WriteBytes(SegmentedToVirtual(Offset88), SwapEndian(colors_D, 4)); + + WriteBytes(SegmentedToVirtual(Offset86) + 4, SwapEndian(colors_L, 4)); + WriteBytes(SegmentedToVirtual(Offset88) + 4, SwapEndian(colors_D, 4)); + + } + else + { + WriteBytes(baseOffset + Offset86, SwapEndian(colors_L, 4)); + WriteBytes(baseOffset + Offset88, SwapEndian(colors_D, 4)); + + WriteBytes(baseOffset + Offset86 + 4, SwapEndian(colors_L, 4)); + WriteBytes(baseOffset + Offset88 + 4, SwapEndian(colors_D, 4)); + } - WriteBytes(baseOffset + Offset86 + 4, SwapEndian(colors_L, 4)); - WriteBytes(baseOffset + Offset88 + 4, SwapEndian(colors_D, 4)); } - public void ChangeLightDirection(byte nX, byte nY, byte nZ) { - ChangeLightDirection(SegmentedToVirtual(0x04000000), nX, nY, nZ); + public void PullColorsFromRam(long baseOffset) + { + if (baseOffset == 0 && IsAddressSegmented) { + var colorData = SwapEndian(ReadBytes(SegmentedToVirtual(Offset86), 4), 4); + LightColor = Color.FromArgb(colorData[0], colorData[1], colorData[2]); + colorData = SwapEndian(ReadBytes(SegmentedToVirtual(Offset88), 4), 4); + DarkColor = Color.FromArgb(colorData[0], colorData[1], colorData[2]); + } + else { + var colorData = SwapEndian(ReadBytes(baseOffset + Offset86, 4), 4); + LightColor = Color.FromArgb(colorData[0], colorData[1], colorData[2]); + colorData = SwapEndian(ReadBytes(baseOffset + Offset88, 4), 4); + DarkColor = Color.FromArgb(colorData[0], colorData[1], colorData[2]); + } + + + } - public void ChangeLightDirection(long baseOffset, byte nX, byte nY, byte nZ) { - WriteBytes(baseOffset + OffsetLightDir, new byte[]{ nX, nY, nZ, 00}, true); + public void ChangeLightDirection(byte nX, byte nY, byte nZ) + { + ChangeLightDirection((IsAddressSegmented ? 0 : SegmentedToVirtual(0x04000000)), nX, nY, nZ); + } + + public void ChangeLightDirection(long baseOffset, byte nX, byte nY, byte nZ) + { + if (baseOffset == 0 && IsAddressSegmented) { + WriteBytes(SegmentedToVirtual(OffsetLightDir), new byte[] { nX, nY, nZ, 00 }, true); + } + else { + WriteBytes(baseOffset + OffsetLightDir, new byte[] { nX, nY, nZ, 00 }, true); + } + } - public string ToGameshark() { + public string ToGameshark() + { // It's like this because I want color codes to be "universal" so if S04 ends up // being in another location I just subtract 0x7EC20 from each line diff --git a/M64MM.Utils/Appearance/ColorStandardNaming.cs b/M64MM.Utils/Appearance/ColorStandardNaming.cs index c7ba545..a3e2a52 100644 --- a/M64MM.Utils/Appearance/ColorStandardNaming.cs +++ b/M64MM.Utils/Appearance/ColorStandardNaming.cs @@ -37,10 +37,8 @@ public static class CCStandardHelpers { }; public static readonly CCStandardPart[] ColorcodeableStandard = new CCStandardPart[] { - CCStandardPart.SHIRT, CCStandardPart.SHIRT_ARM, CCStandardPart.SHIRT_SHOULDER, - CCStandardPart.OVERALLS_BOTTOM, CCStandardPart.LEGS_TOP, CCStandardPart.LEGS_BOTTOM, - CCStandardPart.CUSTOM1, CCStandardPart.CUSTOM2, CCStandardPart.CUSTOM3, CCStandardPart.CUSTOM4, - CCStandardPart.CUSTOM5, CCStandardPart.CUSTOM6, CCStandardPart.CUSTOM7, CCStandardPart.CUSTOM8 + CCStandardPart.HAT, CCStandardPart.HAIR, CCStandardPart.SKIN, CCStandardPart.GLOVES, + CCStandardPart.OVERALLS_TOP, CCStandardPart.SHOES }; } } \ No newline at end of file diff --git a/M64MM.Utils/Appearance/DefaultLightsets.cs b/M64MM.Utils/Appearance/DefaultLightsets.cs new file mode 100644 index 0000000..4437957 --- /dev/null +++ b/M64MM.Utils/Appearance/DefaultLightsets.cs @@ -0,0 +1,391 @@ +using System.Drawing; + +namespace M64MM.Utils +{ + public static class DefaultLightsets + { + + public static Lightset ClassicLightset = new Lightset(); + public static Lightset SparkLightset = new Lightset(); + public static Lightset X3SLightset = new Lightset(); + public static Lightset PeachGrass = new Lightset(); + + static DefaultLightsets() + { + InitClassic(); + InitSpark(); + InitX3S(); + InitPeachGrass(); + } + + static void InitClassic() + { + ColorPart hatShirt = new ColorPart + { + Name = "Hat & Shirt", + Offset88 = 0x18, + Offset86 = 0x20, + DefaultLightColor = Color.FromArgb(255, 0, 0), + DefaultDarkColor = Color.FromArgb(128, 0, 0) + }; + ColorPart hair = new ColorPart + { + Name = "Hair", + Offset88 = 0x78, + Offset86 = 0x80, + DefaultLightColor = Color.FromArgb(115, 6, 0), + DefaultDarkColor = Color.FromArgb(57, 3, 0) + }; + ColorPart skin = new ColorPart + { + Name = "Skin", + Offset88 = 0x60, + Offset86 = 0x68, + DefaultLightColor = Color.FromArgb(254, 193, 121), + DefaultDarkColor = Color.FromArgb(127, 96, 60) + }; + ColorPart gloves = new ColorPart + { + Name = "Gloves", + Offset88 = 0x30, + Offset86 = 0x38, + DefaultLightColor = Color.FromArgb(255, 255, 255), + DefaultDarkColor = Color.FromArgb(128, 128, 128) + }; + ColorPart overalls = new ColorPart + { + Name = "Overalls", + Offset88 = 0x0, + Offset86 = 0x8, + DefaultLightColor = Color.FromArgb(0, 0, 255), + DefaultDarkColor = Color.FromArgb(0, 0, 128) + }; + ColorPart shoes = new ColorPart + { + Name = "Shoes", + Offset88 = 0x48, + Offset86 = 0x50, + DefaultLightColor = Color.FromArgb(115, 6, 0), + DefaultDarkColor = Color.FromArgb(57, 3, 0) + }; + + ClassicLightset.SetPart("hat", hatShirt) + .SetPart("hair", hair) + .SetPart("skin", skin) + .SetPart("gloves", gloves) + .SetPart("overalls", overalls) + .SetPart("shoes", shoes) + .SetPartMapping(CCStandardPart.HAT, "hat") + .SetPartMapping(CCStandardPart.HAIR, "hair") + .SetPartMapping(CCStandardPart.SKIN, "skin") + .SetPartMapping(CCStandardPart.GLOVES, "gloves") + .SetPartMapping(CCStandardPart.OVERALLS_TOP, "overalls") + .SetPartMapping(CCStandardPart.SHOES, "shoes"); + } + + static void InitSpark() + { + ColorPart hat = new ColorPart + { + Name = "Hat", + Offset88 = 0x18, + Offset86 = 0x20, + DefaultLightColor = Color.FromArgb(255, 0, 0), + DefaultDarkColor = Color.FromArgb(128, 0, 0) + }; + ColorPart hair = new ColorPart + { + Name = "Hair", + Offset88 = 0x78, + Offset86 = 0x80, + DefaultLightColor = Color.FromArgb(115, 6, 0), + DefaultDarkColor = Color.FromArgb(57, 3, 0) + }; + ColorPart skin = new ColorPart + { + Name = "Skin", + Offset88 = 0x60, + Offset86 = 0x68, + DefaultLightColor = Color.FromArgb(254, 193, 121), + DefaultDarkColor = Color.FromArgb(127, 96, 60) + }; + ColorPart shirt = new ColorPart + { + Name = "Shirt", + Offset88 = 0x90, + Offset86 = 0x98, + DefaultLightColor = Color.FromArgb(255, 0, 0), + DefaultDarkColor = Color.FromArgb(128, 0, 0) + }; + ColorPart shoulders = new ColorPart + { + Name = "Shoulders", + Offset88 = 0xA8, + Offset86 = 0xB0, + DefaultLightColor = Color.FromArgb(255, 0, 0), + DefaultDarkColor = Color.FromArgb(128, 0, 0) + }; + ColorPart arms = new ColorPart + { + Name = "Arms", + Offset88 = 0xC0, + Offset86 = 0xC8, + DefaultLightColor = Color.FromArgb(255, 0, 0), + DefaultDarkColor = Color.FromArgb(128, 0, 0) + }; + ColorPart gloves = new ColorPart + { + Name = "Gloves", + Offset88 = 0x30, + Offset86 = 0x38, + DefaultLightColor = Color.FromArgb(255, 255, 255), + DefaultDarkColor = Color.FromArgb(128, 128, 128) + }; + ColorPart overalls1 = new ColorPart + { + Name = "Overalls Top", + Offset88 = 0x0, + Offset86 = 0x8, + DefaultLightColor = Color.FromArgb(0, 0, 255), + DefaultDarkColor = Color.FromArgb(0, 0, 128) + }; + ColorPart overalls2 = new ColorPart + { + Name = "Overalls Bottom", + Offset88 = 0xD8, + Offset86 = 0xE0, + DefaultLightColor = Color.FromArgb(0, 0, 255), + DefaultDarkColor = Color.FromArgb(0, 0, 128) + }; + ColorPart leg1 = new ColorPart + { + Name = "Leg Top", + Offset88 = 0xF0, + Offset86 = 0xF8, + DefaultLightColor = Color.FromArgb(0, 0, 255), + DefaultDarkColor = Color.FromArgb(0, 0, 128) + }; + ColorPart leg2 = new ColorPart + { + Name = "Leg Bottom", + Offset88 = 0x108, + Offset86 = 0x110, + DefaultLightColor = Color.FromArgb(0, 0, 255), + DefaultDarkColor = Color.FromArgb(0, 0, 128) + }; + ColorPart shoe = new ColorPart + { + Name = "Shoes", + Offset88 = 0x48, + Offset86 = 0x50, + DefaultLightColor = Color.FromArgb(115, 6, 0), + DefaultDarkColor = Color.FromArgb(57, 3, 0) + }; + ColorPart custom1 = new ColorPart + { + Name = "Custom 1", + Offset88 = 0x120, + Offset86 = 0x128, + DefaultLightColor = Color.FromArgb(255, 255, 255), + DefaultDarkColor = Color.FromArgb(128, 128, 128) + }; + ColorPart custom2 = new ColorPart + { + Name = "Custom 2", + Offset88 = 0x138, + Offset86 = 0x140, + DefaultLightColor = Color.FromArgb(255, 255, 255), + DefaultDarkColor = Color.FromArgb(128, 128, 128) + }; + ColorPart custom3 = new ColorPart + { + Name = "Custom 3", + Offset88 = 0x150, + Offset86 = 0x158, + DefaultLightColor = Color.FromArgb(255, 255, 255), + DefaultDarkColor = Color.FromArgb(128, 128, 128) + }; + ColorPart custom4 = new ColorPart + { + Name = "Custom 4", + Offset88 = 0x168, + Offset86 = 0x170, + DefaultLightColor = Color.FromArgb(255, 255, 255), + DefaultDarkColor = Color.FromArgb(128, 128, 128) + }; + ColorPart custom5 = new ColorPart + { + Name = "Custom 5", + Offset88 = 0x180, + Offset86 = 0x188, + DefaultLightColor = Color.FromArgb(255, 255, 255), + DefaultDarkColor = Color.FromArgb(128, 128, 128) + }; + ColorPart custom6 = new ColorPart + { + Name = "Custom 6", + Offset88 = 0x198, + Offset86 = 0x1A0, + DefaultLightColor = Color.FromArgb(255, 255, 255), + DefaultDarkColor = Color.FromArgb(128, 128, 128) + }; + ColorPart custom7 = new ColorPart + { + Name = "Custom 7", + Offset88 = 0x1B0, + Offset86 = 0x1B8, + DefaultLightColor = Color.FromArgb(255, 255, 255), + DefaultDarkColor = Color.FromArgb(128, 128, 128) + }; + ColorPart custom8 = new ColorPart + { + Name = "Custom 8", + Offset88 = 0x1C8, + Offset86 = 0x1D0, + DefaultLightColor = Color.FromArgb(255, 255, 255), + DefaultDarkColor = Color.FromArgb(128, 128, 128) + }; + + SparkLightset.SetPart("hat", hat) + .SetPart("shirt", shirt) + .SetPart("shoulders", shoulders) + .SetPart("arms", arms) + .SetPart("hair", hair) + .SetPart("skin", skin) + .SetPart("gloves", gloves) + .SetPart("overalls", overalls1) + .SetPart("pants", overalls2) + .SetPart("thigh", leg1) + .SetPart("shin", leg2) + .SetPart("shoes", shoe) + .SetPart("c1", custom1) + .SetPart("c2", custom2) + .SetPart("c3", custom3) + .SetPart("c4", custom4) + .SetPart("c5", custom5) + .SetPart("c6", custom6) + .SetPart("c7", custom7) + .SetPart("c8", custom8) + .SetPartMapping(CCStandardPart.HAT, "hat") + .SetPartMapping(CCStandardPart.SHIRT, "shirt") + .SetPartMapping(CCStandardPart.SHIRT_SHOULDER, "shoulders") + .SetPartMapping(CCStandardPart.SHIRT_ARM, "arms") + .SetPartMapping(CCStandardPart.HAIR, "hair") + .SetPartMapping(CCStandardPart.SKIN, "skin") + .SetPartMapping(CCStandardPart.GLOVES, "gloves") + .SetPartMapping(CCStandardPart.OVERALLS_TOP, "overalls") + .SetPartMapping(CCStandardPart.OVERALLS_BOTTOM, "pants") + .SetPartMapping(CCStandardPart.LEGS_TOP, "thigh") + .SetPartMapping(CCStandardPart.LEGS_BOTTOM, "shin") + .SetPartMapping(CCStandardPart.SHOES, "shoes") + .SetPartMapping(CCStandardPart.CUSTOM1, "c1") + .SetPartMapping(CCStandardPart.CUSTOM2, "c2") + .SetPartMapping(CCStandardPart.CUSTOM3, "c3") + .SetPartMapping(CCStandardPart.CUSTOM4, "c4") + .SetPartMapping(CCStandardPart.CUSTOM5, "c5") + .SetPartMapping(CCStandardPart.CUSTOM6, "c6") + .SetPartMapping(CCStandardPart.CUSTOM7, "c7") + .SetPartMapping(CCStandardPart.CUSTOM8, "c8"); + } + + static void InitX3S() { + ColorPart tint = new ColorPart { + Name = "X3S Tint", + Offset88 = 0x1C800, + Offset86 = 0x1C808, + DefaultLightColor = Color.FromArgb(255, 255, 255), + DefaultDarkColor = Color.FromArgb(128, 128, 128) + }; + X3SLightset.SetPart("tint", tint) + .SetPartMapping(CCStandardPart.LEGACY_CHARA_TINT, "tint"); + } + + static void InitPeachGrass() { + // Attribution: sm64rise + // I however dislike this specific method so it may get deprecated really quickly + ColorPart tint1 = new ColorPart + { + Name = "Grass, sand, bridge", + Offset88 = 0x07006ED8, + Offset86 = 0x07006EE0, + IsAddressSegmented = true, + DefaultLightColor = Color.FromArgb(255, 255, 255), + DefaultDarkColor = Color.FromArgb(128, 128, 128) + }; + ColorPart tint2 = new ColorPart + { + Name = "Unsure.", + Offset88 = 0x07006EF0, + Offset86 = 0x07006EF8, + IsAddressSegmented = true, + DefaultLightColor = Color.FromArgb(255, 255, 255), + DefaultDarkColor = Color.FromArgb(128, 128, 128) + }; + + ColorPart tint7 = new ColorPart + { + Name = "Shade07", + Offset86 = 0x07006F28, + Offset88 = 0x07006F20, + IsAddressSegmented = true, + DefaultLightColor = Color.FromArgb(255, 255, 255), + DefaultDarkColor = Color.FromArgb(128, 128, 128) + }; + ColorPart tint4 = new ColorPart + { + Name = "Wet sands & bricks", + Offset88 = 0x07006F08, + Offset86 = 0x07006F10, + IsAddressSegmented = true, + DefaultLightColor = Color.FromArgb(255, 255, 255), + DefaultDarkColor = Color.FromArgb(128, 128, 128) + }; + ColorPart tint9 = new ColorPart + { + Name = "SOME moat walls", + Offset86 = 0x07006F40, + Offset88 = 0x07006F38, + IsAddressSegmented = true, + DefaultLightColor = Color.FromArgb(255, 255, 255), + DefaultDarkColor = Color.FromArgb(128, 128, 128) + }; + ColorPart tint10 = new ColorPart + { + Name = "Cliff Near Waterfall", + Offset86 = 0x07006F58, + Offset88 = 0x07006F50, + IsAddressSegmented = true, + DefaultLightColor = Color.FromArgb(255, 255, 255), + DefaultDarkColor = Color.FromArgb(128, 128, 128) + }; + ColorPart tint12 = new ColorPart + { + Name = "Unsure.", + Offset86 = 0x07006F70, + Offset88 = 0x07006F68, + IsAddressSegmented = true, + DefaultLightColor = Color.FromArgb(255, 255, 255), + DefaultDarkColor = Color.FromArgb(128, 128, 128) + }; + ColorPart tint15 = new ColorPart + { + Name = "Outer Hill Grass", + Offset86 = 0x07006F88, + Offset88 = 0x07006F80, + IsAddressSegmented = true, + DefaultLightColor = Color.FromArgb(255, 255, 255), + DefaultDarkColor = Color.FromArgb(128, 128, 128) + }; + + PeachGrass.SetPart("pl1", tint1) + .SetPart("pl2", tint2) + .SetPart("pl4", tint7) + .SetPart("pl3", tint4) + .SetPart("pl5", tint9) + .SetPart("pl6", tint10) + .SetPart("pl7", tint12) + .SetPart("pl8", tint15) + .SetPartMapping(CCStandardPart.LEVEL_TINT1, "pl1"); + } + } +} \ No newline at end of file diff --git a/M64MM.Utils/Appearance/Lightset.cs b/M64MM.Utils/Appearance/Lightset.cs index db6ba44..80209cc 100644 --- a/M64MM.Utils/Appearance/Lightset.cs +++ b/M64MM.Utils/Appearance/Lightset.cs @@ -1,11 +1,15 @@ using System; +using System.CodeDom; using System.Collections.Generic; +using System.Drawing; using System.Linq; namespace M64MM.Utils { public class Lightset { - private Dictionary _parts; - private Dictionary _partMapping; + private Dictionary _parts = new Dictionary(); + private Dictionary _partMapping = new Dictionary(); + + public List Parts => _parts.Values.ToList(); public bool SparkCompatible { get @@ -27,7 +31,7 @@ public bool NormalColorcodeCompatible /// /// An ID to get the part by /// The CC part to set - public void SetPart(string id, ColorPart part) { + public Lightset SetPart(string id, ColorPart part) { if (_parts.ContainsKey(id)) { _parts[id] = part; } @@ -37,9 +41,11 @@ public void SetPart(string id, ColorPart part) { } _parts.Add(id, part); } - } - public void SetPartMapping(CCStandardPart source, string id) { + return this; + } + // TODO: Add a SetPartAndMap variant of this so creation is easier + public Lightset SetPartMapping(CCStandardPart source, string id) { if (!_parts.ContainsKey(id)) { throw new ArgumentException($"This Lightset has no part with ID \"{id}\"."); } @@ -50,6 +56,8 @@ public void SetPartMapping(CCStandardPart source, string id) { else { _partMapping.Add(source, id); } + + return this; } public ColorPart GetPartById(string id) @@ -64,4 +72,5 @@ public ColorPart GetPart(CCStandardPart stdPart) { } } + } \ No newline at end of file diff --git a/M64MM.Utils/Appearance/Looks.cs b/M64MM.Utils/Appearance/Looks.cs index 77050ff..3be0484 100644 --- a/M64MM.Utils/Appearance/Looks.cs +++ b/M64MM.Utils/Appearance/Looks.cs @@ -17,233 +17,6 @@ public enum ModelHeaderType { EMPTY } - public static List x3sParts = new List { - new ColorPart { - Name = "X3S Tint", - Offset88 = 0x1C800, - Offset86 = 0x1C808, - DefaultLightColor = Color.FromArgb(255, 255, 255), - DefaultDarkColor = Color.FromArgb(128, 128, 128) - } - - }; - - public static List sparkParts = new List - { - new ColorPart - { - Name = "Hat", - Offset88 = 0x18, - Offset86 = 0x20, - DefaultLightColor = Color.FromArgb(255, 0, 0), - DefaultDarkColor = Color.FromArgb(128, 0, 0) - }, - new ColorPart - { - Name = "Hair", - Offset88 = 0x78, - Offset86 = 0x80, - DefaultLightColor = Color.FromArgb(115, 6, 0), - DefaultDarkColor = Color.FromArgb(57, 3, 0) - }, - new ColorPart - { - Name = "Skin", - Offset88 = 0x60, - Offset86 = 0x68, - DefaultLightColor = Color.FromArgb(254, 193, 121), - DefaultDarkColor = Color.FromArgb(127, 96, 60) - }, - new ColorPart - { - Name = "Shirt", - Offset88 = 0x90, - Offset86 = 0x98, - DefaultLightColor = Color.FromArgb(255, 0, 0), - DefaultDarkColor = Color.FromArgb(128, 0, 0) - }, - new ColorPart - { - Name = "Shoulders", - Offset88 = 0xA8, - Offset86 = 0xB0, - DefaultLightColor = Color.FromArgb(255, 0, 0), - DefaultDarkColor = Color.FromArgb(128, 0, 0) - }, - new ColorPart - { - Name = "Arms", - Offset88 = 0xC0, - Offset86 = 0xC8, - DefaultLightColor = Color.FromArgb(255, 0, 0), - DefaultDarkColor = Color.FromArgb(128, 0, 0) - }, - new ColorPart - { - Name = "Gloves", - Offset88 = 0x30, - Offset86 = 0x38, - DefaultLightColor = Color.FromArgb(255, 255, 255), - DefaultDarkColor = Color.FromArgb(128, 128, 128) - }, - new ColorPart - { - Name = "Overalls Top", - Offset88 = 0x0, - Offset86 = 0x8, - DefaultLightColor = Color.FromArgb(0, 0, 255), - DefaultDarkColor = Color.FromArgb(0, 0, 128) - }, - new ColorPart - { - Name = "Overalls Bottom", - Offset88 = 0xD8, - Offset86 = 0xE0, - DefaultLightColor = Color.FromArgb(0, 0, 255), - DefaultDarkColor = Color.FromArgb(0, 0, 128) - }, - new ColorPart - { - Name = "Leg Top", - Offset88 = 0xF0, - Offset86 = 0xF8, - DefaultLightColor = Color.FromArgb(0, 0, 255), - DefaultDarkColor = Color.FromArgb(0, 0, 128) - }, - new ColorPart - { - Name = "Leg Bottom", - Offset88 = 0x108, - Offset86 = 0x110, - DefaultLightColor = Color.FromArgb(0, 0, 255), - DefaultDarkColor = Color.FromArgb(0, 0, 128) - }, - new ColorPart - { - Name = "Shoes", - Offset88 = 0x48, - Offset86 = 0x50, - DefaultLightColor = Color.FromArgb(115, 6, 0), - DefaultDarkColor = Color.FromArgb(57, 3, 0) - }, - new ColorPart - { - Name = "Custom 1", - Offset88 = 0x120, - Offset86 = 0x128, - DefaultLightColor = Color.FromArgb(255, 255, 255), - DefaultDarkColor = Color.FromArgb(128, 128, 128) - }, - new ColorPart - { - Name = "Custom 2", - Offset88 = 0x138, - Offset86 = 0x140, - DefaultLightColor = Color.FromArgb(255, 255, 255), - DefaultDarkColor = Color.FromArgb(128, 128, 128) - }, - new ColorPart - { - Name = "Custom 3", - Offset88 = 0x150, - Offset86 = 0x158, - DefaultLightColor = Color.FromArgb(255, 255, 255), - DefaultDarkColor = Color.FromArgb(128, 128, 128) - }, - new ColorPart - { - Name = "Custom 4", - Offset88 = 0x168, - Offset86 = 0x170, - DefaultLightColor = Color.FromArgb(255, 255, 255), - DefaultDarkColor = Color.FromArgb(128, 128, 128) - }, - new ColorPart - { - Name = "Custom 5", - Offset88 = 0x180, - Offset86 = 0x188, - DefaultLightColor = Color.FromArgb(255, 255, 255), - DefaultDarkColor = Color.FromArgb(128, 128, 128) - }, - new ColorPart - { - Name = "Custom 6", - Offset88 = 0x198, - Offset86 = 0x1A0, - DefaultLightColor = Color.FromArgb(255, 255, 255), - DefaultDarkColor = Color.FromArgb(128, 128, 128) - }, - new ColorPart - { - Name = "Custom 7", - Offset88 = 0x1B0, - Offset86 = 0x1B8, - DefaultLightColor = Color.FromArgb(255, 255, 255), - DefaultDarkColor = Color.FromArgb(128, 128, 128) - }, - new ColorPart - { - Name = "Custom 8", - Offset88 = 0x1C8, - Offset86 = 0x1D0, - DefaultLightColor = Color.FromArgb(255, 255, 255), - DefaultDarkColor = Color.FromArgb(128, 128, 128) - } - }; - - public static List classicParts = new List - { - new ColorPart - { - Name = "Hat & Shirt", - Offset88 = 0x18, - Offset86 = 0x20, - DefaultLightColor = Color.FromArgb(255, 0, 0), - DefaultDarkColor = Color.FromArgb(128, 0, 0) - }, - new ColorPart - { - Name = "Hair", - Offset88 = 0x78, - Offset86 = 0x80, - DefaultLightColor = Color.FromArgb(115, 6, 0), - DefaultDarkColor = Color.FromArgb(57, 3, 0) - }, - new ColorPart - { - Name = "Skin", - Offset88 = 0x60, - Offset86 = 0x68, - DefaultLightColor = Color.FromArgb(254, 193, 121), - DefaultDarkColor = Color.FromArgb(127, 96, 60) - }, - new ColorPart - { - Name = "Gloves", - Offset88 = 0x30, - Offset86 = 0x38, - DefaultLightColor = Color.FromArgb(255, 255, 255), - DefaultDarkColor = Color.FromArgb(128, 128, 128) - }, - new ColorPart - { - Name = "Overalls", - Offset88 = 0x0, - Offset86 = 0x8, - DefaultLightColor = Color.FromArgb(0, 0, 255), - DefaultDarkColor = Color.FromArgb(0, 0, 128) - }, - new ColorPart - { - Name = "Shoes", - Offset88 = 0x48, - Offset86 = 0x50, - DefaultLightColor = Color.FromArgb(115, 6, 0), - DefaultDarkColor = Color.FromArgb(57, 3, 0) - } - }; - public enum ShadowAxis { X, Y, diff --git a/M64MM.Utils/Core.cs b/M64MM.Utils/Core.cs index d2a7e5c..2c6e48d 100644 --- a/M64MM.Utils/Core.cs +++ b/M64MM.Utils/Core.cs @@ -8,6 +8,7 @@ using System.Linq; using System.Numerics; using System.Reflection; +using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Security; using System.Security.Permissions; @@ -37,7 +38,17 @@ public static class Core public static SettingsGroup coreSettingsGroup; static bool _cameraFrozen = false; static bool _cameraSoftFrozen = false; - public static Lightset CurrentLightset { get; set; } + private static Lightset _currentLightset; + + + public static Lightset CurrentLightset { + get => _currentLightset; + set + { + _currentLightset = value; + LightsetChanged?.Invoke(null, value); + } + } public static bool TurboUpdateEnabled { @@ -80,6 +91,7 @@ private set { } public static event EventHandler EmulatorInaccessible; public static event EventHandler GameTick; // Update, but for internal program usage (Not addon) public static event EventHandler BaseAddressUpdate; + public static event EventHandler LightsetChanged; #endregion // Settings related variables @@ -898,7 +910,10 @@ public static void LoadColorCodeRepo() public static List GetQueriedAnimations(string query = "") { Regex mRegex = new Regex($"/({query})/g"); - List l = animList.Where(a => a.Description.ToLower().Contains(query)).OrderBy(x => mRegex.Matches(x.Description).Count).ToList(); + List l = animList.Select(x => { + x.Description = x.Description.ToLowerInvariant(); return x; + }).Where(a => a.Description.ToLowerInvariant().Contains(query)) + .OrderBy(x => mRegex.Matches(x.Description.ToLowerInvariant()).Count).ToList(); if (l.Count < 1) l = animList.ToList(); //BAHAHAHAHAHAHAHAHA return l; } diff --git a/M64MM.Utils/M64MM.Utils.csproj b/M64MM.Utils/M64MM.Utils.csproj index b00cdd6..24c82c0 100644 --- a/M64MM.Utils/M64MM.Utils.csproj +++ b/M64MM.Utils/M64MM.Utils.csproj @@ -92,6 +92,7 @@ + diff --git a/M64MM2/AppearanceForm.Designer.cs b/M64MM2/AppearanceForm.Designer.cs index 6f2ca90..b995129 100644 --- a/M64MM2/AppearanceForm.Designer.cs +++ b/M64MM2/AppearanceForm.Designer.cs @@ -119,7 +119,8 @@ private void InitializeComponent() { this.cbPartListOverride.Items.AddRange(new object[] { resources.GetString("cbPartListOverride.Items"), resources.GetString("cbPartListOverride.Items1"), - resources.GetString("cbPartListOverride.Items2")}); + resources.GetString("cbPartListOverride.Items2"), + resources.GetString("cbPartListOverride.Items3")}); resources.ApplyResources(this.cbPartListOverride, "cbPartListOverride"); this.cbPartListOverride.Name = "cbPartListOverride"; this.cbPartListOverride.SelectedIndexChanged += new System.EventHandler(this.cbPartListOverride_SelectedIndexChanged); @@ -427,7 +428,7 @@ private void InitializeComponent() { resources.ApplyResources(this.lbWarning, "lbWarning"); this.lbWarning.Name = "lbWarning"; // - // NewAppearanceForm + // AppearanceForm // resources.ApplyResources(this, "$this"); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; diff --git a/M64MM2/AppearanceForm.cs b/M64MM2/AppearanceForm.cs index 530c933..1a7e10c 100644 --- a/M64MM2/AppearanceForm.cs +++ b/M64MM2/AppearanceForm.cs @@ -12,8 +12,10 @@ using static M64MM.Utils.Core; using static M64MM.Utils.Looks; -namespace M64MM2 { - public partial class AppearanceForm : Form { +namespace M64MM2 +{ + public partial class AppearanceForm : Form + { readonly Random _rand = new Random(); private readonly List _currentSelection = new List(); @@ -26,27 +28,30 @@ public partial class AppearanceForm : Form { ColorMap shoesMap = new ColorMap(); private BindingList _chosenParts = new BindingList(); - public AppearanceForm() { + public AppearanceForm() + { InitializeComponent(); - long s04addr = SegmentedToVirtual(0x04000000, false); + LightsetChanged += (sender, lightset) => { UpdateColorPartList(); }; lbColors.DrawMode = DrawMode.OwnerDrawFixed; lbColors.ItemHeight = 16; - // .ToList() clones. - - switch (modelStatus) { - case ModelHeaderType.CLASSIC: { - _chosenParts = new BindingList(classicParts.ToList()); + switch (modelStatus) + { + case ModelHeaderType.CLASSIC: + { + CurrentLightset = DefaultLightsets.ClassicLightset; break; } - case ModelHeaderType.SPARK: { - _chosenParts = new BindingList(sparkParts.ToList()); + case ModelHeaderType.SPARK: + { + CurrentLightset = DefaultLightsets.SparkLightset; break; } } cbRandMode.SelectedIndex = 0; - if (lbColors.Items.Count > 0) { + if (lbColors.Items.Count > 0) + { lbColors.SelectedIndex = 0; } @@ -66,7 +71,8 @@ public AppearanceForm() { lbColors.DataSource = _chosenParts; - foreach (ColorCodeGS cc in colorCodeGamesharks) { + foreach (ColorCodeGS cc in colorCodeGamesharks) + { lbCCs.Items.Add(cc); clbRandSel.Items.Add(cc); } @@ -74,7 +80,8 @@ public AppearanceForm() { LoadFromGame(null, null); } - void colorButton_Click(object sender, EventArgs e) { + void colorButton_Click(object sender, EventArgs e) + { Button senderButton = (Button)sender; colorDialog.Color = senderButton.BackColor; @@ -87,7 +94,8 @@ void colorButton_Click(object sender, EventArgs e) { if ((!IsEmuOpen || BaseAddress == 0) && (modelStatus != ModelHeaderType.CLASSIC || modelStatus != ModelHeaderType.SPARK) && lbColors.SelectedItem == null) return; - switch (senderButton.Name) { + switch (senderButton.Name) + { case "btnLightCol": ((ColorPart)lbColors.SelectedItem).LightColor = senderButton.BackColor; break; @@ -99,46 +107,55 @@ void colorButton_Click(object sender, EventArgs e) { lbColors.Refresh(); } - public static void WriteColorPart(ColorPart cPart) { + public static void WriteColorPart(ColorPart cPart) + { cPart.CommitColorsToRam(); } - void DefaultAllColors() { - foreach (ColorPart cPart in _chosenParts) { + void DefaultAllColors() + { + foreach (ColorPart cPart in _chosenParts) + { cPart.LightColor = cPart.DefaultLightColor; cPart.DarkColor = cPart.DefaultDarkColor; cPart.CommitColorsToRam(); } } - void ApplyAllColors(bool refreshList = true) { + void ApplyAllColors(bool refreshList = true) + { if ((!IsEmuOpen || BaseAddress == 0) && (modelStatus != ModelHeaderType.CLASSIC || modelStatus != ModelHeaderType.SPARK)) return; btnLightCol.BackColor = ((ColorPart)lbColors.SelectedItem).LightColor; btnDarkCol.BackColor = ((ColorPart)lbColors.SelectedItem).DarkColor; - foreach (ColorPart cPart in _chosenParts) { + foreach (ColorPart cPart in _chosenParts) + { cPart.CommitColorsToRam(); } - if (refreshList) { + if (refreshList && !tmrRandom.Enabled) + { lbColors_SelectedValueChanged(null, null); lbColors.Refresh(); } } - void OpenCopyPasteForm(object sender, EventArgs e) { + void OpenCopyPasteForm(object sender, EventArgs e) + { CopyPasteForm form = new CopyPasteForm(); Button senderButton = (Button)sender; - if (senderButton.Name == btnImportCode.Name) { + if (senderButton.Name == btnImportCode.Name) + { form.lblInfo.Text = Resources.colorCodeImportMsg; form.btnFile.Text = Resources.colorCodeFromFile; form.ShowDialog(this); } - else if (senderButton.Name == btnExportCode.Name) { + else if (senderButton.Name == btnExportCode.Name) + { form.lblInfo.Text = Resources.colorCodeExportMsg; form.btnCancel.Visible = false; form.tbColorCode.ReadOnly = true; @@ -148,7 +165,8 @@ void OpenCopyPasteForm(object sender, EventArgs e) { } } - public void ParseColorCode(string code) { + public void ParseColorCode(string code) + { // all my homies hate U+000D CARRIAGE RETURN FromColorCode(code.Replace("\r", ""), _chosenParts.ToList()); marioSprite.Refresh(); @@ -156,61 +174,71 @@ public void ParseColorCode(string code) { ApplyAllColors(); } - public void ChangeShadow() { - foreach (ColorPart cPart in _chosenParts) { + public void ChangeShadow() + { + foreach (ColorPart cPart in _chosenParts) + { cPart.ChangeLightDirection((byte)tbLeftRight.Value, (byte)tbBottomTop.Value, (byte)tbBackFront.Value); } } - string GenerateColorCode() { + string GenerateColorCode() + { StringBuilder code = new StringBuilder(); - foreach (ColorPart cPart in _chosenParts) { + foreach (ColorPart cPart in _chosenParts) + { code.Append(cPart.ToGameshark()); } return code.ToString(); } - void ResetColors(object sender, EventArgs e) { + void ResetColors(object sender, EventArgs e) + { marioSprite.Refresh(); DefaultAllColors(); lbColors.Refresh(); } - void LoadFromGame(object sender, EventArgs e) { + void LoadFromGame(object sender, EventArgs e) + { if ((!IsEmuOpen || BaseAddress == 0) && (modelStatus != ModelHeaderType.CLASSIC || modelStatus != ModelHeaderType.SPARK)) return; long seg04addr = SegmentedToVirtual(0x04000000); - foreach (ColorPart cPart in _chosenParts) { - var colorData = SwapEndian(ReadBytes(seg04addr + cPart.Offset86, 4), 4); - cPart.LightColor = Color.FromArgb(colorData[0], colorData[1], colorData[2]); - colorData = SwapEndian(ReadBytes(seg04addr + cPart.Offset88, 4), 4); - cPart.DarkColor = Color.FromArgb(colorData[0], colorData[1], colorData[2]); + foreach (ColorPart cPart in _chosenParts) + { + cPart.PullColorsFromRam(); } lbColors.Refresh(); marioSprite.Refresh(); } - void marioSprite_DoubleClick(object sender, EventArgs e) { - if (!tmrRandom.Enabled) { + void marioSprite_DoubleClick(object sender, EventArgs e) + { + if (!tmrRandom.Enabled) + { _currentSelection.Clear(); _currentSelection.AddRange(clbRandSel.CheckedItems.Cast()); tmrRandom.Start(); lbColors.Refresh(); } - else { + else + { tmrRandom.Stop(); lbColors.Refresh(); } } - public void ExecuteRandomCC() { + public void ExecuteRandomCC() + { int mode = cbRandMode.SelectedIndex; - switch (mode) { + switch (mode) + { case 0: - foreach (ColorPart cPart in _chosenParts) { + foreach (ColorPart cPart in _chosenParts) + { cPart.LightColor = Color.FromArgb(_rand.Next(255), _rand.Next(255), _rand.Next(255)); cPart.DarkColor = Color.FromArgb(_rand.Next(255), _rand.Next(255), _rand.Next(255)); } @@ -227,10 +255,12 @@ public void ExecuteRandomCC() { ApplyAllColors(); } - void UpdateTrackbar(object sender, EventArgs e) { + void UpdateTrackbar(object sender, EventArgs e) + { TrackBar changedBar = ((TrackBar)sender); ShadowAxis part = ShadowAxis.X; - switch (changedBar.Name) { + switch (changedBar.Name) + { case "tbLeftRight": part = ShadowAxis.X; break; @@ -246,29 +276,34 @@ void UpdateTrackbar(object sender, EventArgs e) { } - void ResetShadows(object sender, EventArgs e) { + void ResetShadows(object sender, EventArgs e) + { tbLeftRight.Value = 0x28; tbBottomTop.Value = 0x28; tbBackFront.Value = 0x28; } - void RandomizeShadows(object sender, EventArgs e) { + void RandomizeShadows(object sender, EventArgs e) + { tbLeftRight.Value = _rand.Next(-127, 128); tbBottomTop.Value = _rand.Next(-127, 128); tbBackFront.Value = _rand.Next(-127, 128); } - private void lbColors_DrawItem(object sender, DrawItemEventArgs e) { + private void lbColors_DrawItem(object sender, DrawItemEventArgs e) + { e.DrawBackground(); SolidBrush textColor = new SolidBrush(((Control)sender).ForeColor); SolidBrush SelectedColor = new SolidBrush(Color.White); SolidBrush lightColor = new SolidBrush(((ColorPart)lbColors.Items[e.Index]).LightColor); SolidBrush darkColor = new SolidBrush(((ColorPart)lbColors.Items[e.Index]).DarkColor); - if (tmrRandom.Enabled) { + if (tmrRandom.Enabled) + { e.Graphics.DrawImageUnscaled(Resources.randomSlot, new Point(e.Bounds.X, e.Bounds.Y)); e.Graphics.DrawImageUnscaled(Resources.randomSlot, new Point(e.Bounds.X + 16, e.Bounds.Y)); } - else { + else + { e.Graphics.FillRectangle(lightColor, new Rectangle(new Point(e.Bounds.X, e.Bounds.Y), new Size(16, 16))); e.Graphics.FillRectangle(darkColor, new Rectangle(new Point(e.Bounds.X + 16, e.Bounds.Y), new Size(16, 16))); } @@ -278,51 +313,59 @@ private void lbColors_DrawItem(object sender, DrawItemEventArgs e) { new Point(e.Bounds.X + 32, e.Bounds.Y)); } - private void lbColors_SelectedValueChanged(object sender, EventArgs e) { + private void lbColors_SelectedValueChanged(object sender, EventArgs e) + { btnLightCol.BackColor = ((ColorPart)lbColors.SelectedItem).LightColor; btnDarkCol.BackColor = ((ColorPart)lbColors.SelectedItem).DarkColor; lbColors.Refresh(); } - private void btnTFCC2SCC_Click(object sender, EventArgs e) { + private void btnTFCC2SCC_Click(object sender, EventArgs e) + { ColorPart hatShirt = _chosenParts.FirstOrDefault(x => x.Name == "Hat"); IEnumerable hatTransform = _chosenParts.Where(x => x.Name == "Arms" || x.Name == "Shoulders" || x.Name == "Shirt"); ColorPart overall = _chosenParts.FirstOrDefault(x => x.Name == "Overalls Top"); IEnumerable overallTransform = _chosenParts.Where(x => x.Name.StartsWith("Leg") || x.Name == "Overalls Bottom"); - foreach (ColorPart cp in hatTransform) { + foreach (ColorPart cp in hatTransform) + { cp.LightColor = hatShirt.LightColor; cp.DarkColor = hatShirt.DarkColor; } - foreach (ColorPart cp in overallTransform) { + foreach (ColorPart cp in overallTransform) + { cp.LightColor = overall.LightColor; cp.DarkColor = overall.DarkColor; } ApplyAllColors(); } - private void btnTFShirtPants_Click(object sender, EventArgs e) { + private void btnTFShirtPants_Click(object sender, EventArgs e) + { ColorPart shirt = _chosenParts.FirstOrDefault(x => x.Name == "Shirt"); ColorPart overall = _chosenParts.FirstOrDefault(x => x.Name == "Overalls Top"); IEnumerable shirtTransform = _chosenParts.Where(x => x.Name == "Arms" || x.Name == "Shoulders" || x.Name == "Overalls Top"); IEnumerable overallTransform = _chosenParts.Where(x => x.Name.StartsWith("Leg") || x.Name == "Overalls Bottom"); - foreach (ColorPart cp in overallTransform) { + foreach (ColorPart cp in overallTransform) + { cp.LightColor = overall.LightColor; cp.DarkColor = overall.DarkColor; } - foreach (ColorPart cp in shirtTransform) { + foreach (ColorPart cp in shirtTransform) + { cp.LightColor = shirt.LightColor; cp.DarkColor = shirt.DarkColor; } ApplyAllColors(); } - private void btnTFShorties_Click(object sender, EventArgs e) { + private void btnTFShorties_Click(object sender, EventArgs e) + { ColorPart skin = _chosenParts.FirstOrDefault(x => x.Name == "Skin"); ColorPart legbottom = _chosenParts.FirstOrDefault(x => x.Name == "Leg Bottom"); @@ -332,7 +375,8 @@ private void btnTFShorties_Click(object sender, EventArgs e) { ApplyAllColors(); } - private void btnTFSCCSleeves_Click(object sender, EventArgs e) { + private void btnTFSCCSleeves_Click(object sender, EventArgs e) + { ColorPart skin = _chosenParts.FirstOrDefault(x => x.Name == "Skin"); ColorPart arm = _chosenParts.FirstOrDefault(x => x.Name == "Arms"); @@ -342,15 +386,18 @@ private void btnTFSCCSleeves_Click(object sender, EventArgs e) { ApplyAllColors(); } - protected override void OnFormClosing(FormClosingEventArgs e) { + protected override void OnFormClosing(FormClosingEventArgs e) + { e.Cancel = true; Hide(); } - private void btnTFCustomRestore_Click(object sender, EventArgs e) { + private void btnTFCustomRestore_Click(object sender, EventArgs e) + { IEnumerable customTransform = _chosenParts.Where(x => x.Name.StartsWith("Custom")); - foreach (ColorPart cPart in customTransform) { + foreach (ColorPart cPart in customTransform) + { cPart.LightColor = Color.White; cPart.DarkColor = Color.FromArgb(128, 128, 128); } @@ -358,11 +405,13 @@ private void btnTFCustomRestore_Click(object sender, EventArgs e) { ApplyAllColors(); } - private void button1_Click(object sender, EventArgs e) { + private void button1_Click(object sender, EventArgs e) + { cmsTransforms.Show((Control)sender, ((Control)sender).Width / 2, ((Control)sender).Height / 2); } - private void tmrRandom_Tick(object sender, EventArgs e) { + private void tmrRandom_Tick(object sender, EventArgs e) + { ExecuteRandomCC(); } @@ -372,7 +421,8 @@ private void tmrRandom_Tick(object sender, EventArgs e) { /// Diffuse color /// Ambient color /// - Color BlendColors(Color mainColor, Color shadeColor) { + Color BlendColors(Color mainColor, Color shadeColor) + { int r = (int)Math.Min((shadeColor.R / 1.25) + (mainColor.R / 2.0), 255); int g = (int)Math.Min((shadeColor.G / 1.25) + (mainColor.G / 2.0), 255); int b = (int)Math.Min((shadeColor.B / 1.25) + (mainColor.B / 2.0), 255); @@ -381,10 +431,11 @@ Color BlendColors(Color mainColor, Color shadeColor) { return result; } - public void marioSprite_Paint(object sender, PaintEventArgs e) { + public void marioSprite_Paint(object sender, PaintEventArgs e) + { Graphics g = e.Graphics; Bitmap bmp = new Bitmap(Resources.CC_Mario_big); - if (_chosenParts == null || _chosenParts.Count == 0) return; + if (_chosenParts == null || _chosenParts.Count == 0 || !(CurrentLightset.NormalColorcodeCompatible || CurrentLightset.SparkCompatible)) return; // Ho boy. ColorPart hatCol = _chosenParts.FirstOrDefault(x => x.Name == "Hat" || x.Name == "Hat & Shirt" || x.Name == "X3S Tint"); @@ -419,58 +470,77 @@ public void marioSprite_Paint(object sender, PaintEventArgs e) { g.DrawImage(bmp, rect, 0, 0, bmp.Width, bmp.Height, GraphicsUnit.Pixel, attr); } - private void btnRefresh_Click(object sender, EventArgs e) { + private void btnRefresh_Click(object sender, EventArgs e) + { LoadColorCodeRepo(); lbCCs.Items.Clear(); clbRandSel.Items.Clear(); - foreach (ColorCodeGS cc in colorCodeGamesharks) { + foreach (ColorCodeGS cc in colorCodeGamesharks) + { lbCCs.Items.Add(cc); clbRandSel.Items.Add(cc); } } - private void lbCCs_DoubleClick(object sender, EventArgs e) { - if (((ListBox)sender).SelectedItem != null) { + private void lbCCs_DoubleClick(object sender, EventArgs e) + { + if (((ListBox)sender).SelectedItem != null) + { ParseColorCode(((ColorCodeGS)((ListBox)sender).SelectedItem).Gameshark); marioSprite.Refresh(); } } - private void cbPartListOverride_SelectedIndexChanged(object sender, EventArgs e) { + private void UpdateColorPartList() + { + _chosenParts = new BindingList(CurrentLightset.Parts); + _chosenParts.ResetBindings(); + lbColors.DataSource = _chosenParts; + lbColors.ResetBindings(); + } + + private void cbPartListOverride_SelectedIndexChanged(object sender, EventArgs e) + { // Again, .ToList() clones. - switch (cbPartListOverride.SelectedIndex) { - case 0: { - _chosenParts = new BindingList(classicParts.ToList()); - _chosenParts.ResetBindings(); - lbColors.DataSource = _chosenParts; - lbColors.ResetBindings(); - if (modelStatus != ModelHeaderType.CLASSIC) { + switch (cbPartListOverride.SelectedIndex) + { + case 0: + { + CurrentLightset = DefaultLightsets.ClassicLightset; + if (modelStatus != ModelHeaderType.CLASSIC) + { MessageBox.Show( string.Format(Resources.incompatibleModelMsg, "CLASSIC", modelStatus.ToString()), "Whoa!", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } break; } - case 1: { - _chosenParts = new BindingList(sparkParts.ToList()); - _chosenParts.ResetBindings(); - lbColors.DataSource = _chosenParts; - lbColors.ResetBindings(); - if (modelStatus != ModelHeaderType.SPARK) { + case 1: + { + CurrentLightset = DefaultLightsets.SparkLightset; + if (modelStatus != ModelHeaderType.SPARK) + { MessageBox.Show( string.Format(Resources.incompatibleModelMsg, "SPARK", modelStatus.ToString()), "Whoa!", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } break; } - case 2: { - _chosenParts = new BindingList(x3sParts.ToList()); - _chosenParts.ResetBindings(); - lbColors.DataSource = _chosenParts; - lbColors.ResetBindings(); + case 2: + { + CurrentLightset = DefaultLightsets.X3SLightset; + MessageBox.Show( + // The most C# developer thing ever: using LINQ in unexpected places + Resources.x3sMsg, $"A{string.Join("", Enumerable.Range(1, _rand.Next(1, 10)).Select(x => "HA").ToArray())}HA", + MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + break; + } + case 3: + { + CurrentLightset = DefaultLightsets.PeachGrass; MessageBox.Show( - // The most C# developer thing ever: using LINQ in unexpected places - Resources.x3sMsg, $"A{string.Join("", Enumerable.Range(1, _rand.Next(1, 10)).Select(x => "HA").ToArray())}HA", + // Refer to the comment above + Resources.peachGrassMsg, $"A{string.Join("", Enumerable.Range(1, _rand.Next(2, 6)).Select(x => "HA").ToArray())}- WAIT NO-", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); break; } diff --git a/M64MM2/AppearanceForm.resx b/M64MM2/AppearanceForm.resx index 2eca6a8..b34e109 100644 --- a/M64MM2/AppearanceForm.resx +++ b/M64MM2/AppearanceForm.resx @@ -160,6 +160,9 @@ Otherwise, Mario's colors won't match the ones you pick here. X3S + + [Level] Castle Grounds + 170, 196 diff --git a/M64MM2/Properties/Resources.Designer.cs b/M64MM2/Properties/Resources.Designer.cs index 44c830d..bd39820 100644 --- a/M64MM2/Properties/Resources.Designer.cs +++ b/M64MM2/Properties/Resources.Designer.cs @@ -408,6 +408,15 @@ internal static string no { } } + /// + /// Busca una cadena traducida similar a This option is in early preview. Will most likely explode and will most likely kill the game if done in a level other than Castle Grounds. You've been warned.. + /// + internal static string peachGrassMsg { + get { + return ResourceManager.GetString("peachGrassMsg", resourceCulture); + } + } + /// /// Busca una cadena traducida similar a In banner: . /// diff --git a/M64MM2/Properties/Resources.resx b/M64MM2/Properties/Resources.resx index f7c19fb..a2fad29 100644 --- a/M64MM2/Properties/Resources.resx +++ b/M64MM2/Properties/Resources.resx @@ -323,4 +323,7 @@ Stability not guaranteed. The X3S Tint is only available for the X3 + Shading mods distributed by Project Comet or other affiliated people. Changing the tint in a non-X3S ROM may cause distortions, an unexpected color being changed, or nothing. + + This option is in early preview. Will most likely explode and will most likely kill the game if done in a level other than Castle Grounds. You've been warned. + \ No newline at end of file