-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcard.py
368 lines (298 loc) · 15 KB
/
card.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
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
import os
import tkinter
import game
import popup
os.environ['PYGAME_HIDE_SUPPORT_PROMPT'] = "hide" # To hide pygame message
import pygame # noqa: E402
class _Card:
"""
A basic card instance.
A card represents the top of the deck, where the player can click to draw a card.
Attributes:
nw_position (Tuple[float, float])
game_instance (Game): the Game instance
card_back (pygame.Surface)
"""
WIDTH, HEIGHT = 180, 240
CARDS = []
TYPES = [] # The card types
def __init__(self, nw_position, game_instance):
"""
Args:
nw_position (Tuple[float, float])
game_instance (game.Game)
"""
self.nw_position = nw_position
self.game = game_instance
self.card_back = pygame.surface.Surface((self.WIDTH, self.HEIGHT), flags=pygame.HWSURFACE | pygame.DOUBLEBUF)
def draw_on(self, surface):
"""
Draw the card on the surface
Args:
surface (pygame.Surface)
Returns:
None
"""
surface.blit(self.card_back, self.nw_position)
def collide(self, loc):
"""
Test if the given location is on the card
Args:
loc (Tuple[float, float])
Returns:
bool:
"""
return self.card_back.get_rect().collidepoint(loc[0] - self.nw_position[0], loc[1] - self.nw_position[1])
def draw(self, i_card, i_player):
"""
Called to draw the card self.CARDS[i_card]
Args:
i_card (int)
i_player (int): the player who draw the card
Returns:
any
"""
pass
class CardBlack(_Card):
"""
Dark cards
A dark card is represented by the tuple (name (str), flag equipment (bool), description (str))
"""
CARDS = [
("Chauve-souris vampire", False,
"Infligez 2 Blessures au joueur de votre choix, puis soignez une de vos Blessures."),
("Chauve-souris vampire", False,
"Infligez 2 Blessures au joueur de votre choix, puis soignez une de vos Blessures."),
("Chauve-souris vampire", False,
"Infligez 2 Blessures au joueur de votre choix, puis soignez une de vos Blessures."),
("Succube tentatrice", False, "Volez une carte équipement au joueur de votre choix."),
("Succube tentatrice", False, "Volez une carte équipement au joueur de votre choix."),
("Araignée sanguinaire", False,
"Vous infligez 2 Blessures au personnage de votre choix, puis vous subissez vous-même 2 Blessures."),
("Poupée démoniaque", False,
"Désignez un joueur et lancez le dé à 6 faces. "
"1 à 4 : infligez lui 3 Blessures. 5 ou 6 subissez 3 Blessures."),
("Dynamite", False,
"Lancez les 2 dés et infligez 3 Blessures à tous les joueurs (vous compris) se trouvant dans le secteur "
"désigné par le total des 2 dés. Il ne se passe rien si ce total est 7."),
("Rituel diabolique", False,
"Si vous êtes un Shadow, et si vous décidez de révéler (ou avez déjà révélé) "
"votre identité, soignez toutes vos Blessures."),
("Peau de banane", False,
"Donnez une de vos cartes équipements à un autre personnage. "
"Si vous n'en possédez aucune, vous encaissez 1 Blessure."),
("Tronçonneuse du mal", True, "Si votre attaque inflige des Blessures, la victime subit 1 Blessure en plus."),
("Hachoir maudit", True, "Si votre attaque inflige des Blessures, la victime subit 1 Blessure en plus."),
("Hache tueuse", True, "Si votre attaque inflige des Blessures, la victime subit 1 Blessure en plus."),
("Revolver des ténèbres", True,
"Vous pouvez attaquer un joueur présent sur l'un des 4 lieux hors de votre secteur, "
"mais vous ne pouvez plus attaquer un joueur situé dans le même secteur que vous."),
("Sabre hanté Masamuné", True,
"Vous êtes obligé d'attaquer durant votre tour. Lancez uniquement le dé à 4 faces, "
"le résultat indique les Blessures que vous infligez."),
("Mitrailleuse funeste", True,
"Votre attaque affecte tous les personnages qui sont à votre porté. "
"Effectuez un seul jet de Blessures pour tous les joueurs concernés.")
]
COLOR = (20, 20, 20)
def __init__(self, nw_position, game_instance):
"""
Args:
nw_position (Tuple[float, float])
"""
super().__init__(nw_position, game_instance)
self.card_back.fill(self.COLOR)
def draw(self, i_card, i_player):
"""
Args:
i_card (int)
i_player (int)
Returns:
None
"""
card = self.CARDS[i_card]
if card[1]:
self.game.characters[i_player].equipments.append((self.__class__, i_card))
class DrawDarkPopup(popup.Popup):
def __init__(self, game_instance):
super().__init__(game_instance)
tkinter.Label(self, text="Le joueur {0} pioche la carte :".format(game.PLAYERS[i_player][0]),
wraplength=600, padx=30, pady=10, font=(None, 16)).pack()
tkinter.Label(self, text=card[0], wraplength=300, padx=30, pady=10, font=(None, 12)).pack()
tkinter.Label(self, text=card[2], wraplength=300, padx=30, pady=10, font=(None, 12)).pack()
tkinter.Button(self, text="Ok", padx=30, pady=10, command=self.destroy).pack(padx=30, pady=30)
self.center()
self.show()
DrawDarkPopup(self.game)
class CardVision(_Card):
"""
Vision cards
A vision card is represented by the tuple (name (str), "I think you are ..." (str), "if so, ..." (str))
Attributes:
game_instance (Game): the Game instance
"""
CARDS = [
("Vision cupide", "Je pense que tu es Neutre ou Shadow",
"Si c'est le cas, tu dois : soit me donner une carte équipement, soit subir une Blessure."),
("Vision cupide", "Je pense que tu es Neutre ou Shadow",
"Si c'est le cas, tu dois : soit me donner une carte équipement, soit subir une Blessure."),
("Vision enivrante", "Je pense que tu es Neutre ou Hunter",
"Si c'est le cas, tu dois : soit me donner une carte équipement, soit subir une Blessure"),
("Vision enivrante", "Je pense que tu es Neutre ou Hunter",
"Si c'est le cas, tu dois : soit me donner une carte équipement, soit subir une Blessure"),
("Vision furtive", "Je pense que tu es Hunter ou Shadow",
"Si c'est le cas, tu dois : soit me donner une carte équipement, soit subir une Blessure."),
("Vision furtive", "Je pense que tu es Hunter ou Shadow",
"Si c'est le cas, tu dois : soit me donner une carte équipement, soit subir une Blessure."),
("Vision mortifère", "Je pense que tu es Hunter", "Si c'est le cas, subis 1 Blessure !"),
("Vision mortifère", "Je pense que tu es Hunter", "Si c'est le cas, subis 1 Blessure !"),
("Vision destructrice", "Je pense que tu es un personnage de 12 Points de vie ou plus",
"Si c'est le cas, subis 2 Blessures !"),
("Vision clairvoyante", "Je pense que tu es un personnage de 11 Points de vie ou moins",
"Si c'est le cas, subis 1 Blessures !"),
("Vision divine", "Je pense que tu es Hunter",
"Si c'est le cas, soigne 1 Blessure. (Toutefois, si tu n'avais aucune blessure, subis 1 Blessure !)"),
("Vision réconfortante", "Je pense que tu es Neutre",
"Si c'est le cas, soigne 1 Blessure. (Toutefois, si tu n'avais aucune blessure, subis 1 Blessure !)"),
("Vision lugubre", "Je pense que tu es Shadow",
"Si c'est le cas, soigne 1 Blessure. (Toutefois, si tu n'avais aucune blessure, subis 1 Blessure !)"),
("Vision foudroyante", "Je pense que tu es Shadow", "Si c'est le cas, subis 1 Blessure !"),
("Vision purificatrice", "Je pense que tu es Shadow", "Si c'est le cas, subis 2 Blessures !"),
("Vision suprème", "", "Monte moi secrètement ta carte Personnage !")
]
COLOR = (0, 255, 0)
def __init__(self, nw_position, game_instance):
"""
Args:
nw_position (Tuple[float, float])
game_instance (Game)
"""
super().__init__(nw_position, game_instance)
self.card_back.fill(self.COLOR)
def draw(self, i_card, i_player):
"""
Args:
i_card (int)
i_player (int)
Returns:
int: who to send the vision card
"""
card = self.CARDS[i_card]
class DrawVisionPopup(popup.Popup):
def __init__(self, game_instance):
super().__init__(game_instance)
self.i = -1
tkinter.Label(self, text="A quel joueur voulez vous donner cette vision ?",
wraplength=600, padx=30, pady=10, font=(None, 16)).pack()
tkinter.Label(self, text=card[0], wraplength=300, padx=30, pady=10, font=(None, 12)).pack()
tkinter.Label(self, text=card[1], wraplength=300, padx=30, pady=10, font=(None, 12)).pack()
tkinter.Label(self, text=card[2], wraplength=300, padx=30, pady=10, font=(None, 12)).pack()
frame = tkinter.Frame(self)
self.var = tkinter.IntVar()
self.var.set(-1)
for i in range(len(game.PLAYERS)):
if i != self._game.client.i:
tkinter.Radiobutton(frame, text=game.PLAYERS[i][0], variable=self.var, value=i).grid(
row=i // 4, column=i % 4, sticky=tkinter.W, padx=10, pady=10)
frame.pack()
tkinter.Button(self, text="Ok", padx=30, pady=10, command=self.answer).pack(padx=30, pady=30)
self.center()
self.show()
def answer(self):
self.i = self.var.get()
if self.i >= 0:
self.destroy()
return DrawVisionPopup(self.game).i
def answer(self, i_card, i_from):
"""
Answer the vision i_card from player i_from
Args:
i_card (int)
i_from (int)
Returns:
None
"""
card = self.CARDS[i_card]
class AnswerVisionPopup(popup.Popup):
def __init__(self, game_instance):
super().__init__(game_instance)
tkinter.Label(self, text="Le joueur {0} vous donne la vision :".format(game.PLAYERS[i_from][0]),
wraplength=600, padx=30, pady=10, font=(None, 16)).pack()
tkinter.Label(self, text=card[0], wraplength=300, padx=30, pady=10, font=(None, 12)).pack()
tkinter.Label(self, text=card[1], wraplength=300, padx=30, pady=10, font=(None, 12)).pack()
tkinter.Label(self, text=card[2], wraplength=300, padx=30, pady=10, font=(None, 12)).pack()
tkinter.Button(self, text="Ok", padx=30, pady=10, command=self.destroy).pack(padx=30, pady=30)
self.center()
self.show()
AnswerVisionPopup(self.game)
class CardWhite(_Card):
"""
White cards
A white card is represented by the tuple (name (str), flag equipment (bool), description (str))
"""
CARDS = [
("Éclair purificateur", False, "Chaque personnage, à l'exception de vous même, subit 2 Blessures."),
("Eau bénite", False, "Vous êtes soigné de 2 Blessures."),
("Eau bénite", False, "Vous êtes soigné de 2 Blessures."),
("Savoir ancestral", False, "Lorsque votre tour est terminé, jouez immédiatement un nouveau tour."),
("Avènement suprème", False,
"Si vous êtes un Hunter, vous pouvez révéler votre identité. Si vous le faites, ou si vous êtes déjà révélé, "
"vous soignez toutes vos Blessures."),
("Miroir divin", False, "Si vous êtes un Shadow, autre que Métamorphe, vous devez révéler votre identité."),
("Premiers secours", False,
"Placez le marqueur de Blessures du joueur de votre choix (y compris vous) sur le 7."),
("Ange gardien", False,
"Les attaques ne vous infligent aucune Blessure jusqu'à la fin de votre prochain tour."),
("Barre de chocolat", False,
"Si vous êtes Allie, Agnes, Emi, Ellen, Momie ou Métamorphe, et que vous choisissez de révéler "
"(ou avez déjà révélé) votre identité, vous soignez toutes vos Blessures."),
("Bénédiction", False,
"Choisissez un joueur autre que vous même et lancez le dé à 6 faces. "
"Ce joueur guérit d'autant de Blessures que le résultat du dé."),
("Crucifix en argent", True,
"Si vous attaquez et tuez un autre personnage, vous récupérez toutes ses cartes équipements."),
("Toge sainte", True,
"Vos attaques infligent 1 Blessure en moins, et les Blessures que vous subissez sont réduites de 1."),
("Lance de Longinus", True,
"Si vous êtes un Hunter, et que votre identité est révélée, chaque fois qu'une de vos attaque inflige des "
"Blessures, vous infligez 2 Blessures supplémentaires."),
("Amulette", True,
"Vous ne subissez aucune Blessure causée par les cartes Ténèbres : "
"Araignée sanguinaire, Dynamite ou Chauve-souris vampire."),
("Broche de chance", True,
"Un joueur dans la Forêt hantée ne peut pas utiliser le pouvoir du Lieu pour vous infliger des Blessures "
"(mais il peut toujours vous guérir)."),
("Boussole mystique", True,
"Quand vous vous déplacez, vous pouvez lancer 2 fois les dés, et choisir quel résultat utiliser."),
]
COLOR = (255, 255, 255)
def __init__(self, nw_position, game_instance):
"""
Args:
nw_position (Tuple[float, float])
"""
super().__init__(nw_position, game_instance)
self.card_back.fill(self.COLOR)
def draw(self, i_card, i_player):
"""
Args:
i_card (int)
i_player (int)
Returns:
None
"""
card = self.CARDS[i_card]
if card[1]:
self.game.characters[i_player].equipments.append((CardWhite, i_card))
class DrawWhitePopup(popup.Popup):
def __init__(self, game_instance):
super().__init__(game_instance)
tkinter.Label(self, text="Le joueur {0} pioche la carte :".format(game.PLAYERS[i_player][0]),
wraplength=600, padx=30, pady=10, font=(None, 16)).pack()
tkinter.Label(self, text=card[0], wraplength=300, padx=30, pady=10, font=(None, 12)).pack()
tkinter.Label(self, text=card[2], wraplength=300, padx=30, pady=10, font=(None, 12)).pack()
tkinter.Button(self, text="Ok", padx=30, pady=10, command=self.destroy).pack(padx=30, pady=30)
self.center()
self.show()
DrawWhitePopup(self.game)
TYPES = [CardBlack, CardVision, CardWhite]