Wow good luck man... Feels like you'll need it.
EDIT: Thanks to your info I managed to do things. I cannot clean the data except manually (there's also data for non animals that is useless!) but I can aboid creating extra useless data.
I found a workaround by limiting the calls to createrelativesdata, first modifying getrelativename:
func getrelativename(person, person2): var result = null var data1 var data2 if !globals.state.relativesdata.has(person.id) || !globals.state.relativesdata.has(person2.id): return null else: data1 = globals.state.relativesdata[person.id] data2 = globals.state.relativesdata[person2.id] #if globals.state.relativesdata.has(person.id): # data1 = globals.state.relativesdata[person.id] #else: # createrelativesdata(person) # data1 = globals.state.relativesdata[person.id] #if globals.state.relativesdata.has(person2.id): # data2 = globals.state.relativesdata[person2.id] #else: # createrelativesdata(person2) # data2 = globals.state.relativesdata[person2.id] #print(data1, data2) for i in ['mother','father']: if str(data1[i]) == str(data2.id): result = '$parent' elif str(data2[i]) == str(data1.id): result = '$son' for i in [data1, data2]: if i.siblings.has(data1.id) || i.siblings.has(data2.id): result = '$sibling' if result != null: result = person2.dictionary(result) return result
But createrelativesdata is also called in some places of globals.gd: it makes sense for impregnation. But in some other places, it doesn't.
This function tends to create data for a false return. I just return false without creating data instead.
func checkifrelatives(person, person2): var result = false var data1 var data2 if !globals.state.relativesdata.has(person.id) || !globals.state.relativesdata.has(person2.id): return false else: data1 = globals.state.relativesdata[person.id] data2 = globals.state.relativesdata[person2.id] #if globals.state.relativesdata.has(person.id): # data1 = globals.state.relativesdata[person.id] #else: # createrelativesdata(person) # data1 = globals.state.relativesdata[person.id] #if globals.state.relativesdata.has(person2.id): # data2 = globals.state.relativesdata[person2.id] #else: # createrelativesdata(person2) # data2 = globals.state.relativesdata[person2.id] for i in ['mother','father']: if str(data1[i]) == str(data2.id) || str(data2[i]) == str(data1.id): result = true for i in [data1, data2]: if i.siblings.has(data1.id) || i.siblings.has(data2.id): result = true return result
After testing, it seems to work! There is just some issue I noticed: sibilings and step siblings are bugged, and sometimes get errors (comparisons of string names with -1). Unsure if this is prior to modifications or after, but I found some fix to it.
First modify the function connectrelatives, which seems to be the culprit:
func connectrelatives(person1, person2, way): if person1 == null || person2 == null || person1.id == person2.id: return if !globals.state.relativesdata.has(person1.id): createrelativesdata(person1) if !globals.state.relativesdata.has(person2.id): createrelativesdata(person2) if way in ['mother','father']: var entry = globals.state.relativesdata[person1.id] for child in entry.children: connectrelatives(person2, globals.state.relativesdata[child], 'sibling') entry.children.append(person2.id) entry = globals.state.relativesdata[person2.id] entry[way] = person1.id if typeof(person1) != TYPE_DICTIONARY && typeof(person2) != TYPE_DICTIONARY: addrelations(person1, person2, 200) elif way == 'sibling': var entry = globals.state.relativesdata[person1.id] var entry2 = globals.state.relativesdata[person2.id] # if one parent is -1 and the other a string_id, it will throw an error! Need to ensure strings var good_type_mom = (typeof(entry.mother) == typeof(entry2.mother)) && (typeof(entry.mother) == typeof(person1.id)) var good_type_dad = (typeof(entry.father) == typeof(entry2.father)) && (typeof(entry.father) == typeof(person1.id)) var good_types = good_type_mom && good_type_dad if good_types and ((entry.mother == entry2.mother) && (entry.father == entry2.father)): if !entry.siblings.has(entry2.id): entry.siblings.append(entry2.id) if !entry2.siblings.has(entry.id): entry2.siblings.append(entry.id) elif (good_type_mom && (entry.mother == entry2.mother)) || (good_type_dad && (entry.father == entry2.father)): if !entry.halfsiblings.has(entry2.id): entry.halfsiblings.append(entry2.id) if !entry2.halfsiblings.has(entry.id): entry2.halfsiblings.append(entry.id)
And then the problem in its calls, when using impregnation. Change the end of the function impregnation (still in globals.gd):
#calls to connectrelatives is bugged for siblings #problem seems to be at the identification of mother AND father simultaneously #as connectrelatives do not assign both parents simultaneously createrelativesdata(baby) globals.state.relativesdata[baby.id]['mother'] = mother.id if realfather != -1: globals.state.relativesdata[baby.id]['father'] = father.id connectrelatives(father, baby, 'father') connectrelatives(mother, baby, 'mother') mother.preg.baby = baby.id mother.preg.duration = 1 mother.metrics.preg += 1 globals.state.babylist.append(baby)
And this seemed to resolve my issues. Hope it helps other people.