Skip to content

Commit

Permalink
functional!!!!! its functional!!!!!
Browse files Browse the repository at this point in the history
  • Loading branch information
redstone59 authored Mar 28, 2024
1 parent 1cac086 commit ff60496
Show file tree
Hide file tree
Showing 3 changed files with 65 additions and 22 deletions.
8 changes: 6 additions & 2 deletions bejeweled.py
Original file line number Diff line number Diff line change
Expand Up @@ -83,8 +83,12 @@ def __init__(self, process: BejeweledThreeProcess, *offsets: tuple[int]):
self.address = process.read(*offsets[:-1]) + offsets[-1]
self.offsets = offsets

def get_value(self):
return self.process.process.read(self.address)
def get_value(self) -> int:
value = self.process.process.read(self.address)
if value >> 31 & 1: # Test if sign bit is set
sign_bit = 1 << 32
value -= sign_bit
return value

read = get_value

Expand Down
77 changes: 57 additions & 20 deletions bj3wc.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ def __init__(self):
self.game = BejeweledThreeProcess()

self.challenge_end_time = 0
self.scores = []
self.scores = {}

def add_subchallenge_extra(self, subchallenge: Subchallenge):
if subchallenge.objective in ["Avalanche", "Butterflies", "ButterClear", "ButterCombo", "MatchBomb", "TimeBomb"]:
Expand Down Expand Up @@ -70,19 +70,24 @@ def get_condition_pointer(self, subchallenge: Subchallenge):
pointer_offsets = CHALLENGE_DATA[subchallenge.objective]["pointer_offsets"]

if subchallenge.objective == "PokerHand":
poker_hands = ["Pair", "Spectrum", "Two Pair", "Three of a Kind", "Full House", "Four of a Kind", "Flush"]
return Pointer(0xbe0, 0x39d8 + 4 * poker_hands.index(subchallenge.extra))
poker_hands = ["Pair", "Spectrum", "2 Pair", "3 of a Kind", "Full House", "4 of a Kind", "Flush"]
return Pointer(self.game, 0xbe0, 0x39d8 + 4 * poker_hands.index(subchallenge.extra))

for i in range(len(pointer_offsets)):
try:
pointer_offsets[i] = int(pointer_offsets[i], 0)
except:
continue

return Pointer(self.game, *pointer_offsets)

def get_score_pointer(self, subchallenge: Subchallenge):
if subchallenge.objective not in ["DiamondMine", "DiamondDepth", "DiamondTreasure"]:
quest_challenges = ["DiamondMine", "DiamondDepth", "DiamondTreasure",
"Balance", "Stratamax", "GoldRush", "Alchemy",
"TimeBomb", "MatchBomb", "Avalanche", "WallBlast",
"Treasure", "Sand"
]
if subchallenge.objective not in quest_challenges:
score_pointer = Pointer(self.game, 0xbe0, 0xd20)
else:
score_pointer = Pointer(self.game, 0xbe0, 0xe00)
Expand All @@ -93,9 +98,10 @@ def open_challenge(self, challenge: Challenge):
self.challenge = challenge
print(challenge)

def subchallenge_loop(self, subchallenge: Subchallenge):
def do_subchallenge(self, subchallenge: Subchallenge):
self.game.reset_scores()
condition_pointer = self.get_condition_pointer(subchallenge)
condition_pointer.update_address()
condition_pointer.set_value(subchallenge.get_initial_value()) # Reset checked value

difference = self.modify_quest_goals(subchallenge)
Expand All @@ -114,31 +120,50 @@ def subchallenge_loop(self, subchallenge: Subchallenge):
case "endless":
over_condition = lambda: time.time() >= self.challenge_end_time

while not (over_condition() or self.is_challenge_time_up()):
pass

def start(self):
if self.challenge == None:
raise ValueError("No challenge has been loaded. Use Bejeweled3WorldChampionships().open_challenge()")
score_pointer = self.get_score_pointer(subchallenge)
if subchallenge.mode == "value" and subchallenge.time_bonus_enabled:
get_score = lambda: max(0, int((subchallenge_end_time - time.time()) * 1000))
else:
get_score = lambda: score_pointer.get_value()

if self.challenge.mode == "timed":
self.challenge_end_time = time.time() + self.challenge.time
current_score = get_score()

while not self.challenge.is_over():
while not (over_condition() or self.is_challenge_time_up()):
score_pointer.update_address()
previous_score = current_score
current_score = get_score()
if not subchallenge.time_bonus_enabled and current_score < previous_score:
print("Skipping due to score decrease game over or reset")
get_score = lambda: previous_score
break
elif subchallenge.time_bonus_enabled and current_score <= 0:
print("Skipping since time has run out")
break

return get_score() - difference

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

score_pointer = self.get_score_pointer(subchallenge)
print(subchallenge)

self.wait_until_open(subchallenge)
time.sleep(0.5)
print("go!")

self.subchallenge_loop(subchallenge)
final_score = self.do_subchallenge(subchallenge)

self.scores += score_pointer.get_value()
self.scores[subchallenge.objective] = {"multiplier": subchallenge.multiplier, "score": final_score}

def start(self):
if self.challenge == None:
raise ValueError("No challenge has been loaded. Use Bejeweled3WorldChampionships().open_challenge()")

print(self.scores)
if self.challenge.mode == "timed":
self.challenge_end_time = time.time() + self.challenge.time

self.subchallenge_loop()
add_and_display_scores(self.scores)

def wait_until_open(self, subchallenge: Subchallenge):
"""
Expand Down Expand Up @@ -166,3 +191,15 @@ def wait_until_open(self, subchallenge: Subchallenge):

while not new_game_started():
condition_pointer.update_address()

def add_and_display_scores(challenge_dict: dict):
total_score = 0
print("---------------")

for key in challenge_dict:
subchallenge = challenge_dict[key]
print(f"{key}: {subchallenge["score"]:,} * {subchallenge["multiplier"]} = {subchallenge["score"] * subchallenge["multiplier"]}")
total_score += subchallenge["score"] * subchallenge["multiplier"]

print(f"TOTAL SCORE: {total_score:,}")
print("---------------")
2 changes: 2 additions & 0 deletions challenges.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,8 @@ def __str__(self):
if self.mode == "value":
result_string: str = subchallenge_data["description_string"]
result_string = result_string.replace("<condition>", str(self.condition))
if self.time_bonus_enabled:
result_string += "\b as quickly as possible!" # This smells bad.
elif self.mode == "endless":
result_string: str = subchallenge_data["timed_string"]
result_string = result_string.replace("<suffix>", "until the challenge ends")
Expand Down

0 comments on commit ff60496

Please sign in to comment.