Skip to content

Commit

Permalink
Merge pull request #891 from Tachyonite/test
Browse files Browse the repository at this point in the history
Polishing and HAR update
  • Loading branch information
Zeracronius authored Jan 31, 2024
2 parents c34df0a + aab85c6 commit 8eb1597
Show file tree
Hide file tree
Showing 13 changed files with 173 additions and 159 deletions.
22 changes: 0 additions & 22 deletions Schemas/MorphDef.xsd
Original file line number Diff line number Diff line change
Expand Up @@ -136,27 +136,6 @@
<xs:element name="revertedMemoryBP" type="xs:string" minOccurs="0" maxOccurs="1" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="TraitSettings">
<xs:sequence>
<xs:element name="forcedTraits" minOccurs="0" maxOccurs="1">
<xs:complexType>
<xs:sequence>
<xs:element name="li" minOccurs="1" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="chance" type="xs:float" minOccurs="0" maxOccurs="1" />
<xs:element name="commonalityMale" type="xs:float" minOccurs="0" maxOccurs="1" />
<xs:element name="commonalityFemale" type="xs:float" minOccurs="0" maxOccurs="1" />
<xs:element name="defName" type="xs:string" maxOccurs="1" minOccurs="1" />
<xs:element name="degree" type="xs:int" maxOccurs="1" minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:complexType name="AddedAspect">
<xs:sequence>
<xs:element name="def" type="xs:string" minOccurs="1" maxOccurs="1" />
Expand Down Expand Up @@ -273,7 +252,6 @@
<xs:element name="statModifiers" type="StatModifiersList" minOccurs="0" maxOccurs="1" />
<xs:element name="thoughtSettings" type="HybridThoughtSettings" maxOccurs="1" minOccurs="0" />
<xs:element name="graphicsSettings" type="GraphicsSettings" minOccurs="0" maxOccurs="1" />
<xs:element name="traitSettings" type="TraitSettings" minOccurs="0" maxOccurs="1" />

<xs:element name="explicitHybridRace" type="xs:string" minOccurs="0" maxOccurs="1">
<xs:annotation>
Expand Down
Binary file modified Source/Dependencies/AlienRace.dll
Binary file not shown.
66 changes: 41 additions & 25 deletions Source/Pawnmorphs/Esoteria/Chambers/MutaChamber.cs
Original file line number Diff line number Diff line change
Expand Up @@ -311,6 +311,8 @@ private void SelectorComp_OnClick([NotNull] AnimalSelectorComp comp)
comp.SpeciesFilter = (x) => x.GetModExtension<ChamberAnimalTfController>()?.CanInitiateTransformation(pawn, x, this) ?? true;
}

// ThingDefs with classes derived from MutaChamber
private static IList<ThingDef> chamberDefs;

/// <summary>
/// Finds the Mutachamber casket for.
Expand All @@ -320,40 +322,54 @@ private void SelectorComp_OnClick([NotNull] AnimalSelectorComp comp)
/// <param name="ignoreOtherReservations">if set to <c>true</c> [ignore other reservations].</param>
/// <param name="use">The use.</param>
/// <returns></returns>
public static MutaChamber FindMutaChamberFor(Pawn p, Pawn traveler, bool ignoreOtherReservations = false,
ChamberUse? use = null)
public static MutaChamber FindMutaChamberFor(Pawn p, Pawn traveler, bool ignoreOtherReservations = false, ValueTuple<ChamberUse, ChamberUse>? use = null)
{
IEnumerable<ThingDef> enumerable = from def in DefDatabase<ThingDef>.AllDefs
where typeof(MutaChamber).IsAssignableFrom(def.thingClass)
select def;
foreach (ThingDef item in enumerable)
if (chamberDefs == null)
chamberDefs = DefDatabase<ThingDef>.AllDefs.Where(x => typeof(MutaChamber).IsAssignableFrom(x.thingClass)).ToList();


bool Validator(Thing x)
{
bool Validator(Thing x)
var mutaChamber = (MutaChamber)x;
ChamberUse currentUse = mutaChamber.CurrentUse;
if ((use == null || use.Value.Item1 == currentUse || use.Value.Item2 == currentUse)
&& mutaChamber.CanAcceptPawns
&& mutaChamber.Flickable.SwitchIsOn)
{
int result;
var mutaChamber = (MutaChamber)x;
if (mutaChamber.CanAcceptPawns
&& mutaChamber.Flickable.SwitchIsOn
&& (use == null || use == mutaChamber.CurrentUse))
{
Pawn p2 = traveler;
LocalTargetInfo target = x;
bool ignoreOtherReservations2 = ignoreOtherReservations;
result = p2.CanReserve(target, 1, -1, null, ignoreOtherReservations2) ? 1 : 0;
}
else
return traveler.CanReserve(x, 1, -1, null, ignoreOtherReservations);
}
return false;
}

// For each type of chamber defs.
for (int i = 0; i < chamberDefs.Count; i++)
{
ThingDef def = chamberDefs[i];

var chambers = p.Map.listerThings.ThingsOfDef(def);
int chambersCount = chambers.Count;
if (chambersCount == 0)
continue;

bool anyTargets = false;
for (int chamberIndex = chambers.Count - 1; chamberIndex >= 0; chamberIndex--)
{
// Check if any chambers are available before doing pathing.
if (Validator(chambers[chamberIndex]))
{
result = 0;
anyTargets = true;
break;
}

return result != 0;
}
if (anyTargets == false)
continue;

var building_MutagenChamber =
(MutaChamber)GenClosest.ClosestThingReachable(p.Position, p.Map, ThingRequest.ForDef(item),
var building_MutagenChamber = (MutaChamber)GenClosest.ClosestThingReachable(p.Position, p.Map, ThingRequest.ForDef(def),
PathEndMode.InteractionCell, TraverseParms.For(traveler),
9999f, Validator);
if (building_MutagenChamber != null) return building_MutagenChamber;

if (building_MutagenChamber != null)
return building_MutagenChamber;
}

return null;
Expand Down
114 changes: 54 additions & 60 deletions Source/Pawnmorphs/Esoteria/HPatches/FloatMenuMakerMapPatches.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,80 +24,74 @@ internal static class FloatMenuMakerMapPatches
[HarmonyPatch("AddHumanlikeOrders")]
internal static class AddHumanlikeOrdersPatch
{
private static ValueTuple<Pawn, bool, string, string> _pawnCanTransformCache = (null, false, string.Empty, string.Empty);

[HarmonyPrefix]
private static bool Prefix_AddHumanlikeOrders(Vector3 clickPos, Pawn pawn, List<FloatMenuOption> opts)
{
if (pawn.health.capacities.CapableOf(PawnCapacityDefOf.Manipulation))
foreach (LocalTargetInfo localTargetInfo3 in GenUI.TargetsAt(clickPos, TargetingParameters.ForRescue(pawn), true).MakeSafe())
{
IEnumerable<LocalTargetInfo> targets = GenUI.TargetsAt(clickPos, TargetingParameters.ForRescue(pawn), true);
if (targets != null)
{
LocalTargetInfo localTargetInfo4 = localTargetInfo3;
var victim = (Pawn)localTargetInfo4.Thing;
MutagenDef mutagen = MutagenDefOf.MergeMutagen;
if (mutagen.CanTransform(victim)
&& pawn.CanReserveAndReach(victim, PathEndMode.OnCell, Danger.Deadly, 1, -1, null, true))
foreach (LocalTargetInfo localTargetInfo3 in targets)
{
if (MutaChamber.FindMutaChamberFor(victim, pawn, true, ChamberUse.Tf) != null)
{
string text4 = "CarryToChamber".Translate(localTargetInfo4.Thing.LabelCap, localTargetInfo4.Thing);
JobDef jDef = Mutagen_JobDefOf.CarryToMutagenChamber;
Action action3 = delegate
{
var building_chamber =
MutaChamber.FindMutaChamberFor(victim, pawn);
if (building_chamber == null)
building_chamber = MutaChamber.FindMutaChamberFor(victim, pawn, true);
if (building_chamber == null)
{
Messages.Message("CannotCarryToChamber".Translate() + ": " + "NoChamber".Translate(), victim,
MessageTypeDefOf.RejectInput, false);
return;
}

var job = new Job(jDef, victim, building_chamber);
job.count = 1;
pawn.jobs.TryTakeOrderedJob(job);
};
string label = text4;
Action action2 = action3;
Pawn revalidateClickTarget = victim;
opts.Add(FloatMenuUtility
.DecoratePrioritizedTask(new FloatMenuOption(label, action2, MenuOptionPriority.Default, null, revalidateClickTarget),
pawn, victim));
}
if (MutaChamber.FindMutaChamberFor(victim, pawn, true, ChamberUse.Merge) != null)
LocalTargetInfo localTargetInfo4 = localTargetInfo3;
var victim = (Pawn)localTargetInfo4.Thing;
MutagenDef mutagen = MutagenDefOf.MergeMutagen;

// As long as the target remains unchanged, then cache mutability state.
if (_pawnCanTransformCache.Item1 != victim)
_pawnCanTransformCache = (victim,
mutagen.CanTransform(victim) && pawn.CanReserveAndReach(victim, PathEndMode.OnCell, Danger.Deadly, 1, -1, null, true),
"CarryToChamber".Translate(victim.LabelCap, victim),
"PMCarryToChamberMerge".Translate(victim.LabelCap, victim)
);

if (_pawnCanTransformCache.Item2)
{
string text4 = "PMCarryToChamberMerge".Translate(localTargetInfo4.Thing.LabelCap, localTargetInfo4.Thing);
JobDef jDef = Mutagen_JobDefOf.CarryToMutagenChamber;
Action action3 = delegate
{
var building_chamber =
MutaChamber.FindMutaChamberFor(victim, pawn);
if (building_chamber == null)
building_chamber = MutaChamber.FindMutaChamberFor(victim, pawn, true);
if (building_chamber == null)
{
Messages.Message("CannotCarryToChamber".Translate() + ": " + "NoChamber".Translate(), victim,
MessageTypeDefOf.RejectInput, false);
return;
}

var job = new Job(jDef, victim, building_chamber);
job.count = 1;
pawn.jobs.TryTakeOrderedJob(job);
};
string label = text4;
Action action2 = action3;
Pawn revalidateClickTarget = victim;
opts.Add(FloatMenuUtility
.DecoratePrioritizedTask(new FloatMenuOption(label, action2, MenuOptionPriority.Default, null, revalidateClickTarget),
pawn, victim));
CarryToChamber(pawn, opts, victim, _pawnCanTransformCache.Item3, ValueTuple.Create(ChamberUse.Mutation, ChamberUse.Tf));
CarryToChamber(pawn, opts, victim, _pawnCanTransformCache.Item4, ValueTuple.Create(ChamberUse.Merge, ChamberUse.Merge));
}
}
}
}

return true;
}

private static void CarryToChamber(Pawn pawn, List<FloatMenuOption> opts, Pawn victim, string label, ValueTuple<ChamberUse, ChamberUse> useType)
{
// Is there any chambers including reserved that fit the requirements?
var mergeChamber = MutaChamber.FindMutaChamberFor(victim, pawn, true, useType);
if (mergeChamber != null)
{
Action action = delegate
{
// Is there any chambers that isn't already reserved? then prioritise that.
var building_chamber = MutaChamber.FindMutaChamberFor(victim, pawn, false, useType);

// If none is found then check for any reserved again.
// Chambers might no longer be avaiable between right clicking and selecting the option.
if (building_chamber == null)
building_chamber = MutaChamber.FindMutaChamberFor(victim, pawn, true, useType);

if (building_chamber == null)
{
Messages.Message("CannotCarryToChamber".Translate() + ": " + "NoChamber".Translate(), victim, MessageTypeDefOf.RejectInput, false);
return;
}

var job = new Job(Mutagen_JobDefOf.CarryToMutagenChamber, victim, building_chamber);
job.count = 1;
pawn.jobs.TryTakeOrderedJob(job);
};
opts.Add(FloatMenuUtility.DecoratePrioritizedTask(new FloatMenuOption(label, action, MenuOptionPriority.Default, null, victim),
pawn, victim));
}
}
}

#if true
[HarmonyPatch(typeof(FloatMenuMakerMap))]
[HarmonyPatch("CanTakeOrder")]
Expand Down
8 changes: 6 additions & 2 deletions Source/Pawnmorphs/Esoteria/HPatches/GeneTrackerPatches.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,12 @@ static void EnsureCorrectSkinColorOverridePostfix(Pawn ___pawn)
GraphicsUpdaterComp graphicsComp = ___pawn.TryGetComp<GraphicsUpdaterComp>();
if (graphicsComp != null)
{
graphicsComp.GeneOverrideColor = ___pawn.story.skinColorOverride;
graphicsComp.RefreshGraphics();
UnityEngine.Color? currentColor = ___pawn.story.skinColorOverride;
if (currentColor != graphicsComp.GeneOverrideColor)
{
graphicsComp.GeneOverrideColor = currentColor;
graphicsComp.RefreshGraphics();
}
}
}

Expand Down
12 changes: 9 additions & 3 deletions Source/Pawnmorphs/Esoteria/HPatches/PawnPatches.cs
Original file line number Diff line number Diff line change
Expand Up @@ -29,18 +29,24 @@ private static void OnClear(PawnmorphGameComp obj)
static void FixCombinedDisabledWorkTags(ref WorkTags __result, [NotNull] Pawn __instance)
{
var hediffs = __instance.health?.hediffSet?.hediffs;
if (hediffs == null) return;
if (hediffs == null)
return;

foreach (Hediff hediff in hediffs)
for (int i = hediffs.Count - 1; i >= 0; i--)
{
Hediff hediff = hediffs[i];
if (hediff is IWorkModifier wM)
{
__result |= ~wM.AllowedWorkTags;
}
else
{
foreach (HediffStage hediffStage in hediff.def.stages.MakeSafe())
if (hediff.def?.stages == null)
continue;

for (int stageIndex = hediff.def.stages.Count - 1; stageIndex >= 0; stageIndex--)
{
HediffStage hediffStage = hediff.def.stages[stageIndex];
if (hediffStage is IWorkModifier sWM)
{
__result |= ~sWM.AllowedWorkTags;
Expand Down
17 changes: 0 additions & 17 deletions Source/Pawnmorphs/Esoteria/Hybrids/HybridRaceSettings.cs
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,6 @@ public class HybridRaceSettings
public RaceRestrictionSettings restrictionSettings;
/// <summary>The graphics settings</summary>
public GraphicsSettings graphicsSettings;
/// <summary>The trait settings</summary>
public TraitSettings traitSettings;

/// <summary>
/// The explicit hybrid race
Expand Down Expand Up @@ -252,21 +250,6 @@ public class FoodSettings
public List<FoodCategoryOverride> foodOverrides = new List<FoodCategoryOverride>();
}

//should this be deprecated?
/// <summary>
/// obsolete
/// </summary>
[Obsolete]
public class TraitSettings
{
/// <summary>
///
/// </summary>
//should this be deprecated?
public List<AlienChanceEntry<TraitDef>> forcedTraits;
//public List<string> disallowedTraits; removing traits not supported right now, rimworld doesn't like it when you remove them
}

/// <summary>
/// generate AlienRace thought settings with the given morph def
/// </summary>
Expand Down
19 changes: 10 additions & 9 deletions Source/Pawnmorphs/Esoteria/Hybrids/RaceGenerator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -294,13 +294,10 @@ private static void CreateImplicitMeshes(ThingDef_AlienRace race)
/// <returns></returns>
private static GeneralSettings GenerateHybridGeneralSettings(GeneralSettings human, MorphDef morph, ThingDef_AlienRace impliedRace)
{
var traitSettings = morph.raceSettings.traitSettings;
return new GeneralSettings
{
alienPartGenerator = GenerateHybridGenerator(human.alienPartGenerator, morph, impliedRace),
humanRecipeImport = true,
forcedRaceTraitEntries = traitSettings?.forcedTraits
// Black list is not currently supported, Rimworld doesn't like it when you remove traits.
humanRecipeImport = true
};
}

Expand All @@ -310,10 +307,8 @@ private static AlienPartGenerator GenerateHybridGenerator(AlienPartGenerator hum
{
bodyTypes = human.bodyTypes.MakeSafe().ToList(),
headTypes = human.headTypes.MakeSafe().ToList(),
offsetDefaults = human.offsetDefaults.MakeSafe().ToList(),
headOffset = human.headOffset,
headOffsetSpecific = human.headOffsetSpecific,
headOffsetDirectional = human.headOffsetDirectional,
bodyAddons = GenerateBodyAddons(human.bodyAddons, morph),
colorChannels = human.colorChannels,
alienProps = impliedRace
Expand Down Expand Up @@ -497,7 +492,7 @@ private static ThingDef_AlienRace.AlienSettings GenerateHybridAlienSettings(Thin
GeneralSettings generalSettings = GenerateHybridGeneralSettings(human.generalSettings, morph, impliedRace);
return new ThingDef_AlienRace.AlienSettings
{
generalSettings = GenerateHybridGeneralSettings(human.generalSettings, morph, impliedRace),
generalSettings = generalSettings,
graphicPaths = GenerateGraphicPaths(human.graphicPaths, morph, generalSettings),
styleSettings = human.styleSettings,
raceRestriction = GenerateHybridRestrictionSettings(human.raceRestriction, morph),
Expand Down Expand Up @@ -652,7 +647,14 @@ public static void DoHarStuff()
{
foreach (ThingDef_AlienRace race in _raceLookupTable.Keys)
{
DoHarStuff(race);
try
{
DoHarStuff(race);
}
catch (Exception e)
{
Log.Error($"[Pawnmorpher] Failed to properly add {race.defName} to HAR.\n" + e);
}
}
}

Expand Down Expand Up @@ -743,7 +745,6 @@ private static void DoHarStuff(ThingDef_AlienRace ar)
}
ThingCategoryDefOf.CorpsesHumanlike.ResolveReferences();
}
ar.alienRace.generalSettings.alienPartGenerator.GenerateMeshsAndMeshPools();
if (ar.alienRace.generalSettings.humanRecipeImport && ar != ThingDefOf.Human)
{
(ar.recipes ?? (ar.recipes = new List<RecipeDef>())).AddRange(ThingDefOf.Human.recipes.Where((RecipeDef rd) => !rd.targetsBodyPart || rd.appliedOnFixedBodyParts.NullOrEmpty() || rd.appliedOnFixedBodyParts.Any((BodyPartDef bpd) => ar.race.body.AllParts.Any((BodyPartRecord bpr) => bpr.def == bpd))));
Expand Down
Loading

0 comments on commit 8eb1597

Please sign in to comment.