from otree.api import * c = cu doc = '' class Constants(BaseConstants): name_in_url = 'Ultimatum_Game' players_per_group = 2 num_rounds = 5 endowment = cu(30) class Subsession(BaseSubsession): pass def set_payoffs(group): p1 = group.get_player_by_id(1) p2 = group.get_player_by_id(2) if group.P2_choice: p1.payoff = Constants.endowment - group.P1_sent_amount p2.payoff = group.P1_sent_amount class Group(BaseGroup): P1_sent_amount = models.CurrencyField(label='How much of the 30 points will you offer the responder?', max=Constants.endowment, min=0) P2_choice = models.BooleanField(choices=[[True, 'Yes'], [False, 'No']], label="Will you accept the proposer's offer?") class Player(BasePlayer): name = models.StringField(label='What is your name?') age = models.IntegerField(label='What is your age?', max=65, min=18) class Introduction(Page): form_model = 'player' @staticmethod def is_displayed(player): group = player.group return group.round_number == 1 class Responder(Page): form_model = 'group' form_fields = ['P2_choice'] @staticmethod def is_displayed(player): group = player.group return player.id_in_group == 2 class ResponderWaitPage(WaitPage): pass class Proposer(Page): form_model = 'group' form_fields = ['P1_sent_amount'] @staticmethod def is_displayed(player): group = player.group return player.id_in_group == 1 class ProposerWaitPage(WaitPage): after_all_players_arrive = set_payoffs class Results1(Page): form_model = 'group' @staticmethod def is_displayed(player): group = player.group return group.round_number ==1 @staticmethod def vars_for_template(player): group = player.group return dict(p1_payoff_yes=Constants.endowment - group.P1_sent_amount, p2_payoff_yes=group.P1_sent_amount, p1_payoff_no=0, p2_payoff_no=0) class Result2(Page): form_model = 'group' @staticmethod def is_displayed(player): group = player.group return group.round_number !=1 @staticmethod def vars_for_template(player): group = player.group player_last_round = player.in_round(player.round_number - 1) list_other_players_in_group = player.get_others_in_group() player_opposite = list_other_players_in_group[0] player_opposite_last_round = player_opposite.in_round(player.round_number - 1) return dict(p1_payoff_yes=Constants.endowment - group.P1_sent_amount, p2_payoff_yes=group.P1_sent_amount, p1_payoff_no=0, p2_payoff_no=0, payoff_last_round = player_last_round.payoff, player_opposite_payoff_last_round = player_opposite_last_round.payoff) @staticmethod def js_vars(player): return dict() class Demographics(Page): form_model = 'player' form_fields = ['name', 'age'] @staticmethod def is_displayed(player): group = player.group return group.round_number ==5 page_sequence = [Introduction, Responder, ResponderWaitPage, Proposer, ProposerWaitPage, Results1, Result2, Demographics]