I'd go beyond saying it's simple and instead say it's simply flat out bad design. There are hilarious sequence breaks that can happen due to how simple the logic is.
Assuming you're literally only checking the int values rather than checking a bunch of boolean flags, try the following instead: make every character an object with more than just the friendship values being checked and actually check if a character is available for an act if they're involved in a scene. Hell, I'll give you a freebie - If you completely ignore Maria and keep her at level 1 while going through android's story, you can unlock sex with her - and that also unlocks the repeatable sex scene in Maria's room - and you can also do this during her quiet period. I can name literally dozens of these cases. Example object properties you want (far from exhaustive): {friendship:int,affection:int,(etc),nymphotrait:bool,inlove:bool,isAvailableForSex:bool,isAvailableForBJ:bool,canWander:bool,wanderlocation:string(/int depending on how you're storing locations)}. You can probably see where this goes. If Maria.isAvailableForSex was false in my example, that wouldn't happen. Seems like a lot of work up front, but saves you a lot of time trying to think shit out in the long run.
Have a function to check and return what properties on the characters are actually at fault - I remember this one friendship scene where Maria needed both affection and exhibitionism at a specific level but the message returned was only "Maria's affection is too low" or something. Actually check via function and return, don't use static errors. I'd also recommend "greying out" things like obedience on repeatable events (IE Lin/Android head pats in kitchen) once you pass the trait threshold so that people don't waste their time.
And dear god fix the store UI it is hot garbage, holy fuck.