Added a Twinkification Draft

This commit is contained in:
Vegapnk 2024-07-11 11:37:10 +02:00
parent 420e14f7af
commit c82b81011f
4 changed files with 95 additions and 24 deletions

View file

@ -66,6 +66,33 @@ Any gene can give immunity against any genetic disease using an extension:
These extensions can be slapped on any gene, These extensions can be slapped on any gene,
but they are meant mostly to have infectors immune against their own diseases. but they are meant mostly to have infectors immune against their own diseases.
**Twinkification / Feminization**:
Both approaches follow the same general logic.
- Pawn `A` has Twinkifier Gene and fucks Pawn `B`
- `B` receives a `twinkification progress` hediff with some effects
- Upon having ANY sex, `B` can gain genes from a relevant genepool.
- Genes can be minor or major, depending on the progress of twinkification.
Pawn `B` might be immune against twinkifier as normal immunity logic against diseases.
But once the hediff is there, the twinkification can happen unless you wait for it to cool down.
Gene additions are subject to an application chance (25% for minor, 10% for major)
and might try to add a gene that already exists - then nothing happens.
*Twink Genepool*:
- (Minor) Body_Thin
- (Minor) Homosexual
- (Minor) Beard_NoBeardOnly
- (Minor) Small male genitalia
- (Major) Minor Vulnerability
- (Major) Infectious Homosexuality
- (Major) Delicate
- (Major) Beauty Pretty
- (Major) Fertile Anus
These are currently hardcoded but I can change them on popular demand.
## Changelog ## Changelog
**Additions:** **Additions:**
@ -83,6 +110,7 @@ but they are meant mostly to have infectors immune against their own diseases.
- Gene: Sexual Genetic Swap. Pawns have a chance to switch a random gene with their sexpartner. - Gene: Sexual Genetic Swap. Pawns have a chance to switch a random gene with their sexpartner.
- (Archite) Gene: Sexual Genetic Thief. Pawns have a chance to steal a gene from their sexpartner. Genetic Disease Immunity shields against this. - (Archite) Gene: Sexual Genetic Thief. Pawns have a chance to steal a gene from their sexpartner. Genetic Disease Immunity shields against this.
- Gene: Sperm Displacement. Pawns might overwrite an existing pregnancy, becoming the new father. The pregnancy will stay in its gestation progress. - Gene: Sperm Displacement. Pawns might overwrite an existing pregnancy, becoming the new father. The pregnancy will stay in its gestation progress.
- Gene: Twinkification. Pawns turn their (male) sexual partners into breedable twinks.
- Pawns will have negative thoughts about pawns with more genetic diseases than themselves. - Pawns will have negative thoughts about pawns with more genetic diseases than themselves.
- Faction Penalties for spreading diseases, stealing genes and aging pawns with age transfer - Faction Penalties for spreading diseases, stealing genes and aging pawns with age transfer
- Patch for [Imphilee Xeno](https://steamcommunity.com/sharedfiles/filedetails/?id=2990674516) by @Bunuffin - Patch for [Imphilee Xeno](https://steamcommunity.com/sharedfiles/filedetails/?id=2990674516) by @Bunuffin

View file

@ -224,7 +224,7 @@
<li Class="RJW_Genes.HediffIncreaseOnSexExtension"> <li Class="RJW_Genes.HediffIncreaseOnSexExtension">
<hediffDef>rjw_genes_twinkification_progress</hediffDef> <hediffDef>rjw_genes_twinkification_progress</hediffDef>
<canCreateHediff>true</canCreateHediff> <canCreateHediff>true</canCreateHediff>
<severityIncrease>0.99</severityIncrease> <severityIncrease>0.01</severityIncrease>
<applicationChance>1.00</applicationChance> <applicationChance>1.00</applicationChance>
<applicableForWomen>false</applicableForWomen> <applicableForWomen>false</applicableForWomen>
<applicableForMen>true</applicableForMen> <applicableForMen>true</applicableForMen>

View file

@ -17,7 +17,7 @@
</li> </li>
</comps> </comps>
<stages> <stages>
<!-- DevNote: The labels and their effects can be changed, but the logic triggers at >0.6 for minor and >0.8 for major ! -->
<li> <li>
<label>neglectable</label> <label>neglectable</label>
<becomeVisible>false</becomeVisible> <becomeVisible>false</becomeVisible>
@ -89,7 +89,7 @@
</li> </li>
</comps> </comps>
<stages> <stages>
<!-- DevNote: The labels and their effects can be changed, but the logic triggers at >0.6 for minor and >0.8 for major ! -->
<li> <li>
<label>neglectable</label> <label>neglectable</label>
<becomeVisible>false</becomeVisible> <becomeVisible>false</becomeVisible>

View file

@ -37,42 +37,85 @@ namespace RJW_Genes
if (hediff == null) return; if (hediff == null) return;
var Random = new Random(); var Random = new Random();
switch (hediff.SeverityLabel) // DevNote: I first had a switch (hediff.SeverityLabel) but SeverityLabel was null.
// So now I have this approach which feels a bit more robust.
// I was thinking about looking for strings in the label, but I think that will break the logic in case of translations.
switch (hediff.Severity)
{ {
case "severe": case float f when f > 0.8f:
case "critical":
{ {
if (Random.NextDouble() < MAJOR_APPLICATION_CHANCE) if (Random.NextDouble() < MAJOR_APPLICATION_CHANCE)
majorChange(pawn); MajorChange(pawn);
} break; } break;
case "minor": case float f when f > 0.6f:
{ {
if (Random.NextDouble() < MINOR_APPLICATION_CHANCE) if (Random.NextDouble() < MINOR_APPLICATION_CHANCE)
minorChange(pawn); MinorChange(pawn);
} break;
default:
{
ModLog.Debug($"Tried to twinkify {pawn} - severity of twinkification was too low ({hediff.def} @ {hediff.Severity} - {hediff.Label})") ;
} break; } break;
} }
} }
private static void minorChange(Pawn pawn) private static void MinorChange(Pawn pawn)
{ {
// Minor Infectious Vulnerability List<GeneDef> possibleGenes = new List<GeneDef>() {
// Smaller Genitalia GeneDefOf.rjw_genes_small_male_genitalia,
// Remove Beard DefDatabase<GeneDef>.GetNamed("Beard_NoBeardOnly"),
// Thin Body Type DefDatabase<GeneDef>.GetNamed("Body_Thin"),
GeneDefOf.rjw_genes_homosexual
};
GeneDef chosen = possibleGenes.RandomElement();
if (chosen == null)
{
ModLog.Warning($"Error in retrieving a minor-twinkification gene for twinkifying {pawn}");
return;
}
// DevNote: I could do "hasActiveGene" but that could lead to the gene being there but not active.
if (!pawn.genes.GenesListForReading.Any(p => p.def == chosen))
{
ModLog.Debug($"{pawn} experienced a minor twinkification change; {pawn} got new gene {chosen}.");
pawn.genes.AddGene(chosen, !RJW_Genes_Settings.rjw_genes_genetic_disease_as_endogenes);
} else
{
ModLog.Debug($"Tryed a minor twinkification for {pawn} - {pawn} already had {chosen}");
}
} }
private static void majorChange(Pawn pawn) private static void MajorChange(Pawn pawn)
{ {
// Final Gene-Pool should have: List<GeneDef> possibleGenes = new List<GeneDef>() {
// - Fragile (?) GeneDefOf.rjw_genes_fertile_anus,
// - Infectious Vulnerability DefDatabase<GeneDef>.GetNamed("Beauty_Pretty"),
// - Infectious Homosexuality DefDatabase<GeneDef>.GetNamed("Delicate"),
// - Beauty GeneDefOf.rjw_genes_minor_vulnerability,
// - Fertile Anus GeneDefOf.rjw_genes_infectious_homosexuality
};
pawn.genes.AddGene(GeneDefOf.rjw_genes_fertile_anus, !RJW_Genes_Settings.rjw_genes_genetic_disease_as_endogenes); GeneDef chosen = possibleGenes.RandomElement();
pawn.genes.AddGene(GeneDefOf.rjw_genes_infectious_homosexuality, !RJW_Genes_Settings.rjw_genes_genetic_disease_as_endogenes); if (chosen == null)
{
ModLog.Warning($"Error in retrieving a minor-twinkification gene for twinkifying {pawn}");
return;
}
// DevNote: I could do "hasActiveGene" but that could lead to the gene being there but not active.
if (!pawn.genes.GenesListForReading.Any(p => p.def == chosen))
{
ModLog.Debug($"{pawn} experienced a major twinkification change; {pawn} got new gene {chosen}.");
pawn.genes.AddGene(chosen, !RJW_Genes_Settings.rjw_genes_genetic_disease_as_endogenes);
}
else
{
ModLog.Debug($"Tryed a major twinkification for {pawn} - {pawn} already had {chosen}");
ModLog.Debug($"Trying minor twinkification for {pawn} instead ...");
MinorChange(pawn);
}
} }
} }
} }