from otree.api import * c = cu doc = '' class Constants(BaseConstants): name_in_url = 'Trust_Game' players_per_group = 2 num_rounds = 5 endowment = cu(20) multiplier = 4 class Subsession(BaseSubsession): pass def sent_back_amount_max(group): return group.sent_amount * Constants.multiplier def set_payoffs(group): p1 = group.get_player_by_id(1) p2 = group.get_player_by_id(2) p1.payoff = Constants.endowment - group.sent_amount + group.sent_back_amount p2.payoff = group.sent_amount * Constants.multiplier - group.sent_back_amount class Group(BaseGroup): sent_amount = models.CurrencyField(label='How many points do you want to send to Player 2?', max=Constants.endowment, min=0) sent_back_amount = models.CurrencyField(label='How much do you want to send back to Player 1?', min=0) class Player(BasePlayer): pass class Introduction(Page): form_model = 'group' @staticmethod def is_displayed(player): group = player.group return group.round_number ==1 class Send(Page): form_model = 'group' form_fields = ['sent_amount'] @staticmethod def is_displayed(player): group = player.group return player.id_in_group == 1 class SendWaitPage(WaitPage): pass class SendBack(Page): form_model = 'group' form_fields = ['sent_back_amount'] @staticmethod def is_displayed(player): group = player.group return player.id_in_group == 2 @staticmethod def vars_for_template(player): group = player.group quad_amount = group.sent_amount * Constants.multiplier return dict(quad_amount=quad_amount) class ResultsWaitPage(WaitPage): after_all_players_arrive = set_payoffs class Results1(Page): form_model = 'player' @staticmethod def is_displayed(player): group = player.group return group.round_number ==1 @staticmethod def vars_for_template(player): group = player.group return dict(quad_amount=group.sent_amount * Constants.multiplier, p1_payoff=Constants.endowment - group.sent_amount + group.sent_back_amount, p2_payoff=group.sent_amount * Constants.multiplier - group.sent_back_amount) class Results2(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(quad_amount=group.sent_amount * Constants.multiplier, p1_payoff=Constants.endowment - group.sent_amount + group.sent_back_amount, p2_payoff=group.sent_amount * Constants.multiplier - group.sent_back_amount, payoff_last_round = player_last_round.payoff, player_opposite_payoff_last_round = player_opposite_last_round.payoff) class End(Page): form_model = 'player' @staticmethod def is_displayed(player): group = player.group return group.round_number ==5 page_sequence = [Introduction, Send, SendWaitPage, SendBack, ResultsWaitPage, Results1, Results2, End]