Skip to content
Open
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
2 changes: 1 addition & 1 deletion .gitattributes
Original file line number Diff line number Diff line change
Expand Up @@ -16,4 +16,4 @@
*.rtf diff=astextplain
*.RTF diff=astextplain

Source/ export-ignore
Source/ export-ignore
Binary file modified 1.2/Assemblies/AlienRace.dll
Binary file not shown.
Binary file added 1.2/Shader/shader
Binary file not shown.
8 changes: 4 additions & 4 deletions Source/AlienRace/AlienRace/AlienPartGenerator.BodyAddon.cs
Original file line number Diff line number Diff line change
Expand Up @@ -130,19 +130,19 @@ public virtual bool CanDrawAddon(Pawn pawn) =>
if (variantCounting <= 0)
variantCounting = 1;

ExposableValueTuple<Color, Color> channel = pawn.GetComp<AlienComp>().GetChannel(this.ColorChannel);
ExposableValueTuple<Color, Color, Color> channel = pawn.GetComp<AlienComp>().GetChannel(this.ColorChannel);
int tv;

//Log.Message($"{pawn.Name.ToStringFull}\n{channel.first.ToString()} | {pawn.story.hairColor}");

return !returnPath.NullOrEmpty() ?
GraphicDatabase.Get<Graphic_Multi_RotationFromData>(returnPath += (tv = (savedIndex.HasValue ? (sharedIndex = savedIndex.Value % variantCounting) :
TriColorGraphicDatabase.Get<Graphic_Multi_RotationFromData>(returnPath += (tv = (savedIndex.HasValue ? (sharedIndex = savedIndex.Value % variantCounting) :
(this.linkVariantIndexWithPrevious ?
sharedIndex % variantCounting :
(sharedIndex = Rand.Range(min: 0, variantCounting))))) == 0 ? "" : tv.ToString(),
ContentFinder<Texture2D>.Get(returnPath + "_northm", reportFailure: false) == null ? this.ShaderType.Shader : ShaderDatabase.CutoutComplex, //ShaderDatabase.Transparent,
ContentFinder<Texture2D>.Get(returnPath + "_northm", reportFailure: false) == null ? this.ShaderType.Shader : TriColorShaderDatabase.Tricolor, //ShaderDatabase.Transparent,
this.drawSize * 1.5f,
channel.first, channel.second, new GraphicData
channel.first, channel.second, channel.third, new GraphicData
{
drawRotated = !this.drawRotated
}) :
Expand Down
75 changes: 52 additions & 23 deletions Source/AlienRace/AlienRace/AlienPartGenerator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@
using Verse;

namespace AlienRace
{
{
using System.Runtime.ExceptionServices;
using System.Text;

public partial class AlienPartGenerator
Expand Down Expand Up @@ -39,20 +40,35 @@ public partial class AlienPartGenerator
public string RandomAlienHead(string userpath, Pawn pawn) => GetAlienHead(userpath, (this.useGenderedHeads ? pawn.gender.ToString() : ""), pawn.GetComp<AlienComp>().crownType = this.aliencrowntypes[Rand.Range(min: 0, this.aliencrowntypes.Count)]);

public static string GetAlienHead(string userpath, string gender, string crowntype) => userpath.NullOrEmpty() ? "" : userpath + (userpath == GraphicPaths.VANILLA_HEAD_PATH ? gender + "/" : "") + (!gender.NullOrEmpty() ? gender + "_" : "") + crowntype;

public Graphic GetNakedGraphic(BodyTypeDef bodyType, Shader shader, Color skinColor, Color skinColorSecond, string userpath, string gender) =>
GraphicDatabase.Get(typeof(Graphic_Multi), GetNakedPath(bodyType, userpath, this.useGenderedBodies ? gender : ""), shader, Vector2.one,
GraphicDatabase.Get(typeof(Graphic_Multi), GetNakedPath(bodyType, userpath, this.useGenderedBodies ? gender : ""), shader, Vector2.one,
skinColor, skinColorSecond, data: null, shaderParameters: null);

// New GetNakedGraphic, gets our new Graphic type
public Graphic GetNakedGraphic(BodyTypeDef bodyType, Shader shader, Color skinColor, Color skinColorSecond, Color skinColorThird, string userpath, string gender) =>
TriColorGraphicDatabase.Get(typeof(Graphic_Multi), GetNakedPath(bodyType, userpath, this.useGenderedBodies ? gender : ""), shader, Vector2.one,
skinColor, skinColorSecond, skinColorThird, data: null, shaderParameters: null);
//GraphicDatabase.Get<Graphic_Multi>(path: GetNakedPath(bodyType: bodyType, userpath: userpath, gender: this.useGenderedBodies ? gender : ""), shader: shader, drawSize: Vector2.one, color: skinColor, colorTwo: skinColorSecond);

public static string GetNakedPath(BodyTypeDef bodyType, string userpath, string gender) => userpath + (!gender.NullOrEmpty() ? gender + "_" : "") + "Naked_" + bodyType;

public Color SkinColor(Pawn alien, bool first = true)

// New SkinColor, not really that different.
public Color SkinColor(Pawn alien, int channel = 1)
{

AlienComp alienComp = alien.TryGetComp<AlienComp>();
ExposableValueTuple<Color, Color> skinColors = alienComp.GetChannel(channel: "skin");
return first ? skinColors.first : skinColors.second;
ExposableValueTuple<Color, Color, Color> skinColors = alienComp.GetChannel(channel: "skin");
switch (channel)
{
default:
return skinColors.first;
case 2:
return skinColors.second;
case 3:
return skinColors.third;
}
}

public void GenerateMeshsAndMeshPools()
Expand Down Expand Up @@ -141,11 +157,14 @@ void AddToStringBuilder(string s)
Log.Message($"Loaded body addon variants for {this.alienProps.defName}\n{logBuilder}");
}


// Added third generator
public class ColorChannelGenerator
{
public string name = "";
public ColorGenerator first;
public ColorGenerator second;
public ColorGenerator third;
}


Expand All @@ -164,41 +183,44 @@ public class AlienComp : ThingComp
public List<Graphic> addonGraphics;
public List<int> addonVariants;

private Dictionary<string, ExposableValueTuple<Color, Color>> colorChannels;
private Dictionary<string, ExposableValueTuple<Color, Color, Color>> colorChannels;

public Dictionary<string, ExposableValueTuple<Color, Color>> ColorChannels
public Dictionary<string, ExposableValueTuple<Color, Color, Color>> ColorChannels
{
get
{
if (this.colorChannels == null || !this.colorChannels.Any())
{
this.colorChannels = new Dictionary<string, ExposableValueTuple<Color, Color>>();
this.colorChannels = new Dictionary<string, ExposableValueTuple<Color, Color, Color>>();
Pawn pawn = (Pawn) this.parent;
ThingDef_AlienRace alienProps = ((ThingDef_AlienRace) this.parent.def);
AlienPartGenerator apg = alienProps.alienRace.generalSettings.alienPartGenerator;

this.colorChannels.Add(key: "base", new ExposableValueTuple<Color, Color>(Color.white, Color.white));
this.colorChannels.Add(key: "hair", new ExposableValueTuple<Color, Color>(Color.clear, Color.clear));
this.colorChannels.Add(key: "base", new ExposableValueTuple<Color, Color, Color>(Color.white, Color.white, Color.white));
this.colorChannels.Add(key: "hair", new ExposableValueTuple<Color, Color, Color>(Color.clear, Color.clear, Color.clear));
Color skinColor = PawnSkinColors.GetSkinColor(pawn.story.melanin);
this.colorChannels.Add(key: "skin", new ExposableValueTuple<Color, Color>(skinColor, skinColor));
this.colorChannels.Add(key: "skin", new ExposableValueTuple<Color, Color, Color>(skinColor, skinColor, skinColor));

foreach (ColorChannelGenerator channel in apg.colorChannels)
{
if (!this.colorChannels.ContainsKey(channel.name))
this.colorChannels.Add(channel.name, new ExposableValueTuple<Color, Color>(Color.white, Color.white));
ExposableValueTuple<Color, Color> colors = this.colorChannels[channel.name];
this.colorChannels.Add(channel.name, new ExposableValueTuple<Color, Color, Color>(Color.white, Color.white, Color.white));
ExposableValueTuple<Color, Color, Color> colors = this.colorChannels[channel.name];
if (channel.first != null)
colors.first = this.GenerateColor(channel.first);
if (channel.second != null)
colors.second = this.GenerateColor(channel.second);
if (channel.third != null)
colors.third = this.GenerateColor(channel.third);
}

ExposableValueTuple<Color, Color> hairColors = this.colorChannels[key: "hair"];
ExposableValueTuple<Color, Color, Color> hairColors = this.colorChannels[key: "hair"];
if (hairColors.first == Color.clear)
{
Color color = PawnHairColors.RandomHairColor(pawn.story.SkinColor, pawn.ageTracker.AgeBiologicalYears);
hairColors.first = color;
hairColors.second = color;
hairColors.third = color;
}

pawn.story.hairColor = hairColors.first;
Expand Down Expand Up @@ -228,7 +250,10 @@ public Color GenerateColor(ColorGenerator gen)
{
case ColorGenerator_CustomAlienChannel ac:
string[] split = ac.colorChannel.Split('_');
return split[1] == "1" ? this.ColorChannels[split[0]].first : this.ColorChannels[split[0]].second;
if (split[1] == "1") { return this.ColorChannels[split[0]].first; }
if (split[1] == "3") { return this.colorChannels[split[0]].third; }
return this.ColorChannels[split[0]].second;
//return split[1] == "1" ? this.ColorChannels[split[0]].first : this.ColorChannels[split[0]].second;
default:
return gen.NewRandomizedColor();
}
Expand All @@ -253,7 +278,7 @@ public override void PostExposeData()
Scribe_Collections.Look(ref this.colorChannels, label: "colorChannels");
}

public ExposableValueTuple<Color, Color> GetChannel(string channel)
public ExposableValueTuple<Color, Color, Color> GetChannel(string channel)
{
if (this.ColorChannels.ContainsKey(channel))
return this.ColorChannels[channel];
Expand All @@ -264,16 +289,17 @@ public ExposableValueTuple<Color, Color> GetChannel(string channel)
foreach (ColorChannelGenerator apgChannel in apg.colorChannels)
if (apgChannel.name == channel)
{
this.ColorChannels.Add(channel, new ExposableValueTuple<Color, Color>());
this.ColorChannels.Add(channel, new ExposableValueTuple<Color, Color, Color>());
if (apgChannel.first != null)
this.ColorChannels[channel].first = this.GenerateColor(apgChannel.first);
if (apgChannel.second != null)
this.ColorChannels[channel].second = this.GenerateColor(apgChannel.second);

if (apgChannel.third != null)
this.ColorChannels[channel].third = this.GenerateColor(apgChannel.third);
return this.ColorChannels[channel];
}

return new ExposableValueTuple<Color, Color>(Color.white, Color.white);
return new ExposableValueTuple<Color, Color, Color>(Color.white, Color.white, Color.white);
}

internal void AssignProperMeshs()
Expand All @@ -296,25 +322,28 @@ private static void RegenerateColorchannels()
}
}

public class ExposableValueTuple<K, V> : IExposable
public class ExposableValueTuple<K, V, P> : IExposable
{
public K first;
public V second;
public P third;

public ExposableValueTuple()
{
}

public ExposableValueTuple(K first, V second)
public ExposableValueTuple(K first, V second, P third)
{
this.first = first;
this.second = second;
this.third = third;
}

public void ExposeData()
{
Scribe_Values.Look(ref this.first, label: "first");
Scribe_Values.Look(ref this.second, label: "second");
Scribe_Values.Look(ref this.third, label: "third");
}
}

Expand Down
Loading