Advertisement
Guest User

Untitled

a guest
Jun 5th, 2024
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.08 KB | None | 0 0
  1. def _roll_d100(chance_of_success: int) -> bool:
  2.     return int(random.random() * 100) <= chance_of_success
  3.  
  4. def init_physical_traits(self, parents: tuple=()):
  5.     inherit_chance = game.config["cat_generation"]["physical_trait_inherit_chance"]
  6.     self_gen_chance = game.config["cat_generation"]["physical_trait_chance"]
  7.  
  8.     trait_categories = [
  9.         Pelt.physical_trait_teeth,
  10.         Pelt.physical_trait_ear_type,
  11.         Pelt.physical_trait_ear_fold,
  12.         Pelt.physical_trait_headfur,
  13.         Pelt.physical_trait_cheekfur,
  14.         Pelt.physical_trait_mane,
  15.         Pelt.physical_trait_fur_type,
  16.         Pelt.physical_trait_muzzle_type,
  17.         Pelt.physical_trait_body_type,
  18.         Pelt.physical_trait_size
  19.     ]
  20.  
  21.     actual_parents = [p for p in parents if p]
  22.  
  23.     # Gather up the parental traits
  24.     par_traits = set()
  25.     for p in actual_parents:
  26.         par_traits.add(p.pelt.physical_trait_1)
  27.         par_traits.add(p.pelt.physical_trait_2)
  28.         par_traits.add(p.pelt.physical_trait_hidden)
  29.  
  30.     # Remove any None values from par_traits
  31.     par_traits.discard(None)
  32.  
  33.     # Now we try to inherit traits from parents
  34.     if par_traits:
  35.         # Check for conflicting traits from the same category
  36.         # Select one of the conflicting traits to keep
  37.         for category in trait_categories:
  38.             clash_traits = par_traits.intersection(category)
  39.             if len(clash_traits) > 1:
  40.                 chosen_trait = random.choice(list(clash_traits))
  41.                 par_traits = par_traits.difference(clash_traits)
  42.                 par_traits.add(chosen_trait)
  43.  
  44.    
  45.         # Randomly select physical_trait_1 and physical_trait_2 from par_traits
  46.         if _roll_d100(inherit_chance):
  47.             self.physical_trait_1 = random.choice(list(par_traits))
  48.             par_traits.remove(self.physical_trait_1)
  49.            
  50.             # Try again for a second!
  51.             if par_traits and _roll_d100(inherit_chance):
  52.                 self.physical_trait_2 = random.choice(list(par_traits))
  53.                 par_traits.remove(self.physical_trait_2)
  54.  
  55.         # Try to inherit a hidden trait regardless of the above, if there are any left
  56.         # +25% chance of any remaining genes being inherited as hidden
  57.         if par_traits and _roll_d100(inherit_chance - 25):
  58.             self.physical_trait_hidden = random.choice(list(par_traits))
  59.  
  60.     # If we didn't inherit traits, we attempt self generation
  61.     if not self.physical_trait_1:
  62.         trait_pool = [(trait, category) for category in trait_categories for trait in category]
  63.  
  64.         if _roll_d100(self_gen_chance):
  65.             # We get one trait!
  66.             selected_trait, category = random.choice(trait_pool)
  67.             self.physical_trait_1 = selected_trait
  68.  
  69.             # Try for a second trait, much less likely
  70.             if _roll_d100(0.1 * self_gen_chance):
  71.                 # If we get a second trait, it can't be from the same category
  72.                 remaining_traits = [t for t, c in trait_pool if c != category]
  73.                 self.physical_trait_2 = random.choice(remaining_traits)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement