from otree.api import Currency as c, currency_range from ._builtin import Page, WaitPage from .models import Constants from random import randint class Introduction(Page): def is_displayed(self): return self.round_number == 1 class Screen0(Page): def is_displayed(self): return self.round_number == 1 class Screen1(Page): def is_displayed(self): return self.round_number == 1 ## INITIAL INSTRUCTIONS FOR PLAYER 1 AND PLAYER 2 class Instructions(Page): def is_displayed(self): return self.round_number == 1 ## SCREEN 3S - PLAYER 1 class Player1_1(Page): def is_displayed(self): return self.player.id_in_group == 1 and self.round_number == 1 form_model = 'player' form_fields = ['q1'] def q1_error_message(self, value): if value == 'True': return 'The answer is False. You can report any amount' def before_next_page(self): self.player.secret_number = randint(1, 10) class ExtraRoundWaitPage(WaitPage): wait_for_all_groups = True def is_displayed(self): return self.round_number == Constants.num_rounds def after_all_players_arrive(self): groups = self.subsession.get_groups() amount = len(groups) // 4 for i in range(amount): player1 = groups[i].get_player_by_role('player1') player2 = groups[i].get_player_by_role('player2') player1.selected = True player2.selected = True class NewRound(Page): def is_displayed(self): if(1 < self.round_number < Constants.num_rounds): return True else: return self.player.selected def vars_for_template(self): return{ 'round_number_next': self.round_number } pass ## SCREEN 4S - PLAYER 1 class Player1_2(Page): def is_displayed(self): if(self.round_number < Constants.num_rounds): return self.player.id_in_group == 1 else: return self.player.id_in_group == 1 and self.player.selected def vars_for_template(self): return { 'secret_number' : self.player.secret_number, 'round' : self.round_number } ## SCREEN 5S - PLAYER 1 class Player1_3(Page): def is_displayed(self): if(self.round_number < Constants.num_rounds): return self.player.id_in_group == 1 else: return self.player.id_in_group == 1 and self.player.selected form_model = 'player' form_fields = ['reported_number'] class PaymentWaitPage(WaitPage): def after_all_players_arrive(self): player1 = self.group.get_player_by_role('player1') player2 = self.group.get_player_by_role('player2') player1.payment = 10 - player1.reported_number player2.payment = player1.reported_number player2.secret_number = player1.secret_number player2.reported_number = player1.reported_number ## SCREEN 6S - PLAYER 1 class Payment(Page): def is_displayed(self): if(self.round_number < Constants.num_rounds): return True else: return self.player.selected def vars_for_template(self): return { 'round' : self.round_number } class GuessingNumber(Page): def is_displayed(self): if(self.round_number < Constants.num_rounds): return self.player.id_in_group == 2 else: return self.player.id_in_group == 2 and self.player.selected form_model = 'player' form_fields = ['guessing_secret_number', 'guessing_players'] def guessing_players_error_message(self, value): players = len(self.subsession.get_players()) // 2 if value > players: return 'The number is greater than the actual number of players. You can report any amount' def vars_for_template(self): players = len(self.subsession.get_players()) // 2 return{ 'number_players' : players } class NewRoundWaitPage(WaitPage): wait_for_all_groups = True def after_all_players_arrive(self): player1_truth = 0 for p in self.subsession.get_players(): if(p.id_in_group == 1): if p.in_round(self.round_number).reported_number == p.in_round(self.round_number).secret_number: player1_truth = player1_truth + 1 for p in self.subsession.get_players(): if(p.id_in_group == 2): if(p.guessing_players == player1_truth): p.extra_payment = p.extra_payment + 1 if(p.guessing_secret_number == p.secret_number): p.extra_payment = p.extra_payment + 1 if(self.round_number < Constants.num_rounds): for g in self.subsession.get_groups(): player1 = g.get_player_by_role('player1') player1.in_round(self.round_number + 1).get_secret_number() class FinalPaymentWaitPage(WaitPage): wait_for_all_groups = True def is_displayed(self): return self.round_number == Constants.num_rounds def after_all_players_arrive(self): for p in self.subsession.get_players(): for pr in p.in_all_rounds(): p.final_payment = p.final_payment + pr.payment + pr.extra_payment class FinalPayment(Page): def is_displayed(self): return self.round_number == Constants.num_rounds class Questions(Page): def is_displayed(self): return self.player.id_in_group == 2 and self.round_number == Constants.num_rounds form_model = 'player' form_fields = ['q2', 'q3'] page_sequence = [ Introduction, Screen0, Screen1, Instructions, Player1_1, ExtraRoundWaitPage, NewRound, Player1_2, Player1_3, PaymentWaitPage, Payment, GuessingNumber, NewRoundWaitPage, FinalPaymentWaitPage, FinalPayment, Questions ]