This commit is contained in:
Nikolaj
2025-01-20 15:28:32 +01:00
parent 2f56f0a633
commit 988243fc4a
2 changed files with 62 additions and 25 deletions

View File

@@ -102,23 +102,23 @@
"pages": [ "pages": [
[ [
"The Party (Before Session)", "The Party (Before Session)",
"- [Adrian/0] [Goldenleaf/0], a [high/4] [elf/1] [rogue/7] from [Volantis/5] and owner of the [Goldenleaf/0] [inn/1].", "- [Adrian/0+6] [Goldenleaf/0], a [high/4] [elf/1] [rogue/7] from [Volantis/5] and owner of the [Goldenleaf/0] [inn/1].",
"- [Andromedes/0] [Moklus/0], a [dwarf/1] [artificer/7] from [Hammerhome/5] and [diplomat/1] in [Dragonsong/5].", "- [Andromedes/0+6] [Moklus/0], a [dwarf/1] [artificer/7] from [Hammerhome/5] and [diplomat/1] in [Dragonsong/5].",
"- [Aslak/0], an [orc/1] [barbarian/7]/[monk/7] from [The%Westerlands/5] and [trainee/1] of [Nix/0] [McGalloway/0].", "- [Aslak/0], an [orc/1] [barbarian/7]/[monk/7] from [The%Westerlands/5] and [trainee/1] of [Nix/0+6] [McGalloway/0].",
"- [Marigold/0] [Sagemonger/0], a [high/4] [elf/1] [wizard/7] from [The%Empire/5] and owner of [Sagemonger/0]'s.", "- [Marigold/0+6] [Sagemonger/0], a [high/4] [elf/1] [wizard/7] from [The%Empire/5] and owner of [Sagemonger/0]'s.",
"- [Nix/0] [McGalloway/0], a [changeling/1] [monk/7] from [The%Westerlands/5] and owner of the [flying/4] [pegasus/1].", "- [Nix/0+6] [McGalloway/0], a [changeling/1] [monk/7] from [The%Westerlands/5] and owner of the [flying/4] [pegasus/1].",
"- [Sam/0], a [satyr/1] [cleric/7] from [The%Feywilds/5].", "- [Sam/0], a [satyr/1] [cleric/7] from [The%Feywilds/5].",
"- [Silvan/0], a [human/1] [fighter/7] from [The%Empire/5] and formerly a [trainee/1] of [Paterius/0] [Enkelton/0]." "- [Silvan/0], a [human/1] [fighter/7] from [The%Empire/5] and formerly a [trainee/1] of [Paterius/0+6] [Enkelton/0]."
], ],
[ [
"Present Threats", "Present Threats",
"- [Lord/6] [Edgar/0] [Darkwood/0] is [gathering/3] [power/1] in his [tower/1], far away from civilization.", "- [Lord+Edgar/0+6] [Darkwood/0] is [gathering/3] [power/1] in his [tower/1], far away from civilization.",
"- [Volynthia/0], a [green/2] [dragon/1], is trying to [escape/3] from [The%Feywilds/5], helped by a group of [orc/1]s.", "- [Volynthia/0], a [green/2] [dragon/1], is trying to [escape/3] from [The%Feywilds/5], helped by a group of [orc/1]s.",
"- A [war/1] is raging between [Lady/6] [Valeria/0] [Argyn/0] and the [giant/1]s, for control of [Giant's%Heart/5]." "- A [war/1] is raging between [Lady+Valeria/0+6] [Argyn/0] and the [giant/1]s, for control of [Giant's%Heart/5]."
], ],
[ [
"Before the Session", "Before the Session",
"The [purple/2] [rose/1], also known as the [soup/1] [bandit/1]s, have been [terrorizing/3] the citizens of [Dragonsong/5] by [eating/3] all of their [soup/1]. They also [kidnapped/3] [Galinndan/0], friend of [Adrian/0] [Goldenleaf/0] and chef of the [Goldenleaf/0] [inn/1]. They are lead by [Valindis/0] [Half-ear/0] and are headquartered in the [Dragonsong/5] [sewers/1]." "The [purple/2] [rose/1], also known as the [soup/1] [bandit/1]s, have been [terrorizing/3] the citizens of [Dragonsong/5] by [eating/3] all of their [soup/1]. They also [kidnapped/3] [Galinndan/0], friend of [Adrian/0+6] [Goldenleaf/0] and chef of the [Goldenleaf/0] [inn/1]. They are lead by [Valindis/0+6] [Half-ear/0] and are headquartered in the [Dragonsong/5] [sewers/1]."
], ],
[ [
"Into the Dark", "Into the Dark",
@@ -126,7 +126,7 @@
], ],
[ [
"The Plan", "The Plan",
"The party [trick/3] [Valindis/0] [Half-ear/0] by \"[capturing/3]\" [Nix/0] [McGalloway/0] [disguised/3] as [Adrian/0] [Goldenleaf/0]." "The party [trick/3] [Valindis/0+6] [Half-ear/0] by \"[capturing/3]\" [Nix/0+6] [McGalloway/0] [disguised/3] as [Adrian/0+6] [Goldenleaf/0]."
] ]
] ]
} }

67
main.py
View File

@@ -55,6 +55,7 @@ TEXT_HEIGHT = TEXT_PAGE_HEIGHT - PAGE_BORDER_WIDTH*2 - TEXT_MARGIN*2
WORD_SLOT_SPACING = " "*16 WORD_SLOT_SPACING = " "*16
WORD_SLOT_NUDGING = 25 WORD_SLOT_NUDGING = 25
WORD_SLOT_NUDGE_DOWN = -5 WORD_SLOT_NUDGE_DOWN = -5
SLANT = 80
INDICATOR_SIZE = 80 INDICATOR_SIZE = 80
INDICATOR_BORDER = 20 INDICATOR_BORDER = 20
@@ -95,14 +96,14 @@ class Page():
text: None|str text: None|str
position: Vector2 position: Vector2
size: Vector2 size: Vector2
slots: list[tuple[str,WordSlot]] slots: list[tuple[list[str],WordSlot]]
def solved(self): def solved(self):
if any([s[1].word is None for s in self.slots]): if any([s[1].word is None for s in self.slots]):
return SolvedState.NotFinished return SolvedState.NotFinished
elif all([s[1].word.word == s[0] for s in self.slots]): elif all([s[1].word.word in s[0] for s in self.slots]):
return SolvedState.Correct return SolvedState.Correct
elif sum([s[1].word.word == s[0] for s in self.slots]) >= len(self.slots)-2: elif sum([s[1].word.word in s[0] for s in self.slots]) >= len(self.slots)-2:
return SolvedState.AlmostCorrect return SolvedState.AlmostCorrect
else: else:
return SolvedState.Wrong return SolvedState.Wrong
@@ -120,7 +121,7 @@ class Word():
@dataclass @dataclass
class WordSlot(): class WordSlot():
color: None|WordColor colors: None|list[WordColor]
page: Page page: Page
position: Vector2 position: Vector2
word: None|Word = None word: None|Word = None
@@ -185,10 +186,10 @@ def draw_page(page: Page, screen: pygame.surface.Surface, font: pygame.font.Font
def draw_word_slot(word_slot: WordSlot, screen: pygame.surface.Surface): def draw_word_slot(word_slot: WordSlot, screen: pygame.surface.Surface):
pos = word_slot.page.position+word_slot.position pos = word_slot.page.position+word_slot.position
if word_slot.color is None: if word_slot.colors is None:
color = "#00000000" color = "#00000000"
else: else:
color = word_slot.color.color() color = word_slot.colors[0].color()
pygame.draw.rect( pygame.draw.rect(
screen, screen,
@@ -202,6 +203,42 @@ def draw_word_slot(word_slot: WordSlot, screen: pygame.surface.Surface):
border_radius=WORD_BORDER_RADIUS border_radius=WORD_BORDER_RADIUS
) )
if len(word_slot.colors) > 1:
pygame.draw.rect(
screen,
word_slot.colors[1].color(),
pygame.Rect(
pos.x + WORD_BORDER_WIDTH + WORD_WIDTH//4,
pos.y + WORD_BORDER_WIDTH,
(WORD_WIDTH*3)//4 - WORD_BORDER_WIDTH*2,
WORD_HEIGHT - WORD_BORDER_WIDTH*2
),
border_radius=WORD_BORDER_RADIUS
)
pygame.draw.polygon(
screen,
color,
[
(
pos.x + WORD_BORDER_WIDTH + WORD_WIDTH//4,
pos.y + WORD_BORDER_WIDTH
),
(
pos.x + WORD_BORDER_WIDTH + WORD_WIDTH//2 + SLANT//2,
pos.y + WORD_BORDER_WIDTH
),
(
pos.x + WORD_BORDER_WIDTH + WORD_WIDTH//2 - SLANT//2,
pos.y + WORD_BORDER_WIDTH + WORD_HEIGHT - WORD_BORDER_WIDTH*2 - 1
),
(
pos.x + WORD_BORDER_WIDTH + WORD_WIDTH//4,
pos.y + WORD_BORDER_WIDTH + WORD_HEIGHT - WORD_BORDER_WIDTH*2 - 1
),
]
)
def draw_word(word: Word, screen: pygame.surface.Surface, font: pygame.font.Font): def draw_word(word: Word, screen: pygame.surface.Surface, font: pygame.font.Font):
if word.page is not None: if word.page is not None:
pos = word.page.position+word.position pos = word.page.position+word.position
@@ -340,7 +377,7 @@ def main(data: dict):
new_text.append("") new_text.append("")
text_words = t.split(" ") text_words = t.split(" ")
for w in text_words: for w in text_words:
res = re.findall(r"([^\] ]*)\[(.*?)\/(\d)\]([^\[ ]*)",w) res = re.findall(r"([^\] ]*)\[(.*?)\/([\d\+]+)\]([^\[ ]*)",w)
if res == []: if res == []:
new_text = add_to_text(new_text,w) new_text = add_to_text(new_text,w)
else: else:
@@ -358,9 +395,9 @@ def main(data: dict):
) )
# if new_text[-1] != WORD_SLOT_SPACING+slot[2]: # if new_text[-1] != WORD_SLOT_SPACING+slot[2]:
pos.x += WORD_SLOT_NUDGING pos.x += WORD_SLOT_NUDGING
new_slot = WordSlot(WordColor(int(slot[2])),p,pos) new_slot = WordSlot([WordColor(int(i)) for i in slot[2].split("+")],p,pos)
word_slots.append(new_slot) word_slots.append(new_slot)
p.slots.append((slot[1].replace("%"," "),new_slot)) p.slots.append((slot[1].replace("%"," ").split("+"),new_slot))
p.text = new_text p.text = new_text
@@ -375,7 +412,7 @@ def main(data: dict):
all_words = [w.word for w in words] all_words = [w.word for w in words]
for p in pages: for p in pages:
not_present = [s[0] for s in p.slots if s[0] not in all_words] not_present = [word for s in p.slots for word in s[0] if word not in all_words]
if not_present: if not_present:
print(not_present) print(not_present)
@@ -436,7 +473,7 @@ def main(data: dict):
break break
if slot is None: if slot is None:
if held_word is not None and held_word.slot.color is not None: if held_word is not None and held_word.slot.colors is not None:
words.remove(held_word) words.remove(held_word)
held_word = None held_word = None
return return
@@ -446,11 +483,11 @@ def main(data: dict):
held_word.page = None held_word.page = None
slot.word = None slot.word = None
elif held_word is not None and slot.word is None: elif held_word is not None and slot.word is None:
if slot.color is not None and slot.color != held_word.color: if slot.colors is not None and held_word.color not in slot.colors:
return return
slot.word = held_word slot.word = held_word
if slot.color is not None and held_word.slot.color is None: if slot.colors is not None and held_word.slot.colors is None:
new_word = slot.word.copy() new_word = slot.word.copy()
new_word.page = slot.word.slot.page new_word.page = slot.word.slot.page
new_word.position = slot.word.slot.position new_word.position = slot.word.slot.position
@@ -458,7 +495,7 @@ def main(data: dict):
new_word.slot.word = new_word new_word.slot.word = new_word
words.append(new_word) words.append(new_word)
if slot.word.slot.color is None or slot.color is not None: if slot.word.slot.colors is None or slot.colors is not None:
slot.word.position = slot.position slot.word.position = slot.position
slot.word.page = slot.page slot.word.page = slot.page
slot.word.slot = slot slot.word.slot = slot
@@ -501,7 +538,7 @@ def main(data: dict):
# drawing word slots # drawing word slots
for w in word_slots: for w in word_slots:
if not w.page.visible or w.color is None: if not w.page.visible or w.colors is None:
continue continue
draw_word_slot(w, drawer) draw_word_slot(w, drawer)