-
-
Notifications
You must be signed in to change notification settings - Fork 2
/
CharacterService_ren.py
178 lines (136 loc) · 5.2 KB
/
CharacterService_ren.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
from __future__ import annotations
from typing import Optional, TYPE_CHECKING
from game.characters.ICharacter_ren import ICharacter
from renpy import store
import renpy.exports as renpy
from game.characters.Relationship_ren import Relationship
from game.characters.Moods_ren import Moods
if TYPE_CHECKING:
from game.characters.PlayableCharacters_ren import PlayableCharacter, mc
"""renpy
init python:
"""
class CharacterService:
@staticmethod
def get_user(character: object) -> ICharacter:
try:
if isinstance(character, PlayableCharacter):
user = mc
else:
user = getattr(store, character.name.lower().replace(" ", "_"))
except AttributeError:
raise AttributeError(f"{character} is not a valid character.")
return user
@staticmethod
def get_relationship(
character: ICharacter, target: Optional[ICharacter] = None
) -> Relationship:
if target is None:
target = mc
if not hasattr(character, "relationships"):
character.relationships = {}
return character.relationships.setdefault(target, Relationship.FRIEND)
@staticmethod
def has_relationship(
character: ICharacter,
relationship: Relationship,
target: Optional[ICharacter] = None,
) -> bool:
if target is None:
target = mc
return CharacterService.get_relationship(character, target) == relationship
@staticmethod
def set_relationship(
character: ICharacter,
relationship: Relationship,
target: Optional[ICharacter] = None,
) -> None:
if target is None:
target = mc
if not hasattr(character, "relationships"):
character.relationships = {}
if not hasattr(target, "relationships"):
target.relationships = {}
if (
character.relationships.setdefault(target, Relationship.FRIEND)
== relationship
):
return
character.relationships[target] = relationship
target.relationships[character] = relationship
@staticmethod
def get_mood(character: ICharacter) -> Moods:
return character.mood
@staticmethod
def has_mood(character: ICharacter, mood: Moods) -> bool:
return mood == character.mood or character.mood & mood == mood
@staticmethod
def set_mood(character: ICharacter, mood: Moods) -> None:
if mood == character.mood:
return
character.mood = mood
@staticmethod
def reset_mood(character: ICharacter) -> None:
character.mood = Moods.NORMAL
@staticmethod
def add_mood(character: ICharacter, mood: Moods) -> None:
if mood == character.mood:
return
if character.mood == Moods.NORMAL:
character.mood = mood
return
character.mood = character.mood | mood
@staticmethod
def remove_mood(character: ICharacter, mood: Moods) -> None:
character.mood = character.mood & ~mood
@staticmethod
def get_profile_pictures(character_name: str) -> list[str]:
directory: str = f"characters/images/{character_name.lower()}"
try:
return [file for file in renpy.list_files() if file.startswith(directory)]
except OSError:
return [
file
for file in renpy.list_files()
if file.startswith("characters/images/chloe")
]
@staticmethod
def is_girlfriend(
character: ICharacter, target: Optional[ICharacter] = None
) -> bool:
if target is None:
target = mc
return CharacterService.has_relationship(
character, Relationship.GIRLFRIEND, target
)
@staticmethod
def is_fwb(character: ICharacter, target: Optional[ICharacter] = None) -> bool:
if target is None:
target = mc
return CharacterService.has_relationship(character, Relationship.FWB, target)
@staticmethod
def is_dating(character: ICharacter, target: Optional[ICharacter] = None) -> bool:
if target is None:
target = mc
return CharacterService.has_relationship(character, Relationship.DATING, target)
@staticmethod
def is_kissed(character: ICharacter, target: Optional[ICharacter] = None) -> bool:
if target is None:
target = mc
return CharacterService.has_relationship(character, Relationship.KISSED, target)
@staticmethod
def is_friend(character: ICharacter, target: Optional[ICharacter] = None) -> bool:
if target is None:
target = mc
return CharacterService.has_relationship(character, Relationship.FRIEND, target)
@staticmethod
def is_ex(character: ICharacter, target: Optional[ICharacter] = None) -> bool:
if target is None:
target = mc
return CharacterService.has_relationship(character, Relationship.EX, target)
@staticmethod
def is_mad(character: ICharacter) -> bool:
return CharacterService.has_mood(character, Moods.MAD)
@staticmethod
def is_threatened(character: ICharacter) -> bool:
return CharacterService.has_mood(character, Moods.THREATENED)