from otree.api import * c = cu doc = "A Reverse Ultimatum Game with one group and two players, lasting 5 rounds.\n\nPlayer 2 plays first and has to decide whether to accept or reject the offer without knowing the amount Player 1 will choose. In the next phase Player 2 then decides how much to give Player 2 from their endowment of 30.\n\nAt the end of each round the player's and their partners payoffs are displayed.\n\nThe players will answer a short questionnaire after the experiment." class Constants(BaseConstants): name_in_url = 'Reverse_Ultimatum' players_per_group = 2 num_rounds = 5 endowment = cu(30) class Subsession(BaseSubsession): pass def payoff(group): p1 = group.get_player_by_id(1) p2 = group.get_player_by_id(2) if group.accept == True: p1.payoff = Constants.endowment - group.endowment_sent p2.payoff = group.endowment_sent else: p1.payoff = 0 p2.payoff = 0 class Group(BaseGroup): accept = models.BooleanField(choices=[[True, 'Accept'], [False, 'Reject']], label="Will you accept or reject Player 1's offer?") endowment_sent = models.IntegerField(label='How much of your endowment would you like to offer Player 2? (min 0, max 30)', max=30, min=0) survey_sex = models.BooleanField(choices=[[True, 'Male'], [False, 'Female']], label='What gender do you identify with?') survey_age = models.FloatField(label='How old are you?', max=80, min=18) class Player(BasePlayer): pass class Instructions(Page): form_model = 'player' @staticmethod def is_displayed(player): return player.round_number == 1 class Player2_Choice(Page): form_model = 'group' form_fields = ['accept'] @staticmethod def is_displayed(player): group = player.group return player.id_in_group == 2 class Wait_Player1(WaitPage): @staticmethod def is_displayed(player): group = player.group return player.id_in_group == 1 class Player1_Choice(Page): form_model = 'group' form_fields = ['endowment_sent'] @staticmethod def is_displayed(player): group = player.group return player.id_in_group == 1 class Wait_Player2(WaitPage): after_all_players_arrive = payoff class Payoff_P1(Page): form_model = 'player' @staticmethod def is_displayed(player): group = player.group return player.id_in_group == 1 @staticmethod def vars_for_template(player): group = player.group return dict( p1= group.get_player_by_id(1), p2= group.get_player_by_id(2)) class Payoff_P2(Page): form_model = 'player' @staticmethod def is_displayed(player): group = player.group return player.id_in_group == 2 @staticmethod def vars_for_template(player): group = player.group return dict( p1= group.get_player_by_id(1), p2= group.get_player_by_id(2)) class Survey(Page): form_model = 'group' form_fields = ['survey_age', 'survey_sex'] @staticmethod def is_displayed(player): return player.round_number == Constants.num_rounds page_sequence = [Instructions, Player2_Choice, Wait_Player1, Player1_Choice, Wait_Player2, Payoff_P1, Payoff_P2, Survey]