from ._builtin import Page import time import random class MyPage(Page): def is_displayed(self): return self.round_number <= self.subsession.subsession_round_number def get_timeout_seconds(self): return self.session.config['timeout_seconds'] def before_next_page(self): if self.timeout_happened: self.player.timeout_happened = True class Dobble(MyPage): form_model = 'player' form_fields = ['dobble_answer', 'answer_time'] def get_timeout_seconds(self): return self.session.config['game_play_timeout_seconds'] def vars_for_template(self): self.template = self.session.config['card_items_number'] round_cards = self.get_player_current_round_cards() self.player.selection = self.player.participant.selection return { **round_cards, 'template': self.template, 'total_score': 0, 'player_selection': self.player.participant.selection } def before_next_page(self): super().before_next_page() round_cards = self.get_player_current_round_cards() self.player.calculate_answer(round_cards) if self.player.correct_answer or self.player.timeout_happened: time.sleep(1.2) else: time.sleep(self.session.config['wrong_answer_freeze_time']) def get_player_current_round_cards(self): self.template = self.session.config['card_items_number'] random.seed(self.player.id_in_group) order_list = list(range(1, self.subsession.subsession_round_number + 1)) random.shuffle(order_list) return self.session.round_cards[self.template][order_list[self.round_number - 1]] class NewThemeIntro(MyPage): def is_displayed(self): is_displayed = super().is_displayed() and self.round_number % self.session.config['practice_rounds'] == 1 if is_displayed: self.player.new_period() return is_displayed def vars_for_template(self): random.seed(self.player.id_in_group * 17) order_list = list(range(0, 3)) random.shuffle(order_list) chosen_index = order_list[(get_current_period_number(self)-1) % 3] self.player.participant.selection = ['Animal', 'Food', 'Summer'][chosen_index] return { 'theme': self.player.participant.selection, } class End(MyPage): def is_displayed(self): return super().is_displayed() and self.round_number == self.subsession.subsession_round_number def is_first_round(self): return self.round_number == 1 def get_current_period_number(self): return int(self.round_number / self.session.config['practice_rounds']) + 1 class Dobble4(Dobble): is_displayed = is_first_round template = 4 class Dobble6(Dobble): is_displayed = is_first_round template = 6 class Dobble8(Dobble): is_displayed = is_first_round template = 8 page_sequence = [NewThemeIntro, Dobble, End]