new migrations in apps.epic for .models additions, incl. Significator select order (= Start Role seat order), which cards of whom go into which deck, which are brought into Sig select; new select-sig urlpattern in .views; room.html supports this stage of game now
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
This commit is contained in:
@@ -148,6 +148,9 @@ def debit_token(user, slot, token):
|
||||
room.save()
|
||||
|
||||
|
||||
SIG_SEAT_ORDER = ["PC", "NC", "EC", "SC", "AC", "BC"]
|
||||
|
||||
|
||||
class TableSeat(models.Model):
|
||||
PC = "PC"
|
||||
BC = "BC"
|
||||
@@ -174,6 +177,10 @@ class TableSeat(models.Model):
|
||||
role = models.CharField(max_length=2, choices=ROLE_CHOICES, null=True, blank=True)
|
||||
role_revealed = models.BooleanField(default=False)
|
||||
seat_position = models.IntegerField(null=True, blank=True)
|
||||
significator = models.ForeignKey(
|
||||
"TarotCard", null=True, blank=True,
|
||||
on_delete=models.SET_NULL, related_name="significator_seats",
|
||||
)
|
||||
|
||||
|
||||
class DeckVariant(models.Model):
|
||||
@@ -318,3 +325,52 @@ class TarotDeck(models.Model):
|
||||
"""Reset the deck so all variant cards are available again."""
|
||||
self.drawn_card_ids = []
|
||||
self.save(update_fields=["drawn_card_ids"])
|
||||
|
||||
|
||||
# ── Significator deck helpers ─────────────────────────────────────────────────
|
||||
|
||||
def sig_deck_cards(room):
|
||||
"""Return 36 TarotCard objects forming the Significator deck (18 unique × 2).
|
||||
|
||||
PC/BC pair → WANDS + PENTACLES court cards (numbers 11–14): 8 unique
|
||||
SC/AC pair → SWORDS + CUPS court cards (numbers 11–14): 8 unique
|
||||
NC/EC pair → MAJOR arcana numbers 0 and 1: 2 unique
|
||||
Total: 18 unique × 2 (levity + gravity piles) = 36 cards.
|
||||
"""
|
||||
deck_variant = room.owner.equipped_deck
|
||||
if deck_variant is None:
|
||||
return []
|
||||
wands_pentacles = list(TarotCard.objects.filter(
|
||||
deck_variant=deck_variant,
|
||||
arcana=TarotCard.MINOR,
|
||||
suit__in=[TarotCard.WANDS, TarotCard.PENTACLES],
|
||||
number__in=[11, 12, 13, 14],
|
||||
))
|
||||
swords_cups = list(TarotCard.objects.filter(
|
||||
deck_variant=deck_variant,
|
||||
arcana=TarotCard.MINOR,
|
||||
suit__in=[TarotCard.SWORDS, TarotCard.CUPS],
|
||||
number__in=[11, 12, 13, 14],
|
||||
))
|
||||
major = list(TarotCard.objects.filter(
|
||||
deck_variant=deck_variant,
|
||||
arcana=TarotCard.MAJOR,
|
||||
number__in=[0, 1],
|
||||
))
|
||||
unique_cards = wands_pentacles + swords_cups + major # 18 unique
|
||||
return unique_cards + unique_cards # × 2 = 36
|
||||
|
||||
|
||||
def sig_seat_order(room):
|
||||
"""Return TableSeats in canonical PC→NC→EC→SC→AC→BC order."""
|
||||
_order = {r: i for i, r in enumerate(SIG_SEAT_ORDER)}
|
||||
seats = list(room.table_seats.all())
|
||||
return sorted(seats, key=lambda s: _order.get(s.role, 99))
|
||||
|
||||
|
||||
def active_sig_seat(room):
|
||||
"""Return the first seat without a significator in canonical order, or None."""
|
||||
for seat in sig_seat_order(room):
|
||||
if seat.significator_id is None:
|
||||
return seat
|
||||
return None
|
||||
|
||||
Reference in New Issue
Block a user