1
1
from __future__ import annotations
2
2
3
3
from dataclasses import dataclass
4
- from typing import Iterable , Dict , List , Union , FrozenSet
4
+ from typing import Iterable , Dict , List , Union , FrozenSet , Set
5
5
6
6
from BaseClasses import CollectionState , ItemClassification
7
7
from .items import item_table
@@ -14,13 +14,13 @@ def __call__(self, state: CollectionState) -> bool:
14
14
raise NotImplementedError
15
15
16
16
def __or__ (self , other ) -> StardewRule :
17
- if isinstance (other , Or ) :
17
+ if type (other ) is Or :
18
18
return Or (self , * other .rules )
19
19
20
20
return Or (self , other )
21
21
22
22
def __and__ (self , other ) -> StardewRule :
23
- if isinstance (other , And ) :
23
+ if type (other ) is And :
24
24
return And (other .rules .union ({self }))
25
25
26
26
return And (self , other )
@@ -80,28 +80,36 @@ def get_difficulty(self):
80
80
return 999999999
81
81
82
82
83
+ false_ = False_ ()
84
+ true_ = True_ ()
85
+ assert false_ is False_ ()
86
+ assert true_ is True_ ()
87
+
88
+
83
89
class Or (StardewRule ):
84
90
rules : FrozenSet [StardewRule ]
85
91
86
92
def __init__ (self , rule : Union [StardewRule , Iterable [StardewRule ]], * rules : StardewRule ):
87
- rules_list = set ()
93
+ rules_list : Set [StardewRule ]
94
+
88
95
if isinstance (rule , Iterable ):
89
- rules_list . update ( rule )
96
+ rules_list = { * rule }
90
97
else :
91
- rules_list . add ( rule )
98
+ rules_list = { rule }
92
99
93
100
if rules is not None :
94
101
rules_list .update (rules )
95
102
96
103
assert rules_list , "Can't create a Or conditions without rules"
97
104
98
- new_rules = set ()
99
- for rule in rules_list :
100
- if isinstance (rule , Or ):
101
- new_rules .update (rule .rules )
102
- else :
103
- new_rules .add (rule )
104
- rules_list = new_rules
105
+ if any (type (rule ) is Or for rule in rules_list ):
106
+ new_rules : Set [StardewRule ] = set ()
107
+ for rule in rules_list :
108
+ if type (rule ) is Or :
109
+ new_rules .update (rule .rules )
110
+ else :
111
+ new_rules .add (rule )
112
+ rules_list = new_rules
105
113
106
114
self .rules = frozenset (rules_list )
107
115
@@ -112,11 +120,11 @@ def __repr__(self):
112
120
return f"({ ' | ' .join (repr (rule ) for rule in self .rules )} )"
113
121
114
122
def __or__ (self , other ):
115
- if isinstance ( other , True_ ) :
123
+ if other is true_ :
116
124
return other
117
- if isinstance ( other , False_ ) :
125
+ if other is false_ :
118
126
return self
119
- if isinstance (other , Or ) :
127
+ if type (other ) is Or :
120
128
return Or (self .rules .union (other .rules ))
121
129
122
130
return Or (self .rules .union ({other }))
@@ -131,17 +139,17 @@ def get_difficulty(self):
131
139
return min (rule .get_difficulty () for rule in self .rules )
132
140
133
141
def simplify (self ) -> StardewRule :
134
- if any ( isinstance ( rule , True_ ) for rule in self .rules ) :
135
- return True_ ()
142
+ if true_ in self .rules :
143
+ return true_
136
144
137
- simplified_rules = {rule .simplify () for rule in self .rules }
138
- simplified_rules = { rule for rule in simplified_rules if rule is not False_ ()}
145
+ simplified_rules = [ simplified for simplified in {rule .simplify () for rule in self .rules }
146
+ if simplified is not false_ ]
139
147
140
148
if not simplified_rules :
141
- return False_ ()
149
+ return false_
142
150
143
151
if len (simplified_rules ) == 1 :
144
- return next ( iter ( simplified_rules ))
152
+ return simplified_rules [ 0 ]
145
153
146
154
return Or (simplified_rules )
147
155
@@ -150,25 +158,26 @@ class And(StardewRule):
150
158
rules : FrozenSet [StardewRule ]
151
159
152
160
def __init__ (self , rule : Union [StardewRule , Iterable [StardewRule ]], * rules : StardewRule ):
153
- rules_list = set ()
161
+ rules_list : Set [StardewRule ]
162
+
154
163
if isinstance (rule , Iterable ):
155
- rules_list . update ( rule )
164
+ rules_list = { * rule }
156
165
else :
157
- rules_list . add ( rule )
166
+ rules_list = { rule }
158
167
159
168
if rules is not None :
160
169
rules_list .update (rules )
161
170
162
- if len ( rules_list ) < 1 :
163
- rules_list .add (True_ () )
164
-
165
- new_rules = set ()
166
- for rule in rules_list :
167
- if isinstance (rule , And ) :
168
- new_rules .update (rule .rules )
169
- else :
170
- new_rules .add (rule )
171
- rules_list = new_rules
171
+ if not rules_list :
172
+ rules_list .add (true_ )
173
+ elif any ( type ( rule ) is And for rule in rules_list ):
174
+ new_rules : Set [ StardewRule ] = set ()
175
+ for rule in rules_list :
176
+ if type (rule ) is And :
177
+ new_rules .update (rule .rules )
178
+ else :
179
+ new_rules .add (rule )
180
+ rules_list = new_rules
172
181
173
182
self .rules = frozenset (rules_list )
174
183
@@ -179,11 +188,11 @@ def __repr__(self):
179
188
return f"({ ' & ' .join (repr (rule ) for rule in self .rules )} )"
180
189
181
190
def __and__ (self , other ):
182
- if isinstance ( other , True_ ) :
191
+ if other is true_ :
183
192
return self
184
- if isinstance ( other , False_ ) :
193
+ if other is false_ :
185
194
return other
186
- if isinstance (other , And ) :
195
+ if type (other ) is And :
187
196
return And (self .rules .union (other .rules ))
188
197
189
198
return And (self .rules .union ({other }))
@@ -198,17 +207,17 @@ def get_difficulty(self):
198
207
return max (rule .get_difficulty () for rule in self .rules )
199
208
200
209
def simplify (self ) -> StardewRule :
201
- if any ( isinstance ( rule , False_ ) for rule in self .rules ) :
202
- return False_ ()
210
+ if false_ in self .rules :
211
+ return false_
203
212
204
- simplified_rules = {rule .simplify () for rule in self .rules }
205
- simplified_rules = { rule for rule in simplified_rules if rule is not True_ ()}
213
+ simplified_rules = [ simplified for simplified in {rule .simplify () for rule in self .rules }
214
+ if simplified is not true_ ]
206
215
207
216
if not simplified_rules :
208
- return True_ ()
217
+ return true_
209
218
210
219
if len (simplified_rules ) == 1 :
211
- return next ( iter ( simplified_rules ))
220
+ return simplified_rules [ 0 ]
212
221
213
222
return And (simplified_rules )
214
223
@@ -218,11 +227,12 @@ class Count(StardewRule):
218
227
rules : List [StardewRule ]
219
228
220
229
def __init__ (self , count : int , rule : Union [StardewRule , Iterable [StardewRule ]], * rules : StardewRule ):
221
- rules_list = []
230
+ rules_list : List [StardewRule ]
231
+
222
232
if isinstance (rule , Iterable ):
223
- rules_list . extend ( rule )
233
+ rules_list = [ * rule ]
224
234
else :
225
- rules_list . append ( rule )
235
+ rules_list = [ rule ]
226
236
227
237
if rules is not None :
228
238
rules_list .extend (rules )
@@ -260,11 +270,12 @@ class TotalReceived(StardewRule):
260
270
player : int
261
271
262
272
def __init__ (self , count : int , items : Union [str , Iterable [str ]], player : int ):
263
- items_list = []
273
+ items_list : List [str ]
274
+
264
275
if isinstance (items , Iterable ):
265
- items_list . extend ( items )
276
+ items_list = [ * items ]
266
277
else :
267
- items_list . append ( items )
278
+ items_list = [ items ]
268
279
269
280
assert items_list , "Can't create a Total Received conditions without items"
270
281
for item in items_list :
0 commit comments