Fix mouse click and UI bug

master
En Yi 2019-06-15 17:02:31 +01:00
parent 41e69fa5ca
commit a8cdfcace9
5 changed files with 58 additions and 45 deletions

10
UI.py
View File

@ -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:

View File

@ -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
View File

@ -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)

View File

@ -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)

View File

@ -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):