from ._builtin import Page, WaitPage from .models import Constants from time import time import random class Wait(Page): timeout_seconds = 1 def before_next_page(self): if self.round_number == 1: frame_array1 = list(range(1, 21)) random.shuffle(frame_array1) frame_array2 = list(range(1, 21)) random.shuffle(frame_array2) frame_array3 = list(range(1, 21)) random.shuffle(frame_array3) frame_array4 = list(range(1, 21)) random.shuffle(frame_array4) frame_array = frame_array1 + frame_array2 + frame_array3 + frame_array4 games = list(range(1, 5)) random.shuffle(games) game_array = [] for i in games: game_array.extend([i] * 20) situation_array = [((game_array[i] - 1) * 20 + frame_array[i]) for i in range(80)] self.player.participant.vars['situation_array'] = situation_array self.player.participant.vars['choice_data'] = [0] * 80 self.player.participant.vars['belief_data'] = [0] * 80 self.player.participant.vars['problem_data'] = [0] * 80 situation_data = self.player.current_situation() self.player.situation_id = int(situation_data['id']) self.player.label_left = situation_data['label1'] self.player.label_right = situation_data['label2'] self.player.task_you = situation_data['task1'] self.player.task_other = situation_data['task2'] # self.player.order = random.randint(1, 2) self.player.order = self.player.participant.vars.get('order') # self.player.similarity = random.randint(1, 2) self.player.similarity = self.player.participant.vars.get('similarity') # self.player.time_pressure = random.randint(1, 2) self.player.time_pressure = self.player.participant.vars.get('time_pressure') # self.player.perceived_similarity = random.randint(1, 7) self.player.perceived_similarity = self.player.participant.vars.get('perceived_similarity') self.player.position = random.randint(1, 2) self.player.random_position = random.randint(1, 2) class InitialWaitPage(WaitPage): def is_displayed(self): return self.round_number == 21 or self.round_number == 41 or self.round_number == 61 class Attention(Page): def is_displayed(self): return self.round_number == 21 or self.round_number == 41 or self.round_number == 61 class DecisionP(Page): form_model = 'player' form_fields = ['practice_submitted_decision'] def is_displayed(self): return self.round_number == 1 class ChoiceP1(Page): form_model = 'player' form_fields = ['practice_submitted_choice', 'new_practice_time_choice', 'new_practice_time_choice_rounded'] def is_displayed(self): return self.round_number == 1 and self.player.practice_submitted_decision == 1 def vars_for_template(self): if self.player.practice_submitted_decision == 1: self.player.practice_time_choice = time() def before_next_page(self): if self.player.practice_submitted_decision == 1: self.player.practice_time_choice = time() - self.player.practice_time_choice self.player.practice_time_choice_rounded = int(round(self.player.practice_time_choice, 0)) class EstimateP(Page): form_model = 'player' form_fields = ['practice_submitted_belief', 'new_practice_time_belief', 'new_practice_time_belief_rounded'] def is_displayed(self): return self.round_number == 1 def vars_for_template(self): self.player.practice_time_belief = time() def before_next_page(self): self.player.practice_time_belief = time() - self.player.practice_time_belief self.player.practice_time_belief_rounded = int(round(self.player.practice_time_belief, 0)) if self.player.practice_submitted_decision == 1: if self.player.time_pressure == 1: self.player.practice_problem = False if self.player.new_practice_time_choice + self.player.new_practice_time_belief > 16: self.player.practice_problem = True if self.player.time_pressure == 2: self.player.practice_problem = False if self.player.new_practice_time_choice + self.player.new_practice_time_belief < 14: self.player.practice_problem = True class ChoiceP2(Page): form_model = 'player' form_fields = ['practice_submitted_choice', 'new_practice_time_choice', 'new_practice_time_choice_rounded'] def is_displayed(self): return self.round_number == 1 and self.player.practice_submitted_decision == 2 def vars_for_template(self): if self.player.practice_submitted_decision == 2: self.player.practice_time_choice = time() def before_next_page(self): if self.player.practice_submitted_decision == 2: self.player.practice_time_choice = time() - self.player.practice_time_choice self.player.practice_time_choice_rounded = int(round(self.player.practice_time_choice, 0)) if self.player.time_pressure == 1: self.player.practice_problem = False if self.player.new_practice_time_choice + self.player.new_practice_time_belief > 16: self.player.practice_problem = True if self.player.time_pressure == 2: self.player.practice_problem = False if self.player.new_practice_time_choice + self.player.new_practice_time_belief < 14: self.player.practice_problem = True class FeedbackP(Page): def is_displayed(self): return self.round_number == 1 class Decision(Page): form_model = 'player' form_fields = ['submitted_decision'] class Choice1(Page): form_model = 'player' form_fields = ['submitted_choice', 'new_time_choice', 'new_time_choice_rounded'] def is_displayed(self): return self.player.submitted_decision == 1 def vars_for_template(self): if self.player.submitted_decision == 1: self.player.time_choice = time() def before_next_page(self): if self.player.submitted_decision == 1: self.player.time_choice = time() - self.player.time_choice self.player.time_choice_rounded = int(round(self.player.time_choice, 0)) if self.player.position == 1: self.player.participant.vars['choice_data'][self.player.situation_id - 1] = self.player.submitted_choice if self.player.position == 2: if self.player.submitted_choice == 1: self.player.participant.vars['choice_data'][self.player.situation_id - 1] = 2 if self.player.submitted_choice == 2: self.player.participant.vars['choice_data'][self.player.situation_id - 1] = 1 class Estimate(Page): form_model = 'player' form_fields = ['submitted_belief', 'new_time_belief', 'new_time_belief_rounded'] def vars_for_template(self): self.player.time_belief = time() def before_next_page(self): self.player.time_belief = time() - self.player.time_belief self.player.time_belief_rounded = int(round(self.player.time_belief, 0)) if self.player.position == 1: self.player.participant.vars['belief_data'][self.player.situation_id - 1] = self.player.submitted_belief if self.player.position == 2: self.player.participant.vars['belief_data'][self.player.situation_id - 1] = \ 100 - self.player.submitted_belief if self.player.submitted_decision == 1: if self.player.time_pressure == 1: self.player.problem = False if self.player.new_time_choice + self.player.new_time_belief > 16: self.player.problem = True if self.player.time_pressure == 2: self.player.problem = False if self.player.new_time_choice + self.player.new_time_belief < 14: self.player.problem = True self.player.participant.vars['problem_data'][self.player.situation_id - 1] = self.player.problem class Choice2(Page): form_model = 'player' form_fields = ['submitted_choice', 'new_time_choice', 'new_time_choice_rounded'] def is_displayed(self): return self.player.submitted_decision == 2 def vars_for_template(self): if self.player.submitted_decision == 2: self.player.time_choice = time() def before_next_page(self): if self.player.submitted_decision == 2: self.player.time_choice = time() - self.player.time_choice self.player.time_choice_rounded = int(round(self.player.time_choice, 0)) if self.player.position == 1: self.player.participant.vars['choice_data'][self.player.situation_id - 1] = self.player.submitted_choice if self.player.position == 2: if self.player.submitted_choice == 1: self.player.participant.vars['choice_data'][self.player.situation_id - 1] = 2 if self.player.submitted_choice == 2: self.player.participant.vars['choice_data'][self.player.situation_id - 1] = 1 if self.player.time_pressure == 1: self.player.problem = False if self.player.new_time_choice + self.player.new_time_belief > 16: self.player.problem = True if self.player.time_pressure == 2: self.player.problem = False if self.player.new_time_choice + self.player.new_time_belief < 14: self.player.problem = True self.player.participant.vars['problem_data'][self.player.situation_id - 1] = self.player.problem class Feedback(Page): pass class End(Page): def is_displayed(self): return self.round_number == Constants.num_rounds class FinalWaitPage(WaitPage): def is_displayed(self): return self.round_number == Constants.num_rounds def after_all_players_arrive(self): if self.round_number == Constants.num_rounds: self.subsession.calculate_payoffs() page_sequence = [ Wait, InitialWaitPage, Attention, DecisionP, ChoiceP1, EstimateP, ChoiceP2, FeedbackP, Decision, Choice1, Estimate, Choice2, Feedback, End, FinalWaitPage ]