def _name_and_create_adoptee_gen(self, timeline): adopted_sim_info = self.get_participant(ParticipantType.PickedSim) last_name = SimSpawner.get_family_name_for_gender(self.sim.account, self.sim.last_name, adopted_sim_info.is_female) result = yield self._do_renames_gen(timeline, (adopted_sim_info,), additional_tokens=(last_name,)) if not result: return result adopted_sim_info = self.get_participant(ParticipantType.PickedSim) parent_a = self.sim.sim_info parent_b = services.sim_info_manager().get(parent_a.spouse_sim_id) adopted_sim_info.relationship_tracker._clear_relationships() for relation in FamilyRelationshipIndex: relation_id = adopted_sim_info.get_relation(relation) relation_info = services.sim_info_manager().get(relation_id) if relation_info is not None: adopted_sim_info.genealogy.remove_family_link(relation) family_relation = relation_info.genealogy.get_family_relationship_bit(adopted_sim_info.sim_id) relation_info.genealogy.clear_family_relation(family_relation) relation_info.relationship_tracker.destroy_relationship(adopted_sim_info.sim_id) adopted_sim_info.genealogy.clear_family_relation(relation) if adopted_sim_info.household is not parent_a.household: adopted_sim_info.household.remove_sim_info(adopted_sim_info) PregnancyTracker.initialize_sim_info(adopted_sim_info, parent_a, parent_b) adopted_sim_info.trait_tracker.remove_trait(self.adoption_trait) if adopted_sim_info.age == Age.BABY: adopted_sim_info.set_zone_on_spawn() create_and_place_baby(adopted_sim_info, ignore_daycare=True) else: SimSpawner.spawn_sim(adopted_sim_info, sim_position=self.sim.position) return True
def create_offspring_data(self): r = random.Random() r.seed(self._seed) offspring_count = pop_weighted( [(p.weight * p.modifiers.get_multiplier(SingleSimResolver(self._sim_info)), p.size) for p in self.MULTIPLE_OFFSPRING_CHANCES], random=r) offspring_count = min(self._sim_info.household.free_slot_count + 1, offspring_count) self._offspring_data = [] for offspring_index in range(offspring_count): if offspring_index and r.random( ) < self.MONOZYGOTIC_OFFSPRING_CHANCE: gender = self._offspring_data[offspring_index - 1].gender genetics = self._offspring_data[offspring_index - 1].genetics else: gender = Gender.MALE if r.random() < 0.5 else Gender.FEMALE genetics = r.randint(1, MAX_UINT32) last_name = SimSpawner.get_family_name_for_gender( self._sim_info.account, self._sim_info.last_name, gender == Gender.FEMALE) traits = self._select_traits_for_offspring(gender) self._offspring_data.append( PregnancyOffspringData(gender, genetics, last_name=last_name, traits=traits))
def _name_and_create_adoptee_gen(self, timeline): adopted_sim_info = self.get_participant(ParticipantType.PickedSim) last_name = SimSpawner.get_family_name_for_gender( self.sim.account, self.sim.last_name, adopted_sim_info.is_female) result = yield self._do_renames_gen(timeline, (adopted_sim_info, ), additional_tokens=(last_name, )) if not result: return result adopted_sim_info = self.get_participant(ParticipantType.PickedSim) parent_a = self.sim.sim_info parent_b = services.sim_info_manager().get(parent_a.spouse_sim_id) adopted_sim_info.relationship_tracker._clear_relationships() for relation in FamilyRelationshipIndex: relation_id = adopted_sim_info.get_relation(relation) relation_info = services.sim_info_manager().get(relation_id) if relation_info is not None: adopted_sim_info.genealogy.remove_family_link(relation) family_relation = relation_info.genealogy.get_family_relationship_bit( adopted_sim_info.sim_id) relation_info.genealogy.clear_family_relation(family_relation) relation_info.relationship_tracker.destroy_relationship( adopted_sim_info.sim_id) adopted_sim_info.genealogy.clear_family_relation(relation) if adopted_sim_info.household is not parent_a.household: adopted_sim_info.household.remove_sim_info(adopted_sim_info) PregnancyTracker.initialize_sim_info(adopted_sim_info, parent_a, parent_b) adopted_sim_info.trait_tracker.remove_trait(self.adoption_trait) if adopted_sim_info.age == Age.BABY: adopted_sim_info.set_zone_on_spawn() create_and_place_baby(adopted_sim_info, ignore_daycare=True) else: SimSpawner.spawn_sim(adopted_sim_info, sim_position=self.sim.position) return True
def create_offspring_data(self): r = random.Random() r.seed(self._seed) offspring_count = pop_weighted([(p.weight*p.modifiers.get_multiplier(SingleSimResolver(self._sim_info)), p.size) for p in self.MULTIPLE_OFFSPRING_CHANCES], random=r) offspring_count = min(self._sim_info.household.free_slot_count + 1, offspring_count) self._offspring_data = [] for offspring_index in range(offspring_count): if offspring_index and r.random() < self.MONOZYGOTIC_OFFSPRING_CHANCE: gender = self._offspring_data[offspring_index - 1].gender genetics = self._offspring_data[offspring_index - 1].genetics else: gender = Gender.MALE if r.random() < 0.5 else Gender.FEMALE genetics = r.randint(1, MAX_UINT32) last_name = SimSpawner.get_family_name_for_gender(self._sim_info.account, self._sim_info.last_name, gender == Gender.FEMALE) traits = self._select_traits_for_offspring(gender) self._offspring_data.append(PregnancyOffspringData(gender, genetics, last_name=last_name, traits=traits))
def debug_create_baby(actor_sim, position, gender, routing_surface=None): baby = None try: actor_sim_info = actor_sim.sim_info account = actor_sim.sim_info.account sim_creator = SimCreator( gender=gender, age=Age.BABY, first_name=SimSpawner.get_random_first_name( account, gender == Gender.FEMALE), last_name=SimSpawner.get_family_name_for_gender( account, actor_sim.last_name, gender == Gender.FEMALE)) (sim_info_list, _) = SimSpawner.create_sim_infos( (sim_creator, ), household=actor_sim_info.household, account=account, zone_id=actor_sim_info.zone_id, creation_source='cheat: debug_create_baby') sim_info = sim_info_list[0] baby_def = Baby.get_default_baby_def() baby = create_object(baby_def, sim_info.sim_id) baby.set_sim_info(sim_info) fgl_context = placement.FindGoodLocationContext( starting_position=position, object_id=baby.id, search_flags=placement.FGLSearchFlagsDefault, object_footprints=(baby.get_footprint(), )) (trans, orient) = placement.find_good_location(fgl_context) if trans is not None: baby.location = sims4.math.Location( sims4.math.Transform(trans, orient), routing_surface) client = services.client_manager().get_client_by_household_id( sim_info.household_id) while client is not None: client.selectable_sims.add_selectable_sim_info(sim_info) except Exception as e: logger.exception('Create baby fail', e) if actor_sim_info.household.sim_in_household(sim_info.sim_id): actor_sim_info.household.remove_sim_info(sim_info) client = services.client_manager().get_client_by_household_id( sim_info.household_id) if client is not None: client.selectable_sims.remove_selectable_sim_info(sim_info) while baby is not None: baby.destroy(source=actor_sim, cause='Create baby fail')
def debug_create_baby(actor_sim, position, gender, routing_surface=None): baby = None try: actor_sim_info = actor_sim.sim_info account = actor_sim.sim_info.account sim_creator = SimCreator(gender=gender, age=Age.BABY, first_name=SimSpawner.get_random_first_name(account, gender == Gender.FEMALE), last_name=SimSpawner.get_family_name_for_gender(account, actor_sim.last_name, gender == Gender.FEMALE)) (sim_info_list, _) = SimSpawner.create_sim_infos((sim_creator,), household=actor_sim_info.household, account=account, zone_id=actor_sim_info.zone_id, creation_source='cheat: debug_create_baby') sim_info = sim_info_list[0] baby_def = Baby.get_default_baby_def() baby = create_object(baby_def, sim_info.sim_id) baby.set_sim_info(sim_info) fgl_context = placement.FindGoodLocationContext(starting_position=position, object_id=baby.id, search_flags=placement.FGLSearchFlagsDefault, object_footprints=(baby.get_footprint(),)) (trans, orient) = placement.find_good_location(fgl_context) if trans is not None: baby.location = sims4.math.Location(sims4.math.Transform(trans, orient), routing_surface) client = services.client_manager().get_client_by_household_id(sim_info.household_id) while client is not None: client.selectable_sims.add_selectable_sim_info(sim_info) except Exception as e: logger.exception('Create baby fail', e) if actor_sim_info.household.sim_in_household(sim_info.sim_id): actor_sim_info.household.remove_sim_info(sim_info) client = services.client_manager().get_client_by_household_id(sim_info.household_id) if client is not None: client.selectable_sims.remove_selectable_sim_info(sim_info) while baby is not None: baby.destroy(source=actor_sim, cause='Create baby fail')