News:

Please request registration email again and then check your "Spam" folder

Former www.henthighschool.com

Giant discussion bilingue de things et of pensées random

Started by Jman, Apr 08, 2025, 09:19 AM

Previous topic - Next topic

nemojason

j'ai finis de mettre à plat mes idées brouillonnes et mis en place le squelette de mon projet dites moi si c'est bon ou pas :

## Comment ajouter un nouveau Trait au jeu : Utilisez la fonction "register_trait(trait, type)" ci-dessous lors de l'init ou plus tard.
## - init_traits s'exécute au début du jeu, avant que les mods ne soient lancés
## - Si vous voulez que toutes les filles nouvellement générées aient une chance d'obtenir un Trait, mettez son attribut public à 'True' (par défaut) --> Trait(..., public=True)
## - Si vous voulez qu'une fille en particulier ait le trait, mettez son attribut public à 'False' , puis utilisez du code ou _BK.ini pour ajouter un trait--> Trait(..., public=False), puis utilisez le code ou _BK.ini pour configurer le trait
## - Dans tous les cas, assurez-vous d'utiliser register_trait() pour mettre à jour le dictionnaire des traits et éviter les problèmes de recherche de traits
## - Notez que si vous voulez inclure un trait personnalisé dans un fichier _BK.ini, le Trait() doit être enregistré séparément dans un fichier .rpy.


init python:
    # Fonction pour vérifier si Trait King est activé
    def is_traitking_active():
        # Vérifie d'abord si la variable existe
        if hasattr(store, 'traitking_activated'):
            # Retourne True seulement si traitking_activated est True
            return store.traitking_activated
        # Sinon, retourne False (mod non installé ou désactivé)
        return False

##### Exemple d'utilisation dans un label
    label check_traitking:
        if is_traitking_active():
            "Le mod Trait King est ACTIVÉ !"
        else:
            "Le mod Trait King est DÉSACTIVÉ ou non installé."
        return


###test si TK est actif ou pas
if is_traitking_active():
    # Ajoutez du contenu spécifique à Trait King (traits venant de TK)
    jump traitking_content
else:
    # Mode normal sans Trait King (traits venant de BK)
    jump default_content


#####Affiche sur l'écran le statut de TK
show screen traitking_status_screen

######################################
##Résumé des cas possibles############
##Condition#############Signification####################################
is_traitking_active() == True    ;Mod installé ET activé                 #
is_traitking_active() == False    ;Mod installé mais désactivé, ou absent #
#########################################################################

Sinon dans quel fichier .rpy, est traité le marché aux esclaves??? j'ai beau cherché je ne trouve pas ... il est bien caché xd

nemojason

voilà, je viens de finir le noyau du code pour insérer mes propres traits :

####Pour ajouter mes propres traits à l'aide du _BK.ini en utilisant la valeur always comme 'clavier' :

init python:
    import configparser
    import ast

    def generate_traits(girl, p_traits=None, n_traits=None):  # Prend 'girl' en paramètre directement
        # Vérification stricte de la casse et des noms
        if not hasattr(girl, 'name') or not hasattr(girl, 'lastname') or not hasattr(girl, 'fullname'):
            return  # Si la fille n'a pas les attributs requis

        config = configparser.ConfigParser()
        config.read("_BK.ini")
       
        try:
            # Récupération des paramètres depuis l'INI
            first_name = config.get("DEFAULT", "first_name", fallback="").strip('"\' ')
            last_name = config.get("DEFAULT", "last_name", fallback="").strip('"\' ')
            inverted = config.getboolean("DEFAULT", "inverted_name", fallback=False)

            # Construction des noms attendus
            expected_fullname = ""
            if first_name and last_name:
                expected_fullname = f"{last_name} {first_name}" if inverted else f"{first_name} {last_name}"
            elif first_name:
                expected_fullname = first_name
            elif last_name:
                expected_fullname = last_name

            # Comparaison EXACTE (casse respectée)
            if girl.fullname != expected_fullname:
                return  # Pas la bonne fille

        except Exception as e:
            renpy.notify(f"Erreur de configuration : {str(e)}")
            return

        # Réinitialisation et ajout des traits
        girl.traits = []
       
        try:
            # Fonction pour parser les traits entre guillemets
            def parse_traits(trait_str):
                try:
                    return [t.strip(' "\'') for t in ast.literal_eval(f"[{trait_str}]")]
                except:
                    return [t.strip() for t in trait_str.split(",") if t.strip()]

            # Récupération des traits
            section = "Traits" if config.has_section("Traits") else "DEFAULT"
            pos_traits = parse_traits(config.get(section, "positive_traits")) if config.has_option(section, "positive_traits") else []
            neg_traits = parse_traits(config.get(section, "negative_traits")) if config.has_option(section, "negative_traits") else []

            # Fusion avec les paramètres directs (sans doublons)
            girl.traits = list(set(pos_traits + neg_traits))

        except Exception as e:
            renpy.notify(f"Erreur des traits : {str(e)}")
            girl.traits = []

#####Fonctionnalités clés :######################################
#Gestion avancée des noms :
#
#Compare name.lastname du jeu avec first_name.last_name de l'INI
#
#Supporte l'inversion des noms (Scarlet Erza = Erza Scarlet)
#
#Ignore la casse et les espaces superflus
#
#Compatibilité totale :
#
#Fonctionne avec les noms composés
#
#Gère les cas où seul le prénom ou le nom est spécifié
#
#Accepte les guillemets simples/doubles/mixte
#
#Gestion d'erreur renforcée :
#
#     -Notifications claires en jeu
#
#     -Sections fallback ("DEFAULT" si "Traits" absent)
#############################################################

A vérifier avant que je l'intégre dans le squelette pour former le bloc final.

JmanTopic starter

Well, you can try searching by character name if the pack is from here. The forum has a rudimentary search capability.



Not quite sure about the English&French trait names. What are you trying to do, use it as a way to manage which traits go with which girl packs? Translate in-game trait names (didn't you already do that?)? Something else?

For the first, I tend to organise my plans via spreadsheets, so having one column for the French names and another for English ones is perfectly viable.



The base slave market logic is in 'BKmain.rpy'. The UI is in 'BKscreens.rpy', and slave generation is partially in 'BKfunctions.rpy' and mostly in 'BKgirlclass.rpy'.



The 'traitking_activated' variable seems to be a holdover from an earlier version that does nothing in 0.25+. Use 'game.has_active_mod("traitking")'.

Not sure why you want to add extra labels and screens for handling TK. ???



I am not sure what you're trying to accomplish with the 'generate_traits(girl,...)' thing. Is it supposed to work on an already existing girl and a specified _BK.ini? Otherwise, you can just use the existing 'read_init_file' function.

Also, checking the name on an existing girl is not the best idea... because existing girls can be clones or renamed.



If 'trait_str' is supposed to be a string with a bunch of trait names, ast.literal_eval(f"[{trait_str}]") won't work, it's very sensitive to what it considers a literal. Frankly, you're going to get a list of traits out of the _BK.ini parser anyway, so just running strip/split on the list of traits would suffice.

Honestly, looks like AI-generated code to me. :P
And with strange aeons even death may die...

nemojason

Quote from: Jman on Apr 09, 2025, 11:47 AMWell, you can try searching by character name if the pack is from here. The forum has a rudimentary search capability.



Not quite sure about the English&French trait names. What are you trying to do, use it as a way to manage which traits go with which girl packs? Translate in-game trait names (didn't you already do that?)? Something else?

For the first, I tend to organise my plans via spreadsheets, so having one column for the French names and another for English ones is perfectly viable.



The base slave market logic is in 'BKmain.rpy'. The UI is in 'BKscreens.rpy', and slave generation is partially in 'BKfunctions.rpy' and mostly in 'BKgirlclass.rpy'.



The 'traitking_activated' variable seems to be a holdover from an earlier version that does nothing in 0.25+. Use 'game.has_active_mod("traitking")'.

Not sure why you want to add extra labels and screens for handling TK. ???



I am not sure what you're trying to accomplish with the 'generate_traits(girl,...)' thing. Is it supposed to work on an already existing girl and a specified _BK.ini? Otherwise, you can just use the existing 'read_init_file' function.

Also, checking the name on an existing girl is not the best idea... because existing girls can be clones or renamed.



If 'trait_str' is supposed to be a string with a bunch of trait names, ast.literal_eval(f"[{trait_str}]") won't work, it's very sensitive to what it considers a literal. Frankly, you're going to get a list of traits out of the _BK.ini parser anyway, so just running strip/split on the list of traits would suffice.

Honestly, looks like AI-generated code to me. :P

non pour les traits j'ai annulé ma traduction justemment à cause des packs... ;D  ;D a l'origine c'était pour avoir les traits et leurs description en français, mais bon vu que les traits servent de variable dans des fichiers éparpillés c'est pas une bonne idée de traduire à mois de pouvoir de toout traduire d'un coup, ce qui ne peut pas être fait... :'(

a ben tout s'explique que j'ai du mal à trouver un endroit spécifique pour le marché aux esclave car à la base je cherchais comment  étaient générés les filles stat+ nom + traits

j'ai trouvé  "traitking_activated" dans les premières ligne du code de Traits King avec la dernière version, je m'en suis servis comme référence de base : ligne 1 à 6 : init -4 python:

    traitking_activated = False

    tag_dict = {
   

"Not sure why you want to add extra labels and screens for handling TK"-> c'est simple je veux adapter les traits selon si TK est activé ou non, si TK n'est pas activé ma fille affichera des traits basiques issus du jeu du jeu de base BK et si TK est activé, ma fille affichera des traits créées uniquement par TK. Je veux donc adapter mes packs en fonction de l'activation ou non de TK

non la fonction concerne uniquement pour ma fille uniquement, car je me sert du fichier _bk.ini comme clavier où l'inscription des valeurs dans la partie always des traits permettra la création des traits lorsque le jeu commencera à crééer les filles, mon mod effacera uniquement les traits généré aléatoirmeent par le jeu et remplacera par les traits que j'ai crééer dans la partie ALWAYS des traits et uniquement pour MA fille et non pour les autres packs avec des noms similaires... je rappelle que mes filles seront uniques donc pas de clones, mais j'utilise cette sécurité pour ne pas affecter les packs des autres PackMakers.





nemojason

QuoteIf 'trait_str' is supposed to be a string with a bunch of trait names, ast.literal_eval(f"[{trait_str}]") won't work, it's very sensitive to what it considers a literal. Frankly, you're going to get a list of traits out of the _BK.ini parser anyway, so just running strip/split on the list of traits would suffice.

Honestly, looks like AI-generated code to me. :P

Parce que c'est à moitié le cas, je part du code simple de base pour rajouter des branches plus complexe à l'aide de l'IA, la difficulté étant de surfer et d'adapter le code en fonction des variables et fonction existante du jeu, en fonction des résultats je cherche les clés proposées par l'IA pour pouvoir affiné le code, c'est bien pour ça que je partage mes résultats pour vérifier la compatibilté avec le jeu actuel xd
   

nemojason

QuoteSi « trait_str » est censé être une chaîne contenant plusieurs noms de traits, ast.literal_eval(f"[{trait_str}]")

ce passage est censé balayé les traits que j'ai écris uniqument sous la forme "trait1" "trait2" etc... du fichier _bk.ini dans la case always des traits négatifs ou positif respectant comment le fichier _bk.ini fonctionne actuellement vu que les traits doivent être mis entre les " ".

Prochaine étape imbriquer le squelette avec le noyau du code pour obtenir le code final.

nemojason

Voici l'analyse du code par l'IA :

### **Résumé Point par Point du Code Actuel**

---

#### **1. Vérification des Attributs de la Fille** 
✅ **Check** : Le code vérifie que `girl` possède bien : 
   - `girl.name` (prénom) 
   - `girl.lastname` (nom de famille) 
   - `girl.fullname` (nom complet, normalement `name + " " + lastname`) 
🔹 *Si un attribut manque* → La fonction s'arrête (`return`).

---

#### **2. Lecture du Fichier _BK.ini** 
📂 **Charge** : Le fichier de configuration `_BK.ini` pour récupérer : 
   - `first_name` (prénom cible) 
   - `last_name` (nom cible) 
   - `inverted_name` (booléen pour inverser l'ordre du nom) 
🔹 *Si le fichier est introuvable ou illisible* → Notifie l'erreur et s'arrête.

---

#### **3. Construction du Nom Complet Attendu** 
🔠 **Formats possibles** : 
   - Si `inverted_name = False` → `"Prénom Nom"` (ex: `"Erza Scarlet"`) 
   - Si `inverted_name = True` → `"Nom Prénom"` (ex: `"Scarlet Erza"`) 
   - Si seul `first_name` ou `last_name` est renseigné → Utilise uniquement celui-ci. 

---

#### **4. Comparaison Stricte des Noms** 
🔎 **Condition** : 
```python
if girl.fullname != expected_fullname:  # Respecte la casse (Erza ≠ erza)
    return  # Si différent → fin de la fonction
``` 
   - Compare **exactement** les chaînes (casse, espaces, ordre). 
   - *Exemple* : 
     - `girl.fullname = "Erza Scarlet"` vs `expected_fullname = "erza scarlet"` → **Ignoré** (casse différente). 

---

#### **5. Réinitialisation des Traits Existants** 
♻️ **Reset** : 
```python
girl.traits = []  # Efface tous les traits actuels
``` 
   - Permet de partir d'une liste vide avant d'ajouter les nouveaux traits.

---

#### **6. Extraction des Traits Depuis _BK.ini** 
📌 **Formats acceptés** : 
   - Avec guillemets : `"Gentille", "Forte"` → converti en `["Gentille", "Forte"]` 
   - Sans guillemets : `Gentille, Forte` → converti en `["Gentille", "Forte"]` 
   - *Gestion des erreurs* : Si le format est invalide → utilise une liste vide.

---

#### **7. Fusion des Traits (INI + Paramètres)** 
🔀 **Combinaison** : 
   - Traits positifs (`positive_traits`) + `p_traits` (paramètre) → fusion sans doublons (`set()`). 
   - Traits négatifs (`negative_traits`) + `n_traits` (paramètre) → fusion sans doublons. 
   - *Exemple* : 
     - INI : `positive_traits = "Gentille", "Forte"` 
     - Appel : `generate_traits(p_traits=["Forte", "Courageuse"])` 
     - Résultat : `["Gentille", "Forte", "Courageuse"]`.

---

#### **8. Attribution Finale** 
🎯 **Résultat** : 
```python
girl.traits = all_positive + all_negative  # Concatène les deux listes
``` 
   - *Exemple* : 
     - Traits finaux : `["Gentille", "Forte", "Naive"]`.

---

### **Fonctionnalités Clés** 
1. **Ciblage précis** : Ne modifie que la fille dont le nom **correspond exactement** à `_BK.ini`. 
2. **Flexibilité** : 
   - Accepte n'importe quel format de noms (inversés, prénom seul, etc.). 
   - Gère les guillemets ou non dans l'INI. 
3. **Robustesse** : 
   - Vérifie les erreurs (fichier manquant, attributs absents). 
   - Notifie les problèmes sans crasher. 
4. **Personnalisation** : 
   - Combine traits de l'INI et traits manuels (`p_traits`/`n_traits`). 

---

### **Exemple Complet** 
**Configuration (_BK.ini)** : 
```ini
[DEFAULT]
first_name = "Erza"
last_name = "Scarlet"
inverted_name = False

[Traits]
positive_traits = "Gentille", "Forte"
negative_traits = "Naive"
``` 

**Résultat** : 
- Si `girl.fullname = "Erza Scarlet"` → Traits appliqués : `["Gentille", "Forte", "Naive"]`. 
- Si `girl.fullname = "erza scarlet"` → **Aucun changement** (casse différente). 

---

### **Pour Résumer En Une Phrase** 
*Ce code vérifie scrupuleusement que la fille est bien celle ciblée dans `_BK.ini`, puis remplace ses traits par une liste personnalisée, en mélangeant ceux de l'INI et ceux passés en paramètres, tout en gérant proprement les erreurs.*

JmanTopic starter

Girl generation is mostly in the 'girl.randomize()' function, although it has several subfunctions and some bits are set in other places.



The 'traitking_activated' variable is indeed set on the third line of TK... and is then never used again. Hence, it's effectively not there anymore. Used to actually do things in earlier versions, I think.



If you want separate TK and non-TK trait lists, I guess you do need to check 'game.has_active_mod("traitking") first.



But how exactly is this 'generate_traits' function going to get used? You generate the girl, traits and all, and then read your new trait list in from somewhere else? Why do you parse a _BK.ini, then? What exactly is the end goal here? Mixing in new traits with what she already has? Total replacement? Do you want to only use the 'always' traits from the .ini or add your own custom lists later on in some script file?


And a unique girl can get her name changed, too, so this is working only when directly attached to the girl or when she's being generated... in which case all this name-checking is pointless. The code already knows who she is.



Whatever the f-strings are supposed to do, it won't work in-game. I'm not just theory-crafting, I tried and you're going to get errors almost every time, and thus the only line that matters is
return [t.strip() for t in trait_str.split(",") if t.strip()]

And you've already got a perfectly good .ini reader in 'read_init_file'. If you're using a _BK.ini to store the trait names you want to put in, it's as good and actually better than what the AI is trying to half-ass.

If that's not enough and you actually want to feed it a list of trait names, trying to sanitise your own hand-made list is rather pointless. Are you going to intentionally feed it garbage? :o



Basically, all you need to do is either generate the girl or directly read in her .ini, and then access the trait list:
import configparser
init_dict = read_init_file(GirlFilesDict.get_path_dict()[girl.path] + "/_BK.ini")
trait_list = init_dict["base positive traits/always"]
If you already have your girl and she didn't come from the Headhunter (which alters her 'init_dict'), just use
trait_list = girl.init_dict["base positive traits/always"]
Or if you want them all in one place, you can use this:
trait_list = girl.init_dict["base positive traits/always"] + girl.init_dict["base positive traits/often"] + girl.init_dict["base positive traits/rarely"] + girl.init_dict["base positive traits/never"] + girl.init_dict["base negative traits/always"] + girl.init_dict["base negative traits/often"] + girl.init_dict["base negative traits/rarely"] + girl.init_dict["base negative traits/never"]



I don't think you've fed the current BK codebase into the AI, so of course it spits out nonsense like replacing a girl's list of trait objects with a list of trait names. And even if it had the codebase, I'm somewhat sceptical of it getting actually working code, no matter how hard it tries to sell you that it's doing everything fine 'tout en gérant proprement les erreurs'. ::)

Basically, this thing here is a textbook example of why you don't use AI as a replacement for skill or knowledge. :-\
And with strange aeons even death may die...

nemojason

Quote from: Jman on Apr 09, 2025, 03:59 PMGirl generation is mostly in the 'girl.randomize()' function, although it has several subfunctions and some bits are set in other places.



The 'traitking_activated' variable is indeed set on the third line of TK... and is then never used again. Hence, it's effectively not there anymore. Used to actually do things in earlier versions, I think.



If you want separate TK and non-TK trait lists, I guess you do need to check 'game.has_active_mod("traitking") first.



But how exactly is this 'generate_traits' function going to get used? You generate the girl, traits and all, and then read your new trait list in from somewhere else? Why do you parse a _BK.ini, then? What exactly is the end goal here? Mixing in new traits with what she already has? Total replacement? Do you want to only use the 'always' traits from the .ini or add your own custom lists later on in some script file?


And a unique girl can get her name changed, too, so this is working only when directly attached to the girl or when she's being generated... in which case all this name-checking is pointless. The code already knows who she is.



Whatever the f-strings are supposed to do, it won't work in-game. I'm not just theory-crafting, I tried and you're going to get errors almost every time, and thus the only line that matters is
return [t.strip() for t in trait_str.split(",") if t.strip()]

And you've already got a perfectly good .ini reader in 'read_init_file'. If you're using a _BK.ini to store the trait names you want to put in, it's as good and actually better than what the AI is trying to half-ass.

If that's not enough and you actually want to feed it a list of trait names, trying to sanitise your own hand-made list is rather pointless. Are you going to intentionally feed it garbage? :o



Basically, all you need to do is either generate the girl or directly read in her .ini, and then access the trait list:
import configparser
init_dict = read_init_file(GirlFilesDict.get_path_dict()[girl.path] + "/_BK.ini")
trait_list = init_dict["base positive traits/always"]
If you already have your girl and she didn't come from the Headhunter (which alters her 'init_dict'), just use
trait_list = girl.init_dict["base positive traits/always"]
Or if you want them all in one place, you can use this:
trait_list = girl.init_dict["base positive traits/always"] + girl.init_dict["base positive traits/often"] + girl.init_dict["base positive traits/rarely"] + girl.init_dict["base positive traits/never"] + girl.init_dict["base negative traits/always"] + girl.init_dict["base negative traits/often"] + girl.init_dict["base negative traits/rarely"] + girl.init_dict["base negative traits/never"]



I don't think you've fed the current BK codebase into the AI, so of course it spits out nonsense like replacing a girl's list of trait objects with a list of trait names. And even if it had the codebase, I'm somewhat sceptical of it getting actually working code, no matter how hard it tries to sell you that it's doing everything fine 'tout en gérant proprement les erreurs'. ::)

Basically, this thing here is a textbook example of why you don't use AI as a replacement for skill or knowledge. :-\

je viens de tester ça marche à moitié car j'ai mis plus de 8 traits mais cela se résume à choisir que 3 traits max comme toujours xd en fait je veux pouvoir utiliser des traits qui n'est contenu que dans Trait King si et seulement si le mod est actif sinon il est ignoré et le jeu écrira le reste des traits de BK

nemojason

là actuellement je teste le second pack mais là j'obtiends pas une erreur venant de mon code mais de la personnalité personnalisé de bk.ini l'erreur viendrait d' extravert qui est présent dans les variables du jeu : ligne 1193 de BKinit_variables.rpy
attribute_score_dict = { # Note: very X and X boni/mali will add up

                            "very extravert" : {"very extravert" : 3, "extravert" : 1, "introvert" : -1, "very introvert" : -3},
                            "extravert" : {"very extravert" : 1, "extravert" : 1, "introvert" : 0, "very introvert" : -1},
                            "introvert" : {"very extravert" : -1, "extravert" : 0, "introvert" : 1, "very introvert" : 1},
                            "very introvert" : {"very extravert" : -3, "extravert" : -1, "introvert" : 1, "very introvert" : 3},


voilà ma personality personnalisé de _bk.ini

[custom personality]
 
custom_personality = True
personality_name = "Sociale Idéaliste"
attributes = ("extravert","idealist")
generic_dialogue = True
personality_dialogue_only = []
dialogue_personality_weight = 3
dialogue_attribute_weight = 1
description = "Lucy est sociable, expressive, et s'épanouit dans les interactions (ex. : intégrer Fairy Tail, nouer des amitiés rapidement). Elle utilise son charisme pour résoudre des conflits ou créer des liens. Elle poursuit des rêves personnels (devenir une grande mage, écrire un livre) et valorise l'amitié, l'aventure, et l'authenticité, parfois au détriment du pragmatisme."
custom_dialogue_label = ""




I'm sorry, but an uncaught exception occurred.

While running game code:
  File "game/BKstart.rpy", line 76, in script call
    call advance_to_chapter(starting_chapter, start=True) from _call_advance_to_chapter_3
  File "game/BKevents.rpy", line 786, in script
    $ calendar.updates(change_district=not start) # change_district disables quest and resource market updates
  File "game/BKevents.rpy", line 786, in <module>
    $ calendar.updates(change_district=not start) # change_district disables quest and resource market updates
  File "game/BKclasses.rpy", line 3025, in updates
    weekly_updates(change_district)
  File "game/BKfunctions.rpy", line 2793, in weekly_updates
    update_slaves()
  File "game/BKfunctions.rpy", line 526, in update_slaves
    slavemarket.girls = get_girls(nb)
  File "game/BKfunctions.rpy", line 373, in get_girls
    girl.randomize(free=free, p_traits=p_traits, n_trait=n_trait, perks=perks, level=lvl, force_original=(prefer_original and girl.count_occurences("all", original=True, add_list=final_list) == 0), temp_list=final_list) # final_list is checked to avoid multiple original generation
  File "game/BKgirlclass.rpy", line 180, in randomize
    self.generate_personality(personality)
  File "game/BKgirlclass.rpy", line 3616, in generate_personality
    self.personality = Personality(
  File "game/BKclasses.rpy", line 5099, in __init__
    self.generate_gift_likes()
  File "game/BKclasses.rpy", line 5106, in generate_gift_likes
    for gift_type, v in gpersonalities_likes[attr].items():
KeyError: 'extravert'

-- Full Traceback ------------------------------------------------------------

Full traceback:
  File "game/BKstart.rpy", line 76, in script call
    call advance_to_chapter(starting_chapter, start=True) from _call_advance_to_chapter_3
  File "game/BKevents.rpy", line 786, in script
    $ calendar.updates(change_district=not start) # change_district disables quest and resource market updates
  File "D:\klc\projet brothel king\renpy-8.3.7-sdk\Brothel_King-pc\renpy\ast.py", line 823, in execute
    renpy.python.py_exec_bytecode(self.code.bytecode, self.hide, store=self.store)
  File "D:\klc\projet brothel king\renpy-8.3.7-sdk\Brothel_King-pc\renpy\python.py", line 1178, in py_exec_bytecode
    exec(bytecode, globals, locals)
  File "game/BKevents.rpy", line 786, in <module>
    $ calendar.updates(change_district=not start) # change_district disables quest and resource market updates
  File "game/BKclasses.rpy", line 3025, in updates
    weekly_updates(change_district)
  File "game/BKfunctions.rpy", line 2793, in weekly_updates
    update_slaves()
  File "game/BKfunctions.rpy", line 526, in update_slaves
    slavemarket.girls = get_girls(nb)
  File "game/BKfunctions.rpy", line 373, in get_girls
    girl.randomize(free=free, p_traits=p_traits, n_trait=n_trait, perks=perks, level=lvl, force_original=(prefer_original and girl.count_occurences("all", original=True, add_list=final_list) == 0), temp_list=final_list) # final_list is checked to avoid multiple original generation
  File "game/BKgirlclass.rpy", line 180, in randomize
    self.generate_personality(personality)
  File "game/BKgirlclass.rpy", line 3616, in generate_personality
    self.personality = Personality(
  File "game/BKclasses.rpy", line 5099, in __init__
    self.generate_gift_likes()
  File "game/BKclasses.rpy", line 5106, in generate_gift_likes
    for gift_type, v in gpersonalities_likes[attr].items():
KeyError: 'extravert'

Windows-10-10.0.19045 AMD64
Ren'Py 8.2.0.24012702
Bro King 0.3t v250203
Wed Apr  9 18:49:23 2025

là c'est du foutage de gueule xd

nemojason

pour revenir aux traits, il faut que je trouve pourquoi le jeu me bloque à 3 traits, peut etre que c'est par rapport à la priorité du bloc python de mon code?

nemojason

d'après l'ia:

Quand l'erreur se produit ?

Lors de la génération aléatoire d'une esclave (girl.randomize()).

Plus précisément, quand le jeu essaie de générer ses préférences de cadeaux (generate_gift_likes()).

Pourquoi ?

La personnalité de la fille inclut un trait 'extravert' (extravertie), mais le dictionnaire gpersonalities_likes ne contient pas cette entrée.


Je vais changer de valeur pour tester si ça passe, c'est qu'il y a une faille dans l'attribution d'extravert

bon ça marche pas avec modeste aussi mdr il y a qu'avec la première fille que ça passe ("very dom","very idealist") je vais essayer avec ("dom","idealist")

JmanTopic starter

Again, adding new custom traits is what the 'init_function' is for. Like this:
def lucys_init_function(girl): # Remember to change "my_custom_init_function" to something unique, identical to what's mentioned in your _BK.ini

    # This code is executed when your girl is being created (for her first appearance in the slavemarket or in the city)

    if game.has_active_mod("traitking"):
        trait_list = ["Idol", "Passionate", "Sensitive", "Cute", "Expensive", "Arrogant"]
    else:
        trait_list = ["Fascinating", "Sweet", "Sensitive", "Cute", "Expensive", "Defiant"]

    girl.traits = []
    for trait_name in trait_list:
        try:
            girl.add_trait(trait_dict[trait_name])
        except:
            try:
                 error_str = "Bad trait name" + trait_name + " in " + girl.path + "'s custom init function."
                 raise AssertionError(error_str)
            except:
                 raise AssertionError("Trait name in " + girl.path + "'s custom init function is not a string-like thing.")
Boom, no 3-trait limit, no name-checking, no convoluted code.


All this faffing about with parsing .ini files twice and checking names is just complicating your life for no particular gain. If I were this AI, I'd be quite proud of leading you around by the nose. ;D



Your custom personality doesn't work because personalities are supposed to have two 'very X' attributes and no 'not-very' attributes.

At least the AI is kinda right about this.



The game is probably blocking you at 3 traits because you're still passing through regular girl generation. Maybe. I don't know what code you're running, because the one from here certainly won't get you even one single trait, because the trait list is now a list of trait names as strings, not actual traits that do things.
And with strange aeons even death may die...

nemojason

Quote from: nemojason on Apr 09, 2025, 05:12 PMd'après l'ia:

Quand l'erreur se produit ?

Lors de la génération aléatoire d'une esclave (girl.randomize()).

Plus précisément, quand le jeu essaie de générer ses préférences de cadeaux (generate_gift_likes()).

Pourquoi ?

La personnalité de la fille inclut un trait 'extravert' (extravertie), mais le dictionnaire gpersonalities_likes ne contient pas cette entrée.


Je vais changer de valeur pour tester si ça passe, c'est qu'il y a une faille dans l'attribution d'extravert

bon ça marche pas avec modeste aussi mdr il y a qu'avec la première fille que ça passe ("very dom","very idealist") je vais essayer avec ("dom","idealist")

bon j'ai testé aussi mais il n'y a qu'avec ("very dom","very idéalist") que ça marche, le reste plante ... jai pas teste avec la soumission mais de toute façon de façon général, il y a une grosse faille quant à l'utilisation de [custom personality] du fichier _BK.ini

nemojason

Quote from: Jman on Apr 09, 2025, 05:22 PMAgain, adding new custom traits is what the 'init_function' is for. Like this:
def lucys_init_function(girl): # Remember to change "my_custom_init_function" to something unique, identical to what's mentioned in your _BK.ini

    # This code is executed when your girl is being created (for her first appearance in the slavemarket or in the city)

    if game.has_active_mod("traitking"):
        trait_list = ["Idol", "Passionate", "Sensitive", "Cute", "Expensive", "Arrogant"]
    else:
        trait_list = ["Fascinating", "Sweet", "Sensitive", "Cute", "Expensive", "Defiant"]

    girl.traits = []
    for trait_name in trait_list:
        try:
            girl.add_trait(trait_dict[trait_name])
        except:
            try:
                 error_str = "Bad trait name" + trait_name + " in " + girl.path + "'s custom init function."
                 raise AssertionError(error_str)
            except:
                 raise AssertionError("Trait name in " + girl.path + "'s custom init function is not a string-like thing.")
Boom, no 3-trait limit, no name-checking, no convoluted code.


All this faffing about with parsing .ini files twice and checking names is just complicating your life for no particular gain. If I were this AI, I'd be quite proud of leading you around by the nose. ;D



Your custom personality doesn't work because personalities are supposed to have two 'very X' attributes and no 'not-very' attributes.

At least the AI is kinda right about this.



The game is probably blocking you at 3 traits because you're still passing through regular girl generation. Maybe. I don't know what code you're running, because the one from here certainly won't get you even one single trait, because the trait list is now a list of trait names as strings, not actual traits that do things.

la bonne nouvelle c'est qu'il utilise seulement les traits que j'ai écris sur _BK.ini et pas de plantage... la mauvaise ben c'est la limitation à seulement 3 traits xd

voilà le code que j'utilise:

init python:
    import configparser
    import ast
    import re

    def parse_list_string(list_str):
        """Parse une chaîne de liste Python ou CSV en liste réelle, avec nettoyage"""
        try:
            # Nettoie les sauts de ligne et espaces superflus
            cleaned = re.sub(r'\s+', ' ', list_str.strip())
            # Convertit la chaîne en liste Python
            return ast.literal_eval(cleaned)
        except:
            # Fallback pour traitement manuel si le format est invalide
            items = []
            # Gestion des entrées mal formatées avec guillemets/nombres
            for item in re.findall(r'(?:"([^"]*)"|(\b[^,\]]+\b))', cleaned):
                items.append(item[0] if item[0] else item[1])
            return [item.strip() for item in items if item.strip()]

    def load_traits_from_bk_ini():
        """Charge les traits depuis _BK.ini avec le format spécifique"""
        config = configparser.ConfigParser()
        config.read("_BK.ini")
       
        traits = {'positive': [], 'negative': []}
       
        # Section [base positive traits]
        if config.has_section("base positive traits"):
            pos_raw = config.get("base positive traits", "always", fallback="[]")
            traits['positive'] = parse_list_string(pos_raw)
       
        # Section [base negative traits]
        if config.has_section("base negative traits"):
            neg_raw = config.get("base negative traits", "always", fallback="[]")
            traits['negative'] = parse_list_string(neg_raw)
           
        return traits

    def generate_traits(girl):
        """Applique les traits à la fille en respectant le format _BK.ini"""
        if not hasattr(girl, 'traits'):
            girl.traits = []
       
        traits_data = load_traits_from_bk_ini()
       
        # Fusion sans doublons
        girl.traits = list(
            set(girl.traits + traits_data['positive'] + traits_data['negative'])
        )