from otree.api import Currency as c, currency_range from ._builtin import Page, WaitPage from .models import Constants import random ##################################################################################################################### class Welcome(Page): def is_displayed(self): return self.round_number == 1 class Instructions1(Page): def is_displayed(self): return self.round_number == 1 form_model = 'player' form_fields = ['quiz1', 'quiz2', 'quiz3'] def error_message(player, values): print('value is', values) if values['quiz1'] != 2: return 'Quiz question 1 is wrong. Please try again.' elif values['quiz2'] != 4: return 'Quiz question 2 is wrong. Please try again.' elif values['quiz3'] != 1: return 'Quiz question 3 is wrong. Please try again.' class WaitNextTour(WaitPage): wait_for_all_groups = True class Instructions2(Page): def is_displayed(self): return self.round_number == Constants.quarter_game+1 class Starting(Page): def is_displayed(self): return self.round_number == 1 or self.round_number == Constants.quarter_game+1 def vars_for_template(self): tournament_no = '' if self.round_number < Constants.quarter_game: tournament_no = 'First' else: tournament_no = 'Second' return dict(tournament_no=tournament_no) ###################################################################################################################### class Game(Page): # the unit of page, this could be 'group' too form_model = 'player' # names must correspond to fields in models.py # this is for participant input form_fields = ['enter1', 'enter2', 'enter3', 'enter4', 'enter5'] def vars_for_template(self): # return variables to be used in template # you display something to the participant self.player.random_number = self.player.set_random_number() player1, player2, player3, player4 = self.group.get_players() player1.star = player2.star = player3.star = 'Type-1' player4.star = 'Type-2' player1.teammate_star = player2.teammate_star = player4.teammate_star = 'Type-1' player3.teammate_star = 'Type-2' player1.oppteam_star = player2.oppteam_star = 'has one Type-2' player3.oppteam_star = player4.oppteam_star = 'does not have a Type-2' round_no = 0 if self.round_number == 1 or self.round_number == 2 or self.round_number == 3 or self.round_number == 4: round_no = self.round_number elif self.round_number > 4 and self.round_number % 4 == 0 and self.round_number <= Constants.quarter_game: round_no = 4 elif self.round_number > 4 and self.round_number % 4 != 0 and self.round_number <= Constants.quarter_game: round_no = self.round_number % 4 elif self.round_number > Constants.quarter_game: round_no = 1 game_no = 0 if self.round_number % 4 == 0 and self.round_number <= Constants.quarter_game: game_no = self.round_number // 4 elif self.round_number % 4 != 0 and self.round_number <= Constants.quarter_game: game_no = self.round_number // 4 + 1 else: game_no = self.round_number - Constants.quarter_game return { 'round_number': round_no, 'game_no': game_no, 'star': self.player.star, 'teammate_star': self.player.teammate_star, 'oppteam_star': self.player.oppteam_star, } def before_next_page(self): if self.player.random_number == 1: self.player.enter = self.player.enter1 elif self.player.random_number == 2: self.player.enter = self.player.enter2 elif self.player.random_number == 3: self.player.enter = self.player.enter3 elif self.player.random_number == 4: self.player.enter = self.player.enter4 elif self.player.random_number == 5: self.player.enter = self.player.enter5 if self.player.enter: self.player.point = self.player.random_number ################################################################################################################## class Game2(Page): def is_displayed(self): return self.round_number <= Constants.quarter_game and self.round_number % 4 != 1 # the unit of page, this could be 'group' too form_model = 'player' # names must correspond to fields in models.py # this is for participant input form_fields = ['enter1', 'enter2', 'enter3', 'enter4', 'enter5'] def vars_for_template(self): # return variables to be used in template # you display something to the participant self.player.random_number = self.player.set_random_number() player1, player2, player3, player4 = self.group.get_players() player1.star = player2.star = player3.star = 'Type-1' player4.star = 'Type-2' player1.teammate_star = player2.teammate_star = player4.teammate_star = 'Type-1' player3.teammate_star = 'Type-2' player1.oppteam_star = player2.oppteam_star = 'has one Type-2' player3.oppteam_star = player4.oppteam_star = 'does not have a Type-2' round_no = 0 if self.round_number == 1 or self.round_number == 2 or self.round_number == 3 or self.round_number == 4: round_no = self.round_number elif self.round_number > 4 and self.round_number % 4 == 0 and self.round_number <= Constants.quarter_game: round_no = 4 elif self.round_number > 4 and self.round_number % 4 != 0 and self.round_number <= Constants.quarter_game: round_no = self.round_number % 4 elif self.round_number > Constants.quarter_game: round_no = 1 game_no = 0 if self.round_number % 4 == 0 and self.round_number <= Constants.quarter_game: game_no = self.round_number // 4 elif self.round_number % 4 != 0 and self.round_number <= Constants.quarter_game: game_no = self.round_number // 4 + 1 else: game_no = self.round_number - Constants.quarter_game return { 'round_number': round_no, 'game_no': game_no, 'star': self.player.star, 'teammate_star': self.player.teammate_star, 'oppteam_star': self.player.oppteam_star, } def before_next_page(self): if self.player.random_number == 1: self.player.enter = self.player.enter1 elif self.player.random_number == 2: self.player.enter = self.player.enter2 elif self.player.random_number == 3: self.player.enter = self.player.enter3 elif self.player.random_number == 4: self.player.enter = self.player.enter4 elif self.player.random_number == 5: self.player.enter = self.player.enter5 if self.player.enter: self.player.point = self.player.random_number ################################################################################################################## class RoundWaitPage(WaitPage): def after_all_players_arrive(self): player1, player2, player3, player4 = self.group.get_players() if player1.enter: if player2.enter: player1.point /= Constants.divider_both_enter player2.point /= Constants.divider_both_enter else: player2.point = Constants.payoff_exit else: if player2.enter: player1.point = Constants.payoff_exit else: player1.point = Constants.payoff_exit player2.point = Constants.payoff_exit if player3.enter: if player4.enter: player3.point /= Constants.divider_both_enter player4.point = (Constants.SE * player4.point) / Constants.divider_both_enter else: player4.point = Constants.payoff_exit else: if player4.enter: player3.point = Constants.payoff_exit player4.point *= Constants.SE else: player3.point = Constants.payoff_exit player4.point = Constants.payoff_exit ################################################################################################################### class ShowPreviousRound(Page): def vars_for_template(self): player1, player2, player3, player4 = self.group.get_players() player1.teammate_enter1 = player2.enter1 player1.teammate_enter2 = player2.enter2 player1.teammate_enter3 = player2.enter3 player1.teammate_enter4 = player2.enter4 player1.teammate_enter5 = player2.enter5 player2.teammate_enter1 = player1.enter1 player2.teammate_enter2 = player1.enter2 player2.teammate_enter3 = player1.enter3 player2.teammate_enter4 = player1.enter4 player2.teammate_enter5 = player1.enter5 player3.teammate_enter1 = player4.enter1 player3.teammate_enter2 = player4.enter2 player3.teammate_enter3 = player4.enter3 player3.teammate_enter4 = player4.enter4 player3.teammate_enter5 = player4.enter5 player4.teammate_enter1 = player3.enter1 player4.teammate_enter2 = player3.enter2 player4.teammate_enter3 = player3.enter3 player4.teammate_enter4 = player3.enter4 player4.teammate_enter5 = player3.enter5 player1.teammate_enter = player2.enter player2.teammate_enter = player1.enter player3.teammate_enter = player4.enter player4.teammate_enter = player3.enter player1.teammate_random_number = player2.random_number player2.teammate_random_number = player1.random_number player3.teammate_random_number = player4.random_number player4.teammate_random_number = player3.random_number if self.player.enter: entered = "A" else: entered = "B" if self.player.teammate_enter: teammate_entered = "A" else: teammate_entered = "B" if self.player.enter1: enter1 = "A" else: enter1 = "B" if self.player.enter2: enter2 = "A" else: enter2 = "B" if self.player.enter3: enter3 = "A" else: enter3 = "B" if self.player.enter4: enter4 = "A" else: enter4 = "B" if self.player.enter5: enter5 = "A" else: enter5 = "B" if self.round_number % 4 == 1 and self.round_number <= Constants.quarter_game: self.player.total_point = self.player.point elif self.round_number % 4 == 2 and self.round_number <= Constants.quarter_game: self.player.total_point = sum([p.point for p in self.player.in_rounds(self.round_number - 1, self.round_number)]) elif self.round_number % 4 == 3 and self.round_number <= Constants.quarter_game: self.player.total_point = sum([p.point for p in self.player.in_rounds(self.round_number - 2, self.round_number)]) elif self.round_number % 4 == 0 and self.round_number <= Constants.quarter_game: self.player.total_point = sum([p.point for p in self.player.in_rounds(self.round_number - 3, self.round_number)]) elif self.round_number > Constants.quarter_game: self.player.total_point = self.player.point game_no = 0 if self.round_number % 4 == 0 and self.round_number <= Constants.quarter_game: game_no = self.round_number // 4 elif self.round_number % 4 != 0 and self.round_number <= Constants.quarter_game: game_no = self.round_number // 4 + 1 else: game_no = self.round_number - Constants.quarter_game round_no = 0 if self.round_number == 1 or self.round_number == 2 or self.round_number == 3 or self.round_number == 4: round_no = self.round_number elif self.round_number > 4 and self.round_number % 4 == 0 and self.round_number <= Constants.quarter_game: round_no = 4 elif self.round_number > 4 and self.round_number % 4 != 0 and self.round_number <= Constants.quarter_game: round_no = self.round_number % 4 elif self.round_number > Constants.quarter_game: round_no = 1 return{ 'random_number': self.player.random_number, 'teammate_random_number': self.player.teammate_random_number, 'entered': entered, 'teammate_entered': teammate_entered, 'round_number': round_no, 'game_no': game_no, 'enter1': enter1, 'enter2': enter2, 'enter3': enter3, 'enter4': enter4, 'enter5': enter5, } #################################################################################################################### class PointWaitPage(WaitPage): wait_for_all_groups = True class ShowIndTotal(Page): def vars_for_template(self): player1, player2, player3, player4 = self.group.get_players() player1.teammate_total_point = player2.total_point player2.teammate_total_point = player1.total_point player3.teammate_total_point = player4.total_point player4.teammate_total_point = player3.total_point player1.oppteam_total_point = player3.total_point + player4.total_point player2.oppteam_total_point = player3.total_point + player4.total_point player3.oppteam_total_point = player1.total_point + player2.total_point player4.oppteam_total_point = player1.total_point + player2.total_point round_no = 0 if self.round_number == 1 or self.round_number == 2 or self.round_number == 3 or self.round_number == 4: round_no = self.round_number elif self.round_number > 4 and self.round_number % 4 == 0 and self.round_number <= Constants.quarter_game: round_no = 4 elif self.round_number > 4 and self.round_number % 4 != 0 and self.round_number <= Constants.quarter_game: round_no = self.round_number % 4 elif self.round_number > Constants.quarter_game: round_no = 1 game_no = 0 if self.round_number % 4 == 0 and self.round_number <= Constants.quarter_game: game_no = self.round_number // 4 elif self.round_number % 4 != 0 and self.round_number <= Constants.quarter_game: game_no = self.round_number // 4 + 1 else: game_no = self.round_number - Constants.quarter_game return { 'round_number': round_no, 'game_no': game_no, 'total_point': self.player.total_point, 'teammate_total_point': self.player.teammate_total_point, 'oppteam_total_point': self.player.oppteam_total_point, } #################################################################################################################### class GameResultWait(WaitPage): wait_for_all_groups = True class ShowGameResult(Page): def is_displayed(self): return self.round_number % 4 == 0 and self.round_number <= Constants.quarter_game or self.round_number > Constants.quarter_game def vars_for_template(self): player1, player2, player3, player4 = self.group.get_players() if player1.total_point > player2.total_point: player1.payoff = 10 player2.payoff = 0 player1.individual_comp_result = 'Win' player2.individual_comp_result = 'Lose' elif player1.total_point < player2.total_point: player1.payoff = 0 player2.payoff = 10 player1.individual_comp_result = 'Lose' player2.individual_comp_result = 'Win' else: random_pick = random.randint(1, 2) if random_pick == 1: player1.payoff = 10 player2.payoff = 0 player1.individual_comp_result = 'Win' player2.individual_comp_result = 'Lose' else: player1.payoff = 0 player2.payoff = 10 player1.individual_comp_result = 'Lose' player2.individual_comp_result = 'Win' if player3.total_point > player4.total_point: player3.payoff = 10 player4.payoff = 0 player3.individual_comp_result = 'Win' player4.individual_comp_result = 'Lose' elif player3.total_point < player4.total_point: player3.payoff = 0 player4.payoff = 10 player3.individual_comp_result = 'Lose' player4.individual_comp_result = 'Win' else: random_pick = random.randint(1, 2) if random_pick == 1: player3.payoff = 10 player4.payoff = 0 player3.individual_comp_result = 'Win' player4.individual_comp_result = 'Lose' else: player3.payoff = 0 player4.payoff = 10 player3.individual_comp_result = 'Lose' player4.individual_comp_result = 'Win' team12_total_point = player1.total_point + player2.total_point team34_total_point = player3.total_point + player4.total_point if team12_total_point > team34_total_point: player1.payoff += 10 player2.payoff += 10 player1.team_comp_result = 'Win' player2.team_comp_result = 'Win' player3.team_comp_result = 'Lose' player4.team_comp_result = 'Lose' elif team12_total_point < team34_total_point: player3.payoff += 10 player4.payoff += 10 player1.team_comp_result = 'Lose' player2.team_comp_result = 'Lose' player3.team_comp_result = 'Win' player4.team_comp_result = 'Win' else: random_pick = random.randint(1, 2) if random_pick == 1: player1.payoff += 10 player2.payoff += 10 player1.team_comp_result = 'Win' player2.team_comp_result = 'Win' player3.team_comp_result = 'Lose' player4.team_comp_result = 'Lose' else: player3.payoff += 10 player4.payoff += 10 player1.team_comp_result = 'Lose' player2.team_comp_result = 'Lose' player3.team_comp_result = 'Win' player4.team_comp_result = 'Win' game_no = 0 if self.round_number <= Constants.quarter_game: game_no = self.round_number // 4 else: game_no = self.round_number - Constants.quarter_game return { 'game_no': game_no, 'individual_comp_result': self.player.individual_comp_result, 'team_comp_result': self.player.team_comp_result } ####################################################################################################################### class NextGame(Page): def is_displayed(self): return self.round_number % 4 == 0 and self.round_number < Constants.quarter_game or self.round_number > Constants.quarter_game and self.round_number != Constants.num_rounds def vars_for_template(self): next_game_no = 0 if self.round_number <= Constants.quarter_game: next_game_no = self.round_number//4 + 1 else: next_game_no = self.round_number - (Constants.quarter_game - 1) return dict(next_game_no=next_game_no) ####################################################################################################################### class EndExp(Page): def is_displayed(self): return self.round_number == Constants.num_rounds form_model = 'player' form_fields = ['female', 'plan', 'experimentFlow', 'instructionHard'] ###################################################################################################################### class Payment(Page): def is_displayed(self): return self.round_number == Constants.num_rounds def vars_for_template(self): player1, player2, player3, player4 = self.group.get_players() random_game = self.session.vars['paying_game'] if random_game <= Constants.num_quarter_games: player1.payment = player1.in_round(random_game*4).payoff + Constants.showup_fee player2.payment = player2.in_round(random_game*4).payoff + Constants.showup_fee player3.payment = player3.in_round(random_game*4).payoff + Constants.showup_fee player4.payment = player4.in_round(random_game*4).payoff + Constants.showup_fee else: player1.payment = player1.in_round(random_game+30).payoff + Constants.showup_fee #change 6 to 30 player2.payment = player2.in_round(random_game+30).payoff + Constants.showup_fee player3.payment = player3.in_round(random_game+30).payoff + Constants.showup_fee player4.payment = player4.in_round(random_game+30).payoff + Constants.showup_fee return dict(random_game=random_game, payment=self.player.payment) ################################################################################################################### page_sequence = [Welcome, Instructions1, Instructions2, WaitNextTour, Starting, Game, RoundWaitPage, ShowPreviousRound, PointWaitPage, ShowIndTotal, GameResultWait, ShowGameResult, NextGame, EndExp, Payment]