mirror of
				https://github.com/vegapnk/RJW-Genes.git
				synced 2024-08-15 00:23:31 +00:00 
			
		
		
		
	Added a Twinkification Draft
This commit is contained in:
		
							parent
							
								
									420e14f7af
								
							
						
					
					
						commit
						c82b81011f
					
				
					 4 changed files with 95 additions and 24 deletions
				
			
		
							
								
								
									
										28
									
								
								CHANGELOG.md
									
										
									
									
									
								
							
							
						
						
									
										28
									
								
								CHANGELOG.md
									
										
									
									
									
								
							| 
						 | 
					@ -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
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -35,44 +35,87 @@ namespace RJW_Genes
 | 
				
			||||||
            if (pawn == null) return;
 | 
					            if (pawn == null) return;
 | 
				
			||||||
            Hediff hediff = pawn.health.hediffSet.GetFirstHediffOfDef(HediffDefOf.rjw_genes_twinkification_progress); 
 | 
					            Hediff hediff = pawn.health.hediffSet.GetFirstHediffOfDef(HediffDefOf.rjw_genes_twinkification_progress); 
 | 
				
			||||||
            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);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue