Skip to content

Commit

Permalink
add queues to gui and bj3wc but also
Browse files Browse the repository at this point in the history
realise that you cant fucking use multiprocessing with tkinter objects
  • Loading branch information
redstone59 authored Apr 1, 2024
1 parent e578678 commit 52196e5
Show file tree
Hide file tree
Showing 4 changed files with 110 additions and 54 deletions.
65 changes: 43 additions & 22 deletions bj3wc.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,17 @@
from bejeweled import *
from gui import *
from challenges import *
from queue_items import *

import queue

MINIQUEST_GOALS: list = json.load(open(pathlib.Path(PATH, "miniquest_goals.json")))

class Bejeweled3WorldChampionships:
def __init__(self):
self.challenge = None
self.gui = GraphicalUserInterface()
self.game = BejeweledThreeProcess()
self.gui_queue = queue.Queue() # Sends actions to the GUI (scores, reset, etc)
self.action_queue = queue.Queue() # Receives actions from the GUI (opened challenge)

self.challenge_end_time = 0
self.penalty = 120
Expand All @@ -18,20 +21,35 @@ def add_subchallenge_extra(self, subchallenge: Subchallenge):
if subchallenge.objective in ["Avalanche", "Butterflies", "ButterClear", "ButterCombo", "MatchBomb", "TimeBomb"]:
extra_pointer = Pointer(self.game, 0xbe0, 0x3238)

if subchallenge.extra == None: # Apply defaults
if subchallenge.extra == None: # Apply defaults
match subchallenge.objective:
case "Avalanche":
extra_pointer.set_value(5) # 5 gems fall per turn
extra_pointer.set_value(5) # 5 gems fall per turn

case "Butterflies" | "ButterClear" | "ButterCombo":
extra_pointer.set_value(1) # Butterflies move up every match
extra_pointer.set_value(1) # Butterflies move up every match

case "MatchBomb" | "TimeBomb":
extra_pointer.set_value(30) # Initial value for bombs is 30 turns or seconds.

else:
extra_pointer.set_value(subchallenge.extra)

def check_queue(self):
running = True

while running:
if self.action_queue.empty(): continue
action: QueueItem = self.action_queue.get()

match action.function:
case "abort":
running = False
case "open":
self.open_challenge(action.arguments[0])
case "start":
self.start()

def do_subchallenge(self, subchallenge: Subchallenge):
self.game.reset_scores()
condition_pointer = self.get_condition_pointer(subchallenge)
Expand Down Expand Up @@ -76,17 +94,17 @@ def do_subchallenge(self, subchallenge: Subchallenge):

get_score = lambda: previous_score
break
elif subchallenge.time_bonus_enabled and subchallenge_end_time <= time.time():
print("Challenge failed! (time ran out)")

if self.challenge.mode == "timed":
print(f"{self.penalty} second penalty!")
self.challenge_end_time -= self.penalty

elif subchallenge.time_bonus_enabled:
if subchallenge_end_time <= time.time():
print("Challenge failed! (time ran out)")

break

if subchallenge.mode == "value" and subchallenge.time_bonus_enabled:
get_score = lambda: max(0, int((subchallenge_end_time - time.time()) * 1000))
if self.challenge.mode == "timed":
print(f"{self.penalty} second penalty!")
self.challenge_end_time -= self.penalty

get_score = lambda: max(0, int(subchallenge_end_time - time.time()) * 1000)
break

return get_score() - difference

Expand Down Expand Up @@ -133,23 +151,23 @@ def modify_quest_goals(self, subchallenge: Subchallenge):
case "Balance":
balance_amount = (subchallenge.condition // 2) if subchallenge.mode == "value" else 34710
Pointer(self.game, 0xbe0, 0x3238).set_value(balance_amount) # Set BalanceGoal
Pointer(self.game, 0xbe0, 0x323c).set_value(9) # Fix speed (could probably make this an extra tbh)
Pointer(self.game, 0xbe0, 0x323c).set_value(9) # Fix speed (could probably make this an extra tbh)

case "BuriedTreasure" | "GoldRush" | "Sandstorm" | "WallBlast":
Pointer(self.game, 0xbe0, 0x3238).set_value(1800) # Set time to 30 minutes
Pointer(self.game, 0xbe0, 0x3238).set_value(1800) # Set time left to 30 minutes

case "Poker" | "PokerLimit" | "PokerHand" | "PokerSkull":
if self.game.get_quest_id() != 1000:
Pointer(self.game, 0xbe0, 0x323c).set_value(100000)
Pointer(self.game, 0xbe0, 0x395c).set_value(1000)
if self.game.get_quest_id() != 1000: # This will never be met - Poker quests only start on the secret Poker mode.
Pointer(self.game, 0xbe0, 0x323c).set_value(100000) # Set PokerGoal to absurdly high number
Pointer(self.game, 0xbe0, 0x395c).set_value(1000) # Change number of hands remaining to 1000

case "TimeBomb" | "MatchBomb":
difference = -1000
difference = MINIQUEST_GOALS[self.game.get_quest_id()] - subchallenge.condition
Pointer(self.game, 0xbe0, 0xe00).set_value(difference)

case "Stratamax":
difference = -1000
Pointer(self.game, 0xbe0, 0xe00).set_value(difference)
Pointer(self.game, 0xbe0, 0xe00).set_value(difference)
Pointer(self.game, 0xbe0, 0x3238).set_value(subchallenge.condition)
Pointer(self.game, 0xbe0, 0x323c).set_value(subchallenge.condition)

Expand All @@ -171,12 +189,14 @@ def start(self):
print("Time!")

add_and_display_scores(self.scores)
self.gui_queue.put(QueueItem("challenge_end", self.scores))

def subchallenge_loop(self):
while not (self.challenge.is_over() or self.is_challenge_time_up()):
subchallenge = self.challenge.next()

print(subchallenge)
self.gui_queue.put(QueueItem("subchallenge", subchallenge.get_gui_string(), str(subchallenge)))

if subchallenge.objective in ["ClasLevel", "ZenLevel"]: # Zero-indexed internally, One-indexed externally
subchallenge.condition -= 1
Expand All @@ -190,6 +210,7 @@ def subchallenge_loop(self):
print("Go!")

final_score = self.do_subchallenge(subchallenge)
self.gui_queue.put(QueueItem("score", final_score))

self.scores[subchallenge.objective] = {"multiplier": subchallenge.multiplier, "score": final_score}

Expand Down
52 changes: 29 additions & 23 deletions gui.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ def add_subchallenge_score(self, score: int):

self.index += 1

def add_subchallenge_text(self, text: str):
def add_subchallenge_text(self, abbreviated_text: str, description_text: str):
text_position = {"normal": (38, 130 + 35 * self.index), # Estimated vertical offset
"high": (49, 167 + 46 * self.index),
"ultra": (76, 261 + 72 * self.index)
Expand All @@ -63,8 +63,21 @@ def add_subchallenge_text(self, text: str):
"ultra": 30
}[self.size.get()]

self.labels["challenges"] += [ImageTk.PhotoImage(self.font.get_render(size, text, colour = "#f4f4d0", align = "ls"))]
self.labels["challenges"] += [ImageTk.PhotoImage(self.font.get_render(size, abbreviated_text, colour = "#f4f4d0", align = "ls"))]
self.canvas.create_image(text_position, image = self.labels["challenges"][-1])

text_position = {"normal": (150, 592),
"high": (196, 758),
"ultra": (300, 1185)
}[self.size.get()]
size = {"normal": 8,
"high": 10,
"ultra": 16
}[self.size.get()]

self.canvas.delete("current_quest")
self.labels["current_quest"] = ImageTk.PhotoImage(self.font.get_render(size, description_text))
self.canvas.create_image(text_position, image = self.labels["current_quest"], tags = "current_quest")

def add_multiplied_scores(self, scores: dict):
size = {"normal": 15,
Expand Down Expand Up @@ -149,8 +162,16 @@ def check_queue(self):
action: QueueItem = self.gui_queue.get()

match action.function:
case _:
pass
case "subchallenge":
self.add_subchallenge_text(*action.arguments)
case "score":
self.add_subchallenge_score(action.arguments[0])
case "challenge_end":
self.add_multiplied_scores(action.arguments[0])

self.root.update()

self.root.after(100, self.check_queue)

def close(self):
# I know I could put the below into one if statement but that would be a long ass line of code.
Expand All @@ -159,7 +180,7 @@ def close(self):
return

self.root.destroy()
self.gui_queue.put("abort")
self.action_queue.put(QueueItem("abort", ()))
# exit()

def open_challenge_file(self):
Expand All @@ -180,6 +201,7 @@ def open_challenge_file(self):
messagebox.showerror("Uh oh!", f"Invalid challenge chosen!\n{e.__class__}: {e}")

self.action_queue.put(QueueItem("open", challenge))
self.action_queue.put(QueueItem("start", ()))
return challenge

def reset_labels(self):
Expand Down Expand Up @@ -307,21 +329,5 @@ def set_up_menu_bar(self):
about_button.place(x = 150, y = 0)

def start(self):
self.root.mainloop()

g = GraphicalUserInterface()

c = Challenge("Challenge E", "redstone59", "Non-timed challenge included with BJ3WC", "timed", [], 40)
g.challenge = c
g.add_metadata_text()
g.size.set("high")
g.set_resolution()
g.add_subchallenge_text("Lightning: 45s in tank")
g.add_subchallenge_score(52350)
g.add_subchallenge_text("Poker: 10 hands")
g.add_subchallenge_score(185750)
g.add_subchallenge_text("Match Bomb: 8 bombs (60s) [15]")
g.add_subchallenge_score(56976)
g.add_multiplied_scores({"a": {"multiplier": 1, "score": 52350}, "b": {"multiplier": 3, "score": 185750}, "c": {"multiplier": 5, "score": 56976}})

g.start()
self.root.after(100, self.check_queue)
self.root.mainloop()
15 changes: 6 additions & 9 deletions queue_items.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,10 @@
from dataclasses import *

@dataclass
class QueueItem:
function: str
arguments: tuple | list

def __post_init__(self):
if type(self.arguments) not in [tuple, list]:
def __init__(self, function: str, *arguments):
self.function = function
if type(arguments) not in [tuple, list]:
try:
self.arguments = tuple(self.arguments,)
except:
self.arguments = (self.arguments,)
self.arguments = (self.arguments,)
else:
self.arguments = arguments
32 changes: 32 additions & 0 deletions start_gui.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
from bj3wc import *
from gui import *

import multiprocessing

def main():
world_championships = Bejeweled3WorldChampionships()
gui = GraphicalUserInterface()

with multiprocessing.Manager() as manager:
gui_queue = manager.Queue()
action_queue = manager.Queue()

world_championships.gui_queue = gui_queue
world_championships.action_queue = action_queue
gui.gui_queue = gui_queue
gui.action_queue = action_queue

wc = multiprocessing.Process(target = world_championships.check_queue, name = "championships")
g = multiprocessing.Process(target = gui.start, name = "gui")

wc.start()
g.start()

g.join()
print("GUI stopped")
wc.join()
print("World Championships stopped")


if __name__ == "__main__":
main()

0 comments on commit 52196e5

Please sign in to comment.