Fix mouse click and UI bug
parent
41e69fa5ca
commit
a8cdfcace9
10
UI.py
10
UI.py
|
@ -262,6 +262,7 @@ class ScrollList(GenericUI):
|
||||||
self.redraw()
|
self.redraw()
|
||||||
|
|
||||||
def replace_list(self, texts):
|
def replace_list(self, texts):
|
||||||
|
self.reset_scroll()
|
||||||
self.texts = texts
|
self.texts = texts
|
||||||
self.text_rects = []
|
self.text_rects = []
|
||||||
current_y = self.outline_thickness
|
current_y = self.outline_thickness
|
||||||
|
@ -363,6 +364,13 @@ class CallPanel(GenericUI):
|
||||||
def cancelling(self, **kwargs):
|
def cancelling(self, **kwargs):
|
||||||
self.confirm_output.emit(output='')
|
self.confirm_output.emit(output='')
|
||||||
|
|
||||||
|
def change_lists_elements(self, left_list=None, right_list=None):
|
||||||
|
if left_list is not None:
|
||||||
|
self.list1.replace_list(left_list)
|
||||||
|
if right_list is not None:
|
||||||
|
self.list2.replace_list(right_list)
|
||||||
|
self.redraw()
|
||||||
|
|
||||||
|
|
||||||
class TestScreen(view.PygView):
|
class TestScreen(view.PygView):
|
||||||
|
|
||||||
|
@ -408,7 +416,7 @@ class TestScreen(view.PygView):
|
||||||
running = False
|
running = False
|
||||||
|
|
||||||
if event.key == pygame.K_o:
|
if event.key == pygame.K_o:
|
||||||
self.panel.list1.replace_list([str(i+1) for i in range(7)])
|
self.panel.change_lists_elements([str(i+1) for i in range(45)],['a','b'])
|
||||||
draw_update = True
|
draw_update = True
|
||||||
|
|
||||||
for element in self.elements:
|
for element in self.elements:
|
||||||
|
|
29
cards.py
29
cards.py
|
@ -126,7 +126,7 @@ class Deck():
|
||||||
self.sort_order = sort_order
|
self.sort_order = sort_order
|
||||||
self.selectable = selectable
|
self.selectable = selectable
|
||||||
self.selected_card = -1
|
self.selected_card = -1
|
||||||
self.prev_selected = -1
|
self.prev_selected = [-1, -1, -1]
|
||||||
|
|
||||||
self.cards = []
|
self.cards = []
|
||||||
self.line_width = 5
|
self.line_width = 5
|
||||||
|
@ -291,11 +291,16 @@ class Deck():
|
||||||
return True, card_values.index(value)
|
return True, card_values.index(value)
|
||||||
return False, -1
|
return False, -1
|
||||||
|
|
||||||
|
def record_selected_history(self):
|
||||||
|
self.prev_selected = self.prev_selected[1:]
|
||||||
|
self.prev_selected.append(self.selected_card)
|
||||||
|
|
||||||
def deselect_card(self):
|
def deselect_card(self):
|
||||||
self.selected_card = -1
|
self.selected_card = -1
|
||||||
|
self.record_selected_history()
|
||||||
self.update_deck_display()
|
self.update_deck_display()
|
||||||
|
|
||||||
def get_selected_card(self, pos):
|
def get_selected_card(self, pos, double_clicking=False):
|
||||||
"""
|
"""
|
||||||
Get the selected card based on the mouse pos, offset to give the relative position in the deck.
|
Get the selected card based on the mouse pos, offset to give the relative position in the deck.
|
||||||
The selected card position is stored in the deck
|
The selected card position is stored in the deck
|
||||||
|
@ -303,11 +308,10 @@ class Deck():
|
||||||
:return: bool: whether the card selected is the same as before
|
:return: bool: whether the card selected is the same as before
|
||||||
"""
|
"""
|
||||||
if self.selectable:
|
if self.selectable:
|
||||||
|
double_select = False
|
||||||
relative_pos_x = pos[0] - self.x
|
relative_pos_x = pos[0] - self.x
|
||||||
relative_pos_y = pos[1] - self.y
|
relative_pos_y = pos[1] - self.y
|
||||||
mouse_pos = (relative_pos_x, relative_pos_y)
|
mouse_pos = (relative_pos_x, relative_pos_y)
|
||||||
if self.selected_card >= 0:
|
|
||||||
self.prev_selected = self.selected_card
|
|
||||||
self.selected_card = -1
|
self.selected_card = -1
|
||||||
if not self.draw_from_last:
|
if not self.draw_from_last:
|
||||||
for i, card in enumerate(reversed(self.cards)):
|
for i, card in enumerate(reversed(self.cards)):
|
||||||
|
@ -320,8 +324,17 @@ class Deck():
|
||||||
self.selected_card = i
|
self.selected_card = i
|
||||||
break
|
break
|
||||||
|
|
||||||
|
if self.prev_selected[-1] == self.selected_card:
|
||||||
|
if not double_clicking:
|
||||||
|
self.selected_card = -1
|
||||||
|
|
||||||
|
self.record_selected_history()
|
||||||
self.update_deck_display()
|
self.update_deck_display()
|
||||||
return (self.prev_selected == self.selected_card)and self.selected_card >= 0
|
|
||||||
|
selected_history = [sel for sel in self.prev_selected if sel >= 0]
|
||||||
|
|
||||||
|
return (len(selected_history) == 2 and self.prev_selected.count(self.selected_card) == 2
|
||||||
|
and self.selected_card >= 0) and double_clicking
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
@ -492,8 +505,8 @@ class TestScreen(view.PygView):
|
||||||
mouse_pos = pygame.mouse.get_pos()
|
mouse_pos = pygame.mouse.get_pos()
|
||||||
for deck in self.test_decks:
|
for deck in self.test_decks:
|
||||||
if deck.rect.collidepoint(mouse_pos):
|
if deck.rect.collidepoint(mouse_pos):
|
||||||
reselect = deck.get_selected_card(mouse_pos)
|
reselect = deck.get_selected_card(mouse_pos, self.double_clicking)
|
||||||
|
print('a', reselect)
|
||||||
if self.double_clicking:
|
if self.double_clicking:
|
||||||
pygame.time.set_timer(self.double_click_event, 0)
|
pygame.time.set_timer(self.double_click_event, 0)
|
||||||
print('Double clicked')
|
print('Double clicked')
|
||||||
|
@ -503,8 +516,6 @@ class TestScreen(view.PygView):
|
||||||
else:
|
else:
|
||||||
self.double_clicking = True
|
self.double_clicking = True
|
||||||
pygame.time.set_timer(self.double_click_event, 200)
|
pygame.time.set_timer(self.double_click_event, 200)
|
||||||
if reselect:
|
|
||||||
deck.deselect_card()
|
|
||||||
|
|
||||||
if event.type == self.double_click_event:
|
if event.type == self.double_click_event:
|
||||||
pygame.time.set_timer(self.double_click_event, 0)
|
pygame.time.set_timer(self.double_click_event, 0)
|
||||||
|
|
10
main.py
10
main.py
|
@ -8,8 +8,8 @@ This script is to run the game. It would process any input argument and pass int
|
||||||
"""
|
"""
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
AUTOPLAY = True
|
AUTOPLAY = False
|
||||||
VIEW_ALL_CARDS = True
|
VIEW_ALL_CARDS = False
|
||||||
TERMINAL = False
|
TERMINAL = False
|
||||||
|
|
||||||
if len(sys.argv) > 1:
|
if len(sys.argv) > 1:
|
||||||
|
@ -36,9 +36,9 @@ if __name__ == '__main__':
|
||||||
with open('last_game_rng.rng', 'wb') as f:
|
with open('last_game_rng.rng', 'wb') as f:
|
||||||
pickle.dump(rng_state, f)
|
pickle.dump(rng_state, f)
|
||||||
|
|
||||||
with open('seeds/test_seed.rng', 'rb') as f:
|
#with open('seeds/test_seed.rng', 'rb') as f:
|
||||||
rng_state = pickle.load(f)
|
# rng_state = pickle.load(f)
|
||||||
random.setstate(rng_state)
|
#random.setstate(rng_state)
|
||||||
|
|
||||||
main_view = game.GameScreen(800, 600, clear_colour=(255, 0, 0),
|
main_view = game.GameScreen(800, 600, clear_colour=(255, 0, 0),
|
||||||
autoplay=AUTOPLAY, view_all_cards=VIEW_ALL_CARDS, terminal=TERMINAL)
|
autoplay=AUTOPLAY, view_all_cards=VIEW_ALL_CARDS, terminal=TERMINAL)
|
||||||
|
|
14
players.py
14
players.py
|
@ -234,14 +234,14 @@ class MainPlayer(Player):
|
||||||
|
|
||||||
def make_a_play(self, substate, game_events=None):
|
def make_a_play(self, substate, game_events=None):
|
||||||
card = None
|
card = None
|
||||||
msg = ""
|
msg = None
|
||||||
if game_events:
|
if game_events:
|
||||||
for event in game_events:
|
for event in game_events:
|
||||||
if event.type == pygame.MOUSEBUTTONUP and event.button == 1:
|
if event.type == pygame.MOUSEBUTTONUP and event.button == 1:
|
||||||
mouse_pos = pygame.mouse.get_pos()
|
mouse_pos = pygame.mouse.get_pos()
|
||||||
if self.rect.collidepoint(mouse_pos):
|
if self.rect.collidepoint(mouse_pos):
|
||||||
reselect = self.get_selected_card(mouse_pos)
|
reselect = self.get_selected_card(mouse_pos, double_clicking=self.double_clicking)
|
||||||
if self.selected_card >= 0:
|
if not reselect:
|
||||||
card = 1
|
card = 1
|
||||||
|
|
||||||
if self.double_clicking:
|
if self.double_clicking:
|
||||||
|
@ -253,14 +253,14 @@ class MainPlayer(Player):
|
||||||
else:
|
else:
|
||||||
card = 1
|
card = 1
|
||||||
msg = "Invalid card play"
|
msg = "Invalid card play"
|
||||||
self.deselect_card()
|
|
||||||
self.double_clicking = False
|
self.double_clicking = False
|
||||||
else:
|
else:
|
||||||
self.double_clicking = True
|
self.double_clicking = True
|
||||||
pygame.time.set_timer(DOUBLE_CLICK_EVENT, DOUBLE_CLICK_TIMING)
|
pygame.time.set_timer(DOUBLE_CLICK_EVENT, DOUBLE_CLICK_TIMING)
|
||||||
if reselect:
|
#if reselect:
|
||||||
self.deselect_card()
|
# self.deselect_card()
|
||||||
card = 1
|
# card = 1
|
||||||
|
return card, msg
|
||||||
|
|
||||||
if event.type == DOUBLE_CLICK_EVENT:
|
if event.type == DOUBLE_CLICK_EVENT:
|
||||||
pygame.time.set_timer(DOUBLE_CLICK_EVENT, 0)
|
pygame.time.set_timer(DOUBLE_CLICK_EVENT, 0)
|
||||||
|
|
40
table.py
40
table.py
|
@ -370,13 +370,12 @@ class Table:
|
||||||
self.update_player_bid(self.current_player, 11, update_now=False)
|
self.update_player_bid(self.current_player, 11, update_now=False)
|
||||||
msg = 'Bid Leader: Player {0:d}'.format((self.current_player - self.passes -
|
msg = 'Bid Leader: Player {0:d}'.format((self.current_player - self.passes -
|
||||||
1 * (not self.first_player)) % NUM_OF_PLAYERS)
|
1 * (not self.first_player)) % NUM_OF_PLAYERS)
|
||||||
self.write_message(msg, line=2, delay_time=1)
|
self.write_message(msg, line=2, delay_time=0.5)
|
||||||
|
|
||||||
if not self.terminal_play:
|
if not self.terminal_play:
|
||||||
self.calling_panel.list1.replace_list([str(i+1) for i in range(7)])
|
|
||||||
self.calling_panel.list2.replace_list(['Clubs', 'Diamonds', 'Hearts', 'Spades', 'No Trump'])
|
|
||||||
self.calling_panel.cancel_button.visible = True
|
self.calling_panel.cancel_button.visible = True
|
||||||
self.calling_panel.redraw()
|
self.calling_panel.change_lists_elements([str(i+1) for i in range(7)],
|
||||||
|
['Clubs', 'Diamonds', 'Hearts', 'Spades', 'No Trump'])
|
||||||
|
|
||||||
def start_bidding(self, game_events):
|
def start_bidding(self, game_events):
|
||||||
"""
|
"""
|
||||||
|
@ -396,12 +395,12 @@ class Table:
|
||||||
player_bid = self.players[self.current_player].make_decision(self.game_state, 0)
|
player_bid = self.players[self.current_player].make_decision(self.game_state, 0)
|
||||||
else:
|
else:
|
||||||
player_bid, msg = self.players[self.current_player].make_decision(self.game_state, 0, game_events)
|
player_bid, msg = self.players[self.current_player].make_decision(self.game_state, 0, game_events)
|
||||||
if msg:
|
#if msg:
|
||||||
self.write_message(msg, delay_time=0, update_now=True)
|
#self.write_message(msg, delay_time=1, update_now=True)
|
||||||
if player_bid < 0:
|
if player_bid < 0:
|
||||||
return False
|
return False
|
||||||
self.require_player_input = False
|
self.require_player_input = False
|
||||||
self.write_message("", delay_time=0, update_now=True)
|
#self.write_message("", delay_time=0, update_now=False)
|
||||||
if not self.terminal_play:
|
if not self.terminal_play:
|
||||||
self.calling_panel.visible = False
|
self.calling_panel.visible = False
|
||||||
self.update_table.emit()
|
self.update_table.emit()
|
||||||
|
@ -432,10 +431,9 @@ class Table:
|
||||||
time.sleep(0.5)
|
time.sleep(0.5)
|
||||||
if self.passes == NUM_OF_PLAYERS - 1 or self.table_status["bid"] == 75:
|
if self.passes == NUM_OF_PLAYERS - 1 or self.table_status["bid"] == 75:
|
||||||
if not self.terminal_play:
|
if not self.terminal_play:
|
||||||
self.calling_panel.list1.replace_list(['2','3','4','5','6','7','8','9','10','J','Q','K','A'])
|
|
||||||
self.calling_panel.list2.replace_list(['Clubs', 'Diamonds', 'Hearts', 'Spades'])
|
|
||||||
self.calling_panel.cancel_button.visible = False
|
self.calling_panel.cancel_button.visible = False
|
||||||
self.calling_panel.redraw()
|
self.calling_panel.change_lists_elements(['2','3','4','5','6','7','8','9','10','J','Q','K','A'],
|
||||||
|
['Clubs', 'Diamonds', 'Hearts', 'Spades'])
|
||||||
return False
|
return False
|
||||||
else:
|
else:
|
||||||
if not self.require_player_input:
|
if not self.require_player_input:
|
||||||
|
@ -498,12 +496,12 @@ class Table:
|
||||||
:return: None
|
:return: None
|
||||||
"""
|
"""
|
||||||
if not any(self.table_status["played cards"]):
|
if not any(self.table_status["played cards"]):
|
||||||
if self.table_status['trump broken']:
|
|
||||||
self.write_message("Trump has been broken!", delay_time=0)
|
|
||||||
else:
|
|
||||||
self.write_message("Trump is not broken", delay_time=0)
|
|
||||||
# Leading player starts with the leading card, which determines the leading suit
|
# Leading player starts with the leading card, which determines the leading suit
|
||||||
if not self.require_player_input:
|
if not self.require_player_input:
|
||||||
|
if self.table_status['trump broken']:
|
||||||
|
self.write_message("Trump has been broken!", delay_time=0)
|
||||||
|
else:
|
||||||
|
self.write_message("Trump is not broken", delay_time=0)
|
||||||
self.current_player = self.table_status['leading player']
|
self.current_player = self.table_status['leading player']
|
||||||
self.display_current_player(self.current_player)
|
self.display_current_player(self.current_player)
|
||||||
if not self.players[self.current_player].AI:
|
if not self.players[self.current_player].AI:
|
||||||
|
@ -513,8 +511,8 @@ class Table:
|
||||||
card = self.players[self.current_player].make_decision(self.game_state, 0)
|
card = self.players[self.current_player].make_decision(self.game_state, 0)
|
||||||
else:
|
else:
|
||||||
card, msg = self.players[self.current_player].make_decision(self.game_state, 0, game_events)
|
card, msg = self.players[self.current_player].make_decision(self.game_state, 0, game_events)
|
||||||
if msg:
|
#if msg:
|
||||||
self.write_message(msg, delay_time=0, update_now=True)
|
# self.write_message(msg, delay_time=0, update_now=True)
|
||||||
if not type(card) is cards.Card:
|
if not type(card) is cards.Card:
|
||||||
if card:
|
if card:
|
||||||
self.update_table.emit()
|
self.update_table.emit()
|
||||||
|
@ -534,8 +532,8 @@ class Table:
|
||||||
card = self.players[self.current_player].make_decision(self.game_state, 1)
|
card = self.players[self.current_player].make_decision(self.game_state, 1)
|
||||||
else:
|
else:
|
||||||
card, msg = self.players[self.current_player].make_decision(self.game_state, 1, game_events)
|
card, msg = self.players[self.current_player].make_decision(self.game_state, 1, game_events)
|
||||||
if msg:
|
#if msg:
|
||||||
self.write_message(msg, delay_time=0, update_now=False)
|
# self.write_message(msg, delay_time=0, update_now=False)
|
||||||
if not type(card) is cards.Card:
|
if not type(card) is cards.Card:
|
||||||
if card:
|
if card:
|
||||||
self.update_table.emit()
|
self.update_table.emit()
|
||||||
|
@ -586,11 +584,6 @@ class Table:
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
if self.table_status['trump broken']:
|
|
||||||
self.write_message("Trump has been broken!", delay_time=0)
|
|
||||||
else:
|
|
||||||
self.write_message("Trump is not broken", delay_time=0)
|
|
||||||
|
|
||||||
# Break trump if the trump suit is played
|
# Break trump if the trump suit is played
|
||||||
if not self.table_status['trump broken']:
|
if not self.table_status['trump broken']:
|
||||||
self.table_status['trump broken'] = card.suit() == self.table_status['trump suit']
|
self.table_status['trump broken'] = card.suit() == self.table_status['trump suit']
|
||||||
|
@ -606,6 +599,7 @@ class Table:
|
||||||
|
|
||||||
self.current_player += 1
|
self.current_player += 1
|
||||||
self.current_player %= NUM_OF_PLAYERS
|
self.current_player %= NUM_OF_PLAYERS
|
||||||
|
self.update_table.emit()
|
||||||
time.sleep(0.5)
|
time.sleep(0.5)
|
||||||
|
|
||||||
def write_message(self, text, delay_time=0.5, line=0, update_now=True):
|
def write_message(self, text, delay_time=0.5, line=0, update_now=True):
|
||||||
|
|
Loading…
Reference in New Issue