It's based off of relationship lvl the higher you go the more times you can chat.
Quick note: Need to update the chat counters in sleep.rpy to 1 instead of 0.
As a result, after the first day, you'll get one more topic than supposed to at the relationship level. At >= 40, you'll get 4 topics, not 3. And the same goes for other relationship levels.
EDIT: You're also missing angela_chat_counter in sleep.rpy
2ndEDIT: Regarding the change_rel method in script.rpy, I would recommend making another variable that is the total amount added (ie, change * relationship_multi). As it is, while the correct amount is added to the relationship, the text is showing the wrong number as you're just providing the change value, not the total value(ie, "Relationship + 1" when it should be "Relationship + 2")
2ndEDIT-A: You can also use the same change *= relationship_multi and then set rel = change + rel
3rd EDIT: In chat.rpy, for grace_money, you have an extra "jump chat" where it shouldn't be, it's bypassing all the relationship level checks, effectively giving you a free extra topic. Same with the photography topic for everyone. And other topics as well.
4th EDIT: This may be just me, but I'm of the opinion that the scripted conversations (ie, Izumi about Byron being about to be clubbed, Lara asking you for help with the assignment, and Ajay inviting you to the gym) should also set their respective chat_done = True.
5thEDIT: For chat, in a topic, would recommend setting elif for people below the first person (ie if talk_person == "lara" elif talk_person == "angela"), that way the code doesn't bother doing the other checks once the first match has been found (ie, it's Laura, no need to check if it's Angela too).