from otree.api import * c = cu doc = "A simple trust game featuring one group with two players.\n\nEach round, Player 1 has an endowment of 20 and decides how much of this endowment to send to Player 2. The amount Player 1 sends Player 2 is multiplied by four. It is then Player 2's turn to decide how much to return to Player 1. This is repeated for five rounds." class Constants(BaseConstants): name_in_url = 'TrustGame' players_per_group = 2 num_rounds = 5 multiplier = 4 endowment = cu(20) class Subsession(BaseSubsession): pass def endowment_return_max(group): return group.endowment_sent * Constants.multiplier def payoff(group): p1 = group.get_player_by_id(1) p2 = group.get_player_by_id(2) p1.payoff = Constants.endowment - group.endowment_sent + group.endowment_return p2.payoff = group.endowment_sent * Constants.multiplier - group.endowment_return class Group(BaseGroup): endowment_sent = models.FloatField(label='How much would you like to send to Player 2? (minimum 0, maximum 20)', max=20, min=0) endowment_return = models.FloatField(initial=0, label='How many points would you like to return to Player 1?', min=0) class Player(BasePlayer): pass class Instructions(Page): form_model = 'player' @staticmethod def is_displayed(player): return player.round_number == 1 class Player1_Send(Page): form_model = 'group' form_fields = ['endowment_sent'] @staticmethod def is_displayed(player): group = player.group return player.id_in_group == 1 class Player2_Wait(WaitPage): @staticmethod def is_displayed(player): group = player.group return player.id_in_group == 2 class Player2_Return(Page): form_model = 'group' form_fields = ['endowment_return'] @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(multiplied_amount= group.endowment_sent * Constants.multiplier) class Player1_Wait(WaitPage): after_all_players_arrive = payoff @staticmethod def is_displayed(player): group = player.group return player.id_in_group == 1 class Results_Round_1(Page): form_model = 'player' @staticmethod def is_displayed(player): return player.round_number == 1 @staticmethod def vars_for_template(player): group = player.group return dict( multiplied_amount= group.endowment_sent * Constants.multiplier, p1 = group.get_player_by_id(1), p2 = group.get_player_by_id(2)) class Results_Other_Rounds(Page): form_model = 'player' @staticmethod def is_displayed(player): return player.round_number != 1 @staticmethod def vars_for_template(player): group = player.group other_players = player.get_others_in_group() opponent = other_players[0] opponent_prev_round = opponent.in_round(player.round_number - 1) return dict( multiplied_amount = group.endowment_sent * Constants.multiplier, prev_round = player.in_round(player.round_number - 1), opponent_prev_round = opponent_prev_round.payoff, p1 = group.get_player_by_id(1), p2 = group.get_player_by_id(2)) class End(Page): form_model = 'player' @staticmethod def is_displayed(player): return player.round_number == Constants.num_rounds page_sequence = [Instructions, Player1_Send, Player2_Wait, Player2_Return, Player1_Wait, Results_Round_1, Results_Other_Rounds, End]