Ah, I think I got it. In cGirlTorture.cpp
if (m_Girl->spirit() < 20 && m_Girl->health() < 20 ) {
add_trait("Broken Will", 5 + nWeekMod / 2);
}
if (m_Girl->bdsm() > 30) {
add_trait("Masochist", 10 + nWeekMod);
}
if (m_Girl->health() < 10) {
add_trait("Mind Fucked", 10 + nWeekMod);
}
Looks like this traits are temporary by design here. You can easily obtain them, since they depends on spirit, bdsm and health only.
But in cDungeon.cpp (for example, Broken Will)
if (!girl->has_trait("Broken Will"))
{
chance = d_girl->m_Weeks * 10; // Number of weeks in dungeon
chance += 200 - girl->spirit() - girl->health();
chance /= chance_div;
if (girl->has_trait("Iron Will"))
{
chance /= 2;
}
if (g_Dice.percent(chance))
{
girl->add_trait("Broken Will", false);
msg = girlName + " has gained the trait \"Broken Will\".";
summary += msg + "\n";
girl->m_Events.AddMessage( msg, IMGTYPE_BDSM, EVENT_WARNING);
t_girl->m_Events.AddMessage( msg, IMGTYPE_PROFILE, EVENT_DUNGEON);
}
}
I think, at first this traits are temporary, but if girl spend enough time in dungeon, traits became permanent. Messages for temporary and permanent traits are not the same: "girl name + has gained trait + trait + from being tortured" for temporary and "girl name + has gained the trait +trait" for permanent. Unfortunately, they have the same names in statistic screen.
Sorry for bad English