Skip to content

Commit

Permalink
fixes, + skin color selector
Browse files Browse the repository at this point in the history
  • Loading branch information
Killface1980 committed Dec 25, 2016
1 parent 4ac18ea commit d81a148
Show file tree
Hide file tree
Showing 14 changed files with 107 additions and 82 deletions.
2 changes: 1 addition & 1 deletion About/About.xml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<ModMetaData>
<name>Facial Stuff A16</name>
<name>Facial Stuff 0.16.1.0</name>
<author>Killface</author>
<url></url>
<targetVersion>0.16.1386</targetVersion>
Expand Down
Binary file modified About/preview.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified Assemblies/RW_FacialStuff.dll
Binary file not shown.
5 changes: 2 additions & 3 deletions Defs/JobDefs/Clutter_Jobs.xml
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
<?xml version="1.0" encoding="utf-8" ?>
<JobDefs>

<JobDef>
<JobDef>
<defName>FaceStyleChanger</defName>
<driverClass>FaceStyling.Job_FaceStyling</driverClass>
<reportString>Going to the styling station.</reportString>
</JobDef>



</JobDefs>
2 changes: 1 addition & 1 deletion Defs/ThingDefs/Worktable.xml
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@
<Cleanliness>-15</Cleanliness>
</statBases>
<Size>(2,1)</Size>
<DesignationCategory>Production</DesignationCategory>
<DesignationCategory>Misc</DesignationCategory>
<Passability>PassThroughOnly</Passability>
<pathCost>60</pathCost>
<hasInteractionCell>True</hasInteractionCell>
Expand Down
37 changes: 0 additions & 37 deletions Source/RW_FacialStuff/Detouring/_PawnGraphicSet.cs
Original file line number Diff line number Diff line change
Expand Up @@ -154,43 +154,6 @@ public new void ResolveAllGraphics()
ResolveApparelGraphics();


SaveablePawn pawnSave = MapComponent_FacialStuff.GetCache(pawn);
if (!pawnSave.sessionOptimized)
{
// Build the empty head index once to be used for the blank heads
if (HeadIndex.Count == 0)
for (int i = 0; i < 1024; i++)
{
HeadIndex.Add(i.ToString("0000"), null);
}
// Get the first free index and go on
foreach (KeyValuePair<string, Pawn> pair in HeadIndex)
{
if (pair.Value == null)
{
string index = pair.Key;
HeadIndex.Remove(pair.Key);
HeadIndex.Add(index, pawn);

pawnSave.headGraphicIndex = "Heads/Blank/" + pair.Key;
GraphicDatabaseHeadRecordsModded.headsModded.Add(new GraphicDatabaseHeadRecordsModded.HeadGraphicRecordModded(pawn));
break;
}
}

//pawnSave.headGraphicIndex = "Heads/Blank/" + GraphicDatabaseHeadRecordsModded.headIndex.ToString("0000");
//GraphicDatabaseHeadRecordsModded.headsModded.Add(new GraphicDatabaseHeadRecordsModded.HeadGraphicRecordModded(pawn));
//GraphicDatabaseHeadRecordsModded.headIndex += 1;
}

if (pawn.RaceProps.hasGenders && hairGraphic != null)
{
headGraphic = GraphicDatabaseHeadRecordsModded.ModifiedAlienHead(pawn, pawn.story.SkinColor, hairGraphic);
}
else
{
headGraphic = GraphicDatabaseHeadRecords.GetHeadNamed(pawn.story.HeadGraphicPath, pawn.story.SkinColor);
}

}
else
Expand Down
16 changes: 8 additions & 8 deletions Source/RW_FacialStuff/Detouring/_PawnSkinColors.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ namespace RW_FacialStuff.Detouring
{
public static class _PawnSkinColors
{
private struct SkinColorData
public struct SkinColorData
{
public float melanin;

Expand All @@ -23,7 +23,7 @@ public SkinColorData(float melanin, float selector, Color color)
}
}

private static readonly SkinColorData[] _SkinColors = {
public static readonly SkinColorData[] _SkinColors = {
new SkinColorData(0f, 0f, new Color32(89,49,36, 255)),
new SkinColorData(0.1f, 0.085f, new Color32(127,71,51,255)),
new SkinColorData(0.25f, 0.175f, new Color32(165,93,41,255)),
Expand Down Expand Up @@ -52,15 +52,15 @@ public static bool IsDarkSkin(Color color)
}

[Detour(typeof(PawnSkinColors), bindingFlags = (BindingFlags.Static | BindingFlags.Public))]
public static Color GetSkinColor(float skinWhiteness)
public static Color GetSkinColor(float melanin)
{
int skinDataLeftIndexByWhiteness = GetSkinDataIndexOfMelanin(skinWhiteness);
if (skinDataLeftIndexByWhiteness == _SkinColors.Length - 1)
int skinDataLeftIndexByMelanin = GetSkinDataIndexOfMelanin(melanin);
if (skinDataLeftIndexByMelanin == _SkinColors.Length - 1)
{
return _SkinColors[skinDataLeftIndexByWhiteness].color;
return _SkinColors[skinDataLeftIndexByMelanin].color;
}
float t = Mathf.InverseLerp(_SkinColors[skinDataLeftIndexByWhiteness].melanin, _SkinColors[skinDataLeftIndexByWhiteness + 1].melanin, skinWhiteness);
return Color.Lerp(_SkinColors[skinDataLeftIndexByWhiteness].color, _SkinColors[skinDataLeftIndexByWhiteness + 1].color, t);
float t = Mathf.InverseLerp(_SkinColors[skinDataLeftIndexByMelanin].melanin, _SkinColors[skinDataLeftIndexByMelanin + 1].melanin, melanin);
return Color.Lerp(_SkinColors[skinDataLeftIndexByMelanin].color, _SkinColors[skinDataLeftIndexByMelanin + 1].color, t);
}

[Detour(typeof(RimWorld.PawnSkinColors), bindingFlags = (BindingFlags.Static | BindingFlags.NonPublic))]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ public void DrawIcon(Rect rect)
private static float _titleHeight;
private static float _previewSize;
private static float _iconSize;
// private static Texture2D _icon;
// private static Texture2D _icon;
private static float _margin;
private static float _listWidth;
private static int _columns;
Expand All @@ -137,6 +137,8 @@ public void DrawIcon(Rect rect)
private static Color _newColour;
private static Color originalColour;

private SaveablePawn pawnSave;

private static ColorWrapper colourWrapper;

private Vector2 _scrollPosition = Vector2.zero;
Expand Down Expand Up @@ -224,7 +226,7 @@ public override Vector2 InitialSize
{
get
{
return new Vector2(_previewSize + _margin + _listWidth + 36f, 40f + _previewSize * 2f + _margin * 3f + 38f + 36f);
return new Vector2(_previewSize + _margin + _listWidth + 36f, 40f + _previewSize * 2f + _margin * 3f + 38f + 36f + 80f);
}
}

Expand All @@ -235,7 +237,7 @@ static Dialog_FaceStyling()
_previewSize = 250f;
// _previewSize = 100f;
_iconSize = 24f;
// _icon = ContentFinder<Texture2D>.Get("ClothIcon");
// _icon = ContentFinder<Texture2D>.Get("ClothIcon");
_margin = 6f;
_listWidth = 450f;
// _listWidth = 200f;
Expand All @@ -252,17 +254,19 @@ static Dialog_FaceStyling()

public Dialog_FaceStyling(Pawn p)
{
SaveablePawn pawnSave = MapComponent_FacialStuff.GetCache(p);
pawn = p;
pawnSave = MapComponent_FacialStuff.GetCache(pawn);
if (pawnSave.BeardDef == null)
pawnSave.BeardDef = DefDatabase<BeardDef>.GetNamed("Beard_Shaved");
absorbInputAroundWindow = false;
forcePause = true;
closeOnClickedOutside = false;
pawn = p;
originalColour = (_newColour = pawnSave.HairColorOrg);

colourWrapper = new ColorWrapper(NewColour);

_newMelanin = (originalMelanin = pawn.story.melanin);

_newHair = (originalHair = pawn.story.hairDef);
_newBeard = (originalBeard = pawnSave.BeardDef);
_newMouth = (originalMouth = pawnSave.MouthDef);
Expand All @@ -274,9 +278,9 @@ public Dialog_FaceStyling(Pawn p)
{
DisplayGraphics[i] = new GraphicsDisp();
}
SetGraphicSlot(GraphicSlotGroup.Body, pawn, GraphicGetter_NakedHumanlike.GetNakedBodyGraphic(pawn.story.bodyType, ShaderDatabase.CutoutSkin, pawn.story.SkinColor), pawn.def.uiIcon, pawn.story.SkinColor);
SetGraphicSlot(GraphicSlotGroup.Head, pawn, GraphicDatabaseHeadRecordsModded.GetModdedHeadNamed(pawn, true, pawn.story.SkinColor), pawn.def.uiIcon, pawn.story.SkinColor);
// SetGraphicSlot(GraphicSlotGroup.Head, pawn, GraphicDatabaseHeadRecords.GetHeadNamed(pawn.story.HeadGraphicPath, pawn.story.SkinColor), pawn.def.uiIcon, pawn.story.SkinColor);
SetGraphicSlot(GraphicSlotGroup.Body, pawn, GraphicGetter_NakedHumanlike.GetNakedBodyGraphic(pawn.story.bodyType, ShaderDatabase.CutoutSkin, _PawnSkinColors.GetSkinColor(NewMelanin)), pawn.def.uiIcon, _PawnSkinColors.GetSkinColor(NewMelanin));
SetGraphicSlot(GraphicSlotGroup.Head, pawn, GraphicDatabaseHeadRecordsModded.GetModdedHeadNamed(pawn, true, _PawnSkinColors.GetSkinColor(NewMelanin)), pawn.def.uiIcon, _PawnSkinColors.GetSkinColor(NewMelanin));
// SetGraphicSlot(GraphicSlotGroup.Head, pawn, GraphicDatabaseHeadRecords.GetHeadNamed(pawn.story.HeadGraphicPath,_PawnSkinColors.GetSkinColor(NewMelanin))), pawn.def.uiIcon,_PawnSkinColors.GetSkinColor(NewMelanin)));
SetGraphicSlot(GraphicSlotGroup.Hair, pawn, HairGraphic(pawn.story.hairDef), pawn.def.uiIcon, pawn.story.hairColor);
SetGraphicSlot(GraphicSlotGroup.Eyes, pawn, EyeGraphic(pawnSave.EyeDef), pawn.def.uiIcon, Color.black);
SetGraphicSlot(GraphicSlotGroup.Brows, pawn, BrowGraphic(pawnSave.BrowDef), pawn.def.uiIcon, pawn.story.hairColor * new Color(0.3f, 0.3f, 0.3f));
Expand Down Expand Up @@ -315,7 +319,7 @@ public override void PostOpen()

public override void PreClose()
{
while (Find.WindowStack.TryRemove(typeof(Dialog_ColorPicker), false))
while (Find.WindowStack.TryRemove(typeof(Dialog_ColorPicker), false))
{
}
}
Expand Down Expand Up @@ -392,6 +396,20 @@ private Graphic MouthGraphic(MouthDef def)

public string Page = "hair";

public float NewMelanin
{
get { return _newMelanin; }
set
{
_newMelanin = value;
SetGraphicSlot(GraphicSlotGroup.Body, pawn, GraphicGetter_NakedHumanlike.GetNakedBodyGraphic(pawn.story.bodyType, ShaderDatabase.CutoutSkin, _PawnSkinColors.GetSkinColor(_newMelanin)), pawn.def.uiIcon, _PawnSkinColors.GetSkinColor(_newMelanin));
SetGraphicSlot(GraphicSlotGroup.Head, pawn, GraphicDatabaseHeadRecordsModded.GetModdedHeadNamed(pawn, true, _PawnSkinColors.GetSkinColor(_newMelanin)), pawn.def.uiIcon, _PawnSkinColors.GetSkinColor(_newMelanin));

}
}
private float _newMelanin;
private float originalMelanin;

private Graphic ApparelGraphic(ThingDef def, BodyType bodyType)
{
Graphic result;
Expand Down Expand Up @@ -455,10 +473,11 @@ private void DrawUI(Rect parentRect)
Rect pawnHeadRect = new Rect(0f, -10f, _previewSize, _previewSize);
Rect pawnRect = new Rect(0f, 0f, _previewSize, _previewSize);
Rect labelRect = new Rect(0f, pawnRect.yMax - vector.y, vector.x, vector.y);
Rect selectionRect = new Rect(0f, pawnRect.yMax + _margin, _previewSize, _previewSize);
Rect melaninRect = new Rect(0f, labelRect.yMax + _margin, _previewSize, 30f);
Rect selectionRect = new Rect(0f, melaninRect.yMax + _margin, _previewSize, _previewSize);
Rect listRect = new Rect(_previewSize + _margin, 0f, _listWidth, parentRect.height - _margin * 2);

labelRect = labelRect.CenteredOnXIn(pawnRect);
SaveablePawn pawnSave = MapComponent_FacialStuff.GetCache(pawn);
for (int i = 0; i < DisplayGraphics.Length; i++)
{
if (pawn.gender == Gender.Male)
Expand Down Expand Up @@ -533,6 +552,15 @@ private void DrawUI(Rect parentRect)

GUI.DrawTexture(new Rect(labelRect.xMin - 3f, labelRect.yMin, labelRect.width + 6f, labelRect.height), _nameBackground);
Widgets.Label(labelRect, nameStringShort);
float width = _previewSize / (_PawnSkinColors._SkinColors.Length) - 10f;
float spacing = 10f;
Rect setMelanin = new Rect(0f, melaninRect.y, width, melaninRect.height);
foreach (var skinColorData in _PawnSkinColors._SkinColors)
{
DrawMelaninPickerCell(skinColorData, setMelanin);
setMelanin.x += setMelanin.width + 10f;
}

Widgets.DrawMenuSection(listRect);

Rect set = new Rect(selectionRect);
Expand All @@ -552,6 +580,7 @@ private void DrawUI(Rect parentRect)
// }



if (Widgets.ButtonText(set, "Hair"))
Page = "hair";
set.x += set.width + 10f;
Expand Down Expand Up @@ -686,7 +715,6 @@ private void DrawUI(Rect parentRect)
set.width = selectionRect.width / 7.5f - 10f;
set.x = selectionRect.x;


DrawColorPickerCell(originalColour, set);
set.x += set.width * 1.5f + 10f;

Expand Down Expand Up @@ -731,6 +759,33 @@ private void DrawUI(Rect parentRect)
GUI.EndGroup();
}

private void DrawMelaninPickerCell(_PawnSkinColors.SkinColorData data, Rect rect)
{
Widgets.DrawBoxSolid(rect, data.color);
string text = data.ToString();
Widgets.DrawHighlightIfMouseover(rect);
if (data.melanin == NewMelanin)
{
Widgets.DrawHighlightSelected(rect);
text += "\n(selected)";
}
else
{
if (data.melanin == originalMelanin)
{
Widgets.DrawAltRect(rect);
text += "\n(original)";
}
}
TooltipHandler.TipRegion(rect, text);
if (Widgets.ButtonInvisible(rect))
{

NewMelanin = data.melanin;
}
}


private void DrawHairPicker(Rect rect)
{
Rect rect2 = rect.ContractedBy(1f);
Expand Down Expand Up @@ -959,7 +1014,7 @@ private void DrawBeardPickerCell(BeardDef beard, Rect rect)
if (Widgets.ButtonInvisible(rect))
{
NewBeard = beard;
while (Find.WindowStack.TryRemove(typeof(Dialog_ColorPicker)))
while (Find.WindowStack.TryRemove(typeof(Dialog_ColorPicker)))
{
}
Find.WindowStack.Add(new Dialog_ColorPicker(colourWrapper, delegate
Expand Down Expand Up @@ -994,7 +1049,7 @@ private void DrawMouthPickerCell(MouthDef mouth, Rect rect)
if (Widgets.ButtonInvisible(rect))
{
NewMouth = mouth;
Find.WindowStack.TryRemove(typeof(Dialog_ColorPicker));
Find.WindowStack.TryRemove(typeof(Dialog_ColorPicker));
}
}

Expand All @@ -1020,7 +1075,7 @@ private void DrawEyePickerCell(EyeDef eye, Rect rect)
if (Widgets.ButtonInvisible(rect))
{
NewEye = eye;
Find.WindowStack.TryRemove(typeof(Dialog_ColorPicker));
Find.WindowStack.TryRemove(typeof(Dialog_ColorPicker));
}
}

Expand All @@ -1046,7 +1101,7 @@ private void DrawBrowPickerCell(BrowDef brow, Rect rect)
if (Widgets.ButtonInvisible(rect))
{
NewBrow = brow;
Find.WindowStack.TryRemove(typeof(Dialog_ColorPicker));
Find.WindowStack.TryRemove(typeof(Dialog_ColorPicker));
}
}

Expand All @@ -1071,9 +1126,18 @@ private void DrawColorPickerCell(Color color, Rect rect)
TooltipHandler.TipRegion(rect, text);
if (Widgets.ButtonInvisible(rect))
{
NewColour = color;

Find.WindowStack.TryRemove(typeof(Dialog_ColorPicker));
while (Find.WindowStack.TryRemove(typeof(Dialog_ColorPicker)))
{
}
colourWrapper.Color = color;
Find.WindowStack.Add(new Dialog_ColorPicker(colourWrapper, delegate
{
NewColour = colourWrapper.Color;
}, false, true)
{
initialPosition = new Vector2(windowRect.xMax + _margin, windowRect.yMin),
});
}
}

Expand All @@ -1086,8 +1150,8 @@ public override void DoWindowContents(Rect inRect)
Widgets.Label(rect, _title);
Text.Anchor = TextAnchor.UpperLeft;
Text.Font = GameFont.Small;
// Rect iconPosition = new Rect(0f, 0f, _iconSize, _iconSize).CenteredOnYIn(rect);
// GUI.DrawTexture(iconPosition, _icon);
// Rect iconPosition = new Rect(0f, 0f, _iconSize, _iconSize).CenteredOnYIn(rect);
// GUI.DrawTexture(iconPosition, _icon);
DrawUI(new Rect(0f, _titleHeight, inRect.width, inRect.height - _titleHeight - 25f - _margin * 2));
DialogUtility.DoNextBackButtons(inRect, "FacialStuffColorChangerButtonAccept".Translate(), delegate
{
Expand All @@ -1097,6 +1161,7 @@ public override void DoWindowContents(Rect inRect)
// update story to persist across save/load
pawn.story.hairColor = NewColour;
pawn.story.hairDef = NewHair;
pawn.story.melanin = NewMelanin;

// FS additions
SaveablePawn pawnSave = MapComponent_FacialStuff.GetCache(pawn);
Expand Down
Loading

0 comments on commit d81a148

Please sign in to comment.