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): 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): print("@@Constants.round_selected_normal:", Constants.round_selected_normal) print("@@Constants.round_selected_plus:", Constants.round_selected_plus) player1_truth_plus = 0 player1_truth_normal = 0 for p in self.subsession.get_players(): if(p.id_in_group == 1): if p.in_round(Constants.round_selected_plus).reported_number == p.in_round(Constants.round_selected_plus).secret_number: player1_truth_plus = player1_truth_plus + 1 if p.in_round(Constants.round_selected_normal).reported_number == p.in_round(Constants.round_selected_normal).secret_number: player1_truth_normal = player1_truth_normal + 1 print("@@player1_truth_plus:", player1_truth_plus) print("@@player1_truth_normal:", player1_truth_normal) for p in self.subsession.get_players(): if(p.selected): extra_payment = 0 if(p.id_in_group == 2): if(p.in_round(Constants.round_selected_plus).guessing_players == player1_truth_plus): extra_payment = extra_payment + 1 if(p.in_round(Constants.round_selected_plus).guessing_secret_number == p.in_round(Constants.round_selected_plus).secret_number): extra_payment = extra_payment + 1 p.in_round(Constants.num_rounds).final_payment = p.in_round(Constants.round_selected_plus).payment + extra_payment else: extra_payment = 0 if(p.id_in_group == 2): if(p.in_round(Constants.round_selected_normal).guessing_players == player1_truth_normal): extra_payment = extra_payment + 1 if(p.in_round(Constants.round_selected_normal).guessing_secret_number == p.in_round(Constants.round_selected_plus).secret_number): extra_payment = extra_payment + 1 p.in_round(Constants.num_rounds).final_payment = p.in_round(Constants.round_selected_normal).payment + 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 ]